quodlibet-3.9.1/0000755000175000017500000000000013115513301013733 5ustar lazkalazka00000000000000quodlibet-3.9.1/docs/0000755000175000017500000000000013115513301014663 5ustar lazkalazka00000000000000quodlibet-3.9.1/docs/icons.rst0000644000175000017500000000124713112005742016536 0ustar lazkalazka00000000000000.. |ubuntu-logo| raw:: html .. |debian-logo| raw:: html .. |fedora-logo| raw:: html .. |opensuse-logo| raw:: html .. |windows-logo| raw:: html .. |source-logo| raw:: html .. |arch-logo| raw:: html .. |macosx-logo| raw:: html .. |github-logo| raw:: html .. |bug-logo| raw:: html .. |linux-logo| raw:: html quodlibet-3.9.1/docs/features.rst0000644000175000017500000000551213112005742017240 0ustar lazkalazka00000000000000.. _Features: Features ======== Audio Playback ^^^^^^^^^^^^^^ * Multiple audio back-ends (GStreamer, xine-lib) * Replay Gain support * Auto-selects between 'track' and 'album' mode based on current view and play order * Applies clipping prevention whenever available * Configurable default (fallback) and pre-amp values to suit any audio setup * Multimedia key support * Real shuffle mode, that plays the whole playlist before repeating * Weighted (by rating) random playback * Proper 'Previous' support in shuffle mode * A play queue * Bookmarks within files (or playlists, with a plugin) Editing Tags ^^^^^^^^^^^^ * Full Unicode support * Make changes to many files at once * Make changes across all supported file formats * Tag files based on their filenames with configurable formats * Rename files based on their tags * No ugly ``%a``, ``%t`` patterns - more readable ````, ```` instead * Fast track renumbering * See full instructions at :ref:`EditingTags` Audio Library ^^^^^^^^^^^^^ * Watch directories and automatically add/remove new music * Hide songs on removable devices that may not always be there * Save song ratings and play counts * Lyrics downloading and saving * Internet Radio ("Shoutcast") support * Audio Feeds ("Podcast") support User Interface ^^^^^^^^^^^^^^ * Simple user interface to Just Play Music if you want * Useful as a small window or maximized, no feeling cramped or wasted space * Album cover display * Full player control from a tray icon * Recognize and display many uncommon tags, as well as any others you want. Especially useful for classical music. Library Browsing ^^^^^^^^^^^^^^^^ * Simple or regular-expression based search * Constructed playlists * iTunes/Rhythmbox-like paned browser, but with any tags you want (Genre, Date, etc) * Album list with cover art * By directory, including songs not in your library Python-based plugins ^^^^^^^^^^^^^^^^^^^^ * Automatic tagging via `MusicBrainz <http://musicbrainz.org/>`_ and CDDB * On-screen display popups * Last.fm/AudioScrobbler submission * Tag character encoding conversion * Intelligent title-casing of tags * Find (and examine / remove) near-duplicate songs across your entire collection * Audio fingerprinting of music * Control Logitech Squeezebox devices. * Scan and save Replay Gain values across multiple albums at once (using gstreamer) File Format Support ^^^^^^^^^^^^^^^^^^^ * MP3, Ogg Vorbis / Speex / Opus, FLAC, Musepack, MOD/XM/IT, Wavpack, MPEG-4 AAC, WMA, MIDI, Monkey's Audio UNIX-like integration ^^^^^^^^^^^^^^^^^^^^^ * Player control, status information, and querying of library from the command line * Can used named pipes to control running instance. * Now-playing is available as a fixed file ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/translation/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017221� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/translation/index.rst����������������������������������������������������������0000644�0001750�0001750�00000000126�13112005742�021063� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Translation Guide ================= .. toctree:: :titlesonly: howto faq ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/translation/howto.rst����������������������������������������������������������0000644�0001750�0001750�00000005226�13115500547�021130� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Translating: How-to ====== If you're fluent in a language other than English, and have some spare time, you can help us translate Quod Libet. Translation is a continuous process on an active projects like this - as developers add new features or modify existing text used, new translations will be needed. Many of the translations files are missing a lot of strings, so please try the trunk version in your language. Of course, there might be mistakes in the English, too! Please let us know if you find them. Translation Software -------------------- To translate, you'll want to have intltool, gettext and git installed:: apt-get install intltool gettext git For translating itself you need a PO editor like `Poedit <https://poedit.net/>`_:: apt-get install poedit Translation Process ------------------- Get the QL code:: $ git clone https://github.com/quodlibet/quodlibet.git quodlibet $ cd quodlibet/quodlibet To translate the last release, update to the stable branch:: $ git branch -a # to get the list of branches $ git checkout quodlibet-X.X # for example: quodlibet-3.3 To translate current trunk, update to the default branch:: $ git checkout master You can find the translation file for your chosen language in:: ./po/<lang>.po In case there's not already a translation for your language, create one:: $ ./setup.py create_po --lang=<mylang> Create the POT file and update translations so all new strings that were added since the last translation update get included:: $ ./setup.py update_po --lang=<mylang> Now start translating... :: $ poedit ./po/<lang>.po Test the translation by generating MO files and running Quod Libet and Ex Falso. build_mo will create a 'build' directory including the processed translations and if 'build' is present QL/EF will use these translations instead of the global ones. :: $ ./setup.py build_mo $ ./quodlibet.py $ ./exfalso.py If your active system language is not the one you are translating, you can run them like:: $ LANG=<mylang> ./quodlibet.py Finally run our unit tests to make sure the translation will not cause programming errors. If it says something else, there's a problem with the translation. :: $ ./setup.py build_mo $ ./setup.py test --to-run PO.<mylang> And send us the .po file you made: * Create a `new issue <https://github.com/quodlibet/quodlibet/issues/new>`__ linking to your updated .po file. If you don't have a place for making the file accessible create a `gist <https://gist.github.com/>`__ with the content of the .po file and include the gist URL in the issue description. * Or create a pull request. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/translation/faq.rst������������������������������������������������������������0000644�0001750�0001750�00000010564�13112005742�020532� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������FAQ === What do these things in strings mean? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * ``This is %s``, ``an %(foobat)s example``, ``for {translators}, {0}``: see `String Formatting`_ What does ``msgctxt`` in the .po files mean? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It stands for message context and (optionally) allows for different translations of the same translatable text appearing in different contexts. For example the word "Search" could be a title of a window or the label of a button. The former meaning "a search" and the latter "to search". Why are some strings not translatable? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In case of strings like "Apply" and "Ok" that show up on buttons, these come from GTK and are not part of QL. But there is a chance that we have forgotten to mark a string translatable, so please contact us. If anything else is not translatable you can start QL with the following variable set:: QUODLIBET_TEST_TRANS=xx ./quodlibet.py which will append and prepend "xx" to all translatable strings. What does `titlecase?` mean? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There's a special string `titlecase?` which should be translated as anything if your language does not use `title casing <https://en.wikipedia.org/wiki/Letter_case>`_ (eg *This Is Title Casing*) for labels. If it is left untranslated, title-casing will be used. String Formatting ^^^^^^^^^^^^^^^^^ Some strings include replacement tokens like ``%s`` or ``{foobar}``. These mark places where text gets replaces at runtime, so they should be carried over to the translation without changing their content. Some examples showing the strings to translate and the resulting strings where the tokens have been replaced: * ``Hello %s`` -> ``Hello Lou`` * ``The number %d`` -> ``The number 42`` * ``Hello %(name)s`` -> ``Hello Lou`` * ``Hello {name}`` -> ``Hello Lou`` * ``Hello {0}`` -> ``Hello Lou`` * ``Hello {0.name}`` -> ``Hello Lou`` * ``Hello {}`` -> ``Hello Lou`` In the case of ``Hello %(name)s``, a possible German translation and text displayed to the user would be ``Hallo %(name)s`` and ``Hallo Lou``. Plural-Forms ^^^^^^^^^^^^ The first thing you need is a Plural-Forms line for your language. The GNU gettext manual has a chapter on plural forms with examples for many languages. This should go after the "Content-Transfer-Encoding" line. The Plural-Forms line tells gettext how many plural forms there are in the language and how to use them. For example: :: msgid "artist" msgid_plural "artists" msgstr[0] "artist" msgstr[1] "artists" The English plural expression, "n != 1" means to use msgstr[0] if the count is 1, otherwise use msgstr[1]. If your language has 3 plural forms, you'll need msgstr[0], msgstr[1], and msgstr[2], and so on. Sometimes (usually, even) the English strings will be the same. For example, ``%d selected`` doesn't change whether it stands for *1 selected* or *99 selected*. If it does in your language, you should translate them differently. There are further difficulties for the many languages that have gender agreement and an unspecified noun in the phrase, but these are often translated with brackets (eg in French: *1 sélectionné(e)*, *99 sélectionné(e)s* perhaps) Fuzzy translations ^^^^^^^^^^^^^^^^^^ A translation marked *fuzzy* is (usually) one that has been matched to a similar previous translation, often by `gettext` itself. Note that fuzzy translations are not treated as accurate translations so will not be used. Common reasons for strings being marked as fuzzy include: * A contributor corrects a typo in the source (English) text * A developer changes the `Mnemonic Label <https://developer.gnome.org/gtk3/stable/GtkLabel.html#id-1.3.8.2.10.5>`_ - This is the underscore you see in many translation strings. * The English has changed, but not much * sometimes it *just happens*... For example:: #: ../quodlibet/browsers/albums.py:425 #, fuzzy msgid "Sort _by:" msgstr "Ordina per data" Here, in the Italian `.po` file, you can see this message has been matched, presumably used from a "Sort by date" translation previously entered. This explains why this string was missing in the Italian build. As a translator please make sure there are no translations left marked as fuzzy. In `poedit`, you can click the cloud (!) icon, or in a text editor you should simply remove the `fuzzy` string above the `msgid`. ��������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�015760� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/config_files.rst���������������������������������������������������������0000644�0001750�0001750�00000004027�13112005742�021146� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _ConfigFiles: Configuration Files =================== QL stores some of its configuration as plain text files, and in some cases it may be convenient to edit these files directly, or to synchronize them across different computers/ home directories. Like many Linux applications, QL stores user configuration in a hidden directory, in this case ``~/.quodlibet``. Feel free to explore; but maybe make a backup of the directory first. Saved values for search, tagging and renaming patterns ------------------------------------------------------ For :ref:`searching your library <Searching>`, :ref:`editing tags from a filename pattern <EditingTags>`, and :ref:`renaming files based on tags <RenamingFiles>`, you can save the (search or pattern) values you enter for later use. See the relevant section for how to do it using the GUI. The patterns you create using "saved values" are in fact stored in simple text files: * ``~/.quodlibet/lists/queries.saved``: Search patterns * ``~/.quodlibet/lists/tagpatterns.saved``: Patterns to tag files based on filename * ``~/.quodlibet/lists/renamepatterns.saved``: Patterns to rename files based on tags You'll see that the format is very easy: Each saved pattern consists of two lines, the first line contains the QL pattern, the second line its name. The name may be identical to the pattern. The next saved "pattern -- name" pair follows immediately on the next two lines. Here's an example of what ``~/.quodlibet/lists/queries.saved`` might look like:: artist = schubert All by Schubert artist = radiohead All by Radiohead &(genre = classical, #(lastplayed > 3 days)) &(genre = classical, #(lastplayed > 3 days)) ~format = ogg All ogg files Or an example of a ``~/.quodlibet/lists/renamepatterns.saved``:: ~/music/<artist>/<album>/<tracknumber|<tracknumber>. ><title~version> Music from an album ~/music/misc/<artist> - <title> Stray song Just edit these files or synchronize them across computers or home directories (for different users) as needed. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/renaming_files.rst�������������������������������������������������������0000644�0001750�0001750�00000012007�13112005742�021476� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _RenamingFiles: Renaming files ============== Basic Syntax ------------ Quod Libet allows you to rename files based on their tags. In some cases you may wish to alter the filename depending on whether some tags are present or missing, in addition to their values. A common pattern might be:: <tracknumber>. <title~version> You can use a ``|`` to only insert text when a tag is present:: <tracknumber|<tracknumber>. ><title~version> You can also specify literal text to use if the tag is missing by adding another `|`:: <album|<album>|No Album> - <title> A reasonable use of albumartist would be:: <albumartist|<albumartist>|<artist|<artist>|No artist>> ..which uses the first of the following: Albumartist, Artist or "No artist". You can of course also move files across your filesystem to another directory by mixing path elements and ``<tag>`` syntax:: /home/*username*/Music/<artist>/<album>/... Simple Renames -------------- Like tagging by filename, renaming by tags uses tag names enclosed by ``<...>`` to substitute values. To rename songs as their artist followed by their title, use ``<artist> - <title>`` (The file extension, .ogg, .mpc, and so on, is automatically added). Other common patterns include * ``<tracknumber>. <title>`` * ``<tracknumber>. <artist> - <title>`` * ``~/music/<artist> - <album>/<tracknumber>. <title>`` * ``~/music/<artist>/<album>/<tracknumber>. <title>`` You can also use tied tags to rename, e.g. ``<artist~title>``. Creating Directories -------------------- Note that if you use ``/`` (a directory separator) in your filename, you ''must'' start the pattern with a ``/`` (or a ``~/``, which expands to your home directory). To see why, consider what would happen if you tried to rename the same file twice with ``<artist>/<title>``. The first time it would go under ``Artist/Title.ogg``, the second time, ``Artist/Artist/Title.ogg``. When you specify the full path, this can't happen. If you don't use a `/` in the pattern, the file gets put in the same directory. Conditional Renaming -------------------- Consider the ``<tracknumber>. <title>`` pattern. When the file is missing a track number, you get a filename that starts with ., which isn't good. So Quod Libet lets you use ''conditional renaming'' to avoid that. To use conditional text, after the tag name (but inside the ``<...>``) put a ``|`` (a pipe). Then after the pipe, place all the text you want, including other tag names inside ``<...>``. That text will only be added when that tag isn't empty. To avoid the original problem, only display the track number, period, and space when the track number tag exists: ``<tracknumber|<tracknumber>. ><title>``. Quod Libet also lets you change the text if a tag ''doesn't'' exist: Use a second pipe. ``<tracknumber|<tracknumber>|00>. <title>`` will use the track number at the start of the filename if it exists, or *00* if it doesn't. Go crazy with conditions / More examples ---------------------------------------- So you basically want to remember that it goes ``<condition|<conditional tag>|<else tag>>`` You can however even put conditions inside each other. Here's an example that I just created, and so far it seems to work: I first had:: /mnt/musik/<genre|<genre>/><artist|<artist>|Unknown>/<album|<album>/><tracknumber|<tracknumber> - ><title> Let's dissect this: * ``/mnt/musik``: My basic music partition * ``<genre|<genre>/>``: If there is a tag "genre", put the song into that folder (creating the folder if necessary). If there is no tag genre, skip this level in the folder hierarchy (note that the trailing slash of ``<genre>/`` is inside the < > that delineate the conditional "block". * ``<artist>|<artist>|Unknown>/``: If there's a tag artist, put everything into that folder, else put into a folder called "Unknown". Not that the trailing slash is outside the < > that delineate the conditional block, since we always want that folder level. * ``<album|<album>/>``: Album folder as needed, else skip * ``<tracknumber|<tracknumber - >``: Prepend tracknumber if it exists * ``<title>``: Duh. However, for songs that don't have a genre tag, I wanted to use a tag I use called "language" and sort into that folder instead. But I have some songs that have a genre tag and also a language tag, and those songs should only go into the genre folder; the language folder should be ignored. Turns out QL can do this just fine, by expanding the ``<genre>`` conditional block in the expression above to ``<genre|<genre>/|<language|<language>/>>``. Basically, the pipe after the second ``<genre>/`` introduces what should be done if the first condition isn't met (i.e. no genre tag), but here instead of putting straightforward text or another label we then introduce a second conditional block, ``<language|<language/>>``, which puts in a language tag folder, if the song has a tag "language". The full expression now looks like this:: /mnt/musik/<genre|<genre>/|<language|<language>/>><artist|<artist>|Unknown>/<album|<album>/><tracknumber|<tracknumber> - ><title> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/stats_rating.rst���������������������������������������������������������0000644�0001750�0001750�00000002344�13112005742�021221� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Stats: Library Statistics ================== Play Count ---------- The internal ``~#playcount`` tag gets incremented after a song ends or is forced to end by the user and the time it was played was more than half of the song's duration. In case of radio streams, which don't have a defined duration, the play count gets incremented whenever the stream is played. Searching for all songs that where played more than 10 times: .. code-block:: text #(playcount > 10) Last Played Time ---------------- The ``~#lastplayed`` tag gets updated to the current time whenever ``~#playcount`` gets incremented. Searching for all songs played less than 4 days ago: .. code-block:: text #(lastplayed < 4 days) Last Started Time ----------------- The ``~#laststarted`` tag gets updated to the current time whenever the song gets started. Searching for all songs started less than 1 week ago: .. code-block:: text #(laststarted < 1 week) Skip Count ---------- The ``~#skipcount`` tag gets incremented whenever the song gets forced to end by the user and the playing time was less than half of the song's duration. Searching for songs that where skipped between 5 and 10 times: .. code-block:: text #(5 <= skipcount <= 10) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/tags/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�016716� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/tags/index.rst�����������������������������������������������������������0000644�0001750�0001750�00000000141�13112005742�020555� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Tags ==== .. toctree:: :titlesonly: tags internal_tags tied_tags patterns �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/tags/internal_tags.rst���������������������������������������������������0000644�0001750�0001750�00000013005�13112005742�022303� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _InternalTags: Internal Tags ============= Quod Libet stores a number of tags internally, that are either not stored in files themselves, or are derived from the values in the files. String Tags ----------- * ``~basename``: The last component of the full path name * ``~dirname``: Everything but the last component of the file path name * ``~filename``: The full path name * ``~format``: The file format (e.g. "MPEG-4") * ``~codec``: The audio codec (e.g. "AAC LC") * ``~encoding``: Encoder name, version, settings used (e.g. "LAME 3.97.0, VBR") * ``~length``: The length of the file in H:MM:SS format * ``~mountpoint``: The component of the full path name that corresponds to the file's immediate parent mount * ``~performers``: A list of performers * ``~people``: A list of all people involved in the song * ``~rating``: A string representation of the song's rating (e.g. ★★★☆). Note that in most formats these are per email address. * ``~uri``: The full URI of the song * ``~year``: The release year, derived from the ``date`` tag * ``~originalyear``: The original year, derived from the ``originaldate`` tag * ``~playlists``: Comma-separated playlist names in which the song is included * ``~filesize``: Human formatted size (e.g. *4.5 MB*) The ``~people`` Internal Tag ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The internal ``~people`` tag combines the following tags to one: ``albumartist``, ``artist``, ``author``, ``composer``, ``~performers``, ``originalartist``, ``lyricist``, ``arranger``, ``conductor`` in this exact order. For sorting, this means that all album artists come first followed by all artists and so on. For song collections / albums, the values of each included tag are sorted by frequency. Variants: ``~people:roles`` includes roles e.g. ``"The Parley of Instruments (Orchestra), David Thomas (Bass)"``. The roles are either derived from the source tag name (``composer=Joseph Haydn`` → ``Joseph Haydn (Composition)``) or from the performer role (``performer:composition=Joseph Haydn`` → ``Joseph Haydn (Composition)``). For the latter see the ``~performers`` tag. ``~people:real`` excludes *Various Artists*, commonly used as a placeholder for album artists on compilations, etc. The ``~performers`` Internal Tag ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The internal ``~performers`` tag combines all the artists specified in the performer tags to a single one. Example: ``performer:vocals=Brandon Patton, performer:banjo=Béla Fleck`` ``~performers`` will then display ``"Brandon Patton, Béla Fleck"`` Variants: ``~performer:roles`` includes the roles as well. For the above example it will display ``"Brandon Patton (Vocals), Béla Fleck (Banjo)"`` Song Collections / Albums ^^^^^^^^^^^^^^^^^^^^^^^^^ * ``~length``: The length of all songs in H:MM:SS format * ``~long-length``: The length of all songs in "H hours, M minutes, S seconds" format * ``~tracks``: The real number of songs in the collection in "# track(s)" format * ``~discs``: The number of different discs in "# disc(s)" format * ``~rating``: The average rating in music notes * ``~filesize``: Total Human formatted size (e.g. *4.5 MB*) All other tags return a list of values retrieved from all songs, without duplicates, sorted by their number of appearance. .. _numeric-tags: Numeric Tags ------------ * ``~#added``: The date the song was added to the library * ``~#bitrate``: The bitrate of the song, in kilo bits per second * ``~#disc``: The disc number of the song (the first half of the ``discnumber`` tag) * ``~#channels``: The channel count * ``~#discs``: The total number of discs in this song's collection * ``~#filesize``: The size in bytes of this song * ``~#lastplayed``: The time this song was last played through * ``~#laststarted``: The time this song was last started * ``~#length``: The length of the song, in seconds * ``~#mtime``: The time this file was last modified * ``~#playcount``: The total number of times you've played the song through * ``~#rating``: The rating of the song, as a number between 0 and 1. * ``~#skipcount``: The total number of times you've skipped through the song * ``~#track``: The track number of the song (the first half of the ``tracknumber`` tag) * ``~#tracks``: The total number of tracks in the album * ``~#year``: The release year, derived from the ``date`` tag * ``~#originalyear``: The original year, derived from the ``originaldate`` tag Note some numeric tags have string tag equivalents (see above) for human-readable format. Song Collections / Albums ^^^^^^^^^^^^^^^^^^^^^^^^^ * ``~#tracks``: The real number of songs in the collection * ``~#discs``: The number of different discs in the collection For all other numeric tags it is possible to define numeric functions by appending ``:numeric_func`` to the tag name (``~#playcount:avg`` for example). All internal numeric tags use a default function in case no function is given. For user defined numeric tags the average value is returned by default. * ``avg``: Returns the average value (``~#rating``) * ``sum``: Returns the summation of all values (``~#length``, ``~#playcount``, ``~#skipcount``, ``~#filesize``) * ``min``: Returns the smallest value (``~#year``) * ``max``: Returns the largest value (``~#added``, ``~#lastplayed``, ``~#laststarted``, ``~#mtime``) * ``bav``: Returns the `Bayesian average <https://en.wikipedia .org/wiki/Bayesian_average>`_ value (``~#rating``) Being most appropriate for ratings, the parameter is adjusted globally under the preferences for ratings. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/tags/patterns.rst��������������������������������������������������������0000644�0001750�0001750�00000006677�13112005742�021332� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Tag Patterns ============ Tag patterns allow more complex string representation of tags, with a notion of if-null defaulting; whilst this sounds complex (and it can be!) it's very useful where libraries have wildly varying tags. Tag patterns can include strings (e.g. tag names) enclosed in angled brackets like this ``<artist> - <title> (<album>)`` Which might produce: ``The Beatles - Drive My Car (Rubber Soul)`` Usage ----- Tag patterns in QL can be used to change the information displayed in various places, like the playing song area, columns in the song list and the album list in the album browser. They can be used to group songs in the paned and the album collection browser in more complex ways. And, of course, tag renaming based on tags uses tag patterns to create the file names and folder structure. Conditional Tags ---------------- A simple if-then-else concept can be used in tag patterns, testing if a tag is non-empty. The syntax uses the pipe (``|``) character as a delimiter, in either of these formats: * ``<tag-expression|non-empty-value>`` or * ``<tag-expression|non-empty-value|empty-value>`` So using the full (second) form, a Pattern of: ``<album|Has An Album|No Album>`` produces *Has An album* for any song with at least one ``album`` tag value, else *No Album*. Note that these can be recursive, i.e. both `non-empty-value` and `empty-value` are themselves tag patterns, which could contain a conditional. A more useful example now: ``<albumartist|<albumartist>|<artist>>`` This will look for the ``albumartist`` tag and display that if available, else use ``artist`` (nearly always available). Examples: * ``<~year|<~year>. <album>|<album>>``: *2011. This is an album title* * ``<title>, by <albumartist|<albumartist>|<composer|<composer>|<artist>>>``: *Liebstraum no. 3, (by Franz Liszt)* Conditional Tags With Comparisons --------------------------------- In addition to checking if a tag value is empty, the "if" expression can also contain a value comparison using the same syntax as the :ref:`search <Searching>`: ``<sometag=test|the value was test|it was something different>`` or more complex ones (note the needed escaping): ``<artist=\|(Townshend, Who)|foo|bar>`` Text Markup ----------- In some situations the resulting text will be displayed in the user interface like for example the album list or the area which displays information about the currently playing song. To style the resulting text you can use the following tags in combination with the tag patterns. ===================== ========== Tag Result ===================== ========== ``[b]..[/b]`` Bold ``[big]..[/big]`` Bigger ``[i]..[/i]`` Italic ``[small]..[/small]`` Smaller ``[tt]..[/tt]`` Monospace ``[u]..[/u]`` Underline ``[span][/span]`` see below ===================== ========== The ``span`` tag can define many more text attributes like size and color: ``[span size='small' color='blue']..[/span]``. See the `Pango Markup Language`_ page for a complete list of available attributes and values. A complete example might look like this: :: [span weight='bold' size='large']<title>[/span]<~length| (<~length>)> : [b]<~rating>[/b]<version| [small][b]<version>[/b][/small]><~people| by <~people>><album| <album><tracknumber| : track <tracknumber>>> Note also the literal newlines. .. _`Pango Markup Language`: https://developer.gnome.org/pango/stable/PangoMarkupFormat.html �����������������������������������������������������������������quodlibet-3.9.1/docs/guide/tags/tags.rst������������������������������������������������������������0000644�0001750�0001750�00000006175�13112005742�020421� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _AudioTags: An Introduction to Tags ======================= Overview -------- Quod Libet supports free-form tags for most of the common audio formats. This means you can name your tags in any way you want, but using common tag names for common purposes is advised because it helps QL to write the tags in a way that other media players can understand them and also helps QL understand certain tag values and make use of them. Quod Libet also supports expressions using "tied tags" in several contexts - see :ref:`TiedTags` Sort Tags --------- Tags ``artistsort``, ``albumsort``, ``albumartistsort``, ``performersort`` (including roles) will be used for sorting if they are present. Lets say you have a song with an ``artist`` tag *The Beatles* and want it to be sorted as if it was named *Beatles, The*, you can add an ``artistsort`` tag containing *Beatles, The*. * QL includes a basic plugin for creating such sort tags automatically. * The musicbrainz plugin includes an option to write sort tags if found. Programmatic Tags ----------------- A programmatic tag is one typically added by either Quod Libet / Ex Falso or another program and not designed for human consumption. Examples are ``replaygain_track_gain`` or ``musicbrainz_albumid``. Note that to see these, you must turn on "Show programmatic tags" in the relevant preferences window. Internal Tags ------------- Internal tags are tags that start with a ``~`` like ``~people``, ``~length`` or ``~year``. They are either not stored in files themselves, or are derived from the values in the files. See :ref:`InternalTags` for a complete list. .. _PerformerRoles: Performer Roles --------------- Quod Libet supports performer roles, which let you associate a performer in a song with a specific instrument. To use this feature, name a tag performer:role. Quod Libet will display the roles alongside the names in ``~people:roles`` and ``~performers:roles``. Album Identification -------------------- Quod Libet uses various tags to define what songs are in the same album. For songs to be in the same album, both ``album`` and ``albumartist`` have to be the same. In addition the first non-empty value of the following tags have to match (checked in this order): ``musicbrainz_albumid``, ``labelid``, ``album_grouping_key``. Common scenarios ^^^^^^^^^^^^^^^^ ''I have a two disc album and each disc is shown separately.'' Make sure the album tags (and ``albumsort`` if present) (remove 'CD1/2' etc.) and albumartist tags are the same. ''Two albums have the same name and are merged.'' Add an albumartist tag for at least one of them. Common Questions ^^^^^^^^^^^^^^^^ ''Why doesn't QL know that my albums are different ones by seeing that they don't have the same artist?'' There are many songs that have multiple artist, so this can't be decided on the basis of artist tags. Replay Gain Tags ---------------- The following (fairly standard) tags are used for volume adjustment: * ``replaygain_track_gain`` * ``replaygain_track_peak`` * ``replaygain_album_gain`` * ``replaygain_album_peak`` See the :ref:`Replay Gain <replaygain>` section for further details. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/tags/tied_tags.rst�������������������������������������������������������0000644�0001750�0001750�00000002362�13112005742�021420� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _TiedTags: Tied Tags ========= Tied tags are expressions to produce a readable formatted output of more than one tag. Tag values are outputted left to right, with the default output separator as ``-``. To combine multiple tags start the expression with ``~`` and separate each tag by ``~`` again. Examples: ============================== ================================ ========================================================= Included Tags Tied Tag Result ============================== ================================ ========================================================= artist, title ``~artist~title`` *Bob Marley - Jammin'* ~#track, ~dirname ``~~#track~~dirname`` *5 - /home/user/music/Reggae* date, artist, album, ~filesize ``~date~artist~album~~filesize`` *2000 - Bob Marley - Songs of Freedom (Various) - 6.9 MB* ============================== ================================ ========================================================= Usage in Quod Libet ------------------- Tied tags can be used in tag patterns and searches as if they were normal tags: :: ~artist~title=/AC.?DC/ :: <tracknumber|<tracknumber>. ><title~version> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/overview.rst�������������������������������������������������������������0000644�0001750�0001750�00000011420�13112005742�020360� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Overview ======== The Fundamentals ---------------- Explanation of the GUI elements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ When you start up Quod Libet for the first time, and have configured your library, it should look something a little like the screenshot here, which is show with annotations. These are all explained below. .. figure:: images/main_overview.png :align: right :width: 400px :figwidth: 400px A basic view of Quod Libet, and its GUI elements 1. Player Controls ^^^^^^^^^^^^^^^^^^ Provides buttons for seeking, changing volume and changing the currently played song. By right-clicking, they also provide context menus with advanced options: * The volume button lets you choose the active replaygain mode (album, track, automatic). * The seek button can display the remaining instead of the elapsed time and provides options for interacting with bookmarks. * The context menu of the play button has an option to pause playback after the current song. 2. Current Song Information ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Displays information about the currently playing song. Again, the context menu contains more options, like rating and tag editing for the current song. There is also an entry called *Edit Display...* which lets you change everything that is shown in that area, like the file format, bitrate, font size etc. The syntax is the same as for :ref:`renaming files <RenamingFiles>`. 3. The Song List & Browser ^^^^^^^^^^^^^^^^^^^^^^^^^^ As the name suggests, the song list is a list of matching songs presented by the current browser. The browser consists of a way to filter your library (songs), e.g. a simple search or by a list of albums. In the image above, no browser is active so only the current song list is shown. You can change the active browser by selecting one in the *View* menu. 4. Playback Order ^^^^^^^^^^^^^^^^^ The active playback order affects the selection of the next song or what happens if you manually switch to a new song. Note that Play Order Plugins add to this list allowing QL new ways of ordering songs, like following your selection or adding songs to the queue instead of playing them immediately. The *Repeat* checkbox can be used in conjunction with the playback orders, to repeat the currently selected view of songs after all song have been played or skipped. It's important to note that the playback order will not affect the queue, which has its own playback settings. 5. Song Information ^^^^^^^^^^^^^^^^^^^ The area in the bottom-right corner shows information about all songs in the song list *or* about your song selection if more than one song is selected. It also shows progress information of background operations like importing music. The Queue --------- .. image:: images/queue.png :width: 350px :align: right The play queue and the song list determine what's played next. Unlike the song list the queue consumes songs (from the queue not your library) as they are played. That is, once a song starts playing it disappears from the queue. The queue however, takes precedence whenever it has songs. After it's empty, playback will continue in the main song list where it left off. To add songs to the queue, right-click and *Add to Queue*, use the shortcut ``CTRL+Return`` or select songs in a different browser window. More Browsers ------------- .. image:: images/browser_window.png :width: 350px :align: right Besides the active browser in the main window, you can open as many different browser windows as you want by selecting one under *Browse* > *Open Browser* or in the tray icon plugin context menu. In a separate browser, double-clicking a song will result in it being added to the queue rather than played immediately (as per the main browser). See the :ref:`Browsers Guide <Browse>` for full details on browsers and the various implementations. Example usage: * Manage playlists by dragging songs across browsers (eg Search browser to Playlist browser) * Edit the tags of some songs while the ones in the main song list get played etc. * Check out other songs by the artist currently playing without disturbing that list. The Library ----------- If all your music lives in one folder on your computer, adding your entire music collection in Quod Libet is easy. From the main menu bar, select *File* > *Add a Folder* and browse to the top-most folder containing your music. By default Quod Libet will scan your selected folder recursively, adding all the songs found to your library automatically. Add more folders if you wish. Depending on the size of your music collection, it may take a few minutes to perform the initial scan. Plugins ------- .. image:: images/plugins.png :width: 450px The image above shows the plugin manager, from where you can enable / disable / configure all available plugins. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/searching.rst������������������������������������������������������������0000644�0001750�0001750�00000015435�13112005742�020467� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Searching: Searching Your Library ====================== Pretty much every view in Quod Libet contains a search entry where you can enter search terms and save them. Quod Libet will search in artist, album, title, version, and any other visible columns for what you enter. If that's enough for you, you can stop reading now. But what if you want something more powerful? Combining Searches and Negation ------------------------------- You can combine search terms using ``&`` ("and") and ``|`` ("or"). If you want to listen to Electronic music but no Ambient:: &(electro, !ambient) Or you want to get all songs by `Neutral Milk Hotel <https://en.wikipedia.org/wiki/Neutral_Milk_Hotel>`_ including the solo performances of `Jeff Mangum <https://en.wikipedia.org/wiki/Jeff_Mangum>`_:: |(mangum, neutral milk) You can get all songs that don't match the search term using ``!``:: !electro Lets say you want to listen to you whole library but are not in the mood for classical music or songs by `The Smiths <https://en.wikipedia.org/wiki/The_Smiths>`_:: !|(classical, smiths) While these searches are easy to type in, they depend on the visible columns and the active browser, also the last one might exclude some songs which happen to contain "smiths" in their album title - see below for how to perform more targeted searching. Searching a Specific Tag ------------------------ To search a specific tag, use a search like:: artist = delerium album = bargainville The search terms can't use quotes (``"``), slashes (``/``), hashes (``#``), pipes (``|``), ampersands (``&``), or bangs (``!``); these characters have special meanings for advanced searches. In QL 3.9 onwards, you can also use `!=` to search for things not equal:: artist != delerium genre != /.+ Jazz/ You can also search :ref:internal tags <InternalTags>, e.g. * ``~format = Ogg Vorbis`` * ``~dirname=Greatest Hits`` - search for all songs in Greatest Hits folders. It's also possible to search in multiple tags at once: * ``artist, performer = "Boa"c`` Exact Matching -------------- If you want an exact match, use quotes:: artist = "a girl called eddy" If you need to put a ``"`` inside the quotes, you can put a ``\`` before it:: version = "12\" mix" You can put a ``c`` after the last " to make the search case-sensitive:: artist = "BoA"c artist = "Boa"c artist != "Boa"c Combining Tag Searches ---------------------- As with free-text searches, you can combine searches using ``&`` ("and") and ``|`` ("or"); either grouping entire searches, or just the tag values. Although the examples below use simple keywords, you can also use exact matches or regular expressions:: artist = |(Townshend, Who) &(artist = Lindsay Smith, album = Vat) The first finds anything by `The Who <https://en.wikipedia.org/wiki/The_Who>`_ or guitarist `Pete Townshend <https://en.wikipedia.org/wiki/Pete_Townshend>`_ . The second gives the songs that match both, so you'll find songs `Lindsay Smith <http://www.lindsay-smith.com/>`_'s `Tales From The Fruitbat Vat <http://www.cdbaby.com/cd/lindsaysmith>`_, but not her other albums. You can also pick out all the songs that *don't* match the terms you give, using ``!``:: genre = !Audiobook is probably a good idea when playing your whole library on shuffle. Note again that in QL 3.9 onwards you can use the alternative syntax of:: genre != Audiobook Numeric Searches ---------------- Using ``#``, you can search your library using numeric values. Quod Libet keeps some internal numeric values including ``track``, ``disc``, ``rating``, ``length`` etc. See :ref:`numeric-tags` for full details. You can also search any other tag as long as the values have a number format like ``1234`` or ``-42.42``, for example ``year`` or ``bpm``. For comparisons you can then use typical binary operators like ``=``, ``<``, ``>``, ``<=``, ``>=`` and ``!=``. * ``#(skipcount > 100)`` could find really unpopular songs, or * ``#(track > 50)`` to figure out who makes really insane albums, or * ``#(bpm > 160)`` to find really fast songs You can also use chained comparisons: * ``#(10 <= track < 100)`` to find all two-digit tracks. Times like ``added`` are stored in seconds, which is pretty cumbersome to search on. Instead, you can search with semi-English, like: * ``#(added < 1 day)`` for very recently added tracks to find songs added in the last day (if you think that that's backwards, mentally add 'ago' when you read it). Quod Libet knows about seconds, minutes, hours, days, months (30 days), and years (365 days), kB (Kilobyte), MB (Megabyte), GB (Gigabyte). You can also use ''HH:MM'' notation, like: * ``#(2:00 < length < 3:00)`` for songs between two and three minutes long. Of course, you can combine numeric with other kinds of searches. * ``&(genre = classical, #(lastplayed > 3 days))`` * ``&(artist = "Rush", #(year <= 1996))`` Playlists --------- You can use the ``~playlists`` internal tag to search by playlists. It is populated with a list of all the playlists that song appears in. This is surprisingly powerful if you're a playlist user. * ``~playlists=chilled`` will return all songs included in any playlist with "chilled" in its name. * ``~playlists=|("Chilled", "Jazzy")`` for all songs in either (or both) of those playlists. * ``&(#(rating>=0.75), ~playlists="")`` will return all high-rated songs *not* in any playlist Regular Expressions ------------------- Quod Libet also supports searching your library using ''regular expressions'', a common way of finding text for Unix applications. Regular expressions look like regular searches, except they use / instead of ", and some punctuation has special meaning. There are many good tutorials on the web, and useful online regex testers (such as `Regex Pal <http://www.regexpal .com/>`_) Some examples: * ``artist = !/\sRice/`` (or in 3.9+: ``artist != /\sRice/``) or using the default tags * ``/^portis/`` like with exact matches append a `c` to make the search case-sensitive * ``/Boa/c`` Ignore Accents and Umlauts -------------------------- Appending a ``d`` after searches makes it's characters match variants with accents, umlauts etc. Both ``/Sigur Ros/d`` and ``"Sigur Ros"d`` will match songs with the artist name ``"Sigur Rós"``. Now you can search anything! Reusing queries --------------- Complex queries can be split into simpler ones. Also, a query can be reused in other ones. This way it is easier to change and administer your searches. In order to do so, the ``Include Saved Search`` plugin must be activated. If you create a saved search named ``Unrated`` you can search for unrated songs from the Beatles like this: ``&(@(saved: Unrated), Beatles)`` For creating saved searches, use the "Edit saved searches..." item in the drop-down at the right of the query text box. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/index.rst����������������������������������������������������������������0000644�0001750�0001750�00000000407�13112005742�017624� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������User Guide ========== .. toctree:: :titlesonly: overview tags/index searching stats_rating.rst browse/index editing_tags renaming_files playback/index shortcuts interacting config_files commands/index faq ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/interacting.rst����������������������������������������������������������0000644�0001750�0001750�00000007507�13112005742�021034� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Interacting with Quod Libet =========================== In Python --------- Quod Libet supports :ref:`plugins written in Python <PluginDev>`. These plugins can interact with songs more directly than the other interfaces, changing or reading metadata using dict-like !AudioFile objects. The plugin interface has not yet stabilized, although we do not expect it to change drastically in the future. The Unix Way ------------ Querying the player ^^^^^^^^^^^^^^^^^^^ Quod Libet writes information about the current song to ``~/.quodlibet/current``. The file is in key=value form. Key values are in UTF-8, except for the ``~filename`` key, which has unknown encoding (but will point to the file being played when interpreted as a sequence of bytes). There is a ``--print-playing`` option which can use the same syntax as the RenamingFiles interface to print information about the current song: ``quodlibet --print-playing '<artist> - <tracknumber~title>'`` ``quodlibet --status`` provides player state information. The first word will be either *playing*, *paused*, or *not-running*, followed by * the selected View, * volume setting (0.0 - 1.0) * Playback order & repeat settings If the View is SearchBar, then the text currently in the search bar will be displayed on a second status line. Controlling the player ^^^^^^^^^^^^^^^^^^^^^^ Quod Libet understands a number of command line arguments to control a running player. For a full list, see the man page. * ``--next``, ``--previous``, ``--play``, and ``--pause`` should be self-explanatory; ``--play-pause`` toggles pause on and off. * ``--volume n`` sets the volume to anywhere between 0 (muted) or 100 (full volume) * ``--seek <time>`` seeks within the current song. * ``--query <search text>`` searches in your library (if the current browser supports it). * ``--play-file <filename>`` plays that file or directory. Quod Libet can also be controlled via a `FIFO <https://en.wikipedia.org/wiki/Named_pipe>`_ , ``~/.quodlibet/control``. To see how the command-line arguments map to FIFO commands, refer to ``process_arguments()`` in https://github.com/quodlibet/quodlibet/blob/master/quodlibet/quodlibet/cli.py; as a simple example:: # Sets volume to 50% echo volume 50 > ~/.quodlibet/control Integration with third party tools ---------------------------------- Quod Libet in Conky ^^^^^^^^^^^^^^^^^^^ `Conky <http://conky.sourceforge.net/>`_ is a lightweight system monitor for X. It includes builtin objects for many popular music players, but not quodlibet (yet). That doesn't mean you can't use conky with quodlibet. After installing conky, add the following to your```~/.conkyrc`` file:: ${if_existing /<path to your home directory>/.quodlibet/current} ${exec quodlibet --print-playing "<artist>"} ${scroll 50 ${exec quodlibet --print-playing "<title~album>"} } ${endif} will display the current artist on one line with a scrolling display of song title and album on the next line. Conky will only attempt to display this information if quodlibet is playing. eSpeak: Speech Synthesizer ^^^^^^^^^^^^^^^^^^^^^^^^^^ You can use `eSpeak <http://espeak.sourceforge.net/>`_ to hear the current playing title. :: quodlibet --print-playing "<~~people~title>" | espeak -s 120 -v $(quodlibet --print-playing "<language|<language>|en>") In this example Quod Libet will use the value of the language tag to tell eSpeak which language/voice to use for the specific title (Use ``espeak --voices``` to get a list of all available languages). You can also lower the volume during speaking:: VOL=$(echo $(quodlibet --status | head -n1 | cut -d\ -f3)*100 | bc) quodlibet --volume=$(echo $VOL/3 | bc) quodlibet --print-playing "<~~people~title>" | espeak -s 120 -v $(quodlibet --print-playing "<language|<language>|en>") quodlibet --volume=$(echo $VOL/1 | bc) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/commands/����������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017561� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/commands/exfalso.rst�����������������������������������������������������0000644�0001750�0001750�00000003536�13112005742�021765� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������========= exfalso ========= ---------------- audio tag editor ---------------- :Manual section: 1 SYNOPSIS ======== **exfalso** [ *directory* ] DESCRIPTION =========== Ex Falso displays and edits audio metadata tags. Supported formats include MP3, Ogg Vorbis, FLAC, Musepack (MPC), WavPack, and MOD/XM/IT. This manual page is only a short reference for Ex Falso. Complete documentation is available at https://quodlibet.readthedocs.io/en/latest/guide/. OPTIONS ======= Ex Falso may be given a directory to open on the command line. TIED TAGS ========= Many places in Ex Falso allow you to use "tied tags". Tied tags are two tag names joined together with a "~" like "title~version" or "album~part". Tied tags result in "nice" displays even when one of the tags is missing; for example, "title~version" will result in Title - Version when a version tag is present, but only Title when one isn't. You can tie any number of tags together. RENAMING FILES ============== Ex Falso allows you to rename files based on their tags. In some cases you may wish to alter the filename depending on whether some tags are present or missing, in addition to their values. A common pattern might be ``<tracknumber>. <title~version>`` You can use a '|' to only text when a tag is present: ``<tracknumber|<tracknumber>. ><title~version>`` You can also specify literal text to use if the tag is missing by adding another '|': ``<album|<album>|No Album> - <title>`` See https://quodlibet.readthedocs.io/en/latest/guide/renaming_files.html. BUGS ==== See https://github.com/quodlibet/quodlibet/issues for a list of all currently open bugs and feature requests. AUTHORS ======= Joe Wreschnig and Michael Urman are the primary authors of Ex Falso. SEE ALSO ======== | https://quodlibet.readthedocs.io/en/latest/guide/, | https://quodlibet.readthedocs.io/en/latest/guide/faq.html ������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/commands/index.rst�������������������������������������������������������0000644�0001750�0001750�00000000145�13112005742�021424� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Command Manuals =============== .. toctree:: :titlesonly: quodlibet exfalso operon ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/commands/Makefile��������������������������������������������������������0000644�0001750�0001750�00000000176�13112005742�021227� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MANDIR=../../../data all: $(MANDIR)/exfalso.1 $(MANDIR)/quodlibet.1 $(MANDIR)/operon.1 $(MANDIR)/%.1:%.rst rst2man $< > $@ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/commands/operon.rst������������������������������������������������������0000644�0001750�0001750�00000015165�13112005742�021627� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������======== operon ======== ------------------------- command line music tagger ------------------------- :Manual section: 1 SYNOPSIS ======== | **operon** [--version] [--help] [-v | --verbose] <*command*> [<*argument*>...] | **operon help** <*command*> OPTIONS ======= -h, --help Display help and exit --version Print the program version -v, --verbose Verbose mode COMMAND-OVERVIEW ================ Edit Tags --------- | *add* Add a tag value | *remove* Remove a tag value | *set* Set a tag and remove existing values | *clear* Remove tags | *copy* Copy tags from one file to another | *edit* Edit tags in a text editor | *fill* Fill tags based on the file path Show file metadata ------------------ | *list* List tags | *info* List file information | *print* Print tags based on the given pattern Edit Embedded Images -------------------- | *image-extract* Extract embedded images | *image-set* Set embedded image | *image-clear* Remove embedded images Miscellaneous ------------- | *tags* List all common tags | *help* Display help information EDIT TAGS ========= add --- Add a new tag ``<tag>`` with the value ``<value>`` to all files. operon add [-h] <tag> <value> <file>... -h, --help Display help and exit Example: operon add artist 'The Beatles' song1.ogg song2.ogg remove ------ Remove all values from the tag ``<tag>`` that match either ``<value>`` or the regular expression ``<pattern>`` from all files. operon remove [-h] [--dry-run] <tag> (-e <pattern> | <value>) <file>... -h, --help Display help and exit --dry-run Print the results without changing any files -e, --regexp <regexp> Remove all tag values that match the given regular expression Example: operon remove artist 'The Beatles' song.ogg set --- Replace all values of the tag ``<tag>`` by ``<value>`` in all files. operon set [-h] [--dry-run] <tag> <value> <file>... -h, --help Display help and exit --dry-run Print the results without changing any files Example: operon set artist 'The Beatles' song.ogg clear ----- Remove all tags that match ``<tag>`` or the regular expression ``<pattern>`` from all files. If `--all` is specified, all known tags will be removed. operon clear [-h] [--dry-run] (-a | -e <pattern> | <tag>) <file>... -h, --help Display help and exit --dry-run Print the results without changing any files -a, --all Remove all tags -e, --regexp <regexp> Remove all tags that match the given regular expression Example: operon clear -a song.ogg operon clear -e 'musicbrainz\_.*' song.ogg operon clear date song.ogg copy ---- Copy all tags from the file *<source>* to *<dest>*. All tags in ``<dest>`` will be preserved. In case the destination format doesn't support setting a tag from source, no tags will be copied. To ignore tags that aren't supported by the destination format pass *--ignore-errors*. operon copy [-h] [--dry-run] [--ignore-errors] <source> <dest> -h, --help Display help and exit --dry-run Print the results without changing any files --ignore-errors Skip tags which the target file does not support Example: operon copy song.flac song.ogg edit ---- Shows all tags in a text editor and will apply any changes made to the text to the tags. *operon* will use the editor specified in the VISUAL or EDITOR environment variables and if those are not set fall back to 'nano'. operon edit [-h] [--dry-run] <file> -h, --help Display help and exit --dry-run Print the results without changing any files Example: VISUAL=vi operon edit song.flac fill ---- Fill tags based one file paths and a given pattern. operon fill [-h] [--dry-run] <pattern> <file>... -h, --help show this help message and exit --dry-run show changes, don't apply them Example: operon fill --dry-run "<tracknumber>. <title>" "01. Was Ist Ist.flac" SHOW FILE METADATA ================== list ---- Lists all tags, values and a description of each tag in a table. operon list [-h] [-a] [-t] [-c <c1>,<c2>...] <file> -h, --help Display help and exit -a, --all Also list programmatic tags -t, --terse Output is terse and suitable for script processing -c, --columns <name>,... Defines which columns should be printed and in which order Example: operon list -a song.flac operon list -t -c tag,value song.ogg info ---- Lists non-tag metadata like length, size and format. operon info [-h] [-t] [-c <c1>,<c2>...] <file> -h, --help Display help and exit -t, --terse Output is terse and suitable for script processing -c, --columns <name>,... Defines which columns should be printed and in which order Example: operon info a.ogg print ----- Prints information per file built from tag values. The pattern can be customized by passing a pattern string (See ``quodlibet``\(1) for the pattern format) operon print [-h] [-p <pattern>] <file>... -h, --help Display help and exit -p, --pattern <pattern> Use a custom pattern Example: operon print -p "<album> - <artist>" a.ogg EDIT EMBEDDED IMAGES ==================== image-extract ------------- Extract all embedded images to the current working directory or the specified destination directory. operon image-extract [-h] [--dry-run] [--primary] [-d <destination>] <file>... -h, --help Display help and exit --dry-run Print the found images and resulting file paths but don't save them --primary Only extract the primary images for each file -d, --destination <destination> Save all images to the specified destination Example: operon image-extract asong.mp3 anotherone.ogg image-set --------- Set the provided image as primary embedded image and remove all other embedded images. operon image-set <image-file> <file>... -h, --help Display help and exit Example: operon image-set cover.jpg song.mp3 image-clear ----------- Remove all embedded images from all specified files. operon image-clear <file>... -h, --help Display help and exit Example: operon image-clear song.mp3 MISCELLANEOUS ============= tags ---- List all common tags operon tags [-h] [-a] [-t] [-c <c1>,<c2>...] -h, --help Display help and exit -a, --all Also list programmatic tags -t, --terse Output is terse and suitable for script processing -c, --columns <name>,... Defines which columns should be printed and in which order Example: operon tags -a operon tags -t -c tag help ---- operon help [<command>] Example: operon help list SEE ALSO ======== | ``regex``\(7) | ``exfalso``\(1) | ``quodlibet``\(1) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/commands/quodlibet.rst���������������������������������������������������0000644�0001750�0001750�00000014333�13112005742�022311� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������=========== quodlibet =========== -------------------------------- audio library manager and player -------------------------------- :Manual section: 1 SYNOPSIS ======== | **quodlibet** [ **--print-playing** | *control* ] | **exfalso** [ *directory* ] DESCRIPTION =========== Quod Libet is a music management program. It provides several different ways to view your audio library, as well as support for Internet radio and audio feeds. It has extremely flexible metadata tag editing and searching capabilities. This manual page is only a short reference for Quod Libet. Complete documentation is available at https://quodlibet.readthedocs.io/en/latest/guide/index.html. OPTIONS ======= --enqueue filename|query Enqueue a filename or query results --filter tag=value Filter on a tag value --focus Focus the running player --hide-window Hide main window --next Jump to next song --list-browsers List available browsers --open-browser=BrowserName Open a new browser --order=inorder|shuffle|weighted|onesong|toggle Set or toggle the playback order --pause Pause playback --play Start playback --play-file=filename Play a file --play-pause Toggle play/pause mode --previous Jump to previous song if near the beginning, otherwise restart --force-previous Jump to previous song --print-playlist Print the current playlist --print-queue Print the contents of the queue --print-playing Print out information about the currently playing song. You may provide in a string like the kind described in the RENAMING FILES section below. --query=search-string Search your audio library --run Start Quod Libet if it isn't running --quit Exit Quod Libet --random=tag Filter on a random value --refresh Refresh and rescan library --repeat=off|on|t Turn repeat off, on, or toggle --seek=[+|-][HH:]MM:SS Seek within the playing song --set-browser=BrowserName Set the current browser --set-rating=0.0..1.0 Rate the playing song --show-window Show main window --start-hidden Don't show any windows on start --start-playing Begin playing immediately --status Print playing status --stop-after=0|1|t Stop after the playing song --toggle-window Toggle main window visibility --unfilter Remove active browser filters --unqueue=filename|query Unqueue a file or query --volume=(+\|-\|)0..100 Set the volume ALBUM COVERS ============ Album covers should be put in the same directory as the songs they apply to, and have "folder", "front", or "cover" in their filenames. If you want to store multiple albums in the same directory but keep distinct cover images, the name of the appropriate image file must contain the labelid tag value, e.g. COCX-32760 cover.jpg. TIED TAGS ========= Many places in Quod Libet allow you to use "tied tags". Tied tags are two tag names joined together with a "~" like "title~version" or "album~part". Tied tags result in "nice" displays even when one of the tags is missing; for example, "title~version" will result in Title - Version when a version tag is present, but only Title when one isn't. You can tie any number of tags together. SEARCH SYNTAX ============= All of Quod Libet's search boxes support advanced searches of the following forms: \ | tag = value | tag = !value | tag = "value" | tag = /value/ | tag = &(value1, value2) | tag = \|(value1, value2) | !tag = value | \|(tag1 = value1, tag2 = value2) | &(tag1 = value1, tag2 = value2) | #(numerictag < value) | #(numerictag = value) | #(numerictag > value) \ The 'c' postfix on strings or regular expressions makes the search case-sensitive. Numeric values may be given as integers, floating-point numbers, MM:SS format, or simple English, e.g. "3 days", "2 hours". See https://quodlibet.readthedocs.io/en/latest/guide/searching.html. All internal tags begin with a ~ character. Non-numeric internal tags are ~base‐ name, ~dirname, ~filename, ~format, ~length, ~people, and ~rating. Numeric internal tags are ~#added, ~#bitrate, ~#disc, ~#lastplayed, ~#laststarted, ~#length, ~#mtime, ~#playcount, ~#skipcount, and ~#track. See https://quodlibet.readthedocs.io/en/latest/guide/tags/internal_tags.html. RENAMING FILES ============== Quod Libet allows you to rename files based on their tags. In some cases you may wish to alter the filename depending on whether some tags are present or missing, in addition to their values. A common pattern might be ``<tracknumber>. <title~version>`` You can use a '|' to only text when a tag is present: ``<tracknumber|<tracknumber>. ><title~version>`` You can also specify literal text to use if the tag is missing by adding another '|': ``<album|<album>|No Album> - <title>`` See https://quodlibet.readthedocs.io/en/latest/guide/renaming_files.html. AUDIO BACKENDS ============== Quod Libet uses GStreamer for audio playback. It tries to read your GConf GStreamer configuration, but if that fails it falls back to osssink. You can change the pipeline option in ~/.quodlibet/config to use a different sink, or pass options to the sink. For example, you might use esdsink or alsasink device=hw:1. See https://quodlibet.readthedocs.io/en/latest/guide/playback/backends.html. FILES ===== ~/.quodlibet/songs A pickled Python dict of cached metadata. Deleting this file will remove all songs from your library. ~/.quodlibet/config Quod Libet's configuration file. This file is overwritten when Quod Libet exits. ~/.quodlibet/current A "key=value" file containing information about the currently playing song. ~/.quodlibet/control A FIFO connected to the most-recently-started instance of the program. --next, --previous, etc., use this to control the player. ~/.quodlibet/plugins/ Put plugins here. ~/.quodlibet/browsers/ Put custom library browsers here. See https://quodlibet.readthedocs.io/en/latest/guide/interacting.html. BUGS ==== See https://github.com/quodlibet/quodlibet/issues for a list of all currently open bugs and feature requests. AUTHORS ======= Joe Wreschnig and Michael Urman are the primary authors of Quod Libet. SEE ALSO ======== | https://quodlibet.readthedocs.io/en/latest/guide/, | https://quodlibet.readthedocs.io/en/latest/guide/faq.html, | ``regex``\(7), ``gst-launch``\(1) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/images/������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017225� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/images/main_overview.png�������������������������������������������������0000644�0001750�0001750�00000130766�13112005742�022624� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�������H���sRGB���� pHYs�� �� ����tIME�(]#���bKGD�����vIDATx}uxG﻾{NPۖB)R\SwBABB'D!݅o΄MlKH0{]wݝٙ3g7s93{?Mlb&6Mlb&6Mlb&6Mlb[LX70c3)% $|n• a* Xe缴oe3Jz@`yo:I[P~9Ed\'\[Z ,?Q_?oy 4 A8ҺKZm)^.g'Mׂ}0m-\{CWSz}:/i}Uyԥ)^MyyːEzѹP2I,&mu m0Ô70b9X}m2Uy`wNT%!M,‚Sn\%W 4�V>W`WTx;R׵Awbϛ)}UײHϓWMbtj64L=} 5 6ڋ^ RKv^+DYyrΉ9TnXIePAdHʒX*e)Aߋ/=iϏexeL 3\ℛ:!<m._:Fϫ+^/?a!+AVFk6^=w0Y7HR.tH:nƘ"UUeK ̬ OmFbl43.ZA]_wݫsus8tŖD&aܟUy?hYU5ϼ/G}]uSQ;K_gYsZsހk`,OSSyԤKmhg=mq֐ȍWUݿ<ڔ(8sмC<<BS,Pgҥ^~AϬ,#Lc:}_{s5FGC*;7y N8".%%e7 o8qk7cfCq֍|Qzԥ-)ڨ*&8zI(bƧfᄱ#? UkdQ0v'm3%/.H[dB:V /ݫ ^ݶW{4ɩ~FH]OMpt~f ?EfN]0ies[E%%q+4yDhz)?mS\b]}RT=;ʞGM&촳$#ڌKF׫*Kն,`:"^u&_`ufMzY<ұDR@W9`71uF։gJHeף)]Àju\4uìwfaqpғ++zV,K Lgn\er.˴6<.Yc"@"UmЦ'}/9b 0s~\k95/\t#0+<ߌp% Kcj]6{&K�zc9~5\z\]f\{iy<yqeU;Lެުl貶ϛ)Ŋ UVDnt$UVk[BjD]EYuMeY:.(POrmXu+͢;ut۶!TT<v w>X@VD9`VgFONI9JHeף)]V#1-0˚ϑDP'G[lrRG?:]{[OdY0йRLtP %yi?)1=R 0Oǎ(VNuPJʱ ppDI䆦&@;v8+ÙuWk;66UۜCzv:F}TOg?$ruR$W/?,¤70e%%#+_hΤKӠyeV/9/9ZeRt)O u|%eUgU! <JHeף)]X^7qw6zɠtM*_U~yY=x=KeiT&ɣMWȩ~ e~0{CK ?* hԺK猭}/M�1/Uj[>3[\)|Qfkeݞ7mAaE*r[~KO˟zueIJ)k~KUX^2UE3* .P?͘h;xSvR]wVujL7? RGBfI+v#2Jˮznt\-]<R9rtX7Or^6ciWYQť/OFD<ڴ,]3HMKW95ݯeg=9ٓ|!nսωo̺ހT{*՘M10`ΛUKgƽJu{޴}ꆵ~UTCqX'],uemfLWUY:.u /pƬ xܤz&u{lw?s[N SwV<teTF$TWS㒙;.E ?.7֦Jor&6{U&rԵai7nh_.kWzTA1ݛv~\6rjY{+ɓ,_7\V'Y=z?fh\{iU=" JauYcfV#],u#0nVώ\~mtMm4)ۢZ.ȍQe%WYwݩ"˪"ԙtۯY4%Yz>eƭGnt^e;i;j G34iиx]gd<3bTe)OuQ'Ju Tױui((*f9lXGyO~uiҵѥ2k6hj?@^FNm'* M}Ƙ!~?bl#TJކiVp&G9[uU03{9`S@LrOj(ӻ&]jG)ņUफVe']"R,oa;~<U3 QYΤ= ǝx0|9MfN3QƟ!YmSvqP[CuQ MyʑCC+OWꚰ[[`& dq>h]>Y(DuimX]*+S~N]4daϮ̴Wmt?nD<3-yyձ{A 9='z6,<J. g.&6S@߰JwR'E3C/ìڅ{y9 ݼvՀ)]3"j,39e>;Clf1>Or@}*rnKq'Yt}S/Pg]xUz'CĴq)OrQRVl>&?+Xƒτon)7\9g僬Ii�mAgmͤ:. ':b5(*;#Z֤pBf hH{KKP3 +HW@@@@@@ ݖvzh\ҥaVQ4tC!W~S} K4]zaȨu[Ί5ԤťW}R%Gm+ H30u:ӫ9w^(' wM͐@lss#CqPPtҒ%HW@@nHwϾadlen-wh$*s67y*CCHGb�>{t֯"&<y:'N` 62KLLv4l:]cnE*SRRs_7x9E9z<cCڦM=#ǎc_{kz(M^31aa aa׏7.20vFjj^}8;:7qtYՆt:}.CBiVtNV4Yp1J;ކ$]U0ҙ=ɵv&޻55N;$$Te:Y!ǡ:\b%'6k(o6<O;9UeDD&Cپ{\d_6=-`Dϗ6Ϗ>^X^ҥWp1oyhET zb>:$˫);Z"DDFrkQjרks]c^,J9>>UǤKU3<"8)) ?1tmӦm;qJW꘬?:u^_{¥˫Ǝ-{ y~֧n^}`m]LՃZ;zĈ7*GVH}ՇKC䞤<UFhtCU\U RՔ.o[]-91sƇ蜲:ݟ$&k,fr y7m/m}ux Hm}<ɒ:1阬)e]KcA,ڐbg(aoNцdyt%h]-]u+kk^KXrs h_\ygN> ,d6Ϗҥ}a .i| i܊ъ֭M!0tr<t?n1][- z|lS<r:uk^{f^ި0{#Zg[GjMڮ욺S<tr}Uri?Sab)ݳ/Cr Ҿx ]nLXi.MPQL7yS:u6vvJ!7CLYrҬM4fNgRMcs4:f$N|PN]护CҬbWtUj"]emWvM]+̜šiv{xzUбg/kTh[8H% S ҭ 骛lfSu-xC[Ct+ HW ]Att-RhdMr̉XV2MHM@tr@ o lbKuXU-ȗDOaH7"ak(Z7.<~xCEH[pC (HέXT@@CM F&ݲjV.ubM˃4ANj q0KXMtb[&JtoR@e@h k .YCQ Z;8==y+.o-x%6M6a/&AիWqҥF۷.iF炂pi4 M^oHW L(Zڐk0w\<~/FmtiO"_8 KKK.lp燀�0nBnnnכ ]e*J.˾Y/tXPTT(fr HpBeozSE:^ARl?Нss\K1xHls3^ 9q#ƌŏ={Ͻ8mzacXjuտdJ9v!]r2tѨKJ"T7 ']S%?w3!<<d(((hzD56Vk_͉t_N:` a߁>}HJNFLl,a-J1=pWSg̙[#q2 lJ!\ظti\SF/.npp~7O#O6*RF#]$Dwii)'�M2',IKner�###_8nSԛ&;x~փ썏鼲N5͞zO6k?S}.̜;^aѲUhL:b΂ѧz폩3g㾅eg =[Mu[[JHH[ UDغ &Ln޾So'a<OLLVHҍ6iomisAy3yYu!F׹lEҊ(l޾ .g㟛qKIeeFFfrF޻;`H9L"2*ő3BԄ T<UMCsdՒtҍxh){9eN �3 uAL!!|)tIܣtns5Z\vܽ'TenU"峱$yϬZ'Vejy-df^zٶs7O342NjvS*e ˋ:~�f\R;CBB#]j6_%]�|5^O_[`E/%ZZ㞅l`?�fV=yNL׏Y9ψhR)yӸNiBgJj }~%_%&1$&}Kx ]+<CeZe:!NB\<Rbs&kk{~cbbҸec@6ErSԛ&%w%YedP)yy,u=ttȊwN $$5eY%t5sί wxXgӕ@zROΟ!kObNjaCs, ZUseNOHWͧڨ>sů'✞^>AC)ݳZ=33̜;ڹHyIW: g7ܥ+{(`x.7 60fDƐ~mqr0{f/<\</rD&ec\0WLؾ .]t%%%kPݚHCCC9h#ݦ7M:v䖥c@-:GiNpǻ"]`U|Db䩋ZdmʭpŚEqKy{??wrG,<͓un4N]KאUY;ZV&mm>mdES;Օ@kJ%'4A]}n2j4X_"F/G/# yy36m3 wMa^h-lìCS KbdM\5+W-,m"'7Y/pɕY&#}8OSrEfa^cȍNTDYLc@"i_9e"]MLī"GYn4Y^PFMQoڐ.Ya4 ]Mt5n %ku[r9 $ _KD’u}NZ<a/Tw!:%]i"]M6_KVih~TkO{\pf<etµgVɭZ_ıg)Y4刍G>9+sccF%k"7gʗL' ,7M%= 5O{Ӻ'q�vpgo4\ #ݦ7mHp^bi$i/5uE(G>:]^Vtcj^V"BcS:Gを=<^;Rn]Jl|VeLL ^V+ůl"hvq?5WsmrMi/󘮦iM (zơ8#oqFJQPdG8;OQ^Z?jt%DCE-:;;c߻cǎ0T䫌t޴%]m:OiBX0CDU4GVG#*T|"M!Y4M$gnbO&Ϙ߸-A%Lf[ʵ4v4^+'i ;UCVy;霵6iomՕti2E[wT='4s|m'Zi d` A2*Źx,yѮ(d(ɌB^0EiNDNɐ.}E"h4T:!YO(TSԉөnuK@i2"(*nn^d!t|n \juLoFj+.O'Tk{t}z,4YZ=Cn~*>M; T@c4GM98(ddٲW k1j+6a#dx|DT&MN%{;d4 0jxV%#'Je .D3UmM.YT2DFS^>K^ 骲%<M2([Ar*GEi>ʊߊBn ?(b�\nmI+:{"4 tNl"wnyjy4KІtTT"9ɖx"-=N|e}u d1˯HWިf>ڦk{ez{@UD۸&+g5h S>|wVj)"U]H%nMt)Q ʣұ"!fkg'rty=T:ҥPDb&UÇydMGqǰv8׀5tE$./Gԑ:QE³~u^Z:R@]4( ;A2dtLydegVu! +#]9hJWEIWՂd$Qd;{J5k|,HWQt)tLI>0ewR$"] eB{zr ҭْ.Ya 'uipO!$4YYɜ22yMT VOxDRDF!>!"_rO{zz]HN: ]NH7#MtIoHW,l- HEB8HLZ\kmt%:n"&PZ?ZXcpvqB\| 'ʥ<ҩLy=T7ɠ8iBtҸ."h?*Y.U fobb`em#˫FeިRݤ t)t{mtE$ H \4KKJc)FS.;QMؠ"pÏsfq21!>>Vc:Ae롺IE钵Kī;;Jrb8_+TEs^5+/tYtDҔ{mФR$&aJA"賘 XO!),Y]r+)>$:xA *XFDd[ |Q‚|yXV+6+I侹t| �yr hJ2h"]@%Ɔ @0fY{`{:4*Q.H'ґtҵ[C.}g<ogyȉG@z2odSƜ* HnDeehɚ(r%o^N.E#1f^oJ㦰*ptkF8vt˵mSzndQF4JKcrX[[?CL`jvE 0*eu(#]mFmH Hn'KW{MzSGZpR)QsA߂* F/EbR ;Hm;kՏkZy _MY(}S+?st }J9CPi<oM)UkxYD:xʿŭr A. |n.)*q93<.r+sAK\f2.2QMaS"HKU W#tϟaI881 GSdHȓ.)AtC‚޾xݛ8td?'[sJqa |2Fofj;tA:!hJ'+ӽ&#]C�OH5wƱ9 E< KOaB4g7.^Ƃ[wK]6_1͂R@xEaiǖm*IFt;OMt#*$6;3LΜLnҹq2F)A!SS,b!-9().Q;dH JJJΕt,ѧ-dx!1Pǥ.]^խti1VVV NPpt?}=q1ޏ ̌_GdnWYPGFmHҍtmtJoH~UtR)0?EUњ&7o)}ɭLGOfARt"9նӠhRCrkyq\E9T&HIB [vtKV*ҥmaM )ҭqR}D)Rdqͬ-GAV$OEQa'`^K'%˸Y =[WbT$:VL0(uk8{ZMndQFGY"^9,--+?UbV#7GWw'xs-}{߸w<-_(AUr(#]MzRzBtmtLoHWhQ,_7or7.EwJ"Wr?)_,]ADieXZM]H@Upuj:umfIr3,*,-o~^.'Z-XTT]9H uFR|RE˯-,(lYY͇t󦎛 %"r1/(0EhڦS$Q骂'%/o78?r#7'_d{^,h۪+O:Qfj{mӵս\oZ/YҺx�M`fir*$TNRi_uDF/\cE"ҧXҪ>t6 qb%+@I},ْ9IFeާ @7L/qQ D䄤Zh2o Ko PH[)v2ܿrNjt gqNCUtԑ.-_&:C jmka^L2M4w UZi"$Z&x6&w--x z|ʦ `%DqŞ%]hELvz+ HI k)<Ydf<y'QFƉ?78da gk{ܺveD񄻧[S"Z1 Glt `!dK ܾ]E B6Ei5{@lٱF{ff|S=Jx(,-8f k")9&.YʹxI&Z~v1&qyti]W)$oK p.2+-D(c)`bcɬD<t…gpx{-ZeνpwD˂,ފMtɕF7uld&(#]�i,V4V"u?1[r#H)y@g0{ *U2DyQP(-DJ#LOc~YbX;m$ꍥbzNs`<<>W~9(+JAEy9.钛:n$<<Q@u 2$U$["SE840H)꭮KcV[T@@e ݊gߊBX-*TÐn #|冡8? eũ(AyI:ӽlwġ8| -k0iؽx"άcøuN#2<A4VF5eTD* u۔VҕfSD(щ \[QQfq堤 OvjotPVV'SSX$$�_o8BY^ nV0o/,;ڏXv]pήHO3i|\N46(ͪm H!SIWp)>2mz ҭ 閕#73 ORe,$'15Cphߵ >c p#!я  o{D ;N|50Q ]XC5eԑDB~PGMIoMt[b@'ݧ(Bfj"ғƈIr2q~T5/fY p}Y3z< 0뗭0Nu/0<q�^HEAV \,<!'+y9YJ-݌$x6D*K.JZ>1@ߠp/#%¥pEEi?M^oWD!Ӌjkmʳⳳ) I!ðiVvϪOtus_uౠ)6S@yIIJ<"Ԅ%2EVj#TE.f"ǔx BO<6و#Ga/p 3^Uc n݂{z!q J/S@8;6{UNl֒} YO(ӧy$)8if򋄮.nJߏ5uitY5d[kS6dniH^ߚb8zOZLE!  xn-eS')H`DĆ#.Vt#(N9,OiQA[TX2^018\cڴg?ņ31\,967_ź`bG+;Ą#'#&ᖔ %.nplԁ `"rWHqP(h@ј%}cddɗܼ/dREV[߿^Ǩ9=j*#B9UV< Η6ShG ai@mEV"Ҵ<rK+T-GMA<ɋ0io{Tm'"^ ^"HFyI7/;YDc_x!$ G #0$tr7<ICY|bUj.ggVZ*|]aezNv0u&`cn ;ww=p>L2]~ [7lŠ~(#rtcܼju 3)~pd}K\  R%W<X Oƒ{U_$Nדns[mIHw4i!:&nֆtBS*&7tԯ[P|gZ^OkHKWJDV9q3C@` _h_{kmfn(K*Ʊ&R U x^ҥ1M { ow'x92sB+}[QoVJQZ)$<:e%Hb#nΌx\0ٲ|-+G.]OнkLm,k7c߶=g|vVcmet"և?IG@8=056j|h-eK!8$$yErQ tC]>EeQE@/tթnu῎QV.wA_#WerswǐQ-342NH656r%jNϸsnzr878X2³aAeb # G 5oZw5Yfr&梬qiQ>KP^Foj fS^lMo߆k}:޶Ɨ 1yd|WCgL7[�1`<+/b8~8DLNA,.; 3F&qACc"w>.D .st0o^k-QRB4)YŊK,ز7xrU;?zTc"^IzD$WCzZ<KIPl]HsY4HwYLUߊC(:(3@aSQṅS<e(qa Y.(qGya�ʋ,e(e̚>z p#$EFz;;`Y蓎$a;j6^y |Wҹ >&\c?~3~Ǔdd3Lww8 Μ0x^@.͖dJKIEQJrّ ,]yՅH?,]Yçtu5rmnoy iu8+.!ϸs&";uh\!!oCȎ4Anr,Ð(LB_e?/fivGQJ$'9(͍BiA<#4f ?f?# NeyHAFb|alX.w}֌l۽._oa?`i|;vfBd%"61BaEFO+8K408!&Yѹoq_+D%Ȣ_J> J?/t5.DWJS5KcĴXSUA AW#Ɩ/x\Doxt"opw#GKZ܂6 '[ x8NvCC >9><Ekq|F #{`p�W/ĵKgq�Vo]ば ?D2r@q^#}` G~J̜:?w_':U7? [m0qh?ZG�:`2n<m° 7>dƘ+wU5ekʐ뭶KYD|j&nXZcw)|U%]Z͇H̴h]d'%5&iX]q^rn_N?Qo""ruW^V1s##P/c&H <#uA~&tk |b?φ!"b!6.b!ڟF|½o_cnطvK`~8}v-KfZ= O/ۭ}t8�C ,dGx^ĩ]j~ t?o_Fo>`oƖUsѭkڶiӇ2 ..k-ƥt%RRB+5lM&@6? UENx�nfs_w.�fW|nsAbC⍤`z9 n#1p; B? :}5 g6~,/+am8k Do?;A|CN6>eWͷŻoF>`Vx7[ouFM'W'ٹ AH"w؋v.}YVVn gA$2mlٚ2z+ HWz㱯;ƒ}`}N, ~s@)^+ 8zh?؇C[n4`N=[6ahCz5^eVkZ+Yo>:|>>l۞hqG|̎W{^7v3%sǣg㧟㣏:o:#Ɏ?W_|ESڵA6we=Ň #= 9NMDth0 +_dkt%W%YO[Z֔!כ ]AHW>fy.?䡽<nAiiqpز[6ĜӰ~ ,Y:?vƸFaŘ5s2-'74VF 3kͷ-}vmH6mЉYG%m0z_~%ƍ'2~uZo>o~}+ V7qŝ"/ '݁_?xVK4k:|BM2#R5ٚ2z+ HW:[CjJ7SЯs||]|X53f ~ûᗞп7FAC#?�my [wZ1k7Vx筷&#fom?ݾB;` "6 F[akL dվÿ orj6W5qw?x^[kQb%(+՝LNxdxC1 6lMtֆt˟܀\98;Bg]w|=FFoW_A/}7am =#|ܱ->~>i?iNtGᅨ m}}my5#h;h>Gcpbb817VtDo?F>{5&#{o˜NpxFx^is+GFcbof%x4e7.Rqgpu~d YZ UG9x`u۷oF{wzOq@A(^yyZ|ofV[o[mֻh׶~!Z3K?g3SNpAX߾H ~ ǸB/5#pB7{|Vowgx@pqwǰ}pdn 4o: .66~"s4 -..FNNNӺ:5G&02Ҫ[Er hyLhu5ZP~ԕtKrGkL2_?׫_0(_a<}C|70p�&N9sbĨQ٫z/C~3'cذl6Z]pn0^F{xx-a(ȈAQf#GwǮuS1Ѿ][fkt >}?w]#ct ׬Eġ`|70q~n{aa(eJ!] -BBuXfaq4z= 'peiCe ]AV0|p|t#| _ D᷺Y 6Wfa矺]ѿ@L2k׬07{ksx:ÝV榰4avGsc=</?2׎DNX!1 RcQDf"3^&{G`ճ'#OѦ͇ܚ0v`WlY<f0 1u4ؽM?7cs2p;t):u #9%pҕG%G-0fndy^%<(V.SߊݜǞPu_VJW nPWoaLv! K:Rez+ @>+[@8 F`h{ <\:"ǃG `V7}hx 0ۄyn,욊 +Fc!X;aV͘�H&Y?+NGI~*J R@{?�3qh  Cw_2>n~v޹ql#q?`irիطc;Κmk7msc7̟6.u;7/+)~!0OycԖ j#2\|L ڿnŠ%%!2rKG[W8sefnQuڟo ^!G;;; h?aq6iz㮎ぎ8z(|}}k_O "3Y5ǵ0snNrE/BUꏄ`O< Cmepћqu0xm#ɎƢmZ\eVc¼<*De(/-EYi!U2Q,�WܺzGmÂ31yL7}'mc|I#5#&U p@5\AF|4"`qmڀ⡥{ןЃ;o߸KuݧXn 6 NN6* Qsbux=eS$<Ô`niYuLfi U|H+C7*bժUr h~ #}AWW.\d1gX1ct 6"7_;716AvwA;"Ę&"axnAg(Y4 Ʋ#u87]5B|ψ/35E9(/Ei# gGI#|>߹;Vª1g0_u~%:_}Ŗ9qND#.#')I^p{p7ûp6ANߣO?7[7%ׅ*,] �x)ܶl5G}[plڲ!]u׫CYuL+ciU3W㼦CG%'Qx VСCq j+ *a Ř}hh(_=ޖZMOE|tRU$% 1aCعp$F"-!)DDՖ>myccXbۃF> GLxYYi)̺EEEt(Ȉq@>]a{ma[ 5:})Fu{gĘ_cpbr}Q'ȉqFb<Lࠏ^}=6*[uln*9w+~⢡w `lE:|?6!+Ϻ}r3o䥶ld]l@R919Sյ.;pttaÆ*4h8\ot/39+ﭬt/舱cݻMe%(D^v'L>ƐZ')qs~a98{RNoJ\29q&0kyVz2 rPZRč2 سfe&!*1ܝ`iz /_Eݓ8uo ^=Fo>z}3g/+3DҒ@磘 ~Px8=Dc$3bڼA.+7\N@k vnFZz*ϞӃ}~D<6]aqGmT7 wh+"':1Y(}t5Ɔ/F쨪G[jt:0>ֶtNf,כ ]AκViOXx1׽i*K81栤d(7ia̬X}=]8ZeAj8ZUgʷbd?IBlX�]%ϟ<][7b)'tv㝷A:`.�7.Q&#-.AlG^ԱOMt)YLУwo:t<r’e q~ l)u}'l7pS[6խt5ɦg=3cڟ2ck1`082UH2#G9үsKHz+ 2|ry1f8q5>uDr>ZQQ*2G)#bf fg0 8YqHO$\ˆuEy17헗+frRP݀>,^ڹ3'+}Ѿ=|o>-rDǏ?m!:Зɛ_W[#;9iHgDGyu/KԱKF*< z}͛F{Z'0;fse 좶l<HȦ.`}|8h_Q<8}[j˕_8pH%_y"r h[?ԩ"Kz`ԨQؽ{7_Ƴ>>R;FeU$ȗ\dr+PZ Ou&E<V^^"f椇#1 ~𳿂Gatz=lÇNMx6x7moW^iʀ-lwf&%"6б㧘;u*:].PMh_=f<֭4Z?.CtLbb1q-<Q[&M2+j+2ЃJ ן霔^xBceUU6 J\=..q~N7A͗p6ےn9r$vVQi*a+RKع:F2+( HBj |l `kN,-1H|}Ĭܷ}ІBB~uȽ G)N:8d&2nINFx/\0s4L`/1_vqI:n @Lm!#G矫·ET\ďr}w5Gu $aUeHe``g8&HW@y[o".`X~=ݻ ?,dnl4[^bffF!> &p7[c;b̯xW|>hÈ#tڼ.vuCJx <q!;#"0� E'bټyүW.uqS@a=.gqH8/<KG_e L>dki Fz+ @3UFz7y?1he%]J3Re@<~ Kíؼa N_۶k>~@x7yF$FD 9& 7\sz8s ~AHLBZlPer"Ι4Hj3ss̞7y ^pU9T:ҭl-B&r$߿?x"A4'C.]5ukPY)xQ1v孫8{ٍ+a6d>৮7ߢ]ONJ}'o ]uƓVf6srQ@k<r%]ޓybZ秺Iek.Pt)5(ha sիWc#~a|$áTkX?^OєBrl4"OG'ؘ݆n<zރ[aۦMXl9Ms:gPRTҒb�_TW. 'ѬF%]r_J+ՐeV"Yl&Ze&Z ];^iE366:G/^n.,-.Dan33MD"<^znBaW(|[r4.Ҭ8)h>uލiah|MAB@@�nݺ%K߾}W^OH 4o%,YeH||췢 e̺1xt5)ƀcYr6% dR4*ٳ@De |xyH~Fw/S m"8Z,1@$CndkLP2ڵkUzSEO!!5AtR-?MڒMxoEZV"K1@knn^c"US)C7e(W@ lܹ/=H:p333Np} ⰰ+-[S2IwFJ UrhgHexvҁz#ݘ'.$MY'% , !LndZMA UFo-mmnGU|@mVg;*ZʈWcSʕIJAZXbfיt uX5k%h,\E+EpE HCFpҖQU$_U&],mí]e@B5OBxKݐ?"-7! &H' CrMÓ.AqM=9F^-z |t TU* |+ r*#z']bx9Fߘ. p=9e*d}@l%]E+WgYQN ۫<EX>!ήFYn+ʭ\ڧfx@@@@@@QA+) -B<r}[wo!(8xZӄ¢B#mj2kHWby{/ PETZKZ8@yլJtL ks%%% V.x3Ҡtnq [Qq/\ՍN999 7XIvk6zx9L5O^3]ϳQMtPTWS]u*2 4_h3Cgϖx{UE&?fo͚t7sκ~6gm#؆6cD̨Q1bEAhkw+bpgy:ũt:[ߪztuC>=u&쑤7߸E۷n;Rpczh}C\K3B>"$9%ŭz::t)uC>gI@6C_[DVm_>rn*wF}{m>dg9sCԶsW>{[^^}p/"nRinKӈ}Zl9mI[%W)ѭ+׮#Wt(&VW/YZNi(3?xHthʼ{϶ӧtJaGM#w}zT3N9!A}<t?syFw 6Ӑskt.Xԙȶlа/A-[L Y^ί~ԑ7ٗrrsE! )xZ#}/(i,c#ڻ8uZ'/?. ݗeѽ6=oڬٔGUUUq3ζ>,|#M:M$d?SOjJ2%Dx=t={}xh "I8Wo~͜ 7V9 ۾K3׫<4˲^Kӈ>;~N͏azl[w+׌޲,2FId*σ$Hީ<�/{m>#)ۧwLX!lp,G"cCCRSS{Wf]GU =nrɓ'v듒gdjߵ-'m^年ί sC!~uXFi1cI^t]=6ҭTk5Ξ;/K){md{ a<_YYeE+{3t1#1y,"III]>l&bʹpM˂[UWW_vfˠz1R5KR"w;g>K23#ݒygΊ޾,-GtŒ1mg拉Y}FBwc^ C%ﲶ>@ 7Ѵ,]z'D#SjLۙ^GW.Խ'ݾsGs=6s;?miDOnAs[pXgFԫO޾,-Glcdք)~#d)lAZ+Cn$񲳻DGӲ`p m$ھsg^+m޶uyM=GvhtFi'=}2]Po{0M=3ҭÇ,ՠa R#=Fai).^B%=ԣp`S2YZsܺuKea}bajJ(b51>-3R(ea}bajlYlDHD>w t=PAa. hGnII[͛egw_/  TcKĖԭwrF@Z>7vg.ޡrܸqC]o:Dt ⅷ01fbA1<t XXXXXX\H#H7//ɥUnNN KITx\1a,,,,,,M-Z <u7EA{Sz׌0 AFs+`0y: =ɤˤ`0 #En8..`x2"?+@222 n2..`0222 .ns#]e+gHW?JZC5Bzu0\i ߸ɾx+>;">_W}G3a"]vctvF@lݺSn=(b6;LNMIS ާ/-^-%1OҕeS4ZMy 0eLڰ)K}GtJR^ёcgRdr3\:n5;~=`SvB߼$jZ002"]kjӡ .*o@0e2ƈ^gwڳ =Ġ͛7=+Ȑ+aDAVO;uȌa Ӂm!w(&VH}ͧe^ <oГ^R{+*hn +.y3J<tA203q[xtty/_BxfГOLJwmp z '""`L M6]_Ңe~c9Ou.5m ~3fڭz mBk6У vٛ?⼳\.ĩX [o>Ƕ(-#SS{nEp& kMt9OtitҴpf"M2II\N" \_AԶ-z?'O;אaTV^aG=+aDؿ6c)[V6v*۟wN #:x"HWCl'GCIkz41k"]e}ax[ZVKн6i,sB5HDEtt =]ʪ*K׮S;LcM D|>. #RVWÈtp4Wz s@ _?xV!ՆM}-zyb B2᫏oVMتsngM̤Rvn汘ttBnÔILJy 5 6uTMؼ˰ZVys\r> K=3F C$0"Z&]r$3QNԣO?=.1`e{}.U#?*#pA`I^$H'#/7X_\RB-d^͐?CNo�aYv^+Cˈ&Cشe*VEbrS"l4KUEڍ"bRUU-:LН&C7zc *;L-tw*ܾ# bQØVy/\,< xŌ&2 ߋ\rc (xҶ+Cֈ Ψ=aN_+C|\#䄨H!<gDRjdO:v! Uҽ"tz#s16O|xOwt"Bgma.<ŀh,02*o^`ū%a7`0LLL�r~x啫C^1 ...`0222 III`0ttt III`0LLL ˤˤ`0 &]&]&]`˗b<.`0t@ ܨ=;T^Q.> 228>"Hٳgf]0gіm/*47ҽx2+*¥AT^^aJ i=HU@v"֨5O-PUwo% 5">_k׹pbN>95Ud>}iyjzt^7|EwRRo]]iҝ0ŏ.\DՏ,_ASϰD#Lm+wK4yLI6Eگ `3afc2J5fI~ Q z;J֬5tU7q4T/)%5)2 -ި҅L8 5Q׮I+ ᶚ2qPlC}[ԹuԻݵg/-j\% +ωԽ8-]*BQZܳߋz_9hW|uTOSy/ +$4L^wtFmd^ᄌzY#`b:v8+^S2:o$&RԾ?23 Gۜ^c љ3"_})5`jjVMڼuD'lZjDg؉,.z?g6v -r'NAO>2o*m߹8ca"wGɺʎ(C-#liw15y{ IeCFLzH7 [O+C:L޻϶m;=ZֆmGׁ~*/;vvxFmd44w@ׯ30{^#岐u}ia,qyeDO7nc9 6/HsH??mJLQB&]<¢<;)*ΧGeTYYA7n^[$=#Jqs ݴt#{mtYsD[4uz {=,-ͣs㠓"t褫^Cޣ $( [&#O y^d|UUբm/\p?ٷ?]^yl7/ 3*);VK[D=pD !VYO aUrr(yTQY&5`9/{Mٯ?޶4zYViiŨ1jCLi0 :RF!RUl_s*®8kһx,&ٖ!Ġ'ey 5d8~ǥ<k-h}q'{CyV jæy#0uh器y" Z=e_>gfNyvnZ5閖{ivr/+]zr$ɥsl}'g}4˯ ){Bd[Σ{CuÆt@O`_g_>7A Z=]Lk{md @K=?tIyi)1s4ԣO?=W&݂<ɳKBJ5KzNlO Tiw(f{z@nHGլ~='qL,@h9r3gY&#Ow/iݸ)ka 9`xniAvbͦ-[ESyO9]Lfh}cwFSXT,6EdJ;JF<xCG+A0{-qU[5"|+߽M{L<mڼ6Z=1BԐ # G cZgʉ0zdnl\!6xH1AyΕ!kDHFwgm{פk| [)c9 ׇ\n`7O@#y2굡Fm#M�FݑDЩ׌A0OC޼n06\rU z3Gh&]d?Wl|$Hո(*.xd佹6 FC&ݣ)|SdˤxB<+!a75ٵ@G*BL I׀tcڻw=o/{.C8ؕCD>) VWX Iœ.ޱr!`0r=]&]`eee0 ...`0222 II`0LLL ˤˤ`0 &]&]&]`eeҵ`026kEQuZ]QigŢ>Yŧ0/[.J*$JrXjOZ!]& #}rԮK7}GW]<3 2-$Vй} Wd Խ'uٛvͤIgd:}6UVRUu_:niҝ2}&m!ꔢj¸0|3a6{(Ŗ%, K@g @۶ez"J}%Uk֊2V5zԙL-tՂ:ktQQG0m5k1,QjמgCrѹvFCO`Dnc8ߡXQ<6ږax<o$&RԾk e޽gۿB:x ||]KQ^C=~(hzs׶yM2qzdlH|#9=Lt?~L[wDJIwQ#lIfГOLJwr+jGtG-#ؒxOKT-t=/@xe!B=q0k懏mi;Q,ۭ]AgdV = {efD8e~|щcm+{+dJv۟wN ރDXz?%V39]gHk0*+vx ρ>9C(#35K[DG=#3f-En[Q"hz6BLB5HD=d`¢B|ڎIxUUUY w0϶ 145 ,\pO *eW65][}|h: j<2eFH̤Rvnrt@ v'RLteEW9 g<]3@ʂ 弛;0,}5rѱuH7<tL9ad?ƯQF39݋/S>(/?fmpeI7mQXX([b$Fƒ~F^NFt> .r\u!<ܬvݔ},@ _-HW#B*,*Oactng.k7n3^1AGI#adOwvv}Xxe2"ue1�O`m ۶y43VQQatŻ_ ˜< 'c`<zp apxȫۭc@zrl\z)60<F辚!$S@^3<3L놫{+9Exx`q.&懊Ghbd,G"?yxy_-02`0<LL `eee0 &]&]&]`0222 ...`0222 III`0ttt ˤˤ`0LLL ˤˤ`0 &]&ݖI|^P4?`0tt=BP dt\9fIJl.eE)<TAš[I.@AaMOtW]͝GSVWdqVQ9 #n$P&FHq-tˊp?PlæQgQ[d<,tQ gDiItr3\:nYǎ/F5!>~nK']Ԉٯ?ݗnbCnyEک{OCQr~G㏋Z<P5rexȺP?;xHWaC7b6 Իky fp1twK}z #h*zPLHQS2/Dڷ_,g޽gy0l0<|SG%]D\RRl8I. ص[L7122ݻw+ZV0?-rwz| S7UWEc[y;wqaZUV6XKBp0&&O.(haw\a]]8uZt1>3N:gzΒH#(H@LZF'Inrj+tՀ!;o߾6:yNKKm 9[8nkQϾ}piP= Rv12+r55t˗Hz9i+σg9^niY){}v1eL-tGl EPISPlh?2ՔzXƤ|s6'U ő #Fk`l0Ϝ3~55O<Yt[!:]EVH^晄sp ~0>Խ~-¶2| {XW߼ A!By+{YR_s<t[{ b` ލEXZ>+9Z3EN|ٲ=>+y[wD2jF 9b2"�6m*JlHOFaQ#\{;-nGW\RB-i0ҵ<0z6;c'L2e/�t Ø0ǣt-QSa{@dX`C8pdeLxLĤdn. XBr20 7#]R#;'Gt5cP Bi>܃7t<L tw.]*AsK=[NCt[g  ˤ`0 &]&]&]`eee0 ...`0222 ...`0ttt III`0LLL ˤˤ`0LLL `eee0 &]&]#]t3BCWR|ƻtLx9-^\CeTJ=*(,EwuL\1uy@;Zem늧ې7s]|IcaS{򎨭 t<,!/=ղ$??Veu{t#632Z' Q SzwixlLF A)7|(0m5w1պ&Yݵg/-j\Eo޼a&ka(p1>|bbW^Om˰3HQ  e޽gypU-t{*n ']6:a{>stQ9-#޽{G^5aiEp2SE" {eas[N6<}*dTھs5hiө^Ңe~c[7׆mG ҳ#=gw�)+ ::q0@c|z>qIOtL#qæF+N:{Z`m!+SR=U!k< C/ e}Vt HaIx zXZjsk2+l7x:ٷ?ڝ. GtV'mEHّl>c55t˗(z9igh|PhFC^喖1ҕw2B&M&BuBV^޺Q.GNi|1ezLJuˢ +ImNs<}Ƽڰ9j< =Ȑ><WOJIsˤBI2ƒ<pNNr[9/E]x&V<]G5dah>Խ~-¶zȥFlF捞& 0>1DLt;€EtS[ek7nJUU0|m}C) E@… "4\e{}NW<ԽG>XZ%%46n 9b2hiVf DiivgWIy`m\Dt֡# h' ͤBH> N Fno'OX"]GJo%ög0KC:(!r$v%CG/cZnvtMJp!G7xH~3,E[`ANə-dNf jA:-=}vt&KWAqD/БW=N¤BE*<022 III`0ttt ˤˤ`0LLL ˤˤ`0 &]&]&]`eee0 ...`0222 ...`0ttte .GnzF&M2UT_Y>|4>/[.J*$JjTR3ˤY0'gWAaMOtwK\ΝCeTߌbU>3&Vй} t[ >Φ}xxH2N4g~iҝ2}&m!ꔢV(j¸ybcּ`OϒcgZd%=g0z(ue',YI))J֬5ͮgm ݻe0!R~6emk^Q߷cr9ѹxDQik$vuSw zCOE2 `b:9S,> Fb"E/9=;cXo78cN_qg3ҫ,@"$c3_2P*+M. 0<qtg  *<m:UUW䢠e~cӤ0?F4rwLy-znIfk Ĥ۰pFХgoqO`sBօR]]8uZ5amضE!LzzJl"8)=d4`'E`t,_AL'#z&BҖ-XHB.^b>+?wN 3LFnאaTV^aw%] e}ty-z$]Wm^L gqyfuΑbً/mQ<rҚDCFBʠLg~a!$άgm!۶sW*-+̓xуsf2_?KV(,ΒnP-,r&]>9*esT}-zyb B2᫏oUV%2Bzf&0ssZϤۂHwԸ h. =u! א ]tj}V\jta{ksftKot&?Ưzh:LD˗(|30As,`t1#La`Ȧ-[E^Φ'rSȗ͚`h`!i3YEKtlWtgbc0'x +W<0z9)a$ fιJhuM)&h*R;`u+t[ B0 m)`"KŻ_ ˜` Kxȑxqq"φ>R 0hj Y#B0;Їm۳%j@F 75srDx^3GG:-=ôιJS7 }Źt'%[S7J}L-t3ΡX |`0 wIIU"4|Kc$+^1 ۸`022UW$`0LLL ˤˤ`0 &]&]&]`eee0 &]&]&]`0222 ...`0ttt III`0ttt= xˤq ۛ%]~zP¯ݤ;!BаwQPo%ܖE4}(BWc&L+׮s'a>:TQ :׽O_Z^x{<&V^dȺPK+CB-t$eG 8lPS&QgQ[dJ[<,>r,^AFFC [xf]}NJIPw՚f3̤BIcD:gH5Kepnn4)?\EowQQ/P (:jRwK}z(:FQNZ:}1jStj=ĊT?X=gktQ-Q+Ft :Fw#QWyA}_x7N@{Hw/TGϑ3,OO%1ׯ#n+'ݳӂ%K-tz'ۖmIfГOL*@+OՏ #;n3Jcnq(|~(|2|{EAhz}cEg�A]?Vw"f rքShmzTY`Q.={ ҃hWt<q0k懏m;d(JȤwѫWv+C4IW`xB̊~^HL۾tL#qȤJH^nt-+g̙KUU}R<z?y<(צC'KFSCey.EȀWGO<1<ץ+WDHҕv׋ZFs&]G=]¥A#I[RvfuD뾾xS#'H Yt xeeI7z QGܼ|ѹBn&V@.]",^62) Lo2s(k{ g ._Q?�sV os[<]+:bàb@ B2᫏o`4=Μ3陙{@Q/+t[CII Nf<]c3+.{1C Ë�71)Y紼>mW/eX9[;903rѱuHG<tL9 #|_-e|`=ԣO?7)+Kam{53Ωt9]uGi/EQyc3EN)}X`UqI _Ķ>pAX-]e ?=gkh<F�y^4¢b1z9)9BvZ%qtѩv#VUU�ntgI!l<ܲrAI6A0P"y25cBin; :)vȳ >R hqe L 0 #GkG9[O XBnzmisrD^3 daZG\%[)~ض08n:J0G"x!pRI3 `ee0 ...`0222 III`0ttt III`0LLL ˤˤ`0 &]&]&]`eee0 &]&]&]`02265 IIє3}nB0e Ue Dvu]vݭD.rԫx+>b8}ԮEeƏx9-^\CTB{zܭ[Ik=@HE*<y}h,Q&L(^UV .56<9O_>{&[eIJ??E.Xy B|Qq1[3 SϤ "D[lDD+1t:P^QA em(;`T#I%n6_UU%JPNBԽ(.1#N\XfTսIe�jڳ 5zV7(@.TW\r_#G+~(&z@U5x5Z~nsG˰3HQ =aμ{֗^+=~(thz`+1g<=xI9gQ{OwMb(;z [O+C4^Ǻ-r'NAO>2o*m߹˴'kEӦzIy];vׅE.vQ2dwM׆mP3et,Cg N\>SAgdf<�:հC%WPm+C4贡&Bk.{...i2 ?i+~zރaim~ޟ78z Fey:uhנ.vAR<<5=iF mv۟wN #:0[F=/_zSe}VDM:d_Ix X /I.< i9],stsii"T'8(UoDy|xbZMV A0pVYuۜOWy,{螨EoypFOV%r5""z`m!F" wtI8'zȗWO={|#OHނrGQG˼ 5 Gy_.rEޑ kջ_F0[F =L>|*#" AMO"P&V@< (.\qS٪S<"<oe{}NW遘8Y俐CGb�7E>"΃$U\Rb7I x r_ ΉQbrRr6D3ˈ`Ѧ-[EE~2箒<׃-UW^.0Z{$y[q &FA^@&ON9HѨ[){m{=` ';bZz]l˘Vub'<^Ή2ij y>Io&j^7 )¸G/ m_>Gws X^л_fHk<06`&[<x\o }TJ=bD'N:N{tI&]"`0HNA99TVDr`~)c$=SLL 0 ݬ,JMv;Q_ӃS#|صD 8LL 0 L]ZWth:y$ ~jaee0 馧S}Q5+օzDҁ ^K5ѹsI322  Ƞ'NR ` 0Z`ൌaÆQtt i&]&]`8Aݣ$:{,>}.^HW/%)q$eoiРAtJKKcee0 3+/<Xu>7m1 ՃfϞ-tt $NMGGwEaEi]<zI`0IW~Oz;-[F#;ŕDOC0�ˤ`0 + ȑ#%lakRAAXE*&]`$]^ gq%*l~eiĉlWo/32 $"G0އJRc>= }*ܨ?3f %&&#] Pm mob0Cb~*34_; _RamA9 Sn=S4>ssm2[*2'Oޠ%fJ8^>".rR܂RxC(@E%-TB+׮q@V={nRjo)'WtӵYҤIرcc>Ǥ۔zEvys)ҍڷ_ד ;G( ʨX8(Wv m(;͒B,3iæQ%Q[d(yX*J.9O_>{&zh+ plkVn +}$=zd*飏?]: Μ9Ceeet9ڻ?~ǤTұ{*V7VK&ԵE(@t }$y'y `9PpG㏋Z6P5peWTۃQD!sG=B-p};b:%Dxn|Β~zQ]7yԳoQl] +CОDgh՚k}CBF1Qcn_yc*`  ^صg/-5(LFq8ߡXo�S2UAۣ}{HwmzhZ5+L顕$<x  /nݺE7$ qJN6t5]v^F!|fTQ t!|_-~1ֺUngT7t7,_QH]Lt0jR:|<ULOF ~׋3ymOt3>xFkACFR 2Ңiv4w#b~uX nݩ2n Z>FfΥTcvcc>y-Y_Si,S m$<!bmڨl(K, ۥgoA:HCTUW #(haw^t)+ ::q0 #cvȈQ)ލRl"8Dt}5ØF"<?PT:{Z"]&:prődCVP¹3]B\tXޭ;wxmˣEkТٴpE;Ls_λNUKnj=$0Lp[Go-={Jm-b~4UZ/owDhoy~ihuX}撷Qʹhczиx9~zQmov2SZf.IS1ec鵁Q5=|f]P׾zDgn#o!yx"ܲddi*y\SSx)P#'3f-En[h<�Ha!L,`ˆtW{eeN#"^,ẝtGh@C|YXX<Pdp||U rVm r>7/_ CZ&|k�y`�^Yybv9g!] v2&nV{n힮Z|no׬ w s WHSOV<M_LP| Ͷqb\tzDp7uCD'RL Q>vt89*Xrs eۦt9!c;ڦgU75Vk|A|=^=C{@*kM-ci|}p$nzX*9{iM枦i"dp# *wg9{tEhY:;mp5'=Q3it|.$3<r.rsTT5ɥҵ[&fVߪh|J GTUoҔ١.tiMON$s(4v.Ro%hN>i.9[6R_Ѽ2zQ<ᾇV,>WK^Υ{ЗS@z,eߓ0 zS6~xا$emsg]H_O~W@%#kM-ciz13cߛ(WW%̦&,v &S]7eћ⹂_|<\p1*~u}0uMGi?Ѧv:/h4bf[)5d(}ضg]0Rbj<2Fb(F"eeVˆi~A;%gf[m]o2굡vJ(=.? CBΝBx{Aޕ rWVKRa3?,zh 5W&]ɖ=.V Z)TpZ?&8U>_8<^I^.ˤLd.r)ۑ-qVN7Qum&7DH޽̔9'ͻwԖ}Mʤ o4&]&]F"]i,3-EP-#EY@,b_v}1J&]xIr #V322<te <H:N9G&^**RlN2۵\/( K k{x^yאׂ/湭XZtAwte|}[UxJoWxA,,,+xmˋ/a~1mܧ>/<>u*ɗqC5x^y0F�baq]Լ>`-U_ K >T/ ҕ~1/ȯ3V,, #/+faaaONt9] 2ҨҴ:( %`ۊ=¤¤ˤ¤YRZZJt7ɓ'P&]&HD}1,n7oPRR]xQ;?L,,Lt=J=} LL,,Lt={&ž}~͂vF{!eeaamŤ[WWfi(ҭy+m<ceeaa5'n?HoZxY3Y=ɿO{c-%1iO6JwlK1&m:ϤI7<b3MƟ3mlڸyn5d(}ض=wǓw˗vS/"G_7..Ωz$hgWH7^AՏt%1#:/=OQWkCu^rYhcYzAapM EO*QEԡ[Խ `,ʩcTTTlg?Ԣܧ#ECڮư鵛DBߠCMNiԩG/:{<UVV |d=Qٞ>}j#] Q zY(ݿۿÇv�c>99\OtܯGwRǺYXN}$˹_D#ܥAL[qq1͝;>G[?`><|(d�9|˝hQ2K#pfMAx] $ڷIwe{}{m>_U٥goھs]`k֭Ի@еպǴBY.@c^~=?3ٟ}@8BCC햭[LH =yƏO?hvׁvXp!˿ _1tВpvkG;BO_=R)V!{5&GޡЯ&GSʃRKVQQAn+|#7((Htpp"ퟖF_G؊yFktgLE Qkk4xH}Go�\"WLL;xHL(_|i[-&҅K,Px*Vǃ jߥuM8G[ߣo?~s딗iyFJ۹tooD=C- FcԆN+((wť5ԙBAB3q]DJ+77%8oB ^Vf7 $wH 1?3w0k_{SmY@@�uؑrrr(;;ڵkgw+W:P2C !???c#w6d(ZC;O/Ͽ+R̸LeStz)M?T@6^_NCY%ɒ3g{\gLϟ?=կ~ENƦ&L@Fr `}@:0fZڻ<}ZܯZ4ȶ,Wݰ)C+7/O7FDjaN,L[-) T>?m:t"!h޽v@Vǃ(&>ؙ 1JtAtC+mzftDlFc'NlU!kL8Ǩ I,uG:3GoAy[ (`)?އ1.z]JSNI7OǃOH,e<&H\Ϳۿ Zuu;ݾ}6/gxztl$z𫵟{1{.gUϧ 4mW*M%k%4`Eݥ;f~h:uh;w(:͕4@ ?mhH;Hw{,@ d4 .jzig=x_qOYYm8;Z>RO\XR[pocaHS!]#{hlvJzb?zyy Zö]%eێHd {eJqKU aZySXVX #;:WOj u79[& *r+ǍSnR 1<菄X_cKЫ*A;kݷfv5ˤm>_D!qw/;7S'M$t(33ڴi#˴\/HÍ(Uj߾=ˤmA5W mET똷 o^a_At%gc dm/3wnG. ^[Qz L+mh@tTC+mg$vJzb?:fVOo?j#Ge!sxsEW1:{ aN@¸zJ�9[& rtk֬[Bnbbm͛vjΫwMxdŴhg[@.8IwhR&lML=@eO),,ߧ]=n:WbZmm&x0 BeU7g^³ 16䰔d{N<]s;鞻ppi"]�L#{ȟunVmk1 iW<]kv9cM/_nWMNZ | G?:vvee O.CFԃQ 0�!Ec*E`zd|28v<?{lMRnb d B4`�S. (̶hgrI}d{GĒT(y6ܤos+ AիW{*! S۹sg[Nͳ7~A^6:l�-[(CȵkzfIwۦˆUcOП2a3gg}~J\S7Wi>.7n޹^^dik!mZ"]oo3ԙ~C3Fft nNnns~G6~ߊ۷@IGQ}.~n5m$cew4z9�N~Ag\&] |7>Gz˔g?cw^1h/REm{B??)**55hwgHv-Rf!_CS8F"biwt;FG!_Er8z!q?^+?'z0Ch6@/tҽ!L;ii27o #9JFG1GbZIlxr3iV޹,ohа/W#Ö] Zy "Ex׊=k;#hnFZ!<}pV ?G~"_/]Ne6V8z}CG?iQ@ BcqWfȃܻ;|VKRomj_Cfs(*UhS6HxKs"WpTJچtKw%(zeddN4#HdG#ۀ^A;b:_SME9 ﮮeml ]ܶϧM4s,v]TkRv^#"\&<@^vu$]|WMq։w˞ AE�?B,D*,Ӝ]pϧe+WdիW ]:Dx_rv KC"GUYs)`Hѽ#I=Mw@A&]\-`Y+Y2\r7erK ]OyN]IWЬY%Z11Pzh{Ejf~7GΣkŋtYX(.! cHY/^4tP:{L&=ݓ'O#Žodb+. #1gˤ۳gO1I&]ן=txʿg<k'4߾`5Ɗ ,Y' ;=x+6VOЖr؞I5}]JrNRNv&dSU z[2Z<? >Ju5q2@C|dqp/\ B6f… +ϤZgWkT_"EA|[s. <^|;OyC-vZ"Bɨ_lQm۶L,, e>H9GSm9'dTo߉Ǝ+R:  :>L~!-],, N<ʯˁ_|!>׊(#tYXZ &X&]|Hp!t#mQd{9RFVptYXZ` /Jg̤¢O8P$ b̌Cip]-Vaai"mp!rX2WS|C}W^| Wx<.pnd ;CrHW24,:z֜&ᾧm A4 KӋ*\,;}/ "?c5ieaaQ? z> {,,, 'Kr"ݑENWpx,xVqhXXXNg ϛ:E}Pna-- ˠYXX<P|<I 2Cg p)faaqsM Z"]l N]⁂S~Vd ax7/c0 `0 `0 `0 `0 `0&NZ-h ����IENDB`����������quodlibet-3.9.1/docs/guide/images/queue.png���������������������������������������������������������0000644�0001750�0001750�00000027425�13112005742�021073� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����������� pHYs�� �� ����bKGD�����.IDATxyTW'$Ϝdf~3g33s&D,F QAw]K4qCAeѠ ddi}7TĨjM]U]m|=}nݺu]~~0mڴ'Ot<:Aa8-,,@MvgK(P@*%)etPG8 (P0<@Q9]h\_C  L|[t%lxZV (Pw+*4%m*j~j>]aL  lUh, e6_& {=ټXٹAFQ^"gj,S~$z񿷏 5 ^^%?qgm SjKE0Pfݚ0qԎ*+n0߷,vFC~m<+`~wyA!:RVQ~0$B3G*-b6OIHvCsӧOkmZ/yϘ9zLb+/<mɳqoi;ge:{'gN6k GD)(= @.Rĩ6xTQP(:p4B>r5d0FGG? yԎ~'"/pmll"j5wMᰦ=<45ilcOm3sOxUI7o D"|e+6S6|m.|Eľk}dOk{D9!_%l .x!$$znXXm QUUUG54jc/hnEQ޿#mvvvعels^*OKffxu݆])./\5nB?[!ãcbubà. /�r" YkWv.x'Vo7ΊMgg*LLJ:m<5pttǵ+ok|X1>k^Zooo_v{opųÐgCBwXg7TR.* *̀tU jXYd Ѱy´p/Qh(Qft(cW (z%\g*9\rC&Oۺ}ks)q åo7cJU�!c,Kjjj9 Ϭ] 949koZ/_z8E~cKuD8|XBp6G~:BJJKk+1p+WK7 BbJtdw1)^t$Oe^R.&C)2:QA_~ ݖ w ^Ve)Z';UQ3&L)-!0y"oZ`p¢". ck<---XC+W8d,{ٴwh] [E]yZa[t奯`3<}{w$Bkdܓy ή wksÏiBX XdWTBXn*hc/ȱv0%-cwD|WWo*7vܪ ̬+n`'Mfj(&9y읜<G&}GV.H]q fVk|GYUXp_mv)}0@O٧Ϟ]nS=z$¹M+[p#,-+9y [fZAb''[YY a~f@:" @|a#G ̽V_A[IńiOe:j ?ڗs BUF Y&&վkkumTzYOqJKOW˦GIKYȑ]vo@pׅ>tPOM_vX$$²[QQamkoͻȣy|M IOd\B<+;ۅ͠f|Ɯl퍌фN<i^.(p~^[)Т4UgN''Ev#`bLT\qmAlV*߯N '<b銕ZM휵i6ωsAhp.* &yk' r.H̼K:9>t|SgPPb*[ㆡTpq$$/Q^^amhI HrLBǨ1x:HBc*82}702cƞNH/~\-tm,�[G7"\eb/'`zGp!%=B/aϭb* 32ٷd eg.KJK}ϴ�}f}ǟXL<g-kNSoÜt!W٩=w~ Oh(`afZe#&#ٵZٍ]NvkbABvUfSϮQ;ܮ^aJl{EMJm^@'Wj%]7EŊlY[[+!G$5hf_aVU(8 |rhk<[?ʬm~U柚[B|`+7\mXU]]^QΨoY-BP*El[SSsqe Ohe };J*rQ[U_ VܾQQήx]j5N ޓ]B>-9ue+2~ Ehk:OB$$A$A$A.A.AAKAKAKKa!I7`WRRRlnAcY{ є]|fdǟ;w! 'Nbzm#v4e 1-(}w~wEeƑݻA֎΅BU�ِ9Lqd`._.b u ,Mٍ;;l!Ƒs߇&DCXkə{=~ 88{`ܥ AI+Xr 4n)p Q!݉Žwkm=f\a00KA~"B vZQ*IqgddBFfQuqI[[+_vUJ]F]-ZuOx?zZ钒 ?0k^w;::m6vjd: u%\5]عeW47-"w;$t5cCH_8jΥttL`&,6s_k\sˎ΃ #1s: --+9uBIi^npM/"3UTOǞxaVw5ioIii]] IL<ԙu`g׬`:ϿL,Y~㗝V{GJD)8:S8bيU }Y9s<)(8ddo.} 3SM#\AT^nܻwO:څEyNn\cD^~f!Q]\323u;feӇUXT߸v&C?7c=~Bpu"ὑr@tkBNRs=ar3Wp>ZeW(4{WͲ~ndgg߽{W:څE`IS}mG~1֮Q7mֵ욕Lǣ j=ⳍ0b};}fla.s(VČ̬sLvq&!Q03aҹb3K|&5֙+Ze75-')Jhm1;wHACE8p7}Od{afhRRZ+T:mG,rlxDfou"Gssӧ vLt.<sr\j?0"Cdddܾ}[:B-pW_<c\wyOAbEe媵yܶ}:mpkwlp쪭̜00};K) . ݭٛb8;`AVv6zDI }Yb3tWOǔG:s ,zIOOut4Zx|<4;PWAjG|i6uP;)ܱs Gͺա23`c1j̑ !w$$&S=Gٛbx &COǞILLt2/1fhuuC8|PHw&enݼy֬XB;;q)5u0qpn8`RSSoܸQcV,Y:0'73)+]8uRY)}W8W8*tRKA}G}gtC]\8 ^diiY#f+ ٌ7A֎e9)#v,Kv A˕K &O Mم<sR/5dfKKӗA}PvK >(FADߔ]'~R -),kHvVv_:Xƍ/U(~kCnMF9jdBXQ3[c'-\3}Ѳe,8Ds5A$"y+/)-C ee[6T1n1z\ݚ[ZD"vZ$L+}y_Lٶ#dRdQvNC.A[8 2̣HXLKGG!lcbG [[,Yq_ X͛siڤȑcLJgkϔ }_G ^`"ܴuB@,!LQǏh#`Zی_ #6m ⧠(vS\*#.^<DDBvŮX|0D`%*kMp䘑]].=j%<^};:Hv,w8y`rq'kizf"PU "^y zzzܹr֬ sE!3q;w͜qs=3g#Ng/<o"&_+YMWÌ_ qSͮ;C"Q@c?ϥqD]]+ڽ7} 8;ƒZ6cFmrjրy0pC]˒[osy~qG-|"ήmmm݆!xOvÂ/\pqSuu\U14p sqK#>a[Z[u5y~eW~&\ 6%w([^l9ƃC]+B'8;ƒf6c.J`]<|Sjm-ɮeɮ8DXT#9awReĉwL<1eW0)ݧXD,^9e+J;S !R=z!Q)q W2b � F6"{|{~Gm^jRKلF8e*[t9 Hj.5(d'A!Nip:!/>5UUmEUʴv5%]1jGYʬa% IɈHJ^b%ga&/[Jt0l(UUT<F"[]sU땪#a9fZՑQ.*.&}eS2)gϝv9ux)6ESS%K5G.[{DYWfܹ;̸{PǵLzRptQrָ+JIXz}䜼<H$[;D쉈z¢'QhW؞wt tZTM1bobUKGgM+V ɮqn m====ܮ,xZkÚ#;:&IM*aNݰp2=j]шFc.y\O؍7!%5dWN 56d%cZz@`SCt(l^<sod`x*7dX̦uB?MIv -s$AcXl7s %]´<7}8 ~ %] ]] ] ]] HvIv Hv HvIv Hv HvIv Hv <`d1[/nݺug׸Gf}dZg#y+ggfOgc<+׬~Kojj="$5fʺ}ƍu0Zm>.bH9w)ܽw/,<2ͥO25$4 BIk4 `p*QXk9u5#~X"RĬ}{Yvsu{iC?!Ϗ{Դf*W= k ǽf}͌}{Yvsu{m5.]ѹ|l s$l@]R%J{֚AZ]AVP63:e%V9Xl 6 +R[ZKGZHvC~ApRB19n_Z3q^Yef3s_3`+go?nf{PM]q9gW xU?ٕV>bjRlF羖 9:<:l7$Z5 11 q^CZ^eεV%9Xl@\>Y6nv'NsnHnJNkII~e/&Vǫɮu9X\]l&8ߜ0z6vCy%- oh1gn9MM$ALKDo@Iv Us0.A..A$$A$A$$A$A$$A$A$A$$y&Hv{1 _`F^sp_]LsK.!7ɮ9 :X7h:{jYlmޒ3 ]wa]w*gB9GUb3ẎU.yny;wa]4T-ya^}EMЇU.yn0`8D߫k'5i%B)!j>\_^vs{.-+4tNkBԜJwlcSd_)EMkY~}jm<[S.LkrU[֑mC޻*iM%9XM$ 12'¥ˎ?1y_XxDwwwSsVI,o.yb}͏K'5>bNCeNڬܱM]3)(y1CT 웲Ksٕ.,m&K`] zLKDBIv HvIv %% % %% % %% % % %%us0Ak6$JVc _VǛZ r#3d8H;%b)v :nܱt>鋲cQ.kվ׼Ks0kO{GIeĩJoEeE(E]X\eo]lݞ9.ᦢN{I)X 2>'bEu]"|VAgS}ٛye<[`d"lܱCGId@6}Kv;[:x`rڗX.y2YYs/o[W՛>$2ʑ]XZ$f]luUT\L LH]eWViת$ 9j<'M? ]|fd_dbzM*Zdd<[`i'9XkBsO:!+5dүy]z cB.\ cB.8 d wBKa4MMK)-+ G<$AF]%W8#e<!&%0>y/%" E .S^A%%0Ap.AeW] dwIv zIv'q0AA:B:=+3W8A.Ǐy;qw?A*:9}o ]s:! MvR_' Z E"%%0Ps+ ME2yq� (P/pvsS#[R>y2 ^&(P@AWThlGGK ~j𾜕 (4V]vTaL  ܂" 20 (P0<dbzjll [[[bx%xdxFwwwFFٳg24 d${ȑ'^p- .A욄k׮oG�6AЀ&]]nkk``ZI ╕Ј5<x~e5&{8*64`Hf ݕ]T8z{tM3mG͜;/(8h9z31)\s.yaGz^** . \qskK ~_8;;@za.q&vmmJUm&󍷯?[{e+Waoo@h}~`c+Z k!}kT*#n^C$&566BϿ\}-d[o:tWE<33S΁:7d-# imo :iƇ\,UUU ,xCvM'1z'<bls455\]lQ<3ЦƦ&؆d0]Av.XkX%0J]'֮st4%tV;w spB*߿El?7x74شiꫯ<==ׯ~ka?~@v\Ųe?Ǐojj<4k5tC:_ChlkR4qqlEڋ/VWOY%W*`}}O~nٝ5˸qpWcWZZ^1˟?O]]]U*߾Wb G�s.Ce0&+j_Dq'+pdW3ztC50d虄Đ8{JjڥUL&&{:G6 R\"'mKvٽ7\.4KNLJ:mdSYސT `u1g{ ڶ#R{bXxBQf]t_ .1:nA@dСEEEK,ׯf %%;ӟ... \h}YYYii ;ڵkj555G>}. D|eFkMظʱ[owް_˱R\)Wg WwkFŋɓ'1gjkkLeQ.OBkWTVaKĬƀh;XQ3Sr`yM7m1 Sxa+X Ҁ &n=3KSv+&(bYq: ͷa·+'Վ\eeH_a~]&ib\]S3pd;FZ^/# 8n?;ˑN,R^^1`uj믷Ma!lןg\<==w079MoS3{ѻ U3f/ٟ:!b;qWni>7MѳF澸%WYX欬,.|X~>uuuxz(مo=UU|A+Wg|#vsDh1n㘹2*X1+6Gz:Kʚ0ɛ{]/O$V+7hջ4Maɭ]c,"~nȖ�Ab޽R-"Ɂ `eXlaA3~"Z) 6䋧z6$ՆÅ+7*dh cSYXf _6Ѫ\\, lmm|MN֑d7'7֐Ȥ~T m?AԬ]o.\rfv֚ dTt,8Z-ns$'w4JN j%ڝ```yI~Ν6jMww7 6 6L0?ݴ4.,YtG!Ns˃@0iʅG|aiOvY9eW{3my)9Q\\_R23kfG]vUWWcⓝ^pILJv2T$Xkˉg_Z:85#)d>DlVK/HVD]4K6n^~> IOd@xsHRR!Oc{FFaX ͐=ŏnr;w% Q*D)͛goo_ _l5k !4>| g  h \A+i98 kkkwZ\}:܇ ۲e_|Ά-28[Ed…\X~xtt4aJ[oeXy)ca�c @n b ޾Kl~mw 3 Xb%9LWe\?PϘ3ccڲbYqsJssf+x"Z 4շLeb&Xo2X $$zz.>_N5d@U2cƞNHUv 17ol䁙dDFF;?я%g?&^-믿-""Bt6AȔt:ց:xw{ļN]dѣ׿` 1Mo8pڛ o7MB? o2&]jcd=~VQ&\HIaOG]FWrd{NE*!h655]va8^~/m9jȂ#֒Ot,}En%Z HVPM[9q3ӯ4M&5T8kv27n/@kM XZ)QɔZׁfםŊ#vYɾ_.`ߑh2k^~@WjfxZm  UYIy`P"ɮnUuuyE:}WOvaqRC{z'C+(<u%Hv@]]*T.Ak(x~[I4@ɮr0x9B.Aڍ(#^�MJJA$:IHH JrC$6oUU}A$A$$A$A$A.A.AEv AKa>-$ Ls% zݰ]α����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/images/plugins.png�������������������������������������������������������0000644�0001750�0001750�00000115306�13112005742�021424� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����P���>>��� pHYs�� �� ����tIME� )ݫ.���bKGD�����SIDATxXK'vfݙٙvv̳3wn6ksFPQ1`Ί(Y((DE1(s1[>}�<twuWUWy뭪w1:E,bX,):]J=n%jbX,ˤ`GP)jObX,iEr ,/)R \P"*bX,4+>-P?SԃK{<z>_V77_w, p83Y�55}c?p,먳n-ݕbڠ.5ϼ1k%;]xyeSS%=Kʦ% y?Y}Xhgs|UubX! M@a+ӛC K"sX,VӬ4j'Mϧӳ1i}}vW!57^m[~/^5޼GqiZdmY,˘\@H~.36+ҎUb@xezMr+, inhʛw{iɖ4hA:#~LFyᶅ&{ ¨�&*Y#Ƭ;@A2h"/䉼y%ҀۥR?m5rs)*X?',AS}\bpS`0fFDP/ q,E7gjct^+;#-'Qo3 B )6M^K'%W,cXmG#WII4ZaYwpl^0±ƶX69M7Mڲ7 /Ӑt )DANG)c7 " 4ti(sC޻NQYuz(&Eۍ5@8ZUr*euܟ>{N%Ս4;JN^)=|L<*Zx%sb!n!Kuٟ[KL X:K/2v{nݸ}_�)؎_#\uO,h21nGh˾\ �hk<0a QW&g`:p&y%ߨdxF rȄb@xcC愞 D9ä"ĝ"Ҍ?,q^ҹnO}XeJunm+Sy/.\K~.XYt`l{z0WuKh9q I`5KbڎL JN4[zI`;~ Yd`yu>M%hRTMI4fyWPsSjjoGNǰ+ב2D&VƊ� ‡kfS*gM㭗"q+whQ˶Tq]_B싗nNAt##4v3bA`)5rv*#BqxwL<8ô%X#�;t 2}K>}Y } �Ѭ*CcyԠY|=fagF1,a>ju<P[gF҈WXV^tl9U4ZJX6VY42psbٖ˙4~cIeO@{Z'%W,3j;"Z4"<A#Ќ >$x!�R*,lWo鬑O[,>B,}t hFjKe(_Qw ;h\p1@.MZX"neKs9L4;5_yW h^%X<`5K#fXmG~gh _˅~qҋ$X+tnQl|N?2Z'|u!_XK1iXq}t h dT=>C*g(z*-FsB˥Wi=QvXٌeiX;yI%>g]tb,_C\XmGaKxG,#e^^OKL XBY,V$S4vNM% Mhxa-#zc2hȒC4;u3fxh&kaLжg4d"oYEaǨ*X\n%-yq >>n3ol9hN{ei#VI�]T#z_%Ն`G,n>+$K&x\Ʊt0_l+kӤj{MkN0$: 8N#]>L_0Rr:[i AX`T}# JPoj]r[ G߂XBTNpOŏ^/,Zg Zn rosXq̝ǻvk2`b-aIdT͒g%^b,mkI_[toH4Аt2F/^ 7(X,vIg6&Q8^^?bX.ekdd7GIv?}FWo Kvi\G,قrZqaZM/*bX,Vvi7!XX,bXK&Y,bX,-S ^*tubX,KU2?^pbX,`bX,bdX,b1XX,bX ,bX,KbX,%bX,bX,bdX,b1XX,b,Y,bX ,bX7 eeeI۷ogP111T__7.bX׮]PY[[KϞ=cH<JHHu7/o~,RzkR#XFGGӧOÇ,֭[neQQ8qŲ𧦢Y/uNzаcZXZ_ii)v8bÎ]Nǘ,HY :566f[%l, uEtYweJuuuVl\G0,|JK{0&L"<9 Pi/į` [Y ր'O޽{, u,a]u[*ȰeӵWo,//L^M=F A :I ԹGO}G=a"]xh~jZoP <tX?hC=o|8}I8(ʈ~Ԯ?Ql yڳ/t*)Y|塥@cbciݾsWrpI99zF+_.cy&%Sy'5n7c_L77އҰ<]#bH|1[zl,ԩV8XʲPĢPj8c޲eӡKW?d(lt񇨪(L�´B>yy_ ` ێ<dfSYYf8g~]Zj ?x\hb= R Px#$X\2)Rkݍ4Ybp޻Ld1j)rq^m8'y?\3Iz'N?NLW+uhБEw4,=OSuX-,q waP2X]4Y2Xr4&m`cnS7_{ڗ;Աk7= |-;SII?  2ldKbL`ݱXΜ3W .NYs'g\|ɴdP;ӧ6X1-;Z )m`SRSu۪kt _ԗTG6kgf^6曖n<އҰ<M]#-חjq`#}zw.n:e*)?(gPZ87Ź)XsUX.X;g̴,m|nm(V,KJvK/~JFӶp09 AS8K0*oC\bR~[[,Lr`M՗/އҰ<Mաbă %Lwve-X*_6 lRR̠c% U圲9Xͬ\N|>\%W˶急9-Mঢ&`\pR߫,C%`iK,Kڜij?-חjq` 7nՑ#GeT&-n:e`P=nERд]#t;Ƃ-#>x|&S~&-MK�N;=w(:sD^H>5uJXZwJSc&Tm,peSqb ܇=O-b88;v,-]ThܸqzqIc˭E l2u`VŋT#*=s"=9X5Bn ŰE555&>xh3{P=;IG2t3ӄDZ)iv %$M|^zD~._z ;au2c,uh=pIMaZZRN,+Sw h8[QDZ܇=OSHeZ X Gn(я~DelƖ[<7ѐ%x<d2ƎRmZGKZղB*H9KW "AjH˼6K;hCX;p*V͈IbXL}|=&a�7-2bn1l9M wt�DϥKpCyB-ѹpdp2v_K_'X*B]pS|PΞ&!QvzLJ {b%s}Ce`رnC[L[nM�6:uUYKT? HPIy*L͡ڜtȞNUpu cm ̃X- ,a}�lЬ`Ν;͛u~~~ԥK:`rkKT :Eݢ,9X=Ne>+=D*8GuSKV,-<Y.) - ,V K˚Rh-Q)lCr5[XVu`*?uٍ,VPaY,Y-E7)3�,w*X- ,XVj4x&ۇ F+VˀIyrKH˾S-,9X]q3|FGЍ^_Y+gҵ %bsM1́Rӟ(**h,v2J)4x ̅~T}e~Gn^ԏnc[$XbZ9X�?weCNQcK3ҵ.Н*.^DGQC^{zz}姼K/^<9XrSbh先^:YkY,RX6u[2%v?ԟ eեPQQNv2�K]ͦc-Xb蓽caLK;o,YJk׻glKZbXo,aY:Q"gNSmʜ '*bd?QՅtj8%vkn,;cVVK[0lѱ :\#|D m3(oƹ4l1E1c2r<Ę)(bۛb Xb6-**bPS-G\03Xr0ϣ\V 0y MQL[gдA#"R1'1, f8l04 p:#"+N Cc=*\`bXVveCe⦄[8ضPUeffZt qXqJ")M޻F/f٤wDN%,rҷS bbXo)XDz2277ӧLCl`5D3ڬOj%S(o4Xj |Gb-|HK4KC 1ccbXo)<&&F�e;eeeԚ!4gddPRR�ZKoaj�毖a~gAOƆzK:KX¢bDI/ WZWw8bedd]reC*>+bX, M0tj�G|]gbXV bZaDslaa!*..MbX,VKbX,%%bX,bX,`bX,bdX,b,Y,bXo+XX7(xet/Ob6|աSXxyo n.BXƶ''x%b,- ѱ 5,jj| ayJ8zb%𼒓ͤ+<~bbhݴk.M¾cc,Y,ր%va /&&?~  c3ٹgBNJkÏ_Kگ2,T U=xı ,z;PYWWgLNNDՏN<GAq)ݢ Wsg"fS3ڻ?Jݻ^vXI{?kORfß% w!KK!�hi1.0XX,�˨(] J4}ۻz*oMՍw)ƹ:辞bPՒt/O"#ͦk?c&yx5<?yBJ1۩K %A@!Ä.]f`3D6,ֆ4,Y,VVK-mp['r҆#t|])TK'/VX ܳf)EsgQڵtKKsᓎ_Hfqpԭu%lt'?*e.vYOa)d[Yj,A[}.:{*9Y䉴G.22$%bZXzxm8A]&Ae)>GA1T\R@^WRH/e]Hk(y>NjOnTYUe,Nw^ ,o IS8,v!,?6Zax ޽{@�nc3BbX,cFť%. [FMNPUu߆Ev+S4zkR*Z e>ԮSZl9]mlRzqI)0&`y41Q4x4n:K9-L;{RR`ɲVbbğek>ZڲZ,Xig BɧOJ TZZDA~)vPzzj减 mZ~{Фz@쵎u X—3z#4dzZˡ<jZ7X?qL-n\GLg 8wN4>gGO1>`.Gg3ZtZR7y~o*k`L B!Ksy 8QN*EA~1mY?={fGؔZ,UK|f4,>>:k,, #b\6,ikv*,,D$?U S;>g>Kۂ%ƨT Zz0hSeuUUR{_*Ywz$C@rxOE&=ay&y K%p986b?0H,>ee& eV7پbZi4ms?uB<5w>%eX<y*?9%ێHls!|?A>~~ԽO?jߩ -\j{X+@8Szf-9>Pz6-a%R]%U_)$?AGeDY:gs/iw/.:_t֫zZEc ,cVr:o岹rgLZ)gU~p-Ʈ9!A+VcyZrOX{,)5 Z^TkY`!"۵Wo:9zל5cYQQaTr4|Pa)(sU'ϒ @ߥK˧3bJ&`!tcsh 9ef6:jѴ͕L$n}S޽ M@1,|X*}NLPiM>v9f"<99T./-\Dk׻ܧϚ-<xm'ZtT6pp:~>JZ)[lُZ>MH mS笖f7y e_"Z^<O%L (ʩvr5un q͠z[sͱ VPX(eOMh-䞰ukn5R'u]z UUU #>χ>TvZk`f9tw`Tjyw5\ӛ&j =*ew$)**˄SX. ,_|5ax9s79,Y򶾃S֥˺a!PST\[?Pghja)![Q~~d,?Jㅋg\9Վ5W.K59fe}}|-g 9&fe6Vwnͭ[CZİNܿ:9~ל)>~׮_sN^Kx_FY?�t)Ee~UK /j�((RZ>ZGөgi”U]O<AGX7:t*}ᄣ&E-<(\)8,Sn3WNc͕RTG<<{ͱMތ-'luݚ[j%e6V޿ֵ<ǯ3X ߹]OBCeeeO h|,90XZ 5r3pr5j+*ZXBůr?%hGwbjZ,eE^X+Z.[U{FYoXҫo,'slYM-Z,-3K-՞7y,[�X ޟ~P8ڴj -H:Ӛu+E7H%%L4Xb:X-t8w^8·͕pK<rƌP}%gfy5ܭ9؃rsES �VK+S|gB>{4Y/jo/g x >aA6s^i켵˖`stf{-MU7Vw͹n[Cԙk X=Go3X e`?vηjG1q12%5U|<Q4vdJ<qB1jn$?>m'zx!jI>{i޻T`NohJ=<sUٜr:]Z,+`BU0:)6WNc筵\Kϒ+Ec:PWͽgt=t1*%՝%Ds-P殹5uvZjћ 8ZLH`@Qkx8" yu|p|;Ǚd1Xr:qV%/E(&W.ZN![K%m,m)~y^GW4c.^Bc CU ,K,,Y,`Ɂ k@SXx& ȫ*KKE PS[Mq),<7y ,c[TW_˔c䔔6ej=t[b�_y12XZchkXTI^m!p0Jy%'I%M?<pכ.e9OKW:Wyeh+<dkz {cdv: <(Qy80X%,}hl'*-+ l !|O9^z8cZmԍg'bZVsэey;rj! 1֡<&bxDEc+0@CEO&%5IXӰ|ƎW7@Y'1\dܚsRsv-kDykW횛{SKY1V&\Oml*]?yj6 J |j*�()11Q㉹a =x.Sn5*EDͦ=gw4ՕҋwUŋvы>z!tU`ijqāCkˁÆk@ee%\/[Aǘ|<HxOMb̚Y:O,t ,#m9ll jS+>yhr\]! QUUE;""8y}њ͕S\a�k1 fpU cɹh)}Ԝgo'ʕ&3Xz6N9[ G:Fo {ɶ QQQŻihw?FyTpRVI#s9$=u}=%_B7EFM~LqS_'t^Sl@dV%Bxz:=] ,џ3Mm$?1'lI2\L8Z\9\afKuV9kEKy<+zxkޜ{SKY11oj`R~ ?_DWJ%ɋd`gRD'gϢk'>Lf]$nDPsVJK-}Ot"ϾLN ͛_[y׺n_rH8GGMx8`2Y1#!὏?} ւa:*�X>x<M aХ$pQҒ:u|͕ZK6@&B*UKEKjQsô-WsXzoj)?3jy,5ᵑ 3FfPjvŤJD kJ ^$5<n~tawuJߡ):ݑz ߖ6!#GSL1iZ]ߖ�DWgߥg/J<qR�h]]KX"vEE +PtגxZC.bX,M׃#⏱#?KZTr@e)Xbi4kCKXycTG�|Z,ծVޛXWb`J>^nT\ZBҰiXڴUUWmXD^iZr9E;NDZ},(-)T^\RJ ze`iݻ'nk@*^8r@ٔwӏ"Ŀ; o, �O,`YLSt=8w_t�(tSD"'fβˎ]Ŭ,4 3̠p8Iͷ X+}Ԝgefc8CK|ծVjaZX:LcdlXig BɧOJ TZZDA~)vPzzj减 mZ~ФzЧ쵎e{U`GSM5y?V4ţ<x^} T&/7$?>m'}n^RZVnҴS:<MÞ}E~x_/:(-D=-�i֕`4ͬf2vZ%% Nq6KcQ44\=v]zW7 gM>l<}D=11XZ [($4rssa={n 7W 'J]I@>T2</-ѳg,H߻_]XbYր%Ҏ?Dnߦϟ_eR/^3;Kґb;Ih`1*Ղ^&$`'{2.<T4Iʁ."?M`4GdOfz%QIJ`*X ,'N% duuȣ7IC ,F�K``bZPRkF8f?Oq,KGVں*:r2WuP,iʺt]*O)u$|Q|&A:(OuM%m߹ŽOIC 3?_R�^-=`( *Ñh@pt``bZ/ C /_f9tw`Tjywϩj՜L5QSy֗Pܟ.;K%ITQYF< _OM`ٜ5oC(,*90X2XX, |<%T{xɋ{ (ǔ@._" ,^O[)XnN阡n ѣ%%b,5P *)+-$Oq!J999TVV&$^mm6m˝v}h <>dbddX,PV^J۶RJ({mZ5wKiͺbG7H%%L,,Y,`ɁKb1XrbX 80X2XX,KKb1XrbX 80XX,KKb1|ݾ}[u]΁Kb!DyeĨ ظ*(2`o,Y,`i1X*L~ɔhH7sٻ `>2Xb%uы>=MJɧS,h1X2XX,-˨(Տ"Pm?,ݻK7o^4y=�~Lky<~K2ce;KKb`Rm?,oݺIUzltO$`rٰ:v:wIw聛1SnCYBR~C箴|z\<14߶ԩ[Qnn<tbiy8ˏ,{.3XTwܡϿ. SBv QGa4f$**.HL oy&b1X,]JeB%T[WMuu5t:%6yI_הĩAUUF K}CMqfXGDT]S#k9^Uk42CXyІm8D\~A! 6B �oTQYiqݭwstgu9wZ!4~n[i4Ӌ鱕et otOXN|;TVV&!`W j4p@,׿2XX u5TP¢< |ʨN%M`ƾ; J_뺁ՇuB-R~r=`aY,&p^~iGt9[/VEc%<k&礌J#"6ZUw5@E~Gӕ/G; gz2((HPppp;x`vZm61!!!bۚ5k:}ٳ8fΝ?ĉb8Y,Vr2l*<cg(%ʹMۆZeu,[�>T'Wk<@ VCXu2<̝2dR2 :\aYyu7o":p^x!Pz葦:3, _~�Xۭ[&�ӿ~3^puu?}?n %$$,wK9EGGti1rwwݻwÇw}WhȐ!b3ßggO6l ' 2e(oNN}uJnelaaѺ2ub1XeiY]Y(/:t ymrqTUUbiݿ/|MY,a3 Xܔ=-CE`.JX*/JuXb%p߁;JoZ[wW (K_ X4-m�,T@iiio}K,Y~  �xCܺuDl:R 87̂kQ,G]v)|Fc,qވ~@ zԨQBh"۸qD9sIʳdզy=l0|},,7P_h}ZbZ!XbJ[ /̥)BRR ^(.W@+Rģ%a!Cgo_?;Gtp篨 Gy5w^]1h⥚c{oRf4X}(|},M'-:�WtQcDԝ)Sf;, K4eK777=+eNm�0aD\vvJB ,},-9Ļ>2,`Y8Xi:IPey~ߚ,?O,OD[l*\ݶx+-FܵRJDZ3�:%OsR Kޛ<�%“S aD R]]}^ֆaYCfX.wo^~cQYK^T G׹ngMt# Dz <v^p;Y[zD ,EדCˏ>H�, ,-o[lmr<'7'h,hNch)XGϱGb'bwfeeHLeSa^ƚ gXԛСC_Jܪ E? Viucxk ,μwPO'%`lڻ? P6wtKl=`X!/_?K=!=4Ql3gMbo~Sl.\bz�]Ǐŋ_bkNMUV# G%KCۿUynwtt/~gΜis^KX,V+K[,"Oo7 \~u<` -]Tcۗ-[f._Ai~v!|/ L ͥ3;vL%~ Kn4 OFˣ�Zc� _Qy;ʥ<F/E}Vݻwz2c,ϢELO>=W{Ϫ OOOas^KX,�aMM`S}\ M?I7r;ֱ}m� 3KlGgXhE`X>L_Dڻv>LX0;*r^�':h.<9ܴs5<.00z:wL{13dWtfByPgN0JJJX|U2X,K>wK&KbZ8XrbX 8p`dX,%% ,z`k6zbdX,V^, bX ,bX o,Go8D /h<rΥЂ94ZFg`1X2XX,Ҹ.㧎Qn^6ReU954`>FR**ΧSIi΂ ,KKbtAwƸ'v<iuv Y;*7?fΞJ? 7,Kb1XbTސN#C+jx`1?z= rO\6yBZⳛ`_Cg:( *y RV~#`L˒tkn>z[@X٭'c*3%j0|dd$m߾FC- ,?M#B*M~;]ν伧&M: `YPKӧ(_O{3oЈ껩+)]IU7 9lu�aKju5bdV׃(%%o1`aED?vY/y1%TeӦ_eQO6'i_71@FyynR PSѽGυUtel m;(z)͏l1 )ξE[SE.ҋSHD>?8.s(76wދVQG j͖]l\Z0m (O^C/;xnP8W\/= 5gt46 PIWSzFj1 ,N8bR***4ett4=}>|j#u떸-,A{ǹRTϠjΤ,Zv'uGhK-ߚ֤[B ,'M0vv`ҶRb}\"i^I6ױzO^/jxhuS8 P3F²Rr}S̅8*{I/5}SZ{F76|rY wi|h�psj#ӯӹ{4*D(S:oA^/GyNݦ}7O++;KgϞ/wXL0ޓi` Km׿Ež"ܒ*ڭJlk7vm"NX!3Χ X$9II47,95iFxiY1%%I̦&pX}i=;G f2ݺ}xz?tK i-X׊|ypN=˝RuR]ޤF TX e%H5[D;)a_+[y<'`T?.IԮc,Y"RUUU ,<yBczH8 e_(zo<)3칗h{fIӷd4i?q 0&N+j@,,~_[ ,[ xX(?PM)8rnsVBXIqhYLc͕ZZ~JK.֋ zʴ\nZ;5{N X>~جlz^B#K(5 [rzH8?t.�%;\ ,QjiUKk#-ZSO<>7j%Enbes?`BB`U{E!N-nRT Qse׷X>b\bZj%ם% M ^g=2X޹sǤVZ#e ͦz{c`1*o.N{8W@}</>S@^8JYSNehƍlfG7}k9,0o+'z4,]~r<|=ْM&SkesZփgd�C/01vuDx/#үXfUZ;)tXX\|,͔U.C{z|vSKߒVfuKo~`ɁR=۷oܑ=\JHk.-6=nq`q,;8)"Tgaf?WӦѤ)idhMꚾ;:Hpy>|@ߣ3~ٴE�3Ғ^rg &{G1:],4HFҮg2&tNDrp,+v{ZaC<z/PXٕ* z>gu(ATbkTӷ3X6O2:tJf΢\M`Ɂt` _Yh^{4{u0ٯ`)wU~I3fҕ}FZ=`4>mlה%[*,q[;N 69,J̼cOs7Т hmoC C >:oYz\ -Zl`B} :r$;0+7niMsQOHrGZeZx 6JYns»I~OI5FYyWIК5nq`i+M]G^@>ڶ=X4ujmfM~詍i~g|rɊ翅|%-],>,өK^U7uӏwB ,*]G*uڍJJJ,9h46}ؐ`UGZju5}ԮMYP]/`^zƞs6#FчRyKMZD2m\6 hF6Ct aْoV(k4+;&1X`ĝ_P edF--X>,^q񺸀`7U4%=o"ZUĭ\6mp,ple%),+1'Рy;C(uf5iASHL χ#<hb}KPx4^^^Ns|aݜhg/hB?N/=岱mjwޓ}Ѣͦm(A^ 2KotQ'hC;x{*`Zfݾ Gzi`ii[X9r)q7tl]`/&&MuЭc}1Xš+W4ehXuѓRš9+ezqId`//{�/[`ɡł% q}1,y iSjg͏>v5iVv1s^ZֿN{Е+9"tbn¢"=tΟi(VeM-={SpV1%<x7%ۻ?=?/gkq![Qg ~SRS̝l񞪓KWuW@U%j`9u ڳW;zx)kT}w&qh{O'b_3̥}Ŀ~k-x13Xrxs0p_YT<43]8}2u'}dޛ֤[H;m=I8!:%O`/I6Sϛ|,uXSm,?-IM`iD'AXͥm)ӦSdTn=rwM9 s/S0Nw&<ןbzO>kb6,Ѵ֫�᳥,<5F':-X;ph` a%!ci8mO7:,v_tNz�x0=#C~6=C/۵Mznn^ZPqEm�5s|O!ع\< ӳ�v^itIpqx\,pfXo@,xI .@)`"pYYL=o}>vdJMZ*X˲fϙi~}h^Zx>YNu ɳTQQ!,NsuwhޅdK9~g.^xve\Ll ]:]ߖ�V7qW$H^>4qECGV%Lh`9pp&OJAG ,b;hyz[¯ |֞ ׹:|/% 0n޼)Ke:O[5q\breeh5[CiϾ}`\$lEgсϩ2= 3lP:~㩌WK?b.!]:}&kP!$h;d1乫Ս8@uDk9/I} ugC˷]wn<% �6KѬmC`l-�׫L-?ֹugJPPX`ɡŃ%g�1-ihwu#|3333zI"Eؖt$%+c[ö;ZXz,lcHc_屯Zx_g~-M{j�zI<O^!TS5!,oB GSWr-UZZ%0m_JJ{R4yKQQNA4t*euo1`;vxS~B� A(8Kuu@etTm>nk CS{͢~6"y*2ԏo=X*1V�LNNDՇ]X'C˔[qn+3rs)znzMueB*`8R tѣmT]So< mPNO>囗+ ]j3`1"mHʳEeTTꍏ&!-M(#nSu]*iq. )6�U-YL(2R3L1T)Sǁ P$>,8,ZCچ(::e5kԲu,'m8BѕjItbm<,e�=kR<':9{խ]K$ʥb`T_@� u 1f0޽{I/4cwDD?ላq+Œs13zaz׈ͥǁj*22R+WXmDÇ^KU\\@'52R$,%((&K kJ Ku 9ϧ|`1X92gңGEu;Z뢋h1jcL`XNӔŌG]z'ʵtqd7}hj}-^ܽ|̦ǁj�/�ͣ-@#G(??_LIк4l~&6:AUUF~zڽ;V\NюqllaaO r:RKe/q\՚1~?0` 5i.= ,V拆nVb|ƎM;#vP@J>}66QF]=Ah*v[GiVAєiES }.Mа*gIS2/^'p,:aT]G;eiI%%b XnCa={n 7W 'J]I@>T2</-ѳgϬK̨nݾ-|񫌷bi*eX�brܣb9jjkH'% ,b|e`^fjAKpLrDS( ؟*˨Rɚ$*RûT|*}KډSI*Y]]#:(} |,gβ,2v%K>Xv[sn:ݑJD|Qq19/^```bX C Oq,KGVں*:r2WuP,iʺt]*O),y$|jX>*,uҟQ.Eun=(0$Tk Xe#Gc$4kgiQt2)bX-,w!R 2fo S:9jܭ/2?]vxJ"L iX6'Qp80XX,%),׮_sN^Kx_FY?�tI`y_" r=17Kb1X ߹]OB#J8W6PWZ2bX 4^B>d`bX,˖�e奴m{(_bѦUSh|GZԙ֬[)}tXOTRZbX 8p`dX,%,Y,``Ɂ%%b,9p`ddX,%,Y,``Ɂ%b,[X߰V',,Y,`iU<ƍk80X2Xzw.X,`YPQOyc\Ljs!Rx?:Aw@_77ÏZn,_Xp}ߠ4qDP0ֿo}rtt,Y,` !FVb~lE= piM7,oߦ}|nYpdJo;<a%+VR|:j8\,,m W4sL>j(%1ݫ+}{ߣ7TXX`bX-,{!ë#+h Gt.3jJ4R9y؆_cVKc6ÓCפ .N``ik*--?m /_.7jkll?Qrqq-GOVV .4YS(?!M2CbZ'X{\X~zP9}g9y͠;v~7ÎK-`w۟>lׁLDE_As *:wЃG|]eTr2l ]n}Q態2 t3p0WzOQC(+/s6fExm}sؾ3¦u#"+ǁԯ,3?ӟj\n <ydpd9+WЯk U=@9O4I/%Kb^?^Ef,!R\Pf-v6\KS`4ߙjjkv>kj;x r;eFw?+`pn}2 ړUVU5=娽{[)<xVl?E6zzٴnfϛ^e!lwc5Xl]]c-G]vmr|[tH_o[бX O rHsvUNP>Y( 2l :PW8ֱ` _F9<|>jQ0eP=Ju [oe4W7RkZM|,^}].hr¥YNGsЙ4M` ˦ i뺩c*dY~YyGiѳb|~"^nnaے}|'?IOK0:jreAP ri Ɔ@^x*+؎x[X*S_SǛ[WK\~ㆰN =zD Mhsh~iǚNyWQ7<$Zmկ,˥K6@5k}|vEߧ]<z#^D9[,Y,�ǀ*&gv7&MIvS6;[fwcX;#*:bu.*iJQAAAAz"#<{{r:s}_s@'.H:RaYpJ(1%(nײ.raj(<Me޻ڵ6mL?�[>̚_<GCMX6oC3g8ƍCnnB͚5"a`ev+Wte^em_gO>:!) $|jMαԿB^Ma9 ak^5q9 (AlXoHA[@ɓ'`rw`V^hly?~X#r`Q qZ .=UUUظew5O_5D]pr{x=zkWcWͱ,))qeC64 ˚o(\VO뿫.NO~z ci,X@ ʐ˲e˪$a>q~m5ؽ?U"SB^},.@oqdBD lcYainK!驔aoϟx.RV>P2_rȈQ8Y'ai./C:" gϝiP*tEE*99ʝ}9G__o}?[P+eH]Vq7oC{%^ Zyg2t\wdY/4w%FaIaIaI!-XX65K’’’B^#a)*\LUx^Qڮ (,), !f>kWL9j64 K KB!4’B%F$BaIaIQXRXB(,), !PXh4 KB!4%! ˗JXlw>jch4 K KB!FӧJ4q:qkMj?’FaIaI!Gm<#ΠSXx!ACy.JIiڠߺ U ² )+/EdL8ܱs(// B^ea)h(222aaafCa…:|NDvC&,o/8t4{)±&Y_ay|4V:8DD4¥8;Q<s OzlBbJ|=p�~_4w-~mk77/Rg)�yمFΝ;f=P1bۿ:Zџӎ56bX͉ĆٗsйG/>sGqI *FaYIU#"CYX /(zѳ Qq.JHW‰'^EuK~[u4wԩNiѳgf qA Fν4p@�Ka#'m0f(7m:vR c1nq+לKX}~ϥaoaDǮݱel8o4S:w\TUU/]cѺ}GXY#ueK gNashq<9~'3x=, 5~G̹EŅ7ׯ/9sѱWee%~Q޾Nig̘''' �B(,[VXb<L.0y$[ )0En߹3֭_ ',- ?)v(ѼXoݾ`&WQQa4|шOÇU*uzJ]x}v:?Fyy._Q{QXday:*GCcO4~e,nP]{m,<vM=FDHXQxGlٲ?epY{|*nZZ Cg[}я~֭[#""B]'?.??Wօ-RG^%/C=zT|w6m̙3?CԽI2|c/tŋk}/<]׉ӧXf _VV y/## �~b͟?_ݫ\GzTl_رc0<Yő}t2mܸq^ /f'4vlt[tM Ǝ-M3l0cO4;tּRX95$:(Qhݽ{=Z=oⴶBlRz<s1oω@UXp[9Uؠa*=rmWf]E9XjpO<ۿٳQPP�777%w߾}޽{ǏLJ~sOQVV6tR\|Ycǎե())Qp^YFj̚5 ׯG^^z+o.r."E]\\'^^^Մr/;w 50V{cbb秄 JKAD<WFFٺ ػwzvQL֡ &ظq'NԹTk 3VVVHLLDqq1Νv "), ߧ2ʕ4DV5C'|ئ J<N ekU8 ࡈ(,[,(G oO/&cb S[k"(m*UK*MEeE}z0oF[ċbʹyUKuV 2D疞5SCr (bgggt__U+**RI{?O_K~zV8F!9sދgv.\P'\_"XWZY2QꃶЭ-\TaԹ Gplli(, e9'Ҳ2's,*cq-5gR5w}ȨjէBlRap?S0*1r_E5&{]UawSSU2Oz+#GaG[z>Su޶m[>|Zz?OKQĨV5I?S[ҪUV;.Kh8/~"Djgچ*HjvtnQ]-IV{12D,"W{dh8>�7o6pǰeZg?ïkXƔk 3WgDԊmӥi(,+!,eJsfɪzFd=={~l-%]C KY-=zAy1r4/Q^OVwg#_E(ʊq./))U y7w"k޻oFab¿d϶>띅5nj 'Lk竉 <xֺ.\[[[{%"zd8Wv55?GQ˩St=Zr }2&r^O@'MB>ZdxT҉rJ4Ϫ\2T&=A^=R2_Spt-Czq@;5L,s'ZXZrj#,cI^}, M62eai}g u\SIWiRⲡ,еU2Q7!#F)h7hW Ǐ۶G/)r U:\^h-uNr%$ck|` Ujn弣2G4O8{iDX0xHHH$2P떞0퐰 :)ȑ#o(M+yIv#Y#"HQBB'N^ĕy|Hz+s"qUbKo,<BĆi U֭߯J3Z$Nx.be?P{=%@%kkkU/B -,M]TXmϱܹ3%yu#/"c_ߑET VJ,.}NEGe`{K.,eeL|$*b0 tG6�# 啥?/ ",E,/>;9Yq^3~"wNE8iݹZ!" t|BY#=t"T!CԲF^{LY\#Sĕ7ߨ!{~g><Õ߲"^e&us. -+EKDžd[,-1,)*/Bk 2O2WQ�~+\ggz*n/h4 ˗|$^DU Ah\s~JwHđ|=oA(, =?6ҤFaJ}ұ(./ĽcŽPR</f@Iccc $%%CB(,i4 rd#;7C#a|+VN2>f h$BaI(, !PXRXhB(,i4 K KB!4’B%F$Ba˂*{]m\֠um5h=z+xED"~eʃFaIaI!²=}V>?\qˎbE΀,? '-OěPX(,), ! RŒ}'\K``o}`<�mv% +_y&΁q< 7}Wi!,o݆FaI!²>RDeyyQ|4,,l;ٸa*칈;c9|,f`t,>G  }M3Fs K{Խ'gE d KB!لFΝ;f]qoހE{b`9 [c%Xrݎw?߈nv{1cJ4M X=)j+,vMl۹ c'NQXBys/[?}fz`(|$EIn0aJAx\.> bLZ9;IXʹz||Pa!fϝNz]pt>}D`/е1L},ow':gϞu;z]c7pji?.=}\Ǐͥ7٣K$Bad²W(,=[x MRlom< YɫC,,g~9W] 9q xe]_/>o7wwL: %%u6npy!sQܣ"FZcy؉&(OOLGIiƂKeS6vԔ ;\tқ{F J KB!`5'�V;6"(2S.ue&憪ĻwU <y:"-=9B}PZV W uqk~{+ܹy;pm.g$B^za;5(�]fx{ Ior,C׳LLf6muw4]8m>9n NGQ~2$.bxֿ9Қ枑’²)+/EdL8ܱs(// B(,t6XF' XpǻaxYx7#9:ʿ[oaihw,rԏg=xˊJիGȔWU5raKci{,zQ;ߔFa\JM :!89&$7ȵ޳ &,eʆXhI|:a7:v3'�| =lpT B|L]M.ȹ\e"N9GT-rяWͱ0cs,eΦ{jZ#&\Qrrrs`Qus,|.W]QJZ!,u> 'N@ȩ 4,,xqVh 2>){<jDd(b/F!9= 9'!0HAaI!/>&E/o Xө<Ws~ݩ柇;`=v.ᘿ3 p*#uG+Qqj巗F { lߡ$P*)ׯcص{2:B"uedv0dĨj W=XVDUқ{FY#+9$r3g4(Pw sVhnaYX\=^p&R㑝^#I 8s$z@Qq|#`=x\y KBysq_ߑJ|ygP|0r+US[/5C`Ħyc#ࣰ–.,OGha'"JIRӓT܈f]d)j?-Fag@$%˗t˗s;))Yy7wpë;~3Ul%wɹ6ʫyy ?GFBa );oD[% ?T|<D[0S#@`Ь(,i>'O@z%䉘J8DE9򭨨@nݑs3K\FD�8sb:pGD$tr,j<4pOw0;.z#Qu̬,j1)BeSKGbmUxxZM܇ۣvO6kVcPRc-,57R3PTr%e&8i*?0mlu 6S5~G^'BOb\u>e=VuT=cgXm/&iS)~Ly>}}/8B(,ZXj-:V9ΓwᏃwk|L򹰬0xK"_-5IiE1.e4&=|ܲϬQ_XJ|Ju EEj G&\bdG.m~g!+C%]8͘zLeY6R &4׿d夡Z}{$'+'QFG{c'aw&ک/`MSz:-=8">}�׮]SG<1bj܅j?~"D-c#E(,KHLǷ7 HĴHNd4n` }]0Ca)km׹<e /q6£Aj }BÕO؉vq.%&R ˮVHB(,),i4 ƜgsI+KN#ʍ' mkVgb/˔Tq;%5MxH▭d>NCay,8XͻI̵t(HV 6R K K²)(GRETUko#q[W%B(,),i4 f~q/{xރ{(xV_|2Ud#D(,[K_QUff(ry$%peH\6Vw߷ !e,AQXz’Be4vq:ַA(,), ! a]XϦG1+2rnܾ�Yٗvu.];۪!i4 K KB!QwST#wb,6qYo顼u0i:[M nOc?H$BaYai5}+F.Kv8xbs@>n <Ri򓣸M%(,iB(, ,e}X)o\MT,8'ΩsWKcO=<гZ)VPXsSNsQUU[oԹ֞<yoo0yOb]evGc ګBO?C~6W3a"rr(,), !r{x1F/|ԊO4_fz7ci(,g~9W] 9q x!ܹUŭ}.nt882{TܤP\R .06vTL>%| W7i U%%!WWX9DP#]\)zoUBC?!U[.n񯫰,+/7ݻGST:JOkrȧ܌28y:ē OiC', K KB!(R+.)Q)(WgմK(**&:-^ai gdb4;t]6mu_Λ'UCMsב!G0L\Mߤ$J K;Oĥ鵴?XV[*,k^%>}z(nPX >nٳg/5- ODQ_2c=xhz,),iB^a9 ak^5q9 (AlXoHA[@Gث臕W4jϜU hd[7mlw1ޢȼLc)αܲ}g9uN K%!wˮK"[# E\n8YQ)~BgVXRHz*e[;<.,nX sm۫^/ċ8]J%eFe%jUr?4NaI$}yg2t\wdY/4weCle+’BeKVxcαD C(, !PXpa)*\LUx^Qڮ iWʡQX6"e奈 W;xnSx#2:e|Be>kWT},۰h-CX^JM :!89&$%O!41}R-Ǐa=[5"2d_xdtl~20|HB%Fai ,PPXP^KIĿمeaqxmÙSHJGvnz$&̹EŅf$i $ KfNX;aRp=8?,((Pi%Bq40R{%$I*nDI2A3`*++kM[WХ-\RO�W.'M]nѽw_|ɧl!4ZIIIFЉ  >R+$*"<s1R ǂ<HH5Ҝ%KȫIXb ϶._Z 9 auqOcfi1mL\BaIaI²iUyE9Nx#53 E%WPRVhTTVyyEE/KCskw޾}1{.l/otkddf1"PXRXhM0deWKMRZQy*MRؼm;VY';m0еѶuA+WZqj*BaIaIxa)ǘ Zm WDFW2uG +' *p۫&8Y9鈈 h(ޘj"4F4wjإ9gq:."PXRXh/Qp4�YxW$q܋w/!1-޸7L"q."9R=ġwLĤ$'>!3Sm^e߁-ͥ$PXQXJ 7F``E{t8u8{5{.MK" ݐKlna),c#Qqw6Iye)bϡB6Re_KU9uaq,8Z WJGaIQY^^nA0Mq=<|@۷w1[wlV?f2!#F"5=] ;v'O$|ȈQ*6MVv֚MVF|̈́ ipJ/6H/(GRETUPT7n~DM=!luع q]ǭ[Uw7޽*)۽wV;׹SRӔJMKr^L<5D>ScM)G)h|>X\ZS\^{?2?yJ*%O!t%ۭz,7ysN:_bo|KеWo<}TTCW<=[%Ϟ=Sszz5Ls^� ʵΪTk.bhݾHȑњkڧ:k^fϝ]ptj饶Pծj]evS~C~L<*B Zs5_QUff(ry$/xB(\l*ٸ_LsչרIbQ0)v()-ŭ۷`sTM<9R rMޭwP="T._aPk,آ7th'Eң,_/_Ye1UMC57wwL: %%*ϵ\w㤄X@zܤ)T ,]4҄%! G;:𗕫Ԑw;qc;tļ`=쇹 sZEEzN :0s\)(~湥N_<ܹyjz/__mX s,5"9w_-&kݻwU=̝-VBj{�tDE ldRRyZz 3OaI!AtNvqww}HXi{PM pofv6FFJݼuKnz,Xx_.2 ,kש{OXhkooPml-/=#٩ar yVckz&λlaG 9%IK '%!WRXv5qr$ %`X:±/@XB!c 9pM l HRi͙ G%\lUn[{/z\S T{,\RwHevM"K;gzky'},2SįeS=-gXjť ".9N!E K٣!Vw9n5F$l*,D:cb[zz.Ao5oR>&rrrsPPuc)UpMI+RkY{R7s64Yj% JF`y'j>hIIZcNXUs,%~Ms,),[4%*), !}, M6">cq;D`3,6GcM0Atka2]I-G++eO!eoˈ5 +VULk!'OB28&% kdUpS64#+BU,4?Y$qj5',e-wj²e |9Ka*%!ǏT4vŪY} քUt%-FaY7$beCYq;0tI, Β:UZuϾ{FaI!RZيV5\;4i$-: K|֒>H!’F5 <̬: KIHaI!’F{݅eLl  #3C\ʰvJSp_JIMaI!’F{݅E\Jϥ i|IKZQ͋’B% ˆ/OB!M&, !%!WFXB! K KB!BaI!B(, !B%!B!B!’B!ʕ+KN`` ***\XX!)aӼׯ_WZVVO#** \YXZ!)`F“'OsMUu Ҕ’N\X^vMuJ%/7RRR u i} Ǐݻ%Gʱ’uuBRXi} GΝ;F^"Y ÍzGjc}eCԅڐ[o\O gp*z_Yd97A] M}߈Rh "{i\im}֪ڣ\],-,?\qˎbE΀,? xcf5JX.BHSmuSvVURf@̙pMp$,>|[nՙ�Gx,iɧ땧~6uBʱ²unjD%ll|噬;:f`,^] gl{ >q{m\u>uBRXֵݹy.M0h:j'H ᯊ&oߠ²RWNh\.nLs8h&Af_ ѥZ뀱&Dh.\ UG5QKʵYꂅ8=NS\?s\p֜o>G3H:L?ξJX+z`t[t/V|tt֧.BHSPvҴi6H0U9? 8WҘ3) >ڶG{o4a)ohT|](ۍBnxh)N<:<yߴAiɴbŚWq,ltRul(+,S,!J)<h=퉁(o=0bI ZنwmDi{1cJ4M Xʬ7n/Yt?|zW>է.BHS ˺;66+Vt\Z^ќ_y(_Rŕ4Ϻı` x}P} KY^=V"coq{0<rwŧ])Ȝ#}uIt %%Få@Ͼhݾ#FkeoVDr}πHJNQٗ/+qrr'%%pc4m>ՊLݛ4a1d(<=kURu lg(mQ|Iv6 A`x":߆_^{b&田̊KJ7iVt<KTNcb*sf7 Ҕ²Dшe_}3Qx1.衐GGvKw_a]0צ4B-kP-菧 [0kfͰ poo/!ی3a.[åfDzzFe7^e#&L̬,ŸISIRA]R<w|kzf 6}Lݛ4]zF(//GFf&/Z\V|کuR:M܁_Őa^3c+J+U}g{nin0L^͕|y ;\0~˳�UwMb.Sf7 4DsMG̈s%NNBF? 8T^=Y#33doio]0צ4<̽{2pmw3z##ρ R)󸜓EKF7>h׹ f9EVv.\ 񲦁׺Ku[Y@|%b|<zΏ'u>yVY {喿JNxOXKe0Lcgތ^2=ֶ<)G)O)צ j1X 'PxE<’2 ii~ 11ZӚ+Ksy*7suO] ڝ|h+qМIsZp\o]0צ4r3tֆ\_[>Әex\&'><=lzDI7+Wā:?)Dx~ Y\\s˹=?/V_PX]!??vCQQ*@t7.3uoҜQevGtDDQSʵ)Bmj Y.3a`=dW23)9YQ~">lV!CWʻr1r3WBi ݩ(-El9&!g„hO$|Dgdmk,iM ڔ|7}DZJY^&R WudzMx g<Wx} ~I?Af'.n qq:w JLjݲ8hmZ,ISi.&?sf:R.Gs^*) օɨ-N>ZwCj~BD_FJy2B~;O}VbҴ5<LO] iwʊqf�2G9R6h0#qM8 {0ƛj,mS}R&>Hrn);&ʗ?33,axY<'dž޼ Ǹ:|&کW Լc0z]a}Ukռ'c:]]hYlپ]7oۮ2سtMs5L51PXXGڔg]&׵.ԖYk7tugN�]&oۡHxEc`LX~+JåZ GT9z]HF֔<LO] N{_?z-$$++u đX~Q<'$y?L ڔ|7^r3UUUj <Ǹ=xm<f?yG~vn:l?ܚ$1 3%Õ5tCu_JLԅK!^_O)ZkME詐sӆ_\TrGR>9ޓVSOooeZ{ |'jiRRRMQBt|:=f§S=y0>̷m?8`SXqQTd aj]_RF֔<LO] N8H }ݕ;wo w[ҘS 9>n^@;Q'a]0צ4ܐ܌$2Q`TO䓀~x6O'I(9<Jhd~gؽ-=RRRMQʌ~xt姶^jeGM9F<>!,& Է 0�Ab۶UkOB\b۵ӅKQXjs٦Rbm:H+CjkSԅv0POǓ=jAՈ<5t3z۹!r.˸!4nwrsҭ 9?oxa)JWnFAqoҨԎq?DbCjkSԅ>MUxg&? &QM+!=3ۄuBiw._FBk\XƜ䐗)G)O)ח.G]:?b 0polg?9 uBj7.TgKXڮqօBi 4фlI^rǪd]`] lw}(C၁222KNRR:TpBiʡp;oK///DEE!--H:qDV..BHSXi}l`UҕJ^Nb ++K}uuuBjt;opaV[0'/_&/)\Z续 Ҕ g|FB!’B!PXB! KB!BaI!B%!B$B!B!’?!B$B!B!’B!PX(, !B B!qxB!Rt’B!Et&e����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/images/PlaylistBrowser.png�����������������������������������������������0000644�0001750�0001750�00000335273�13112005742�023117� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��`��������sBITO���tEXtSoftware�gnome-screenshot>�NIDATxX߀SiЛ{oҕjD VD6 { * ({' )T۩wMϻ<egw~SBיY۶&N-у@ BLu?GB @�$ Tʍ{}{AEc @ zZό uP"ei1T1@ ?f*?mޅ;Gĸ�i'S[A K?xܣo/Ԟt9@ =t?a>~D�yA6T> .˼J_X֟}]UC\~g?a�8 f@jgFղr}Dΐg7:ChiW}֢_>_H>߀o7G8>bU՟w4? ooh>?@^ U{t.3 o9hWw4?^m5sr&�\ @G>_=^pv@rpA笻mYv t^AZ6*:t38\=No8QAjE觏w-3ֺ>4s! f? !GU^_pxl�yA~BB 3陋N`)"m5)7W6ǽ0 l7ۊRw^=j{@^7,!,=V_eyg+YX~ًK2ӃqaŒƼ/$boasV䲣+ZCF$ Ds 5&Ŝu3S͵V85*@-]۲~N;zH9j$ofw^N o 6$n}eIԣQӛ[Yy[njb9}#},,.}F^*Y59#h_]l—:gh|>gBMQ_>̚oĺ~e>?3 v؃kjY@TxWO3@̝|#,:S_>!{w>A ǚ#/)k?@^_(Oտ3g@Ap1O26]c[831oEj\:F ՞zCY.D;4q7",]=, d5&ֻIOL wOc r/K6*.7F fm8gv[�Mm*~vۇX_^gRpȲk"uyy/OwjF#S*n?/+z*+f[=^34bLmnZz'iA*KֲXV[e k2/\9ZǾoi-i7Oc[SIIvB2_ߟx+?1&(VGUqur?5^hݵy'o]q]޳9I?~YHyf ~ d|޹O~{ ِ-5WsRuZң\SrA ~Sp%?0+.޵%u$en _w .; zիz*%5jѫ(lo69/y+jMq g[:NkMkهXXŲų_<:\o]s= ;ѓG[.dO1;ؙڛпmy;Fn̿d,ַ꩷g͆YQ'@A+6[QTՙv|}JXcl弪(K|8ZeYdlnbol֤v3]"2QǓStn?+ sU۶e#]믒ό*D=lo:))Z\mD[O-~ E.ʌB�'>+TF>[+/-ˎɾ�efޕQz\\byϯi \\t?;_~SGFbTib_e2aپLn9S%[9*CWgqVc+SSc:NTMg1CƱI&A3Lbw翃֚ND O0o9zף:aο^ܽHGeu "訍u$a=rv%4W|t !wTsߜW/6;NSKg/::#\:Mg\~~Fce0C\?#d1\dj+>`<0ESg(fGMxOi̻cCbB ><Q6=qpB-w W3ogR71t0lQ,g\<{6yhbB"k<iAoA:qtc%QvjzBfQ>qwT=MoKo]i=jDLjD?ݛ"] ›ҏMrYk(C-5װ5ɋg;9K{u{{?<:K{mՓv}G>vL1Owaw'61#_OEҘfLěGPy J7;} :ĢXzс:w>|՗7Ǭ]Vj)Vj }j9'{Ǣ\ q՜f932uCٺﮩ>%Qo[s7Rjhz{{|!Nw,;\ PsjWCq| 3P-  J٠͓s ~>X iѻBwy}a%K{]]|YGM'׏?FG DwϬ)5f΋Ρ.eI}'~b޴T!g6NnAOWDz1 ki8QvJWc7Ab_ Nݸ|f]{yPyeX G+B&jNR6`K :ztM5+=es&Kg㬤kH%}ktR -Lۜ^nSڵșqtFLuݚ1xV.A|cIihnZ]n2nhXOޱRmOM7Aޱgy= 3Hk94t޳;wOj7]Vmz`VѦn 5,rN>rN9�D%rP^=pZ-EgDhj Es&> �N@Rjx[=Uic.Bqqvw%~kjb_-T&NyHfMCR_f"eڏ95gkv<ECt{{iF[\U̪/ur/l0`-xC=PY26:»_s3k\׻}5΅!=x׎agzh&̢ĨeE4m|_k9r�$?L|3{[ .ޱ Zٱ.0^)_w-|ϻ.K}n*d>?5\:|ݤ\v~n',8 BO.\CK-NۨŏsKUvRM�xAb/Y wTr.},!66zuV{ںE9C'n^1ą4[4㗦mǪh,#l郼&<W# j=@ԄzXwpfZO:�EbR/ߓ\ԧN*.uIṛv*ʙAw▖Tf߈ג~9{3ǛE/ԹU3vt#U/7 &bO6L<vqM;K?4k32j*[N\T)utнcm oΫic{o/g2U7|#~ݵ‹̧C_T|`#مzCvpE@ɒqR.R�?2Tgƞ)<C_IJEi½u*�oaC :3lLd .EĢȖ7ۃӣkObla1Ns>2<Aw uث3*6<܎>=[B9i 8:kep!Bk.v\`SYqh5F)TI'S/~VF AlM&k-{!\"*!:#Qa:{}tocKFgviֱV3uOG3s7aQaPShu_ض:nkW[0SzX=:6rsU[ {L ۿZY/ݵojXh ND!·2,/вKt;Y, W@^:Kg.V 8KA8+Z T< 9Ho^}Tgwz͌InG/f~:mVfzggz.�vΕ4_kަ\kerU J</^6Ia'E,~u_/[oZ n,wD ;H;% ωtE27j_ B_rԻo,׍Uur]3[QJ\MH>L<^|{#t#2 m^^vݱZɫtEx"=JYɿKtt|g4 ·_1O@T*?s':bMI|葃MOլ\Xbni6Co g bTʡeWCt "̡";6ʾ @~Z^Ek `.ʆ}mNzֹ|/+'JL9 *cc _,آ @ 2/ȚZ=N3 B\<TfT oՀ@ yֹ9Y6@ z@ �1֖۶7L@  U/BA@ D@ ? /Ala@ @- @ H@ g%^+)̖Y?E}!44q"͙m5}F4Gu Άy/5co4r½ldF鏛FA][_0^42ߖܷ\9,=j{͏8IH&V39k,U'Ϧ FG} DJN):vsPz�@ �/Al A4R^8,Jl=6JFEbJ]oyhG)ݢgo=J/k[} EDgMT>rZzWtt>^LJ@Y|s �AJN "~@ )|aqWp_5UEoZ$Q4Idb@jRW]9RyAru;vjȨL<oF/n#gYb$\"nt*VL22̙P_VZ}o(/bA=r1#XrS $Hb V/*M u<F.3 ݲYK$j{D[ٙrbv{^tz+#sb,Z3&4Qιk" Tq%\G?3kܙ "+ Ą jtoMW,qQR[veS{@ ȏ?89j:KiM-E Σwf5AlyZBmEEn=xL0J]=|v+}mOKv+Sm=Iھ3N&}NfI $oyYwMAT fuŚLIѾCۛ*nVR@c%9It*5_C2hrzѫGÝGM:VHna-m�%&#*H{HCbuO5z";-Mg$M7/@ 0AlcR(>(-{u mS NAiHF\9;K-"菃udd"Y\o'>bIk/TH:j{jn#^Ί2BTiArU5}1Ium*—}F)͹UFBqkf+ler8ZԏS7eց-&HO9YQe3:ؘk"mw ZWfBba+AI*qW1&RVۋh}qx+g&yqT1@ x DO 3.m 6"k9\p)%ԻJbvD9bv':7 RیHfvzRu٩y D!h'm Vi>f0e%=T�f!w6++O:_YZ7$ ; iQTV[%Fo~5O/@ FAdf7i<V]qrJswA\!5ˣXNi}$8+SŭѾҵh L-]:6Li}~W=ZѢ-&K8 r$e} &/STu(="+,y  D3gS*CA@ ' _E)f*Ȍ4#=)My; .{X\C~a 5@n36+Qw+94(,hm|D\N1_(n_|uTVgz]mI#wbrV"EP1Jb~;XEBYkcn ћ1Y/kEk3+zabQb2S{edFHϙf`T&kMwӐv8VП 7 ]w|PAg Fttm-x{>b@ LX1nȨ7_U6Y.:1u˚eR3zVM&hEWUH.=Op)M"SDIFƟŽ^]6t'>4i4xMF= 2J.O((h⺌_Ƭx1$uъS#:=~''7;'ܾK<A+{ +NaH/)D!$I-7rҮE8ɒ6V/@ 8A$KwbqbR#5mqWNw) IZ!S*ژD:R~2x4rMNoK5Rmq#t3H Yhx݉ ׳/* QT4/{E}1013+,9کhXs]"Ex;2ƜDRYpڿ|CWb9*{iYUoZ3^Hv @ /A MF۳`W@ ρ AW/�?m4LO@: B } "@ A5@ @fZ=@ ? /Al@ g)u@ ,<17@ ? A@ ǁ@ @ @ @ @ 1ƠɃƤ" mojdRjRZ @ #b/oZԚ Il E?qeʹڲ'  l _޶-@  o?+a5Ƥ^9s4/?~p>}OiAǂIt7UŔҁ\U᭫pR@ ? b~ ຃>K[}q_~/}u0}B\$PFC垭eb W8*P{[&# 1:#IKJx#)em[^sE jE?ܽTE$m>7|A@ ("dH'A-,^_+6VWXJ ?~;þ$^[Yll)#nֿU&KP'~s)C DކNw!)/_>}<@=\ULolۚނc[iTԻAZ2'o'\m9@"ɥ]t\Al);5u( Go?Lyڅ+<ID1^x׽^,8/K~k^@mT@ D, ۗϟ> <V_LkheR[ʡm>{,YWV{K;4W٧z, U_!m&EL7Se ݮ:%К:re4̧F$Wn_j,îEoDFF>b~(9+iZŲkϾlx] 1/v`Sl㌐oW=gv^ y*SҞ<CH}YTG7 >Vב$U^S*LXͅ@ (܃ 8 �ޠlMi_?2xDtA x mi'ڳe8%ߖp# V$Y(kJZm=FNq\W4:zͅ:=.ڝF~IRT<pM\tԁIa-/{VCD*YI9);qMi,Z(tdWD4VT"ɺ]WɈtZTgH[mx@e7@ "cȋH X@ @' ~x?xĊƺƺ:y0+?4]M.q)3@(CYҺaϩ:%n@o+;5K=u:U:Jlw_{6J-κ{6ZS3ZZYVa;QAdoR|憫5;lS:IlO.nQKChLB>:/lɺtn9sZqndF!ȐUEZ$9dJӛŤ]5ؐ7/RDI47@낈xp8<bq!,A� VĮ)M<x b=r&0Ҿ bzWDmG4-M:S3ٜeuGj7ٹd*ΈeӦMuźV;4W1Zi)'[mjzDd1vU>8b[3T5O\}REg* 9ğEfSI'>~|5J$1W Q8eК򶘋;ܻ y~$'^s!?-vx  8p"^DdG�4d/jqO!_>G @"ZL x niћX7nH 1؋b,X}qCYTI{\ e"snW-! [5YNo7g:N!M>PLzZvLtMM9;6uW<iB9 boy+'U1\ )D i�CY;<^ZSʠT75qQQ23ecCUϳoA-)g5[^t_҄,RX`'ZDn*~V_WifGY-n�xuT\[ʙX`kRl҅jt]9r7j¬;g7mͺ]RtCL ß:ǵn|{K5CNf7@낈:G0oh+#1fZJC8\"kD, ~m{'\<x\_]YZP3gXWO)Z.962Ƀ҂Zk oARPaPmPyt4_^^119۩ڵާ67oj/ SFmm r܃(9vU M䢬˻)ޚ?T @gi.:9o#e]7Ɵvi[GB٫]פ!Rn/`cJz#m̻--?ZX˲ң,Zd4ZnUDUdTt_r׼xKI& @ 0Arڞk_k,؎U[@ XZܻy,4lMF JD,?Aڵ=㒁ϟ>`?3�;ߵkssvy_z'|Pɤpy8gO*r@{\ <gKAAڠ !9<[5j7&g01Q7qb>ߵȗsskII98y]Y%ܜJuޭ8,Z;(Y-Y0m1'YL:zHM]v'O'+Ds߃~dI_6yIo^W_6Rc}& @ (AbpjVXtB<9(خ磀B 2 Hb0! ņt:}n=HHIb+d5X,]ka4۽hX{t8 7`2O{H-.={&gƙ3?S9x biGe?q@ G7ܩO*&~"wKAAڠ !9QyvN/-s!.p<ˌ$9Q{mmY؄nxp k6$IVncn@ K̊8Mo 6Vۺ{{aTf,WOf(>JuNhoiQcFbwGuyݍwީko8:h#fGzƎ+J㱊(7Ck7曷Mee\#'"Aaa;/c } `<'% Ex3M.٘~Xݳ4F荒' ap8Hdf Q�0_t '+9 3 ܻhӦ: 8/3 ֖摫*.2QA$Sy:[b,qUe= l)D6DFK]9_0kۻ΁m8Rk.{cx@ ?A8NSRFv58ET !b0d] k'터.8#47T?TN@Z_PqIWM5V FUFC /&b)xQAH$}@NXrgiKJJJJK߸_:M�|1ĺrzC%ϟ>d ç&]yje֯yNguE=3rG[*(QЊʊ˗Dff<e?q+szoi_ {L_ dh/?rnzsՕsbǨ@ ?N;98doa,^`,:DA? pC Udxj2M[Z~4%#3J\J($'#G]懸#@ j#Cj޳@?}xϙX̢ǎ?nZꚪ;woݾ{ѓ7o^s[Kr* A:'AF܅W_|+у/M̂‚ 2+Gv<gKAA4Z㕫ݿ �rѢH\HwMoC:;- V~j@ mx,K ; 5`1@B0(:H b,DpD#0$H!/8gL4uI:hu21 @,QHO 8D: 8J;b,F p` @^1UT@?Iz_~@vh�XU8b Iq*'gf}Y\RD߾}9ϜJ(Ϋ,S{4IΫe iM9٥%靝ՖB "2 bq�PC�(x2<!WbDX?>fqaTW*v׿譟8Q$ɤbd J,m!`qx HDD!v(ػ Zy txL:y|yYٙ&ʪrJ~_:XdނXU}EACe!鏒AgSf/V[WJ}hi/5T�)=[ JJiT>7k͛EPSIՖB rrr .X}kD�'@ DB q7RD]Oa<ą(L&XP#G'7)Smؑĉxa!"T>YX�'@@]Dkjp|u"qN0/+eŊ` [ A~ g4V$<8bw2{Z=OyXK@4zٙ -qb hWGPy М۷!?L[ @A@  3,::#dԏ!Å0ÈXYAuNM_?EMtifK,dtIm#&RJ D�R/ BD"*fbGBߴ:a6;onlhs_f,Z N1xsF욒|.^>UZV\]S*Cm�5 ZtjmScgvGKYAo :szoi̬XcIy*y0b 5Oyŀ{?o(/Dd/ :LHD #`ep:$i:ݍ,Ut=D@v$#}3q^ۻk(ꏒTN! Zj8o0BA ň"Xd%Qp)ߴq>v:Pfڻ׭ݟ3Xs[ sj�yLihkoi7lRSQDԔ OARP6<hhhN/:_K]86zi>zj<W|wZKiqEU6ShI[_+R|ALnƾ-~B|{f@P!2H#8tk2+'e!6HV q̣-6W3 `PSPe:~:NnVv^zN*沣te$$x%̜a�QG' `Ⱥd< n5<xcC ;Q6ӒNuKDtJpbkmmimm0aUʹjMi,=#\-mjʃ&Kl� n5W>{, |UdF*zYՐ}(*>~o̗R6C_$?%e 6klamMy/,#;!+^bG_mhe2 B D+T5"8ddf84ZXf/3|aaR5Ԭo cfn"p"eN6d%d䆑W&*072skfh YapBXd[!?RQk;iojD s47ֿnko:/S+򳪊^ԔE}U)?77n^_pɈ֖gKۛAA%ӻ wՒ T헟kmﲒ^1^XwkHU67RbI;|L'+[/Nerέh>E+Ae;/Al֚$g*'QrvqG -2& >ޑuXw}id'۠x7 rJlc5\}%@Db^697$FAC:n8-YIH=X $I55mh\U5'i,#ްoIt( "լ^ bX0VpV@bj*q? C^ x!$A1QkFUQ00w2dkg:si֒SBrARzmO# t]b&-M_GËp8!vD#]*""Qw-}zq_+,3pD. "`JrlSc}cm9pWOA-.$άEɉF>wV_~29E <y "4xή/_q=SxRugeiW7)XJ 5l IM\''EKj-GGĮ8MNpɧJ-p)zNIdyk7'+c6^\Te*OľtzI˵7 [Z茺 4I@^$c}vx<Mfp B>aEwWJ.< @~~A$vߘaC0ÅDCܰMYokP_Sn0!a Aʼn&OtR*.F$I gٴ̆]2NYIRZZLBl#KՀYcvh 鹫]n%a6?cYcu[ Kq"F]ˌc-gFYÇ,;a{V@߶7ADeMI,A<?ZWI-yW)?\(5%5ڜRL=!dYyh)99AFmQ28*=4]^1 젓À-2ķԛH;xm ZS[n[qutQ=;ޘm,`,Z7%s$e7~C9>tz4~XA<_g@~M=f=U4j=(7f)(ҡ B ȿ@B,G<><jD% HB&\2m =% y9o5S 0T>ZwX#'NfFcFȈi3ncT%<=mK�7*J"x�-"Fa 5XYYU]8"ԚҦ:<(n9ýȩUֶ0Wf((nhj/ *(a;fenWk~)Xb嫂H Hc5+;.]ĸ uםsb 򾞫 ̔ 9Mne{mmܞ(6&Ʒ|ľtz=E67rȬOr ͤ7m,:l+`t(/D"y> FH `]Q%zMzp %*2c5dIVN&ݘzvߋAI'o۸g{ް^.Klgڛͳ1-6aE[ehFZ+|fm_tD%fvJCˆ p,쇻` X� ""mA|^Q "V m7b[͹*f^*+e)/ȱ&1Wk)M,g|u s~IJrv.U[(O~ī^rA܅֝&#隔v~eۚ3B 5}@T?"ʯ|Hu}x)-U5 :!@VOP!   "F<Ԩ-O4^w/?[iqW^ؚthkVc':p0\cnѫgrn|/ L4(Y;zʭt7#IG #ס�?aVHI A|ʤU 1:ˌ܉8RS̯v[=`tcI,| $؋˸*{'Ad-RzќBKL k d%Iq]6s-3{,:.<8FLqjWe-94֘ar qŀjߜR|˶uHoe B ȿUxxaC 1W:M 4 ' owoy[3Vޚy@p3Ƭ Y;kbW|Ͷ9<l+;k`E1}IA5M1C+i G *80H Kt #XV@`�G65֕< ":\Y=ҞT|&gގ/G2xFa гT|ķ-Ud'=,(O|`]p *mnr?~xq_(I~*M{١qJg ژj ,KȊNNWpۛ|C>2] "빛@}4T kCĖғNT&~5,tVYYC]}[_;_ȷ2P!_*cqa#-uumTLϴ00e%H;??S}ڮo2=ݛ&+jzѝjd4Vwzx3V9r킇^Ιv*LVr_-c;T�+(H#裙YOg "!GEc- jmOYYOA-fþu5ā)]@f&GQ.AyXwi Qss ybZ6A{tnM)8`()e}H''-i5I 빠ߛtr%ogu|G+xל_|&=-]Ws>tHoe B ȿUX^BIv֌'O;iP)k8]~uCs!+nyp';nm qZ3r0/.֋t}t'h,\8zS􄤤Ykƞ?[DD[Zǖ|替qzjȄ+ bCpXaT ;S$b} ԔR <!.ơM=[K_e!̃Aea6(?-Vɋe&%P!_ 8ARX@mƓ{:'8~J=\Y[XuM-ϗwmC'{0wamg;[7<<T9v<"spõsG)c)7HVi5}U"ðX+b; bz%A�MK}qz}ejVjGܼP "8YO߸v. G--:4zMavg9kLE@ O1"ȒaAV4D5-4eo櫓%>:nLCKLm{a{vqF>ܲ@pplns}MZ4oy]fNukj5"+Z_Ytc31)}l8q0aD9)P쐡X*(%X)~77- rU"lp@؋ז1(7ӘK+6la/>嗷moK嚧 $az0 "@AdDGÇIZw27٪ .lkZxwDءK`>-Zyu):6FfFj &Z& vM]|gnbq?acǝ8rɷ'\}''+I$ bI8) #3+5 +1 '> '6 G&$bDd5` AD y0V[8ЀV~޶/g3v(}ru2LjcDpQk2yʎ^~ stv=XYe繀IsN.3FFL[TLABLNjx;9-;F}6C-^is79eV{$ ) Rb&h3WR4W2)/7DSBpP FDn`@ ,_, c1"0 bCX!@ X"a(v۳<Rpu÷8}>}']Y5XDOaߌq"'.n j<٬hqd68<ZaurR#&"ṠLZ8l[aM\nJ\'.2^^lQA�;B�#,DB >@ qA1XA F�#ie!,f3 Ŋ`BZKܶ_R(y/>4]"Nй5Gn}sr,ݕ3l'*o䢧=NKsD<Nl[j?2A;JBI.ǝ7Ҍ)DUB셗9 0,e7XqFl3lY$ FK^(`I*Ȏ*-f[^[K&E]7 d q3 cgzV H ↈ`G xA<^'25/imNrtcƶwxvu;Os͏{uݨrU\:V>fi2//~va$ٳs/)e8uy<?m {! N৲wOHg aG-EjX1"2GvjDF="dCAiIEBM8wЏK ].4~0 .lw2TG e}֎׵vY<Wб#{szձrv8U=ΛN$/4` "5y"WqnWjgsX+N>S\~nL#eka#֑!#JK%0o_j5  t6YD<%`0 kY,H&&)"!`.ci$7@{˹{1;6o*8?+3\mqS[NW(?bskp[aeƽ7mL=cy/P4F>^=oyϹku|Ŗ-R=WqN櫚4[,$ݞZFz IԆ`%- x` ıj3BҡX yāP+ogKZ4z%IOg1)֟VkbihG'{SYPt6&'J3|C$1kq杵dAj揧ٓgi2$7RÌ*JV&c"+-SJv)S,v0v72R8ni$܂  pADGX#q BFU%4]93?y 1&^=Zh具UteAɟYrޢen1U *cYTVUrZ=')}MV:ग़4ࢧ!KF%* ˆ Q8POGZc1D@x'|}O_>}V [R`ACF&/.v0Tf[ɔUYȒHZqyL7Ng |x=cdl4fŵ^TxidMeC"=\TxowpQ<m;� ΣCD .W;PPHDDzwP<s;;3;fvfQKœOk  ?6h\)zh)/)I:O $?RrrKJ�D�"ϳՕu2:' 6ۑȋXW-cTA޾r^Qx[>GuG)d6g2Jً8~bz yVKw.ۇ eyԾ nFJh8MC/jx*"{dξBEEV Z#^[񨳴+d79:R̀ȢWˍ V7Q FĐ!bG $$ {B){A2*tz?}%O }cx Ϟz{y ڳZ?Ծ_V 53DS:3uAGm?[v>K'saXI'[_5g{V$"x ND,mQ1z~ڟ_5?*0-'<VqTL fBқMRWS6srmk7YKy F+)P"B{U`(@,E} &U!|ĞAR$hlD)v ړf9tp_s5)隘Wl g\IMgBbR/^N > 8Ν2VRaT@2 >Hoad^]sTu' ('U6o0cА>$ڱEa019[o}[[/a]~+\[c>xxd#0v&AsexWLԭcGoƶ�"%3qgc[~toj[^7W@,ˎ Yh!;q6A( +Kc`D0b>!"^LIXJ5ƻ)͚t|2;pk<zoYds`ݡnP^j+5֬;^wH2B%z#=721ܣ5j¤ +F2FkI,G[֗ )aD18qvbAyVX$, w,f먿~s`~IL[,K2rʋsǾys.ڻDj~B~CS%vڣߜ\D Fa팖d_v?)AfKP"; 1҈1H w)=+²ل޲ȜÑd=ɠ e%r̋;RL~)/}9zsooEQ<JKƔӂG�JcϜpNzr rS/=~@ _<0|=\<&7{e^+h *2r:e .2cCRr1q|]mLО"ok~[Ch^5XI YKU'hRljkc%-p FBʺbZzbz$amEtN20X_ 2VDC~%vVQ$YB,ʗM e- 7=_i3KWa2tWp==q ^Wq XC"B0L_?$8'Ov"%)t >#u=)`"ޒ0 Vd];̀2y2 11ͻK uJBKfȪs~"'T}Mtr) =bt\nͽlS ^7@sIi\裷Il59�véxV_ \jK+|^gifyҙhUD1E^T$@\ȑɺ\�F$Ѝ~YOduɅ T jc.&[i." t<?'"? |y"C5I M{".2P+ AX-A}JČŬڐ6d36ši`]Z<\䞁2[ZZw U;e2J^q٪R%eJI׫G-_pC}$UscIz`:]jH`: 1"x ]yC!)T: jkNu@ vM@qNi֎g]< u3UԠ%G.g&71\Jw6 1 n& hLr$O1&;)|f_YKHZZybal TiA~bbI W?ܒʸ;@e9" ʹ9 x\΄?"ZD~'%( 2 rzQ�WÛw޾*(+O=Cw^}CjvYI5EtxUm [cǠ#K[Ė+|dGw">=QF+I(H1Wҷds)~h*⦋oa,4}ږCma[[䞷>uBޏœƭ~<#SVN:IvPuo8\wQH#H`!a!FX̫B0# !JYPX }tfx,�N'O: 2?$G++!fUݛbJޥOept` ׍q%h}={W>N01XF)-ȼ26`z2>Q/?v^3ns( QK)7鋃}yu²wyn‹C>c6iu@sq} 22c|~<r)[XgQ6bVp, ?: P(?LFq ٪IEC??1E*w'42-v!}7ļ/թ2ZN,bI1J{] rʹ 19g?@ހ(:E B‰bı"HXOH\ PHB~Β %fJ nM3ijRjpZk/=mةҶ[t]pk7+֙32uZMGA3A n{xI@:xHL>  60bD1eBM`.Ī6<u4�<vN3|[L^iVNqQH9Qh݂R&>g){^3i(˕ e՛֞L" ׅAcPD>20e^ R�߉Ii-Kϡރi;c8fPѨl1}1*7zl'<¨vƃ}lMRA6;'K.dD޵PQݑxT2IEZP$N/ eI/6B,oϿz:ɷ&kT\ } I*ώՑ1q%φCz;<k!Wk֔eD?4F`s *rl]?zpIeB!g& Q]FY+ljA0 b!H $W#qo; e=줝,{[230qAϙdmFκo2q}N}l#ķ pւ &S*'d-QIAx=|Xt/A"2"Nވv+"@y"27A!歾/S,^$++((x]Hm�Ċg[#�d/:ں5@,*Y>4?2 "ki ct@ИxSsKiy} qw`<MX!ZGAU|}{simE9MsqO|̇:V_ )U3%b~%V;ђw&"e˹ @J,1x@U[( S1O-pVw.j7h,-s2a+27^T(pŵ a4NUVAECv̖]#Օ5 Qx;'uҜ#e-iL싆&w- 9頣JbsXGI2+ȯw-CR6<XDX(bfE+H İqګJ \/.lj aoٺU= Im#a mHXNɵ0/FZ?9RƋD4BeP.K)ħyHORcQ KA^G@ caL-a"ߒҜI!ЍX: kkT~mU'HWOW}+||ܙS%Eg!^Sp=+ hO@$*pb3}<v迤S}?� "?a a/B=$+!!5 <I_d,l(PDYU]%f[)KMk8{#da^R95C-1X,ic@2#�R0m;[[]331^QozY]]2\RRy8w@l-ѮEY.{_ ?\޾+3,}@D c8(/ I09 ц5zkq:X1ju2560RP"u6ۑT]j}qd ̈B6TCIq-Ə !WM--.̇fQP||,g o QR//f6Z퍥 \9x$224r&4LT6uPH] Ah!N< %Ha{D`FHaT1f# k5UⴵtDI8}=Ҷa${O֞oF[u4 +%$1dN2!D}}@n߸.//r| >~H͋Fb^KHHٹyzw7WÔɓ`qF$ʤSKul0e՞"!))'X{^@7lӡO> 4B@[\*@,ڴa=,@f>(" aB8tAj00N\ *@Lh>4@x ^OU*;a}{jN\oéoǐ@1k\F#946QVI@8y'4E ~Z,k+KCC9f9qBݺvтܸ~E\\<=W¼ ttt` @HX+@y!$ᗆ€8Py/E'J ¦  �(!kƈɉTT՗1wP쩳da'iWX#6\ zBJX_1" SL6Z4Ǵ^s.]:w({I{-M|^B8zP o̲2~锭DяB޸r;yLX}g~X;! "Bd W@L(/@ ~8A.pN1!0 CQƹACgROYׯ&VC@v`%1$#!?Hb2^bfNljJifO'Y6C#d"c "l#*->nύ=tgF3 hci8dD @VFa9'9࿇v̟;6m$W/EGf @ KbɌ-)'{~I?}Ol[uqkR2kՊe#_?�D LT#"$0I$+ D59!iiDHO(A/z` )E!EaHCo,$$6Tn.wze^8C!ix/dCHE:/10"k4!JfFuwq4lڿ{]ia@8?l>Ç,-ϝ9`"g*\3Q>󶃒-Κ~@;b*s[,(duu5# � B:d)DQu|V X^PX/ I@Xq+D KczcD@b81u1PH/m뭍tw8`p/Oa;Wa<I\J^HL1DU8dmD6A@V^Z,3iclMݜnXj9w- yy -_h0SAo{d W@LԖ6sW9w N% Rijq(/S] ukV �#DX^5VDHE]xLO!'VPOpOp//`*g[Dz CX)%!y^/-SAH^Hho%$$ e@^QVR,G 26$Y[̛5MX,vmp#}͙PUUq5٣{rrlQ Qcdp*J ܤ nEM(*)xg_O/]@f0"#ˆ aD1,$0L$ $ i#a:2XB'D8HU!ai$/ljAXZ?Dr6 e }eGzd"%/0'CMUjqBB#.?Kbw@ɩ䗑O>>:R?|苧O2Kșƹ ^"5|JPYgY< J^CD^|$Q6\VC@~V<;<}1C"$`$zb! A}p p8;VDJ`D&DCLX, ,VE靗 "^g1kU;mxXZ(ARVRHN<_EY9/#ֵK> E[7,ȑ(Wqc{_IiY#擄O�83%+TAe̅kW$0�D <":Đ? =^ )JxdG�'a` !"QV!/Wk)%?>ǽwsuճ0/wf@}='pq~'<\`.g$\OJkW-%``�@@@@@@�!( a *xHŊ v@,)%rv% {H9�QQX*I >wJRR&܌/Rs%E��mDӓ6NTbԀX^\_]pFANbDbaNqo?_J~f QD� @dD) FDee�"+=ʊakUDZZki(+d[r?&}?$|PSSݱu#v-@(IBX T2|,pA30 6XaK'S 3 b¸NeQvjMμKq똛Q\QD� gQ %Dd3VY 8H+À#Kp B¸kZ}_R 9+Epg&3]0wֺ+2 3.!�@@@@@@�%p$ xB8d/%,d"2|L<�&O��8 X(WA�� À-,,:9 ~-)UiI٩K IM>Ӷ+ I �"�DP, Aǩ )bI*V'%zaV hD�� Ben NIHḏšx<Lxd.KOt. byqAnzҟW@Ӊ@"tXzLHBPA28<O u aZ8!42@>D!,+E@,>s}NZbỳ'<S ͣ b2^ 38#iDXx, XHb Dr$n .b�|';5!6O3ZD\?`끎#8\o�˧\`sғ>D)P'n"kdJ~&9K~zR^G \R7'u@@@@@@@Y0Euc;��"�D �@@@@@@@@@:�Խ; r2B. ܹC A� .z;y̛g5?TZjmMmMu?Wœߺ|�"0`?u 1PUYYOgMuϪUˋeEy%9YE_b�=@%|; ܹW-@,NC@7{P�D`  Eh_$Γ"3@Ǻ3O@}i)6#N=d鼺 VUG毝t:ON�r?*+fΘN M �"5 ԍ]Ƭ򥪱AC_$JVv ޜ P9A鯪:9Zx_W3-|_l`X~mȪ.#z׾H:D''@]Egu9Y3f\xڔɔ? :fVtL4^�D6v=J�ĦF` ԝ{ULU'16]o( 5uDd!v3Q PW c]N�qYNNl"3>;M'qEj9_X}D7cHօPcM΃S!Iv#wV÷rʃv4PVO� dJWƪ -5у\G{Lk%-N[" Fc}w?p>;c7 -{N҆zvR1lkצ2#0{j忨x,#Z͗Ns%)|HK4?j/=Ɵ=Qb^ѫ-Dq|�eFn!85a7ا8p.l|J6Vb&i5Xtim=kck5X1?mcv`NJYxvsuu5{_�8EE/NB[�^x3za~n$s4 6RÖ7f+`_o]%ס&hdhkgs0X?o`序̀xkD-Uƍt2P$:M7gqn -7&NNN?@ "_^{ -S(Y:!;j"5`zRzzJ cD,'sikNxlsp Zw7e:SjсtH&zlgg&]ߢ`hE|�bL,7 (e,< >T52|~Cl`+Gs;.}זn5;[ށ9nښ[J>I,o)L|::$8ki~凜*c1O`e^ڒm? 'C *me&-;Fl<RoQw>ЃIJsk|,դU\F{I+bX\t/CAw;Y "6&lBv+7F3jsbmM ڸwSjaDjV~mh(J~t9T!z^/fQyC[lKJ먙A]s?Q>iN #3xbM:wMb.roW@RCC| 9ZɵM %|VǮ3CqعljS}i" ,WAz"*""ߢ+'D o*i|j"+hU[PN]S-݅G]ɧ65V]ʨ; gd0^!Ut~X^ћ?q^DEzxK`N8봂b4�B(OIwn*n'4%낗3_Zݟ.eS:{+INVW`QTf-;DS R2#c^{ɕ#އߕvH/ךd<7mbbo_lW]m躧<ː{/|WSD3++ #G <l풢+DbВcTX2+ R}:xM^s:M>(k-7% Qv> QGɂG J>m@�j�bN#_v@|lkȧ` 6f-ڌBz~֕aZ SL2jge 10, [j[AvpF+@h՟jgD; 5A ~+/nh�ُKQeC2"7#%Bi< wKL=:}g'T(I]l5Ǽ6愶$6!gڻ7FmӜ]hH8?֣w>N-QAJZ6Vd^Eq>[ؒ{BqgǦ8kp,GTĜm$¯OSC(y-HƈzM&* Ҫ},m_EwKl3if5^zIk̿ )gyr21I=S[}`6#,=/rrh_ `,5-O.d,qʘ=v A%a6{f{Q:>[Aq\~mD3MZ·3~1nɦWgg*ybU|LmnZviD�Q6Č ~{4Z*o]<a c\t |oI* TqnDmc3w! W9: +X6"ª"hĺ-n>%y4r3 ay�"Ku 5ڄM m!7x"Tv@lb=7<dѱVs^dv\IIAa^z'n 3Y9 CJRh<7] }譸2XYˊn1Sw669m)h'gm]箒i$SbCW/äKSC|Ԭ)cٞqx -LJ/Q 8Y(?j}o}NHz}+IElNHW]^EaRYiNa*}</L^Z/5&&suwcE) QN*~1 }ݳcSHҼ'E9Z) 3mDNn4Lq"WST,W*f S, >WV/clMe֛}< {lSČkk7sa_H-Ox&>wd_bj=Fÿ#"pL%hҖڦuB*@ׇ^.U|29ƛJiJhƝvpu9ny˰)2ĬKȯ`yG=v-:Ĭ778֟[ 17L ?y"O)F#lފcy^C_(E[̻᫢7?2,!EFylHW�ȱv_j`0)8!]9m|<oJ&zWL)Ǯ}Eҏ*zBX|9[75MVeKt-y3C'򊓵( ܂,q24vꤻi*FJ},ZQkxP@;$XI3YO|&!J$Q6h9 9QL}ڳu5U #^j1AJ2Z};d-|* W*Iv1jʽ=HSʔI^*cQUy{j\ՆclM%DvbDg5w~ÅQMukoH>c`<CXGnldgoI"*ܯh~T;cӶECt Pi,06OfȀ cטM\uv4/*GޥixӘѲbSCI|�y ɘc 7@/+X>RzUGLw cПaYG!Vi6I*, Vk{35[Ѝ~-!}Fˁ2.g + *OPs5ÀX(@cڗ 8EWND>{hUDq)99]V·8dtFxfln!G&e(sƕ<m=#ghH: B}1 ;R%˹� )ˇzyG _At3㡢0󬛜(2GNW@̹"?s&yCe9îٽ"H !<+?@VmD^>ͽ"9˔M&[߼|H{'3Aj}v3RNx8툝䁆wqUUˑtk85Uq*fCW=9Fw"f*9m]ZG43|hLh�W~g>.s}5F"G2ç`FK-|)Y=9OM@$3H[f3m Ϲc[mHAj Gw{c%Fle 80|ߕ1IܻT}nޛ&|*1%Xi]_*$3'-oYl~Y|c-g=cW NA|!<}I7sJZeD }l>qm7U@Нr;9#o.*,Mildݟ0vuo|_ PdY)gMt)L}:]ShrrvWQ}|c/g%: vENoAd`UMJ~l6aX2͋_e|h!AaxpVSV<v_tخ_ţ` X[C9/FLW~ 柿I>6%pݕt٤l4X]r>wQ_W2Z~Ao ړږ7h;Y|~ ciS)|!jS1ג-h%9*iKZD̢$$w KvVt3=7ԦKf'YO|JC_?Ely2Y)g|D֚q77ZcG;))Ra7Qh٩'@̵q@ղ%]׹,Lr"W8D f95nEjE׍}SܛN�&lV"{7ۑ6 >\L'�Drv{Dox`ބM]EW;HuAa쒼 U~x*z`-Ǧǝ-?6然%5n(D_/ϟwݜEݘw1/Z:@d*sQU='^ "+N"{u٦cã>||`4l;3T`^ǰ+ f"3ً$#vu/I>5oH2Ƭ'+ dD2?R[߿`y l47L*N?M M ~ tKTD #2r|ey {WJ$6w/z1_:g!W V%H~UԸ+}]w1wAq\͌J˚ـmwҪAt@,&gGw$fg؈zQ])1G۪*(ڌܸGMiTd%3~Ș̳0 2s[MlAȧ6愶%7z?Ά _3n֗C yWVqVԥeC,A ecәbNk~s3H&7o'k9@Y† 2hXN>[CVE`wHlE:[[rB;sgٴ|)/G3?ZV+..48KZ&\^_[VZNI~έ.7GUFLA1<3K ʏ=24)H[2os"WSGk$MP][mԸ+=]TgA\ /?InJN ;A!�uQ| H@@/"%/=5팤Cr7?uB� \  _Ģ܌3Q PW c]N�k1Γ"3@Ǻ1 ֗Ew5%ikijYB[S~/W`?#ϝ 5MO:^6X{#]I[So3J g-:&:4F^q\3~\0-baNZ{DkI . B&´S_v@0N٭47ʈ~!zd 7ۛrĆoFtB񝩆F_W pFDK:Nz�ya=/+.٩k_$Γ"3@Ǻ:sub3՟jZǩOG&X;:9KByRsgP[skks 'b+T>Cr\fdQNΧ1d\eC7p9c ٯ/;Ikso:qm;т6c1W@]  R: R٭> fhg4z u*^[WWc5;hǂS-WFQpw4  i<B6Bmh(!匐~D5s;AIr7h0ߜJ$y߯0gH<n1M5 .e/ֺ BCƚꆦ_cY_G<kl`J'y\4yn_ ]Yf3y>>wiUp u & SȻZ6\:jvmŢW0q?#bceL#/zo8rЅ�13K�b}IZWpƲZΓ١{λ.15 MC 7@_A{j\3(=9"dM̑ͱ ff;J%񊶡8=̑4_X[�uk@+~tTP6TdUVẇd4~d~_ckS :<jtyJ3; Q2bb挐5]άO/rÈ *2ա7gL}VZ hsw&v_ƺV"0`og�k6YDu/:$%0ՑCf8_4L=IqO;+[;KaCx͹r봠I*Uڥn&Vn#Z-Bl&mwvۛBO.#i#:V1pi:&$mM-ci_#O@r=#gE]zs㯔g� 0`u@HA9\G?u_�=quK~k UVm%rp^�ިT^n{^ H]j,IО/*s2lťAObuNN6ffӂ 6W֝73:A]Mw2�ĎTJ+ Zgǧv͌o`״HtD£/k5J6k0EIݥrN] 9ף-ʰ$xZ_xm9urPjam*1--j( .|m2h> /񊧃߿y5e@dwib)_}:G* >;o2Ŷlg �"0`�WZçw蘆cq_xuVz&s»wOss\̶Su�QHQuˀHƪ @W! AڄM6zwQDQ{jjk:3 _]M 9]ZBljjrRl ')u.d>W֞v�"�D`�;[t]Q!EӞsjbdGڮl ZcITtxz;xsUŭS./0UA;O9&wl]ood]w^BTҍmuSCe9 c<"S5*3ے4w:We&;t(;-$b=iG~(NjQU:rGfsUqce4] PVubcҤgߺ (؋UO&-G+.J~~Ze6 cՈ�ѢbxUe.R\MM<\ (}c?7NG>?.XfQ}pt'M=/s>Ɯ.mQOvkl9eO{8sZ !Ca,÷':&U�bz*w^en:qwXG^'mmNF7jQp78D95@tE>ͣ2%9>wS? ;% |HXuux= oӳ ݕTåכ|S+ttE7TD,6۴'{}Ic2C} 18* 5S$IO*Xr[լ3�mElw;hy_*mh4 rjn<|Wnٯ j W/R/>FSuܼ͝=`XC�\)o̙~7| [`B(>;?;1?c-ykȭ-j nHWp0ˆ1MWICvS|J??0{u�@ �bcIljЋ!T{)۟m6nk/UMֵ\74^akmi ED?2zgQSHx֦.@%yS).п.yluy<t^9M}˂SԌ@g OSJc7"֨vڌ4MHg[IGȇ] Eo&E~OT,7ӛO"-uy�"ԩygDBMFK. ?^M&"Lz{?hk>֜7mQOvwo8XmM;lc4tn5ڀu<v�uWu@l(I$jDr&Eoc'Tkt?/:4q*8=Ո*Cw)2<(z FSJSqϿbvGbMmCn6\&ʃ/7pz~z#oS- }u""̇h-| R4H Xd45 #O%*Lg=�MEEn> J& EWyj<�Wo諎hEQOA0z9 ,~@yȍƿcyh7x8|3Ǖ<Kewk �q;PwUb>Y.ITm3A1U?C-V7+,g}cӏu"h|K ~S"rYDEsȭZsJ%<@6pm葅IN^73"'UL< Ůbu*j!utlj5)a]J(\=kȏĚO{$^x>WO<Ru9AnD*> 6O[voMRio Ӱu*gžכ񲪉Gut@]e�|CI }Hb&jAJQLRinj7X6H.T?;#H3^8@;OXV3v T2x&32oq؅Hԙt#07蘲w[�TVźk͌lB ~Q0x@" ⟬Q83%dDU*}$> =3)D庼y^{2s<cC\Z+ )bf'H3]6j!Gw(Sm~=6`ưlir; n:4=GsMjFܽMU]~iJՉ=U$g$~I|vettav YN`ƽB*|H)D&8$z< %řJ}R; =3.8GIe|~sI*E?*+kїe25T/6%j vcf~^Fl؅Υb2\Ӧwtݍa7[RvyMnTMU4?'oO'L�~꧉ 2s*cfuVTYfՍ!̈DC{roW/=I{uFkf$궻4Lʗ׏/,%3 Sf_ _|CI~! n2vb "Wx]V5 {ɯxW[.g0X:RP:zuqo7uWu'7�}Eng<Xc�S5ҾEpk3-觧kdo$q~n- Yn9lM?[1-s~hj66?̧ `xe}Wޣui;ch#}Du^ 7\zVy,ah.( 1XEk^YJוF5SUR# ^|3S}\sʲv<&geU_jX5tgO2^g]ZIrUK"0e5,sy{t~5S27ԴDڄƲ[hED"Sƣ-j nJ3`hGc5ʘԜ W"h$瀸  j#o[YPG"o(g eFM~2s4bldS9f9x)7w+9Bur@iI'TJV^_RpoיyПti`i@|Y7FM$94r֐FkS�"0`:? ~Zilw>/]: kGi@1~y@NZxc]ģOY >sjSfּ^[7=%t]wT8yjj樃$2`X@ 0`�k늇&~Z˼3hTG[ʐf?mfE!tCZ/6;}qI=WVqIM 0`� 42 ]L\yȖ4f|MӋt#9 In 5buV覭W [qF7䳫%*k5 |N50e = 0`� V7% 'Yl UFϐ-43 ^C?jUV"7kōl5e˲T,G� �Ķf<6l:1qE j J:祳�+?}f 8{~ 箥Q-D6e.W /@ 0`ujegORbR޳M,Fߡftes&@dU{%zȂËh#%)]Q=g�"S@@�D`�mY5W6*� Im>*b5Othn9!ظ{bd 2 >@ 0`�/ޤ V h`G9˚MfP *!fܛeݏ Qtb$ @ 0`�K�  0�m%@@U�;Ҋ?Wu=XL]@+M:Sɟp}mOtt�@d@@U] ߞ^moK{CDAb+iR3 {Cs=e5t<וf+ã"Y"S6t < l_3nNZi4ᐳxpIIω䑲 [eF4}ufƻ)hDf鱵*n~-K==Ps键g�fuWu!@,0MU.? xzĥm5!OD9yYV\;`Sv`Ug|:,dt%1bin(ԞU'o>%C�QQxc_Mԙr?WP^f+(ֵQQ(|)(kWĢ7gH8lB*B/""( SrvXQp RX(R^TTPCvJB�Ay ݙ73<;3;L_P7!fך _bkA+"qz蹻O%qbg{Ҋޝ/ Ac\%�qLxg)jSk|ts?l+",H f[Me_؝Ot8^w g_!S :[/`k %hQK? terU JZ 36TՍ�<NQFLBB˨rϽyz}uyϔ-nZL? 닚 喀TAE\.Qnr38 Zo3vcC'O8M A^Ug=!'!g%8FpK3MxŇV`Ƅz 7ſh a#% 66b d 9Q}UvIjNĩ!?6e�1#Eں7ؖK'QUMoKhG;l^j?ރ dMI-|^cCmα1I9ʞdD/7&sCџș$bn`ZdRW6+%y/NX"JqY7nA2E)ȨlkozʤK0, ˝_̥>${³<|7^ #hd \y% ]P?U&TG0'Xgea%9V\ +?dbNii nLˎ$"J y\UOGRi[JR6lp\·76r̷홆h!"A3;(Ut߿n↍%�73 wmEpbN^5fJGcZmoD)u.9guvfMꟙMX>֧KM٫ݿ<:؜}݌?TH0< Ϋn+h7L6RI2 (VwjÔtAI~T谘'cDY4$A4UO3a㦇EnEpkI}1X/eA5N( ٰsI~~Cx)Môӑ^{sٍ0q !l5@4WgˬՙS�1pо]qb4TWb%C#=)=$*IzVUjxR?:' W[ gShOGt4OL=_pcN&NRMl`F4TYKÝ;2{SwhɥTD6Bu+rо`lGDX{\mh:摂6Mm(g)ڇ7އjҝF ՚IaX@{`+- Zd >Ҕ^|% J#nҀ8*{ҘC\=XįA}Z.s3k#upQ^T Vcn vG[\9 KD7bD:]k6.ɍ^Db_𐻞heD)]ZplzE6yΞ3�1#@ e2lt1_`N=Ivβ*ߛvѽ#=�'IMf68-v%soO?::3^ޖtx~auy {[ѤҼFoSznu*o=ӓy|{ٿwt~vAQ6eܩbL&&֍}xoy~eքUMw lds;0)fO&$W_GiڢZ9Ili,R) rY$ڜ}iCZ :#N#nü2xġ8\,'ObH([lCn X"$\><| l |[ݫ-6~z9`g"&{LO)/n;"-tДĢC(9yG-1y-#v = e-if%)A߷ۍii::QQX*=umm]:}^oֳP uY.%(f鞉64=8wR6}y[(*"%zwŹj4wa8tDtT_KIou=e;j2s0kո)7 ۔Dދtr6}{IŒ@_ N%9gyWiP�q\\OanPߵDZ3=Y<ʏDS6Ds\%4S_͸%0, f� ] 6J֏xRpD^ |n\@,=bN1=ld@:c s^$rwArY^I$7zA?]7RFTdP$x3GJFFB�'O>3af'>z?_ʙtѧz?G멨ntU7Ujioq&»6ƒ_7F}$ƻ;ݷnaA_O\gg7VZ73-lXIޤA#p._MP[ 9xcӘy |^oTAHK{yě*tsUbG˶#G_,2] !(ك:9.G h+x:^hI&L15Kzmnkwrf%lns#:gR9>KD{" w!(_5ⴝ[Ļ]Ha9 2!"%,&�񫓂5J$vq;)QLʌzq3U�Wq~ 䓦h73�34%ҲEo4i ө7U 49ogՑm^R[r:$K*rTK hA%bCIY񇗠e n\sɉJ#[)!?}-#k>EǓ&6&ϓ|{R|H !Y!C ;hoDEsXdr<bޫ|۶2Lӄ'ܚ7*ׯ &_Ǝ胞2myc2 > [5۹tpFcW=>ЍEY/>-<ƽJh)5pd#w<ܙGAl=ltH z\a[3Hܻelbl*mͯ98S<n(fy:Ƨq35)eLy"k]sљ,2e'AIぶz l=gYV op6Un"A׵[z0u۰7@FJ#\Mu{\Km db_G׳)<_#�"^�"8`㬧LUpͼwOYޱH"fűtYM?!g.Evpwk=hM&@hYٽHs>T=eW\G/~ l#|[I CWC-&"f.(y)!?|Lpvʞh/G7k Lf+:P]6t]EaF_Iq9edխ[2o7:說^ݶM1mVc[0@9[E燨N]dͰmyn Wep2"vP_hiKe;o^⿞emLOL[G>$]_;ud]�MZ wfD%7DoIaWxK.;wөT N]i]-􈓞'w]u}kF _cmY=,r nyܜ-DU Lh՛i+^ J['é-LNt26ۦ6zgaPp?PGĮJqM[p(fRU9掞 Ueб({ʔ9D�"~jD'U)˹q K (3[Q}__.瀻c6Mild'֤kՔ$=m0GJi8 = JƊ =|pt2RQ%/Aq,WX؅p5{:LZ;|v ;x{qtiܟII΄Tؚ Wį|͋B#=L@KNΦp̥3\gZqLM @?jRm4*Q6rVK o^u%x|lء7Eȗ|`okT<w/ @ �qLx3G,miT-= ]o3/NXxuue/oj� @ R<~W@@ �� w5�D ~W M@\ �"�P?䎂@ �"�"@ �D�D�@�� �O|yG}teL]7h]֊bvJ�EH3�DĞ>LA?/){luC4rXun׾ %'P? SrK5Z{FZoe;eK->m "z4sU9U۸+ x_q;� П ݍW=̝8Q{ ˜.v~;q{,LVKn�'ǬQMyXg/߹|x ݓQ6'TsT&O|n…_~ 秮RTgP.2 NV; (=/mw�QPmK$XEKtfm{4c{_t0@qi̊Fؘ%ar]szIw{dfGxv:J^@3tٞ 0r"!DuZk]a#*zmxy/q@ߋ0i_zQ묈[m% 8f~g|ïSq@X&5Q;D[?瀻(`Οs~M,w֌7!+ߌ?~5ΏTzSNc4EI^,�qG4v⫝̸\ާ17="yx_x}Hwgh=Rdy68]Ϗ�A? gj?U%@bw+'8 AV۳vw~(9{RvqkL Ѿ)n'pw_d zcUVCCL}Ha MeOkBcwWpiB0^S[rsIJGDy bwk4ejaEӨ&z</rF�N{yI>fމX\(s{+1ە.56`iB'oJ(+Kێ)'`Fy!l#h+^{ΞhG,o{)_lLM}Ï G4v\PfQOT~|"Ȇ[KGϮ'*nu{-7\y,}Bզwg� ПDsDbWZu` yC †ܙĎ,쁸햫Og4͵> g:AmuA(YOYs{d(/k4 qֈ( F=ڈf2p,8B6Ұ}P|�}lXHs_KM""iU՟uef4?[\(~ 1d:HO%})gH \OA@[io'qsZ݀0o#Ð.1݂fYg뻿4_\l)xiF\�D�mi8[ $󨚁^󯿥pF(} ɰYegIvPtD~磕y]Oi*^lBӵ(]Enw('/kѼTI \!Չ2<m=METo51gS\.ޯ7l I;Cϣ #Õ*;9w)++GWoBH}7(iK;XMukq-O}D^b((")N悂gώhk ̊s\S7hKb*ho� @�CS'dWܩ76z*T=YVpDǜuOz[i+J{نWE9/!s-eRFWFbV1"CE-Asv}p#>4DhY- 6�s}yIPt EOeoڥ?fw}.BqU`9[SZp[672E1Iv7!|Μj[fe,㰃|pޝ @ |-9gY'|x h}B_6|_#t[hK6w=ݠp<1loYUCINs-66H߿o<3 ǫAay8YG 3aG/Γ+vVk肭6JIlxS{b/l>Q_8P!>×{:o6ڝC c xZ$I\V_Sr'lժm~ {/Vj�"�t5ηuMFϤ,-̺7P}dÇHFU JjSCPC۩R- 7XXU"m\%#4Ǹy]r}M7  7rIkZaY. f{Rvjћyu--Տ[A4=J0| %1>9dG7rgj +t_J_lϣsFtc_y՚L_r D;?bM]L,Vۋ$U�Q~QERKqHbO\DF?<R^E𴪾ͳ؝Ͻ6 �@#V&ť l�z~7MV]Yi&X:AUb5zo΅Fގ,9XTm69 ڞ܃*TEÎʜ" ^d, Jqw@܊9Lu篻rH#b�<n(ZĨ;;x.{,lg)k) |,9bp]Mo1O#ޔ0ARW[`sd@+qH8E)%ERUPe ;܈nݞf,Q|h)�"⯣΂0.Z+hIPq`inpug#7�D�' >7E9(3AyDv<UVƫ/IfG%9S#�A' tt }|Kg;}|xo}k  8}KCqp|tRXrRy*wi{_v~ԁF~s}[cMK]USMeۊr�D�@�� �"�A �D  @�  �x@|@ �"@ �"@ �"@ �"@ č �@~aʎYPL⾵>mL6?Rʃ*@D�D�⯧G1:Eױ8Ԛ]mE.eـpRv-u:ŋKsGju^ɿfC_XgT(qfMR|TdgIU%o [v\iib~m#^T\4l �  @ >?>N6 :w;ޝċ.>i{jMQU99Y ۼ͌3$ʇ 9?Q2 9x0nB̮5.2[J'5=y*9Tڼ k=D[�'{Y^P'R㈄O+G)^1+ gEwCN\0 ^ä;!}T[q`@lC[ /p6 !=hjAsƺ!WE1ș$&~F% h7<n0 Ț֫.A\(/lIEք A]2ޟ.4d쥙bXl$dx- BPYiW|!%D8hw~w>* כQ=c5CTL˨ra[ǯ`!C[)Eȁ$7Zwi1*kX?PѸuw6'Z{0 N3X${mtUt񶄊1/@H /WA7DKMI-|^cCmα1I9ʞdD/7&sC0F෵4P8m^ylfhvc%'ev@J-tx eG bQ%{k:v'>yܤ'5 }~t_W'sd>)-ɻÞ,#o.aD# :yEEiAƥRa*uo,d[xRpSnx !wp\ 7WSK@U\pUAtOf>}aKEmk6R͈nw%6_U5vxCǘxv~A /UDu,CIgp{Mp9�A �I+bϪ\É9y֘)!&q )k*%_3dɻ;S;ظcK{:>R̯s.KNGU_�o'u$OX#&[{yF08PHE*bh1T�Q|;guvL0Ovk3󚪯9s,ګkq\CqTq/ &y,ZQ- Wi&d6g.QDxg%q}K=<Ghmȇ<}? L1@�"6Bu5`hAJDX{\mhR?uw7MSR74d&վ㽈hAЯ:\_}=`}"d#!sh{RqF*; ]Sn mt9t7D0#p4ulnWvܒ(m}zhu%Ui@D,*+KD75۔JhuHS/Y+(DM]Ƣ7^gw>i.8 4:@"8)Kr1]X[X7)f)+.T Ox2*"@佺⯦4m:dRT+GZ#@o'lCn �7lD'9Jma�0)fO&h$W\^sݙJvwږi #5n2dOZЂ4 =H,EprN$n:s`+%S812mO l�Dy({� � ݼ89Hw?rcA^R$-JuC/ 9ȳ/$4�(Ҟ60,٫*w3& > uAU3Ō6:6UM9UefSL>~Z| ̊˓VDfU="~OQ3Z6^ш煮5_^_[=ISe-%%G Kt\ӣ:^ :H @�!W]a!Z'3=ђLј2swېݚ>J#Fݬ83Tކ^$CAhhp4"3UV^?!4m--ɸhr9ogՑm&,QC؋v])~Q|fa3 W'k"9/f=H8%c ]T^śj}2 J+*ߍU#NXZ Dc]9|2eᕷxsۋ ~Jz˯@GDo鬢k/7q4g{r-[)x({� �$!b]α…ZtE7ǷTi\LMFS^l\tf9Lej>a'6Hos3pIlЅFjo(wcEmVq{Sхz )֫` W(Ƕ r;Riyz<V?P:D~y A,1kW"7p\٩ɺ*#te^9[Xzˆ1']K?՜A`^1@q@@�AbjAt  (S[}{Loa{l@�AT!/@ �@@ �@@ �@@ ��@ D � Bɀ@ hvge*?,}<A �D  @� @@�A  @ ��@/"OF%]֊bvJ0{k/*h<s%<<lI& GߠB!�A[}暨)!b~Z01mʞ�[:i}cI]|DBa~a@ij{y; ٕ3?|n ((9p}eʿ !K) yT@ApG2nd@;Ug1&Y0!:DڷPud2cMϾ"&6�A �mvGF3%=aY};EI᝸&;%zD~7vbN *#͕52גlw}ӭ2%֝ԡ]WD�Vni(𤅱^*/{{;vaƾkؤHD %}=4 2�"�"� /6q r@h)4ږH,h�> ۵ۣrХ#MFtz~Loitw'xB:1H{|g{N4h.=j{m�{;R%_ ]6s8x AG>tG/1F�4z.;":6lUӍP-x{œB�*?{gj w[PcN:Y /,wИgΑ\*,Jz`JA9N10nTrg4v@)~wC}v}@َ}^ g:+VqFy#D>4ǭӰRC\1q߾Y1׈)]԰ 9W #Mh{0޶lu͕QnRa<>Ս-ʰ5~Ł!ݝT�"#BrIn7px:[mn2֞]D-T8;@t:ߗK|ؖZ[rÕGj/d\mr]` ecaOMO<QeuY94tOٗ\<|Q輿>nITviœ+!ڈ֦"ą{?ʒy|pǟNG =?AxZ5{ |4e/ql#S�9ӗ.}<y%֋T<)r7- tՅN2ߔPR[WPlxl{qgkgqO[.g `jqu}uiػM!߾w=r)m}5&dxB@ddp6>V9\ϲʍ5U`q,ax/E ?:[> X@*\|!oFخ1=o{n*$z]H\賜f]b ɡt$?=xJ3H3K-Jk?",#F9+t`AI j%mvѳ3IO}+gdFImXc2phsn0481%L[h \)H@d.;^ ϸJųbwn�"}qfI믁/ "a 298B6$Q4^Mby7i16Y>,-'1qV(ҜcͻXWs^ qG`_K&mdE:[PuԌ2l}�@�'Ib16Pt6kK+۾I# TV&HC)|4:oWzNSbs0YSGOYdNEnQGd́KFlȆ=Of26'|/5j$1@SA 0\3�_g.NN, EQnw>z+}_(t7- +9dǡ獎 WPl OP;%߻^MAHsxsRU{oblз=-5r~?/1 9Cwd/*hD|G;تs;j5|3+.QsMpa�@(#N1KIo>mE6bͺT:쫭ңH+U)N;FD{َW2Y Mgr#܃~:gK֍(z`'wjThY j0,gKJ 4mď <@O +tz0wn"}!)[&zdvH/P})rK\.{;8[/?Cj's ާ ~VDŽ9}#%{o497\/t5 Xa=:�A � 5mD4dGt6Ptٿ"6QDw'J [~cs9kj4)Q***=hvdwoxOgAf O�0u/倊7PΡ]cI1?VfT)vgѫB@LvR&^M11VJbSS בB&Ju// zy|ZCݵіxb] a`Ï TD3+5.wZμmC_/-x�DĞW9ԢmHck;K&#Lg J_f](ܘC^GClLTM0, ~}('iU}ݛgY;7{M4˛8o6"\,y{K*tE{UHvh>b%q,Ln \P]+; Iє?dx(3.5ѥ5Tc/::/B5 qn /n_R{wg:[u/Rҩ@p+m%X3_N8z3K4^ TB4%5 5f5 P8l⃥_DPwEde o&Tՠ$4q~jB�1 _{[@W*2`94p'."LW�"Gdɩ6h? cg]~}COoOGs.4(<4< bPӌ%Zӣm7= mpణ67EYrNn L*hyÙi?&7̻V|Fr=Cr>CmoŇQPנ=0I3]rTkߺlqVcmnd\JhߵPL0lW>"b.ùvmn ( S֞^k) Ys6s[s ]Eڄ |рpa^2A^X?.e"W FcҾ}Zue%LcXWeOBRb "^R9�SK-;AM�D_Qa\|sBmaU 41TFyxЯ؝ @�=n$X3HOK搣%aG.qadzqYemmvT35_#A� �⟨O|iB21g⇜-Tᬤ4wv @�  @�  @�  @�  @S߁@ 4u @  @  @  @  +j,&!;5&*�D�D7ĶW61=\1Ut5Ǖ4Bc5/gWz[iфa`lbYsuɿfC# y�ī?;D)͑LI5ndz5MX5<LUޜe+ycD],[„3tU5}VL��%ƵNqfH�"<*d']@7o{6MQU99Y ۼ͌3K\!@�'cY^P'R㈄O+T PFbWV>D^[2^יN#"ܥ0F- "Y^'6y'h5,  OG(q|�D�DhjL17_I!6CYDOJX)#=,m5 {5(  ;Z6&Ot8^&^\x$V}$Yϭo7a GE81IerUq)퍅JJlE-_ i~ eTp,_{?2Pn_xǥ�$8U,{cj\a&C؈>2ޟ1ңD}bs78:)@OEKc '@6CKJWe7I=^!xܬF+Yf^uўHq9m-" [ Z[ BؔT5Al=7&)YYٓdnhV@DmMb\tNj|ES$ y%3I+*J 2.ܐQ�WqU <y^|-5 ȀSR>fR>U&sd>)-ɻÞl9 KD!N^s7 ewzE20ÒҜ PNgIb[ўiF�+bDjң3;(U7Mܰĩz� @" =?hJP[9J2ʒZ1I榬ޖ|yx9, 2-]X{˝I d\7("Yݜ^:; D^1K";0} DXDahOZX*xL^Ep #&T<;K/gRGtk<\su9Ue3Vi L)aZHN Ffܰb -[ 2 Vh ,@$ 4 ޤ2W# v4z9S3"KyiҝB6DI3t Dl?6MXN:]Qs'3(1ieK;^Kޘ3$}h̑y5p{b@DkC\=xJ% !w=vB5uhA8,߻)z� @0CɎWO1ĺ$75GNUW\[V55dUܓP  %*BYH-c& Djh'b8#M1VT+8La.6g_AD)2lysscRazWDelsV%ZoQTy3y<[�D~I%T%qbI Z/׿H`!z`WzĂG) hg_oyu,8cMd#sqK"gwRS8ߍQ4@T(1l4J H+a2/K"L~ģS̒W~ցhIf-4<Z�D7D^󼜜g}؈^X زҨyT5<}ϑg6da;rbhXN?A BWq:W񦪺\*RyhU S$ k߅Ҋw|Ոv>T~$ tVQI5Td<* *L~uR&BbvQYiу[Ž?1w,q|vNLw67T'47E9ZrqؤKt2j4'BnPM�抽Ҧ?.3DuUǽQvӸl1K&R\ȅrߵ7w֥ nsStf9Lej>a qL,nyz<VuP: V!X@y݋7:Ls_6͍"n } a&CKi| SNk-5~l*ak`y^U?zT{tٍJ}L<w%j{K.{#x� 1 @ �"@ �"@ �"@ �"@ �"@ �"@ �";]``````S�AIĂ @M@&󷂁M@&#)iMUwE~  �@,eWgY[ZZqudOCaYc%]؃uv؛h E/z_q �@$e,C155>/6ʞ6Qv%-2l<iv]s㠡C&tXl7a}hY0dƮ#{F{ვXGB շ]s9Ii.'mL~EM@DnTw)C% !_.Vv;sUՕ,TZ6=2VȏMœ3>(V\*pv[/r0J/+QT8OSR]R8d(YJ*sfDg%,6TW%͟ h=crB (]kM l y`sml=ðKű" ZAȺR֏9s<oHǽ&n[Dv# Hڭ f (8ra˄u'10hIc02%O c=}omZ-'2!!lYd:vuo{0zse2WWTqBUr)8a, ×Ske t2Y׶<`A}&FF\>HV8OSAX|cm]-mG=*rK/\s]#qZWDMVxq SDri~0gB�"4)pU\^bm]M^Լ]:d_Uw~~O_FK&-5%0滽0EƳ˳ď}HޠFR,8ޗL=/{7_ˎRB*jaBglRe:ӰQ oEõLrAOҌ_!~u_@(!Qk不&m$d;=؃5[MDJTOlD{ h©_aXbLԐc4[Plld|(Ϙ#; 4f#5QQZt( _:-}܍}�mxZ0qKuu&SW^3R^/pµ9 0S=|7_nk=ViM10'7_!YvDʺ#2`[H&848-β 4O}NH ǭ==hy 9ژfi1~(<9 m0+j�@|&eDV̬O [Z=^{+jc׳^5&:ۂ@ 9j)t_B.Bd0L_*WWa|?-ݠúB<prXT߳5& r! o,)=0HAh&KGX:aQ3zb֗JF̖ygKvnF3 et\ [}]JZw?ImC\_ԯ^Hۏ35(ʐhnIuUf-^J`sc BpܽB"2#WL CK e3Y45k KcFV%Cq)p/HP8zou;A46dk3]ۧ +E9x噽xe-uڏP! .h7p'ZUDJܟ[8K c#ښ0_ `nE|mze8sŊ@�AIk[[[*(/-+y[]֊&}yKWM*f cOtuDeg*9 eCRw,RI3wVaDݳStZ[2u.9kD4[(g+Ϻ_}5J-mL oB칹{azJ.q9s=楛Md2*n۽hG+)\[za:}/SD}pq=ۮ^4 Zk]ѦʎR"y&:{c@s0@] fxិ3ho]bFV;:c2Ʉf;Bt ) 3?pxYe2@Ƚ ~C)foM=_Lu9@`x6Q5K_]|~]ifTe=i㰕 Nה=p'ZAt@b.u+RE!q<*Aͼ8sMg̲ivTKQg4;v"ܢ)�Dhr�qM܀b{;Iu5v~qɳCn٫~ezoQC |G"]L�Qη٩{ϛCVrf%v<kgGTi^8$+ЖK؟ΨiDkR HC\?m>=98i\\STeXaS"<w遈طxLBMuv$9缋ͷ!=~b_w=Gkm1vdS,dt/!Ь?X4!T ↁ jDut#3HW㳃Kr7\qT&9 7M2m''2/!2bg\Ǎ(Y&.ĕ7,\NQ2�GpEYXԹ%(u0NQH5k8C*V4>Kc.=D`eG\+j@&JY]&;::*߼yuu7lߓ}}!L}<f0/h<X!D~rOH^I6Mx&< ƬIuQr=ߗuB=㟏ծݐH'ahuB`sh:)K/T4KOs ;ÿHQ7ʾ3^"`#[3꜅YկTdxb=ZO}!8̴T(ԅ4Ja} ՙDve @&fĿLS%빵o=" 3cěKF,.J4Ӓ$9, qvrr)UJIX,"mө@Q-Ow[N8l3GU, 0nQHeBtgES=YK15R55Ð\5N� @wHY˝'n >P߽U'OeݙG"[פ/tز"Ux=O<h[tf!Dߦ $OmgIחuƐh=}b+ח:$7EjYE;;yd&b>l?>=R'9&vNύ$Rпr9|CqtC3Ƅ@0H"OO>ߗOh[T}VJ|hkdD % fE`0fvV:P?/"Xڥ@q)t/HPD,򮳁_ϛ#Ge@q;KP y2t_b䗧Te-Y?1@4mWvL|/:B&\ix%[RfxN#:3 I^RYRR1OYE@�A�@){ܜ>^h5Mu_BS0>E&! 3=g3iۮ­ۢ._czIM@3Un EDE^緗݋ٝ?uv>'z§6Lk%.3�+}ˏv-^x}&!]?{cR( UBU RTDE,(^ bWb4 *])"(Eo6 "4&3g<;3w{v"T#K[ budۂ[Y hg_mǿr_1!͵J'ފk_vI|eD)x/[C,=N)!. \JΜnj^Imv _# %'V ; cFVE/$u?;S|t2PoC+.XM2.(p[ؚnc]2ח kTxE{}X5Q!R][+v}4V^e4a]�=/6}Spyt_lkޡhS=Lrƭn79J@Hn{Wt "85}S*ܠ*x>yFVEwlUS! �[1~֙w/w:>^}gOD֍x⥐cA!\e^õu;f[׾Z' % MI<{_̳:MG=:ז0T#*R ۡN[OzvH:hknRX9¥9f qg٪tKڻ߶ŭw2h:k_v_ Ag< '7o-8dKك0G]OP&4MX(S]\+W~ٯE8' pcF2>ܞfB *km3. x:d`7q-\8錍E_ܙJ9(]QAfn(bZf5D0UO=O8"#zy[LBKc 6Sa<tۚ8sal߃4%qG-jXvj�~ ĭz?-ޓoOl[N %]La[wu+QwF| `zA"L'oRU{dԭ&bcAmې"�A~zn<)YKǔ` mA#` 6`o@bll-"�Aq 6` eA"a 6`o@wb3����= �"���� �"���� �"���� �"���� �"��Sxɂ2T[qS&G1�Hy! G1퍕j+=etwmӑ <�x'PWDՌ{.8oF1;VH@ NF !nl2e9Wa-=?3g"�LQAlʻH<k`~oSvDv[Px|jFjRDf>cpNnSz8 qѐo(^|:"ν?q&D�ȫ8.QHdY ']UVWr" /7d_5'j[V?Q_!d7AZ`iJ Ysk"\HQ1^q4C 9DNy3ʐ܆!Ҝ]L$n{4(Nx}&|GֵoPD�X^du褏-CD՚pDɨCBZcnlRǼJ87ufVڥ!Q7ۓD\-G7r9ulbyi낓JJYB3P{ /:SYA|~Ôu4Tl]@| q8/J FDyyiQF�SQyewl]ƪ;͔YG2F7V-@Fi̹ਢ3K/޲DSDhHc@]R, <){ ǫ y3ck@H|`P%S6 A^M Rx5$StFQ9iA`* "-W+u>$D^3xΗ'Vk*{ 1 ` "N`2P%}ەn 8�ApjOCq2&"J<ԩg]y<7HfCWeYDd'l$)Ts �0%kܩ](K-BqН`F;;rJyi+FGTCY^s]{tm3,₈hUeGi ѕᦘ <1B]Q IjNð!PAT^Q �Q9'x*iHo8D�KTƜ Ge=zE7dPAAC_Dy9e\HwI587 L^-FJ<C FA`"n:jwY F}4 $1-3-)"'V7f5V2D44qxTMl?{h!2TD% dc+g1KJ^_[My=Oz檢zzɗ:|Y{ NNn<MHN{Y!^,`{ku6?Aț[AXzij[W_C* �W "?դ^)xMǘx=R%9STϼ``&Fsu2gyJMD@/ Əmh;T}m>Ё^]iC knp/@'_er6 m֝‘3 חkg)ʙ0}Mν]�Ez#x "����� ������ ������ ������ ������ ������ ������ �0ij���K3D��A����D��A����D��A����D��A����D��ABWYleHMD(Lw-+.Idk*eW~M?鬧 &&s( ĶڈiY_s䢁])э=5N>sD01ͯ>0G) 14mZs;F-ޝy,gR].}1'Ciۥ׵?~ $*ƵsOã|2=U9WA쮺nA1Vեk-}~d =]Kc:؊d/[6 >jMH'=lcYʹDDH&v^SyRETUeIhU~{鑜Vᦞq7U6cizGOXCՏt "}/6 ��(D|!ŵOやKZ[ZZ\zӄB+:߭pKE\2C]ǒrc6vW-&DN#>-֊>^J4q2^tёwf*N ;b֎qޮbw-[<A v`OF4<z[T{u%D+6*9{eX5_O;Q-SԮ%*K 㭯%mY-s6t7Kuه{$DiQ8!)t N)(oS`݂ �b '}WHР%?#<M~?KB8l|o3WsNB~ϫ2L 2nWt/3kٌ3X"H6wYmɽcE@fyYןJxQWЂHoBR_B.svg$v~WK)k:۳~cFoHfko~wUlK$XKYW7vk(js~ B}:9bĮKVWsVnىsZs;i`$Iskf~IXBM;"aŒn͍BtvUK`Iΰ8T0;xy"c-52Ea_d:\ꪺXYa]wfg|S5օ-M'CƿʣT٧L1cq1[K~s{IA` 6D{%8cp ̅p o|b޺ 9sFYd=٭ 43쮾+U"ؽz"ng_WV2fu~M١jQ皪¸KjY=ä+i̲—앑9' ;Dt#Y}Ȓ,,%o|/hvt"uki$O؇ʆƚh)1oRknZ!$hHks~VGY-EWW0Y|rM:}щ Vˌ JxWd e\<lhrq7,~#C&ttn7 =US1h7 bv,=\Q*C*Vz %3c9rcVU^)jH8dlSq/mDg݆k̒|9*=T"�LMA|~Ƴ䬏ٯuBJG=Zy!תdsK\qw5O<,㭷֞{ Htįi/X*'u} 2S^w]s˚mKjAޑ& 7$~ܒO1~v TV)/| c~:ڳAs#.g[aXbW`IJ#ߘu]zk'~x2 b8 犓:uBE,x; bÚbIj^[s2cvDYGY:ctXw]d CUWutLpoz 6?>k%BGsny~0U}:kȊoLVlgqDeի>QD Gޫ_ Dd.8LAv_zr7?D nT+*L+enRrx–mY۵VRs[VM%y$({œ$"Ah?8c˖K6u /?. $C=gݘ3q5EP(̊Ek70.=MҘ<+N{-/Ź'2ux!�rXt5$p.&Jt~[P܏7^jM쥯铭Uv2/8i.8Of 1"n ׂ:ea;|rOq#R_pW;}MX � CD)k#F;Tm՚E&xA̳hw<[>]iAtS+œ$,l{G GR;rI 4 u$AЁ 1K;Q03KvÝbA]W,vb/v)-~$s{1ĉ (8+Sw2Scb2 / b{? (NjA@*k$7gkFb|̮h "D_)OA� 'w:Z Ub_KƿF v|Q]l)zNw=PI<smkxȧq7lIWח s-S+vr")Z'󯮪6$Rq[i聊}#}_a7jw[f'҅~xSC sM%J3qD37Rّhq$]+!*uwhmzd _zG,= }ѩ'q4.A3F /BAa"}[n1k]A榤(/k,}Uk}W_簵2 K}! ꪘ)CЇTw0EX^[%7)WMzHeO;!Q A+g(M ֌TKھoCm v^< ӈsΕv>2~k|,bf'=8aks`W,z-wZ_VCFн$U$2?H1[[*mŽkkTWA3Ўh-wE_^5SB| lffegT' Ǜev7v\6X]O}:2%%̴g'4%U]--Cv:MɎg{uԽ>RtK̮Dx � aʚy eD M4f8copj?jAVV1\xK> /(~yxnayy|pړIMæޖ,5嘾pl^sݛ[)AR=2B׳qㆫ`tĆv?.} VXyl|E~Ww1?vyxI+G~4$`,}9W9AkͿnLy qD~?9n-XצjjZx!hb*  Y<ns enفeN' peAz^daDM(hg.t%"kpxֻ (Di/D I[fknɮ �0Qb��LVqw b`���� ���Ge�/0 ���L �yE3�����W=�����0 ��� �5x����@`n$r ����3����)fb���@A����DD�)e֩T*j}y]7Yp@++MP}Joa"s4("�L)fvѣ}ZDA'jv3D-3E!*~4Kם^4)<屇7G|k~rTژU$g⛋4 8b+jwmP`aXM~88Yy3ٹ|Eݷ~XS\Q鎛NG6& F&xy sN?'?oX# 0D�)?w MRk_nwlhdBr܃uǦ1uJW߼&.wc|5q݈ p}oY# 281G63bw}F˟T& *c(s({SYYMM\ɿ2OQ5mAIWO AeCHDhjd�M <܍F&  s] Jg'.Tz1Ga=:�.5d_5 -_N9IQI4~D YzdCN�#*gVW./STT%R?'uQHGV]T8_P7[}:B0Rc=M TIc.sz6,0.b5S27a`b5]-\ &hV<883A3ٔmIBp! )ilLH(ojiZ>B#؃X "j@?G}e`=pw",NdI-qDqFKjFq JnLk_081q_ xBww4.egnCDDDZ2|Cx@n|-TCS5,9R"�L)fy+y `K'CRs ?o6%3'ՉHQ /cX!ntefnŋ:S Ңn],f "9ŷ(+~*p|~ VD)Gg;keQEVF0TwL,HHS]r)G.89 SfW#at/$CQ̫XIS[ߠ8~1̸ѝ$YMTnqckF7-X<B3 J{>sU!8~l?˩c=/Z %yXs mC,|A;:ޕ"O׾Dac 6/)D v&-SbO |4o@q##0~ϣ ~Mj:J6ڗ?%V6]U4@`O1/ʘDjx b=U~_wӻ+{'];StF!̋~)"a۫бqC|mEZ e&yEwv3/c眘E )a1.bȶ1 9M锰5ͼ4*n3uȋë& $">u!9߅6'ne{<x "mMT0#iWZbOgh!F21-1ΚD7\)rխ<K+汯qaXO^^ockyy>} f A=8�kHo^CFhY^`r9fQ]*`7"�DBK?먪b:D\p9_^Xe=0eS+e$^UuUE'l$)5%X?ߨA^4;ϜxXOg瑴}bk$QEODdA`e J+܈ɫa,'=_SЁ'K[U>]A@\dmDQQ?I[b)d5- _A$+y0BJ+>V1Db%o!Zݐ^ GU\)rխ<K +汯qaX?CH{m3C?7}D/# 0.V]U53Ry [-:REæ D�S̼N4\O!TGTCY^s]{teרu)/S1~82AlUn&;!DUУ*Ū^NUvTȉ]]ɕYujuVd='螑JS�PDsxD궑 N] AZ'SZgSdGŜ D. Jnk_vA䠘8|^K ƬC4S[] < wD `w^uֲ )aeKCS`ç D�S̼ '@|%WX%ېGྨ0P%3,gCM1׋l)* QEE@TvLtr+HwUUwqʡS͜OWz~w]UDWO�UKG~FO]=s\3Ť>3GĜ2lΨR3h4(!"C<$-Oe7>TxْAr)f]))q=R{Y4L/M9'g#ռfIA=LD1Ϥvҝ^FT; D�S̜׷<5#ԬOuƜKimɩ7B>5!$3?1-N}UA1/=Dy(jVDlF4{)?-R!覓_X0>kz|AlnM / QEVF"*O)d漍zFVO݋b佾F8{MvP6_+/a H–:CWIc]6?sn}GQ3œi+FF3)ꙫڲ%_+8:~uz>Z~Lf?SڡZ«O;nCFhv;/>ILLK9)x͍! 7r 2 '2q}`<ė[^KJ]6cE6lu3nyi'^u u \[yÕWיɑ@`O1W=rjC xwd}:{<5y;^!Fsu2gyJMڐօ"ޮEp ]m0^sCNylR#5[.-VޜJ=ABX_TTMnF KƏmh2R "D3MIװwR/JpCT_Vҍ0 ,|ߟyy\H~LRq{*=*ՐW.եv1fPs/d'(hǕOn`v?{ӥ_s6nuJ p½R"Sڗ( ^c\AM"uq!-aսZKCLQFzMj "qe"sl,|}!-y,xE;}E7 D�SS�ܠ_{[ w&׏ι?A+eWʸF&0Q�AI><U H/,R`|*b,@~NG?tc)<RF~cd ��S̀»ltUD �\)�"�3���� �L1����"�3���� �L1����"�L)f���/�Ab���@A ���DD�)f�����0(b���@A�㊂%ݵ(f˻dGWYleHM7T0n5 kR~<ȏ54-ƅp4ٰP`s dĿdGу=NFʂnXNۨGnd/$aR2ޝy,g[wu .ˉKOã|2=U)Ohi]y<~-*>?BKmƢmآtW[ %U󾵴w!Mp9g? uuZ6 vz WĜXgk"8KӶKk )Ϊd3ˑ>dc,H - ---.M =iB@hnAdtܲh3Ķ*)̎ ZzAۋ.ؓͥuu%D+6z 겸!KXZ̊:7bwKEaPWed\ߘ}ϓOۋ.:R،Oىa'Yڑ�a-[]uYxCB6{k.@%![L!i6?γ|}MXKڇ?M=>ߏߝ+Z[F]6IyuׯIͭm.՜Uzۆ΢3|a,6~Mٞ$lC$M7t‰޽0bz>Zδj1Bi ;+d%ze7gz}Wv"P1BkпhZꨌ_fK=#D=`fUlK$XK{t}cULaCPQf/^dF:심F@A)"s[ą$I w=d޺ 9sFYd=d [He&ꌣVii_zB2QP]S}Ў|5A7HfE$)E{aqY|rM:}:zZg#%Y=8]< PXS0"D;6iY$W<lhn\͠.o&{۪_N`eFo4hshfYecȜC}]`WU]|(ڇV=+X5eGk N/>ZqFrCOߴBH< «(&.Hy=c*)-#Lz ĉ?Gm/ gAB8A[ V%3cՒnx {/Tu+{—(3[3?'.;hka?В9qӑoLw{Z[.= GRdV!ʎ'ޠqgB)hn]8P,x; Jj%[ފUyՂoC|4 0mٻhR& *'׈v} 2S^wJ!D FrCў2N,wĩ(&,Լ^zdS'=DD`ަ >QWͷ-}AS x/I=e9m`We4A,WO]{8ؖU?ƻQoI {+ Npڲwi呜^"9~_)/-ߖJ *+?. $C=glV(LkKr2h ̭JO9bOW~wϵHK2#xGW1j-k }HX B2A8 GFpD܊n2b*\@=HgwI ""0E/b,;8O'U,GBK/7Cjw"5}&M奄:t8v +"aiF#QuPY8v4(-~$2ҡ]H7tɫiAD$AЁ 1Kڋ!ޱFHK_L1pYh^A `#yV-C1-+D+$'#�Sx{ m#8L1ݰq+J:`C sΗK{?AqAA O1ԅUWlj~2+t%_#Dgya(KwW[JI^}9d7\b$1Ŝ/9Ō)5!+ ktEbN-Lhh ϕ(>eJ{(7Ak\j/'™B_UA<@ ̿X:!iDhZ]{ۚ+^f90yYrT)f [;ZA^fɹIW Z_‡T*JfM f1Sd*֮+D$G@A)"Cr_@ |B3JE&DѻH_=}rkn7QG~}[ *YUC*\TH`~9,zH J[q ўPljtS{%I W秣3H日p 2̀4TKھoCm v^< ӈsΕv%~1Hֲ=~_\5_3%DW9sS2'"]ҵL]^qT0>o_NSw%l" m kkk&vi0s&1t;*YNzp[j2bR!YYY'UdB'=DD�q" nm/XjXklO1Li=?VK k^Zt3?wTC)wps+x괝_k%wc f `O8R~4$ȬnlU!D7ǖ葉7\S̝eϠ1\1s% /~r\[pLqմ.񨏼N_a`knrnlmñv}oLuW ۬==AnfpIJck3(eodf1e~nѶS#Lz �" K[CɈߧUrf&iލ*�72pI�@}]?x9לTսySl_KðZ6 l@�'=D��AHY $S4[ `HmC��AqA�D�����A�D�����A�A����D)D{����+jp7���"� ����"� ����"� ����"� ����"� P_51^:V`C} ,�L�@flw4u*)SE=f`«qΔ%72HVB29tm#Jk$Vp r ΛQ1-=?33VCaFtda*t M�@%iʻH<k`'(9^}}V܍ qLKV͹zý,Ed?rSZE>+-AB[]͛2OQ5mAIW+Pܦ&B7^ ��("<*NK8 +j>3@K'͆ ޶4ih+Gp;^sY%Wc=MIp1bsNQ-Φ<XNglK'Ms^w1=p[.մz2Ag1QYIgrٲ] M: MFK ~2*+/l 8fO'Tpk"\Hc6%1Zba)b$<`%dE$XȒdWqeylYz˳9+#ӀjcB=f)E*"�LIA_N:tǖBjY~8@A6#gUܓvdHTjnaͦd$~N/nOM=X.Z\'畔0<cb6f6QQĩDQ /cX!ntefNI*aw{;P}xA�A6daoB$䞛b}5c^z-y(5 -OneC|̈́̂4%9Ì rd3̊o-QVT&340~.BZcB/~Z[bԼ¼[W#/-G7r95eQ^)i)"�LEAݱE#Sn4SBflP 6z"f27/,YEkS\-K,lA3`Cꂐ!6Y{ ia\/ھOw\yɒ%VIۦ!tyq|b "" ?+b켳f-!?jh})8ܿrsb&;BA ~)+ֻ mI[S0e(<#*\SeWL9+ܯ)i+"�LEA~e T ȷ]C < ژ|:_*s큉eZ|,]cMTu35[6DIv1yuI[b)ސ4 W<27)2V]e5 5I+ſ w58g#UVٙomCX~#NhE\{m:D%5c7>}4YGF&XaQ(63F' 7l$)/#Dθ ^@`JN1DS%r'K-BqQs~_AWsRE|,gqxuj›ؚhO,9Srb.FWʬVIgDzJAf4 FT{nM;bU)q< Dڮ{MGlh7 eistPsP1 qM1aL1eqqrwupG�SR9'x*2iHoD.ae܆=zEY 2Gb⧴ EGwg8xEgT˫|N'gI}gDq2#:'n3bϳ�AZ 47Aj%QsxT2x -Ϣ6De`Ns6 s*L1QAl3C*M8۲S_3pciH �0%[S[w5}λ,Ʉc[(|䚿tTuTMf^`-QW@e~,){}m6qMRL[Q-Yc#%39l/ĝjtX<+'x:#,@%'ѲF_6Lۊ hÍ'`}D"*O)d漍z{~#W=sUQ[v=KyeGr"餬d,xZJ= 6dfĴ̴Þ^r+"6h#K=M}bl#g\~MqWH N@`j "?դ^'X{2}=,1۫?uGWL7hNҵ=[IPM"/{7 T}mLvoj$ { 3ddF#bJUd8HeeY�Ud jʾ#%\CPFN _s9vC˼榑6.\Kʰ8Qo9^]iCu$Cѣ,5BnRbI,h?=R/9SԈ?-7{ `Pt=-q5]M#OXEA*Diʋr,ESv inP< �⟺gזsTzV�&ALW H/,R`|*bO,�""� hw*fdY�B^LC"&.cy<� �"���� �"����  ����� ��� �"=���03D��A����D��A����D��A����D��A����D��At&[t!~inIoݵ(f˻d,?HkC(\X'CW$&T {" ��8>,m%A̯TJn깕3U{Vt }͑~FBF([P̯UuM>b~噞* uBN>QkF:aS_w'wKjyoΈv"-+i} ;t.#G]񮮩|q)+bN5PTiۥ׵?@A�*BR]{o Ulϟ^_p#&r҇HKBsKK sbCz[hEއuܲh3P zd((oIoWW ˉt7J׏jTuER|uITL{EG B ;1:Y;2@A` v0voeP;%7"R2גB]!He&h%aRfY.f{c=ɝ40`5ڇYF]6{^=(cJ{}: !J9#Ä;+pRW%se9Qve)L%VÎ!8kڛ_:ݕ B}"d10+|1l25~]hm$oPWw骸bN2(VIi+_68n=+#GmɽcEIy둗u]y ..E VAR#]حx !OC N݋]}5]r[wՍ$N_�A Ǎp"RZDYt܄`rxe0PBqk}U˽2?TƝ^BWs}b[$W~9'{A7HfE$)Eepv%-L:JuUo{L X}Xgə[R6il~}*x>8=a|M d#ɬʛn Xj5G =RUu͒d|)4ľo^t8?iq\A ?x8DO4hshfYecȜZ. ܴBH< kyZx$c<EU݀<TOy⭇Ahýܨj>oZ`�A0UyŜ0mWB6 ߌQN2cL;o5ZUgCGӓ%LyF^%S@nvFߐ"L-hӆؕģ?zk]sZi??ef }XG1aeX ՗W  |#X=CV>f%Mow=x>`c_ȜpSV^.\(U.)oYCIև⸂(+yD-oEUyՂ#LkťAlG~S';4< -8q5"_od[/ζ4tMKul3D��AT x߇]jڮ5H{8, Lz}##k"Q'ٕ`2hލjos ~ۖU$^.` re[X3PWe)O (kϙo*[~ +fOP-$6 im [e!2xQa2 Sknڐ kj:+Iة8 }<[M%qMܭd{G5gAmyZX+%9>%O|%Swמbq� P5 " z4F;Tm՚E&p~Heyb\m[V-ʲ}$P܇2] DZADw$AЁ 1K;"ȜtdžYᣩ 6V:O y?jؑ4q&koے ۛ_{ mp[G|E«.y!h^;"S)f3nCBAsL\~:28T0|Oա{Ʊ+oXM{DD�q !=(!eޞ{ T_Ȯlo@^! _o=|Yrt,HL~өv,(D;cN3]XR3c DS}L.ԎlgjRZnqA 9_vZb픞b[5aC Z_,)7vk^C)fx&$Qwvy^}9dAA@;=-{k"{_P\>]sw UieE ż榤(/k7q,kkk&vi':GZ9l6sxUڊ{ n90]!|9M=s{__ǗlDϔ]tt }Bz5nFsk,W# u<,C*ov;.NXM6Ҕ6D CoAd5SIGH?xQY$g#.긃C*C l}md,f3;IoknB?QdffegT' o? 73AA@�ߢgrɺ)X'{Q6f8copĻ|;k^_i.\odR?3,Rc`>]CZ/S$1t+v}oL8OR]' )eϠ@v?GjHAīN>}O2q9"x=AdvHFES{Ur#?kqAr 'x:DoK΍MJplmFk%[_[Y䱵񋲷_yS߉4>'8ݞU#|$߫k3D����(]-ˏwb("� ���/}]?x9לTս& �"���0#e2L}k&� ������ ������ ������ ������U����@�����@�����@�����@�����@'M/092s /YPfaCAx < l�D��A^mfvG*G?~{G! ,]w^xU4]pތbv. 8DIb͙ ΈQTl˽RkcVUboGf eeg`M"8<fϜsN'?oX �DyɻH<k`%y>+M\Djn#"0\̼JK|आFW& r2Fz}oYcڗ]9r8 C~ȼdEќG1ܛNDhjd�hTm2""�8O:{ꊨO ++/l ڱ> )jȾmkL:j[V˷Ƅ*�̎=89K =fTO)G4J[%bY }&i YzNNxE rDjd~霽?Q_!d7I[ωF]R$;F*P9mF8`9->AB =|:WRSA#P?\"y s鰡LxZ P97/8a/(ޜ]L$x �☨_N:tǖBjY~8b [Q8P\U5s+}*;n&|`? p.K'CRs ?o6%3'a "+(*GITe\)^@ݞ\/=zLUc]L5t rO& [Vبh8/<50/-b6^xEpJ!W>楇RY#[*nr<^}}tDƎZiAۡ|CeF4f6QQĩD~pee8͹ " 7 gOO3ؙB#%Ğn*hހ ℽxjvel+7č"pA�qLs[F*025=N3%d֑ bs]*bXb<pvΉYTLV Dښ(cur5 :- sV; :[LdAD$X'Vcto)nD(E}%Q;FSvY3Obh^15VR_[Vb{ɑDʣ1 $Ԁ*VCsM[υ3H B7F?ې<]9Qly8l^ocq`\D|((x6Ɠ&@A�q,p?߲Ak0 ^}-k AYՉ>,//O2QVD?ٜ*"j Ye;& &Pz *<`Ab?<N+68 *lHGiIP( ߦA!@@f2ggfWT$!`4g{SDnJZvj+;06joH Fx0N,l6hCJE N],["PHDEt3FU b&8`a$vTWs2 zԕ-4-1eIh)G ;twZn$c޲0VDU`o̓ꈄS֚ B?/%OeotX �Ⱘt%#&SDKC'U쥗sZ 5g] =9)Ng2XU=M*~PuICnt(Jm>u08%f *«ODu҂8rn|F.F]Ӊ(+A%L=:7Pn7CSJsfFt,SL#0#MvԥiIrWe "fb� Â0p6iRg78px+xUP1{ o r[#d [ v#-Oyh| +0eVIl]ͻd^/ږ&< IZ. gi )$`KP\&}DŒ4<>A4V>fp?A�Q^d.ﮉ |ϖ;=Է}pcn8ڜ?ne3"z_ʨ=V؀tD!6V>tQp' 6&a›#9%洄SޖFGE}u-&Yu2nR1Y%637M*"j1hy)T'ƦÚyR)e^ZBA(NDIVŕ.VP&*V2/:f4T1j9 "f؃ �U=Ϩ-yT8q4 l.:zTck3n$:~gVhSȭI<lL̍"XS�~8>Q|Oq[pZ _ʼk $[ 2N17kSi ϫ1+)G`#3z&b'5- { V" *\$'kJc^111æw!G|"F؃ �"0\1^zo|:���D��A騆겂3j ���"� Qd!Ay����@�����@�����@�����@�����~\A���p� ������ ������ ������ ������ 㑎SUJ?BYwj_WQ7'7a4 `u3"� jSYi4>B5/8v(݈ b7Gc뻆S^w v bOkckGX%v@udždX!Ӵ/MвpXs2=x74z?Dd:y}x@ nGFD]  c7;L,ܰGXCa^Vҳ#84|5mwt(&UI:ӍHr!ZpPzz|)-Jeo-o2ByUXsC5 RSN<lUU8#N[l|t6 H qQEFPT<xV(~Arn-�Aab8/0+Q H^?Lz~≏:Z[zFXK'Qxij;Ň.N69'ۜa{Yk#m+ <ׂʟԛuGGw_!)'htꫥܶ좵]@f[QIߗoݍ)g,h:Bn,/Axt|jh38\Iy߸.J J}SE2s+oD{nIm"j@DKւ{wSO;_k:dAsix5u*"AlK#-ygԉZHr\~W6Pqn$<Uv60Z I7;7`wj*uUǞWVj96M0882"� G+-2OY:j(]S5ӷ mM-{yrUڳv7nG~SQ]A+NQ5x_uc )?dGiKP]р*i+{қe"*vűڻ; 4wuUɑwd\˷xQw⦷8JnZ~g:?]u\5pٕG{maGKJ;!(!Y<]{.jCTQRT۵|nYg1*2he5Pp)\)G+(ɦԒG"S}!Z^/h&޷ל4c@A\ ) X$CV6ZIXȴ=:ݜڞo~^Y<4 @� C4Б zFF5@l+k8YݳQo:;yk6#9]!-TͶ<a .̓&M1S7%IOJ5źkiC?AnL-Du^K~9>ԥyВ@kuhFKΪk3Uv|ܒhJ bkΉّ|YScF-o_KJJ~.*+XjUkIZSw Kag7'"=E &7d22ؖuy*o (C~{')a*P\2gH/U5Tw6h2yiJ7)} �fK.:-Z&FH$Eʦm:6u[(UGeojx\j<~{hc\tϭ[NS[KA$􍔭gg5{N~S,c"%}H 2.{I+ Q6P5e%uaQG?=w"i M[Rh?뭢dART۵`TA\A|e ]_^]>B!:ҜE[e(UovĔ6d]Z򠾣f`Ad IDzIC{/212,`Jl`VzͷsHFs\ yiJ3Ŭ� SB9U%@?ξW/}=TZ=R6byN,Av8[i֜Y*^ Jn*Tp\{MZR.\0ZɩWQ5,WL\: b~S,aU%fw \V592}[ ~k/<6:eM)K\fq+)QF |$,%Ydd ɸIsDˆ+vD WVf96M|̍"� *:sQX "<<2# oyDqC7oQOEԖ.9hZ|ӌ@[c;#XETD$꺷&1zr^aFv& ޺ؐ^tҲpGY8 EmJݤS[b.1c~S,aU$~|@e5: ȂUguzw[bݟQz~P6|$;At.1Q;12<AT" $(^C3>SVJ~ĻZΣ#Jo_ ��8,xMQAv~yY&xMǸ4D}˪JbCqC;v/=D{ٗ5{!b7|yF0׷pdG_{wYg]$[OKqj]Q@{QraU]]Ezg>tHtOQĊ;C{s2l| _Ft )nZR q~v6:"^@O ;:F>^U&o*%*)MV^-SWw TV]0:{2^TDOzxl62je3e/ʹIE�ܦ6ޘ.!ߚSv.o0@]M* " +D| I8yv ? *V#.Ji_ ��8voO17(QAUVXi 6Z}<o}=_\l{Ds-om~!Z$<z[-ZDU͉Fѡ %71TヌJ"FP_Rrީ-1DL&v5 St m֞:X][J]=F=x7oҏy{rׂHoDv4\t5%k#w PV LsaAw3*^lKIl~v2l'otY܈Q$[ED<j`Jcn$+JD4@Wż-msCJ/D/D��A~F:NM"Lc�NK7Mmn( ��@qEOS֝ؼvuna2qJuU.33p(��@q6J<8F/}iLr=͗UB x@�����@�����@�����@�����@`b#����@�����@�����@�����@�����@�ǣ:UC#fefXg]!M>0E7S&ߗ~DߩFmTp* �~RAdڠHBpzbj9} )F.;ο(9A}"<gsh,:_?[NٳÛ|"l54S3n(}u.AJ{-LNYL[2%\Vֽ?WCb䓼ZDn\Jб/ĩ'ʟxNA_5�A�D,8̂D  š% *o22Ғ߼ 8jC4dՍAa^fTtn6qI1v$i$㽉,zJ=@B4G'$F^ie?Gq~ Eh+(ᖅ/u �[bfk=*o2gZjWnuNy)}UnKe'eySᥢ5Bfa_kCO6Y?<Gz(قJ@^r-FC)D9llN[HrXIXΗ?bxR?qe"]Vda˨p&)imx(Kz}+ϘThil -蚲*MjlIDCeI +V"FY˞:K}Ml-޸3N'[l+5?s"ŘDïM?aoJ.ڮT*ԥtL'Z9iT| \t;8�V;ip}6OPYck&"� 6di{^wV6r*<ijۯzGM~HQ_t:(Ygum.=v+Ӕ#\AqEEd]tkb}vr=g2K0#otIv 3X:)ҏdUcȭXAX�vy-@ 0+1nqhe"N]a 5+lFgUCA-LY<B\>kYn',㰙5 ܾy 6aѝ25sٱ%M"U;o'wΠb[qeFv;?0Zwxbv^vR䵀' #c}ykd%]<.:h%-fDu3ǫ9T۳/ U`qtlUQ+x2d_"Xq[՝+w � b]ڟf8gٜ`Uý2M& .jx~9Z8QU=FeqZO!o�YK8Xԝ񲆍mdet,^1 FJ>6k)? L.q1Em)!IA#bhi2Vf`J5sٱ!l&va ;^Yob[ԸbNRGTpG-z&y.+pWkx'%<_A}{YL1?w@AD&7Qw[d"tvCɤ t � "+a 1wEEyqӕhG|.㩍HcWZ6hTҩ _H7JEBT Wl4;ڠ) ĞR/NmAEA_): ir oȖS(GŊݤ"LT&0cдDRJkLYZYA$X8+nh/+r.-yMLi-j\N6jopG/z.}~wkݾ\U < 2ѐ3]pZsAHq} b|8�]jj{`mu]_Y|#Y8;:` �? VG{ WzG9k]1ڬk8F;YGo&-ke'�7+#rGC H ̯#MdepO"2 "tndF*C)UO=4FMܫmbX\K-𗘉XbƌU,AnbQI۸7Dk/yuQ'3}mp^ "oeƒbirDM*wGsȦ\\J;<3-MՍt �S "2b%o{>X9[E«:GuDST�Tk.wYS,=DqV3]kmQ\b#ce[j艫Fv~L.ꚫrW$w7h82]ЕBq Kۄ<ZlykY "oE4SDt-rnJmmOJߤRXK̘M ^l9QĬk\XT^b[mBgPxbXy| h|6 "JE0$$Sx3z=u<FMD�SD& mbHO}}? h,<NS驏v\f=3!":yO֠:cq̠嚈\Ad%;pVt(u*]#Ȟ`+)%oR#cf[h?\jһӝ9{,]+9v]=Q\_Ekm49ŭ|8GeDʤ7CRVH̭֥4Q:\EMҲYb07M$8rWdR 6Z=LED(;.܏IJM> Vbߤ .TUM7Sp s豍ٸ2#r#"ZK>HIkkHӭ=cmwyKdЏ2 Hx |MEAL?W*2`s^{"p喅. M. m O,pkְ{< .=t2Ufv8[;5iV+}{MK&ރ?ᜭP\8x5M ϫs.H,\H.If@$'W؅\Zld:F)޸:Tm^Cos&1 17t]g'Qhv4#D:keqO=(ӂ:X&w ne ?Xf)zxk|w̭wwG,ڗF-5/VSK?6 k3n$:~gVhSzqH'-b!)s"sxƟHLBӐs E/%&"�7�#s8L~Y;l6fO LFm`�� ^"q$FQvWs!2"JJ /6@���b]˺ODE ������ ������ ������ ������ �0^J���"� ����"� ����"� ����"� ����"� G:ّ.u@Q�ÌG-bįhoNnjg] T"�}d]A/Wt i|2Ej2m_pRP=hl}HHOGHeU|NG[KT~O ; T,l,/UAaDn7vWcC ǕIɉpi+E,x^;ή~uZRh#j]A!�Ʀ VJDׇ,8¢ 󲒞q!!cZ !"K|&d? <U1K YVdiJm8 iC^gg9PDMH ˆ"4lW"aq, bGYʴ=y˵3.onaɊ>nAA1.Bfd CDʸ}4aEǯO|,yZk/6F֞4=Ajv^x՜c}rAQrv QI5+A 3`\uf\(j}Lܑ3Y)E@UNMg&*>MxT]z^Sk^i˦!:q[Z  Z^2䩭(x\ *Nou:O?Ǻ&h`K '%' 41嬛 bwX7@iA&+XqUxZOBfPVƬ ϊA�D4 BrcvCu۽wS*^\Dp Ay*L]!9vG29Ҡ%D8JnZ~g҈n UscBpz‘k6A`$O+R_{|\@G+(ɦԒG"S}A(dQKIa+{қOaB{L +»| EwXJUUg]}F]j+Rq*B^huwDj N+v#ݭV> 㴢A�qD[[ &JuvX]k<e:^ La51+zBࡩ)Mfn>b&򧧋p{mNG?sys{:koNhc Nw;* dIZSބw Ka_ou4>U0{to2Su<VN4Tv|%}7]jw \qeaP~i>0 ?x)BU:'m㳢A�qdKZTlJۦHcy5lB0fϩo*y -)[}ꕅD+ Oԗ|&3 de jU'lg߭b Q9/w/.lfiN<VoXm/VׂTD̤E8ap{2޿MZ`!,YϝHmT�F]*NMفfxA/v!F>_:ӃҟʸhD��A%@Ph,kv秢0;ch\%frjbd'(#7f"%rŖ19i7&K k>qA(g09bĉr ;-v|kNެMY_j('>1"*đ@vwICroM1U8&�(C~{Wd񹾚lM:WїÊA�đI yk'Iuo%v*bK9K\_}{e=7‡~ַnR vV_z+}K',Iw+Uv8D }"1d *ؖd}\.T bIɉxO-dʙ6E- E'-K̃j89ɺDF Ok=3kU4"�TqC1yfNnaMsׇ,‡d'鷚etNC񾬺4+6?£ªSy@μF>^U&,$-D{os 2zY ^^ IunR1^Vo&o);[zzZJ7 .b_X2:{2^TDOzxl62je[duo=-šuD/>ESʫes?6wbbV,)@mt_3D;M*(!ŭ==_KCWj!T�HIfq1?ӫ}U f8N+�~pAPrz}ؗb<moP؃۫l)3xl}g{s̩ dsܼ=̌{4ׂ̝-ar/Z:n H|5)F[rfNU wED<j`XbЃfT.5ٞؼo+V9v5:T 4\t5%=FVP)&%%2XniWs 2EfEOKQ �J 4ީXʼn b:+H6kup]w˞e_cӊA\:NM"LR E���� ?S֝ؼvuna2qJX���A�ğY?%M#u4&Ԃ�� �"���� �"���� �"���� �"���� H ̂����D��A����D��A����D��A����D��A����D��A.ڐ&l9r򈮁LSϒh}!33vet�~JAdڠHBpzbj9} )F.;ο(S&?gA{3P=q'y[NsKM[N)б *6NŔQ O)fAZCS0:bc7/Yuc[c!?$D~xtbJblDV[QQiu,iI1a 5(wܔ"�K케Yx GauU}0eKIaefd!d$;Swϳ2�a_kC_&,_}-iu.'Gi"v[.;a㘙Dʞ:R|I29SO?g5B&hLr8ci,W+Kj8`8v}Z})/xd־:iv螅j4V|şؑYwYdH}PQh nEmޗ|>Ȫ|15KzPfN� "vӖN YT$Jrd canAj7�? 6di{^̎sY!$燕+ĬwA,m51A(<.<KI{uwDgUg"㮮!n]tkb}vr=g2Kv .++x)UmMBq^7omBŔQ".HUeۉtz3(ٹ zkⲋiaV-~!,Sƕ=iȤwYڔ<2j_v5r*<ijۯzGM~HQ_t-/Dge<9⨎Wj-V`>lu: T<h/ VV}up"L9`cQicSCYk$!r+#VP4?Aw,&6׫~l"�X=䎸晻:bu6ؕj+AdxAR}LeА}ڊ8$~6-^pg Sv]Xp;Ue |Ղ["؛ZODf ;^Xj{ )&1"1~::U]*RX茈eZhmY/EDݐyl2yVpKf'- +`眳m ڤ&nrk]c{n<14b[>p >FL%p_(ͬ[ȕBq}Tɕ8E;]$;c�? v?zWTW?]vr%]ֺ^Si`&N.z_N<N0-=ĿZ):WvWuibjNU;,U/$)4؛y'VEo"^.&Sf"!*+^y]ÅazH hoצUuČF1+NfW|*7r1B秚/t[]GWu++HJ5̜@| KXěݶ% [`9{+NE1=Md$e7  D�:S|};bvY+!ީqg6D{hiFUK ο<4X  C#u'OTD0PE&-|{s6#‰(XX%7WGn ^Q0L\|kYFm*</[yu:Yҿ PlߘC6=b"VIhiC30sicՎh'U~ QԱԼ"01< � "2b%o{>XܙwgXVǀ8 tk<AD;n[gϑ\bEFO.\%fc}"~/|(\OSz{> ([DuM*kS}u.g^YM}u'Ĝ{?qk\V(slyB)K.$J@N0É$x?颮JEry(K5O$ղI +0'2aNp[`1%=m@73D8 }3W璵 wAn::An6Y%637M*2= s; Z`ؙDvՅ*VޡI{f n`8q+:^T:p.~ґ KEv0fÎ cRb#zM)<b/9ڜ?ne3"z_ʨ]w7\yt:bgr-f`2KA- ]@D$@fN 8(XM3T=Q\_EkSIޤ2%#=-!*pT<qq"�. K / -(#{ tE|M ֚D2U m`xx5|M ϫ(K&d mJ_j=([*XK9,//P˪{ބm8g5t߇M'yiAvm*</s>pg4[زN?̧ymrF#3 !,ǿɪ!>CJ79P i$`44=nlUqXDq[ppWD�oRA}a. PG��� Pf' Ay%yafrׅ:�DD��AYdꎺOD� �"����� ����""� ��� ����� H " ���0N3D��A����D��A����D��A����D��A����D��A#tV_#Y](SI?1/6PADuU:JN!Wu-kAC7%eTR\~껕OR ��84؉N$ %rWd>ҋ d۾Za/}{|.D�#fKilHց NFx_,SNjJ0ڻ Ffy}`oN-'QιZ G^YnN54/cEX6~_+l&I b^gA p:"21yG)�@4RL1p-43 ȔS u؃=($Ǽg!G-peiHyr C 0f>"O:Q^ Ef^6 =IgPQ, ̜˩5qA쬏3YE&Z .8ʜARrscB=s߻ Yy6OUA h ~l*⢊L9VD��A _s|p ;stp+M) eh.ީG\n DS r[SK{GrzfCv7 {RѿZB7-eb**(t?#AжZ}s X̴E]*T~u% [!nʺi%CjL"hK?\F^2C^좵]@fEㇷͣ4 7!omEZPSzӿHĀ-B ιZS+jNcѥ~V:*8;B ɸ͸PWchOd⎤>6PqnzkVD��AܔÀlTJʒC/_ ԩ/LF88zѻ^Glqډ6?o7T{72ET {ʠg車ں;U08b<ؚ3Uh1ZRUd<M#;E+6딍W%.ha ORwlߨ;qRO%7t|-BSZʷVaq9);& 7K-B b\N ,䆧!NsYPaKpBp1 !8=H~*TğZA�qEA˵Em|poo=4~#oMJY jhiyOXZ8wޙK~*eR+au9>&X]c^%x YlA쬺69Aj Nw{Z`>NDSMIX9?OoJ]uo-i VӛhK!Ib5f}0[DA9vt^koJ;'"fGenۭI"\})#'?~ �Pn6%n]Nu LA "@ N>#\D#Eof-Zol# oK%mN=gg5{N~Sa9fgي n&idb bKmآ�@P_vm/\/C 2לCeOdӯ0DɢKZ f5z}Kj|\ED̜cךO$W{uDgUXEğZA�q(3BW!=9¯`Xd/1 dWMn調14տT?rp N=W"[3'J "o9:?Ņ\7 !2Ǧ Ls&MWѱ vNf jb小 lCe]OBKDiŖpZz5'o֦#[W~DcךO9dau`B\*sLs,1:8~c\bw]+" #Ğ&c[pD/[wXbfޚ�ɎXL{ >6 O5L}mΪ`[rKguzw),ƐH{>FRBy:L-Lj8/Bh_ [1nw"$Q^αkMOMNOk;y7\&+8܌ ݤ}oRu "pX8(<Xl I*,͊<2WN2¢7VsL𘛡 "B4Y{5Ȕcy7m!x_V]Urڿ{QraU]]Ezg>]*c|0+.k<Bەe5)MV^-Y6+M*f^*_U&԰|J OQĊF{sq|duo=-šuDM$n(7rjMIU1 ]=-qizzlqcn?9),xex)17ZAqȌ>:UScG_l<xޠDу(Dc7}݅ÞGҮ뚫|5Yw\<ǜ|.1*tf)mD4\t5%a<&F[Xd3Q2OC>F +^~\=9d<QEi&YvwQUskt&1pD9oî5.NxOuĒ'GWϠDv S ^=_ rS7uT/9*?X (_X�3#R(CD8�AA�`cŸ3LKED^p p �� "����X_fV6TYf1⅒k��� z&8?ڥ3G sBS���_AQ Y{!1ھvuvģۘgwoWAɏA���Ƶ vwwuwvvvttu}mcsS珜ύ&n'NYq`[kKG[[V8{|i;X]V%? mf����0~/<KSs/NmUQʪ( T9r8.ɃS��� * mm-pāoA��� ,m_6c$%] ���1A=V5WK跮+SQc$h ���1s)S&0*PA,+Οdif'8F/PߥvAd]!M>0Vϒh}Ά`\3:8^E UGjhyD@c1 K[4mXFyخv{]uG8FHGmXePcV٥Ϗg vbq<t bdz_9eo(sY(8zqn: 21ؓAOHƌAxTȫGnMƭKtP7v㘉vs_gs5^(f }^Vr+.X!/% L=ٗ؝ k5ӆW% uĆV8-qzꮁ SNf KSt1Sكq: &]Y=m_[C N/q^TZV%DN%d⋴7l oZ0{c7/YrSԳ7$Yɉ|^,"#> ߒ2z˩ Aĩ9K:.REv=R&&;aGhG"Z<u5q(V\iLE"]G(ľ~[B%IAW0 O }MM:^{MtȪnjM o\\ W[4}Ƚ|][TZ|~cY꾿-)$|R俳ﱾoƆ} RA}X]ՎZ)qΘjv2hXDVw _#^aD{!%9C'ԅǵc {{(ׇj 6-&71鼇)kRR0.+;tb _3)b첨=V+j ϙz*SU&]Ȭk.1#6]fɋ *y:v}2z5mnyͦ_G 4|&eU#+~iF߰Maσh5= MV+O*督HU/$l|RqaS|RbJF_նpI Pp1ݟʜ[ 5'm L,lW;MY&Wh.E:,a@P]e~<O^xrTϪ{ڑιbE|]_[yGciPC-K"C aqtJ^\ TYTD \{ le<D#[zQ\eW\[c<{5*Br~XOQ;YXa3g.dمAu0'uOuRi0/L{ɒH[oh-;<1;/;)Z†!]h%` WO' .*E?׃Ӎ dVb?2)}%ve[DeRQ6q!J ɃhiTDyԬ_}בZ![([NQ}:UŅO,Ag#(Ygum.=v+24e 溇-xPmϾ> 2M be[3h,:̯UKDoYceT.Ҳ#ssZt^`\(%-mͳ4^xNVz!.^Eȸ㈣nzBO+ '弓+7b|/?(yqAT.PA|DO5P"&LEgꄓn&x"v?+mf&[m2˯^78>VƜYaAo켗=dױ3o$$Q(1z +IKj2rgv?AyZ%sSXMgK޵1Íy䉛_4*$}iJ]~?vJ`5 Bq g^zM64byvp!<DjE r].#bV։ج]G2Zq ɃhAUApcɳXGNKB;m GVşQĖ[\Y#|b"V>m񺛣ޱ[ׅ@Gj@a/͠ξBϽ<xA bh*}VH ΆwG-q]W4?Ym/ܲDBr.1 D\ (eYMyp>HtcV]Xl z <2;8==&'2Mܲȥĝu1){euKqTJ^B ?ץNbLDJ . gN]vQ\F TcYQ#0l/>IUM n^伽o0Eb*+ڊSfV=^$ߦ%G3C0`=NJ<O }[UjU#;?ОdпD4n۷[7jop*CpdD=T| g"!*+^y]=i5 rEMX}q՜",%ᐙE('2V"Vlv}Mqu%|GM:`nW^q%/bCYj6NEo/$ib "DwuD)k!CDl ʈzT|J(䵗.n.3wD2;֒4vU9W1 D\^K{E *K^=}v}XS=v- F2K︑~9) b5iL\risw6zGfN=T'dm|AXXX1kָ{XZV]נ?&&z~[|#ךc&f OùW RϹbƗ5٧&~Q=^Tu{X#<?4O9Uh38ubW.@~3( |i; oM ":VED:ZU HgF.#WD0OV[ 5yvutvHtđ(˝K&&IOx@E5QV]^Jf'?qOOv8&ͯ:;kIe Tϴ+Iv%Lꅧ\?&<.ٯ}|p|(*_>q,<97lC!hpo-~wVH9\A~o(m'ؓ7J$,{P𝿑/#Q Fʟ@~'=_(.aό? ~1?RST?8hگZ[TNx0/גcu11Zqӂ”#7{FdI‡8āGɊɾ ޯe'JκQƬ}߿9Ffn?,ho$: HǺj䔤dʲ%.˜x޴NV]Z\3ɵ?վ;1\pڄ_ )0[}M\ _2+Hk" mJ>eok 88@ĚyTq7Rxu *uqZzRڋvn8U޽4Ԕ@jEwFc`A<,sux}j*џ+b~, Ti%, W| ~t9 #67/~unXo2djr8nΩ7?Bvo\u8{$ )|1  6sw;PA$_)|$&{R+eF^fs~Y7eo<ؚP)W, }a_׶kYwu]u*6TlXEDC IQw& @&u_\ə3ϙδa?ѢA4J 3 Y.XYydiΓɥo_Ex0L]]zDF]'v|bA)B c0΁6[òn5M !F+{7xW?h���0&hzb O4OJ J @W_y$KJ.^%N&?U {m~M&���`4о4/ &(su V%n޾Hh7 %ߋy~De>BS/$h|ۆA5EU���٦Gn yDD bNnvAaeHy&B6wo^kS67-Q..$6ݷuo����aREƺׯd(2u ]A'cǶ+~X|ɆR>A66Կ~L]mMNj"QdCCvy�Гٽm�|A je6yϛWc Xe@W_!|kh#y]N}P_LTS�_H&� ¤Q;!p>wĈ|VWG! )"'67kHY/o^>n.$A5QJ&/T�aZHv؎aW.G *X. j&IRaNzRRL\"l.$!jR)%B�"@:H5�_&%./>l躟($6;Q.T]A7i(R*j;C�iRM�i V>,-4qºQCe"GAwGuj % mvRP���#cR®^YS+"_^y!P`}:"}'6H߰Q(���#cZعT3 *kAܲYA!e$D߽qg@{T?I���Fä3?rIE%qK ï =ux/A!ub+W!A{TCSc9Eybn~ol2���aRHқ̔ćܺjTAT .qvZx i*#o\>{t2��ȝS@gBU1؂������ �������"������������� ������ ������J+D<9t *|"X����0ATD lgy� Vh�����LBbiI}hCݛԤGׂdB6����� E3u6{*W7�����FAĹ} @ +4�����&$66ԽZ~wB$�A����M׊F h�����SׯVHA4D�����LN6VhH +2K#TIa#���� ^ Ɔ7T><6LAMg*0EE˫a/K(IdHAz>V޽-kس'6w ���|鈒5lSRA76di 1e{y?3P_$;)b<#dw lxt4Bj\AJ 85ax_HOWLDˁ?/ąx5TcV;xߓtODo\ D𱂈K666|x56ԣ 5]^Gx+f)`w�@]뀵~Yz)ά׾'"|V֒"Sm1Кl3hNY,G/yo͈ݷEF { ~]8u٘c9$m]$=kwG*8} 8T8{)om XErȀZPZق4uHbυ/Rm-HV+R bJ>g[Y͹)8>|X]qgtHAl_~9i=-| wz_ Y|siFZZ0o.2 ��|8)$5vso4&8kиY1fA̶Yu(,:w+vVցq6A_dȥqqq-ar=Ay~Ǒ~Uu]5^pD(>nn6/ o&;b[A`MV<jq�Ja67,qJM=Rk_T1bkxڅChat/&mRE[]s5ՄQ'ݜQFΩH^1RD"ξadM(Wh M NO4Q U DB_=C0uzGyo6yrzlh+ Upv[W+*,[ad2��)5% fӎ' 򲨥sJUs.bާ9Yt"WDWV:/hvq3w!4a*5L4WƵ̽<<6?OG[Za/ETs矘`9p[J*o-[Qo:$ogO=L-LAo8NgܣaFu$8|,>wƖmO1S (h)R*(pr[pɂp,^+jakbEEwŔp'7l(xe<fobu帴—?g Akd\ѱX^[AS[S%k|:6X\]^#84 G<y/=+WKy7$5c"j{D|x5U<}˫ϹӇxIHhZQ턟C⟳O#}{H DX0mGZʓ4JPM;h3JlaR!(f�mo*rPpN Jbf?:368A�(7sXSє7x noki<?#/M8&+0=fPx} |\:3%l56tD5uCBey{DT-e̵”;V{Ⱉt"]*BgѬGT[qTNsVn1Gs|[8)N'"2÷O"Q=*ʫu GtuԪǞ]9{~xԓoID]COmr"EJqETZMO*bvZݚiMXc<J퓓-}Uj٣J:i3tfvF[{\̯})sτmͫjT ^ŃCp_%Faj =j:jAV+OԂ(P+κ!Aq!A?hff_PժK)`tA>j^Tm7]qi*ec<NU .=p+J �`<a.42%W-WPO%v{e8 LX))Aӂ[#ҥêrRM9Ǜ9or>>5>NjXybE_5ym:l?HVUy-Bmtjuch⛼} n /fS<`D-\tGtu]_Yau\!,mKAl?D,r{ڬە](ŭraasQv'qM[ͮ&ׯte'>wlךC1I_hov񊬠d#p&jAhH,E?ӞH# HJe<{͊v t0ʇ3F#8UTʘK][|�>?6d'CoJsA/zoaRYI;b~y,nJB,L[q{LLMS3nb(yYLh#mfK.gϷRxK6&T|Ʊ~fJT;g{K9e&s`Aԑ)O-;&T ]UL8Iڅ:>x{s R`QǯuҎGb Y̹s)+FDnƹeM "<"'\pJ Ḅh0q�s&Xhb }vKS<|A/% qiO_Y8r)3>l_jZ 0-8@ !-t5 )OKFb$gB_Uv?VSvGqr pc1 ��!Je] uź{`qeBkl.x:w)iYVԹ~Y2NS&-r`md9 jGK2 96{9:ϠJ;gŸYl6y•6tWr QGp)LتV{\..*&GY$~)헮j) "E Fq>&ɋSnff^Ie}M*C ݓ9){g8y *SZ&(dagPq`h,!1PI;~T].:<amL/yլled0gf AA9'[# QD.xMTIE^767QhsT5*8pBe�mrrS Nb֤ v; �@"/Zbg>x~ (ٙO3HNN7&f)/Ϲ.sp#_K̦-f+&;\KP0O>Мbx-va̱OkTrdS^|Ir8þ}A &qz>%HsC3 "++TK:'R({<Fs#$:)3Qѕc,Տi<ģ{:-σ5XV fy9vm $kkU ӌ8;pe{O>|NȮDZ~Bd͊], YkXM--Y4Zd$3V$iS8YϻF|}1/Egee]?}㩧]2R<iTBBw "Rgۇ`e \Oo-6ro jP.̰r\vPEĥ *mtSɆ�@QUem9=(OӻZmo-qEVifQrt_!9EYIg1u0CbAa{jߤs-m,zwM*ݍ쒧 yB$1#pf7HTi>*67N;gu"H18z2׷ %bI;!d38b'<}VuF)`'c/V_YÜt "e(j R-E뜨Hkwv6<+ D);Ǩ ~D!@e^Clz9wl܈r"ӛjۢ?v (b~RHf$ 6y3'0y;E\LYMbX>9ÅfNsȡ9D" VrAQ֣HUMU?ڞ~-!ؾ�:>iMiPA{ VK_v3RgvGANC_hNv\+&8Ь{;p]wt ?tx ��] ^ii5/TWUZ9Q}渔,+`1',wUg5doH}{@>ͱqR5w/ϵA޾*Bm*SIHy蛐yd fS`){f?"yO1Svj? "RΉcntT5DŎX4p[20AN4X%+VHAֹ3'---_-|OEB HS{G~sH���ݛa9>e'oL0p8QzvHAU5+b_sՈʮϤ>hڱ bz_FL+Z!̔[XA"{Qo^t~�A��2ĂA V 4ww+lj|IggW]߶/~P.˙m{/[ѭxc&.u5m+*U AVJEܲR icѨ ��,.V#vc {JxwYc/~D~hH =Z�����AA$Z- ����`r_+ "�����'2�����SD/P+A����DQ!G\ bv0޸K`����$Q%qK ï =ux/[W/Vr"�����  8XX�A19%rf�����LH������D�������������Q������h0{4wpD������ÇA������ j1i W�����0A5D !~i<MMd23�������MA$q ������ZOZ~����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/images/browser_window.png������������������������������������������������0000644�0001750�0001750�00000111372�13112005742�023014� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�� ��e���a{D���bKGD������ pHYs�� �� ����tIME68_B��IDATxetɖ.zfΝ?3wf sg{3oOvYff&m2 KF`Ѳݶ[6~RRk}2#"#"#bcG/ 7Yi`0 }D^VCQǙi`�%M& zALp*|?)M=׊D k  tL;o/Y =@dJu3@u}Mg< PCJt$Sf|Cz\=/L^餸B6-:qs! ^y:H9Gl( YpF/Ny[M1x" \q:< ڸsqxY]= {cb}Y ׻{^™ +IBT´}4lIA?>~$~oHå\ZiQzg9@CQh|6x>|D?zKOQw{R1q_PgV4 (o\򒟑oxq>yqu:qX3/IëI)Ax.).({P/-za$|=JsykH!/RUmm롦PDޤIuGu*Wl34'扼3ӔM(*PęQYegϱj7~N>+={#4Eܷ(GW9݌" mIU`82^v&4deB䔿+2]Ng<fs}b3QFɏ4z)ͼ�& & <0b�pK wt^ǵja]gSѣgss./;#O>d|lEG r粠IwCսP~VkqsyWC|3z'ǠǤ8M]KN<:i(yFgW+)BW=k`-yB3Ҕ=\}KIŽNE#Wp-'_e>32ke$K&D\//IëItFcl!#q"8@0:\ϱq<rc9&$Nd�0R䇭 WcTѶx{VeM_Q|!b2לC-N!^-_G۹ˬCK,4 f4`QI]i 醮L#h3u>*\LVZSHz>R$>.=A 6[w82UwtJw!,>E>o>!k.{uڡel4qV^2IPf1H/~a! `jS�2| }tϊpv:byD)w>LkV t ,2. Yry.>LeO~TM#c[Gr[YFD]0,q J)k[%ll E{RiGnaNkt:4i@B@L)C\J>f).SҀc®>ȣz.ZuwIe~*i^*(AOrQWY:ȎZy)ɀs 7 QViAΓ*Ж[bj<x?|cQDI{,ےU,c8|:LCi|lh[Qܶ ԯF媕~m0<Ja?yJXti{r@2E YgU|%!H|86ݝ\}w}37_8bܓ# e<@)gé?Zp^^2 p3y pMӒgșV^y3I`x3IP}eȦi@/F$O1Cٌ&HS"1"ޱ$H)- 4r>umG2P.!qjQj1 xFJ#+[;qbɾB}@w\%aP7Zkmwg<;z#6ݠ5GnX=TGWYG-xXS~H'+c\otټ$h0I`x5IS0~g8 _'7aˢW7`9eYI˦p8 ~ã)Z}Y-[ p> A.щX4r>uTS62e yIEM=-BIy?aF@Tn:K GM4G+]y{C,<@fm ʶlCW$ YzBzV>|.Ze9e ɀY*zYOc$ q}mVn XyBҋV7h0I`x5I�C$FtC0g.[ `^* ^D}CiovGyЏJD#CAB8^tJ4f/5V7Ok]K9GYPL(u@}uGoPfcz'ش"Z$ͷ$zU8@ z-i$#y^!ȯЀ'h(Su{[̱<LaTQP!^V5kXVFྻoy< sO$[]QNVƸ6R7bK8; ۯdh0I`x5I(u>;„4XG9h"HuQ|r>DU]feYHwY1ZmVzw9Q2ߡCܪo�t?X}ˎrz3BtqߥgiH4rm;t5KI5u\ʬ}x]@>ȡ^i)! ;a q0I`x5I@JCF1{}1'b"1b-G-ޫm@:y=/IëIQX0WaܮHQ>擷}O˛#ҋeWtL *`8 4ޣbf0vg$`0Wb< X^G_? ar& & ```0 & & L I$`0$0L I$@eeenk&  :m g0jAAAt1… TQQAϞ=}ߥuDңG$0$gp+/| (?o޼0~:UVVjO>VW!ߵkD1I`0I$aBzk,:! >|oߺ/^3gЫWtIҸ $0$sR$VW�yׯ_kYpu=<ru0I`0Ir`nHH@fI+ᩐۏIII~B}8P$OK�y% z;o ݶY 8Wտ!& ,5_@G_э)+`0? I ]3${z&(::Jk StL]J{K72I`0IpS׷߹IdeY3IHROy}¶˛ꒄwя? o$Ait>*//,.L -ߎqHp6w~LLL=olׁ~ۨ 9$8YY֕ePs8.-Qd *_RqC�/zW Iwca%� MͧB:Q@ˎR3)l4;vm}Z=h΂Բ}GsremڈIII5n^rrsFBܥq&3I`PIBQrOz^O'2O I7ׂ49.b>v o$nߠa-h*kJkz TtN H7n^SwJdT^ݪUm_I²eˈDCkڜJJJu[o۹wFMZy QiII4g&5iՆ6oIP^~w ؙjw+ԅhE{J j׹+}۸) :?jMHBBD?#1>}"ZOhpWeMJأa8޽AdY' ψ/֯}nL7C;SI͸+*OJgwkkɐ$`ֻyj]͒zIF 5[^Ie??⧯(GSH34H{vQZӾc5wLCn?I:ÇzR0thZj5%%#Ǝ4*(,YӪ,=[TV^NEEEl*Zxw锕m ۶s =SRD+׬J?itJMK4xH- "yD_]uiQ˖DҀHi DS]Q;#{G$[7"]ꪨa/KjERNT\LԼfص+IΖYE3ͣTތ9= a$@Iag`\ՌïfHj OPt~e?ŠT>~I%/|Dm,w&z`zaJɪP;RRSfέ;ۡ⫐R?T;/^b;QfV%Lƈ2 P}Wa l?O3kE 'i˖Sg̙gлM IVԵ+R[Խu�'!i jJv yD Gȿ QFƗ8 hVQ;#YD?Ǘ_9 QwtϟRYʊg*|r(+"R/~Oi&C�%vZؼu V ï޵ۈ$K/Z=$J$b_#啿GSSVlZdw̥LK|; Dw`(tփbTG,P ;mdI :%Ó<m ß ?l"hĘqœ8�iJ0jAH#~ $s?I$.U@UwJ9VY:#xLA}x3uTN7!|G~BЇ>`7ąSfx:gn!Iz|ɷ(0됷I@?V~ˆWi(PBYAV9ESXR!]˧YnD'  ˤw…EѶqA%u@z3ar" L '&K %Fٟ҃:}FTj SWHD6T%*h7(yXd`kIHI>I%ќޔϦ x"~K?0 Aw 5,I!Fb23tz]̡yZH)t)<s.ߥW.+Fy(!1Q3}鄟0/rXF=(*:Z5?jarE`EIWΨ<�Y4?oiS$a)bE<pZq Äiٖx,t%H0~hD-FbR'A$8: ?WA[[5/q!DԷt4_*NO_�?oKH¢EDmT$�2ޞO$S <*@:}"L$L~_鑷I@:ze%/BbX~,n;i?O<IWII Z&M@I1fD ~] Ӆr{cRTBxDRq?c[mddfftӫWtI0Zߐ*uԻwYfĉ]QHJ/+ugwVj1gg\\%$jp ڴ +僇ѷ?] r}5amacqFJ1mؼE. 0óPm[՜+KGV,�_ohIxhܸ YHBqr7*I Ϧ ݍe7eC& ϟ?wYH Z p+:F &O Z{KȨڶc 8y;LF p|^Æo~m-pd޽o(ֻD [/\$|߈t,-+e`% a=CMpS R4c ;wPvv@\]Y:_G-/g+cǎ"sYwt?RHBf_Ӭﯨ ʼnIe-ǂATބ>02R"M@F$P1ѴcVIߗb@QQ4O7CцMkB9:t�Lu=&CM,h/Z0\Vr4a`x%pB2eB&??8@ӧO\^9F]t/^,`pfz囁ZeNK,sҤIohhfڼy%?& L$7?FJQV_ kBq7T%)M+CQbSAD o#Q= :v0n$p)2eegсC]N4wڸi= 6eTmd7IBO9shkNezilΞ=+Ρ333Gr'O[x|Ve[Ҁ #p9~8 4]=0{OHq<o<-Je$I}]=)\O1D#MPeqJ()=-h$`.77%@F$gӑz3]vO Fv0 t 9sO0*sqFŹ.SK[YʶkLL8If˵fHJJ2]F&kL$8&^SyT(o0 $;LߺMz$WS!nQe}d +q.eYq'OsQc {sz6�Rd\tz{qF3c$D䯫mz$fuWS!_ЦIBFFF¶mD ?se 9e%_#[ Xq>|K̭Qc {s,(W8Zm:ރ=ut$ -bmRg$K_'͐WS!C$5Vtt0ScyuJLLQݻwE:<g F޽{E>{i9F-썗ϑ ON#+-[@5kX`z�ϊIb'X,uB@ܫWtczx*sh>6ۅl1�Az%ͭ[J�هA 9 K=zTaڇO|A+&M-Ԧe,tR:uڵkQ,DA~f`͞ULp+/eR'$�AgI`W vlu: eV%T0IBt#:q6�*ŋbǔ}1Xse< h? 1EMe >$;`��_ 4&Emrrr46Ѻ$̋t0I`0 ǡI.t0I`0 3& dr 7I`*$`0$0L I|p!pK(*8dIIIx`$0nB޾}`0n-ȨH HS.]+$ov$p (H}Zz~>~gCy3-D$~ƒ]w"pBA-Wq5?iؘ:vA~nkϴufѱ'E|`0 Z$({(~{+CRmaxL==$Q6ҕ *))pב;RjZZp!nK˗/=qqqO?yL} 9H `ApT޾{+zz 8sH68/[nXa7oݦѷR]鸟j:iVj۩ 5nъ?2V5Sڶs'ҍlM$\ZZjuMU ,:rf<6Xz h^� >P#ǎQ0t?нw{+W)M95O;h嚵Q2! x=¡y<09" /CMy IHMM} E~PBB]$K"IȠ۶sR`\PX(\I䈱D[^ͧUkY]3qt6uώ$%##S3k񔑙)0|XڼuU='M.F 9P4|NlrSCzt\ C#$[κjY2O)KYZ֩A(ѹG/ϣ>7ϡ1=TCBI@]Lc&L2Xam:u*8eN{PnеWoJHLѸtkQ`gÇs%-Va0z֡q95W},a2! r@jGLLziYjΨ_}g! }#"\nBm$!++C@/M7o yv1mںDz GtPX|! z}]CܑF6Ȗ3\#KB6m?X}NZfKVPٰI)=x,(Ix&C?/uR;x2Md:c&5iՆ6oIϠ<ўllI52h Fy.{Ҏ{hѲ՞ٛy7o[OO} @4;?a~8t4yh@L6O[8BS Iɉj$TX0l;_>ϖFj§e.$C_FU(E{O<kbIЫڽ]S`t:}m! xZؼuDӕW5 *̬,KX~2(+Et*1 #::޼ycWYZSh)T sЌʭ0z PFp0go<0=y%,w-ѽSٳ;.O"DL>q/8Y<G` cbJ75͒'tn/I BbRQuF@c`?2gT̠0[u訚]Oxu䓀?tX#Og-CkrЗ R+}F'̒*v͆;V> ߭N' W&$+t� AWz�uR=K_(㭥Ѧ2,**J,A|>L30zg_3|]}FVR?`Ys0nweI_>RX>]9}31<Ui {HBjj E�A@XDlӻIHrS<S!P|`Vްy<& pR /oR=Z {vwplj˪:Ըe+)lu9ig.#8lZ! kF[E @kIyvRƇ 'һ-)1L)OSVzZShf՛a LDO[ĈS=H1UU]ϡ°}5xǍ /9=13p^$(q" I`0 1f�Lpl:�ڱ L0׌ nM!OSZ:Cxx'H=W_ ҥooTmNaz6FCm/]B-ڵ׽?vz{F!2YΣcb$'t-$J,0Es @X._󣰾a6]xx8UVVUZXm)*:Z3NXj =03{F=̹Ϟ@82j=ȨgdQл?7ݰF(uL13K  o! .:cpL)NLam0,04<moP|X0֭w_:{|C1WCB_F=|6F)n|+=?&ks}mpw?'hgkag&I&$wOGV<~p=s<>ˌ͚ <iT 'uDȊπ | CF_$`nj bˁLL̒|ip]O7?[wV; YsQjjS7*VXV ]ܹsGSgϡE �k� _`Hk@优$0$  V" `0n& p+hRXx_!r3ݼfzy0I`0I0I`0 Z$ν;tm)w?O?|YQ?k'l`aa~" g/G-5*LL$xIJ?8O o% bp2瓿?;vNh1׭uc$3H[SmǏko޼{\vMԅV1I`$i$̙3zm�{jfl!u,|ncrZl*pC8cPgymύIILPvP6ꠦn׭HӐwBb%k>" ۸aG{%A#$teԪC'0S6\janԶ$̶:w!f_?{LZi<GFҘMuNlj12##Ǎv/FPyg# O<:FP[f/IϏ]{OWC]Ħ' 4#F҃u˚`T8ȴ`eqNPyDW :Ђ%Kc- tO?I9NcO$a[)OVOgkݡJʪ! qH$9ki[vMaxݥ+A4lԘjdJp |/_a;I¤iӅ3@K3(Ξ` R/c'DKISVn!HyyC+V;}#sTq̹aԄosr-xw֬ F@ G碼fΝ'hE>s抭|#&V ){A ;A!{ajz@6l"a|N ;)0uփjCKV?5{ m[-m8P̬lԣ1²uPx+IWR?oߵVfmY nj^ի:Eu3_7# ;M%`Sg=LHkH%֎nt))&Ҵԥޑ6mLEsh�DMEMBR[>1G}x˗/iM|XFDEkƐgIi)0>BOeyA]޷*fcpK^4Y; ,b|bvVaICQ^rF10tK޽'Zzk'UA)3CV$.Voԑ";խ.Q|O öחAQci CG<!MƴDx<7 F H[4C ]1e$ Cr# Fz=H)+T`A!o*i3gۡt}8uzbk[QOD^iA}'F ^AXsd9r3\3g0p]y'IV3{  tm<`9�?$ NVvì ζFu:px?<G)TTT$Pl7GI#az~ p^EV s:l~Qǖ2IP :F`IЋ\9׍ce|jZpiZ~2k| v]tn=QmCh7"2T}̧}a h/g+Aicy3HlE2K.pX01CO+i+X=MbE':jzi Iǂk,lp6J?9P"֪[vv6]JthY8C))T(1CnunuMdZUΎIU+6o)~-#F1IИ;22ȱ=$֒W-rU b_e<FXGyˌ3, wZqQ挨' 86y 8P^f0ѥgoߠB`ГڍŠnkpQXn$dYa)H]@VvJӶeee PGz OvUd@b[][]/HFiPaZ!윰a\_I#j )d71yf! 0eI�hy -<#9Gq;vI8vk6:MpTLaCs,- ֖~cy)˅JP'S Va).%K\R[QoFbCS'j uf5U$tFJkPęi�b0zNoZȣTlQ"Vz$x\(ɓ zߓ:'$᷀0#u=^qϸwxJ+lkխI{ 2߁5pn4lXxz*IP}C�0JH3(=$0Yخn!F0%S?}Zps]IҁO# h| {$H`b\(`�((O8A@@+&0E)$A2ZÞw!ea+%^Al;/y.x\?4ix<8*Q 3XsI³g !yueQݻ,;-=D1:\=#u=^qϸw1oƟe/.ֆ` b,O`KOO r\IIPҷCoю[~]KmAzXnUy>yZAyV((̥*-+;wo pV" #Ff#u {G-&hx3moT7& L\-X]6*XXX$`dm잿xfQTPDӡ% Q.]Ek); $ *);'CyYT\R(p+mݾBPOYq{&6@[MPQ<X֍IWl//caa'$R ¡*_'&%nLFbODxa[El{rDkAFf.ө0 ƭkP1V#u {G-&hQZۛ& ,,,LB0jg~lPTQ8~CӮ)<" H]V@xi[Fl�Ȋe%BzF eSnn]Lwl˗/ZMn7ܳ|h m62G[+ޞvSsLtwuLXXX$IsV"99Y(*'-[7JJɦ&Z0y OrP6ꀺ"/ȥHYBejݺ.](ZMn7ܳm;mFh+xenPz9$;qR,c$HJ&;J] !v4"O01N�sHc<m1mLK9ZHL~ i\(AS'3ZMn76A۠ʶ\=WYe*Ҳ}GnLXXX$!I~(|F&Ƌ_IJTmKwnJ(3emxa[FPu 3#+DAB,%K#t#y1B8O111z5{j;Z7pϸw@mF6jmonj |מԼM;p f96(P U% XkuXC#K/m;wR.ݨI4o"zc'H+0I`aaaP$P4HN[ YQEFX>LwX}wp/;R4RۖQ@)뗒$DL\%$Ä8-_R  "Z5\/3m@mjmonj |񔉏3ImEҕhݖnܤ8dIVӰ�nP􃇏8Pjj 'TǗ!LXXX$1Ig~L8C +=dI]/޶ BRb(acif Dz1`䬖ng;�eM6zfިnj Çs쥀/8%%vb+ |U9ӠqSy^)!gsrsA c}LXXX$%Ig~ +a>66N9E{Jc/efT)<uGF?!aO!G{Ľqx3mW75\&c|X>:czj 0y:yhj"H]$IB((tV0+/~qn"G٨ҼlT7 .jn?:& ڴe=AxDǃnjכ#u=^ebboٶת%Dz%[ 9qQ:#at:}D2I`aaZܧ^]BpX&G98w$EpyB]խ.MMY?Ⓚ[YF[C]B v1&NڈYuiF4d";SʛեuZI¹sTPX5מxu$fnYa. +;Şasv:qݻOC u]l7 XYdJ*J堫b73|$S ѷTfaY 4p 1fX] |AAi`{@JV`g?YRfR2CSV(RjxB ͞P3~"I<x*IŨᑑbr[wDV`z$~}vӻޙ?(Z2BhЉCP6ꀺS7X 0ǻSe^qI5~\Ne-Z\+pQ,@))0<{ΣXt YʧZgdf`\$,Fuab+ʵh ]$@wJt.pHP4H�Fd:׭fuܣ`=kJp&ZSν{�4kݖu&V ,?~N q??qpėW}?cy"F-ZϜIֶ>Z#(c8v]ƆE9_jzQYSFfFlEӧO9G6 ZQ,ްŷZ[DQ^KfV( %zymWo! ?VVRݤ{u5}߬SI2ybltT]R\7f1:;toB`:g157ЫWKÂ@>G#yƜy^XO޽_DWqh>7|XK={i4z)SRTuA kɂB)-X6nS  m-KeKjٮ3Kcb-Q11l�k'Unt/w7o^ �0pZ2" 0^uY|XxH"1b䒔B_ˣpo5వ܅1Om.|΂E'YQi1Y޾}K 41/(KB{~b*S݄AKV X* ,*3\?R7AlN0,+r{HB40ԽU6{i(Y$WZf_ݼIzXUDd]vtrb� 4|edfQ㖭-d` X% z0գU{ I a ض i8T"L^r>9?fOz W=$ 5ڊ}b3Q: 0U$Nodu89sٜXި$AY>DR:0'$ޏV:RTtK ]A 0�)lO1˒)i Zϵ&$- zaUuFLPPp86y S:XQc6h+ _nz I[%n45Gb, X-P X$K+9$;pPX)jG*�4X6H|�#RĨp$m0u]$*pT�4E Fd9tK;JZi\!@iJ<Ԟ;xH ~q~Z}$rr,PwpXEUD^A( `M@хHsknQ C8cF?'o�'*=*͖WV^.a'߰# Z#,K\ZxٳV,pn:Hӧ5?:QWV7͊5kEEg� �'f((/eXр rQjV0 (o$ Zcs-6Wkɪǒy3 &G6լn8:O!k>4%b"[ Ln*Ώ?a<(Sψ#G[}(_ 0o& # '&dǦ/8a⤤q=XeWJ$xD҄ez ,,L$0܌$a6kIeq,i~k"_X$x`K,1ݰbIG+쓀L9 sfe$IMI];J$c=8;h]bh& ,,,L$.<e{Zxu]7w^9$�gΟ˳6o)0vdvi|K=^ $IB]ᩏ, |vZtu]7w^g$0IpI{P]�sj$j7& LXXX$8$t Ei]�ej$j7& LXXX$8$k}P4ׯ(ur;͝nL$0Ip:Iu3$`$IKIhJ A6<utz:u&h& ,,,LJ ۃ$ڳo[rn 7# ԭ>@ݘ$0I`qFEix˛EfV-\:oS,~S),>0/3$0Ip_Ba7?|vYr I>]={B͎p!7((q}iU;]MI$w;i)vNv]ML6;SE =sA(*)$A/*Kwc3yHx`FPM:u7Q㖭A7oa7?{p5$DڍIBݓcҥ+ATT\L%UhFgH0Ժc'*-+ qZ[h鬺;y3Ip;2Lx_PXHt ѼE$hɊy@?}KfY_D&\0|KZ`o'}IwZZ�O;mE~A!v]$sJK˨Af8(vF 1EܧO;v!F7KVKbs~'cQkZERCŵC)]gTnMm9aS|owE9yc4۩GOQ.0;$9k9!8sֻY_(0z3{]CaG}:U<sdHէw]|@/?e6[75`A|s>g/dpjkڍI{|1t瞽4~S$V"LQ|VYR쒈~~bKel0zYd)mfb/ D@(;6#%ۡbdlj$A\gf}uvIлWg (dI0t'KB黦ͩpZ({ dy&cA<]{Y붴hr켖$<Z<}􂕈7o_SRr` [NܡWlZr$\?H/Y"t6CW�|K.e'Q3yLJ$I<:Cǔbqq t cE{~_Ph{yNeGCX`0a>?}ZW(r! eVY$A^7#ZΞ+o' iL b5Sƃp ђ+$`^(|-=ilcW4nWBDž%hhqiyuF٨H�3da82ؓ(Y�I�.]5LnL˒PRR",E0I% e@'}:1aKmA(Y 1Jn֦uZ|iIuήIP=#W<o`/F8G3o(4l~1:)-bdI@3E<^E` sZտH#!+'4d@]Dީ:)GbqRV1-7FPG-YYbhz{s2I)(V1IxD&N{@̙+ૂ/Ծnf1*?[<Sj$O/O3u `\1G~Iax<d=ҳoֻǒGR?)G}'B$RxfkaӦyfF,ݿr6M|EߋϢٻ㰇9xn([$M  FAsï6nfk'0&HX533S̑I%ADmq,S4n#`iNs蘮a2Ų$ FSΞ:I0zFzC FydCb<8?pf׶=)�6Yqf,nXe ҍˊF } jԬԨkiIuÔlq<{u:p!ZyHkOD-+;őH&cx1iGzb* Fݘ$=Ip7@bv" F2Rhw3ۨ 0B3IbC^ p97PZ1qJv=u `\aI @9%caF{^QE_7o~mйG/ڱ{S$l!Rf۩ V,\aAZ!5-U" gtzie+"ZO<LETPXL\{yl5Ŵb1gZNxIo_l\EkuZ$^$EEEGt&߭[AƖ̬\v6:&^ .懲QԥuD`=4`uZ$I ((tVq=jԼPǤԌlj9 ]`XTu/j7& LXXX$8$8//.ӈ1c'dPq{i֋Az$h& ,,,LBLE# %;.NQu&h& ,,,LB`ww�n͝nL$0Ip IϷluy#'j7& LXXX$8$`n[zzz@ޣAgw3ڍI& Nn &55N�w̙j#bw;Cݘ$0I`aaa4K?Qrrr�.88;͝nL$0IppB6EBbgCw;Cݘ$0I`aaa o5<泲j999bZV7wQ1I`$)$`$7$q$IIꇎ^p?<Bc+WN^UNbg=l|~W�-8S1H/ԌǖHj`&4JRFoXw 䎝bHm.] m & p4|$!3+ZmOܥoPqI -YHSimTj޿8<RئuNTZVV-aSne$9rJ 5ưg_CQIi�_P0I`0$XvBRg`/I̹NAa!͜;n+.3W p}MiQk/)57[HGXYI%rÇR$zKu=uuMӧOaح.YhijqFy. zaYٺyYJ$kߵV9$`Ps,Z? % ᔪ%}xz|nDW|fQ((ez4*|TQAc&Ltt#Q4gvTT\lw=Pa(/DVv;׾hb `RM5%5,/e"(/~\C7UdIXv=qR J"L:IB)P'GH ʫW]Vdy-5hrܼ<9FrGWRR*FZCV[O!o$HP㖭i%S+]n.Qk׾#Ue;%mY;.%/Y+XΞ+o' ))b3$ZOڅ0& aᔐd9wȒ $5-L$LDzXyͣDƱ2~ּ|0YwWX7t=I#fmQ^}Lꓠ a}ʰo[%JǏB<ra}Ga'R οicH L7[ & .g=> z^\J/8FEUvTFJ֒g(Aq|S0[Or@D@xԜA!!",wޢ”:fҳouֻG9jXaV4 & uJ]݀yлnXEBib$`s=$a}4aT�?c @Llfh%#;v ?*gE` Цcg" 'O6Cs,-D ΚfR ?(m@`F'K\A(s_ݦ&T^`0Ip;�Q~'8,RatS/LӘ$@i��pW7(@CQ$�fU|pE8I${/�ڦA>͘,LUʕFyft=eix.Ŋ Lx+IIؾC �#IW}(|H[aaKa`0Ix0Yc*aaa$$IL|yz9,,L$0$0I`aaa$t uӭ3$0I`aaa$c`ث;_ҍ)+`0GL$0Ip=I7w^CO}/] 3cGw_Pɾ4?Rt~m& LXXX$$&JKK o ˗/(~%UaFqZ $>:.-Oz22VN/j5V[@s,@2I`RIMpeeHf= aFqjuWvLI0<&6ސ]$�K<5ʃ'[W7|t /c"nje$>L##HoGNNP-7/K�3SӴc֊Q)R*aحmΝԾK7jҲ5[HXLu+3o,k.=:s F+ n YH=׈8VNS?\뱵m+_l9& @2p08:A1gddZx5;>FbUk9zW(=2âqy4*қQڝ?5RS2c?yf;RKBc>l,#m*埑)Q6ofΓMԴ4Qo;q2& @)J 1Œ:Hf|^ŶkGn:zi$ +)7:N:Nԋ4{<S*\:"oަحO+]N#V|W^YFŠTVVF 7>!!I w" |k IxTQNIp$ ZqX)Y%#-Q_g]l<ȡT܀>0>=O}En* t*H^COVʒ-۶Ӑ4DEk@mS|%Ss Fm L̋+7q zJܩ0I(KBffPE !V�3'aL+EeC* v+9[kzS}RNoQF3zS>>>*HaȌ<ίo_|״)!VΌ%A$x%Amw8{H:8PbbQM܆ZИv5gW=W+^8^. 5g_ Ҹ$C+'{/bRjݱ-^JR;]^`KK$葄*L1ŒW7ĊNpeI9lecN~NR4aBUTTP\|<M5i;s!76W%Y^V4$dKI|.{sYrO9 =OlI1f30Kp'$$Aϟ-jKmW$AW_ӁÇ3i}R*rr(Rib+C0Iwl̄t;UV8v]QPHXY)Ih1=.~rjED1Œu%)~<d+1:EG&{9v̙÷� =AANY{Б+B~i?dwgYMZ! /R~Ľԅ-[NϞ`cnZM/,[ڲ# .$A(WHEfΝGZF-ZϜH]'Araiڪ -Y޼yc}-sU7R5-[tͥwGy>|ӡu.srw(  8Pf;);# ّu}$ 9[E4c~x�fgo{oBfدiVk[Y[Ėc HoB~LHo$JKG{'ȏY#KO޽[-ݸZz-4YLU@.X6n3mI8tPm6%"*̨SK,hCB{mվx_חbqFy?dEZ£bb,V yK'}/ Pf{k>a*<;% |={V2~ JgZ2џ].FeF&%|CO[қє<ŷWa嚵븈)h1r:|}ʌVj+,`j]>(r9[%`Y#$e+G%%b3,USuJ@d^@6k&%#Zm$2= b#�VT\l u -`EdJ% oAm({mπ08ޟAz(ceGeE4~<)gWm3n?FnP :7̋l,w^ԮWuʴzRq" 5)[M+30쨟;$ޡx?~(O><cyTk6=轤\s|.S>MZ6d|9)@`Z `o� kTEQA8ʊG0 -<$dfeQvB:E S)~7SYr\<FЖѩ4vfٶou 1Uk.${pA!l^r1G~IaG%F#7z_SQE20+J ~10I`0$&H\XjSHBd 3<HS4n>,`iK?xj<L\7i:l-A tѺ6HA[<DKY.Qp3jwEŹWϢ�8 phu7kNH,Q$`6 +V2I`0$K"(RNt2 X- Ӛ$cNk$=S~ `7:[xâ�SsV=;{] ((/e(W:i% DA^Ʉ_LbSH/�Z-1c,u\v)ez? v\d0$gYwNn& & .,Bz,,L$0LX,f`xKXX$0I`0$0I``0I`aaa$`$IEGDQ@ 8@Ξ251Ѯ% 8`$J>=#޾{k:?|\rъ($0Ý$I…K(#3HKI>|wD]o$ 6x<\J^~`5$x#IVYKI6`0LXXX$It w]}o}B~*q@j$ ++\=겾fghI;I]oTuaqI8z0ݺ}j#3z;T($x%^�gL~z52}? Hbi]ԪCG:y]@hج8p+ߺR,TRu�ά׹ 4{B4n#3yhTۍ){uNljw$޹M7k׃Q@Dح7w9IpU'#<ͦsU]mFyŻ<$$%'SN]̹sTXTD4c\~58| #v7M(ҲjqCr+c& ΑKWhب1u?y*ED7o鿊0_XdpF8QPKrયEGGsf)8Hm:v|/F3jC }J|ιqVgռ#zIH}yنَ:Ԯy)m۹wFMZy Qii)YыBp1l;/tBȂߎz}여X)]yV[OZV;ґcǭ=ve 9sr7֨^zyw# zi|W6lag꒙MzR 8FXVvnf[HԾk7/( 7kP#2QXa&A� Jlz<0ĩӤ?ֳ_y`؅Et*x%~]bWPP@+֬ԬM;$Zu׋y1vzΜ;VI Ui$Ey6Aj_HE[Icq~~4vd*%:KJy%~瞽4i=~D`”$g4|Xͦ5'Y(=VزTV:82cb-Q11<%'N^BS;!2*""tӸ$i(lz< qJJnz(XsXͼ>"a5Zu׋ҳ7=xr"ԮsW=olk<k|BpC> _BzF%{~b$$S1#|!KT=�"& 4ifWٴF$wFVV@G‚03y 8sʿ fv"C=$!=3:uI{Gbx@raa4ljܲDg,۸i  k\_e=$ `*qusxIts$#Q&X w i_9Gʷ'(Q<'Af|lǏÇBra}hԢ><cٓF^ 8ac! CG"f߯xLSS7" T5I(++s """ lz<0cȻD*7!:vNwQ} ׋,&$ݽF%|[�IzWQKBm{- /y"I0z>j3g.PPp86y S:5v J/D}=VkŊ\qCƥ;oDIo^;|OYbau0KXF텳:ظ8᳠L9!R8fca"ujuSADDFiڳWXD&_mbz�O# X_t:pG- 'OPC-a87iV`4Cs,m3R$^O#& R߄goql6/eC Fy;xHR ~qiܺz6~V99^oo$;@:2kOW\SaaKp}flz< c V1�&`1P ٹG/=H} %L}Z_ 6j"gΞssxw@ZA:.ʀNq)OsJPӔҌ]x,\W$^jpVupG`|RR *T:Fy` L+&0E$AZcem�y4aQkFP.*YW޽{b~U'k&0`kXX-Z$/06ӸVe$!77%{n|O```=<򷍾[ݢtzIp&\B\;w2\}o}=$`0K222 Y`0 '4í$`0$0n & QG$K w#$`0$0I`0 & ,,L I ְev3ianGiw& ,L$0A4b8@Ůi5شuʶR2<$\ &iپYrrs-)4~Toc9lg6#3S<¢"& ,!ąI^7]RͣE˖ӸS8MAZdi;69xP%%b<|XKai_ߴY}m-\DeP 1'QE뎝h٪bG{={v';廦ͭ m.dy߼u[있>]bD9ѣGb2c)Ñ'u~/uK$I6]{YGl[`fXQjJktzed~{gIi!U>1y[ūgΝI\J;v;މ;w56znuiߥ5JT?jp?IB!3ZvMQFLނAA4l0XvoJb"% 32w+7^~zURI`85-Mt>MN,�tmfm IMI^}տ_#0qt){:AWXΘ)Pْ6E=.YR~@.]rg`ͺ뵍{+&4A\g͛O$ecڥD֘$8Q^~M7kQcŇ}ڱ:oKF8C<joաݹwOnK$Ci5[3e4Ϝbl5냙kl˲L@tL ڍ,a4`83 MtȬסkwz#KJŐc9/++ҨPy}B—y>ze775& F5_#Eh.KxfVe8#!HSPP`<ytm&ukGHB^5KQϿiؘI3%=O1Ice 57ЫWKݸrS#i5[嘸xz|R|z2I`8C)L9*1_TF 4*:F $֩{O \^^n9v(Uq2^l5KҡY> FNE)3>Vp 9K> 3{zFJ _P�/H1zlIpgfƈs|~f^HVIkT> $`L]co=$0sU9"՚'1%Al5p%I0_s#DAcEkO+HV_ݻF#$8Yb195)x e ~;'Qf럚.:1 wz{$,`W8%*oM}f]t -V> Xz9q[$LhWy$}\=1>q4f[@T 'An [6lb+P[$AyXi{>cJOUPϚmyc:IB ڍ›sarާ/Ju" F嚭rUa�~iz&dpR35(QRg_#>i~+4܎S?Fi.]&<a6޺c^ٶ<;Ҙkq+LG1I8xz/t*�I4f$'t)}j$އ ڽbE(y&} G[3q& 5̍Âʙ^'OиIS(/?޿/LKs,r9I0*l y]1pHTE2칦&d`@qU}qqǑ:~ϙ�Mzn?}Z̽g�,N& F嚭1;G<mBftMM$Q_rZAa_J8n`aa4C1݀U@J7I `$`0$0I`0 & ,,L I `$`0$x I`0 `$`0LXI `0 $+I`0& ,,,,,5HJJD:u5y /$`LXXX6ժug$I v.9n؉uNx z*ݿ=fmTXTFg*si/i\d䡕3I"nj#<2LD6n*eVӋ/T]& L$H2fDz*+_ҫׯiOH'?ۮh.5ySYj,O?Z4L_.] aS),"^yC?<{&�ve$^is;)MR8>s<u]0!#GQvNn+>cԴUZb%K5ݰŷZ[DQ^KfV6uӪc1²uP8Jfjֺ-jߑ?au{=O:w|_E<W[%c=xXYIvBZ0I`0I0#P=ʬMvݹg/ >Ҵ2=GP6:ֻ#Ik~~4vd*)- `wjϟ?˗0XZ 0GЀMYvٳ�4*~QE*7Sf'O,ax'Ma)S=$pIv6лhLLtb�:עb4QO>}2ZOeG>BY#ѵ^Aehafp欕Ξ+gvܣYaeP^oeVZ_P`9GDSR4(LԽ'2I`0I0ez{JVFg'|*S{ZV}$ zaP_WK@j ?~H>|g% C#̞<77J7 nLA(},plOVy<~BJc=INM1I`P}@*GԪC'1ׇ!F%9Cq{[YLfDWQO|̥ fR;obaUb%K¿A)ֻv$nj{%Ao\qtLiv[~$0Iw$ae/F`=79 ˬy b>_<鴙,& a'OwmgМtI:RCıټJP'Ѣm{':(vn�|�ɞvSnte{}=Fc-& $\y LmԄu&W%-0g ma>}7$y>- 33geFy)Eǎ7Iֺ$D7JLmy%V.wHmu{UN/X֒'7$AZc1I`@,,,,I0%g>ca$,,,^/jK(7nFa$I K/>X90I`$II & & ,,,,,LLXXXXX$0I`$I& L$0I`$I& ,,,fŝ6aL$0I9nݝVzWw^9҂3ݹ 4{B4~I}cZ2ޑx& L-It%1$sGz7q뎝Z4LܼJ[mq1I`$A!?VVR(%$?t:v!_b%dW)i-Ԫ}G#L-9w:tN6nJCF\1ݘ$=/E){ ęy2SV;P8?1jfjֺO9~)Uq& _g`DYv=qҡ︟؂TK&mViϚM<ڻMB**LH\}fGtPGe $Ay/JyPn/_UV;"̻?dEZ£bbh_gOe?%('j?۹g/M#€ Sz,Is Fΰ0I`$$iB% zϐ} +,OhIW Fqyys:ٹ>}rn4iڍI2z_le bT- F3AΜo?Csv .xmXΑX$0$8SmI’Z8*`nU'aZ#r# 5y_lX(Ï?҇̾{o><cٓFb@)8acpLQ/<=E""hY5$0$8$tWչL/{- L$/j3g.PPp8vݛhvUb%K¿A)ֻv$9  vJ IIBt5% 'OT1zɡ9 c^k)' F$HtC!ؑw~Pڀ?(mW3sʾhqBc_8|tO>I�P'gϬ|NoׅaIIB;>-LmԄzDw恎t͖ 8VZ$x/I0z_FRyбce�`Vu9L(�?~S$fE^ pT[lŚ<QG)w$ V_==VU& LgaaW)N{rC& L_L`UV>` F߭(L$0I`aaae0ݰbI& ,,,,,LLXXXXX$0$0I`0I`aaaaa$I & LXXXXX$0I`$I& L$0I`$I& ,,,,,,L$0I`aaaaq$ 7o8woEL$xIpedf8lMHHˁL$xIW. eYy"& LXXXXX$D�L ( & ,,,,,^F & LXXXXX$0I`$QO7DDE0I`$+u\ĵJ$I ^$ILI yef$Ip& LXXXXX I{/Sq,l3I`ROHBD.]@I ARrK!L$#�%A& �AxI K=' JG$0I`aaaa$!IzH& ,,,,,^J>I& ?k23I`aaaaR͙I#SFlt7xbu$A*:-=MX0 Af$ (`�fI/" 7& `hIB=& `+$0I`0 I`0$0I`0 I`0$0I`0 I`0$0I@呿?;vbRyy9wX IӧOA(++?2\7oPXX]vM;wZ I' gΜ>۷o6bEM{ho& IǓ'OkvF{ݹb0L$x IxpI(//Ӆ2mQ9$H}]4PZ?UVV%~_m{HwӁ;!]r:w^-۶d.] 6;J4m:n$SHBPp0uӗiX^ q{;qJ@9ۆك�WӧO;OMN@;ׄ$?L㨸H`:x+on6ggԦMuur qVԤekZiWPm(++۪?dSkkKSN^X<W[FfxEELܝ$Q6`*..R$BT:g0__ЩSD;0<<<jRwL<gQyE.3 {tF*-9Ew<BL+l9s&}7^G?A}4xAZdictBKI;߻vp<rIi3gǬ=JgͶza9 /XIMZm}^,v]^R<! 9+7mDK@o·FFnhÆ Vaׯݻ[j*k#9r$)/hџɟD7Og#(8D@+~h皐SGOUPDjL-+n4vo4M9D>$E$٥ -~+60` ~k,Y"H [FPΝŵGD;vFY,  k-8<|fnSM]Vk1”#)u~/u/[nk+#Ǝ׫)&ש{OMY=槄Z~8F?KMvJUڱ{6:S蝻4=E׶j4lO{^hLװyK<݇M[M%�'0Ipw>##$O:4đS9t4|Xh#@g͛O֮ {ŋ}z:t~ܹj $qa8{<۷o/S%lԴiSJIIdjԨU=VXAM4/ynn.Ӈ&L+~ ,EZqUꈍp.ȏ^*>#Sni",4,FBh {u! OȱkC3f̠t 9sL?/ /uFĒ\A hoپ#^$WzF_w*g7of\qjZ7+ F',^+V*ՅK /݃fsc>℟?}״9-[r>ͨgK_ŽןnRDDnK+KI6jRMOҭ:vA$,%*_zSBb V$^ t4GHCa8B'H2?? |~}z?EEEYӥ{uC/OW`V(\_jJ._;K^ isP6MIsFQAtvM=A>sM˿KюCGGG+Hohss<]oa rI(’fz>R޶Y/ E?-K+})r_!W+0GHܷ؞+f4rֶfZw/U܋-?*aj.Va1IK|HDcKqi<-+J YX/L�2 0(NjL?|ce9 &{'"zy ` J L3O3ܾD~zGwK\[h{p9@ G3hX1@K-eEw(>>4h 06W^NKف9Fߺu7n,"d`I#88lP~lÐVImzeYdھk7YAzIKoOfO9FfmiϽDJcƉiyZAI>ͼ 5yؒQ> T}ૠ[G]z&g;ƠC2x谔@v&sk׮ [f uEzXݻg9{U*WN�̄2AQz3[TGzHcRmIF9AvEo&GNuIe51~_ CŻvҒc%zݵk Y$^9|17mhgI+['j5Ͳ`h&5%(I0ӜIjΑשg9*cY+X=V5`r2 �StaH9N:C:B05P\J#Dc07nܠ??ygff_#\ӧ9m�Ft˗/a P`vT\[|̤E;-p/;j6ß펤n[hT:⍈CO:FD'.:8^Z<H1P6oⓀYfY⍮9~SY8DZg#vn=GtܪC/>3W#c$ ?I\o0aU^j-Z?}͘3ZAb>$Os&I2:÷0HIMNxvsF1=$�/n_[7ntnZV7<zOjL2�J(ZX/LC=|pl `t  __T@;(O곛=M% KCv8NΞ=K!FF bĉ0e0bĈj2Y<ߧimU>8c5�۸Iw b /V9Mi^j#6O"- ;VDU!j>:݃-lv[`Vi$ 5}VFYEܗ^մ~xxp�eev*< Z% )X܊(?7SOʗ?Rbj|CTK}qqe=;qIK:1\ 3ڻh>$奔BIit,2Ipo\VxW�~+u�2wZFC03\ yCB'I<a_Ltԡ`$%\�rp-2 $Io oL0>rp-`+3 & nkI s"õ5̙3lI`0L$x%_(sg ;.2 & ׇ dpk�"~ `0$0ISlv.t!aL38`0I``0 & `0I``0 & `0I``0 & L $a@ T0I``0 $ hX`0<LL &wml����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017261� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/iradio.rst��������������������������������������������������������0000644�0001750�0001750�00000001356�13112005742�021271� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Internet Radio Browser ---------------------- This browser lets you listen to Internet radio stations (a.k.a. streaming audio or Shoutcast). It supports MP3 and Ogg Vorbis streaming, and may support other formats (AAC or RealMedia) if you have appropriate GStreamer plugins installed. *New Station* accepts either a direct URL to a stream, or a URL to a ``.pls`` file with a list of streams. Radio stations cannot be added to playlists or the play queue. You can edit the ``title``, ``artist``, and ``grouping`` tags, but the rest are filled in by the station when you listen. If you don't know any good stations, the *Stations...* button will let you select some. If you do know some good stations, you can add them to the Stations list. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/paned.rst���������������������������������������������������������0000644�0001750�0001750�00000011636�13115500547�021121� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Paned Browser ============= Overview -------- .. image:: ../../images/paned.png :scale: 50% :align: right The Paned Browser offers a convenient way to quickly drill down into a large music collection, by narrowing selections in several stages. Some users may find this reminiscent of `RhythmBox <http://www.rhythmbox.org>`_ or, to some extent, `iTunes <https://www.apple.com/uk/itunes/>`_. In Quod Libet though, you can have as many panes as you want, grouped by any tags you want, for example the popular ''genre/artist/album'' and ''artist/album'', or ''artist/album/part'', or ''artist/album/artist'' in case you have a lot of multi-artist albums. The songlist is presented at the bottom, and the panes, which run from left to right, are above. Clicking on an item (or items) in a pane will restrict it to just songs matching those (e.g. those artists, or dates, genres etc). This will update the counts and choices on the next pane, and the filtered results will be updated automatically in the song list. Pane Configuration ------------------ To change the panes, click the *Preferences* button all the way to the right of the search bar. There you can choose between some popular setups or set up custom ones using the add and remove buttons. You can change the order of the panes by dragging them to the desired place. Unlike elsewhere, multiple values per tag for a song are split into multiple entries. Tied tags also result in multiple entries. Tag patterns take multiple values from tags and from tied tags and produce multiple entries. Entries are sorted using sort values for tags. For tags with multiple values, each value is paired with the corresponding value from the sort tag. Quod Libet tries to do something reasonable when a value (e.g., "The Beatles") sometimes has a sort value (e.g., "Beatles, The") and sometimes does not or has a different sort values (e.g., "Beatles"). Examples -------- +-------------------+-----------------------+ | Pattern | Result | +===================+=======================+ | ``~performers`` | Julio Inglesias | +-------------------+-----------------------+ | | Frank Sinatra | +-------------------+-----------------------+ +--------------------------------------+--------------------------------+ | Pattern | Result | +======================================+================================+ | ``<~year|<~year>. <title>|<title>>`` | 1993\. Summer Wind | +--------------------------------------+--------------------------------+ +--------------------------------------+--------------------------------+ | Pattern | Result | +======================================+================================+ | ``~title~~performers`` | Julio Inglesias | +--------------------------------------+--------------------------------+ | | Frank Sinatra | +--------------------------------------+--------------------------------+ | | Summer Wind | +--------------------------------------+--------------------------------+ +---------------------------------------------------+------------------------+ | Pattern | Result | +===================================================+========================+ | ``<~year|<~performers> - <~year>|<~performers>>`` | Julio Inglesias - 1993 | +---------------------------------------------------+------------------------+ | | Frank Sinatra - 1993 | +---------------------------------------------------+------------------------+ Using Markup ^^^^^^^^^^^^ Also it's possible to change text emphasis using the `Pango markup language <https://developer.gnome.org/pango/unstable/PangoMarkupFormat.html>`_ =========================================================== ================================= Pattern Result =========================================================== ================================= ``<~year|\<b\>\<i\><~year>\</i\>\</b\> - <album>|<album>>`` **2011** - This is an album title =========================================================== ================================= Aggregation ^^^^^^^^^^^ On the right side of each pane you can see the number of songs of each entry. This can be configured as well by adding a pattern/tag separated by ``:`` (In case you want to use ``:`` in your pattern it has to be escaped using ``\:``) ============================ =========================== Pattern Result ============================ =========================== ``~~year~album:(<~rating>)`` 2011 - Album title (♪♪) ============================ =========================== ��������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/overview.rst������������������������������������������������������0000644�0001750�0001750�00000004042�13112005742�021663� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Overview ======== Quod Libet has different ways to browse your library, called *Browsers*, which are selectable from the *View* menu. There is always one (the *primary*) browser active. Secondary Browsers ------------------ .. figure:: ../../images/queue_2browsers.png :align: right :scale: 30% Multiple Browsers - Search & secondary Album List You can also browse your library in a separate window (without disturbing your current playlist) by selecting one of the options from *Browse* → *Open Browser*. You can have multiple of these open at once, and they will all react to changes to your library underneath. The Song List ------------- The *Song List*, as the name implies, presents a list of all the songs that the current browser has found, or filtered for you. The columns are configurable, and can generally be any tag, or even combinations of tags from your library. For more information on tags, see :ref:`AudioTags`. Sorting: * List columns sorted by "disc" and "track" are actually sorted by "album" * All songs are sorted by the column header tag and with a special sort key. If there is something wrong with the sort order check the tags used in the sort key: *"albumsort or album, album_grouping_key or labelid or musicbrainz_albumid, ~#disc, ~#track, artistsort or artist, musicbrainz_artistid, title, ~filename"* (see :ref:`AudioTags`) Filters ------- Filters allow you to remove all but a subset of songs that from a browser's song list, typically based on a tag. Different browsers implement these accordingly; in the Search browser, these become searches e.g. filtering by Artist might produce a search ``artist='Beethoven'c`` Some filters are not available on all browsers. For example, the Search Bar can filter by anything, but there's no way to get a "top 40" in the Album List. Note also that when using the song context menu (a.k.a. "songsmenu"), QL notices which *column* the mouse is in when you right-click on a song selection, and will offer this column as a quick filter too, if possible. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/playlists.rst�����������������������������������������������������0000644�0001750�0001750�00000012241�13112005742�022041� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Playlists: Playlists ========= The Playlist Browser -------------------- .. image:: ../images/PlaylistBrowser.png :scale: 50% :align: right Choose the *Playlists* browser by clicking on *View* -> *Playlists*. The usage is fairly simple - a list of songs in the right pane, and a list of playlists (with summary information) in the right. Playlists are stored as plain text files on disk typically under ``~/.quodlibet/playlists``. The names are URL-encoded. Whilst these can be edited, it's recommended to leave it to Quod Libet, but it's good to back them up (using ``svn`` / ``hg`` / ``git`` works well here too). Any file in your library can belong to any playlist or many playlists - it's up to you how you want to organize them... Creating playlists ------------------ There are several ways to create playlists in Quod Libet. Choose whichever suits you best: * To create a blank playlist, select the Playlist Browser and click *New*. * To create a new playlist with songs in it, select the songs in any other browser, right click, and select *Add to Playlist* → *New Playlist*. * To add songs to an existing playlist, either use *Add to Playlist* in the right click menu, or drag them to the playlist name on the sidebar. * To import playlists from `pls` or `m3u` files, use the *Import* button. In addition to creating the playlist, any files in it will be added to your library. Context menu support -------------------- The "songs menu", a context menu presented when you right-click on a song (or songs), has in-built support for playlists. Just right-click on a song, and select *Add to Playlist*. This is a convenient way of adding a song to a playlist from almost *any* browser, and even better, seeing *every* playlist that song features in (they will be ticked). Library Changes --------------- The Playlists Browser, like many other browsers, listens to changes in your library. This means that any changes in tags will be reflected in the song list for each. Playlist entries are indexed by file path though, so *any changes of name or directory will remove a song from its playlists* (There are, however, discussions to changes this: Issue 708). Please be careful with mounted media (e.g. USB / network disks) as when the library is rescanned, these files not existing is taken as deletion, which will provoke a removal from their playlists. Please keep backups if playlists are important. Drag and Drop ------------- Quod Libet has extensive drag-and-drop support in the playlists browser. You can drag and drop songs from other browsers (eg the search browser) onto an existing playlist, or songs from one playlist to another. When you drop a song into the left-hand pane in the playlist browser, but not onto a playlist, a new playlist is created, named after that song. Importing and Exporting Playlists --------------------------------- As outlined above, you can import playlists from `pls` or `m3u` files using the _Import_ button. In addition to creating the playlist, any files in it will be added to your library. You can also drag and drop an `m3u` playlist file from an external browser onto the left-hand pane in the playlist browser to import a playlist. To export playlists to `m3u`, you first need to install the Export playlist export plugin. Once installed, you can export playlists to M3U or PLS format by right clicking on the playlist, then *Plugins* -> *Export Playlist*. Dynamic Playlists ----------------- You may wonder whether Quod Libet doesn't have so-called "dynamic" or "smart" playlists as you may know them from other music players, that is, playlists that automatically update themselves for example to always contain all songs from a certain artist that you have in your library. In fact, QL does have this functionality, but it is implemented via the search functionality and hence located in the search browser, not in the playlists browser. Creating a dynamic playlist: * Go to the search browser, (either using *View* or *Music* -> *Browse Library*). * Enter what you want to search for (see :ref:`the section about searching<Searching>` for QL's powerful search options), for example `artist = radiohead`. Optionally, click on search to test your search and modify it until you're happy. * Click the arrow next to the search box on the right, to open the drop-down menu. You will see a history of some recent searches (if you have searched before), followed by *Edit saved values...* ." Clicking on this, you will be presented with a dialogue box. The *Value* field has been pre-filled with your current search. If you wish, enter a name in the *Name* field (if you leave it blank, QL will name it for you). Click *Add*. You have now created a dynamic playlist, via a saved search. To play, just go to the search browser, click on the arrow to the right of the field and select your saved search from the list. If you want to create several of such saved searches at once, you may find it more convenient to edit a text file instead of clicking through the GUI. To do so, you can :ref:`edit the configuration text file <ConfigFiles>` ``~/.quodlibet/lists/queries.saved``. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/search.rst��������������������������������������������������������0000644�0001750�0001750�00000001242�13112005742�021261� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Search Browser -------------- The *Search Library* browser (which is the default one) lets you enter search terms and play all matching songs. It also supports :ref:`complex searches <Searching>`. Finally, it lets you limit the number of results; right-click on the text bar and select *Limit Results*. To display your whole library, don't enter any search terms. The browser remembers the last eight searches you made automatically. If you want to save more, you can right-click on the text entry and select *Edit Saved Values...*, which will let you name and save searches permanently. Saved searches will appear above automatically remembered ones in the menu. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/index.rst���������������������������������������������������������0000644�0001750�0001750�00000000313�13112005742�021121� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Browse: Browsing Your Library ===================== .. toctree:: :titlesonly: overview playlists search album paned filesystem iradio audiofeeds soundcloud ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/soundcloud.rst����������������������������������������������������0000644�0001750�0001750�00000005533�13112005742�022202� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Soundcloud Browser ================== *From v3.7* Overview -------- This browser lets you interact with `Soundcloud <https://soundcloud.com>`_ and play tracks from the millions on offer. Where possible it aims to keep the look and feel as familiar and integrated to the Quod Libet experience as possible. .. image:: ../../images/soundcloud-browser.png :scale: 50% :align: right Connecting your account ----------------------- If you have an account, you can also access your favourites and rate songs. To do so, click the Soundcloud connect button at the bottom right. This will then take you to. If your operating system is configured to process ``quodlibet://`` URLs with Quod Libet (see `the instructions <https://quodlibet.github.io/callbacks/soundcloud.html?code=CODE_GOES_HERE>`_ given to you there) then this process will happen automatically. If not, you can copy the code from the web page that appears and click the QL button again to enter it. Once you are logged, in you can log out by clicking the same button again, now a disconnect button (seen in the screenshot). Features -------- Higher quality streams ^^^^^^^^^^^^^^^^^^^^^^ The Soundcloud browser will use the download URL, where available, for the highest quality stream. Note this may require that you are logged in, and is usually *not* available. Support for Quod Libet queries ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ One of the more interesting features of the soundcloud browser is that it can *translate* simpler queries in standard QL syntax to something that can work across the web to a library that isn't yours. Obviously, there are many limitations to this approach both conceptually and due to its implementation, but nonetheless queries like ``&(#(length>300), title=dubstep)`` get (roughly) what you might expect. Tags ^^^^ Supported tags * ``artist``, ``genre``, and ``title`` translate as you might imagine * ``website`` translates to Soundcloud's current URL for that track * ``~#rating`` is translated to 0.0 (not a Soundcloud favourite) or 1.0 (a Soundcloud favourite) * ``~#bitrate`` is the highest bitrate available when playing the track (normally 128) * ``~comments`` is translated to the track details. New tags * ``~#favoritings_count`` and ``~#likes_count`` etc represent how often these tracks have been favorited / liked (note that there currently seem to be inconsistencies within Soundcloud itself as to how these are populated) * ``soundcloud_track_id`` is the soundcloud unique ID for the track. Comments ^^^^^^^^ Comments in Soundcloud have been integrated to QL as read-only bookmarks, as they are also time-specific text to do with a particular song. Unlike bookmarks they have a lot more metadata (notably the user), so this is rendered as text. To see them, access as you normally would bookmarks (e.g. view info, right-click the time widget or edit the bookmarks). ���������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/filesystem.rst����������������������������������������������������0000644�0001750�0001750�00000001077�13112005742�022206� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������File System Browser ------------------- This browser lets you view songs based on the folder they're in. It can play and edit songs inside and outside of your song library, and adds an item to the context menu to add the selected songs to your library. If you try to add songs to a playlist or the play queue that aren't in your library, they will be added automatically to it. .. note:: Since ratings and play counts are usually stored in the library rather than the song, play counts and ratings will only be saved if you add the song to your library! �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/audiofeeds.rst����������������������������������������������������0000644�0001750�0001750�00000001010�13112005742�022115� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Audio Feeds Browser ------------------- The *Audio Feeds* browser allows you to subscribe to syndicated feeds with attached audio files; these are often called "podcasts" or "blogcasts." Feeds are automatically checked for updates every two hours, and emboldened if new entries are found. You can right-click on a file in an audio feed, and select *Download*, to download it to your hard drive. Currently this has no effect on the feed itself (so changes to the local song will not be reflected in the feed list). ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/browse/album.rst���������������������������������������������������������0000644�0001750�0001750�00000005407�13112005742�021123� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Album Browser ============= Identifying albums ------------------ Throughout Quod Libet, albums are grouped by examining the ``album`` tag on individual songs. To support distinct albums with the same name, groups of songs with the same 'album' tag are further inspected for the presence of one of three tags: ``album_grouping_key``, ``labelid``, and ``musicbrainz_albumid``, in that order. If a song has any of these, it will be used to identify the album it belongs to along with the ``album`` tag. In short, if more than one album in your library has the same name, use one of the secondary tags to separate them. The MusicBrainz plugin will add ``musicbrainz_albumid`` tags automatically, and may be the easiest solution for adding identically-named albums to your library. Album List Browser ------------------ .. image:: ../../images/album.png :scale: 35% :align: right The *Album List* browser makes it easy to treat your music collection as a set of albums, presented on the left, rather than as a set of songs, via album-centric enhancements to viewing, sorting, and searching. You can (configurably) display the album art next to each album to allow faster identification of your albums (plus *it's just prettier*...). Extra features related to searching, sorting and presenting albums are detailed below. Searching --------- After creating the list of albums using the heuristic described above, the Album List browser then computes information across all the songs in an album. While the browser uses sensible defaults as to exactly how this information is compiled, it also exposes the choice while searching. This is most useful with numeric searches. For example, to find the albums with an *average* rating of 0.6 or greater, you can search for ``#(rating >= .6)`` This works because the Album List averages the values of numeric tags by default. To find the albums with *any song* with a rating of .6 or greater, though, you have to add something to your search: ``#(rating:max >= .6)`` These tag suffixes work for any numeric search. The options are ``min``, ``max``, ``sum``, and ``avg`` (the default). For string tags, the values which get searched are created by joining all of the underlying songs' values together. The albums in an Album List also have a few tags which are computed in a particular manner. A few of the interesting ones: * ``~#length`` is computed as the sum of the length of the underlying songs. * ``~#tracks`` and ``~#discs`` are the total number of songs and discs in an album. Also useful, though not strictly album-only: * ``~#filesize`` is the size on disk of a file in bytes (but can be formatted for humans) * ``~people`` is computed from all underlying tracks, with duplicate entries removed. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/editing_tags.rst���������������������������������������������������������0000644�0001750�0001750�00000007701�13112005742�021162� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _EditingTags: Editing Tags ============ .. image:: ../images/tagedit.png :scale: 45% :align: right You can edit a song's tags by right clicking on it and selecting *Edit Tags*. In addition to manually entering the tags, if the song's filename contains information about all or some of the tags, you can use the *Edit tags from path* tab to populate these tags automatically. Please see :ref:`editing tags from path <tags-from-path>` below describing the process for several songs (the process is the same). Editing tags for several songs at once -------------------------------------- To edit tags for several songs at once, select those songs (using Ctrl or Shift), then right click and "Edit Tags". Note that in the tag-editing window that opens, you have several tabs available. The default *Edit tags* tab will apply the same tags to all marked songs, so it only makes sense for tags that are common to all songs, e.g. album or genre. However, the tabs *Tags from Path* and *Track Numbers* let you edit tags that differ across songs: .. _tags-from-path: Editing tags from path ^^^^^^^^^^^^^^^^^^^^^^ The tab *Tags from Path* lets you batch edit tags that differ across songs, such as title, by using the filename as input. Note that you can customize the pattern that the tag editor uses to extract the tags from the filename: just imitate the pattern you see for your files, putting the relevant tag name in angular brackets. Example: * Your file names have a pattern like this: ``01 - The Beatles - Yellow Submarine.ogg`` * Edit the pattern to show: ``<tracknumber> - <artist> - <title>`` * Note that you can omit the file extension in your pattern. * Click on *Preview* to see how your pattern would be interpreted for each song. The preview is shown to the right of the current value; you may have to scroll right to see it. You can even include information from the entire path in this pattern matching: * You have files like this ``~/home/username/music/favourites/the_beatles/yellow_submarine/01 - Yellow Submarine.ogg`` * Use pattern: ``<artist>/<album>/<tracknumber> - <title>`` * In that case, you probably want to check the boxes for *Replace underscores with spaces* and *Title-case tags*. * Note that QL automatically digs as far upwards in the folder hierarchy as it needs to given the pattern you put in, so you don't need to enter any (potentially complex) folder structure that is above the needed info. You can see recent patterns you used by clicking on the drop down arrow to the right of the pattern input field. Additionally, clicking on *Edit saved values* in the drop-down that opens will let you save patterns and optionally name them. Use this for patterns that you apply frequently. If you leave the *Name* field blank for your pattern, the name will be identical to the pattern. Batch edit track numbers ^^^^^^^^^^^^^^^^^^^^^^^^ The *Track Numbers* tab in the tag editing window lets you batch edit track numbers ascending across the files. If your files are in the correct order, you simply check that you like the *Start from* and *Total tracks* values. If you put in any value greater than one for *Total tracks*, QL will use a tracknumber pattern `tracknumber/totaltracks`, e.g. ``2/12`` for *Total tracks* = ``12``. If you only want a single number for the track number, set *Total tracks* to zero. If your files are not in the correct order, for example because they are sorted alphabetically, you can drag and drop them into the desired order in the *File* field inside the *Track numbers* tab of the tag editing window before (optionally) clicking preview and then save. Rename Files Based on Tags -------------------------- QL also lets you rename the files of songs based on tags, either for one song or for several songs. Edit patterns the same way you would for *Edit tags from path* (see above). This feature even lets you move them to a different directory; for more info see the :ref:`renaming files guide <RenamingFiles>`. ���������������������������������������������������������������quodlibet-3.9.1/docs/guide/faq.rst������������������������������������������������������������������0000644�0001750�0001750�00000021353�13112005742�017267� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Frequently Asked Questions ========================== Why don't all my songs appear in the song list when searching for them? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Do you have a global filter in use? Check the *Browsers* tab in *Preferences*. Why do my MP3 files have the wrong length? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ID3 standard defines the ``TLEN`` frame. If an MP3 has an ID3 tag which contains a ``TLEN`` frame, Quod Libet will use it. You can remove possibly incorrect ``TLEN`` frames from your MP3 files using the "Fix MP3 Duration" plugin or the ``mid3v2`` tool:: $ mid3v2 --delete-frames=TLEN filename.mp3 If there are variable bit-rate (VBR) files, there may be errors in the frames themselves leading to an incorrectly computed length separate from any tags. You can fix this problem with various tools, e.g. `mp3val <http://mp3val.sourceforge.net/>`_:: $ sudo apt-get install mp3val $ mp3val -f filename.mp3 Whenever I type a space, Quod Libet pauses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Users of some keyboard layouts, including the popular French Alternative, may hit this bug. In these layouts, the spacebar sends a non-breaking space character, which GTK+ interprets as ``<control>space``. This is a `known bug in GTK <https://bugzilla.gnome.org/show_bug.cgi?id=541466>`__. You can work around it by changing your keyboard layout to send a regular space, or by changing the keybinding for play/pause using the method above. How do I add custom / unusual tags to the columns in the song list? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Refer to :ref:`editing tags<EditingTags>` if you need to add any custom tags. 2. Right-click the song list header bar and select *Customize Headers* from the context menu (or click *Preferences* from the main menu and select *Song List*) 3. In the *Others* field, click *Edit*, then *Add*, and enter the custom tag name, remembering that they are case-sensitive. Lesser-known (but useful) tags here might include ``~#playcount``, ``~#skipcount``, ``~#bitrate`` or ``~playlists``. How do I use a different soundcard with Quod Libet? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See the chapter on configuring the AudioBackends in the user's guide. Why does Quod Libet sort my songs out of order? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Music metadata, like music, comes in many languages, and sorting multi-language text is hard to do. It depends on your language as well as the text being sorted, and often is still not well-defined. `Unicode Technical Standard #10 <http://www.unicode.org/reports/tr10/>`_ outlines an algorithm to sort multi-language text, but even then it needs ordinal data for each character for each language. We don't know of any Python implementations of it, and any implementation we use would have to be fast since we compare thousands of strings when sorting. I have two albums with the same name which are merged in the Album List ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Tag them with different ``albumartist`` tags. You can also use ``musicbrainz_albumid`` tags, which several other taggers and our "MusicBrainz Lookup" plugin can write. I have two discs of the same album, and they don't get merged in the Album List ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Make sure they have the same name (i.e. without "(disc x)" on the end). If they are still not merged, they have different `albumartist`, `labelid` or ``musicbrainz_albumid`` tags. If they have different label ID tags, delete the incorrect one. If they have different MusicBrainz album ID tags, add a ``labelid`` tag that is the same for both albums. Can I show more than 0 to 4 notes when rating songs? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Close Quod Libet; in ``~/.quodlibet/config`` find the ``ratings = 4`` line. Change it to ``ratings = however many ratings you want``. It's best if the value divides 100 evenly; multiples of 2 and 5 are good. You will need to use the ratings right-click menu to set ratings above 4. How can I hide incomplete albums from the Album View? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ One way is to enter ``#(tracks > 5)`` into the search box above the album list - this will only show albums with greater than 5 tracks. How can I list my tracks based on their ratings? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Right-click somewhere on the headers bar (below the search bar), select "Track Headers" from the menu and add "Ratings". Now if you click "Ratings" on the headers bar your tracks will be sorted based on their ratings. How is album art handled? ~~~~~~~~~~~~~~~~~~~~~~~~~ There are many ways users like to keep their album art, and Quod Libet supports graphics (primarily `.jpg` but `.gif` and `.png` also) in these ways: * Files in the *album* directory with fixed names eg ``folder.jpg``, ``cover.jpg``, ``front.png`` * A file containing the ``labelid`` (eg *COCX-32760 cover.jpg*) * Files of certain other names linked to a given album in a shared directory: ``<musicbrainz_albumid>.ext`` or ``<artist> - <title>.ext`` * Sub-folders of certain names (``covers/`` or ``<labelid>/``) with compatible images in them. * Embedded cover art in the file itself (incomplete support in some formats). There are fuzzy-matching algorithms to try to determine the most specific match if multiple of the above exist. If you're adding new album art, the *Album Art downloader* plugin allows you to do so easily and is compatible with the above. Why do songs disappear from my playlists? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is due to the way the library works, and that playlists entries are based on filename. One of several things might have happened, before a re-scan of the library (on start-up or otherwise) * The songs have been renamed, moved, or their directory moved. Note this includes using *Rename Files* from the tag editor. * A removable (mounted) media device - USB disk, network share, internet folder or whatever is/was no longer available (at the time of refresh). Note if you're using the Auto Library Update this will happen immediately (There are ideas to improve this: Issue 961). Can QL read my ID3 tags encoded in euc-kr / cp1251 / windows-1252 etc? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can define a custom list of encodings to check. UTF-8 is always tried first, and Latin-1 is always tried last. To make your own list, close QL, open up ``~/.quodlibet/config``, and find the ``id3encoding`` option. You can enter any valid encodings here, separated by spaces, and they will be tried in order. If you have files already imported into your library with incorrect tags, you'll need to reload them. Quod Libet saves ID3 tags in UTF-8 or UTF-16. What does the name mean? ~~~~~~~~~~~~~~~~~~~~~~~~ *Quodlibet* or *Quod libet* is Latin for "whatever you please" or "whatever you want", which is the kind of attitude we want to convey with QL: you control how you fiddle with your music. A *quodlibet* is also a type of musical composition, an improvisation by several players or vocalists at once, which is a pretty accurate description of QL's development. *Ex falso quodlibet*, or "from a falsehood, whatever you please" is one of the properties of material implication (*if/then*) in classical logics; in standard notation it can be written as ``∀A (⊥ → A)``. Finally, the initial directory imported into Subversion was named `ql`, because I was experimenting with a syntax for a _q_uery _l_anguage. Where do the release names come from? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ `Daily Dinosaur Comics <http://www.qwantz.com/>`_ at the time of the release. I like <my favorite player>, so I won't use Quod Libet! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Okay. We think Quod Libet beats other players in the areas where it counts (where exactly it does count is undecided; 'tag editing', 'massive libraries', and 'regexp searching' have all been cited); we didn't like the other players. If you do, continue using them. You still might want to check out Ex Falso, since while there's an awful lot of media players out there, there are far fewer choices for tag editors. You could also :ref:`help us make Quod Libet better <Contribute>`. Changing the volume in Quod Libet changes the master volume! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Since 3.5 Quod Libet will control the PulseAudio stream volume directly (same as the application slider in ``pavucontrol``) which might have an effect on the master volume and vice versa. To restore the old behavior disable ``flat-volumes`` mode in PulseAudio. See ``man pulse-daemon.conf`` for more information. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/shortcuts.rst������������������������������������������������������������0000644�0001750�0001750�00000003175�13112005742�020560� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Keyboard Shortcuts ================== The following lists describe various keyboard shortcuts and actions for their corresponding interface element. Many more can be seen in context menus accessible by right clicking on a specific interface element or by pressing :kbd:`Shift-F10` while the element is focused. :kbd:`Primary` stands for the :kbd:`Control` key on Linux and Windows and the :kbd:`Command` / :kbd:`⌘` key on OS X. :kbd:`Alt` stands for the :kbd:`Option` / :kbd:`⌥` key on OS X. Main Window ----------- * :kbd:`Alt` + :kbd:`Left` - Seek backwards by 10 seconds * :kbd:`Alt` + :kbd:`Right` - Seek forward by 10 seconds * :kbd:`Primary` + :kbd:`L` - Focus the search entry Browsers -------- * :kbd:`Primary` + :kbd:`Shift` + :kbd:`J` - Reset filters and jump to the playing song. Song Lists ---------- * :kbd:`Primary` + :kbd:`I` - Open the information window for the selected song(s) * :kbd:`Alt` + :kbd:`Return` - Open the tag editor for the selected song(s) * :kbd:`Primary` + :kbd:`Return` - Queue the selected song(s) * :kbd:`Primary` + :kbd:`F` - Show the inline search entry * :kbd:`Primary` + :kbd:`Left Click` on a column header - Add the column to the list of columns to sort by. Tree Views ---------- * :kbd:`Left` or :kbd:`Primary` + :kbd:`Left` - Collapses the element or select the parent element * :kbd:`Right` or :kbd:`Primary` + :kbd:`Right` - Expands the element Text Entries ------------ * :kbd:`Primary` + :kbd:`Z` - Undo the last change * :kbd:`Primary` + :kbd:`Shift` + :kbd:`Z` - Redo the last undone change Paned Browser ------------- * :kbd:`Primary` + :kbd:`Home` - Select all songs in all panes ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/playback/����������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017546� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/playback/index.rst�������������������������������������������������������0000644�0001750�0001750�00000000116�13112005742�021407� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Playback ======== .. toctree:: :titlesonly: backends replaygain ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/playback/replaygain.rst��������������������������������������������������0000644�0001750�0001750�00000007133�13115500547�022447� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _replaygain: Replay Gain =========== `Replay Gain <https://en.wikipedia.org/wiki/Replay_Gain>`_ is a common standard for adjusting the loudness of songs/albums to the same level. Quod Libet provides tools for analyzing songs, saving the calculated values in the song's metadata and adjusting the volume. Audio Analysis -------------- .. image:: images/replaygain_plugin.png :align: right :scale: 85% For calculating replay gain values QL provides a replaygain plugin. Simply select some songs, or some albums and activate the replaygain plugin in the plugin submenu. The replaygain plugin has to go through every bit of song data so this can take some time. After the analyzing part is finished you can save the calculated values. They will be written into the song's metadata. The replay gain plugin calculates a peak and a gain value for each song and for each album. The *gain value* specifies how much the volume of the song has to be adjusted so it equals the replay gain standard loudness level. The *peak value* holds the value of the loudest (or highest amplitude in fact) part in the song/album. This is needed because the range where the song volume can be increased is limited and pushing the volume over it would lead to sound distortion, so called "clipping". The calculated gain adjustments are relative to 89 dB. To find out more about how the calculation is done, read the `detailed summary <http://wiki.hydrogenaud.io/index.php?title=Replay_Gain_specification>`_ over at the hydrogenaudio's knowledgebase. QL uses GStreamer for this operation, so check out `rganalysis docs <http://www.gstreamer.net/data/doc/gstreamer/head/gst-plugins-good-plugins/ht ml/gst-plugins-good-plugins-rganalysis.html>`_ for more info. Setting it up ------------- .. image:: images/replaygain_pref.png :align: right Under *Music* > *Preferences* > *Player* you can activate replay gain adjustment. There are two configuration options available: *Fall-back gain* is the volume adjustment that gets used for songs with no replay gain tags (which have not been analyzed). Most audio files are rather high volume these days and the difference between an 89db song and an unadjusted song can be quite high (e.g. >9dB). So to avoid a sudden volume jump, try setting this value to the average gain adjustment in your library. *Pre-amp gain* simply gets added to each song's gain value, i.e. it adjusts the default loudness level (89 db). The problem is though, that if it is too high, Quod Libet can't increase the volume for some songs because they would exceed the volume limit and cause clipping. Applying volume adjustment -------------------------- .. image:: images/replaygain_force.png :align: right In Quod Libet the gain type is tied to the active browser and play order. The "Media Devices" and "Playlist" browsers will only use track gain. In all other browsers the "In Order" play order will switch on the album gain adjustment (it will fall back to track gain if there is no album gain). In "Shuffle" mode only the track gain gets applied. It is possible to set the active gain type manually by right clicking on the volume slider button and choosing the type in the menu. The chosen gain type will then be active until Quod Libet is closed. Querying existing Replay Gain values ------------------------------------ You can perform simple or complex searches (see SearchingGuide) using RG data. Here are a few useful ones: Find *all files without track Replay Gain*: ``replaygain_track_gain=""`` Find *really loud albums* (best in AlbumListBrowser): ``#(tracks>5, replaygain_album_gain<=-11)`` �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/playback/backends.rst����������������������������������������������������0000644�0001750�0001750�00000005504�13112005742�022060� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Audio Backends ============== Quod Libet currently supports GStreamer and Xine as an audio backend. The default backend can be changed in ``~/.quodlibet/config`` by setting the ``backend`` option (``gstbe`` = GStreamer, ``xinebe`` = Xine, ``nullbe`` = no backend). Make sure Quod Libet isn't running while you edit the file. GStreamer Backend ----------------- Custom Pipelines ^^^^^^^^^^^^^^^^ It's possible to attach a custom GStreamer pipeline to the player backend under *File* → *Preferences* → *Playback* → *Output Pipeline*. The pipeline syntax is equivalent to what is used in the *gst-launch* utility. See ``man gst-launch`` for further information and examples. In case the custom pipline doesn't contain an audio sink, Quod Libet will add a default one for you. Debugging Pipelines ^^^^^^^^^^^^^^^^^^^ In case you are interested in which GStreamer elements and audio formats are used in the current pipeline, start Quod Libet in debug mode (``quodlibet --debug``), go to *File* → *Preferences* → *Playback* and press the *Print Pipeline* button. It will print the whole pipeline used for the current active song to *stdout*. For debugging GStreamer related issues see the official GStreamer docs: `Running and debugging GStreamer Applications <https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gst- running.html>`__ Gapless Playback ^^^^^^^^^^^^^^^^ Gstreamer supports gapless playback for all common formats except MP3. See the following bug report for more information: https://bugzilla.gnome.org/show_bug.cgi?id=620323 Selecting an Output Device ^^^^^^^^^^^^^^^^^^^^^^^^^^ If you want QL to output to a different device you have to pass the device option to the sink by setting a custom pipeline. In case of pulseaudio you can get a list of available devices by executing:: #!/usr/bin/env python2 import gi gi.require_version("Gst", "1.0") from gi.repository import Gst Gst.init(None) dm = Gst.DeviceMonitor() dm.start() for device in dm.get_devices(): if device.get_device_class() == "Audio/Sink": props = device.get_properties() element = device.create_element(None) type_name = element.get_factory().get_name() device_name = element.props.device print "%s device=%r" % (type_name, device_name) dm.stop() which should give you something like:: pulsesink device='alsa_output.pci-0000_00_1b.0.analog-stereo' which you can use as is, as a custom pipeline. Xine Backend ------------ The Xine backend needs either xine-lib 1.1.x or xine-lib 1.2.x. Since most distributions make QL only depend on GStreamer, you might have to install xine-lib manually (*libxine1*, *lixine2* in Debian/Ubuntu). To enable the backend, set the ``backend`` option in the ``config`` file to ``"xinebe"`` while QL isn't running. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/playback/images/���������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021013� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/playback/images/replaygain_plugin.png������������������������������������0000644�0001750�0001750�00000043130�13112005742�025235� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����$���ܬ���sRGB���� pHYs�� �� ����tIME���bKGD�����EIDATx|Uׂe-kǾw-X]mkyWWW}u(JH $$%P?Ý{-In|3̜9s2s~=O~rNqp!v6ZahI!==C\y^B#GHXX<z[9g)TaCT~r9,P6&@x%55+.T8!,g:Z-br "0ŗBie#_ cnz`҉(.RtThhB2fIG;7˟Q1EBi>gˇty 8t:UQrr!&Dk%n?{$V6m.B6hvAn-sp.0⃘@brZA:0V2)BF{ddt^YrŽȪݖ<}#m/oӢ.+`0sV=t7r|Ǡ 1Sd̄ y[wr/w= ;z!3ϕ,~AaXfCɿ_)/~)4\/DHb|2~۞Cp.0i?(qJgG%A&E^\W-Kjv\y9s ;qB`ٔ[%~3ZXVdɫ,+bg=v\l̩ו0dH +SɎ: ֱ~CL9N<..;ⵘt0仨B{e{SsZ>c^omߧkƱY#/^ OWFn?#oKTr;vzE?9.S-LgKiƱgkpD7JvJ2tZyyw|5ilߡ[Yޮz g|9-׳2b2zqI0>k 0i'(~:u07ީ]L/N9p-Gs=G_  \"7Bcf*]1Бc@^HD7΃@EmtNȞ{hyXgK/3ۃcwׂad|o ֐v~"WzM(_WOz"wM{y׸{j:!▾YN11ǙUH 1A8Mbϊ?*Vg//d{!>h^rei!F-- ]d%n(ZMoOZIW-s< a OȐwGlt-\ۈD>'ϩqBGN Bw% 3y3h]WH"f9WkDJL_{͓S6D4>Cd;d"'Eϙ1q[L/R]S׿!?.s<} C,Mmtims@G�eޮ}@7 ɪUw3zoTX=&iA@  !y\|l3]I^ɨr;vއsޓk=<K1y]Ku71dK+Z{q�}~ 1G՞z{>C( Yz{TyoTr]kwb>&=.Rw.^n/bE^_'j`בmnε3D1(")&߄giusb8q-&x}WHDї//eeJ! ± e| UVW @uP5L>U�,2ht-|3y51Y+gi `cP}?/E~[S\˛/>C3Ĥy3�c 1A8p/~%w\|JHI^EJ@k}􍑵[ӒU'3ANI=ob܎,XyrdNb=tYkkiomlL<Yffh!2`}&ƭiEPiz9뵼"ĕ!_,E\?>O 1A8|c _sKZFIݭ8Hõp>BUK^*J~*E5Ղ/Ҳ++UP^9[ &Jt8kAzOX?A>H _ }<q6%>@?~B&x){m`kyOE+Ӷjgao1rFOAG0a,߲sIx@WQ}F& #"pzg1_Wy<^ c\ĵ|ɧtI%6{|J>\6 Χky3ã өqOө s~ ^@_8 J\BULg6鱗B"`q˴(0I(30"OXuX|<q-p,bK5w|>GH0p`s90lw!o|&JY}bBH-Q%>1T]|~?n&B4>ɿBB!Ob۽k'!ْbB!bB!bB!bB!bB1!B1!B1!B1ʏBif\ 2akK𢡊!'&4Fk>s )2r0&r9|RuR߷OIK=yƴÇBi\dȠry;vL:9xCDe{uTUVHeyC !4b2׺ErQ~ȖBOLTSBH*& 9~޲+&E)W-o_aWL0NUvln=bRw@l"}B#&jkeuJ 1U֮NUCL <aogvir-e}%c{9ӟT̘1Um{&&uʚUpo 1Q dm*(}19PHw)$Fҹsvq1K.J<Pݵs$&,|f.:vP..lMN }1ݿH.SN9~p饗ʜ{յx,*,;S&N s{mB(tk~ses~V;t wulۺy<~8vM7g%|w&?/Wӟ3ΐ뮻N9<iއ\y2}'gy7OS;<袋@*s+obRTBW1�_Z%Eb4HIؘԩs#<"q8333nys^``:k< 5X|A?#yᇝazg: x{g|d1p;~X^fثb+}uOu!k'ܽӮiS+ U{(\Ғ3g*o>P2[6kFƎrHb:AootҞs<>KBabx{g>w|[nv-@(YٽoQ>lNjX U{(ڴ@]AF[7/~!?h~ 8gL]KH00 NQ1:i<0qw碛7H~}w˳>k;}<VlN[ݛU*߽sSWmZLXW _0r֛ y衇[*91lnڄQX=vЕ'gL>e=1ޙy yIߴI{Yg6nLFl"ݵe'}ccӧMӅ&JNJjNwެ4Vn瞃]^i1ASdu!C?_3CcSO w&$PB깶~Z㷿wqw%%_pfW9C˸2-<ƍu :D.2rʄmٽo0kL[Pp}Lwڪ<PZ{fyNL%GH[(tZ[%:y*&!d2oZfVT%S2 [Z*eb[$8/Ĥ6Q4uAkFwA'1J&/2~i+х2la| _EJ97<;t}q%B 5ڴKB!MO|B!ibDB!MOLqL!yhb B!Dӷ-I2w[.'#ce?ʔq} u}ڬ6앥23Z.8~\l/Y!?%AS/\Q;JG1U סO.['mEqq_$o^^MBL}ڬI@+kr )qPf,/u.SXMa ۹]s}ln7n S.'U<|'NHuMJ·霖dƪ*Xad\W(o!_[&1]|ޣ)ꫮ1^թva /P:v(cF!_.APڬ|:9]^4L:d<p<%HzOGoɓm%{mG"VA2lM. ymmu{ɒJz6qIsa7˂e:*a(9-Pn #s4(1->$'ҿ>iaٳ ̚5SB} ZTÇeOC6i^>Aοq-wq9@-~JB1ߨB:b;~Bv;$UzޜTǹ~qZWSrv}6wբcRZ[Z]f m-25vbN?�-D;<%v8y\PU6}`:jVXb{2XU +e^Hek0.@ՠHOgnl|MZLbr-X ScZ`IS .mVL>ɋǻIqqU[N<fkq^nM21._ת0ɐՃZ!60gR!SqU۶KS_6UkKbzn -Ua=[.}[3F?I.]u1sa;ybwQˤFx/A@q.]sX"~??./# dHDV˛ ?3UP%Z0޷#FpȑrmI؄ A3Ylb xqrIP6 :Q8f3a,l'La܁qviuKޮKt(/ׅ- **qM;aN͇w)rw|=s]eλZT\#|<}7<ޫ�%^8/ZiZ~ K F.**M>*W)&ܹd;#tU <Hw 0@o{{&M[0R1xY=GrmVLڈg>dzmwybs(dPǹ#UդcUacn),S`tsAxmZ6?SKa% jUg'3HDr_mm;=2cYQ}V6kd @'V~7Ō*t˷96\ĤI1߯\{AyLuʙjCu]\?<ڬkt[ysޅzo^[ 'lM~%3I/#wʧ[za(L1ˋࡣ2}Yޞ8mNyݕm52"2K>T5dRUdg]lK%*$d0kZs{V�AzL5VɗeLd7[}Vi"K%zǥ~7ŕҕAu#?EʿVH 7ܠݿBPBW_Vq@Ť6+&#o2u5UPŎu hxߥ ΰJg7~sUm,a}{%H3> >t[x]UJi\io;7Xv{̓O`b{ML˳q >{7kaizKlvcː .2[^Ғb|eܒ9|O6GÁI+izڬt~P/yNgꖗ7ϒה- }ڬZB<?ZJm14B7GL}ڬ5y_T(׳2Ͷvnfn.C6+&oXCHgDd x73JɩmpT5Ч͊[W3e _{?z9it;O k5L}ڬ]2!f͊ Fњ(&4Z+6_2ceLI,=c">{H 9E;6ńbB5 li^ßkIŅ]6h^]6ńbB5wB| *\8{b)&j^zi_#UAýpqQQx)&8wi&hXؼy䪫 J y衇$--b^}q p%$ +U/W أ-ڰSU>{a_d֭JNo߿wpĉrwe]si>|+RW A+'VSS#_u9޽{4bJj1|.α'|R%-0y(&!l5Y1*:W/ j+̲QZȔPACJdM7 ¾?Ez٧Osʒ'N ^-^Xn&y/z)}e^4bJLn߾][***tM,Xiˈ9lrwꚚq_|QKRRRPۅ& Wkf?Mv 3oxwIaӖ+<Ju{Ȃu5X_S{T&,uo}<(`X~eҥi <M!&{9 iBҔaco}Iɖ-[wcp>쳲aIlӟ#G4j O?]v92gDﳘ2d9t 4AU4m/u [c.-gC 8ݵVlZw;,K7o}'OB2e]/Ϊ6wS8KMMm1=zTcicˤɀ4ގts0<f48/9N⋘eݷo^f?Mv۫1}=JɩY &XGQ1:N,fu]Cvh1٩un ý>ӨX5..? I&9>x2gؼ^__/ƍ@ ŤY/Z'ގuuo�Cᅲ+&Vo0}5˘\>vQ&8׾GeJb^]W FDAYZq:%(d^߯Mܣ;]fWLc>a7$a@}]{ァͻx|_C6{饗t9*~/5wl-deZ~3}^O8 kiT@db\bb.wÀyvv@W<hFB#<|gصe2aW?`92-w- <α--&wR@ &22-[oUwÍ1AXAAKi^wf}] xA[Kv0,a|U ʌ%:ިuenk˼6|yso31C.=k00Ww'Ǟv4gϞ=4cz2bZ >Ѽn{@8!Xu~\4Zk?zqK0Ӂ: bFĄ--D_@+|Nu 梘PLh&5ۤߜ@LǷ䛙{aL1hMhu w+aI\ H& FQL(&4Fhm趗F1h(&-p1^ńbBjtFf5L|!'h4Os$a{>`III>VXR#͕0ml111zTQVf嚗n{鶷U[o]b61c4rn{+1͛Yжc[Ohl3\ ƆDH 3ܹc\m0IZmml-ΰp\4<8jVXxL>@Ex1%xܹ &͵;C=!XF 5 BLrK(&!h};r۫ atd5)ܒ8POmuyW+Ҡ;ɛ & ;~YF$Vݔ~jmdhI‚۞5/z ̙Z_K~G$>S`v Q@a.\(/m1qu-MǣB}.wSCn{?<n8¶U5/RLZeUer:VK^}/w嵊=Rn6t+zJgSC0n{ ;ѭjQk^e7Wxt'$-S<fhƛw<u|d6O>t_Virw<Zmނc::itԩS'<k^F1 sע@LKj&bӏ<u 07ڵk~x<ݗU?m4e7)`#6- hcipW+׼t=bVht6etK h趗F1h(&-`^ńbBltKPLh4bB1h4ńFkF4 ńF 趗F1h (&hi(=PL<òjժװ)1&( %{|(|+`'66̡yY7\3RL{=)++37 /SN[NOՎ &/[{Mή+`'66T >}x<5/x趗bҤ 3n{1-hx̸ U9گjg]t3f4yc9|p=߮Ebf%KtM;t5+WV\at6!=kחx趗b]+�{іr Wc!OEk Sw= U9(h1<G}`Тm\fskuMob>];נSmo#;0yd-�g3{rK<tK1 C_,jO?s_K#&xa`֝\u>cңGYr}^VxML<]լ\[y mog+]Sx _Oy}n{)&!c(̃-\V{;c04SOInlm5s[\7m{ [<tYL)퐹k쳒dʲr#T&%2F OXt -䰖tۋ.$\P AAO0Ĥ{ċf/15!&\[s m{`:ư0=7׼v^b/m֬YV7Tn{aG- s L>]<Z^Fא%<�oWL<v`7Wܹs+ftnɻK,5U<FS͛$s۸C1 ڊ^ZB(&4ZkQL(&4ZF4 ńF 趗F1h(&FPLh4F1ڀm/bB16QL(&4ZbB4 ńF7򹦘PLnK50ٿC(t8̆x[拻]+j}&ګ^I3ݖpkďO1<b! Kl!66_ZV11=4ysn{e4wu 5>i TBc:<fRŌ1#^*~w|G,˳t<O7FwBޝloam/Ť̛ݖrkGS-7xCOGk&&&.�JkzZosfpq~wΤ$>*299 Ν /՝ C@n{/v͕WF3ov[my5-C|ٕ-\Ч9N:0;{֛olr}鮞΃Ba` mo`n{ s:NatK1i1nZ=E<FѮ;_+1:ζZ26ov:n/bbtZm]vՃ ϼ h2\z沊n:W)Æ iB7{lsN[!&t:[m/$$Ť%Z{n=Z=j+OsQs1~d:�g?bb7''G M_|E.r[ ?;u uu0W^IHZ[sʟ+kرP6QLhVL,Ƨ6n:ńn{i m/bB16QL(&4ZF4 ńF(&FQLh6`CG)a3ߖQL(&4Zg#c$7;L1hMl _^t bB1 ]t&~_?:; l(&YL͵Rn{ ;=]4[%4γWSMi}pS A :-,#=Q˅^(;v1bcbe Ť%Zm/ S`զ,ۂnCML0aRQ^&´X; .Ą4^ }2bpL(&PtO'QXMK.2cƌĎ]oq&oRX Yn..L,7|�ɜp=[ Ť-^y)++s@kVk]}]V{p+//>v'qpnA5M73$6b7 Z%I3r-(#ue]d3PLZl ]Z2%KL<5_c=&=z+Wen1'MVRLIqQ3Oc'M(rR1\b ^l G1 6t n{‘=Sҭ[7cn׮:_d>IdPL|UYQ.gq1Bz֬2a˄bpuk!&ݻw{"—cV-+oױrӋ>[q- [-Eeq'u=]܎PL(&h !&ӧO[wM5u_ | 4MVl׽pi,18\|rgj)-)pTF(tbB15AhF1Gkb2 bBPLh@[&ќF1hٻp`ńbBfCLh FQL(&4FhCg ńFkb;jd|L1h`?F1QL(&m誗bB1PLZ&Nt鮅qKU$חsz衇$--]k0$?/WɅق,ϣ^Ť5Ŵ㶴"&08 Ω(&ѵkWKyY^fWQLZ<YKzSNzFݔa_~z|9#_"O<ݩ<' Ə/wyQȍ7(wvnIygw_9ŤS+eCj^njW^ŤW?hiIVݿ2g}DnOb2dmZ^~eK/spCo!ka~ڵkwĈۺg;[tA*:gxpE4Ijѓ&M5joX(uqxru8a +&\sܽ{z=3A9 <?##C;C,uU'nKbB]JKC7V]]^2ۇ)&YgHY`^Ak\tKKH $X>#zu.1FZvsk@V\.ue.;\vìҿh"=F=^PtM4I+0ԾQPb`]4[nCm}F!ýޫk<�_PP.u c@>Xbb~tou]tYzϮ۾ bǃн%>^Ť[[p06G4 ŤMńbB1PLh4 ńF1Gk/Yi џ bB1h4 ńFh\QL(&4i 4 Ť]Ӟ{PLڋPL(t̸N*n{ ˓W^yEy-{CLf m @H1^Zz;{CCR__'}d[Gj=vQL58c#'^P9R;Œk֬11+<0,M1 m/)"?uur앝;*R2)/-"I r>==Pqkf5<]spዙf&&>u%!fDnz1?bb+>>~wy 4ȓ.]Ȍ3BVL趗F1iի塇j%z,~AEWe˖5rkM.}IRRnerr;Y6sL֭nEO݆x Tn|'VYvN{yyvbB4I+l Jn{ͶsNYxBQ1C(F;]`7|27ƒͅtVyǤGrʐдULfϚ%ee $';K&MPtYjjj% N̂єbt(-w5섄Z~7Aܟz)E4^7RZR$WUnV_ղ&O,? 5K.`;v <5k>]G Λ#Mv[?bVₐ۶XOݥL͕ؒbBtqnޑZ^VNI ˮ090> oPx[5  !716mn%:tm1ӧw߭D NvtKkMc&BTz%3iBk n{P]`EZkN+cnjуZxxx (&m1D㏾Ia~>bB5q`ZɐA$!>'1ϣhlgB U1Iې*#m}BߘZbB!yq-!(ƍZp狐4BiPL!PL!PL!PL! ! ! ! !B1!B1!B1!B1aBBBB0!PL!PL!PL!PL(&B(&B(&B(&B(&B!B!KLW-'J 19v!V !p̄BńBńbB!bB!bBHfjr#ȷUIqa[? !!HuUlܐ"S'OÆ~0qR[[^˶tI,N| 2bηm[6KM !"٘" y9rQ9qÇ%';K&-׮i"F/b;?Dl>)*̗E DP2 :e+!8OnNn١)E4.V I.!& >RTX uRL P[FW [$P|,*GW'EZx !$&Gxq�\K1ACbBH*>r ܯ#)&ŤV(&!1P|?jʞ=o/b[LꕘtWU$I]F_ńj3d 37YgUyvŤ^ L ={vKyy8Y Ta$X.zy#;w|PbBHB2{=\)*yuR٩^zlBs9:ܮL6Mn&93k'Q1DyY^Ai8BBlenUz{v*KK%;+c|x-p5]/MgSA1! B hy@H.L k+K._B60-(1)ιsW_-+V:ɑmVLER /``T HNI^׫*u륬T*++dӦ4-Z8_7nPt@Q{5MkS@1!$AWV/-+2%,Ew(')gp<g.]$&&(e ,hO>r/Uz LFX~~riefV_/+Wlݼ0c[Lʾ5Q\DJ*P$/[&UٶE.+dl )7{xj؇V lS5 #H^NڹCϙ%;wlwuC)!nn,⢂ۀbBH@8)U\|<?UgV%&8Λ?{6~q(W]uU¿gϞv^#fjc'|a/FCM<::Znf:%EŅrV/-S5+KֶtYDcߦubn]c|Tqٲ<!N֭I]\ÇE󵘭^B2n<7p܊xتb"`zbBH<)Pn-{lUTL"##uo0N9mm^?tP:Kv(s-w񅺘i1YDc]JY:I2lTbY6]-7d _ǫ[m |ay9YZ@̜l/Ο_gn`֎q9F1!- ^~Y$g?YJ@v* !ISYL<y]wITB]tDDcUf^w>쳥Bݣk|؏ݵ\㳋]1HBF6Ux@U_(ghlLYױaB,[5^tOgn->G%/7[9,G�CXER\T([7K\l |]-{願b, 1XHgVUߦrj&Ղؠ dg†xsirWIBR-[nW^3<%TK,5wyGFyuG?HJk>橧_~YPggg /1>4lV N o1JHk\+P/,&U%)j<gVDLVfV-!dlݬq@p_ "qiPbBH(?nPKSOMJ0 :Z#p&Gw„_Z:t \s;6r=QG][0vƶrw˩*]I?䓺SN2y$Ŷۧ-$>Ek"IYIW\2U>hQQQVRC8T D%ej FWcZ.RY !|| !!*&|s`w&8g®X~Zݕt! GjiQí!&0vb'< w9�: 0!!Ahw@1!$D{EM 󝂂 _ }I!y %iN1Yf[6KaA‚%>j2}F-4uܕ`bBH J1V yNA47qqFl!9)IW׮F`\`c^.7 4bBHɁ+y9z,ݬ[A?FSLWIjJdefƴ4vINNՊu)1OĄ7 1Q_#1?î`�_L<;XLlc1~uC !*&WASL;BBPLnmر MLn_YU?Am/!!~P0ٲicPolټIM,E󺴸HJvV. Y(&a`0vlV/WUeyH~  oaUaW1=mf]𤠔P|A O5K1!$Z'ܚdBjO6eLnW'%ŅA? !9T_sO1!)Z(۫IEyߟ][V-WPF o mPL! ! ! ! !B1!B1!B1!B1!B(&B(&B(&B(&<B!B!B!^Lp"!b೘B!P:w(:+T\8(~\qVE:"zBHI :trnlŅKMo8"x!Ҿxġ8tC'.qن8KqVq. !;~Ё8tZN\Ѝ: M;.Bw8tCpDGniɩ3M}`r(UΎ{B!ʡ ry8á#u9q@GGW:""Ҿҡ8tC'q醘htph\#_Biw\Ё pC'tiNu8d91rC}u0BH\Ѕ3:qC7N5CT a1tBinLZahO?@ U'#����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/playback/images/replaygain_pref.png��������������������������������������0000644�0001750�0001750�00000011172�13112005742�024674� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�����q���B4���sRGB���� pHYs�� �� ����tIME)cw���bKGD�����IDATx] TU6eRTP| -'rUb\.R2M+54DPI+S@4 r|cY3ַgsϹBЍ\@ m @!6ц@ m hӭm3A Y2+Ҧ۝fч4mg̘aooߣG'')S X'NNJJdHhUhcYi H :Ԅ:|蠵Ï;ZS]uYO=e@wa[o-` !2̜͡9Ӫm{Gg A7EΎ嗕̛\>}3mڴ ?Fpء1c 6n8lچ޸8|L0?H/Sr f۽޻52RPZq]wC8κXTXYwmHPyvqvTyyCΓ|c>}:N@,\YȯB{bb ҽ{w.7}t2pCݜ9spxGڱ# ̙4n۹sҏ=O_|ݟ 8gϞWUV*/S|ysr $>徾QzZjZi$pLP(J.(WiDgR>'ذa=>a7|TarT4Dݒ˹k6l߿NN6Ǹ#|lUez+!~-,X&Ftd^4hB fFhS]PdmLcUV}A ~vNT&IWϑ8 H02fm$ Ch‹hrZA~spEh#ZY_{  ڗMZ..Ғ6lPi2@ΓБ;Y=m$ 0PƷTp8w\_υ ۷/ҩO_)?2#F`xx�=�c-&=M:|,{m\DM锔M"e'7*fϞnTL:Uc&gSv8x [>m[4FbJ_yeF$sr/lrV9{F6>IWWWe@^9JmSOq+r~![>QyRp[Q(r3ΞABRe0 2z-%riA�w+|||@ګ5LMg` ˧ >t=gC&@ DhC 6ц@ DháH#z5h@%,wFzefމ~I 01mB/|[ر9ru?=iý"/z?'Mz!m wO @L)b;;;'''~in{{ÆÇ//))qwUVZR'hҴsqqٲe Kdӧ_~{vLk.'x={z{{e=#(˗lll%'LUeNSJ"mF vO|.,j__ݫ< Z ?"ѷo_d?cmm=v {~fxx%;::ҷ`9p�IKbbQՠA6o$Pt6UvE=Mcc#GEaټy3;T{ ˗-(/۵k/ܙ+BB0Z/{ݩS <{kd$zxcfԃ*\\ض wu>߼{)CϞvb9[96 [+WҋH<#0ƿtiӴ j(ekkjDGo%[qnԒ6{?^κIn&66...=;yf6̄gm$oF!=0AMf$i1r/K^\64�H=}J6QC ᐜ|{3$RRY]BrjQo%[97jI =_)<SS%4m@k2tм<nс64&}`f(/+;Z7#RnX UIچ2w܁䓁1V˵T9|!\^HttZd+i#i sڵ7ik4OrEGms<==: P NL1c'yC_ R]\m${1qOA?L4TK >۶q4f<B#q6p@*rVў6}+ Q\%rLÇqL/eb;�ci#7)"3,e]R<{&]p Ĉk1"�Ϗ׭eW)W$ig̘!:AQȵTKڠ tqȭn \=r4a-=m4Vp(wK@ҒM"@'{XcfKdΦJ/C更9<ƚm, VN3u:88tǝͼǝ*ϙ&ǝݤ6ˠ {D eچuE$~PqMҁ:lC Zl--kц@  @!6ц@  @!6цTe%ڨϙeŕWkihChT8~ut MO֭ODoKK=ތ b9q?}2C{I�z)fGnل}sSц`z 6&@[n!dD違bBsMzSƼh$換7o2~ɓr�C1fj:fhkuOϚ%Z]' Xrt)wĉVi mF�&dr6z76 C .((b5}hsƍ /HLhcgIͼy%&ЦU={8M\kMFFF``… %? inn><<\/ڴ475*hcH(k~K $,'b8*+>>>ۣ%%Ժ3] 8;;hd2mT*̙3ʞyPmZZZ@1p-YX\ӧTW%L"Vh*9`gg mz!p>Mkk>t@@dw7oD{N/\ޠW�`FoARh+˨n j=jm8Xwa}TQ3VUVYz=i|g g#F06mvEo՚jh71mTŴA0'Ъ6z\LV686i jm F5A@\iK,i#*V2yrh Je}RR"K+cYv-v rKd~hh(wK�i}hVcU�`^[|K/I.Y ƍ޽m_ns?aH=}%?JTai9pYYY3X>nF|K@6tmm9s M}l ̝;7-4#2%7?1NUvǝXU}ai m,mm~ww_~\.ڀ% OŞ6c06u% P5_@OLBګ5%Er(*ȧ_@S5mN;jzlzΘ?}yY|b.ME<1 IKeow655mGslvDG37o -[n )PO%6ц@ DhC 6yIV:atJ'ty$餕N?xtJ't:^:҉6im *NZJңG޿SguK'%%M24\:iw4m׭xgutoo$tJ7mmZVVV\Gkָ8;3=/_ qww?|¬%3wrrڽ肎{$59XtzCCj7'i65Uj~vHt Æ SX6̗/[6eHO\g07.XHϤn u =;I|rN=]NΜS1T42x!ti ^Q Q3KF(5i$Je!t͓Ob5\\T$>_Y\6bu>,C:=""B3K'tMA~7BDW3WXsːN9Gcc1I+<a IV:Ѧ}!tJ'oH+hCtKV:Ѧӿo餕NowF:҉6N'tMIV:ц@ DhC mц@ DhC X  B&����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/guide/playback/images/replaygain_force.png�������������������������������������0000644�0001750�0001750�00000027423�13112005742�025044� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������ƒ��� pHYs�� �� ����tIME 7ܗT���bKGD�����.IDATxP37dҝ82$_2i-;zCޭ^Po$˪$B&;.^.H:Yo{)>sgOsw"+ߓEF\YdeEF\YdeEF\YdeEF\qYdy uwwwAHYLeb[ZZBBB ųgϞ Y$Fa |0v64ya`` Q){ƌF $,|d5#d6J2/<_Ysh w1>4ioom4d*=wLJj60ui3>۰)4<_(Ie+=q򜅋}|:7Ν562!)vݸʃȸ6HGL34F*-#ѝPTdν GwTDhV@vc>?qjѯRE* a7:6N׬h@Í!@.^n#̌Zhkj߰-ۤՁAL)R#@Yd/r$Dvƭۤ*<h�Nv""c>n"!](FfF))؉yrQA===1 fФKoWUUiZycjMuPRU | \H[((̾2S666w [�(n}}= HI3 .8̌{Z(?MMM gBVVV:8/,,F@ZSqJz .~qC;c^qȶI8 dÃD2".tT ·&~~~\ڸ]|.%5E|F5A8%[w꙱y;cyn`]ŏ;*RqVY )�uT N=hzF`-šAG$}}}LKKKo<hNJInu?j2HjMau}70l,6p�&%cwt~ts4-<n2 nB$?_^Q!AG T@[II ~nqE!?q8G⼴2 G VSmnnljnHJNnu+_l&3EQQ`gQ5Ton@byzr $5-}??`֜/</(I.]fzDR/<i>۰)"2:\f-مü]8X ! aG|EEEwl!!= o4V\*شZucc]CC]Bb@T*"GFQD׋4oȨ~Gt<H"LaBF[Y[$&œC0rzfjH6V p8njME]}Mm6.>P䕗ÂVb(6 *"*ūiLećqXD- Ba>Hwtih8$gxL)X e*VQY`4yy]K(<:HVH`5x2Ʀzҋ ⶟MUIqcc=,8$xz/S'0تBޭXT+#<^ufJjb*R82c^̐B_uaַ,SjXSctfjHO e ! "V*,( ny58.(g%%1SRSA&GYSF:: 8zSF+zn]0-*APA7V#)8RPPӫʂ\HQZE fav^ VR3%5E@P5TPHOGgM}9~ʴیsZ?pѤvs]t9q:o`R{?4,յbU"?7W 1 q:35$K[wUBRn"UAp]s+;; gaJJb(sQT UңAh NZZ[;no؊ΝT@KsOLpqrj₈ËEǓ�<_"gegyxw⢕yi>zL f�PxҢt֖_@.AaGo{fdd >wFS(<GEPT UczVg[6 29KBL54|\�3ߌhhZ~CVv{69:ƖƇCu 'Ϙ7 4軷D(�srySYgL--fMI�#՟'T!̔ͭLJJuO!Ԑ8/mL!"%[FVZ2;7/+k^>=p#&Z]+ 3%5EQxTAuP)!=8♲Rl\n ,oG';V7oG߽̎@aQ pҊ>D$;UIƭh|{M [.^ڷlF_AA_MYgIL^3޵mݱYܽW$Yq\OZ_=ɖ#9T]]ͫgF^eoBDliIٹ~>׮xy{!\vX>H̔FQ$RzʔpOI<+((t|r/ P'xz;,:7>ƟdYBI04!;}̅EDlز 8B+ oaXJf:K?O=qdR$9*̹!5!Lp `;333߲A 鉐'̿fJIONLMOܞ^))8 ;ZQQQ-A$f(6 *"z͔~"`~<Wc9CH3nX l0ky<$,|up�ᯎs⦬$=p.Z|ќqx Cp},"ŽU())'Og$'%y]垜 =Sj$LQT RTȊ#@HNIYnCBRҗNϱpR#qǠKaWCX ;P* 7;p8ItZq"=T n4bCeՠ Pq37@p{&%%ACLgI|q-CacbEȃst4K"f,hvpʩ`77/#:?v4800g/^ V[+TB\1g⽯N<xY@!JGU e&Laoܴ ÈtPk{GFԙBB }ќ:?Y'%rdQ# ?xɋWB:qyLP{ór DCQB%* =~kRr OĽ~0O /q@ۦ靦g ML+YY,|0<e&P]]]j(TH/;!MEMۅ"'A gL<+3n5Ssriu#B:^5hB:nd*пi.G `ѓ~o^N*4|ݽbfڇ~?7'rh~F\ACBB߿T*<=%,(t"> [1¢cXǮ K@@A|f*ԯLIVOI烣W7e%K\\pn|98 t٘i{5͔nnnvtvYt'_əCvGB{D! #{'{<z}bd*ᯎi4շ@B ͡_alz.n_;A7 lfN9:!lr$E|׾=dغzya4#ar/A所^wV0#d›2S`qy ˍ0yMER! f//Eʈ;ĥ8K0iO))wL54"o_WL ^!y\O^XnNę.mڶ}2# QK  25wq+Loj8G}<| 55a[w☟!DK-)M''Hn`a4npQ(ᐈE %"^|V]7a lƻaxl\U??{)3dim [e;*f7G`T6%%r]&ː!V8$"#>[O_J!F-[<mHDF|8"Esnx'ÕDėe(S~uBS?nwXY솬\8d[WWGW[[7ߴ]Ȫi~!C4_n݈csRӇjʪtV~-6Ťݑ P}}=~5MkA }Sv ( ˉ4/%^f^Yq5j FSʫ=7 u(Z]UU�.))o!lkkK.$Q9c \a㇟l0# s1ק#nb\̚T W ړOX'˔뱜KS&Gy_<?v@boWkЫO&d4cWRǥ leeC9jzOOmD+|쒑ٕ+S +yXXZ錉0k!).G#ߖЉ'##΃8] +Ϗ>r`rZFW^xC-g-̓念{'b#dÈ---SSS3_ 477ǡL=Ę >1)?oMf__hי5!e4& KXBS)cDwΚ>xW|#Л~nf O)6;.=y( |/-- ('&&ʕ+ߏ{-_p!)))NO?SCu_;t8sLΞjOHH@ʸrѰ`]T1`Rʉ2 *ew߂ouu'BZ,AUYծ1({-"^\ DD`Fa//^xE=$Ғ0(Lʉ!Aw"KW-;&'mZ}a>|,u ,JtRց!"җz-u./zXeBj^a XĐˈ#N\0e f&޻t٪%ЛDrIXB`x۾!q{JB|sV'7,Y|sU$>3l3[r/LMFF(}(J�c*W瘏'Lzұ_Y8saE"]RlfX"PWb)8,INNF/'*2uh95Ѐ<AGMl:k{+=E~ %IJeEG\^+{yHyxɖƒa`w\F;"& K`-f͟w'&a.2]C0Ϳxw{Im~ ȢE QMM|kE(|)mu}@ii)|,qAԺ$>!a[1265;;~lUn:?[,]M|I䃱x uBT/vů@Rl3A$,,,..&FP;d4EаMی#f1ɓ֜vݻwtD$O\|%<GA!Yz M_j[\YSm1 111UT*c8d }bAAANNľ`N`=<<ęT52 jFdirᢃ35%эpy`l`03 fύGSg~j4afV69#_B9q=KOϞ=`!tqyEd))gJPPPdd$|tDqq1]d#޷`30I}tt4 gggc.Ȧ ,t=tvuM54jhlG�&LԘV(߸eckŶuNPH?Ç:G Z~#9wiO<Ayflߩnkol~{oσ&]tDaa@ADx)7OGڱg|Si)@, xIYy9c|IiټK!Dkmk#fC?;q2#=T@ѼD(%q/YE^{˜" xxyy8dTvZZ;HVMV#;xhȞae!Nf:0TNSF�\Ri/(ܺsC2p%utt2;yh Q.2{}vHH 33ną;zۇ1NIIt'44#Nc:Fvo2}qf7/ݦfBU?ϴeWjř( 3^0,=lx$K+.v/eĥ"އ˓ 1DK{Ӎ7H&@&Lκyx"q-;ǏWk>?DoMtL ַaUy[ ☆ޏTc =9>+jmÇY"O7y侮ZOF\˴}pN,--MMMϞ={17 >Ü/#+8vW|̵6Ö^Ϗ>`&q;:.^1#wTB_'Ḅą˖<aҬ =)4} t:;;-oeoA iE*}J-'Jpp0\;XB&\-V.4%5T$N7n(=$!CvDkMѲh_2-.Rq$v/%PL"2e]�\tw.I 1ećq =uUB4L/482qV"5,0SŚ*y![ [!C\cDY((Lyr?WIoTȜsuN=2qG^$8B�˂riZq^g]ď')aT8*oUKptT�YEĔk@>UtN:;*/>|qvtBFkAc~7'#䢰,%w \-[GS"CBy{z$">P}3 ^ly{(x񢅅+?(((,,,222f 8eVmkk�yyy%%%Ս cG'&&斖<y5,3P*ɈˈSjY% v > 5gF*M3x!µp SsܷLeܼpϯ>XyOO֜V|@xIYsFy$#7)w(i>kolۃxq͏l+H,i{yri۲ mƇ]t>a%ۥg7ke4\ "'ʃsYsMs[?Æ�v~iν&zrsBmC{7#- sG]OcLql/ 'qzWӍf8y-!a7dayfe7)l�o)XbL_y弹_ԨwB55JlyGuDԣGƷ!A!FTd/f^E<!|Oz[_i o�n___oپ 1qqwg<Xwm4v(&bU ǵX$ԲvS噕Y׵unRHzcݷVJ )+;|݄g�C:I[ݮ_xşt_EMVS[777_a=k3f~yD8 r̀߸u[LL AOq#~K1,%<j/^$0Dwjx._z7<)kx2f4.y]J $w ?Dʇ⨪*2nL٘3B?} t=|=_eg65x2.^&%+WGDݯT*ٱ{@WZ(0G/=Z#`KcEҁJ)V|탎uPYo$r#x:)>7U$5x>mxjQ/,@%w5k]u*?~,8yd|Ҳ2dYBI[uTL: #Ƽu4>Z7C3:K}H"bc>jXWܪcƌD겝_Sm*M&lEzViJa]aPKَğT !BYn8J [ݱ7l9D?+`? #~ܷvx O:s%+9|h-\x0.uz!'Nv�uNp6#'ݬ;*(<g_V5= dԩp4O^~*V!GU9j u?`wvMuVrIrq}˗BûhgW7`a16\݄bOo!ښ毭¢"n9 {xyeS_ j#;կ̙;xe8!ʇUekTM{Zy> v~ywM\"+P;nl."PYOOOسFKfDoxGn^eeg8tTYUi�"__?˗gqƾr;C8 pխs{ME8pkEE<q= _y؉=yqQqpvGCWJs-2UD{ޏ~{ƍ;::6u<!D\Fo]=([Ziz)co9?~_gϞΕ{!D$ҙ%ɿ~T |kSxxr=^|&8hMEF|#/ˇ~xPg!O~S`ȵR~_;i֊}PMCߢ"#>?1~xP>g $JN7uV7k.Wd]۲?is&?Ү*NiCєjSqAgEe/\f͠OG}4mڴ+W`i|ᕂSã'eR*] qc[ .}EpO\O|5o\>^%RP <z"yw~ߔtJWR0QQQƒ~ !O}XfV E=t.Dp_?ɓ'kkk윜<<<RRR`G4‧߂D/"]'B߼}ky5رMB?{?hZ[[04)hċ-uuuCਈDEo!Dhќf޳x?R%n =JѰp7O8_LRjJ6xG$!p؆#:m˧HyN sÇa1gh$~*OOO5H|}}Z1OIuc}H@"e._i$2Bw^pp0R໲رcnzz:h@|C51Hߓ7泝!"/X e]duW ΋<+19^T⶜:7!!(O~FDD~␵uss[eھy\MRhJl e>q^+.2 Gk6l_[wϑ;0阑0KOѪ7oބ'JAF|( װ\r%Bm Sg~z)cfY:8N6i0{nl|3N40;'[D6F΍OL:w2ͺU]Y#p$ ;pzwpS&g-?UA׍zDniiWcFS !]}Ʀ&D@=3[p'hMHxV\[SlR6nRiR6ȱ۶nڑPR$Vx:mvz7񑇸Py=HDޏN7+*+Ir⥔NTގ�dzgc'N蘸]0Sx &ҲrdM0jUY&f/XgeG"S8N!a{~εBMWISX].f)22V]j݆4yuUP쒳DWDLNoMF| wݺu… O>zs |ϏO t.,ĩGRp28dUX xyEQWZq , +NMh|t:݁NA8VD/R>{F^(--MLL `n'Ϙ05Ϟsbiv!~Vc{PQauI6<aۮ7nP%EBvA?ȱ:n kfde15+>[ŝ]f͞b`xҕ 'ISӊF.;*i:w2ʃR;*=Tmx,6>a@L"M-++KNN=EdϏ6Q_d8. *Ckd V,f9 "55522'\r?/I48.@G;dE\za=V%¢h|t:BF| )][[[CCCUUUQQQVVV||@?0o~AtɪYFRap@N)J1d_x1hv4>N`ěZ-|A o qi^ȁB fG 2xgg'E]]✜WAAt"#>0x񢫫 " b4(,,,((Q>  fDcyhj48,@wS#Ϟ=#+|C^RRqMz@tmY$]hF4& E#ĄOʣ;)28y=YPӂn", 09aIthL4)͋F&|_t6#Nq + : `cIOCјhR4,L&G##.#>CN)9 iJ***B(\Y$h:4 &Eâyhj48囘QS6 j����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/contact.rst��������������������������������������������������������������������0000644�0001750�0001750�00000001540�13112005742�017052� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Contact: Contact ======= It's easy to find the email addresses of Quod Libet's authors and maintainers, but please don't email us directly unless asked to, or if it concerns us specifically. If you contact just us, it means no one else can help you, and we can be really bad about replying to email. If you have a question or want to report a bug please `open a new issue <https://github.com/quodlibet/quodlibet/issues/new>`_ on the GitHub issue tracker. If you want to address the wider Quod Libet community consider sending a mail to our `quod-libet-devel Google group <http://groups.google.com/group/quod-libet-development>`_. Quod Libet has an IRC channel on `OFTC <https://www.oftc.net/>`_ , *#quodlibet*. It is a good place to ask for help with installation and configuration, or discuss development (assuming people there are paying attention). ����������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/extra.css����������������������������������������������������������������������0000644�0001750�0001750�00000000703�13112005742�016522� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wy-side-nav-search { background-color: initial; } .wy-nav-top { background-color: #404040; } .wy-side-nav-search input[type="text"] { border-color: transparent; } .wy-nav-content { margin: initial; } .rst-content div[role=navigation], footer { font-size: 0.85em; color: #999; } .rst-content div[role=navigation] hr { margin-top: 6px; } footer hr { margin-bottom: 6px; } .rst-footer-buttons { display: none; } �������������������������������������������������������������quodlibet-3.9.1/docs/packaging.rst������������������������������������������������������������������0000644�0001750�0001750�00000007052�13115500547�017355� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _PackagingGuide: Packaging Guide =============== This page is directed at distributions, packagers and developers. Please :ref:`contact us <Contact>` if there is anything unclear / out of date / missing. For license & copyright information see :ref:`license` Existing Packaging ------------------ The following distributions package Quod Libet: * Arch Linux: https://www.archlinux.org/packages/extra/any/quodlibet/ * Debian: https://packages.debian.org/source/sid/quodlibet * Fedora: https://admin.fedoraproject.org/pkgdb/package/quodlibet/ The Ubuntu PPA / unstable repo builds are automated by the following scripts: https://github.com/quodlibet/ppa-scripts .. _Dependencies: Non-Optional Runtime Dependencies --------------------------------- The following software is needed to start Ex Falso or Quod Libet. * **Python** (2.7) * **PyGObject** including **cairo support** (>= 3.12) * **pycairo** (>= 1.8) * **mutagen** (>= 1.32) * **GTK+** (>= 3.10) * **libsoup** (>= 2.44) * On OS X only: **PyObjC** * **feedparser** * **faulthandler** For icons a complete **icon theme** is needed, preferably with symbolic icons. For example **adwaita-icon-theme** or the older **gnome-icon-theme** + **gnome-icon-theme-symbolic** For playback support in Quod Libet one of the following two is needed: GStreamer ^^^^^^^^^ Required: * **GStreamer** (>= 1.0) + **typelibs** * **GStreamer Plugins Base**: Vorbis, Alsa, ... Optional but recommended: * **GStreamer Plugins Good**: Pulseaudio, FLAC, Jack, ... * **GStreamer Plugins Ugly**: MP3 (mad), ... * **GStreamer Plugins Bad**: MP3 (mpg123), MP4, Opus, ... * **GStreamer libav/ffmpeg**: WMA, ... Xine ^^^^ * **xine-lib** 1.1 or 1.2 (the shared library, no Python bindings) Optional Runtime Dependencies ----------------------------- **dbus-python**: * Enables the DBus interface * Multimedia key support under GNOME **libkeybinder-3.0** + **typelib**: * Multimedia key support under non Gnome setups **libgtksourceview-3** + **typelib**: * Undo/Redo support for multiline text fields **media-player-info**: * For detection of DAPs **udisks2**: * For detection of DAPs **libmodplug1**: * For MOD support Plugin Dependencies ------------------- All plugin dependencies are optional and will only prevent the corresponding plugin from loading. **notification-daemon** (or any other implementation of the dbus spec): * For the notification plugin **python-musicbrainzngs** (>= 0.5): * For the musicbrainz plugin **GStreamer Plugins Good**: * For the replaygain plugin **GStreamer Plugins Bad**: * For the acoustid plugin **python-dbus**: * "Browse Folders" * Screensaver plugins * uPnP server * Gnome search provider * gajim status updater * MPRIS * ... **rygel**: * The uPnP media server **pynotify**: * For the auto library update plugin **webkit2gtk** (== 4.0) + **typelibs**: * For the Lyrics Window plugin **libappindicator-gtk3** + **typelibs**: * For the Tray Icon plugin under Ubuntu Unity and KDE Plasma Build Dependencies ------------------ * **Python** 2.7 (stdlib only) * **gettext** >= 0.15 and **intltool** for translations. * (optional) **sphinx** >= 1.3 For user documentation ``setup.py build_sphinx`` can be used to create the HTML user guide and put it in the build directory in the ``sphinx`` subdirectory. This is not part of the default build process and requires **sphinx**. Testing Dependencies -------------------- * The build dependencies * **pytest** * **pyflakes** * **pep8/pycodestyle** * **polib** ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/index.rst����������������������������������������������������������������������0000644�0001750�0001750�00000002642�13115500547�016540� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. title:: A Music Library/Editor/Player .. image:: images/paned.png :align: right :scale: 50 % **Quod Libet** is a `GTK+ <http://www.gtk.org/>`__-based **audio player** written in `Python <https://www.python.org/>`__, using the `Mutagen <https://github.com/quodlibet/mutagen>`__ tagging library. It's designed around the idea that you know how to organize your music better than we do. It lets you make playlists based on :ref:`regular expressions <Searching>` (don't worry, regular searches work too). It lets you display and edit any tags you want in the file, for all the file formats it supports. Unlike some, Quod Libet will scale to libraries with tens of thousands of songs. It also supports most of the :ref:`features <Features>` you'd expect from a modern media player: Unicode support, advanced tag editing, Replay Gain, podcasts & Internet radio, album art support and all major audio formats - see the :ref:`screenshots <Screenshots>`. **Ex Falso** is a program that uses the same **tag editing** back-end as Quod Libet, but isn't connected to an audio player. If you're perfectly happy with your favorite player and just want something that can handle tagging, Ex Falso is for you. .. toctree:: :maxdepth: 1 :titlesonly: :hidden: screenshots changelog downloads features bugs_repo guide/index packaging translation/index development/index license contact ����������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/Makefile�����������������������������������������������������������������������0000644�0001750�0001750�00000000422�13112005742�016323� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������all: sphinx-build -b html -n . _build_all guide: sphinx-build -b html -c . -n guide _build_guide clean: rm -rf _build_all _build_guide .PHONY: clean guide show linkcheck show: all xdg-open _build_all/index.html linkcheck: sphinx-build -b linkcheck -n . _build_all ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/license.rst��������������������������������������������������������������������0000644�0001750�0001750�00000005516�13112005742�017050� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _license: License & Contributors ====================== License ------- Quod Libet and all associated modules are free software distributed entirely under the terms of the GNU GPL version 2. Alternate licensing terms (such as GNU GPL "version 2 or later", or the GNU LGPL) may be available for certain files or modules; see the files for details. All contributors/translators are listed under "quodlibet/const.py". For the specific copyright holders see the header comments in each file. Contributors ------------ Email addresses of contributors have been removed; when available they can be found in the source archive. All copyright notices in the archive supersede any here. Authors ^^^^^^^ Alexandre Passos, Alexey Bobyakov, Alex Geoffrey Smith, Anders Carlsson, Andreas Bombe, Anton Shestakov, Ari Pollak, Aymeric Mansoux, Bastian Kleineidam, Bastien Gorissen, Ben Zeigler, Carlo Teubner, Christine Spang, Christoph Reiter, David Kågedal, David Schneider, Decklin Foster, Eduardo Gonzalez, Erich Schubert, Federico Pelloni, Felix Krull, Florian Demmer, Guillaume Chazarain, Iñigo Serna, Jacob Lee, Jan Arne Petersen, Javier Kohen, Joe Higton, Joe Wreschnig, Johan Hovold, Johannes Marbach, Johannes Rohrer, Joschka Fischer, Josh Lee, Joshua Kwan, Lalo Martins, Lee Willis, Lukáš Lalinský, Markus Koller, Martijn Pieters, Martin Bergström, Michaël Ball, Michael Urman, Mickael Royer, Nicholas J. Michalek, Nick Boultbee, Niklas Janlert, Nikolai Prokoschenko, Philipp Müller, Philipp Weis, Remi Vanicat, Robert Muth, Steven Robertson, Tomasz Miasko, Tomasz Torcz, Tshepang Lekhonkhobe, Türerkan İnce, Vasiliy Faronov, Zack Weinberg Translators ^^^^^^^^^^^ Alexandre Passos (pt), Andreas Bertheussen (nb), Anton Shestakov (ru), Bastian Kleineidam (de), Bastien Gorissen (fr), Byung-Hee HWANG (ko), ChangBom Yoon (ko), Daniel Nyberg (sv), Dimitris Papageorgiou (el), Djavan Fagundes (pt), Einārs Sprūģis (lv), Eirik Haatveit (nb), Emfox Zhou (zh_CN), Erik Christiansson (sv), Fabien Devaux (fr), Filippo Pappalardo (it), Guillaume Ayoub (fr), Hans van Dok (nl), Honza Hejzl (cs_CZ), Hsin-lin Cheng (zh_TW), Jari Rahkonen (fi), Javier Kohen (es), Joe Wreschnig (en_CA), Johám-Luís Miguéns Vila (es, gl, pt), Jonas Slivka (lt), Joshua Kwan (fr), Luca Baraldi (it), Lukáš Lalinský (sk), Mathieu Morey (fr), Michal Nowikowski (pl), Mugurel Tudor (ro), Mykola Lynnyk (uk), Naglis Jonaitis (lt), Nick Boultbee (fr, en_GB), Olivier Gambier (fr), Piarres Beobide (eu), Roee Haimovich (he), Rüdiger Arp (de), SZERVÁC Attila (hu), Tomasz Torcz (pl), Türerkan İnce (tr), Witold Kieraś (pl), Yasushi Iwata (ja), Δημήτρης Παπαγεωργίου (el), Андрей Федосеев (ru), Микола 'Cthulhu' Линник (uk), Николай Прокошенко (ru), Ростислав "zbrox" Райков (bg), Сергей Федосеев (ru) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/changelog.rst������������������������������������������������������������������0000644�0001750�0001750�00000000052�13112005742�017343� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Changelog ========= .. include:: ../NEWS ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/images/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�016130� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/images/queue_2browsers.png�����������������������������������������������������0000644�0001750�0001750�00000337054�13112005742�022010� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��Q�������� pHYs�� �� ����tIME.)���bKGD����IDATxwX[W{~ν[d&qJ@B "b^cN8TM{b79q{&IwI k=9}9{~}?vꪫv ^X,bNo"vmk_ llllllll'#<ϓ ی~!,bX'|kyHب *XY,b,"禛ndOmFvUWbXIW_} HY,bl"=A66B~'bXJ'bX,v4 dX,:bX,v obX,I%(666(bX,(66Q_Y,kVnu$:)D}>i}砹Ax'f#YAeduQdtodH=czF_M |&D/ɎOge1D4Ś"Cvk*<iy6wj:7߈tҍ[<0ř[ѾhM9fJíxͷFŲ<-~Φg@y5{kp卷mzߩD'=&z~LvT:}|ɧu܈!!u‹v{镸󁇱Mŕ_cщ/w!7,=2Ἧ{{t};dboE?{iuҵ9zF5"}&soE7bmzG?~{ݒy6`\]?{O6%GMnMֶ{|Eo|W_=.o G׏E։xzt-YD21DXY-kZHtqu"gλ3wH�'&<׳/sdgĨ5.:}y\n,p|XNנb2oi絻\/ǟoםC}W"|}عwg]Um=,?s�׽QDtdc"MbD:Y%lH+bdGп#44Z?L&ɶ]owk%<?o3/oretTBѵ>u)Dz{Y+{_DT61D1DNh}_O>\,G;x{؇cI0WrrirP%㊫'bзbݘN9mgcz;k7b B6w0'âONDDKE8xK?>4z~$.n|g ԋ0R`9O'ש-g/]H {y/:mJ-ΝހWx\wj3i/קqx-pÏz7`ẍ T�>N@ٱ}_'k2(66cQY,r2 )<~!81/֍X69_kr *'dxэsJiyX:v5o^1b@0@~amcsOtou="`"5'WZw_iwM 'B;xd-gsгlo.OGq=6UyS;,CFp];ٶ+U76f9ٻ5Y%|%l_zuQ]b6ugߊۉ֏ PJ@Ee3=CC9eԵoCKTǺrwBǯOtΉʘ7ߊ<8K/cC&_"Cg_t*Z:?G(�ъA@"v{1Dƺ#;⯭B]%`g S,xQɶ[φdx]ʨ[z4ڔ#vm7%#u}&{&kɞDϏ?ONvAEj:j8uXDu8VuWjn||.؎ D},֬%/3ϿDO)RϊccJb_Hq'kR2ʨF_|S=dGs~4n'V~52Cѣި;_xWnw趏>h;"\w۝3~Mt-gɧ%L@;_{cs4Oפ}8\.9cN"z&k1_'uOLR w#?fvyQxеNv~RB]( h<̆:лN?QDT61D1DNxѯ?:_ico|{>bLQ#b9$TC;>둮q:VF!*;?LXo9\Pht#jMbw7Aeb;G^[φ26J@x{XoJ7JһF)7!8jKq�>F:2d4_~95Y?ۉ`zG&j41P].uhg[Im6XՅEbcb QlllWZx9qIm䀓%ZHdCXh'6ajm\_~cB瞨KcN(S,XJj*i+ѽ&j< m@I }1ge6%O)C}czKfwkc'Y7<QČL.1'gfXTJUUp`=8,%8i"#P�xWv@w}bSZEݯʛX<16 bM.(666($uѣS4Wuuۆb؎ D},8b%/(666(bX,(66Q| bX,I%(666(bX,(66Q_5bX,I%(666(bX,(66Q_}bX,I%(666(bX,(66Q_~%bX,I%(66CO?bX,CCbX,CCbX,CCbX,CCbX,CCI,FbX Qllll3(rv^vAqas쎖HO<uwgiUy?ןp{gol{n3z2DX,CqQ >1塆αKD={7y[^E'$D})p⥗^>h6xyX,!UNU\3Zvcd)#{dA~ ^~ń}G8̳(*)ێsqTO>YgoE~ \ .{7_<g1Z~;/MXz hKS~<Ԥm0=&sqgn9+֬=G_ktgx/̳ϊۏ{{9aaɊ1bX,(66Q/Ge5AɜDQ`׍7˯%y9b"*oрD|7G6 cuciuƧC9ݯ7vps ^ٻWT]cX_n1CN;Hu]u=&sqo'BG (hkM\/L\蒝"DRwU{{LmMGMcbX Qlll 賵K[n MIG|Y^Q1ο X$d6*)F/Hʼn?楗v7UjyLg ]n<3Զ4n*�S=u=/^l?ot2T6ѵ&{^4g֎7%!ثw{ɼWc1mbX,(66YQws%_;kO=Erсh?q-#EDQ/'֥-vL,b̽Hp6=iY$M}=:3Ͽ unl&d}4QDHR0.*~yfX,C,(S!*@r>cݘyciLUN~ 8@T?τ puAi$j{ &:hFH=kűz~S=/n=\4 q"SG{5>EbX,(66Y Qmq44и@t(r@ a/pNx-z(z3όwcPe=_05&Ñt˭()AlƎUjjƆMg& QD:zHzrMv\xq L N/{7 bch9~b؎eveۯzvN=7yȁ<]p)u,p h?eElB|U"Lv.qϖzQX<Z 6DM3uz7zܽgJi={Η{Fh<dX,v!bX,!!b1DX,CCbbX,(666(bX,(666(bX,(666(GbX,!m:K/X,bTbbcc;$/Y,bN*1D1DX,b1D1DX,b1D1D=#pe*Q|IbX,!!jv 7 ݻgNbX Qlll QBٳg݋W_}uVD0Eu/,b}Ͻv Q�VFwB)݋{!!j2Q9^{mV@_,:zQuCc܈6;*WQ(3|%żzQ3fLLP4"1n 2FHCF,@2,.J[0!`0d4hF@دuy)j,]oAM+ҼZ(*4W'ZR TyV5UU;!-AY fHsUf!wS#S@ c!'4f8+q Qlll Q jTL Q,:*T@g3AdEՋ}Pk6f3B m ÈyU:H PWfCVmK46d Դԇ rjѾ.gzZ=fdyb&BzdA7FL. ~RtXӌT)*ي*3M%{0jC�jbdBRF�k+j nCgF^Y-(֡*]ۂbʹ ΦG4eCa@F `* `j5C Y_ʇs!@FSF(Cߌt\F肼€@ D(An2/}gŊl"/)@A UBtXwY'L%Z `PAP%Vп�QH)UWy 2EJ3ZhFz%, b=u|O?ŶvSlETF5zEh:h6XW_au)_vX|՚1qr6:zɵiL簃b%bZ\XEv`"âlksжPhDfR Vy� wS$!jVa!S�Ue!<v䇭!ujQ3gGdmu:`7 )zD74*E)@ת(p7`/@&]Rܾ`ԡ �Su% `ؼąpG.͹ G1D1D1DJ}'mhRoą__] n; {^X$Bƃ=<Ze"qc.>/hYB,+.v*g}wD{7Gn񹪍f \4zkZOuxC{N25l|hBv/ 'lF-AR+&7`lC7hs Q rِyQG 5gEvG\jHzfҥ!`AIƈyu>:X E0 0:u(cM waP=2HΧEd5< |8vX`ՠy(B3VP@A�Z Qlll QA35uBE1^fAۖ\%n};7r CИ,0h+{Nz-D!q/_0�*FjeqJ_[ᦛ,IEʫ_�; bQ'N MydwYZ$@W_{A{79!< gDžad1eM|m"|p)o$ɞi2Yvd'ŚBÕ=TGgP {w):G̐!R-Az،Uv[Bd{,Y-AP$:Zː_G؂r-5FDڐ&?`iHne s(-mX:ͨh LVl"`@�`J[-p4Q g B W ̀@.T>j3D1D1D?+穧ڶ{S67 !y9IJPcӔ[j(񦃺,)"xLe K,Db}?I_d~ ˯ `"UWOybL׆:CvA|s>\kjÍ 'i]3=E:8M{s.4b%12%-+zQ؈lT芴дT(�)=hu` 7iQ6aa;<ù(@Z MU}dUz5aj!6Ψ Y:(&ՙ"[̀ ֙Q+\WCeԄ6 : nvrЇV]ujUaΗ\zਲ਼!\e ldabcc;!D637oGsHF'+DQt>ԭQ4h<<cg*.]S]>E{GSԉȣ=ȣbE1/@ݻ5.zW_p=xX}~/ʔמbF+ŢhxIuop~shgB9D0*U]>D"Q>d+ 2lFy F=5lW‚zF QɆR�M&_'�W lȨ͆:J#C]dܣK*z!+VDyS,A۳nw*jD` H1,TuгƒJ-\zvAWoFdȍ Y |ia !H'&Pa)AvM>J=Ypк|(666 Q1GXrhziY�QȡNRǟxbtǟ|r6l><c:5q]4Ή\oSPXNcvMuKtDj�V]7fxXD;K/<ع'-B.%ژιMdkj@7@/@ܭiMX"& A8ZW KHQ7lVʡMPHa `%@N@ iavĮy ц\(}тU-C` E64/Ay KU.zV`T`Ѧ!4 6c%hΫ`/Wc* mK<ԏ*aP/R"Ƚ fB�*sGf D%>^-(:eJMݗqI1}H,V9}19'L *RLk? |;ӂqYO2iظ3<Kzv .7YN d!g"GQɘ$>B7Q$*Q:<9YxQJ霋#Q,Vv |fE̘_m@nJ2Zs )ծiY.ƲbŰpDtz;Fh@Z4BnW4EȊ8,؇J,= V.- bj\xb\seMرk#ZmDtu/Gd _P.�ҳpUqٵ#pjk?oYk/DC^ 4?�llG؎_[c ps8!*BW).cQ1rrqAN1S# QH,q j|<(wp DE='K?rˮaXwnu,p/?,&E&_:W9&k/ʶ D1Q,4Sj,(6n=40j`#%b3d&:6Y%B^+ n X i@nЂUj,ևV' ") WJ. 7@6vqrH)V"%W{%&H-V@ݬG_gBS2lv֘^@gU64~*hY'Jp Qlll>cѡAxzr1(DDN}ӡBTL^5 Dݛ\@ԫdK*yMq~AGb%Rԃ/<>Ջ?W�<ƧyQqQ"l1\mUb%(qoDɤnLq{Cu|Ë)^$B<G=yYq_:b%fO;,K{tvBeʈ Jkl(j6 t=,]s pt[ EdUܐ5P7 #ZX#uPҠ^j>[-PTй6]F@[թFr D!ëĮŧ̀9r򕘗@�]5f/*(fTj sӘߎN?8|y(t0D^;Pr'DsOt}gDŏ"gXCT,k܂x !*"1w *Rm}4FDM{!jl' {T)>7|aƏY~X>ќ&3籉/%+`?>S=Q>ɺ+=<M=VvM77vWMtFX?H?${..]6bn7#@ڌ̰NLP٨C5ZREd- Hi5!*@ b,E݊ PZlUA_ĥGP1.̯<mUPٖ  kp] MQ\7TU5@*4OpD(-eMej΅EpЉ; *+T@p C(U;1%W Ni6Y<5b6 bgDX@k~w"_zފcrt]gb%-#Gj@V&|~.5EM h]lʄMWrKjPԏ>C(PXVGmDB%ʄcm?eVQPEiprz(`LREMj8՘o@VD]GkPׯFtuzDL(CFQʁ%`GӢ Qlll3zM&$ +b1-b Yٯ!$N4|Q,QJuCTAۀy#kAJ@΍Qt-7B-�PӐR�BTQ]=l r<^f@tyȭ˅5hB�a 5>p"4 :b-,[&#~%* er zhV\%CShB0,W6iӠz;BmN, @3!CyS>66хZ7&(66uly5Ya([ iET bN<2 kBd5aN)ZX}:Rcad.XNt֡WK)uzZXB+vkV`]*[z(@VǁFVao4͈L5)S k` Y` bM R8Ֆep6١tQߑҐ 3rjh.�J /ՋTi]& {}CUCwKQ+3tm9gی3|(:y!+2jTQVaBB6m�G4eCz,AF^#l\GJH[_. r1Kf3Q9Z4ȫ7yq6z4lFBVلkP5`D˂l[&ZL.8͜EP{LS@Ң~B@3:{44@3!+l"`Cۈs(f(66Q%đ(kw1Ls&8ZQX,kǿb�6F+Rzxd!إ4Ѡ"R�NU.@qZ3l\F*2WKHhѼȏ*gY&kQn =zVjP5lD"VZ} &x#j7)W-GqPߕHu95์))%JȮU"ݣEM: fY)YJ *Ѵ 6{!X8?RE)EL!xKq~ X]# _Ͽ)/UsIOkWV1`XcQEN65C^gBqk dE:[%8R KS,F z5e4>5V �bJD|:;X]jDh2y& :0^O=hcʋZh#P|)[6tiAI܆heȫ*KAM`J#A=sй2!mvCԱlpCM{8dx:\5&= RjvxSc8z9\b&Dl #3l1hDnDh 4(k!Ts< x?+5d5X&֕&Z,(Z,Cm]+.0erбT 8R䘥(JQ ! l <^9"QJ,`B ECRvV-�ɗ' ZӡN)rs!t(+ׅz+J9(;o+v|@TL4pKQ1d,Z Zui<<,Vpxs"Mm(j멒 kmqΥeVǚ1h{??M,6Zv E2h@NL=YiN%7Itڟ}~Bqiks=MV/BWPR*FG?dǐbM;E^m@Z;puḱ~Lu(h�Qg3mR#ݎ.):W @i7 2GtDe(Q"GIM t2T6)PcX&A"N}nFYnBy]6XP>Y P$CV)JBr/D�.hIs1pF2+rxJ 硤1�bcc%5t8 *6?t(55jhEen;w$-)#QՃ7 ^7m"u~IM,hw:4u՜ M8tФwuFKӋw݅pc{~bH8 0([}zv Y,ִ a_ܰB29d4iPS2HQ M璠s KжX#�J7JP,@NR̒ȀSJ<)TR xR^ mTКSиTlA),52}ϞL�P~*Z4ѱ&+pk/mF05ّ3cE-B Qlll QVY7G9"4N9e+셣5:fnL GhRu(N}o5GD(R=;&\b&K. ⲽḦ,{ ˯HxOwS|ZcbQN6D?FNɑl >3ڗ h`"1 LW rUbmv#HS�MTT7P")"VHєBȪ@�P%Yi`ʜP �u*n l%N+"T|zku"C09Z ֭Rs)cbccc:ut2C%O>Bb]}n bwr�'Qv:dי t.@O?hVfHpEs%:'R*{BU0$ѱ{zl;}݄4Y(Z*J9zKWFJzLԦȪ(Y肫I߅t7 )>�U: n)@JtɑY?GP&JKв@J*RQ\)H&vP#SA|U`im)mz*$pfe§(A*PצDF�95Leµ3S]E_cN&R,d0@&l[%P֚ [CM_�N(666D;jq$uZQȣbhdqR%&2L&5qG-R)fߣ(ԋ/4=S{;cNchkZ_FbXQ3`T )uuٕV*qZNN�)LWE5j !+OD=* r4ZiМgƊPڇ/;?<?w<llG@J�) ʀU9f\TemLh>(jPސgԁɕZ-Έ&],�\5h͛ {ECCCQmch9~)nf Qgy1Ql<k!y Q1Sם>=_s)E:S@ZuM3 .X?ʺH)JF1dXӁ%Z�EUi B"~SyqK5THqw.9<] oTZ E]Q=wCr 6%3Ϟ_?�v|gv~LTiӑ5ܹnIE~# Zt^�OabNRW4RԶik5pv +B[bFC9U9hfbcccb: j4;_N.X9&ko37{^<M(ͳe/p](D-ꚷv1s?%{I>t KvcF8;,k:U5,ц(ȄΌ<d֨eYȍQsF9dr*q%rmsPPpbƽI:x^|6vg/ߞ{:7/݆މ} p+RSGz9AQU*lhPRT 9^{l0:5S[E& X i ZԐM. г<*/JF;bXG|K,e>dDloTU 3_TKp(ZA:5rm.89hYFqs&J4RDs˃GoO_?߳ ?= }F?o^=pvmY : NɩN= F)PߙpMy,8x3P(�^ÈQr@-BZ TN%uH@bP�KQRubAᅬrՏ:U^o0 *9e?(#ei%rAcNSV+GjXV,uXiи3a@JL kp/޵ 鹫H=?={~zm.[.A]B(WR2e 4-)@v fjkˀ-,ͭ~%Y# l5"՜p.T&P[NeX,֑(CA5~eMEEk0 Lo&u:Hk4 �e/KG^ v4d T҈\L ф;bs%~{'MqN[o܊ _=Crx5M{ 2PU!-AK_:BiH7G?-ryڐj^EN Q=rDrУ oCCC ؝bXGL&Wm2REpJy 4tX[ WcQ3vɑҮAˈ = ,1/ s8?5C8ݎkK#xpNlbu k{XH6EyhlπMo" , \WgMl!-JfBkѷr={ (6ۈ  tg+Ѵ[eCCDGi٨_]#CԉᄌO1Y=^'sv81e'A Ҫ4h<w~$%]h|JX(-ZP$�#jBL,ݤljRϔ>G*h4d(|mømei}Kxj]�O#jkqvTh3,H mIEǐ5pzRlVnT]#CMVkXl*dhٚwPu5F ,0 !!j"=Ӹ[DX�Eu:Eii(t2T6Gډbu u8^!*pWTM}ZĻ=S:Ru`'ͧ+w2Jsds f%սdA[вsW.e_*S#e(c[EX"/Ψkqnz+޻?<\ۏⓛ‘0-,)Gg #Y,̈́, XN LjHM0"%C;y~ duP6!Av΀&? B E{lՉFu<!U(5!ΛNȏH)n6C;dDovlEoGfrn~.IC`JڕJR!?*~е L.9~SBZ e`qv갹Ňu.\Doyn[׆? v噸\؋.n +x_=؎P�?(o@Q ,Rɱ`NAzȀu:ʵHIa.7 @�E*s G:(5!!u|A+S~WM-SEȼ�y}h.(olKx4MK8,6 Ḱc6(%EsPwso'DڗҏbB'Mhj+_+~d$sMdS2gFeS~EFrY 8_xr /R=g<g-‹֨NT/_l-=ؿc>3qkLM9vwݻ,'|f:!+_r$p%*+Y0΅# {Xg06uH2́*52K2+4=+(�dŹ\WpH9o!~zJ|x gy=_Soބ CbȕҀi+Pݗ9YOt2ޕڐ9.)}%P{_*v0FM$TG] Qlll Q /xcL9S9u9S9_P# uvފ}6o=G,[v9S%]yxfq1Oa[,riz-Τ'rHvɶ/9ǯ?ⲳZ3n;wZm&sl2)WN6l:'o}Z-nk`.pL]Nls#Fbe?xMj;zF�m?[xFuxWnnlؙ!%rqK 1E -KǿI j%תɎЀi^ :з|.oD*ap�/[7cܾ/\?ݿ>v5||M8p*|z*|1K< }A*W)şy xpe!=Fj%]:x5+` д5% 4,ט^Vfbcccb_/O>dL9"@cR I9owHcb(6!X@z8D:E$h79'W[n]8Sm (QNvɶ/9ձ6}WXXy&k2&󜒁(x}>|1Cch�ts5չ+-EbugMxnP<sw5' WUXѫDn{*r[`�d>B}RL(*O&F2e9 u]n1#jBؚ\x0> iž㧇/Oߌ/y�s=F|6|{6\ Liėé['CYD Š-r4`lWYERB2*T @#iDn +!)!!uE 3r瘘DeE\uMDǨ -1( uMm#;>ٽ<29Q]Fmm:my%sl2i:(+{'i`'C(S3}SC5IO<F"h1Q'D4 }:e~(J: ~SwK3pjaZZ"Gm=+2DG ycgϯZge5>x~|p'o>}|]#[}g`QTxQՓdGEYZ&Gpu*V W&ARN+DR52d94pvj(V!-' 5μ"wW CC(.온s)Jt,!j&B{L+(GN.uE2}z7S8|&dd$J:gy*()MApvuMcg>ϙF&jN"R>g4Y$ړU8!B&¿i)AB/zhTkj5ptuhWa]t Y(<NZ3̀<w(Wò`.^<h绢xV|u~sZ;77{/Ɵ\ܿn NF�(LHqJ Zu]Rx3b+�4%a*[UBV"Ք,<JȎ:V bD`1} Qlll Q ѯ'4)u놛nm`K:쭣cmhLI2c.% A81P2>4'rSm^Y(1MvķіsMM=dM9Mo߾G>D&@kMy.(0E$ (FI&˘(ږhL$[u@T^}#}!l&Ҳ4k]ۃgwl+BY_S #ß,2iL-ji2foGE߁l641W9e㾭 ս;kRV > 3T7iU( aL9 L2a‚к0'?|%M:iぺUpx(9X<QR"H'e?2Q<ꪕl6C5K C%sv݀Z1#)=7λWFh2%= $}|L7|B[PgKM&{SsJ8O pADQ%:w,kOy.�1\^{ÙgHmG&:߾f$#g/D1%m6l CSBÐ 9T*gɓ"JԠ:aR2aa9F$8J<j."tfgө@-V fr-z,QLO-@ToMǂr -JiEXU E "CF6b%ugZ8op UZT-Pߗ+!!uAuGY Q;'U\`#+=_!o(fsV PZ)pDe;S`vAvu& I|>TdpaS*,XZu-eXΚjJhfB>~<y )`:x׮9PU#X_5*T"V&V:N1`W C Z5rQکC۰z=PX Q,luh9l}& QK)SQߗY UMA1:ҡPBYB:*#{t/"IkcN/־yԥΣKCb>2ZmEi�þB u!:̈X2PJE@-G81 xe^0ԦB^#EU46%ʢ-(;Fa)Lפb^@9eH*ݔ];;P(QjyGQmWAogHo*" EtI/i*EU@D)ґkB{ͦ7Z{p͒m!&}}v̙sfggggμƄ(Q4!KeXsiѪ ֺsХ'_=^Vxee<Ҽc@3L 6\>_D~o*HJTGVC:/auN jݺUYxQ|M]-_5С֋x΋h׵['GuG5{B.kcWo5TջFתGuѴS4-{E.hv=|4D(@zhײ *QWZCUKv%|:FN=aAǡuJ/ VUGD NC`7:֨u_DWkQ4DjbpZF5h\ @ǗiyKUТ`x]�NMl]|4>y FAA/Z>.z]5Ѹ+h |<>6j]^F1f6#:oA(l@;m ~o۷FɑʅGFےڤ*S uhXl,ӒVTeQd2$D4Mק׻A6/!o^b׺Khe{F_ &VE!� jЦg]t֔oB:ImtmXh0j5t_[C5ѧYMtyYs԰>z:ޫ]}BѩVY6M#ۣۈ1>.F}Q2*R_P}?jjՏ^E۞к+xw=Ty.:MhWj 0`\G4HEQe�"""V LIDղ,\x{"99:Gjߏzf Ǡ<Y*j%LFa+N"D4M=zg+26ޛoj@UoUFK N&|U #'WGCkI&TEawB- S&fֲ65Y@zUѷEM}{.Q^{ ]T\u>lX=4r$}!s5�'0y a |իx{` 2 jnX5A ЮW;۳ m(*%�e˓ '>yyjYbd(cG6F7m+)Ie$J�AE4] rx[M|Y+в27WZh͏^>.j`W5ɗu:xb]eV{_}~:|4z4>c= ^!oiKL oS4pJ5t::Zw)ӈI HNMǰaC'C56Du1bYѢCmtջG:EVh54 {6!DQU:!;ysӖ-*#Y殦?i^[fR`dr2NcbOsUN"Q?IeJQ4MeѾ:J*-*aZߡ.&By Qÿm0d1i,]GN"0( Qq ;]ѿY VUto\ ެ!4@51zf-^mɀ1~ħ D\L,}D*~X.z ~ }G7z3^4bR} ]fφI tH(BTБ#jݎvT.BIS>m3_ZZNy{wSwGLh.gq!iA?۽k&U#5]='°_/$ ːuel0mڨ]//?% 4"q:k;o_t_ʹ^nkcY]iPּ@[ZjU5sNR iDFiۏB67�q'Sط.~#5hT|}M �Ͼ}o hϛaԗGQT7ZFJJnFsK녦.r:|wDDF$ QA?%iQp tXNi#Qͫ^Zh%<EY =?Lyf DLy tnBbr:b4X *Q DFF&RRӡqڷAf50@.j֢kPUKMswm:pDaA8s1 _bwi! DTp۲ S1_@Q/c11i4BN(&D5kQ5khiJKbw SL"*:-ڼm7(FhikFj UѤgU^'EO̅eaD%i dee#11zDGt7! p23h`|q|N |ؤ67oDfu5ݦ_'lt߄~0",4BsC"x bbc FHXtiHL�Nc'Nb}Щw#*F}\ӱ6^jYEQTلU;Av ϢKֻ! 0|?e6|sPHfV]3Qf H4M jػ:Zc{bG|T;8ddU`p f䞇N�}B9D`i׺L XǐN1]̛;ǏYNjАG"*:5,I\bbOS!>!!8;aO 0~� ]nuO(lB}MKLz~_VMl|dYݼu:ME/<M*wh  h<hpVFiD | *Ͼށ B.>e U)*HӮ]pTTdhTTT ñvN8g6l܊Eso`nJO2ֻg!86{>8~ IEtaZrϞS1CRrIg#U$*5=:CBp lFm{N^9&No(*e>;u9y@` zo]RiDu008t1�&9'eBMGD鐒8} H4hÆM둞ͱ=x<b8p°p, ;~msasN)S8yym6m٥ b4XY3Rpt�b)KRE%$#<JS>A8Avá#'0~:>2! QƁ۾cᡦyK=' [? 5y(ip~/AĩӪ\QMHJNW`AU$.{Y Ð`@_~SpDi@&�3bnE/X Ԗk �COP Aas+Wo>!IEƤkaZzxCwgV]"N?Gz;Ao`]QE~2|u2[l9/j4M4]B G#1/ @*Q%!5-[Ɨ82oETW?͡: lw1dž8yZxx x)Q?~<Fl>QI0`"2*Zj0d3 I pq tڲ`\JQ8щ?9cl۪(J=Dٻ֧|/iix-#�wBllDjM'&g((< !L % *er]ػSA dLD$"*LlKulH@hP0o!!))i uTx:}6�O(y*;bA_XɩYط5w}A|>uMn(*E4MtQk Et^Ed3j0h`"37@ 7;y /DFF#<,JNdD4 xB5 U, >~i!!k%XF#;(m:N$mgO~jX Wzf.R2 R'}p{}Gz6F|:EQ!iioj4ȹ,D:t5JOV" (y&)[CGNI/Dǩgjd)K4)99]mK* +4LII*ѐ / bW𕮶JJPQ0X 5aՃuR10hb3o@`h|8vq4i$DQEiiy X푨Qf$jȸQQ̭Y=Qu)9!g/.^AUz^*ѐ=OL0hCdF^OP`zQoTdzYoVf0IBAT<ZYb4 O�Bãᯭgʨd"Z+kPX<b֮ۂNit } ?QEhi鴴4?m VCXxBw PQ39}kd$%g 'Dfh!G#`%V>2�I^Qt&]礧Y$n^!Aah"HRȀVl|mE?H+OV3l!ABR&}Cq7V݌_A> |#!(BM4Mu;pP='$.k՗ʗ5K]NR7k]QEhi iBEQ(iiBEQ(iiBEQ(iiBEQ(iiBEQw Dedd4M4MU&DQEii&DQEii&DQEii&DQEii&DQEii&DQE9QǎÆ j*i˸i0ߑz(*M4MtXիWg!#y˪'!b(,dgg4M4]r|9uu|KX$DQU,%'yy hi."U U2غ|%UOBEQQyyy*$N4Mtx}uAW$DQUlŋM4M=D]xѥQ._IԓEQ!iD.$!(BM4M:KmdI( ڵk4M4M*#ǹ ʙm<t]@tL Ξ=-[+˴2SI(A{?]8Uc>z X'α r4Et_/\gJ7/:b4MkN=`rrss]j{̶:6BTJ2-i2-yJ[= QE * wWCT5gV^¼Cw 2͇TK4-8>gߐi<ю@TNNKmٖD|OeՓEQTAڐo}+3M˥9h>^SI]\dUt^KLy Zl<u4,:)zLK:BK=nm`ei;\ޔ8W^VgӒasl5/<5WW`lڵX;׾O}j۪hRmh]agxe{]i{6V^џS)XzIS,]iKPiLH^Y܅&-Zb{%]K'!(BԈ xyW\,81?8X`ޫ؍ J�Zl$.aY/w ʟhM˷Ό]|qۚΉ[*_p9mmo.5-�˱afj[iN' η"c?ŞX7o0iGk$DMn޼Xℨ_,1zJq5|T&iI3.mk R2o\&QEyKgTƼn]Qҭm[<g l0eYyvIb(uu>49i}N=%}F&23P}V?ǫ_P3]VFBvi>|ZTAnFhCJ7n܀>;`5-Jg!*;;a[ˆ/Mqf ʑm{QQcU><&$umOmپT5nn*]>i\E= QEDO㋝o._FH!rpq=:f ?|jtuSP,} ^4˴9ZGK �gioNg.C}s1Cuid،�|8eN'@%2, vVش/mw:ݢ_\YqGW~gI)yk]בWܪcor}t2\eo_.R˜ݞ=rt;'=O *::f(ko{2mL7sӴ,&QEZ]<DRkׯO{uE`PY-[. DY.H>;4 V%q`m'(THee^S=yZH=оЕbh.ULw,K@TA UX**|ۡe_/םOq(I(ʥ%!%7V 2a.ì6w+.)(uK"uEgz&JG,ϔBCG+X{Xe=Zmtn5/;?^h<WO%y;Lg3Ql4]V`BT\f X(k^{lOb.vA#X MӾ4ϿGDDL<Wqd2<W2_$DQRRQKQmg.#u[/ĸmJ71/0u]Q}mѦdڼKu95Ÿ !]$$w;kSqe^>ɧq^"[^(4D]~MCF祏b ~)J/ճp[~bCr R,V>ڹZ'T9 Q酶Ew {6l'\H^Y2J+W83$DQUl%i-m !mN!(\eݷF{0`0<ɴɴ)m$DQEiRR@TZZKm}A^*Դeke4Y&yJ[= QEhiA3R!JMMuA3ےQ.]"?2o2TMK,<( A4MM8*{ۑkJJKmdI(E4Mer}MNNvAW$DQEiiB!EQ!i'D%%% +z(*6((h%DD|%QOBEQQ6lիWy("(2GGGk||KX$DQU,ヽ{… QEQTBTBBK۷k䑼*gIԓEQT@ O im˵]H= QE D4M4MW("D4M4M("D4M4M("D4M4M("D4M4M("D4M4M(n(J4MfBEQwQũ3gΔ#zPEvK(QPvEF(ŋ EQ/Rk(QP"EF(E(EEQ!'aco)*+(ʾN!$4EQ!VcǚKׯ_ǒ+wʧIG ;GQQ?hRZEQ!2G=b5bKlQl9 DQ!(UIl,OC"8~~Ro1yfg 7{:utl[+xr؍Ĥ$ۦ(Bm8r' D[aQ(B Xaf8y V]6^延uDƪeVV6uEQT `uQ\z5(6.\P'霜uwv/_V'qp5}pN775') xbî&G󅅇C #69+Z˼ <~*Mnx5}HTer= BEQ#e ({%wIN)iډ֑zG>ڽ²6.Ny"PE*DINϞ;{6Qȑq/^4ݸy]]wy!eَ(*7 )g�DYJ"F~8O #nv3K5kd%˜FQv%�Q-]VMiQ!v9qm܎�9h9Q"DQU (g!w*ߴ3(9!h{v%. ]Kذ+Z-s"Dپ8qmDSH!rQ\9QT%] N#Kr䙨@YlJ0U~WΝY=###SI>eZvCQ(.@^v D5 En#GƛԳU=R((K`#DQuWAԝV]Nxz63p߸Qm߼kH%]F Uyvş 9[we$m;wd>ʲ"DYOw'æ-[O,>Z/(n([#8rͶ7:H׮F#DQE* 7_(׊O2ž�9#BEQ(6( ;ȱ㸘ITJ I(ŋ EQ/Rk(*:Z T!#s_g QEx1(ED(ŋ EaGQk(QP"EF(ŋ EQ/Rk(6Dɉ;w,((X~@4M4Me5{oܸqdll%E.]޽{DQEQEQGҾ[~}Ν;!DQT͛ .^?ii.GUDEQw.ϤP$C4M4]~-[ DQTHPGii|͋EQE 6B4M4}X A=܃5kbǎ+u3뗴كʕ+O?d7ڵcz*x \v͔&ԩ:u4M4Mt9z=etV\.a@s=۷#77C ȑ#M^^^ަ#F`̙!BM4M4]%лwo֓9sgŽޫҮ\ѣG'TiI3_g…xCq ?0.^W-?h֬Yx0{l5/`0X'[f̘J*V~%w#DIdii..4D-$zaw;Du))))SM6HJJRnٲ%NoN:)>}:6mj;7o|믫:wCK.j~׮]h֬:*X֭鐓^zaر(iie ,#DRxxi^8UTɷNZZi>//OEIHm۶ݻѢE .ht{j駟Fbb"y5߭[7,Zjlzꈊ2KtRVw#Dɳf4M4MtvADEQE\.p/_6˴^[e� 1E6l W}^VV*T�4jHɺX"Μ9cN'@u+K7OcwOBM4M4Mbw> RD)<w$e=BEGG,Dd` &ǫ;U'jժ(X4M4Mt,!,a8|D L<5p@C2ŋԘ1cuj2DHʼ{!jܹ~%J& Q4M 6>0Osy|q[$ih9d/>O/ڪ#N~W4Ms*oCa+J{2qt>6,DFSO=II[5oܸqd)BOl]t%yg|Am۶ݕ%+MwB:h6l4.hfcz|:_ܖLww\yi!#1r8壠(k^;}j_4]DחR!80, Ep)SΐQn7Fd�Č7܌7̗:_t eI)|ezNn.v>fͣDRLQNھrޟPqOu7.7|A$eQG,}^˫?RK#'! 26NY%!(%=EDžK٘\L~JeȆ1q~褩xHL=YgΨeq|yeZҌ9N .ߖa/'cfw}L,ת[u|W8"F ] ?:xDD|6ڃc&.'& 9-]_Uk1ZȾH9CTϰm#.Y_{KV!!^矖iI+QEi=.cc{j$ڄhD1 k7.;| T7"$"JDusr IZYez^ed; Ο׶k*knD^,-`c/3;[mLn(TF֭,u5vCJz> uW)u נ7( IwD@TAOzf7#,:\~oYfo_4D*OHTd=k8FR�Q-owP5cbWnجƼF2Kvhf.UͲl0w3rV皳x9%ver4x+rbTzf߯κ;I|ڪ1@_-Ҷ  7uv~m{Ӏaa8~޾i:t6_R.|nEQ(1Jb }F(7B4%cXWHݕٛ h횿r{n4o})嶍#Y"dIp۶Ku.qlߤ;!*9-/ =/l>}w W4]Z�URP\UKug*EQ�dD˿H9 XkK)�Q}Q3g$Nk=s]Q"v䔷 dq=/+h<}>=sϞͷt<pX'FWі ;weMQJD+~:tK}ߖQL'5/ϒI#V2ߒu둪3O֛d%FM<'|}a9}Z}%ѸW4]PWE}.|bnEQ(4$d/9iߠרqҠ*V`j85_͞!}>:#zn\ϼ1b\VмFKrjZfHX'~ߴM 0p,~1Ӫ^]z04E36.6$`܌j 9{x2GGe~/ S[Bj_tqR *)6>d'DQT)(yƀo A.&]׌2$d:o8|Y2g'2.+h<drtcCzwḂ)mUwceO2Y%F {PR'㲢W4M(E4]6iBEuyiiEQ(iiكVZᡇSO= ;;rxO?_vmO<%ԩ::wM4M4]M[oaݪcFF vڕjz}vw}#G潼TMi#F̙3IC(ii$DWBBALϙ3>,^&=O>LK: . /a7Fhh|ᇑpzn}I4k,<={tYn0 ɈD3f@JTt_~6,uYiiUmۆf͚:v숔Sڔ)SЦM$%%)lSNͷNN|L>M6͛7W6|kAzᡦ;wCK.j~׮]lY'[kݺ5t:rrrЫW/;E4M4M(R```!2B$.%SJ|뤥}i&"mVuAlѢcIYѽ{w5O#11<֭-ZdNWzuDEEUn(^I4M4MotPǎsj=K|t%Ӓf*[Y �"H 6Tr \zYYYbFT+XbE9sjlOW2$D4M4Mӄr,www'#,H$玤[Q;vPI*::fY%%#N0A͏?^ͷoީ:UVME8:ii˷ Q>#""P/23Q-'O.4D 8P !ŋ+�3fݲ^Zm[HI@,,D͝;WO .Q2Hii QTAtߓōɴy>g!Jw5jzt(Dk޸qRR'g|JdҥK(o޼y٨|PkJ!JD4M4Mۄ(*B Mӎ{ժU4M4]L(BMʃ((Eӄ(6(6d)!Q4MbbCx(Eӄ(6(%cEQ(&D@Q<.){("DGbцVްa<==BƱcTZOBԝio)KG1TyӾ~ %DQ J�j׮]Gtt4]JZ^zm 0$-Wϒ <k.ױd )wҐul!)c"DcfђXz !JDI*&&ʢKܹs*RcebnW - _efC ;=6Q!EQ%QPʅ Rd]R\e )ƕ+z2ˋ'Nⴟ""To޼YƪǞ;6lެ>wkD,ӵmݾKWe˱c7nbC8rXGFbMX֯GhX8{NAcxMn),[jxޗھsmΥYYS�BED]xGʛw+m\]⮧d,|9z[8r!QӜ|hG r /Qr,+w׸y>AuLIMUhEQ WQDzcϡ#ǐq-emS�&7|{۾^$*]29r=q!J@⩧v{JAʕ㧟~v1Oڵk4Y^NթCtB+m\]⮧3([ (@ك(>{tJjiv1u/k r8p;g: }aR(isԼ4pUvF0<:9r !M-QkUڅ?ωϟw̟_<!JS˖-e;}tjժTCs=۷22n#G4{yyr{{{F3g_L%J.R:nSɢWH9P R1)o՝nAv1u n=g1tgȤۋ1}x'$ؐ-qmoxHcȑcȑq;X DeCsyBALϙ3>,[| F'|RYͻo: . /z7F،zᇑ`va'^Hҳf<ٳg`0X'[哃qƌTntGE*%7N\i{u'x 4uU<eRua;pP5}M@$J+")D bcڵ(6dK֬s!x9 QCύ(v "D9 =ڵkWhر#RRRLiSLA6m]t:uju:u@G_"aM6P|믫Ν;cСҥᷛ5kfN' ֺukt:@^0vXBT9CJۃ(guPkw118{,l,Ӓ&$Oiga0r< J3F3Qj!.`hWϝ;o{k*|ʲn"D9 GZx!1Q vBs99o(yRZ@%!ojBeH]%Q*U['-^"M$QmbhѢcIYѽ{w5O#Q;y5߭[7,Zjlzꈊ2d"Do(ʟߞܴi%l2u8nqX Um2rN^}zڌonK~Jۃ(gu!}ڴm"P2-iIiSYFTvvwQi0oܨ>ȼqm?2ඝ;|2BLgfeErfGEQLl6m٪E<hߡQF w 9r>7:HBF#D9 c:mڴ|Qg!r['mLKZAJ3J�($$AjذjHûO>VדTP7jHɺXb޲N'@u+w}j|('HS8Y$@puA3ے׻;ҲLzǮjRKǞ$@,>BT e)G"Q@<wdF;vPI*::fY%%fL0A͏?^ͷoީ:UVMEvD}*lm>FdA@d@ K TT)t2'O.F@ճ|'N/ȲoK,Q]U@9 QrwA#ې ),Ҥcd &$umO5ik \.\i= QW:r8.j%iGITJ ICQ%]d;y&R_~egZ&O\h8p!B!/Vѩ1c-ին%!.25 QsU}(Dɤ{ !*CQB|r] Z.�rJHɛ7oVq TJXcm۶ I9%2`L;z(VX"M9& ]tIҥKKQ oDT C?QGKy{u~Yj9?+qY5S4FdZҌ%cm{ܘd޸LXx\RTi?@2R:jP"yΕuڰa֭Fh ̏o8A+ËGi}B4Gi%]$$-7nܸ|~4q@ Ȗ4 Qt޼y(yזkJ(!JFYHD(s_KTX(9 矑Z_8J`0`!44DpԖ0b~Sy٦=rd;~ƪz}my$MI+X۞Dlnך?AZ>i\i= QWV}GQ,JL2 F ȧqDR%R%dr٦@5r$J<lԧHNIQ$NKOLj1c(9cUڷ_.R˜ݞ=rt;=Q1-4#DI^{ۓomiZeD/)#DQK!(!w礌KTI1#=FKQF_,h{/(mN5'Ly1t|ym0UH f|?3_w>vh uu)s*z(%cEQ;(O޷%=H|*e\~)-@B?2B b"<f̟.^*-%]E7nR DzS>L NC̞+X {6Vsg?Ǵ1 ,,Ɓ%$uٶtpzS拲(qI#DQ! J޷%wD Dd\.%///*K0__U_zVJڃ(y|t>OORQ@J2|LK%@ZX_${'۰QlCF�XG:Q ;, #$4MӴ&DQT A�]8˨{2CBTQ( ]oֻaa&xiIiS)΍i2eBE-H9Q%ҕQlkG/QMM[ViIe4ՓE4M(E*fC%û ʙmsm2D~d!?d4Y&yJS= Q4M4!QV�tQێ.))).=mKJ:ڪ'!i&DQ!U,KrrKm\]'!ˆE4M(BM"D9p4Nֵ ti89.yҥӶ%#4ݸ3`9XW`)[vWi'DQT AU$KRRKm\]gYDi P<<ؙƢXVTP�Cju~!gqZw|!"唚7o{ǩu_V\?z=ծ]>>>yyO<d,SD\Q.=ruw#D-knide [Ck|y7Dr*=N^PM?w+0ud_ߎfv?GSYH?w s5RiWX�x7Opa2_`?ArP+W믿^& / b7w}#G%RnoooSڈ#V 6(pJD 9::ZxI*x)oN5Djx%"z-W7hǥ. &mJB_cAz_mOK7Ӳ%3Ii<-9t[Ή+Nf.:q|)_Dϴ.!OGTTALϙ3>,^v=O>LK: . /z7Fhh|ᇑpzׯYfٳռriT'[員g̘J*V~Ԉ`,Q{… $RQ?r\#7BذuHrw= Q/84Yk^jkykq~zBqXd]/#9O &\wI7)rӮxO"W6A#nP$JrP Y;!}2e ڴicz6e˖:uju:u@GchڴnbgePӝ;wСCѥK5k.4kjlO@ut F{ꅱc,WݍF#M˱ DŽWOBT/.~ҥ8I&Ds$tfN�}3mG ^oy]_}[t7%)11_zd|7Qv$]0$Re!gMũRJuLyyy*dMEj۶-vލ-Z(p1F5͟?ݻwWO?zNgQݺuâEVW6%/!i{!J GGy*%D1ELՎy^F*{hiyYkXv"Ht>K H]sݩ"G$DYQ&MYg,e˦y4[g @!!!RÆ UcDO>VB F4Y700+Vę3gV~O-OBMӄח9&/ O E QD%\$Dv˜j3b_SLt1%д3˴L4a?Yc繏sy1xYz3Q !O ra!RD(yHc5Dn[VV0a5?~x5߾}{dVZ5EQޑtB,#ɈzF(R{{BϪnYlSٸM6hǍkGHid.<bi♫2'e}yW>J'h8G[Ǯ aOhB@՝D,_{&JeɅ*A xb3fݲ^Zm[HI@www/4D͝;W/""B@'Q2HiDʲIPCOs_4M Q%�Q}O7'(y@{ԨQxꩧTW:"ItK7.߻,%QH=)K.Yyg|Am۶h&D[rT2zZ_h QEiBm򌊌<%k@4M4!JDqnnBM4M(63' ғ�?߹@DH{}fDD?à ETx D!FK CӦ[7QJxN beT9Z=ռ%i[-wCG*<U;*V;:T۾]L"#Ȩ(DDE L0;CveOn*/iQ)e iQ7775lA8|mۚ7=N~rf:T>{8;:!i&DQDKym[uAր({`/h<Y7c< ] 0hũMcTK:]`h0ң.T*^oMf-ZY?f_;6cص>Z`H2h@B^=/6oiΗZ䷾LQ4M4!("QgrIRl Qላ@Dh>5j@UqpNDhA EtxJ|xhx!,4N'*V; ^W}O#aΠй ԯcz ǰk<G+o=G+'^xyDR|q׵eh+]b"t>P#Q4M4!u Jh#PH0~G|'Pb"S D\Z0mZ * k,?*Tģ{ 5@zY)$Djܻw/<"A?Vn(s2$'""*Ehi Π;3YD"=ـ$DG V@)4T ψ0 4XA C[А1ZE<H<(>y T"B}_°w6G5zP?_]&M8&tD(BM4Mh GE!I$bDRiO}M Di܂@SH`zqxX4 _y{`h~j: QQawF+�kf+zLs'{i؊D>d7w6~Y<+|Cc(BM4M[(y9ߔszڞn8iNۙQo&֬vCzr/^pDEFg쳱?yRDEȔt Q4 HI4J BpV$"1oXQw<ATC|<tq ѫS{_}\5ʻzg4 *,XVZ(BMv-~JzA2wMM$jǎZ*b"‘CBlR D?`J J"P҅/�ֻafTRڲ0DDDgB'D;{@ZR ӀJ"afLܖ/7_FHIÐubJ]vbPb޸3c_YuƤ5Ittu]_$pvC/<흇?Xp tk(D&LDʕtBDjp$4n|(@T$*8Pu}>*=<4T qyBUxX8"##@E,V=};"=%ɉHHH@b^Pk ?۽ ]X\ATtzb!H7o@UƑ� y-]Ǣ89Ӻ;OhQXu* ˴gKCD%Akyñ|/>s?Os k|G0w ]qig?۱LS�/1p:̋1r}D;wD˖-3R2PCiQ1E;_~K3w԰,jC9ME".cwɝܼX~"tfEnȱd|ֶȺp7kN{'篫vn{:mv/6'!..9~>߃.0NWo;s-M'L\r (9PHQaG3j/J,+hX'g,&(BTهnXbSqo]jl]-w9_EZo#D6#Q+k1A?#< XS׭9哛g/P2/Wc{Eai aN!C(`wb[`#(iIsbAz&.9\Fw3$uyI,wEߵjk*?(*O5rm:XP%;;.^ r78?w=!G.Ӳa~ ^N-8S7m7jˌm . K@@I{v<"fcw#Qq㏛gkGcWt{[t4\ ygirpR֙=fﮢ]9mzj'=<c/in~wՙbyjܑo!rQ7%)1Hnre~6M/4xEc1fO@~3߈@Mr?%zސ}Lѝ@pVyf!':ٳ\tF 8Z޽PQoM]EKKIjGNz.h屶a9cH]I_e_hR|DQE;]uwC4Z*Q㼜_m@ RhulE䆱D(v޼8XǟM&mM4I$MGIk2AEq((CEY EA(޸ Q/=}pw ZٔLP|-Ec-7Glh~gkc>q}~)+*uF+rdB4dWWk)4>*@jS|~RU7\Z2D=E#48\N@yJ_7;"Dbb5鉢TmF)'ʴ(j{4J91%V =X=HК~6ES �4XPȅQa-DHl%0DCm~Xi>MGQG*vF6`ӗ$uCۏ 3V}~go�*h#!RO_ GYĝ+VB 緸Qe߈C2ĕYЮr}.M*:hcEZD=Mr8_6Rj%B DPBTq$"yV[ X6Hm $/`}5K%S~ 9QϳsLYX,V^p>"wIAOc m(z-2:ԫUhH}OEҒF . Uۡ%z4הjIS(666'+T#/�RX, |,V@T\\z_lQ]] gczEjEw70?LzXQvgcc^ jNPe,nWnEخ^];BʢpSVi"űM5REry,7z )ZXŵEf!lt|1т !bX J|^ "_ HQV^Z�;հTVS%DVAT\v'jjVQ5P)pE`OGbb"S�CbXMy jC>^v)nt( ۰QzjI,U&Kp_%鑊Or)P՞jR7{,#S(EgZqWa,|thhh01DX,DXDDP.%(JV< "JĽkDQ8y"hW7JMա~e"Sy%84J%ObkPA *Az_)!bX,(@j*"R Py+{طe!@ǭM8} �G,ƙC;)spr_Ve(r*DRzl *$!6O�VFxg`ccbX,DϚ( һD^(yU2Kž -i#]phbڕ23q$3W_lM sjm؁HsCjkXk(7MxMj!f QJ5Ag1DX,!UEP+ݕU@u2&O@Ki @"~SӼ=KP—u"[sqRCPD8 k޼V%DwB8upy ,k_mD)1ckK'k:'?a?0uTTVV>ϕ!bX Qlll(*Dӝ(Z.xqN, ±}8s$yg|p|~>c{}pt}QY)=RTV Ix8. @Q5? ST]"]Qk%mg˫ݟ+Ev^ßg2D1DX/9QI'!�Zi\ ĩW#~O:w*j�_R)DU:5n& }7vWK.o|}}~SUR/_W{ΣG/RN"׿rcG}_:::HKKkx{{}Ǐŵ^077Ǎ7|;⭷j3ky5; ໇PqA9-06fa=0m>YkI=MG*py!"W} QllO ~PrXRTzz<Ir @\-71<xS2A.U)󤬫ܭ2Z&㶀em(AxHjѢE?/YDnS翪 r@ѣGk6b˖-Fk׮a̙r{ 9'|"ϣܹ]vAOOUE9?~'''=zwEHH<ʪkKMܞ8q $Pk zfzxCa,yd1D1Dib+!Do+A{*O}0D5e'N4RM<Xjjнr9/p7VhL?jPqXޢr)jnhYV P H+bq8d9B=X,pZ\*zꁔu<Qm[nIyTVA'm˗/mR*,,(h_vv&p?STTgE~~~BPcCy:ES m_tIn6QM=3e4<jW籡d?|⻘._@kq!n?Ī=eye^웲ݾ=܄ъ&m!{Jޓk4Qe=] Am̢p+ݦW0D5fYYY~z9zKÇ?E/;Â2///9¯DQoҤI7oP'@TȚKu8TɂT Nb8$F,cPY$t%J,ĶX^(Z|JH}"*OWwE�UJXVu"Y] !!*ME*a`h[z|ڦоBTS^}CT!@+hQO&O6*FZZZ~'aF Ek ?yϲ!ju üzot/:4 JI??Xo88W QVCT^=L*A9Ÿp ieh{Vby T_®$]o3o=5]10P,.)!#`Z,}7ݓJ>kGNP.]p&ߓ:- WF<x .\W^yE\~:`LMxxxO;v80D=~~E#PAyQ5PsIQhTIS؎E IzPveJ "QZ EpRZj�0yȫujP#?p΋.a~nQ(Hzʓ Q4(AUHJE>ݞ}u</-ƌw>\:Gyݹs 'wh_bb7oZ\1<yڔ'!Nɼfk:FnFU:^|;9ªl[^db;_ol|vX$!=eTOW%@߄D\a|z St =bG`jf͚{O)mJ\k(3uIpqqs|Ј}nݚ|O555)lԺvd>p@XZZbРAr;))I&7?1MMMBeccc1D<BcDtP(q,J/%K PrI8BS&οpf5"9<0n(,M q+vm/˙]~8z OFr+yP|)#9 Q򛂰ذf:RRN�Ib)@"E6CTKϙ36'򑔜(ʕR<48(%eeeXCJJ m-4 t A`K>+ 6V]ݻwS=)a7nO Wnʔ)Y63kn |<Qԉ3w:s£ht_6 Qzl/ɼJ4}ԺvhD;ސ/=Yw~*)\Ou=Q4 Ni)DQٳgkɋCa@n߾}[z3"ʎ`Ϟ=kG r_tldE#JHѰa~h#kKJJ׊!#h*'X*(uZ^^ ]a sgcmdL&nR?4ہ4ΎC2}8:3rLoY/֧O:Sܤ7 Tp!2�  U*MQ, kqR`U#oq!ov@|7x7'==E>B9rJ1sy@?:%Uϣ*z93k~ JRFmHbO# <I|?ly}5!U>_o),DҨs:*L?4VR-)P2bN}�:uփDCg+5f4 Oرc+ѵǏŠF?SSGJ$#\(6JZh"H_&bSp,6,7N,z�A^f_ }sct `2Lc P6`mibXL0 >v7þh9O@[3 KZ"'3y*Iu |lώߎJ?m{^!j[uA 頰# ioN SS>IF9QX(xF^MyDkᆃ2rHʺ!! PDQmX=_cT,ºw.U=)큨OTk 2Jl{䅢"M SN4*NkgRGdNx(W؁� yؽe>"MEԺiظ ͥ)pVNDb+qt?>@?1H C ~0 Z�cSXb*ĺ"Y(.Bb)yYvU$Ȩ"S8yogccFy%JHtZ)7*)UɖnڡEaS0, Xĝ-V )/ێԚvTTa|RU"a=<QG*eiմQ9#G QurZhBu/M$J)ʃh֭['_JQH mGDD(>߹sdy(<!J"QrYjoAoĮs<|Mb™`d^ ?FIQn}O?C_1Ұ'Dy{b0X apw1"o3MDx <D|Lu@r +Tj a} QϓYF o_Y!Q Cԋ'(? @1Dz yyhRoGJu>ZW k-DQqYBJG^$nQhC= -3ġm(]QTN>h2R(p> TZ-`jT^f(֮E Hu|3lN XW9z t{ O@T|'_>E~Z f fsa4#̞abox/ƚ)>a@M|s$O$x8UT�C@ynUp8Cc2jLH_-X,C牢bBT9rF p,7B%Ǻ!3K|]h&v 7>C㳏0c8} <?@�2gVXlXNSb�a]e/ *8DQ(9S\B3Cԋ;Ke9j >B,bbc{. JF\ ;عӼ0~ޖ8sMqBfLXYD"n6'r8�}!Oa0WL!m? s<F ƶ: ;J 13+`r=vJN�\EnWmP6~_%mw&Dt4P+믿Ν;-[?sa顼G_X,bbc{"Ux1B5 iطcV;LFXeѽ"A*6|&օ21NH^kv93S� Ѻps6"K8bIX/^b]ꍑõh?nF` Y!Z@mq ]37 j[NTkh�? P^Cy2DQ/M_@aaa2x*wDKss!bX,(6Qs"pX0~صG,ŪvX9V: &˓oB'cs$Ǹbؒe溍8kR<3K'P='UWMx {dZ%=_V?Pt4ƈ'os$k8[c΅⽼p2<SGWn(*~RXX(iQ֐CCHs#K/ \OإK+uU<ErJ92l[`)** _}&"x*$jYxxx7;#ZItou2ʓ+_ߩspႜ_9410Y[>?CbX QllO r#q ?X-e<K?YSc amv4 {`P�)*CLE6Xg jjhFk#j,^áf< kWN*Y!ѯp2N;vѸVXd "QВ: Q12*BU"Uѵ2F#PRimρ>?xפMu8I(b,ʶO4 @{> ѣGσ*p*זbX,CS ۈkphŚ ;+-]l#Sm '@.m-a8x]}dT:'/C|m 0a\n&8s|W 1},#f 5+sBlN0me^c`9Zcm=j,K'j <xPl2~&dt\K\cEٳg7 IM}^%{KveSl Yɯ Q,b1D=Ch>Hq {xK;\m0;`=m�.{Dm0g8 |gu4 úXVV;ul% rÑsn5ΞXHXh7[Ӽwbq/S^fX∊X uC@ԭ(ڜ(ZRT}#***j5x ET&VmE^ :M\[ZZ*!*<<\Nn 4Gg}&=L-æ<J'D@*eF'>X3DX,T 7jk\_(˙l ?]8q `%  52&ӥIuz�dg! D߽ϯAR^ғn:b\a7y6q`9T{Ar7PQq4R\OիS\\ MMMYŎ]`B<$7743R2O K 3gN4)7A _׮]!Oϧ~  u4DQnH3&e疗}J謟cV7mr͵(b1D 7rn8R<L@Ycu[#5 #&| p 𙀀1m, m d/WS/xBo3pSkpXlv7 πl,񱂥E?XfGιu1H$.$/yU%d?b{R[(#Y,(66(Y�9 E VY[!) Bʪ}0H[x>Z( י#<#5m.3->8{b ˛:y0C/M;b),Xo5k%`32p [{&%uN:Mw@XO8q6Ƈ^twls皮[u{)Z} QllODop쀠27*bfbs,]4 g&wiF06C`k9�tag=� 1}"% ,1a-ySAK'cy+ hi(7lK/+]^7]9Q6]\gѸN|) Ql/<D\Q ;d,k!](sߞ{nf]Dl*>&Yr pUO>DVZxqsŐќ6TY)9MFiN~u& QW '`S3b"\f`n_u1cX@Q1sHYf&YӆaU8P4^V#/f̈́XJ`,gpiKm<PegN`׶E\ Vp3E&W_T$Zi2X!k?M<G, [||$wCSƝWVIåٲ-6盅Pd%׿{u ݐ@fFtrJ6F@=X>MLCUGUUƏ^^^rRh}&M¼ytDEV{Ni؜4Ȱؖ2b.a:Zap IhR)Zl Es\Mh KK+&[3BPM@z'$źa2- 7qp LxOxsLQuJQʼn,InĬ!y$+wk$?&Ʈʓuqʝ?Xo88W Q&=QL6 '/ߖmg^G&_I"$$g߈|C ;|U6v:wυؐQ^뉢SB*_|6(Z_hK/}Tv#R^s`` >#9Q'r&ߓJ/^([sd>>>rK.5?F?Oһ5vXY!J.nDRLqdZN[KPd6ntߗXva􀏷0%{ʒё.5 ,ŵVش >s-0ryc*G$y">sQ#0+#r3Lb 8Pq+ϗ)>+K:9CQS".0>=߬' Q#rk\Z|wkl[݃z1rH(/zC~!~7"(Gzz]*6@6T=V٦sG̕mV1Z(ywYʕ+f͚---Hihhť5t>tsnݚ|O5557o>,2aiiA$ѣQj*\YY ccc9CGLh"۔8/lX넵+쑚)"aF._Hz=q!cl,G[C/D XZ].^WOJQ󹞦X; {$ϑ)*>rư؞#^0ZUQvCTC׷ԛ;NԞz-9!XxNᓂ( (b!X{1NSDRUӲ%x#*^B%r* іs_-TshCT PΝkWgrΞ=[M?SF9shL45fEEJJ z)E6N�Zߖ.] ###N\|6l/_gj%%%Fja ]MĵDFg"NYq@ YaX7n,L1i|? 3 {C83{BDE`;,Yh #)|&"7;{|:BgwD,k!HɃz}`�1'O&h3ÉCKJx"7w|̙/H::: Q QV-@Rr{lW#!=QPX75m'B{GMC=񅨼Fvi\ڒ眨AI~Y| ߽{vi_K;�&U<H|\=dcǎIX$ki2RM`R42(CgUt)R@�8\ExFd y q 2B1{HR~T,^h9̤'jXӄKX"hdE͖ZA�b 6ac=]f;a!Ck@{9@[T{J D5m`bzUG(:Ƚ١Q?'*CIOԊC[ڨ:S0q}>ve='vJq˚ (GFֈס6D`‰hsRAJuCurNo{bK<Q(;@d=Bee5=7 SNێr><׿Uz^tk J P^/!$^zMѲBqn'`TN鰷P'lIBr'gcU#fs<0yf2>l\,{9/|\d1{1"- ^c0lpOL11KՂ1l/mBEq'Q9Ny4PBSE=W;(|/5YFX/ǃqgՠFީh>MmTur)<R߉k/݃{•:'(tJy)E|z/Q7bJ^Em\ѵ@JHsk5[sGERxm˖-2g-\gٹNNA $ QIԔ)Suצ#""܁]d|IKF Q(Eơ(cIeEޖps6C#hܱXiU+&cj{,oA'j7؞>/)gjx3z#& 0Er,Ìi#{c0M2v^&HU~䉢<BAy#RGB{X:Trbuj4u DѨ8WѺjx_k!rBlll{ɐ&"wB4O QPRٺsN;TOFr>+D)%ʋcHK*-Ft44b�|Ǿiuޞc튕K'!-E8{"CTL][}pX0Z*s2JV۰n:|X{Mn(݀\Uh(;C_ + g}(Rw(D@jNT޽^hQ)c'KN7WbX QllD] ( P$J64y{ɉu-rLL4ӕF+2I1n؞%''bk�~g&tdvm[58:硲$Jbq8F::W{%7J5@yȲe:hPB;pww/̍!妔| (OH�b؞ *ۀM5qqryXcX 6yl-cx=9$u7 B,3qga -Iؚ%݋qU�QyQ4vlFjGIƢʋ4mὋrHѹϛWɓ㏹Q2DX,BTʆW@yBW:" Ӧ 3= bp-L!`7i f hZ.Fa ;wr%7 T#Cq1+9P^S"{waZ'\A\L5HըXR@EK튢&O,sh%9l Q,b1D=%DQTiMܱ�_刍k¤7,hp0 0s0kc(m g!5mʚO$8ZLUo Xˤw5eJa*A�EI<@8d8yBl Q,bu:D9rj<>{|^Ӆ%6TDDeٵ,`j|NF0{p8O5d208lX ˞GpZ`V^UBQLIIQa(TU++$*RؚX.֩<'_8w"X)�EВ}fvχ :~ pȡ=a2L3FM #q/NZ50�Eɐjޥ [_jUeaJ(ⅺ|a~_!>Dj(uuu/"!j7JՂH:9*i 8 3Gb>FY U-7eUHTr|'wMӵҸZRBU' LT(q<4dی!D5bZ *!!~Nдƛ8oIBDPY&d TہtF M"x~57RST\'BDU@T=HMST]\P|"=))-X'QdvSaU=2UOd{CquRR'R ݣ{EQjPBOׅDTꓡ|E59R^(ţ%*zr=v<q<S1D1DXO!sPó,G cۋQ ־M1j(ǫ=z(6ђ&{T.7 Q,ӄ(66acֆ<޻w;wD߾}=F1117h.wsFJJ n޼)Ə===(!!iCTCYx`` >#9ڥK>}ǩSliiz .믿.;![[[~HNZӆѼ}p}~lOĨmk-n}#z7X,(66~;#_>t200ŋq-9Rڭ[9s&tuuq)(:FLnY)wqqiU hՕ<[}'Ν;ᅥέoqqq2ܕ!bbccj(Ç%L<!rV}6~_'|g2D1 #oᅬ_1bn6DF1t~駭jêן9sll5E"hc9رcpq(!!=v%曝Q9N!~Wwebk={ӆݨ!ך6lleׯ_ٳ;vHڵkW3DX Qll Q-4 m@u&{y:ZʓRmCMyZ҆UuD=IRmM}?,""p&߇!bbccjČdϝ;'s;(=E!Dyyy߿Bs޽{3D1|!*++ôidjR͉ekך6LxJNTuQ~~peL4ќGyNsN #_5vL:"##W_9Eh$:aJm(2GTaoٲe Qto~#/s#d5B]044m |[҆|'LP'Ĕ3_y|ᇲ,yEEEmlnY2D=HCزP6B_sabccbkN<?3|RVXa4cD\]~6-ԂE1f2CCԏڨ CSSSLBT|bƿtC?Qf&~:F1W_Gsr]C23kgS5uQSgbcczmɒ%S)ATC::hA* O9GR M|Y#Q: aH\'Q&?Z"gj}5bb5E'N{h&We)؞GbU YIA[O]{iL;KwG¹]o!oy.w{BKWGkݡWkB=?,,lOґuڧ|CVÌGCu244~Kչ޻L̑.:gϝk �ϟ|ѺaBk9ܨȍ܀ >"ı G&ڎDF:OlGoXd bdGb\r1>7Ώpdo8/^/[w(Jz2 7'c_P>L{c ll Qlllll QYYx(3gG:zZ AK铧NIH8 s:RڛҬ Sb8xz8^)9c 0uH 3g0mc}aΜ=+5LS}mpi >K|1|Iq>0 CHc-׹޻su (@0�Ǩk i FMqՑ { x02ĮaH^a[jc664ul"]{Ga�$DRz!. Ruu,A64z"ooFҵ5Kk"E~}w2 #g ӗ%@Z�Q́TK# ?vPg0HzVYY{QwJ.ɑ.D#,ƣ<{2:}w-+W�rI#eo@y|6k:9zv^K~z}+Li+D#.,W& P=4۽'b![E@ BƆO@Zwl飍mb" j 5`ОCU_=z [w$t!(6wǞ➭pp89[!US9ݻa~_k}$Mꡆt-Wg>vǾ5!rҹ2%\i|'m4 A؞D5RDkn1Q_"o'Ѳ,d Ow |_ev#/S��+FƣKsKomo!sfG)۴ $5\UxU7 y|QVT綾^BfB"zj"Nb@ h٬b@]l%[ 6; I/f3; qG㤓=Y13R취nݐح�n!gspzN;٠ ,\gb�Sy{mI4]C!'.V~@JcLQ}_J7npEylo堁brLׅƍW'ѣG:u*|M9>(666666BT}j-@ufN:nd(I({^a�UCEI:J[ Q7 %)k7(.~k-JHJ-D54yzrQwl :Y}DJO{!{GZ/ OIݾEFOl_ :BFiI84l\^07Ŗ~$<B־Qi= 6D@uq@QxJR|t^جTһ)ܯ[w݃b`}lb#KgCM 9m4M٢EdE6UFJJ0+M0:KyyyRR!=TOVKLLۻ=ri(rk(oiu^,s($Fh3}]Q!|GQtn@e~YU Q [; 7Lӧؼ D3yN-(^5'²޻|Sg83kz U׃rz`{>Z4^n]!=Cha^7Svd^ѿ/N:#c6r 3$$yzФ5Vls". @;=Esk-Mttpt�9=XO@_~׿o߾:^ |x׿MzF_UU~=ᅦ?^7}-91_:::HKKkYм@yjConnM2Dfu>% CNGжqrPu7RUP]g(r C틂HxS<,Um q䙃MUK߲NGmu>ZW k\.\'%25Dկ\[ZwnS^Hdmm$ !uuA͢.6v}7Gm㌛6kV}=>&81m v X}P�ӳgɣ(NC.,Y)8>E10F[ izD@ }CDa vl=z0M زeQFڵk9s&oIK߯YthVދ&m9{3F'|"Ν;صkW/R}Lm)"0S*I*VZZ*C؞"Du&bn>{AmI! NE'5q=W3{PWM6| `R{k . AW {j {OYX"^A$RAM $u*i8@@v=dNN>!=r8N898/$hȠjOTԐ*7O i!=bk؍84~ κL!ӑ?z62Ρ80v4pX&{GvLL@庑}wr'?I9(/;;W?o5WDdK۴%(UTTTQOS"??gLgcv13v}yTuzO(ĉGD*Ҫ<llOˊ>zWJbb"?Z1U}D$:QA襅$\O..F]>5.#ĝ"sPU\=SO˼&79}4OD=ee^=k@#k'/%3&!7(iښ7vv ֯wm.Tx4*m.*iq!Q84kV$-~ qLM8g8v anK~8=�;;'>Qo苎BZH%f KPhm+p}M}}-9gF*+?S$$$4"yCc PR5D5lYYY~zݤpÇY1ʑΝ;ѷo_~0l=L mwvv$'''GQ?f_9s� p`82wgp)y٧ >sV DOLD&5^H4-<O{tJ1h�v\]͌"k�J~DRB D<jN[t4 N=;�WPg;Dm^<WzzfuxanRw온'QqO{ޯs>{{-9@ÇSCƌr?""BzR<D(w#P] G}$)vOnqj+x뭷ۛ!Ѡ iRywd;)dRmcMD봯Ǜk[nctNGa{ _UATׯXezTTy,H}{'!tR:? 4xUN(5w)2,o�}R4@l?o9GԾtL!YCM�H.,I@Ys}L&,Gw' ilvT?-ɨطW`3Ď2ơjv+`>>Cddd$#Fz H3gNmN )9Q}-90p@ >ԉ%C�ؘQu>SS:|||?Νk4UgКѽ8k,Y:Jn\gC,t-S,C6ŦjjjjN /n=jiiA GP$ xsmߢ$xEyN_|!s>|X{|R1DXO+/1 Ե굒 E!}]K"JANPQpx83=c }L=$<*;Lf== RFą^9ppd& j*�[Q Rkr-I(CɑO/oFSޡ! >G�Pui3WI]@2#U#G49+**<Q^rshXN9e+EyaƏ;L?:(gE۷o˿}KS! uWٳ Qlu[Ia2bĈ:Q{vؙ3gdjS=N^o OF2%}ɵwo$o0DXO$'ۍ! [ODuSXޥTm 5 [L0-?f�6nE0 Kࠥ9R4u@EE$ G EO2�CP Py, 33Q;QhԘ<Xϊ=EKa=(fgCT{SjZaƌڴzY=QQmCԮTX{7׆=*=U4D\llQS5<EX Qj] D\ͤ4/T{k"]K]N»@ ¶}ae.jWOu(! X6p`pepX�X=s.v kdNTg,qr% 7D�8Nvߺ;`l/,Du޽Nxo/DQgF(D(Tۓ';Ւ0yÓdA6BTSnJaۊGsXg S"pBJ_]$FIK ʞ= ool:jo݃a(@QޞCqsr`!8)$)9`HE(j7y}q556#KwbM l﯏a@$jBVt4w^Xr#G7vvSP.߿C!*KDݛ3GCD9KyRr锜(ZWi6ԫW/;͵a?#<P(*EmS;@ŨU5cƌF,1DXO�nG`#MHvA^_P%idpnH"𓦥=C MN"Jz=a(edy.81y<N:#gr|pp tmMY@j~o9!(N _o}#˒4Gնz6/v S0ȨH'ioa jdJ1e"掂([XXjMN ES/Д2I=)M0!Tz𽦎7׆e*P۷זJ} .Q rrrXQra5L +EPGP\w!YΗЕKjHꅣpy]5'f;#&Ԑa:gf!}y!oE�i8> LyQchdq;+9.7OP�/iv 1@�cp-?^D(}!y'Ollqb= tWRpFMb4 q%vS"{l\^pdy�$Qik8f?',q&cq89,bUFkATdsGႛ{`ȡc4 #];[OAs"2d3;Ǿr=ٳgё!U\|9oؔ)S1D1DXD]ٿ9 [G Y{i#Fzd8U˚Ġ(j= C\\腴>D@.L1�[ayF {sr1~!k'2LK]{H1[`A7z( LGVb\=qU?D;w ,,L<ATc,t*:+Z3!!CԳm4/| ñ`ccbc@2v5WX"RGWERG6R!EW:OA C,>ns^0NG=(b ZY`AH }{I87Ǧ#c)΋55Pk�']Ytb^o3#c�zk<gpF~P)~&Kϣ3A^z%̥䒼+u%۲e_rrXEi *M:H<kJnyu^+G4S@FتMKWk>E7 =7ݦ9֗_~)'%kXprCTs!텇llOQJH~KӄB䅊0KG(ۑQ8ͽ]�M{D#lrvĎEGCg,:{h{{v+ qwwwwWC bH{^h))5Iȉ$gg>g3fY34')ruA8;W�Y&VX±6vY%5Pcj ."IZei:2p`l; ";;(ԙnj8%w>@B4t3;gBm6yoM&a=XSMv΄ .YDB!-ا-[B|eeec*eVibxvv>hvebX,CCu jq 4tPabj7wzed90USpn-(rbjpbKD{9Q==:uO3pxd6--kj%`pjk+Xcsp0͙&Xڨ65yK{R QemCdQW6S2@=2GiUK$'X)//o<FK+\e}GFm[nW2" T{y;tME־?)_(b1D1DX 5'K 8n5DBWU6?<;boH*VѢ(WoD &k] \lYmnvUNX#tIvb%`kvN X K*FPFU�e&WP)"ƙ3g$DQ_2C|R`yꩧ$::_~e(\aaa\e'eX@Ab,RtOJqF %J|k2DX,!!źb&dQήZCSQkg=Ga֔VZs0JsCXHKuQe'`J+-c#PnlP*W4g,X)b_XvD`{x &aKL$*i)Du,C~j( ;Q8)A�Y.uT&**J+ <! v@*w)AJajzn]]HOмwۢDP.z F)z/ߤ8{@;* >X,bu ; k^Dn6N.D6JZhj #TIw2y%'aXfF} l,5GTj3cl _9'}3 k]%DU�՟�*o0/[HXg!uon Q,bCʜ2U{:9Y&Dހ(vXfe#aGj2AyJftDWK�)ָԱ(?@d0EHu!؝XZN(^MB*Éy8>{gwPmc%!R�Sx5D[SUma%zX$@|,Cb@ &O9K^M'wts2t=x%@ Zl`EZ(ñp8&BW:Xjd( [#j|_{GИXr5U@ol `lŽ8|?Ni3r0džaoJ O2B_%}R+PR\o*ձJ\DK q%X,(b=u�vACAC3D=EaDU:J5Q?f$Δ~`Tb'm$Ziֺ:`G|ֻ5jL1~j}<^:,}Pel Dƞ808{ғph8|=6{yJK+u\�r],Rh+M3DXjmA깷v՝ UUU\?Y=NJUUO<KӧOZGll^K˰cM}v4Ǜz6j:c.?y4dAM*o?t0 1}V6fC޽7ׅƜy[o +mŒ%O[r/*3uL,. UIK^b>TP',73Zw79ish�V HXi'ai5ֹ˼2~Xf/#suJk v +sP-{Rc7=c#M.ٕKQki%F]?ikb:h`>V,4;ڨruATKѷieZf\BX7Ӥ"M… 2 WKDi]E/ ܹs8~8n?D+Wmظ gΞhݷO[%Xv-h/tV]8'7W&P:Qtie:'l;z4d;9zL  n]uCUHCKZjHņ@b[DbB5$�$(Uh P-U P±-2XETXu6ycc/;802E$-Mgaj6;$a *L-R2*[kT[c%tȝFQɓ<l̟<y2|M<rͯ]vu83<3x1|p~YַEwݻTE͖hZ'#W^ׯqiĉuD)[D!2Q9(5 Q^,[j@=ͬOer~Ϟv泥5#{#GJ ZGC}Q%%(7*'7j`v LXkkF@ܨ վXnZksl * VxH7_vDbZK }hb-+O;-85GǏ,jscA>8V!;qK֎>8*DQզ|{000Sd"~X-7-ЙuuСCaddj&wg6Ӻڧ!RRR[ )\]]CTK[[iY9fΞ#BQ^+DV :F*eE.qKnͮa!AO; KʎMYq<'7Gcz!xUXYa='Ckjb[Lv% tPmf2d}Zf w+La�*SC( Z;kl:7Qިud%hegOǏ7}иzlvsF֨ læPw|r(42D"+Ԟ&nyoi@Zh~^[ly`Tz!^"5ֽV) 8(n6^?#ٹ7LǎOH*,.i3^{E潶8|jtE"($ݲm <:Q(VUooTrVX[.. +lP*�I& hlz/ؘKtʼn,PUfFXnh -VDRFҚCyN2yl &t``PbW\$S3#5+LֺZ;QidE.&&&Ըwy|6uQ'7v~X-ԩSꫯKkE?пV۳DQ>S)ZCԜy7C�EsZm9'ƵtK-)FG!j[]Ʋ͎ӾoU! meK?#7/oAaݿEso@j7WlFҷ܂P(P*IΘ�IHl Z/7F,Ks$xYb *Q*8 撛YEֺ;c-e$bUȅx}ıĪͰ5;we&yoy]yAVGcvvt_$`5�RY:ޜ(wI!wW *,((ltSB7η|;w5ku .7u#>_-f�dbHD4^eaݿE햨iJ!Qݩؓ,@)5v6 Es6zas;6bK'bkDv%`% X�i�!oqxlB 'T_ Oej+͍1 P)E褱8<qNoXde&8x-CwY=/_}vKD 6k*G155!)){?,%77>,u"]`s +EۊG̝) i,݀buMZu#@ꈀ#/#{ m ΘP)؟%P[ [Eo7,V돲 V}\:w'l ǎP@'x9U^%UFҵ\Etqhx3Fsg`+C/57ơ[(4z2D#%%%i((XJfff>dk܀ <c\ YJPaa/4`uӔ>? O秔 ț-&&FQ-55UZ^u[` (ulRlE c\'j[D ӓ+! 183G'hz].vZ{+Tcmý+l^lQ2M5HbLΡRX[D=$~Ti>X$RQWTpŝF'jǎx`q]cbFH?;k6$HHW`g89s"N‘уP3Pkk*geZ;+y*OWB j<)&U2,"Pej F O iZL*rF ŎpEa0uP}Q" P@T}~nY Q=GmرcBDD),k,CC@5p`6.#HSKAT ևc{bv�>rR)vLJT\Ժ REj=ݰ ]PUvrjSnQ55 ;5,(5xbAvE` JA��Q}PW^yrCTرckIˬO8X\X,(랂 z{:ϙ(R@Vy 5vXaeԱXO΃:]- QX%&Xfn"MQde<3,2GևcWzsaGR 6b]? }հ1 u Ŷp,73EĶD9 $$rCbX Q,֝?-؝3fBl;zqlϬ?oԊJ{;NŹ[5;'{Ee7}rj|W̖ 8ZZUKG�S#5\ZolϜ3tp8ji^b1DX,b9RM[bE{="8w,(bZ(qĩ~`X, DX[X,CbX,CbX,Cb1DX,b1DX Q,b1DX Q,CÇall2k:ź{bdu?#eo]]]/Qg̘s!VnX Q,CTWէO$%%)!!AJ[bKZv->֭[_GCTw~ɑK?~=Fb1DuFq…~Ieɓo'D޽k׮_|xg/bn/!C8zhkx衇 8PZd_z%,ZHK:WUUO?i g5>h?&N~ Q܈X,dmmT?^Zѣ_~u8>N:%pj*<eti333@90}tܸg5}QPP I#^^^n+<sr?ƍk׮u Ϟ"0]]]?C7b,(!:y,S|+?u8W^ػwo~}}=?fZ`ttt߬;v:J + O<X,SǏlj'f͛7xxxxGsceoowww(nX Q,CTgDKtNϭwDS¥Ka5ܹsaddԬ>mߺuh& /uDOr; S<S8sL>SdbFb1DuB48s}7h@;cӧOG)Ա*N\T-M"ۦ C7b Q͓sSVȻQ\QY<Dѳ@ KTbbb3?t>+#G`jjڭElNQFM===e0(r~ϕ+W$DQhv%g-%pNNN<<<c-3/?n(L!Q"ET:(eP"QX4(R[d`8!r[*DEn)Ɉ⁡7Fdp2Q|#Q~xaȎŜ dEz"/- SPAHq6[/>G aY4D8p�.:tji@E,33[|kO?4^xdddJȒ裏P]]}|Q4:NQV\_<붉Qyy<`Bd}PXxFu7 ,Po<'0-(L F!(N BQFעlJ,_1]GqɁȧ SVbldI^Ȏpwب|;FyX"D ƈ29^D^^رo6,s9c>"wFi�F�*L DQj GeǛS\L!⇁2`k= Bվ@@bN3R {}1 0ˡKK,CE"7uRX,!1Vρ(>rԐ >Q@QL&!呅kX8Ck¡)HGH;LO2E6az"9ivc�#5 ?C4b;v\(<!|||fX,C7b{ͳ(-; UDD�R KS AV "Z9nl VΊS| N67 cl;6ġx;R>0?p DXa-lzKZ<"X,bb<D v4Q* h_a*jMv]{agpDTQ^351?#|>07Q<Di3QC&ޟbB塯'>H3_{̈e!-ZHN};|R(bX;Q5(U%*%Jq\a< VL.ھD*?OVr s¸> RCŋb z |Q=a 􅷞:,| O2Y~FvRǛh/ B5ޗ7xCݻ;yX,bbzD@Aj�' p D(XBՍSb[ذ*9ñn~ ʆ`{`*´P/"\8Rɱ1m"A |Ce)Wت^pU~ xrV {vM�ED)rBP!CbX Q,}Q0;c05ىVٱ."%*aTQR }(BHĮ<'TX TYRa~21/o"L?#Aʣ_1}̋.oaKH4滈MOQڈttǛlsh�e~:&L_2p|q-;DhZۊ.1uT|_"48q<dUOvV~WׯGB1Y,Y#K=U{abX,!ź jhEH ,izN2@n9Y`z ic&&Z`N;J2QT?l)_7Kpn&Gb_v̱l ̌$Wc_DU�"Eƛq";/-^1eD|է�g<E 2|m; QdsN8 ]2aaar;ZY Zv+ $M7m$_W G ?r?++kIk~>N2-իW/y/^Dmm-;iKV[bX,Cu@THL58* 9F?Lh!# t=đA_ɦ8(Y*Ӟؓkn8ZcˢuM jgxbׇ(a`�rgU1RO0z1!X�T�!yD齀0izG9/_VZ,T\H\O[vϝ;+W4ZDz.'xck<yRor;-#X.sО: Du/ Q,b1DX DOvPϑ8X,g̈ sS1G@(S b(l_2WYK`<_c3  Nñx+ƪHuꋑ_8]۲p`?Tbߘc41D�V} % p%#qpM&왏Ucn%ۨ uI i&2w'Zu#7*D-rT[@TG2DX,bu!ޟbLH?YC!8\#-�(eO1o`epJǻׯK<sƾ9{rqxq0xbbJ3;an ;a^#uĪXe#B- t Gr$/'㗯 ^6+:ɦ|tɓy:mu~e@Q"5n4h,wwuEJr|gs!--w;Eo+K/$hŋgu+*//4ӧOwlg{DUVVBSSO>a///|܈z D 2CH88R3[+p,K; X`v.j`[(bf=>űqfvwy"ak;*rF~& ?C]1%qOD~R0+@#̑牥S.8WNɝy8w Sy`N?+FF]] <qGRyAw sqY\pAh#Ak?|prظq(і()SW֤t;+D:B,%[[[̜9;-DEE:M=555044dbHihhHzQ[.V7E;un3F_!ektVǜtslZo73p:_W'`x+O!ƹ03F<?Ϗ|V'a/jm1- @`~ 5ꆩ.r??)sc}0? (/̏@YX1>"v`'L򑆨ҥrt`H=n̿zTE=ztn׾7/SOd``Kv <(@?qRWWG-[~g]NZ5Qݥϩu:UTTnQf)l,Q{]vu8:r Çsj&r5>2[oa@U4JIIk|Oz硶u=eUUUOe>m4X햮-{ATK9R1VOuZұSqz�|*UΑu@aFz}$wHxmሲ1f{E_C<l1ݥjR,<Uܑ+ b1\ܟPS\0Z*pP$;S";9-[ԓ!̙3xsss=zTv4i_~ΧH4 p)Ⱥ1ȝ݊:-5j(hiiȑ#2X3"##i:$ÛO333Y:z'y ̑՞?qС͌-Z+{C &]nX= qX>K2qz0TM/pŽ6 s13,T̍gdcJ+ H҅f_DX[_1 W  sp 3% ޴탼@<Nc0%15YmpK}jbN/zz!8995~^rK%nhΊBNv4ݻqcV3Ez_}Ui)zzh.}Ac}f-rˈ]IsHǏf"eݣ /( hm&M4ǂ1VO!3R#9^eA؛]- KF# lfs A.-�iF'fEzarrb})'Rb"c3̍@z<ȣ_&5H@̉D^t#kX?[p)X00-끆( OLrA"Fows+tK.sR*z*x3D%ZrTǨ^)M-Z[nd &7禋XO?�@1Uj PheW 1݀iA" $BUp,s-Pma`kXi v(HvxaT$]F:brt9PV㌬0WDؘ`=?VHh0A\+1y䭧OHq2A1\oY4DԤIIJC )Dr i4OJ!I6DPӖ%ڻ^5ZKZ/!*//rUq#ƺ[5=?Hz/#C鍺hX?g.6%ڼ -,” KO=0-³!X91j^ꆬPWLpǘ@'$ٛ`B fy`j7 j1>'�C|&dA(L }9>)mZ'&bJ&z?S!\(<Er͕.FMݒے7+8155'));?f9 x):i\\'E`@{Fw ;;|Ҝ(ڜjz 򚊢bR߉DQjMvMY$`s+{AMH0-0nX=Fy潐lx`gXcbwM&anRԠ/PlQ~3Zo`䠭 G~mpGC>̐l K/1Y6@ld1Wly28\h2\;]o-#Б]^;??eKv}_=f̘!;o"ŒKF4OQ(bw?1.li\h+++A!Gh.|t(Q4g{ף~liz. ZҷrJXJ۫>?(ݕYG@u ɍ^qAZH5LWFi}1>Ì0K )v}!4F�/ka/lDY!@�V(O!/;G7PZ0S탡6ȋ lHcl0c"'zZ"Ͻteds)bTkz)-uDرC..bX|܈zD fj!3\ ߒ)L$>Hr4E%{$S$8YWq6! bk@g<Arm(|Qs/W͏c8[ <@Q^&:J 8 0S+>wE�{d!np RަtyR璖/_.L>]U,F"S Uv.UB#4Bɩ hdg- P,@[8p@ڐ7}ftW_}1Dݻ"*rS(iZ:""bFճ jFa|& Z wV8? A1᤯^ rGn| B09z $hEa 0A /](Q9Q^鍁ֈP0iA7ԀFS@+_wrM j}d_vqr !~r !тs4 ;gp&*/^5vgM0a|%KH($>n Q򕕕V־֎Nvv>(.tۺ/{W<AO9,bF# jaj(Θ5Efts8h!SP"R 0W@Y/mX{S qh?'̏3/G-Jn( 1MG'vG'兡V) Et+Λ%A,?1:D]zqnEP%Ѽ77oXE6ʬ4dR'Mz 999J۶ s*B w-}1DX,!b6*L 2W̊ �㣯 ?CMEqC,K0sDZ`j;bZX_o(7S�DW39cza3F:`J;&9cf�)+LwpwdGy5+!ª`P(oFi٧zJB)--m/[D1 ]6Q:ut[lYవ}eP'YR8{SQQ(e7CbX,m2]1o1>2p78N9僂DB5X&0r tȊ5"4!Y%o rB&5X=<1fԴPk@C.;5YZ({,:Qt$MTT׿* <! @5.@Jajz.-Ma,Ҽ Ց7Q47Hw@[~oqPBgkA5}) ^=abX,CDc]l'=- wCn@LD ΋h/r|i b51ֺ<eXbZ f+8b8!_lTx?GL.<hk!T3\2b94};2DX,!bu ]las Ux!}j%  `5h~Sar"3]1 T??xiJّ r�D@ P3]L p"8A]Q,Q r28\EaAF C!bX,(C)a O{8kN5{Jo $A9-0?[��#}iY#L tC3]1%Ip `m̊H{ޘ/l%tLJ+T*H^h ]"\~ZbbX,!ź�=rvpS*<uՑ/9&7X(s8_ pBt˦!1ANf `fs1+AY!;CZ(HY2\,1/ 5`z;fzNs 7E|ud a Q,(bX;Q Ǩ�$8YAOj*3=C�TtSMs| d*(W@h?ij^Ev fGz\1+C@M(Pw s[Z*Os  Vj}!)j-AWe1DX,b=5;1<hhGs!!i%!(%H򆧡T)E Ā? m.gv\j^/uh"x9Qᮧ>WWr A$$Pq.L>CJ%w{sCԽQXO?xyX=YO/^oˬ{A􇦦&|I }穪YEЍЃN_N>͍@T">_\<(5Lj@s} *N EAbt/C3F73]9yMO.(à˹T28 솑vP wqMZ\wF)a5ɊTκГ(Gt Dv'Oƛo)iA]vu8և3<#6>|8? QYYY+SӦMAV\RYSS#EB.A튟<R۷Һ^~( ą 0D܈z DNA9,j 35"9ǜ(O40G͝3E!5`g"]Q˗'�*?G4I�.q[I[UZ(2\�,1Xuӝ-`P79bd(sss=zT.Kx~: :uJ&]]]~}ӧlM*zܴ]ڀ3=z\wtzɺS"Vu;wojl/GATKу?1VPdYL{ @r@-žEV;#|Q,", ९?ZD@Ezt, `W"TK_ H}oc #k ~΍򇟡&b&K0+L E% ӟ^za޽1Du DQC|3gH>T`dwOHH<灎:ՕzuTRR"]TgT9Ri]o/B=CmLǍ^(L Ü@L{6r hS}xja�VTr aO hb\aB z"A0pk'cb "f#�_S=Z4QV9&f]|; QO4pХKyczo5GyX=ZG*Q)5=vر.[;m۶Iki]]]6lnzׯ_oc!JaZ~p#ƺ7!*EcQx&@)H,OsZ? ,Qy2p/[qEI+}=B!L@@gK̍@g � n 3]9c,u� Zc(GD.E(zFg;!7QwŃ ;%z###nkT%^RuuZeEiel/B駟~BZZZ337b{JFJ*�(=%i($5c|kg :V4 O1M ! S:RQfHtD-d!vX"N̉C1, ŵ]0 3#%A O@8X`bCQJKZ|SSn}ޒY~ycsxPu<)s{F^W^ƍۭmL09'@΍^hQ 5 RðFxUOdh{3r<'30P 9#p?c]:Ybț91ޘnr@,_|i))IN-%zEi =w4033[7!R{+%C-C}|<ۢ);'I)cϞ= Q\/YKF Zk/G@e@_ 8q<'1֝(Χ(JQJ(50 8�b0L @w[ް -bn ʎlFH)N )?!9Q>OnXR3hI&1z]ՀYow؁~+%CTڅF})&&FQfG׉Aֽ2CK0YYY:T߹^zYE| *??}q2j?@TʈDizC"kTVTZ܎ q&g7ny=0-w�ODٚb8`8b)!(!0Vm �K mJ?`BPUjpiQZZZJAKz;YzD--⌨F2֐ Ri c`R;y;b32<0#|0^u:&Hx Y) ѵ b09\גQ=Ǝ+'ҠO3w]Cԃ&T`qdςu@Tl%,#ZSSREbJ:(aT O` I@HE)0{K v¢_%s)"`J A%r$j�/J�W0Tn,(T`qdςգ!OBɀSYF4Z(D-#Ƚ DPWSvfE ':�1'.H 5.#~.솹1!&6@RT�H"$8QFJ68KA\X,(b1DX.C-ږjEDT& l` "U:@-�e*5RuM @) �["SHP,@(%RP|]BZ-L2\+v@5^] b1DX,!burssK/ ? )NSHq7@*ӣ )H4JRűȒsD6I☀(Rqj(&UTC�1(DY$hc~l0zE؅bbX,!źcEr4CW_�ñbpTeòCl`,4UaDql7TC|(#UD>mžظe(ecrqJUуt@T~![BI|ES1o rbX,Cu!Dik͑Rd !bX,(BbX,(b1DX,!b1DX Q,bulrSjM\q?1DX=J~G2Xw[wYKaHu?x'/ }2۷o\'W^3:QTUU;�q#ƺ#csĩt[kn6u/:?<?СCpww/c!AEEȨ1xבsppph!ĉSC'N Q9k̟<y2|M9Zڻwoڵ/_?y>|8CllldR&HZYY:SOgϞp§~*̴iKgݓ.\u\!'vx\BTk'N:8qb.277ѣG/ ==].;dԩS2[ Cz-8qBiG}+Wŋ8<:HnRi$\Xs%Z`ܸqvZKJJп}xJIIu\]]?2DqʼnCTOoq_ş {mܯgb5O<!駟ku;5Euz-m6Y=#pvvnl핺2Dqt 3L<x?ӋRLf�u VɅiҥK Q,Q_|~vAt.;Zn*-U>,{=9źS"?6TWWKmv\Μ9ӸOY:Qt{~ }Ƶk׶]`C[(>]>I!e-}Fp=!CT7BA+D# Qlb'5e~AEѶ3uiSVV^zt ['mܸsUTTdۤӧ;Qʕ+H-),,aÆnMtM6'eE�?=W\so<5?O�'n>Krv+D%%%5j&GLјOCid<| 2љ:H.PG#+uDP}۳gj5jx Y5Q8s''f|Mv!+dΎ|5ϬsKy6m_ugkLl">@]eХH4H{ct_BT{_tMϣƞ)"effv+DQ+]^xddd";;Yy"P'oL͕S(}ź]>8C~dE$>%LP(55UZ?ťs%CQYnWk)LYn@)lz?/ QmȒ߮q FMm:at_[gرo6,ՍR Q};SwG{o߾ۚ8)( p"R@ST t`hT ^~Z.}ZѠիW]tQ/]Ԥl瀋ACTEVǎ"""KaX;Qԁ3A~^[E ũMիWp"Bq1 PdF۶-ͽc=o߁oNڵzjJ_u ֈc2Wgw=V²eKby�: PkHm DRAyڃ?3D=;v<E|>>>YX,6B_GSZVߣ1Dqw!�z#D\v DWxYzP_~=/nܰV¶mu8cؼi]6b]۲֭gǪkQk֬Z-صs'v܍_~:|[ԏW}K]w~æ#3e1�.v]�eu.]ÍROb_qE?rKwF"-~|?_?c Q,bu(XCW)Kk9z2]-L Qڃk~$yl|^<?Ɔao8rnيSCk6nX`k\v]Z/رrը(-æMq K@ԯ7,][YrrߜMӰVeg~{U|ϐ{:DM=]vWդpz;7 +Nw1LzX,DdH41QrAfyM�#Gojj<xSPUIMGisZC p:9m߄8"ؿ_c;|0CS"^Z?;%8wG߷֯Qw)ah۾6lc'$$[w֣VN*_n->7XṢ́j/`g!\tIWiѸ\Np]AVwxgʘ??J LKHiXt_ZSvw\%OPC!J5<UEi%"U�QQeTwW m7W7撄,>?u!bX@ԹsnJpRNgjRMӼ<zzm{eQO-ũuX3i:X(55a!}Xa(mm@eylڈ5kW0qz=zL]r%([P?p?9FXf V֠|bm ~~COaڜI*DPb1 ʶ׋oPueDVMiXl& D"LoL[ElWLRsb|MZ^n{F7!cVN5U2A˝kdx׹ޛ_;Nu`jz5&:B޵ZImߕV.Eޱml'vdE1syg5gΜ93Ҿw:0vۗl޻Җ"fNJP) 3D UHfPVj'R9e/sF{￯JN˶.uPByQ/W$JHe(4O<{UDQwaӎ}1$1:1zU(4]XY17z>x�-`>7WH݂}Af#H]:V^ö[Yv>_WHЭ�;t-]swqW:uF/i.S25 3}g*|M=Vʯ{DeIs_/>=٬2e/_t\.M6:tNɄmzS:9JT$kvmzJfRC+ã'Yl.SDk{D UH }-)eJf{既GEUUY R\D5ii/%q嗬Xid}Q;v}N(&NN^LG~z7|a0#{cJu[ٰs zw+cL Jkc̫H&ACԓ~ :o7bl..cۼYlXF)]}WN%[;K<oA]~]ɑ\K&JSR22 _GKA wEuN^r/ kΏ0Cs6.Uޖ*C?P* :=Rpp<Eꎝ[BA^U&*Ulօ咉A(Q~FT,?qℚQR^ T_BP.J T[DI\NN?k!iByVj{nhʴ053;BۓwPbfX5a|qݹ;P0q8n׉ɏÐ~؍S7~*ctWe[&%:{{'�Nșt^=t'p{[CuW"Qo ɇrenRJ3Q3xRjK_RJZPxo_F9.$)(Zo율ﶺ"Z]2'JAD) F|]4KE[권QDž̳Ϫ EJZ{^{+^k箴H$SHaa{x]3>FHɴɃٲ}I6'ldPt.x4;۟&7Ō=Qcew]HZۘͤy1t؛InRb288i,Yr2c.DNʂi2Lۉ9WVP+ +MRr2JT\ᜨ]gg+ EW#Qm9q:Ii-գ(bqna E.:"*^ܯK m|-EAՖ/RZ؉y/+6UV~ELrNl)RJj$ꉃ;iEE$zu.Q~=FD̤Q^|MnܝY#'DFGq|{%`ޅu{2"g -ku?JKI M`b ?!x!>iX(?/tܞi=XlnaaX$F2~NeUZun͵)˼"SJ[Pї}WRP+?"ז:` 2%MBaqʱ~yUՖ^wSsS2JVi9=*?-}k vUƟ[PYBRIJDD H|,*H[/*o^XbR̭]-Jwy帥HlJ%k֮@ =.eޚ&xa"QW,Q&H?~A7?q7r0A;xGu#id'CY2y8N$N m8%Ss8u7dxF&`"Fh&GŘ{?9:0?12zK^;<֝ʘL05YITbq^vC)~D g%e˕cK7_|k%*`d΂ TKR)D^bJO2|K>jk-(D?0>5`HN4 Z_e8VLMÐv?zzrf$(y<+o|L_qTF2pff%bIOSn2^2FѻYe kqLh4l{/i"a� iM9B$JB$JAD{ッą2Q][J"RKHT˶ZO?UQ7vP+-ۻRR3JSO=n9 TYkD$.u B9F$P`*`ͽb:t ?3g':N{ue-Wz>rL7msqN8/B>Sо$}fbn',u97;oꫯ-&5>=Yi_NI&JB$JAD?~|(2ee% ]O;ᆱfN5F KgP|M|-p)sJrHHpii}Mn9Od򕓝a"` %&#Ukh'nϜўHR+K1lL>1g�f  JDf1L}Mc?.x(9V o zǏYY2oHMEDID B[%ȑ#WsR6mεޣ.'Q5K[/@)ҖkD$VNhwud海>”KhLyd*ׅmQFSG}mӁESx)IYmGDcn;lց"2 1}z0#| N"xzM\tFC9D%2bcDdWU!}(H  Pz/@WJ6J(Kչ{f:z(_~Hu3$jYe)k)HCQL?R-|K6I>5eUB._"rL͢נLԟoeӌ?a[x{[gbz3 bc<2#[{nEWPP$%Xǒ%zRn%BRMI7%$>mݚxgW{c_*_-A6H;+ (uo6ZbbTY%mA`L dѬ9<ܱ=%W'2&|VGu-9̟;;7]dnd$ {chGdS` DjX4ߦO,z̎g1 =q쐾D]wYMoe/l{˟\&c/+)]$J2Q poq!%.Q~!>_(yIeqP6 'JoLm34mNk@$z܇8!b#x|3H'nVv#!"r}7s=qC0}ٳ:Sܛ%iq8t +֬r^tѱ9s5͉Rj-lZ{) ?Qyc<iI称n@/N]UvE$ew.y9>[>LJ_HJ9VYY|Gj??y~e.|%o{J;qZQ*2W }vrTDY$JA.#QGܠo(?׫^zI*甽E#x/{ (E<v7k!33)LƧ0ua(VALAta2 )a.䈹Թ0tHL�n:vn2w܃۞CI~,}GOUC7ufQ0n3=c--Tk]W(bZe۸eo*/}pmc_t.ִ}NhjO٢1ΗyVX<R0i\U*tW$||svZ~7}xm |5?*~|"Q HT+~U9CyFK}&-::iy(ǾcǾd]SCGИixқzJ31=a#ә!mfoө0z}r{X-'Dmd }{}4lAic֑Mw4aFw@ve'}X-u>aLyi/-U3PN8)J2il 1PPd%mJa{jJɰ(s:K3(dz~vnq˝oKI3=b)% (e\ͮ(CWϗrM>O[/!uvNI~r;u˼l@qT;2qx_vME<$xh$JKIé^MrwAʌ^]79]<!!ganZUm>dGQ[(Ne| Y=yw4WxШPqSU~?s$J]OR4 +=[D)Ye\#_3e}= -l^.tJFJy&%d[gDDJj]nD e$Y<N:/�J"0"QG? 8q{/'?SG~C?!4c#cc ~ܮ2~T_:5 ̥}C0tdz, CZ1=waDwElQ,1fMOt;SEӎЍg a֣:LF&c k8s$KdlL&9~f<.%(TTskWɇGOՌ2/tEZc_ RF)swoj.o΁7Jgk>dWAҖfkօ(DA%!!q$JY/QW^bCۨJ9j sO;Y)pތڏwJGF=ؗiwL ҅;vqQaF8N!ntlG C/<xSngUq};eAۏq)az'{F67YOAD$$5:u4ϿY<NjM3s>D1l<܋#GfПq͸Љw3t0038[sg1XJf(#gEl\LO"8i!E>$ {e/]6ƛ}ľ1lܽ3&26d g1&<4=NVAKHĵ%%_j4r ۞y6! 2cH֝'fs1ph/iGAx`P"G!]/{ҷB]1YDLp#:15;Ӗt&4T6AͰYQۘ}wLvl,ޕy~:y5-q.!!% [K e3Q%eɆ ӆ%g2aQw=aSfƸcܨ~җT=1W?= 2f;1/fQU)hݽwelD܇+Svc6ƋQ Y'Is6 CF0-x|xV瓐ADAjRgX2K>ՅZ87wwCx^N"M>tMKp&LͰyLͼQfj9Hk'63s<zN.Nz sv:;xvc_#ɷ%^#|qSSPD.HH  %B%4zHu?3! ܉.SOؼjG0m<{NbРI 5Ƨ3cRW&. ;`&S6:x't:3wFG0< Ux ܍NB}x]�֎XoH|x;aSQ WC3i,3hRߏ%u]\B$J$JAk%w^籰wN})<`QtGf.Dsh ;ӿW??a}֧+}F<@#; YЏ'xX& B bn͞JXjW +*+ȷX1kb6|'ӎ;a^Q/D̜Hi^q]$5jy޹?uF66WZ'|v씺gSEDAA$JUz z~]1sxƅ.aҠ1. gؾ<{<3.|EߎEO|#Su'<h$bВ#xwXޜ9ƦM,it8_vw|cc߰N=vd?@LL[y938j ɡͫO7DzT݋HHW#_|T7U[DD H |%wfބ ^KA Ȥ%LEܟf2sO EQnV7vzѽ8`(oL͑:#GYް^];w3qA>[/zew ˚ 6VװMđݘ;gϣޠoiua}X?yo?*{C$J$JAD,QN>d9u&5ar:ĞKG=>G1%0G&bA;ָ;Sr�6M੩(<??3q$+Ll[ͫ+oX-򸹷_=]mGCB|=)YU]1 4-|O8s5wu-!~ʐ1EDAA$JwES|׿i cADL_̖][)(ڙ-8%3 /FO#-v$J̩<}HXғ™(++Wи%L^=}Ǧk)h#I5%[MɎ70׶i(ErQU%((AA3:s8|]6/>Cq ˗[I{219z:vgdή?c<慅g4z `ZD*CgcN~ǟ<q!OC z x5: ST!>- KOY8Xͳ_*{^WR/)Lʼ}UrNԛA(ANKԙ3D N>㣿8|n`< BmAn CggcgZ!3qGe {Oټu+O?,?G=#;vq N:yѻ D)+)+))e=ז^WR}~yvu=q(AAps٧Kԙ2'8Ax-^xEڂy`I{n o֑(+̻{ qRO KNkb=,Qf*fm$ }[%qmƢ7"/"Q  %~3ʌjv/0Oॷ_fr 2׀;9pM8 ;nM~ӯ0<@<6,m䉓}rZt,Q >VZ.|oD H 3TJUV}oo7̄)C)zVIYDo=S]H  D wp8_Kyi'~DEx~j7;]wc&UC$DAA$JM$>ˊ̕eNRU9 WM;0h$EغYn?S (AA#Q ˗/!}-ĉczb+}YJ&$6#h(W^?+Pׁe˖A(A1i{>u)%+ŹϿy(Y/5t ,]wE| (AA#Q>F#O>&qRRRu s.D~U1s"E$DAA$JnDH񛻺sC2O2P"Q  %ߚDIHDD "Q DIHD "Q DIHD H DIHD H I #% D %"Q H "Q % "Q %"Q  %"Q % "Qo+QgΜ:tҡcǎ}(AA&Q3|WaϱgO%v?c3j^]̓yoe=ٹ_,O<<O</-`]5liz|́;_ڟCg̸"RH  D (%uPj->yyRifVmȾg9_ާnjv<rf}x떒seӑfАe[VɊ6(e~?V'8<ϦZ]Ϟ Xm$8r_ D H RlvnDk[ʮO٣5q~y梌۵_IpWi _2.sz:LLJ8Mf7Zff3[o&j9YjھZ_ +Jy谚Z}ZuNmp 1Ν;oKA$JADH2|U-|%<TRhIVz936ba7[zp%Kʒ٘21KN)m:qQ)0'5Guk/cΝdgTzRhpSWȊ;*%2V91,-(AA#QSy)__Md{JH4<t<Z2irؼ}qo^GVkXKGE`O$9./Qi䤤(c@ ¥ÑJ yiܾ}>M^S헳w2&k0Uv~yZ]IDZ9Q^KKgW{DAA$JnD.#sy-F I$"۫#(O48‹}Y<s$P*:w\4DR"զe˔Q00U<@|Yqc1jXc'va,]UL_J]I,+HfUY:%BېOۇ֑痼+?gu_|Kfo[?>|zgG?O>Q˔sJԩS7ʐ"Q  %J6WM}921CHӎXǘ$J+ %,qdRf'>oz<VY~} L fd`rjY#̺P 2aM$-e:d(14PnjHAQeE)~J<NJWn-!Yb񨪪H`qjKoSObuuuSSSJkaرj;|<jH  D wFdqR!^8lxLY8yԼZj(3x)]&eMXs1i4rtcҒ]HFF�y@|y!3usVc} k=Ys= #>dBMXtQcĈ5<9rVe9l?ݻ9q׿n5t-u*˹{^ڵkOSNE˼uGϞ=[nE�L9Q^IZ_Bmȑ#}O)?w,X@͐D H |q^@WTLBq })ڴه/N 1vLNöe.!D*-|z&#nU9k.$>'#}N,rég_. SR>T/vMnxwy%YN xEGR?~_3gJ;_'==]- W(Bu$ruj"60䯈M[i.:կ8y$7tSCnHrNs]QZ<tPiw֬Y|>>KHH;vL]^fѢE"Q  %߾DٱջVRok-Z6 T8'߆ٜʏ#7�Yzr44k:: -4d).:Lr T2XRnoξr* .qLi6\zkݘ(o,"i-u6]Dy<OC NfwQ~&Q"BJ++WNKo[^Рp8΋υY%k׮Eٲל:uADA.ɴiڽmζu=j$1DLT~ [Y6W8."׶Ĝ8L%x˳qyW9q`g`/$ӓF65|g_fe"I+Dw4=h$[6_kٸ?~$gϞj}e^BsW^eʱ"( ǏFD,Sd{,LdӮ3fZoVS=zTrn]Ӗ\JvڥfnV?۷b_sA(AA(Q/'iܶju(4lȝ%ɣJҲBGeO' 9<y458@sO" ,/n"m#VL.k8wіbͪ)YH+(+D96āgVDoD[|oKRo|˕vme~[ּp?_>hР&kҟ<_,VVREU} oD "Q \DޱN2H* ՚B5eYɚU9Hy‘hr1yq[h,يgq(T y۰ΘMlne,!P$%'%]!ơ "RJFʔœWW85Vlil)S.*Wr^f h4D)s眨˕Y٢&UtUVef/߿E״?-ݻ"2J58iҤuRcD "Q \7XȲ-(O y8kZgSmKM)goRŀAo tNFSq)F-x5FƒW1[̞Oy&r,r!97MN$e5hYHrSc]R1'Zܷγ j`a|Prʋʕc\Ya|W9h^l{qu+S-;ws5Y!vg) M4ke?OE'ZE}DvRO"88?|۷CW$JAD[{ˋ4H|"\sՈ^EeS6[2)q|WY"$ {I+z썤i)m $72t:⴫)#C]AQx,46i5Uy|Ƀ/;*]*OM][7RDA(AHP@k1!f@9IR<{ gK˒IVQ["Y͢jӚ0,BIzT2BVCkF뗨BsTtniٸ. e}T5l^M3QM]H5oL (A$JADJTRI, #H':v<qF(Xm]m΀f"ЉٗѐU'R@|i5^:IDS^6R1IO#ۖ$"5 U5D9=[{Ɇ M+l,wn]nL&H % "Qpc%ju$%jq`kyÚVjX(\iba7lE.RXY0e )8mUX}ؽ%ؼX\jJFs(R‚a$/SKV0Mhu&՛ Tp+XF&jW[i %D H XZ٤EDwUZoۘAVyYI1 `*3{08).Đ_KX(#ɥWp᭴#(:,en|9pz)SXCQGr"qi$BogESAӶnNJY$JAD;,Q?8ekD9BYh"K UbbIUBf+l:W.i1KI )#%RRckK4;m1IˢSԌ2+Ԡ/&-r)I!K/^-G/1\;gQy eě})_>Qˬ^wD|SB uBjkkLNDAA$JnD{Y6߂2輠s2\DLqR hVnLa^;)vd2u HOIR瓠".̲&x̋㋌eM:LKiZ$T5%ׇ”8R KIBA(K~ #Ez>U}I5eRy[.={HJJ'3p1 /% "Qp$(B͌((O0DUESM2CKF b(C9h2fc.نPrݩ$_bDK0EPɮeq,i ڬe#=k.Ye:6ڟIRdN <}*Ry[`eaL×wC${U|**{]X>v/>(yѵ 7no󑙙o+ߨE&}lrk{edd_nI755UK雒ʧV/L߾}Oy߫}W_};S$JADIfõ00=~Zě#ȯLD 2{Y44B3"I^BvNYaQXEN)sRjcKpls؋,-M'CZ.[,[7lo2,Vnb8y:I$懑IJiZ&J9Vd+^ӧٶm{zlDkZ//{Ce?5_\󄇇{gصk|.áwݺu"Q׮]{> iW^_tؑիWD H 8ZgVXb,8tw4kדZIbQ \)3ʲmb5 JuDgfP7*̔IdMX,F RyZU2 Y" cy&3qZ57mF<a)3phYJ5uMߪD<yV3P?s?rekYYfJ5cdMRY%Z֧Ur-?/wY$/%QJ~G%J[o؈D "Q \DRII|ex\n6i$)dp/0l5RyŐDPÒ2{U5̋ɵ#[?%=n˲1Y1Fc%fITbVmPP-zgdm2k)vfR7Lp8\˺?U)?ʕ+ϟҥK(% enO~ٲ_ʢ }"9lRR|dgR2IJ{ٳj)W^WjaÆF$JA$KYòƺ J֠H`^NwyRVK+'˗2 ;/Kؒ{,z W(^#o27fc-Ȧ(Lَ)#M/Kܵ9XsW+)L\r{t/ɦ|]!k<T^`ŦeW:_M(DEE2<OHY!==~Z Յ>|?d5Wu$JK27J#e~Ssy3l0U:[7:GMG~ee¶ȱH  %KT~\X< QLZ)dB Ɍ^4$FPwXtRBԛI6Yjb.iZM$mz8#<7)QWU+Kn_沝r5T4ư,e >W;XEӮJlߘo+% D pEUMM3\0BvnXIiS321i-5xhpPւٛ=/@"ӂcbsyl{ʝvw򄓃Qƀ4 s<iDܕ,faEC-+-oĚ&ۭÑ:z .&²*^arJ�(**D(AA+QlM%q$ĩx+3s Nbu.sT%V`qqxbcK`a۟rSIJ3uFj7Y|Ū=v2MIdh[04l<`cS%4Vgj+2 eQce.r ҥ$)7O>%%D H Xڸ)~90!LzYSckb`'!BjC.e&r ]?EёJ.4}$Ϊ D$è&.} Vs5Z<E3Iʎ!͓A6 [;Y㥸և&:3MkDʬӰSOnD6Y{H % "Qpc%fViS8(O!F'4zt: : r)N./5m^ I~JXٓ̂g+lw zk,$. 8\Z y6͔p.KSW[U.r73(X^ou*pW/mD}w "Q  %%j٦ ,X0)Sx,/g#"7M6ӖT'( we.ؼ2c #ӗGfrƌ( 8y0k1V-ѐ/x*X*MbX̂@<K)Kgjl<Oso㮹K "Q"Q H _+QbQUge¢"xIh$z. T6]fUHO58W" ɆXT<9x~OZo Ypd%],m!A_<y)x܉f'[n"e`\H"m >LFМ큫.;mYX}5KTk׷<x_>3m>įkuo8(AADy2)<k*qx.fbV5DˡMq<l}o<j0eF$4%bD`Ca`reW"Cy8x=$he㮱ebrļD=CbjTz-̅Tf&f 1co*{@ѣ瓓:t(GQcРA"Q"Q  %eZc#Y&,*&Hk&(݌DGv]a<~q4ܐC' T//,əbY&c-'՛"M $܅Z 3-`%+bnb�vWN<$d`6SɄdlә!,< cFH??q~ 珟{9((AAD=19ELIWOjTrR#)j0R=I T"lՒQN^2O(tG&kh21VXeeqER ՘JIWX:ma,5dٙ"mh} ɴ?eH_3ǎA(A.KcmI<2Tc',ETn&Tb)m4^KiS.Eh8y$jլ6/dc,E5$xЗiKCcLId^4%T$S" \VlMƠ#İKu $zrqZȭ̡_,Q(٣f(DD H IT*Rт"Q&3Aa9dXքmV6`7z&awb6;36, '2= //WGJ$[헨PT$bZ|Z\ז@f!9g:Iuڰ/uSd"PG @ʯYK<&e>믿ΨQD%%%]4'j"Q"Q  %eͅ4lQhPT#0dOA(w rek Tm07H+%} ax MqxI2MX33\D kƔ@t ųl;l7XL~qMVK8䖙5رWgQ%JYIOYQOH)+*Q@~_qM7jя~$EAA$J~zvTQrHlRt}.52Sg D^} :+s)Dr /ēlh`b/ƛD6t%gvR; *u s8 qwwwbH!@8 WbHqh)4@p/h ] !}w@r {{f3o5kmVnżuYX,6ۧ oSxgaٮq\U㐔_x(  "OUVoیE;Vbbҗơ`,.H[1)s4w.!020U"9r2QITbDR"r0;<Oʔ\n^DaѼH,H Gnj2J2Zɽn<'!0 (J㱨 "uqۻ kP^˗/aaa OEA$QJ[7a՞Xk9R"nt$@ԉ(Y1iR=Btq]s7KX31+[4"'vFLx R"3>H$*:,E30?= `8gf!>�SQ:I%H^д|;055E(,[ؽ;6| 9_```,(  "OH}@K;Wb,ݜ1|bLe[ґh%`$&Cʲt<e#$-s(̟p$MICzd>򳲑ŤBnbc0p&gLY(] 1$k0)+oQ;bJ,Ū Wl/2NPlL& " HHJfcEY lis&6M9ҟdsNǘbDcI(۟e^s' ia$oLAvq"DJB.R󑞘sdatl9X4QaXm&'"gy&bbQ԰HrlG Ūp T,ޜѯ%AEA$Qa$jܹS&?YX=+W`\,_+`BZɘZ2 !, FbrA"8ٚ1Xu36هM;b}qlE]K"1mn("Jƾ\ZAWgŤPN򱭼 [ش5DB+`kIDAIA|z 8ѳj1N6O-KQ4 Ec9YsFr3aN�Ba $.qϩS8p8R $oB {%c0xtc"香h6[3gP~e=}V7 AEA$QA$A͛7cHqa @$QAAE^$$  "$ H ( H$  H$ H $ H$  H$ H $ H$$  "$ H ( H$  H⣐5k:l-,,PZZJIAADć(;K+W]!ץdǮ =C|.ݡ= ]L1F𐖁Y>03 "p(k#%Cb51o< eMQ6 X5a vA1%OBfp}<|P]ʕ?@NNS/%AEA$Q$U` . } ߕoBwvP$ʨ�셄$$0# ègoX_%YL6T4Unif( -,l{}丙" s|-J'z`U;VqgEc=1og T=z.uOq=aڵkIDAIA|bM{14{B[O(t .= *\ 'P=a',A r𑕁$/J^pIbp8Fh(a,`&揰G)uQFb Kdz" :IX!5igy(uDvP8{D>CMX|,--ג " (0W_Ỽ<L]a)'M=ѭ78Eaa#$ 3!! R( Y>0)`& ӽ{ VD ꈵ7Af!a&( 7)[!{ pBF?k#߇C+f{9CGQuD?$n޹~- (  "#Q",MOz \H`."#QrRe.$ nյ`d᧦Ez\)w4_r^ko>:| {􁝰$h XO 1PIV"SU$sc*Œum侖(:K oDԿ@Us$  HITnT$ DI449qQOa'P]zER Z!@YC�,ŤOV^Gq ċ>b.^pD`%* !I8,9:aF:X}؝aؘۗnWǵ/ީD}͟oKll,<==I $ Z5&0D8'?pvwAhru9 ф F]N:(*_SM"3mjUBbp 83! #N)^F%e!I'l=D9$K NVX拽9:+]qYN (E;]/} ̄GqF 6 ׿ЧO1_/^`ڵ+u)S:$  H⣐(+e)*NT BP "P'4V諠*W TB,1HIJ<a, ƀ.u’'>8IAkudM f|sINĠˉ~1nZ}%d1nX>i}1ʞ_quվ@ms^UY%5iy2g ==ڢ UUU5 ΍ /aϋ;$  H⣐( 9Xa>_!Rĉ5F]BD]{ݞ 7-Ajֆњ``]V( eN ᣬ`S=NT୨ .}d9$K Fa'$0}#LA Rak$kk[ j^y?Ր޽{a"#77Cy֪Xϟ?GNN fee;)t߰ƍ[=k߅UѣGo yj=766r(  "Bt06kzΪO`[&=t/NJH(MFMb ey$`&h"PC0@- F�{;A %ƽ4zpP'TkҪR%M$뚢[`!N/_;o@JPN߿%KLPY}o:6 ?~<?D3,%%cc`׮]ͪHӫW/^4ڂPݻwqݻ|ӽ.'" (($ʅ*p~ّDW&P"pDG@f"@9L4E&i!R1:0TGul oY9L5CnkuўX:VFKxya6 ~HE I)#TA 68_yy8rW>+Qׯ_租<yOo\ oL\ش{}߆un޼l[Vyb]O_zf;/W˗=~ѣG!""cǎ5ctgGDAIA|e/jpKb;HI!D !- ?h`:`2Fk`2'NvHqD>|g_;,~vHr@9"l0؄)B!Va۬1n ,gLQBX=bӳpb0-DU׾앏 oMXm˚ޱ Q__O}gVbMIKKca۷olǎ@jVSEA$QYH*U*-w5n[CmZPd%!)�/N$$᫤8+cTU@:`v_ GL1sC5fy#ٻ6g"n`JwlJq؝ߖ-<lE qtF<7}ٜϐ(IIfUm+++n%\WWr$&&닊.'j|r XFDAIA|娤eUxp`UeL0]5fw8pB'+QTS&cu0X~*( ¼aN(hAN*#2!y,)]9FF8[GںR: Ƈbˌ؞} p˜<?P|kLJ>ϐ3f4wj'ggÃVbl}&hz>|xyiiiÙ3gZfΜ9m>I ( ދDYȡ?'Q<sqX si^C F("HSeOZ`k wSx[#˃ܑHpFxb ~Ev +-ÖQՉ3m񣧜@D㤫7?cqttĦMz)_9bÚ4흯#̪JkÇz,8QM[_2z4iD%""D$  H⣐(Q  Ö(aIICV>𐒁Yp]o)ݘ'c:8i@uU5t;C ǂ13D�{$@)h&(< }P:f %%P Ö⹸R~x\|S>&Q5\jr+}NO( $ NIOACT{%a& ("g IKK#@~Jb||okNf|''!L ?S͐alz+M OCmO8e9;nGx篪O@9j)?ۏI(  "+QRrVU<!+ ^B0)I dӵ$`'*SaDZ" z0E f;c 'UMA4p37D7łQgn`++dܡ#v. ?~ں`=m+cuJ($  HJ*l$ S_))cIIVP)a R5DId᫤Z0ec<"98jɏCXEc픡؛^( >8 �JTܭBMsÈ'O^&e%xTU5q׮? "H $ >D9)CF^2�M5ɔ8{ b4)a,Bi-Zh#VcOx,])a2=�cۿiF#PykO8yzEsz Ś=d rܾ[+?j($QAIAZѺp~pM%*ET1\]{T)SNS4Smzb_NNơ(Dzq^X2n+ï;6wPINX_X'}wW?S5HT'\xܫe3[l+8;;zk`ʕqtT嫵mm>IAAD!ZQQADX)#PScT1JS%-iEJr2phuf}jHw7B9'O'WƖ� E;l=\=/ ۋfee)iz\7c1[ʊz^ꟾ>'7g|%asT>xT*Q"ܱ[T=~rɓ'9 Ub~.!ދ$  "S寣{qIjYXn'11KHb*&kc:'QAʊ(K=LGn?rCsX,X;7 kcGA҆x_WkEUէ:1STTq/xqeM_6{)qwo=_.Cӧ/Ol@YȤ {dl7HJJ6$�?l[ өgϞoTEawOOO\v?222-no߻wo,_111֭ot1[/Zq9~PUUet[;ގ|$QAIAM)+FT_F CU`/" Aa*c"'NVHt0D>|Ք0LCeMe'=, ?'N,e1X"?,6'J4d<v݂a=񟪞ݗ׼P1ba=ܾZc;8˵N'&0a_jgϚgܹ 4633r5v…�G}|>++foݺmmm8[:}7nKavvv㴰$a 64Vhe盚bQVV557>֎$QAIAU%ڪ@cL*%PCuLC! 0FHt18LkX]!{íka<_'lOčG>=u5�gZ6,l ԣG/{ ^Xe Tee=n^y bիWCQQCu|__Hؖ-YXJJlllߑ*Ç{` ,^k&~mMlMXwxۛOEAD$*PSٛ P1ɳ#ט' i_eYLgY VCe0L)V [C9"m EH DN>ΉR?pn=U%XPL`TY3?vԽ5WQy)VuZ؅Ç!++Wb^͛7[oǏq^(VaVZu؛p}L:0&y7onu*HmITKYE$JU?7X~'" Hxk!(16!ZdN8`AX2KF"g5Fj*f!-1JG3\.'3!qLrrh=CY$,M |p)T>{ _s<I>!+~'L8=wk9C%3T>|)jHKK#55YpњL4'o\~ ^*TM=v /hƌQlؖ.^l~TUUbF{>}cȤ{^?/@mi~Kw$  "Sj"drD&✍9af:յ(_Iؚ)jm6.Sl`u={c@W p܉<gsn{ cNj=<Ǹ{_;7۸~8ݻo?.nMn5>~A~$QAIAar2C)0T[ z#2O%8|&DyDeltoK5PXK#F y3\e1@Wۖ-+wҁ8x Ja]رm'?p9W-pE_;7aU$QIAAD8W ĺ#s-}0H =s&n4Oؖ]i|=_In / Q"e#ƚhC ,e076Ϝýq ܼqg^ą Wrr9y,NǎgG96‘!=w'Ϝ{#"H $ >Dr@VM q>Hr6BQ+͛9s9cg^2: ufyXb QI`"|ո`+Wo �}Cٲow~GUP[`?a/>žiyߕK:x9?U]CDAIA|@Ls1Ŋi~( t�01#1o&a6` 1T l0RG}E0XYlؾf,8.�!1q\:{5Oqu|r֭YNʕỵX;ֲغq/|uy'RX:_ (3xTt"!#" HxKdiI&jJF"'P>2@CZ[Wzԅ"L4߆x ɮri VL&pT@Qز|5\wp~ׯW;t6_nxO^ )p"f޷H:u<//7n@mm- ((  "O] ɾ(ˊ¦4- VQ;m |TONjpnz:"l`%,Xgc7G)8@&5Il51ըţ{x)*xToY7OL_Dp믿ϯ_o0~~9ž7u.ٳBj{+QnΜ9+`l`ۓ'O6.kuVhjj튋IH ( jM&2P0fV%D^_#o�LuB|?g 7ԃ,e`%!G 1 QD6- KQ TCˏ/5ࢇh}a'_1F7 "qnlv>,/kwp^ \7c 5k8bŚD?|^" ѰkXZZ"&&ի.]>a<@PPڕlο?eellk5ƼbM ^r#F "" H$5dgQ(1'8\=kr8y҂2z@OXr K!ahu.P*�o`Gӝ Q4f�~*=#y V ӽᯥ ;q1 RG5"m1P[ XC,2G6nj\g,*oQqAusNDasGGGL<...4&mذ.%%ӧO7n*;l/&|M߯>|۞Dud[n5NWWWw%**l\z/y!" HD{X#Ӭ 0Kƅ=鰒f/aM&# =uw>z)vFXkGqa&ʟ 3t7Fp櫭 +D"BX~(͹3$ ù{pa^T=光U*>{;;b&CUUU֭߿7c!!!(BBTs65ZD5rXYY XLړlQ!;r_ѣdeey$"" H$5ؽ?zaJ<Z!NL\\ٷ+?PZJpnoAXȩ^2 3G'㇒tK܉iV<p2ujz̏Yȝ<%c1 1^1c8dUɱشbv؇bس/_EK.Dhn^?ކcM,Xq{<##uuuq…:<?4i,Yaݺu|%Y mx=mm&}g@ú7ol}uttZ\effBUUϯs[5ݿ^KGEADѩJ8;F!X1]m୩; qx#R:p= )1qv9׏ǵkqdU!҇iSqΔCYa:֧M ۦX:=CP21u%sdhLҍ_Qqj߲9#++ ]ti"%%flvOEEE?3;_QQn߾Wl}zj>$&h*Fo]KX̙3͖yJIAAE$Q삐B$BP(O-$Q%D BP(( P( BDIBP( $ H( BP($QAEP( B!"@Q( *)J_[,($'~=n9BP(`abi3⹴Z3h]Y ,1-|;$ŋ$QITg!P(Jg; lEV I3? wa#v}._gaZt njK1M: E%sISĩ۷ [gYXٯ\l{vұvp>?o . Br8:^4u^~:bancLJ=gg_oǶ0jX[Zg7۟Μ \{gδynfU#sKXcMi)2srvtmZ=_9o{K/X־w7ot>9w D5~rtWnEED~^A!R9~ 3m3:h|l~N:ŗ邃BP>B.:/[|&yM3ޑ'NC'!`<.HOgIֶ|M% o./]C |znshK.,`ao,QmK{Ǒa#pq3CǶgܰ}g= 3[(rv?;KJmN<l’:u.4( 3̮ݻf|Б .}qp4+[/8}U4#쵚OgI|eM%Un|սAimCVm}o"Q||}D/C_fգwc뾾}ge`DE[%Pha: i86}ڰ%m颃BP> L\ڻn9]vq=u6b7]ޙsD 7(#ut{]9]7o Tfo"QmK{wi;JA|I&W/kM y8Zky#=U:sNbM֮[FL,IgUiV=ys۞W|=,kϞwEKq0yyJT[JTytOA|z3b/JD6#dD~(]tP(_w\ RRߓ2"ϩlD 9ΜXGIEv7l7o|]IOݯa7m}vXGiؑϭ}i82_'m)&A(ZkGED<k=ܬ1kϛ9Xw__X4l B KT[)&>w4i.bٺSb^X(&M19qב+ϐ(VAa=5W2o[7oZɺ<P{f&'KY!0Y~W߿!~?N'v$QIBP(?pvήo}jF&gLi?{ƤH$BP(w<ze57iE|!"( BPy=1kN5%*Y  IA$Q BP($QADQ( BPH$BP( BED8q PR( BD{( BP(_# aU=R����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/images/album.png���������������������������������������������������������������0000644�0001750�0001750�00000312512�13112005742�017744� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����;���R ���sBIT|d���tEXtSoftware�gnome-screenshot>�IDATxuxG7`'v Ȗ133˖0#03ClǘĜ8:lx_jHF,g}{7*|'=:H$D"IdGEv/ɓ'|#G>򑏻Q2de0׿?H$D"ȭdC]іJvs2qD"H$Dĉ3/D"H$DD"H$UDdI%D"H$DYRR$D"HTyH$D"D"H$U P_D"H$-JH$D"Q�?OH$D"ݰ*a4HY%2?5u.W0WMՏkoFgx%HU:uVukS|q㪭5oHt�?RS4x,,→PY7/Z/u5u.g1sc费ش@u1b < Ӗ%㜪ˍ|όߊOYTPVwkKǗ^{s31H=¥W4Uq]s}*sM˺",J N3_'Na֊4,Lki LwY0~pa%ϴ`qcsu\ ~sUϾJV'1yႴl,ʰؙ8~ilݩ_eSV8[\]V.fu1ϿB<StS/J/6ύy?wM\]۪ٶv<<~aZm_OYkR-Lw~g,JkO3v8w"x~ﴸ̴Jw/A/w?æ~gm8i&FY-wQQm-qN{O,3yڒo_*ۅ!Sh(L_W_c~jO]dMez?b_:<7޹<FZ*UϘ/ZlG*]P{PiKtOOL ݵ2/% S`w>Po{ΡuQGu"U]=aÞt9דvw&mUl[^C=&,XAf>GNYZ=+rM\%ϻ{V{>?sؓk)yMT=<Rݧ# eU<J оq+XZxM|K^}?v)(zY|^NǟAG_׿ s/ཏ>F Voۭ_¯(wJᘩnw|=ei` gi:w?`p ݍN|3/ ڋ/q&_v9ݥ~ͷ?m./Nz_hEPI4\3,пQ?u+w u_{g)]{&mU^. U{Ӷ᧟q~ǂZx}?gEIeO?Ҭ\7l-{r-E7POJC${2@7D7̇?܇?!EcvYϜ(�vuq.,>|@c|.1ZQŗ51^~"GwA 7囱f6/v*wb E]蟪z}ܵ²vu9{!詳.ߩ㹺gx,#ϕ(vWszݵWimRֵ:;s.]<<m{NW 8YTo~gEIimY2nދ~u=TzMܼw }&\2 Pndg2ȿ0 S\|q3 _8&t>ZT'+n/xZs\*yZنtr_C'3~mv]8nCi!rŮ>^LiU=]owUZU]g#+^C=iAXgk6uՑ]uSϊ^Ҟ#z=&=[e]KQ\mA:V]84c^X@U(׿D71V<tTwG'*a@i*ɗ*_F+:g'qMBg WumǷ1`vCZֹUuxUmE! cصXT^;IǞ4r,;|湢kA0t]~Ew1Rj}Q{U=C\Oi,vU{<iwwmRVu?]Ͽ|Xy{<zC5V8VMˬgE7UT ~GVYRT3gՅ:V]\O({(.3 PnO>s a2Evɳ:{'` q+y3܋QY\J7XDg֣s)~%DwG$ g W6"=l`2U±`eYyI1,hݵAiׅ@߾F3%_Z=wr&%mUיK:\,zyzG,`�'aEA?zVxgz) eKYRT* u@͡]H++#HVRL7C!E؅t~J7Cs83]L/dօuww.eUKXደd(2L/wyC2KkҮ [}?\g\zOYMJ^۪3e |>˓{be]<w5)ٖ^wcyLxr-EY"Q5AO"a ItsMiSUGA$ PDU,cM̵thi'NyJ{D"QIR$F30n"Ƹr6UӟKC$�PI(D!RڡeI[D"QJR$D"HT5@?Q$D"H$*(E"H$DUD"H$DrKR$D"HT5@/D"H$D�H$D"jD"H$ʭ"E"H$DrKR$D"H$@)D"H$D"H$ PD"H$(EpHH$DU |ڳW'O\M,y*yҖN:~Czž9rvكY旺}:O]nէ<D"ubM^rzK/)ǟx_|%.]vC_.;jӸyNR$D7PeeCEiO:ĕe—sڹOcaD!G/޻eot8lشF_V˒LCH x,Z/lEn=Hhx^Y*cR_v ELs/gX#GW_uѓT^_xVXW>}o_|_ ;O+6"sq"%|D"n#>?:Bp=~BCƻWbI V]}.&6ot~-AZfV}ΜU&e{eE�zRNァ5zD\ifk P6|2ks8Uq>(SLⶒrwVc=zy]en'}}̶&S\[Z~D"HTSfPS'1a49Sز}KqGi!c({Pdբ>#mswwɺ;ʪc%W_{hmqֿ+**뺖<GOSU<96n*Zizq ĩӐc3:j:sV_O+mZD"uqro_~Y[¢:{~e*D5*,vaZ"eǴzrUb|tP-ٞ\�^+rʕ4lqxz9<iz}HSv3.dB5۵CO;O+ewm-D"QJWZ&LAuZ\H/`&tuy WuZ(/Xt \{U4i+jtw>5i͞c{\Zʺ^ݰ&O&MX}WbD"uqqǁy %BU\n.Y]8߮1~׋ݼutW^ ݹW7x"/o:tsrm0|Uڧ"ǩ{m1?d^.~e]۶#k:(}W`s %ǫD"Ht%-R6=Б# <LЃݐ&-=Kz68a1ܝ{UX>}ڲ;'5KJWmj6rVYכW.R\wB)/oO+g/o>#?nH$D"nIbRD"HR$ PD"HR$ PD"HRR$D"H$@)D"H$D"H$]@;D"H$DVP"H$D"Q%@)D"H$D"H$ PV.^ÇcϞ=uJӥKD"H$@Yaرc._\:uN$D"�e {=uJuN$DG? s<g0s9M=~Jv->:)B%(H$D׿+ >!V ibn7{`>9e&sb쾘5s LG`^Hc;˰~2FGA#ҧ? yӺbԨ #za{{ChA@<s 9ӧB̮1`4thUqb8臤=a_)s`j;glus'1=0xP,H 6P7PU4%@)D"эc.XQ))8ypnYٰ-w{bBfwCyh=<#Vh4t &cL߈9pҍhQq輢�w{&821<hf4_CףŸHHƨ Hu+1aU62Vcnn:B߼-OGh1v3BAĜ٫RtC:fIEHڐuRb{JD@c@i P֎L}]Sѭw_+*O$nnV|tOJAnYh7zdQ4\}PR7;[w-j^lOBYj뜅[.9hSmWe4앍h? XyOW*ׁ[Զ}Qao>^4nGS7[Ө׻fALUlUURuk+-1&}2zT6q$;–#63F3((kLZoPٷ?Sc]=zu8uѣ_tT?!(&tŐGG/k0cμZ96lZN^"Q-=€92]d=l6tb7oN؍))y"wòt;u,[3m&vmox3—A%[ujUoz#}=/؀ ÂSǍIb 蜲 oGĒ \oUemFU=3)xp<0m 7b bun;܄+21xDXo��e[4YصDV޵ َ\}{o/O<1'ݴ/?Qu9sF=K7,ZwGWjXѝAhŁAТ44Qj4~t=ZFעp!?` ؈CԶGVh>תmJ7kZO^;n@a U7 8P)@5yZNXU}עq<4RǽU<o5n ^zע ڎq`F~ YYv [uxXjآ\O^vӖhc غ,yN=``-wtvMLZ]UYNQc]Zi7O<.6k\'L9 W{X}?rTwGw{ p1vB6m}t_yy '‹1nDbj)ӊڽ>_|Qf^Oi?c Z@Gu b=1ob<nGG?Q,u:s,y O1&ቧNj =Nk3{R֒ؾkEV4c�GeuCgA cWr7W𦠭{>n首.jJKP۹ܭ0R<C=TZPk=Y[( :РjG9 06q- ;;pk|.wE#I3ށFyX;wVFIEՍ`X;bצ Ddx`bZs P P_m+Η*a8LKUY+<sa ٝ˴Q's:A*5t(0C(6SVTBY<hb^ ,MK8Yv =u2h 'ѣ9v|ۺ{籃tYˊTamB+;<@n5σ'g1~TyD^kzPT@FAd@v 5 46HS vCcr*л5.MT>(>ǀ8A#>uYF q[FMTb4U ٌe- -m94 cU<4Uy>1v4u(,0R_U[2lCH\}qU9gnM7P"#j<�ex"q+ g1,Y֥˗+%l̙Gg ^4Z<@ZȘo/a-i!1(JOuF;6wѝYHY܅t="Koi[v BX+kw R|1l:k0;h?=on&L>(vGw"/xk MAyՖf*BDA`+(l F(Sy:q-5S[;ڡ[Ejj?Wt|Ծ }U_C[IUQū}T>(:v*@sڧiLU^cU1CpljI#@N拆fY^F1>f_9rɲ$RYt.�Q2!ל,q&v-m_n,|& ( c.`%;wʌY>u&ǙˆC!53ظEOݽcvݫ_tI>-=huUEk˗.kMS yr/{坃2asqkt&En5]e8 Z[X *CK-mYUE<0z)W۔~QYW+SPOQvD2c 8-Lx}ձղRCoEld߾o7E{]Y@ɠs]U{|,-/KZYBP~'R_X 9p*Z+U()ۦ5aۼ*]zyV'vcr;DŽ%ʗeY!+eހt*}Mi)KI+,1<~ c8M9[ s{zV\G~RwJ(DJd+=k ;w{RX(EڴP_Ÿݺ 4YT,iV RbO8 X22^* *VH0U`S0Hp#xF, 2"2vLu_1li^Mm\`j4ꗆ3XAI5=yb\%_L[e+ѝV@ik:Mm)Kl<rJS敷(CW/f{^\<@H)q+ fsle\.oOϯ'O<Y%?6e{x;^/m]V;O6]1H0{˲<?*,C)2P KƖm.[V%ECUfZS`/JFzG< 0gUۢseW@2v|$sUZ ,*Զ(, }2B Uվ*k|\7)t�1 k(9piK_)PY,zg+\CE+jJNuY@9lhNp<\@1oV+ SCh)S=Sڟ˕qJKBzJwGC2-ہC뺹;6=ܥǾ?W`Nݰ:hqΜ3<E^޶.O9/YBYm˛y87uub=iutVbFiPUVuHT @y{otX61:ÒeIUP o6B]PxzNgԾL'Px*R)TyZ)h$ )#D1]i@`,.?8Fպ!32S;e*[stԱiTpڨ:4]}8Fsy�ӧ403/Р1Ue| @<? ,ŧ~V*PW ö%_ 1C :ܳ\@IZp< I=ͰAV#y<sP6QZ<7ήPܥs,kc� -/Xf_:P˕T:0JW~q:kyLv}Jv5{e3_tٻ(eYhyN;t^b!üouN�/I-<)2Uӓ^^"QmX('"w.Gk<xoJ&# 4i#S;8H2,EA]J)(T-#8 +#Ѫ#-S�ڵ I@U3:qugS5g^(Oul/:~ոS&-Yqٴb.^fҴeBgŗ)Kےm(MZ4PH [~G  ?C ֬Ō9sk<̔#"P1>I(oZ@(*4,Cwy[5fj tC Lc6Q>l lQO~nLN6)q7aʜ#m5ZG*p:$"Ȗҡ A*"r KiyjW-cX2^&j.H9)hYJgOLwESp@i֢�.]Q P=O[o]4FO~޼j"ws;ïC"KT�8>ew�%MKeaayB@xVPX^7 ?{BR-GfKw|e],t7vQN{]AyYVHJZ53 [Yrъja][38^a P*@MOE|4\X7S^^%rV@D:ę\ݼN(]2X2uR$;7tT@yORc1]|EѮҀGB1v�Jm-G[ڽ�{v_5pc YgeH ugϛ_5Lhd|U>fW0 :J/fnq?PFAYh?\E7G7"*o7gqB7 PD"HTI ]qIы6A̛N6JFZ" +N(0A*?=$idWy=?q6"SJoax##nOUe˻cع5,\~R$@dwEe>K?@R[&iT<d#8@-jز4*bPf< lKoJ֕AZN9ÏHD"wF;eR-ʖJFIHЪHa҈ oTf E|<XZ*c1r:$cH["Ejo@?7`ph`Qa@?GȕjlcfhT҂ي�2J: q6k zx9ed:M6!HBW5P^aut3L]�JOWyD"fٝa 蜎;–ga<It㻰K^ݺ;̰(PcI‹H\܃gV.1if$N P6"Q3N@x͑i(Rk:㍎ϭ㋨{h}T;vLEpHqI:1:V͘ɇ3ԏFΙxpB2墾eؼeA6 d<Ēo:\O@Y]!DrGm Iha@hN6 z$-M@D&|-F8_)ˏfhK?TN]p9L6Fy5KdYRq¼h]hqd!KqY|V D=~2z<*S9$SѠ6TMNgUH^̲;GULWѦ^,PnشYO W؅YV>Lcse9v:|(W$;zd36c6R\f1Rt]}-g<BeLBxN@g.<Æ#WdwQQZDz9D".<Ritx)sc9FgC4S2 ,݀#W;ځ,Xf0: >,%e,=NJdF;Ysuw*5Z-H,Ԟ~)'y4Lvsve: 4dG9h-Mih6ꁲ*'+U ʺ�%g` fˌmd Eyy\}==-9GG[oVTuPd3|1;y6cz9V.ݴ73,]Tn eUGY@鮞eH$Cn>Y;l"tZ&K>4�2@=AUy|z@r=#f-"shESeyQ:ݗsys&p PIXLZkgaWi 9twpF愤?4Yí ԋMFhjQPa�;fd"'7/^X- )@!\cgիYqVh|ΚA38u@k>Ŏ`(.uIs!h39 |E<Jw,E"HT;çl GEːS /K%Ο`z4$?{^ -iz̥]Q66 "S8J%ƬòذycQ>p8fYi<pFh[ sj\ƷCLC:�0*cR$l1siH.fJ)nXsS>zL[8ͷ-=}8Ѣopx;ϩh 7~WѷvPV<Jw,E"HTVؠj7w&m˻E 4 _  }MU2f2rAޫ|WYr 6+p{CCxLA?.]e;`A*PmE矰4#x:ތk{ "nxX̀h*گPFQ)�9> ryX(u.;[~o~ʼn=rx<Ҕe\ %-jxl}MZPVUA.'A=(D"׿^DegnND3rOBK-mۇ] C s]o}`71mQXaWTD3غ&&nŬxYُiK7bC8Y8v v+L3FgYt8nX;8{^Ǟ]o"'LswX/i2$YGBϭQh$,A, L-Ce籀g[5~.<\<9 =8Ills}yw4zɳ+ ]Hv/FҼ<ΊSҙc!مzu"H$*c }� "4U0Ԛ%-YRji72ms3l+9g"݁`ȓr%?͏`Q:$ZçNap�;=۱x\Ae1Ş#w`e9LYxFݝ /:4PC~Lސ^j{ehbB=P P6Pyy#)%2z@:uQd k8%=;]<6j.+/o=8ÎV<D1B.k(uvvy\ʜ-F.޹goճsD"Z;t92chfu,3[wD:"Ru85C6 <~ б:#Ho;={xҳx=:]'ϝ0!i;}GRyXwosT}蔧w- ҁ�K7wa"N Z(`2襮Q'tYTY P PPz]{"ˑ+?T"H$.Ct%~ 26^Ve).Bd#D)I_=x6!6o q] \)I`>ЁysRēϜGަxЦSGs/111R%c,}UƽS"( cqK|읈qhHRW_}gD"uL}r6 -LՀGcs= cmrzCl%-NOmm˅Olf3gq[.>ɉ; <ہ+W/bM~GϜBr^<{9t蛏({Q@u}H#|i@*/ 1Y/ZO6^B6$~B>G.@izܽG~D"Ht� _{fil@K[iuʁaRٍͩ3k$% :�,c2 E.GYΆù'&%<Y); 1<V{1f6?Fz!P=Owch[mJF.C_̷MK?<iKpE.z(4LzezvK^h@9u[$D (3><7Y均1y!LRLCE]9ȷWֻGp1J;zl>}rayt5 6R@<zO\OA> Xl߇Y;qش(8wv0IJ ScgQx'=_:|a"h?,ݰN2Zg|Lvy7bwlnM0&)ȑ#:8_|Q': PbM~Rsf#3=vmOڭ\` }z6Se\ ˛"Ӎc\e<-wF$#0<UP3yoLb8),ۋ=Na'0pZ\3g L\ })7S+.l˛c##rtmq:X'j6fX[_X;|hikF poIpqr4H(@(_{5<HVaucoFL8_y8]C :(q$Ӹy:Wr<VUY8X;%qĺu59ԙt\kPQ]-ZHcpy ,9|]�,Oڧ.eimYY< '9%Uqnݍk:&⾞90-bUmWM9'-Ws< <#yW hÔSش8= (_@q<u<W-ĩS ZE&2Í?RbԀcnn]9|xc{[#sq\u]&8>O6Zٵ\:nqlߡ9ݠv #ζzy+S<VU>clߵ VO?N%G<v^9vug!i1g.YtNv:Oڧuiy<W]zGtO Wbc !+ sÒ)b<yv@k_t>r;v~ k>5iSzdj?|vǡOaQ~[ P TXF8 eVQy(u0snc& K][Hi|'^hm7JQ{ptZdN3r3c%c*صm<ViK:<9m@6-'1iΚq,ieԲRr;:k3B4g bymjiow鴖 :LT02ƈE? Z\zdd[^aEi_~UE+\:'uy>( ?kΖ`EDj`ϋ$ cnںeلnd!#Fjwz(P.C}IoJ(;dm4W; R@RGAUhelt蓇aǁX8[`~.Mpw ҃Yr2r:T X9F<;iAfxz3 {<wB>n霃4OPr6? &tE2䶒S4 ,1%A&efyE%{:yFO˶n->γ2-iYJq*neo-!TT{;/\Lѣz[{nѲD{]cim ЙBs51g^Hxr_ ә-Tf)Փ ێlbsuFw^�e:sF p7�:u!(8/ ڍ[xβޑ K#u;t گ(JNkÕ IQy<AaiE9wǣr0BV;zOلO R madz?'NAk�ð~ZV [2nm)1a8SfQYh@FjC3(E&4_PO<<yJ/Re\-|)0w-/Ar,';fE%ϗieL|#Jq GCi|r͹lZ$]Շ5%aôAɶ{r4d{99>c( ,&;[9UgyHxr_ i]uS@I맻_`ٮJ+`K.yT)YCUf͛e/{}W Pwltf+̒ K1,48{F`ভ D9 2(L]Y@uO o!8yG°u-"(8`4(ҮQ[D "-<[taŮ⋺Cӕ<s LԏARw/@)]/鳍UBnktQ/7;m^U* J*ROwJvol�8/7A.RL3拷<ʣOTBܝ^]Zzɴއ/F[q O]-BJ֑A\Ё M WE'jO!-&5FS(9p7f⤢]bϤT%˦5.IsJOs#ୀ{d Y9w:ZX;_Ax#@2(.iz< 0`:҄!|)u3Y茭8p80ފAfnlBdE ]A"0n s872@խy,& K#s(E # Y3}Ec>J{TZqӯPzR2Ax.Y~e,%-|VhQBY])T>,/<?}e"Ҷ3�Y`̀4jEoya\'uyshaFn誶PgDg~;5sgA+[U/Gp6pM)PŨ�u6l]ᯀ}!45e坭æR8Pc,e@LlNj8Т8PI%AO}qX}Öa&mΎ ,:4 iX&9&Sd7 QvȜ˻p߈td . PtKs>4]RT@`}^~8 49w^am֊Գ'Iٴ0/YfmQ&sUd cGGT8U}a*r<3ER7 ̞JmJI*{}:'}]6Q:p;�J:q yRomJn+m %d~톍փ׆`vrZuV̅g1tJy L4<؛6S\-c򌹼Pnmk*I˟ r Ty -JNw8g>zwN>ОGT`^\.B4"`Z@-OwsE]=MdzG9 bqh%9@RT@茷h8ün^hJw1 yt&MO?S+r,o=^Yv8e /jO]Z_J*eCg򎡤gIO"S4KeWUOkw(/Tx.Kއܽ'RR]�eKO]w3< UsQֽIxr_W T'E>m_= μ>Qͱy;v�ZEL+ZrZ(Y(/4 dUt( ln~]aFW2SX8϶@yOvpe%l;ugiH @:NB$Lbxufjx|=0piLֽlv=dܒ$�# PdFx ^+J[TJ6Mƽ h6-9 $-7x:5Xq"lc-%R;XuH z?^mH;;c'/ 5!P( ʠWM\u<SFz19Vu.-z#:ħehy X P(E"JHTe]w N5l.Y O7bXvDPYsNXE RLj4`�@(>g%Řy;Npa\I¨/nB ekxJASC['RK$aY\IUhqyhz)�ޜIxy(E"JHTu@ytMmÙd`+K:k13 CZ% =Ìf7x^HC&b|y|vu`N~Seh%- v5v# ;IlcUZr^Ѽj -brշ|jKCL4 _u ʌ;86�H$Du(5P`&- DTuLB@FIm]Ԏ6g!i:Ms|99LJO=߷Q_1?cIZ nd7ZUT0 gсs5|9vKA$Yfj9ZP/."g9[D&<P2nӌżߺtba ^ s>e^:0%6ָx:UYuԕoJH$a ݃e.h5^:܎oX_22]`V6,9:`'C{V3쐏,i@J%T~i8>,_Ka~2W%^vm 3l5` 5L*y-vrNc٬S>Ql6wBi+ݻ㢚� ={#DΌyhMV5~9w׮}O?L <c˼l{Z\޻3圶 "H$YC࣠n9hc[;.H)JV7_mQYX0>DM{R!wE|Ǻ]/aJ㘟uY/fE]nGg<-< &/>s$2=OcY=n5 gOO ;_Af.9PsπUOJ¤P2L f=abe1.ChC4@, 3ƀInD" ^l3w-AZ+6W%[;27g76h*&ҟSH^}yg0{zy.b^)Ypv3VôE؆Ǫ]qGl6:܌eg{Q@2^{X<&,xKNa͎bR d}&Fpxrf"H{=G/m\u-h1� (:ǵϜ dCzyԩ9nK8$h~RR$D7+P63y[ 9[mChFʅ/R#RW4Cq죂6Q+")Ópgd Z[Sq%w+p{JHTqW mC>*?WQ3<wtzGMoۈ4UVGy+\Ic9 =Ӓ n4ցFqv4k|ϭ}/&we rH2+E+sa.;Z@YP)@)Dv #6txp,F1r4LApγxEQ,qad0̉#1.b"E>icWeklL∑>3"ce?Y//SyEL|,$$D,@@1{vj!Y|B1~hnDιg ʨNorXT4ۢd= &{R JS)3C(E"H$F陥`l a%bW! :ѹ:E:SZ`|e#HZw;-Q m,Y=*m1l%Z+Ȼ=d%n KFj=$Y*]ե*uXJKCmø*Woo,*mIkdpwH3t9Ju,t44M2߹(mڹm׵ۯ恮kc(B)D"Qec5wB bru6?:_äLK� (C*u< yQyhi9#NGZS1A:&)5փ@Rp:4'f)Pi:_+ MVIZ$Mg!1f(%[h#ˈ f·Q'uys^ҷyG/sټuz*67tipkZ1׮]H$ݔ@2> n/lC@hK_B/oeLj諭F<HƊRg 7) |d9گ@�RAIU@ԁ8;$! KRn: (YNWl4LCt4LJG>P;tSNrZ,.Y躹y\֒ys2TNn^q(#eMyyD"Hte+8c U I;6>q csW78U2PA(Z,cHǪԖJC {KYK2b̢\8cto=1S ʕß0a^ Iy\]AdҀ >h hb?[6|Va6lЛWr~rsVj*H$D7+P QJD=L<uJ WS`X"mXDOov3cBzeӮS)ӭvm R2Ҙ;HOhG+{t [Z'-SJT$#r-Si*O�-B$Qe(r%#̖= cOAˇgp`>@}]-[qi9A껻kbH$nVm7 hWAa4͕Oj9&,k qyKG'@oc*lF7Ԁ\=v+K;p2Ӂ@N VaIӞOE`ceZ~j=J e=3/VoƑɨ~þ) ^3j~EBei!b mݱSnLH$DוWpצ[6|'q hs-Z+'9'7=.p:xs<@j%-VT�/McFB%(mÂI1, 7o]ޡ)V T@1ɇßˎIdX/I,NKt4LECk ED37= ͢ X@Yُ??ܘ"H$+tۻ;9 b2ܒ/q^a Yl) 0#=^a)*O^ K/ܮ3<MCvS8ZKpPĠZt Li1e2Iã;RKJfU> %{i;<-b8l9.F=28/ ӴQ�H$D"*׺CoEFMG}hq|`g) y=4 -TOES|TU^?-nh?]<u K*d.Cf+y "+3L (߃cT~`�s,z`qh7A&"򆏅_<�.B9w�H$D"Qeug@X|cs6ʁ3aw*{{v#>yg_^xp:^CAka: ^0t#>xBAAk2\m ٠"lz Tcwk.!bPB8:PA^h#tUqO׎]ign&^6<}�H$D"QU(P>1+hƗ30$CƝc'v|8o1bT׷o1õJAЍ)*=Gmv4Ru~,q&N+  ;Kav hROhİL7BĽѩרRCR$D"ꫯ{(`E~΁JqkhEInhv{OCwA6qm=h5mҺi^h4momLm~G/x7HƷwG=A50Z#UoWefmzm]oK@cf:ip<M;گiP šIk~gO<<- {{"hPn{Іۇ#{?|YR$D"YR'Bs9JD"H$U(E"H$D"H$D"JH$D"�H$D"^$ڳgH$D�H$*QC>rGPD"Jy1GȽ @)( W#�H$|"#�H$|^�e)zqabݐK/ \sPy Pظe|n{.n^;[1KGDբw_8{[s<{~:(kim;wc_�C'jXU|P֥kyvٷjVwO?D"?Zӟ'}{j<oD eu@{zMg8wh0/Te-r(<P%Æ_"UxjK-sPYJh~W_|*tϞ8|>s\SeYUֆU1̊YWe+&b%+(DI"9  &2s&,Pݙjk&yݕo=آcl|"v:5Lt孴R?-۶!4<K*46o:"V?w, '7VF+:68ܹk|;vL'-%fsXm^̀Y_|)dV(3 aصkz 믿V7ͯʍJ9!Ӹ";8zß~ V<V(,y;%-]կb{֭ra(PZ6R aXLM3IYCr}3wk@)#v"~S3ʺ>.g}PzJ0ik3f|nVʱy*^ɸunoa] ݷG4 P S  ,4PrMm^7CԴ+G Ƙpn( PևfwO^]A4JgѓXRZBWΡRiZ)+&w;9.N8e>=P{Hۿ_RRiɲ._ V{¦:�Qb(Tfvoy=>P.L4$&d<oz%ou@ub3_|h T \\S%j@iZJ};x(_ѣq7Uc=c43 N^~v܉o<2~42S4od(RRP9ƘDgCYV^T58|W}wq'&i uL传P6PZ^쁃U-QJ+=OWW1~L(�7|L6 ƍ˱uVFlվSS5n%dK3J;JNMEm<NwNw.Szy;W;;7vol~t _Q <S쑾&6VfOo~/M#j@i~P;wFDd4:gQJO#4]S+<^CjB{^޵ \&ErؕM&uRث. (lgy\>S24r.PMsmGif&LP'4c֬Y<y2?:s_!!!2e &M`srr0sLMIIQӸM7._XX7~x,]~y60I3ۦ>i]PZ #G)p-O?Sƌ)y\rwa6"Ho[NJQӨ YrHHz+ g�J___TG<N>…ʫI&f͚*㤇E+V}r֭<X״4,[L`nߎ}=zVCpZm弅zt9g IӦ_q HM;\/ r "+" V}ɇ=WN@1111c0Wy橁0{n{JzH84.3g^G.w7JšL?p@U:<m̜m%j=l|~}82y\rwۣ>2:Qʗ$~8U "+" ;ƇscƌqO>Dy0tyy?&]]Mkj Hr=nrלpa>U1;.3z:`ghgw{f@iu;l>Ёrǎ4(zG OϿcrRԅ4zWwXVV-O#�s><&&-Pݻ?CZJWP-LP4J7杗`a&oc*0YSHHBe`` ٣<|'%%J}~^^ʦ갰0ӧc˖-j(c lJ13:%P2Mw ꠙ#N1J+XCaN9s/֭۔)pYce D>s꓿k`I]I]sܾ}HA9uT<Ʀ|2q*sرcUl%5JONNv={{};JlxkنPZ!/7|26pYc,_cX4K@I6;lv 5a5ŭ3Ϣ{w \>="H$jJ)Bd<l]PVBb^I ^wN<.S)@)D"Jb*m䩖quif@ig[e4zwz⭞wN<.S)@)DZJƒ+*>|N (mz&iu]FOD"�X6ֳCթe]_mS$d=/@)&&@)@\yq9Yu5P,nϱmY&6j|0sθqiᡇBlll_L]r%ڵ fY&yp駫ݻwWc Pkd43rz0wwGip@Y[9|I 8PA`3<Өף>H5cAB7|Efٳ'ڶm=PD-ֳ֩e]_mSJ>ЫW*C>E]9M;wq}mٲ%7TRRRpw(UW]KTƚ*;N+el u9ޱc^~eU9⋪3q;/75c>9W^y%!-Z7}݇M6Y/xZ]2#ZכrYg)8r'](3ϴts^YN+d6Dԙ&LPuy]N޽{q뭷::s=ضm[maO8<|ǎFR7?c <j__5:u8Y*""B=yDeCY0JOiVPǬVZ!--M 4}A=lWt?^y:wޭ]~, /`_pfF=ӺY_uͻ}Ů]\7۞5o94iRef&P"!!#ыD5chU= r PV(v)PO?}6fV-^{7;7M7kMw+0w\l5U3tfel,u;4nm:^G.B]ǎga(=U_u pCUI}g-Zh;˖{$bGL68zcSf`ٔ{wqm~rwN4߸>'|N:I㧮R9q׫'o0JOiVR1gcӫ91ny6bجfu$}lӦ]&/[=y.`233@)&&4Lf曕x(7o\eoQ5f\{ND9&颗չuuV꘧s%$? pCY[@nPچ~[WȸJ3&*e4BBBp饗-Oa4oĈU裏wSO9ygϞmݺUŷoܸ۷wCj| z'scJ7wj58ؘq!;**Jř2A o„ *˻-tUꈳ\mlv ٳRv2d=kRax )aJeS^f J111J"oǣ`惌nl䃊1^lRc<^ތ=dǎT`eͩ@`|8cN9b\… 8Tc5kL=yN `0|p<:^'(]-:,W0ۯݺ—6rY,¬n1N=T̡~IfYWE~5bbb"H$((E"H$@)&&&@)Dz�2|X1JH$ P`L3M _;vT4\J Qc#Fߺuk57cUw^`^%a8{f[7{71XmW}}z*z1bcoPS`'�>Ku'W"�:ˬ|˗/W˔^F?RD"Q%G/))bLu]wU1Ns68Hq;Æ Cqw+c9s~ԸGFGgu%K8u_wg_:/oG_8-s+;яO~|~9BjK R=qr, sriA\ЏK~ܕC/ 9_c!)n8u\K.кvZunp�~9@0!/LEơ)\1 3Wp^'@uW^uYYY/^Rz1SuqX}[|!Xt<wfj}v�H$>S fˡ/N` .)'q)6d5);d5̄.rʚPjNGV +&+w"$@)DA___  z橧.]gy&֯_<E?>^v=_x8B\rp`~M&o)HR$D ( ~L8Iw˭xy*8ST3"aoƩ>_ο B5;R*#(E"H�@ddd$Z^zN\s9j>.R5*Ygg7Gڙ5{;)@) PD"n-[T)Oɞlci֬Y[T v`ڱ@㏪ЛP17~"j'<BYYF뮻NpM�'\ ?? rqةܞ6m]ܝ�ݵo6mgzG.J3104{wGuM}||_uwM+۩r{u饗^SC PjZyf+~r3СCC>R{>N8PP? 39/& Sva@JD�Y%o@Y_Եo&9 > ��|Iub7GϞ=Ѷm[[ה/˨GyemCT:k.L8Q=9ܗ�!ypvdP|#FPc28 $PJ=fғ805ǜ JW'n֬YX& q0nq]c+—-[ǫa)S]rn;<n8> QMAرcq/V˻ڇsNxx*nד\mݾ]]#P 0Ɨx*?ު=dvs](kWl9aBxזqL69xاr>cэ%I $;PV=?kD264jҤI*K׎;/zzȡŘH9/ϟ2es5;6nan_~zYע_gdBW_#0EZ_.>csGN3X٬oll@v~2##7ts57bF 86o+Vlf=;7o/s' 3;<ٜC*VVZ.?;wExh<gڞ}F<!OBs ܹ^5k֨:a7|8/ά;۶mRG29ŎƁaA0!}q}fe�:uRk]l總agӽ]eM (=Y#P޽[\#R ^g۷Oݣ8ƭ8_c4~Vٱqccrz-Y__|_(.&muIC8Nuf,3Svv*)w;%PrH$]I6cuRp>mڵi̢÷L^h1=]+Oy=ml:TJ4Vo!hCQn߮-}r P8E;qm5m׮zĨlKk-[9kyq}Ӏ2(]Lʗںt9̀q1%|>xwNZL*ރnUٵ5;6nU1עSAAj֟E3s :P|O.,l <HFB"gӟ;7]zc`8+vuc)OPϪgr,ޠlPz*a\;wg]Pit7P2IT^Bw/VϜI6x=wvuqdqSY~z*uY LffW )H; .yo\iz3=)f,؜e([3tfel /=Il7& :;wȴ[͎굨fl(Xߛy(pc %p1q 1~[0cet4nJwZ&cxJc3$D`=uჍ0M"&L}q<jFZJ2A}yY]]c][_qd~l>ݝ5?Sz %1:Uzʗ=~[H`x(=2P};]z<ۉ(rFZ 213tVϟ4^;~4;6W7ע_vb(J(7lAS}n_W"h2P ^I(Y Pľuy1iOqISOUo3LNq;~7|fV*J|yf _؄n\qܻE$aUyZF8L [?+@icn4fjfZt➕l93k{(^8OPÀjXa'Ct'7nt,L9"�~=&M}BAƦ@#٣͉ {q˛a3}/@+88Xy!d5;OYfz/dƑtfel,ul8F )EؙYJ7ٻ[%ښkQ8_p8t8 [ٺHc_N(PқHaIRm�b|PD"H$UԻؔ %PtCn>Qa7fT0�H$PF�)N;Q@y":g6_R3{Ŋ^=$ۥwTO/|ΝU=m{�H$ P-k߿9=uZcJo=ٹAoc<GnݼK` r0{sq{*D"�T) fފ cRPiVֵ!ˬ7!ϟTkj(_}U3 p!JJ1OT]!@)D|pv#PD8{q\Jd3469{j ({4uG_ͮ{Q,՚s�JKP XI)-P>ê$˲{(E"H䀒C p0\c:m۶ q;Fp45k,4v[M%USkg?\vj2xWWJ5t[?4zFٗnD>nApR[uCU[R$DNPɎ<U|@~ǥRwqp�Wc ڌs4uG+6Y<+<د)=JwR[4�Goq6m(E"H$@ &y-_m2Aʹ.j8?6赳-PR5uٺve f]w4U em@%KʾRsJtw(E"H$1#?G͓9"Id3:!Dyu:l];ї'_\h3+\5NA{yÑ}zoR,m3̃=c7W[ͥn| PD")v]wXD]1m+ԛLc 'k (2uٺvc\6zdǎ~JfVqJzXj(RmpI^ #at:";#H$jT@ænA5b`嘫PбcG׉͊]vU=OPǃP�7=~;R٩w=1f9Dqn W9Q{ld+l1uX+@ FE#{{#$$D5{9pY"�qH|7* BEmCtbMi-wgvU7ި,\p˘>1\Q&Zpf;"�[JBl]#X/T9B`3�:'{^OqM2Es{Ί ЁvB{G/hE ׬冟>|[!,XKc7;FT[R$V|HO4Iu =1U/UM (�s6<OѣQԳgOL6uuw]:|`z3m%crw9fR7s>ߴ[nEQY@ټysY"�=wY<=tsb;PQreu84:)U祶yX<uս TS(wuߣ#/.st>P13P7ݫ΂02;1P"�bz +.Pv0$ph*JDvϋ]ȹ9q;պukբ`ڻɘ[tJT3=|p)F%o8ᲦIcH$*ہ5U$�j;P:y1nʵgșqh=|9Zq⡬S'tS5 ()PC4H$@iE;wV#N믪O>c(̫ϯr%N vϋqV=!w/1<'LPeYQof=QwMD"UՍ<cM<"�UVj|17k(21kfI�ܙ*T*{yUzN}z ߅�UH$@)DVDԴ%@) P PD"J�H$D"JH$@)D"JH$@)D"JH$@)D"�H$D"�H$D"QJڦMlcdrD"H$@ٯ__\y0~#3}ò2jQ̈>+uhiQ-)2R#}S)}̤K BR|dm DG./A D"H$Kgkڸ*PɌ*h4m2? 髑ʹF#A>Ypj@}qt˝Pr26EQdO9lz \RD Y2\kK l^3`0+cM(+-'3ٚt \&';33_m~FA:aC"g㋍O$gR :l__v~_%/ᷝȦ=R9E"�=ö\֭C vjαԵ6[_aW||<{1K.Aqub.]SGP}ش8fhPIt@;KXd)͌5dVx"+]œ(CI?2c-ߏNS6? ?G6_lz^ki7/aWQ 2םkyfw#;y-T7 DrBl.AͥvD+WΘUuz' ={D۶mݺu믿?\k___@ۻUl.j�2+}u%(F"/s4 `2Y]2,vӦbG+{ ?m^44oq [o¢wȖ5IA7[>o`D*s7{qlۍ؞~O|uVؿoyD"JqWb^^zU?>�]t2~4] z<?u*7nZlx7?8槤;Pމ K.u鉨rڇqRƦV̙3qoqե;v_V9/&tQu}]1矯>@oM;m4X\=%ˍw`s+=}j0{zm*: }0^|^} |8 qE̳5W[Rogı)dvyӟw^O˟ï\(|G6=5j}(ʘ}Q9Ruٿ�ZouD7K/To /1cP3M~ڴi^yr޽{q뭷?TlV>4rH<O1,?RW9СCg̘\�ܩS' 01M\ <8xjf@8T9~qaեVZ!-- ?#[=zd#<CnMgyϙ3J/pw@K{뮋I<T /6=@qoI//;딇Z<Zv#mݻ>^/vN:$N)ӵo~?`gd|1l(Xl(eHKGVb&Dj*hn?ߞ%y m4S7fQ[lx51?TzHxZ*.ț;)C1oj׮%]Ok[lq޴iZo~wo\nRTǀ>]W\qΝ.Pz:N26zJ+xnϱY]rw}ƣ2uM=.b<r:w;::tPP*oTm懑}v (ĞWCuߡ}&a^tk5;U{3:gߧ -� 碼8%E(.\e"3- !<h"< 2VX~N|PI߮2,dŸ;$g6Y|0446͛7Ou g\=ȓUS.DBBqKO?iq38'|2s?u*8_XzUϽ (=Y96ZY8�kQsQPzzL밵ꫯD0lb„ ⋽J'1D~ Gk#~q-@Mz {'z ;cc {ڴ_/|gDLf#y ?wr.�YV$$Pdj@R1>%=ZYf9nr<){ǯji>a<sݵkZo\6e7:h5koeX}2yrw (tF'9ǘ.8~盛κ{UQK{ꩧ(C7߬LWCy*۷xo1_; ;v>sy>]26vج.q>: )abC!!!KQXXhN ,PPN9Q(mcS(.}G5u)yGy*7ODadDNf$rbܵ(KPHK@fj׳#V!+v96fFcKn,6gǢ8~G+[$r} (meF) P&45yw1vrذa o|˗/W{aL 5 WM̳>~3;v=dKe`oaP̀Gc|p(wPP.rȍeso\ԅ^X%ؕcLtƐb3^-(C:0bĈ*qq}G_@h\ָٳմ[N7nD#y5>Tw",ؙ^|6tfel*@iv̀Ҭ.⣢Ts={Tʆ/>3ٹϸ<׺ͺxpp U1} (Uo�bHFZZ82#tfkF (5MT@Y_a̍a]_Ƀ>3 z4js< N5es &++�@$%z v=||^@mAo6X]&##Cp-pi 3Omq7ҹIoƊh,htsw"l=rc²wcS|g狼?6 P6-oz]~76Klb ^ތ=d!۷vz!ś>=|ɚ.x;lr!u}9zq/\ӬM(αPեkתk<~2x9+,,Lum=|c+'Ct' - #*3Ϩn5he9q(ȭAz␓!|D}+a0+H]^Brbh0YTHO'Ƕ\ mT6o Jܿv< 'ųg T4: ;p<8Nc~šcrt{7h̀:[i|H*h,|<P)\I<"H$j,2ʽ+!(u#L!#muRJ&uLU@X}"'- q+ᏅǸw; -h1#7E1AEYkP\b)Xb'ә[3I42I3-hʹ&R;HҁP7vS=9Ҋy[~Wb %ĝ)Ƥb(\NNJH$5)Tr*=FKOP9#ՀPe;&4 Sʢ^R/E#>@ԑ؞-IQ[Yk+Y1j@AdDP*ӾV/oz;++Kuphd\ 뵳 uu.qPYI|a(9tѣG;b(e{J/z4Eym6b/YCN<&61 PD"i�ezP /jd]TdQA2 *`ҊP>H#hP̌f 4 |Qlm{Q<vѾޕI£Jvad*N^l׿bf MvlfuXuc/izػ.P2VwdpޜG+7J\$^f1&fl;9Ci>ŎPx,<&,@)DP@Y $c*ztgUpddAWwaAEdIqfI@|z`0GgDM(\q iN WL;" CY ^eMʐ#V%a)kL&O)ӊX$SH$ P^1jGw@]a*('(uԦsYQEH uK4v򣗠$;Zʵ=nje:Lfr 7'6%{^Ӌǎ*/@)Di0RC4ta37/e<JKұqcq@gV݊vڢ@4^u8cVe8/<z#RC5 s�KB:(tPB*4ʌ7MMMu!&&&&&fLrΌ{2PA*~2wksk Rb1~{8S𷿝<Mw/d&Ǝ ؘiX>3&yA>D^zD7*mPh  (lC.uH$@)&&&&&@~ej&P雖N2oJ, rbPSᚖWkE-.T?3[oH?ώBZ,Oc7dR׮DzBLeEPn!53CUp{2Ȑ~e]sCoyik@S*[N{cȠ(ǐA9H\At@N/bȉ ʅ3q-*K.F̲X< V9H[Us퇬U(ʉEiA<zH4vNR^z0&ڄ$+~N4qH8Ѷm[9rD@TRLLLL6dgEk Y1GeeLT(P@"DȈ\3`[Jz*O;F~e`}j'bռX9m"}& fd&jP!LVʔj�SPZ+AɁo��<5{_~z+u)eGswJ828yZEw~v,2bW./Y#0c[=�_ҢvI[#/9 b)?%X< ~Sa>3@n(DQZds,̤@R~r<CoF/ ?9P1W3W_}54=Ze]݋˖-{ Bf@9vX5n_Pׯ=ܣx2'5ն<ەB q%ItuL<2E!?Vc[0]߹s'yuY*wA&}cJW`L̡F mβܔϏC~Xvjb׵?=M߽5z]Z}zNn_ '65ev/7i~CgW۲䝓S饌V\jcPx\3o>L]=<%� 6ӠǙ[n%/JX$FӀ2-z)6mQClS+س;Yx!v:43on&6{l3oёy*ˏ?Xky3 SR̰l.?$Tr;yu)P0`@Ԑ)!!A.;n߮Xz衇秮S)jժ}cJ]{ hX?9UoX*%^6xmpفcX]Đ(h8Mv养D۽ٖ܁8f>cUVBdjbjV&̥T 哵.AV7#`O9aއ=vtEcIhX16f|^x5846J2ss.$$#a`2K3DlbH 2l)Go>PJf Pr]:CϤ38ǎ;n]“1tPPd[7jԨ<®<>@mq=#mEQQQ-c4~zXgxIr*PR|p `|m@شz>m>֔o9MN_TYzy_~?-'wW̩6Z2T9̠qZ)cckh~C}{>^]c+4jRӃn*גWs_z#Y=tn|\e۟ &+@Idro*zWk^ש+tP {U= ~F>X4'뎌6qm!j4L>_<s-8YhPVʰ &Dvm3%*WxVf$RB:Tj(&M6n!xDBYLLc>=~<wUS\\쀺ڌCɼՄ^zQ16tiD+))_2c;Vk*3Ĺo@뇟oΗU!ބwu3g,q^:luu̎; oʫ 1tYG= 8Tlo\i(?xLE}|6[M;E{[ʚ(Pz:N26FJ/ЈOk$lz |NKX>*wE:^-hpW(&go7ފ1ڭl:11{B9P؁ui`:$' im�V*KѠYkCcawh�vy ߱1wH=5?y |\sN:$,7,=sG3O? ¼8䱃PZbL: Z<v]l:ziDz;c;Ȕ{7*=uUl!S?M0^ޞM,OTROd"C3s?z�ZL>gݱ:_{3(w78~3&||@=̢ʾ #(1δd_70jߟo\Qpw^Gâ)Hɻ&a9Ӭ-P{w_|轤7Ҹn{m5!S)//|z+\{+ Χv›houL=ή ʶ,y(ܭ2+iHJX?b]H�3fąDJ9 FQ1KA^F2ރ6#v8䬘lƼnj@cpw8EI?=Ҁ򝷻@\q(/͵O}LJ,SP'(75ԍ]Yє?㣨C=@ٜi~BٟzjTL PVf8ؘ$f a9Vö6c=97ޛJ;ޓ}h?5:ͽ//l!-sܷMCYvFꀓJ5˔%Grk09OKźa_peH Îon'!-`6,CY|}nB3O? ?-ؐ ߱]gC>QgA$RGY "4y{klۺ7p_u1ϾrqJ+=V> n92{ݺWi(yg$~wE~ nx꘧{ys_4w 2#j&!y]PE-U^�$EDfb<`^V\`維8|�g(JZCPj&r&axqzfxdh'lԠt{K)a*25S99BpNJH:XGՃbzjKƈ1& 8/*gF1VZCI+wg[cܯX^jU}jQ61qY|p ݸ4+ccJ5{{U38tu]�es <ٵ7Ju5n` {v{ǩ[P̶|<fҽxs0"c(MrM+IA^`qK<l]_-e@B?}P=7 o* #w@%㔓NF[/ǂ!;{2WaWvJW!n0qå7!yR‘fɡڱ::L:`uvcFE2lPM\mCW mw~lt˛Xi<6cuyɚ<Mz)B쩫^*{:N26f一,o35CWPoQwwf ̎4u/)+W$̍fk@i^/mvWܛmYJ`$ DBjꎍlE9H[l)+Ӏ/Af nhdNGܬ![폼D8iRRT:-[4mtDWlI5ؑ_/sb׬@j@@dh@(+<=\ЀR`S l.&&Va|Qp:r.j4SJz(5T@:$PF-G bJD,@<{Bf~젙H]6AS4#mŦBز6oFNJ"fޏ ap(7$b{n8,Gt}N5uHBXBԐEo6gTffCeٓyPn P5Vc]ƹ9ӱ3EܬR+fDh@zt'j K4\1oQ F#mt-zb`:(@y/ډM$̝8 KFûiݱ;'{)C_L7å^ yJ]t n3Be:F6+TpPr(�4ftիWp>@qIݻ7;<5ԩ ͔-[Ti|M5>q *vc\A2q"!egΜ:bI�X0rx"6aءJLFrߞM &H: &V(g_7f } o z뿘үꃩNJĶuzlR-닐�`·P9%V gBMDR "B0/@kpNerԁYwl%"[g8{۶)G'x|G}Tl*Hf}q3f;_N:8VeDD{׵}X\xXfGY?Ç P Pr&d$*o`Z|c+I%! Og[/>AgZ;RGz\$5Ӑ;l=;}CJs34 ‚8J8i!7cbO! 7*f25>;T'T4sңTZFN^5kN3<5\-[8~oڴI Эߝg۷;~+Pc<x1kg?\v*LQQiY+Rub {vn둩'f,W@Id,Nªh0<r= P0E$e6ea߮mXP̘xdDbhg77d&`^1 @iq s*:h0Xpk,7+Y^errjr;p`)~rwN4߸>07byR 8UZBv 7!qذab(utϮHRLLLLL�H]?b*q2,~5h ?ݻ'r@s}ĿJe(M8l)XG8QXb*RbkFOǾ-9(Zi^]y9khVj$UiՀ2OʂePfFᐗ@I|t@rUֿo>ɴV׵.˦뮻Ny*ҊR԰R$D"od(�%-{`ll63Ʀ`}c wyu뇍w?!o/5ܐ (ZHdLJ!?9)X0'cGԠi:%RcPf%!;5BbԽF;\ 4oĈUb {1|GUb z)CIӶnݪ:0w_unGduG_1ω':1eVnJJH$ PP@C~s<u &B})c:y%s8f<(f=,A3!rxD-œ8o<MB-F;=SN>͚> e] cԱjL9YɡI ׀ru2/#~VM}uvwcS0;Ӱg8{Vhe/oH2NmVCLpp<6'=--vc\>SٱcǪV((E"H$@(wP&(#`E _9X4SYX:qK6dCgacv V/_g0sܱtj>a;`*{=N<y{#nD$m7݀38#\eH] d& 75( BaVl_Y$>=W G$D"Qe+I1+PGT�e<@rTOFxtD̯Hɨf8gF!1d Fy�jKLAia& CЯˋ]c1yy1Xhn|л+h2qv"m?2Wacl##f/ 3 98|p�H$@%1Q}oR?Eց2;IKP.@TLDOAxjrV%-LjPc8|fÐ%0)a>3dN{nliCc܎0) Ѐ5xHӀ2r"/yi4 ƖI SMmC) P6m_^?uY*vy=uf9Dq]oYj85>l//h{,o||: ȑ#^Mr Y2h]TEwlg!<p*B|'`ղ1BWNYkx<ؔme\1{Ye%1-/:8;n_y.j AdDj�I1H[M9qwƜ1ؒ;ɫC63DMW;vPcD�L*ozHԭV!j>�Gb뮻(m>EWρ={m۶^=% KUgѾUb(c+c(#!tDAKG!Xˉ?if4SƫpHU7 n %N>--/ETw8Lm;g#o.@|RĮ̑(HsS d&"3in.A% P7I_T}N.jm <b1�sl|U\7wC\h7Sy{=O1ylVA/*9眃_|_~AC+TMx3ooK @B pAE:䄯5� ,yUCSNՌx*? wp%Z]s1jq8Tڌy2NҖ!Tzw7éj/<(BWNR@Y�s<{2ʲ&8c:24d|s+W$ P&f>to$ԭV=5Q3N�VαUsiV߬z(njx졜4i|AuUVjt~-=z4)%=ӦMsY^OH0=WE@ԃW_}ƒUx&U]\ci7]y+j@9ZO>Oi`'+X<Y}2[nL.RwV*<t4dzTl!M[zzGTXZDE*Fm(_[>H$@i&އǃ֭-HsV@Y0ꤘm @i[=_9f*Pr9]ǎSڼ^D2պ_~yʂMϰ򖕕T^^}#PRe^uGU)TEhG\;^y& >w)O)|*Yf͚e4Ǽ ;E[٩Nnխ7 | (8L Q 2>f%Ə/ H$"6|<'\pmHϩ[�euaI1X[=_9f*Pzfzץ6mX{Ūu:rM([nvʛ`233)PRʥ̷7fz0LDv&5kVW)Uk|S,W6oR64;VWuΥY}s:dv،nxZ~W_O4n/Wۅպ/ZJH$@š0:vXi}W[]Tr0tαy׸~uR6&4ι4orÙtPr}zr=uTT)ݳgcܦAc}qM/;;v"��eϷo6uv+2uUzWyp*W'lSJO:Ҭ9U2JUg/' j[v:KX⾝!Иݹ6{۽/ PD"H$(E"JJH$ PD"JH$ PD"JH$ PD"JH$ PD"JH$j(ٽԟuY~`s#s3H$D"Q=�^n+[ 3^C\~HܡHL\5k3!6}p Bt�IIgBDCA}7zc^ {+B`VA=Vy]0f˺b޲.f-i;b70z+惸Est\aHR$Du L&fC(,QHE5q쏰N[>55A ֦>"6m8bRG 2q`#߅ CcYpw $5 | >oj0 Wh e1ۧf/這̅o`ʼ1ik02FNx8GD"H$#d3i/#wDl_ W`|E6n^LdOEV4E%dNBvldArxMCZ d F#!g6ms1LF`Eoa)rUw,`GݰЯ v0(g,z]1}s4Uf=V9E"�H$(>ld rK~f+qO5[2k6ALF?Ĥ~fkDO|I!Ch|ŽAe/AXC˷LKz)~Tܥ1ǧ#f-~]={gk6e9f+h޼\eHAH'6d(ˆ!|RJ!h C$F<-o fCl#`h7AS4Ae_&AXB_ZATGSocE-}!;cEl֠rTW _ÔyaW0i+:u"�s99nu}f9DފB_~EH_8 ~3Ϩ[FDDD3WV8s?*o%\]?7]8ε5H.P>DbT,O (idr?hPVR"j@.bz?mG»#!e2-ƑvO6!/'1P.рr1uL[\}.xUSՖq⤓Njr(Aٺw}7~*9DC*8q"kAAcZ>}0y:͛7EX`>~ xkՇ{vcJEFFoѣG1f<c5iÐ~6РrR%ÐT<E5\R?{^EOtBl"-." *E; %! B! $CXP&ܒB<̖ٽw{Ι3ɓ=eX*ۓ'J!6pn>@/Xnı:M%[TƋy$mѸ1\8}HMYp0̎yQA:te~V?~|<cex� %Z9otiժ[twE3f)T@YYi߾=>S)S۶mFY0aujFR>(5[C O?/߻w/^xYWTTQPu˺zZƛYΝ;'?ۡ]&ϛgnn.~a?|3///|weL{osfL*7<<\^hذ!._/&QF֓ ,$͎;~\Zj?^@/sɤ8;PfMLg06U@S&d}ⶖG~x"HsDyxl?]cf(>RX yq21kF`X7cKzObX/JL_}Ԩ"iCH8ٹs'^~ ( G߈0Su2<?M& ReugϞ&Meخ];z.УG\xQ&j0O޽_ ɓ4qQ<`*a(M\ov&fI 5zKVC6m$kgKהT[(ioHӗڵK *ӧ*{76Rm#bTPHry sXfMe{2;fIH<:DJ<)H<2Ej/%\&O.1OƖIN}㱁c6q]I~HI΃HM<fpX!/$rvHQ:20CZg־-O4gnZRO>Ho>R郚k4 33|C@~'0w\ B3P }kIc1Sj֬={"11,͒~ԯlP:?ߓ@卭<v@Iݻ%NЫWi)**oSYM^x>$hB(jS4iٲ%fϞ .TPU0i7МܿެY3͛7… P;#Q;{Kqi'Ϝ9#o5W6~YnF. N2]-(f9#)& ,`r8=Eڣi* iS;Mg%LL,vљ÷%OL84Ii?RC=!&}j(\#DCh�0 ̋9K>%b.E2|V%YDD܏j~B ۄkᗏ},JԤᅦ5B_)8H}/hv!\r 's0>/$�bIh}ᇲ_e\?X['~ck=P@yc ִ)4Rˢ}p>]<S7˗>̥&YYYRҠAT(+s@ix _𒝝a7XOx^Zڸμey{k�2vُ~[a%Ϩ5Q~VM]V8sm" 3 <R䊔"7$,g )g:DM ' Nؓ,+ytPL_˩ؖ")Hii8TS|N؅p$mwDll.r^K9?n0-* $T_:rN@* B6U~]r/:cX> 73Զq[*ѴwO=T)57%qD}UX}4 ě7o.h PZ/q/mI?XS'May (o<lrrrRLڋ2J ^&MxAvGj}mW^%嶓6{=i]_۷/f͚e0w}Ϊ=K-\"**LVCX{,m_E@cn2% L) HʥrJSDN 7{KrJj.w I<\)HɞHLu ƅl.}#&C<a$nHQ*cRKI; EZyKY Pc mMN'zn:Zpc)P:tHpK}C#Mc5ѲhB͚|15gX/"CQA95u*)"@%SQ%e...^kB4ЇO:hsBI5)/{hy1>3WU;wF+ ]hFipГi͚5>?L%DJwQs[s+U=ANֲo>4ShI򡴤U4Yj$ L-bO t@邃 )$r_AK2g2Yj+ex!vCk r!=7 IY8=b=39r=E$,aR.P9LPb0/(),b)r`]:ت;tP?zLR4ZSY %^CmSTc)A;~a?,>BmFF|}}~(-kҔX %V@yc ѥ:tLh#dnh>o~^nl7|>u8`a2h[n^(ֶZ+Fqk. \o:\jۼ9~#[ۗ@uY3w-}Li*ڞ}87X=o\n{9=hZ57 kǬjPNb7'Pz�ʔ$ <L̞.5LȜ.C q31d}DE'7 (s`Qӱ.֤it9^ݓj,*2an1TQk2C]Z!P`jb%PPK9&l'oNoO/'k45@I3v5@jPeY+ш K,PY|KU%`MgWWK6V@D%慡4%#f~)3L#ҊݥH�ʙ8;IC�Ѓ3rdȠ+^c p$? Y؟]4wuF<G|'M椉*9@gHn$N;`ŶX&rj)? \=V|(` "pl/_jG }*~yB a&O~e3ᗏ%hW˂|W:zSDj jaJp0=ngffZUWK*Ғ~NZ=#\jp+zP*QDI �4h֢( u@A"W.RKy(dN&H&[Ι0ʡ&EóMu>|8c)rh26 ܰo,5a.c}4m)MRrw̺xnraX0(n{jf%U" F ((Qr;wsvHuJΎs'b酴c"U��G y K�y,yn2應<78/ No4lKvFBT xcމXg�XsJ v(,4G jprJj+bʡr;zJP*TD%(Δ>Ɍ^"y#)( \Hoj1i⦩PIH2)gW͸r~KEK/RIM%I_ʃ x>M=*qV*'@9 #jGrEP \b֌R@DJ%J(Qr-vC)/d&PzJ2M� 9!h#Px:'έи% TҎ}qrҋao vg@btl?Bt@Yt6 'ɴvڥR1˶"m봔a�E&\ƬK*TD%J(@ɸ=v27Œ n2%5&#'s> N,CYtz#]Px %<S0OLLG *tx@6웈(lj4qbiXz+Km%^nM η\~T@D%J9P=%a2SdiA2t.2tpn8ZH-�OyabK{}ŹB؛]iY<:S9)*'J-]3+1Xy b6DQ?Fd(,Y7֪ty9ڗ}QTO ~[n۷@100Gjs6<?xgl.RsH ((QDɵ� uWS(y�%G| tCalMOy x %ֽqMI|1\ L7N)rL4}oMŦ(`X(wLKr�ʑ(T(vR�qzA=P&06& 6qH3U΁}3g ԐrJn;#-3�oTTT9P*TD%'H 0-GN=&]Ά8u|5 NFt,(8'N-C ~ß/Gylfrw*ud'ʃ(Mƚ=%T1_8  %P3u@1XjڮM6ܿvK6fO"3h$X ,q BlXF'PjSqvcmcn8~u[Ʃܼ4bF?yoXgPT 6vӧOˏb:ؽe;%ڷo/1/YYY2)ϭE^*TD%7.P :틜3~(~isph. }QT8iEA<ܓs{jP>g/l[q۳?P`O i)r4{3m9IʩX'rV$r(5?J%P@ڑXnd PIx׆[w 믿JSI63~ ]|lw}I\ gaZqmc3gnbbdN{ms@~ҴMOU6? Z~�G-U__]V]:w481JSr?*sPz|սVUr%5ɜ(RC)P{cő$=P)M=-\& E/r_{W ;8${& ;'"N�eшY/DK#}'Gb�*J iؘ0qM8-5}ewy̧?a7L MԆQSH_HSZҲB1m ͙1e.MkP]P IUKoL4&E b Nyu2vA JSb?ϥW (+'gΜ?L\g5/*ʾ4k T%W_ 纙œUt^yINL}8{q%}9Q甕OfVNCyR;篃*T 㸷Lg @Z-h>AH @X䞌‰3q^ˑZ0/R]=S9/T|q9 g.pUu@|n'(GarDb UC9|Y!|垃2`PREƍKTGi¶Mi+'M'j ʰ6,Y~jd+y-NٲeKϗ$۸{ndxdQ9c5#E۟u~ (-[[[モiƌ2ϚgY%n6v(^RBP [vvv&Ʃ^^^b^p!ڴiguZ*~ȑ@/MH/AHEsH ,-ߤ <Od (\,C\t9ݑ㋔p,De)^cq.7#F#`Rj(' (r�ʱ@x(\?Ze@Y_֭[KƲ2e{傕?/�0<??_4<6''G+EG/2ᒠ[]@IA7>>e_޽�tȑr+W>)N]2FӧTh>FCʪ (-j?X_|yP9rd~ㆉ%MeyppU~5SN!C䇪&{ /5j[vQ^=-i~_|YȁZr^ՉZ('N@߾}7|5xLPPT6p1crsܳm=gGݘkkYOeF>CZ; D=~TS +(H D@dQCy};"%DQC#@3ܰ#if3t0de!Hagyb_;vbO`{L\_~܂;3%kvOɈ> &`q8Q" L1ƈ4'/+_Jkߖξ{*y$D uqqqg =zŋeՄ.,OLJ{Z|i 0�'O֗󣕃wϟǰaìPVE;zk;vlI|,>/x |g<sp&-"|yÇ:F{iqf6מ>}ܹsR)l,ikYOeF#Fp(4azԆ0M~Ȓ@32!2NKYplHF`G 厽2!Hơ<OQCY؝](w&pPtIYz NǦv5st@d8Dk@f (!vDJ(HCqݚ_ӻwo J?~EEEmjYy6˖}:hB'Ux… vJS4[(P&j&)Ӆd4SB- 1WSSg\{8Rdm5 cdop-s߾{&jO:p]b5Py DCqWS1y|.HI@ Iy☜`$SCPpE"2u&v! S0NC؜4 8c^'vr(W옄e(l cx 5PBڱ*'(TDEB & }(g-P%\1B?tK3T|IhA(F59 4PVT=͵vPR!bF0,<Al!p=5Un{͵ǚ~4VS粤r#Դ(XZdF6 eId @޹ <̓RC)}(Tk@3B2/r:2{3PcO(r(/`riذkN@ʝSb$,:i$q5F��5cTWJ(H2&f^:PR dx<f?sk˚XUU <dvzZ[(iСRRRZu^co,{=) ersܳ]@ieI?WE# E |(KA!O$_/ LuhAU=iEH/Bz~r ER"9'H�I73u&Ӱtl94C&tƚ=%P8+vLA6 ~,5cJCWIIMC9sL>Z$7=&Մ={,fx<1رcrO_޿֢79w-SGi PResطo_оyfJ:=zYXSg*\[M˒~7m,ES6O/jCɁPU6;?h(OJ~*ӊPP!}' >'vLf/rNsp&d\L?9KY Ia(gbk2cPΐ@4LP=v('J\I@94wf@~(Q@y{ gD #01gTjHhinhKr4џ(o_8{#6hB?;j!ɚ 4 *ƚvh3IixS4 (n75�us9d 1(n>Fj侩rsܳ]@iN&aM?*g $FfFVZyq(S%P괓Y(3NIeaRc8*@Pc~HyɅH)�Z7ةb8,(тY؟HʎDZ^,Rs?= \&utƪ]NXs@eb7Oҍ~-`ZʨUcJCP@DE!b` 7#HY"|_ VR9�()2K(OKL-EAl)E~X�J\#N.ő@ )E18y*_}'�~3|Uvyck lOq@#KAXoVv@)`RHۧ"6~l%"zXD )rXr@~ ((Qr#C0F0% (GG矗ĔT7P(3ϖh(O 'MPQScu@Y-`[,/ 4/ s-ß'W8qrvqC!MC=G#p(=Sc`�V%NEbґ!vD'P \#!j&o aPa?P*Q#9ֵJ!P@IdSAH; %PҴJ?�eQ"{p@; I9b=;XQfg3߿)8smP%cOn80OZ?ջg`[RR™l|w,~|JƝ^'@R%MJ2~(TD%J�Jj(i&Tf @) 3U?;)}%sؼ ;)KƝLE22/r#(3 X4.~=v SܑpU;y`훆"턕2 kwܩ4\<8[xY[i׎iŘ %EPa?P*QD%UG"ԝq�(GJ?rHR ]! q(_dzC̝پ8eF`wvzak$b2L-X+LHtF܎X ð|Mx3qG`,+T~(TD%J�b[;&l$ ʏȼ2<\/<#s}Y^8)őp<JtGa7ظ#K$CQ;)ar'ar*mi,Ma<m&KsU(GW PyP@D%JXP2X@v"G98+MڇR�}9^/ّ؛0±㨧-]~HӰvt{3tB'=P \E� Z?N\4^e(Q@D%Jn�L;N%Lc(\|A7(sPM/roXCzVdxc_/q(5ۏx"!@I3$rNN;\2CL0yNFLf+`Q;Z% ((QD:3 Ƒ"�"*Cvl'À#2Gd Pf#5cv{bwSÑt4ێxHd!3{ջL Lt)%IX?1'"z8,Z3 h^9Z7P_6V% ((QDuJGO<&LP!3?P E�(x2 3}qT�ebvzᰀɃGBMOrSRN%@;K)X 2~b6OD̆ R;hX1h sq ((Q@yӋS%75P{؝)`2Pd  I<\䏤?$1�JI ܟ/r�=^{3}4O$z"H(d<'%PNƃ4yOW&C ҭPq6O@x,\N΋+I( 5J(Q@Y|w4h2aÆr+k_/*Y+ UƱv((3[ɍ'SNr@,g<x\g\o=Pv~ pPPQ� 5Aj(Pf 5;\̚#{LzaWd�e)!rt&] l? k8rŠMjqn%ݽ~g4w09JN΋{4FUQDJsPXezwd^m۶_u%(\i7m$?G<~sSZՃ#]"KLis#W�ѬY؛僌RcI%21[.`qð?9XtHAWl80S^I7[u'5$%9{᪱(/%MscG dP4nRWGTDJs*zO2qqq<06ÊM0Aӄq[G-5,7v> M6d+V{0^Z(n9MWy:P{)!jJ ՗8q}禦7˗M># {{s Aɕ+WPV-Zl߾}s˛Jʘ$T$`I<T(�_9؟Ԝ̙y~ؗ+3Ñ"yБYRC-[6(\&.Z\8]d@'9 '6^,7 \/r9{qx>KЏ'IW_}fel $pgyF?3UvP\\\O/z Mpwwחrik3m嵾[ 0�'O֗E-_ϟǰaìzyTU;Azks}+5ʧO7qD}s='c/1vX >s[r9%/gJG�c$Cރ�k%]|GFF^ed˖-<1 [ʇ>~(ujWi&(Q@i 8|?}ՐJ?pkne,4iҲeK9 l901UOsmҔg\>khs[r9M&f͚:>g`ԩS&]FFIS3YJ(Q@y7|#!&VJOo)ٳGr۴iī^4Hu*7</;S?KM{LPVT=͵Vxћsπ-{ts+j-ڟc>_u*TDJ#2o< ֭[ˤ+,,,,u<;9ќڴBwqAȠvJjzZ[(=^oP4mrixg*5JT֮]ۢA7~P[[[$''+TDJsBs7L92$khv $AU_N={J9&kx|DḌ鉃7ѯ_?}9G2Zfe52ivtF9p&tM\ou4 [jCy̙|( 7o&Nsƞk/t=?K dqƕ:vvvfR (HsK/*2庡 /zIOFy~3">>^_NZ,9�Cv9ҺV|Iq6{7UOsmҔg\$fΜ)}#yp}c.9 \vWgĚ˺uૻ[~1BjM5`(.@j TR6H ((QDIUJTR@R%J(TI%P*QD*J%J(Qr+q5ocQ׶-PJ ((QDɍ�O۽ Gގp:fNΈxs=C?�F E#1d�Mݠxi<?c L(Fԉ}潏CHk;p&3/}Ap|\ pf_ }:/Nw޴G=@J%J(Qr=I%G!|z,<8< G[0Qxs6ģШ(8?cyxpD$Idzpo9.jeQw,<QNxblM Eᑨ;t.E"h79ӂ-=fcl2}qOhB*R%J\/mn gُQNI~<7f!=O {aD&Dn0j.1O ||,<qFp(ی cp)0'>3#OVÃfuvL$^2p#vp(Z<AAJ*)TD% (Gj>7fP|`. {EsQmޙ'p.j'E;sph1z4OĆPyh8t6j5 vYha 8Ǜ/{ GCQٸٸybb7|wX 4 m"v =DJ%J(Qr\<5:.P{Wqb3 =X,E+"_ w__pZ$y55{{HڝPK\>G-w }=v ýbޮM.A\"Ek.^<Q�ܢl/t AeDJ%J(Qr^hh片;;�{~y>Nk e}PG�bu @&ȑ) ;QY%u~`4e:X=\&]K\F�Ł)XA~1I-4x%|ϿsmRSr=꙾ иrtƽ>%N'uEA+>S@4k,6$@Q]B(�Ɲ$@6v @Nr@؈�&,t ECoCN_e8gN̯/v`_ S7=ʯ~SvؕOϿwy,pʼԯ嵪Y7>w.8}�/ C=w(͙\ǘO>]Ysŋ_cǎJ<kyJL߇϶6Z?zpnKؾ朷( $<yu0)R} |ag{lD�_;_4/!Fm$HHl%L,`%THM\"LhMDYcl:NSQ 'wG.g8jzPU@)~>wTebQFᾕy_kU :oϾ-:}C%yỿۅrCjBPޘ/ M68{L\m۶_U*K.7PVW;XwPVŽV@ycJll,,>7y?>;9NG7ԳF;?4r DS[4$֛w۶ ~>m_Hv A3X6Md6+9CL$P6@5 hJcd#%d#ӣBδ ($;%|ӟ2+:Qvk"{ ._xveL*ZOceWlVH۟΂vV+=$rZFcm}枔_KWn @%D_wy>2(6/s[[[1[u)S ..Nm6957L06662qy=z4ׯ/˃K>Ԥ2?|޽xPF <z(TPU0?Ӓ6JcgͳQzoZB5V (?lݦA{74n^Dj-;4;yh/zsRלwFc <m)D feG.ಙ�v0m)�a[vН�FB"p&\N_x]w?]D!찌2rfyyAW}s^kiBH1#Z{`ܪOgIDAVZyѯe^|η<KkK,0PZo�WFCVڼ~\|YW_I5fgћ۵kRtssC=pEv www},OLJ{Z| 0�'O֗7m6l/cذaVkƪT=͵QYoyEeʈ#bn۷aÆU|N"##h[|b l^'{`.`RCְD;٢L;24m/vb[�eKgb} l0ۡ7?\J}o} Ime0Z؇n]0(P)9l^W�%G7f/tA%5G?( |}:s45U+Xr^_kiB1! RYs<-_>C3?|*U+6/??}wiy{-A)!!z?0xG\/[nxO>)5 \tIj4iٲ%fϞ .TZvS4Fꢀ$55U%6ז i8qbh5:z1aQ :-eMesz:L [}BbѢ4<)P(MS?QvxK[ O9x_NXR4&]ѸsE~O`|/N:gZ=iCͱ}睒} �-1SkeʃӔ+ZuIk# :p]PC+M%jRtӫP<J޳Gr郙x5i_\grk֬)A2.5B>}РA<c�eea~L\Pϳߪ^PlI_[T?_y(+nruCz;QP4"iGoL85O78!} ޮ Z<.`X8 %aZ:HlAL"!L&G?=}t?b5Pja(~g $WN10 q"4vWPZrnm-J@#<=e4e5gYV@ym^UCI֭ëP:'sևצ?\&Mywq5k//zZ[(+cyy6^(֌h+O @6%AhlhJ*K4sdA-;xbf VinY>L>D[v @+z\ p Qh/XzwwŽ/ymn5PLj 35%FO%^k%Lܗ8 ˍG_+oR.WAP l 4m+e`Jť?Zn/ZϞ=%5<>""B;vLG~/Ԛ5k/kԨ<Z0%b?iV5<T=͵v�JcX5Fukc2WykS~@^7b@Yhvz~hp=hl+-G^ x|:So;B%<-one+[o|l?TD@V"ѢZ p|'v9d7GI]Cd8"bZ({Pү)# hf^%Os�˔q'nx]e .&V25ܹHզ`(9' m@}PȹU$+oeG.KM%Y66ʻ*5�b_e5eNNNҜ4m4PZRFs!\74'Wl92qFGy>js}YW^-CҌ~}JmּP*:v=RǛ6ުb6e<ke. (%[=J[O3zcO:MdHKҧm Xxa}bϐoZtim0Ƥή-a8ʻ { Ix~ :Hmd QFMJoS&o35�5yb)G%P*QDj3<l^_Q'zluq'Ȏ>L$/}�t 0m$ (m" x8~iuqv @ْA;b_6&Ш'ju3q�{NR@J ((QDʺ(0{DEjPiQ|$H_%˘t.@7'_IM{c2̊ZU.O@ <.-1xW�LvqNeؠf%#̛ K@lHְިaJTR@D%J7PjwF^u:MdelJOzltڄG A Ml#gF#2z=\V`k#)9!N?I V~i&$ nY/N /}f`Il ۺjuvE~UJ*)TD%(<7D@ xu:zI 8z(sx{.L� ;ރGj+>DTzxYh&x^)1^+7bZb\>`ޏnW.ų=#p9H�Zo4t0Z]=ѸyS%vJ%J(Qr�eփ SPS r799aGoވ(vhz$;(K7lkxdCy/DXx[5[!vftyo Gd<s\c&rd7gi#ಡ/ju ƽ=+(gXb|eU%T5 k2c8r}8\J%J(Qreݧ?DcGw.9T6q$OspM#Gq-ldR�ߝװ8vAm%�s.߄ȥbVr6m87T6eM`Ӂ>ry#H:fWO4yJSfJK{1*N7wKW@R%Jb@٨psx4hn?innl/5:ae?wp#hn+C 8KX%rc=``"xE¼M҇2:n#VJ#[ {/Do?PD$Z]P/U PzqF!hy ]vj?F *Z,BBUϒi ?Si#\0*22?)3̊OdE<!;vKÖҍih7~`V~-cTrZβ6cu5vφǞCşxZP{J(Q P膧{ FNt&n?9ccc:.?Oᠣ-fُC^:c�nA3Vax d=nhYplvlf.(v|5 v3RCY?juDWP˶j0)(3-a { kQ9'KgJRgjPrmz!k)$TJc./} N}+<|jNNTmm.qkk~;ga{J(QʺO|&vx4@ِS/vaM C::%'@h*@CѸs&1rc>^+0-Vl܊5]+)?xx~,t9]sLEjw =|QG" ?h,7Im.O7ˀ /d\j2}/gUIRO)B%5e !>5ϖX ʍzZ?%\+TD% (͆ &wi[m=д4wk"s{30́!h)MP>,۰ዩ܄+1+ ܈B΀ClWNHhe`f!rzf2/ 96e;خ= z/ċ\s]# ʼ>՗SgLCI ͺ>ʗSlM }_Jʒci{/ђmWײ3r4{J*#j:%J@Guc&aO4n&mEw4m!ke]Dj`-ڂ ncbڭx{|8cɒ[p`NGqM�9Î4{ӏNPRj䃇zysc*<RM6f}~o&迣GGQ@4<vOpʟ85/߲mK hlT2Sdch,S_յ=,$߰* (o,(36喜Wر@XU@iyJt_`hҤ#[na? =~#Q=KNLΝ;ѭ[7ԨQM6Űa_hb'OFvrBe74 -d\HyiWYFd~&P7@GqXl<CW%p%boŽDfCž>nVhiKh 4yr�P[0jBWlw lbDҪOem۶믿JwjK2e .]~ īzCObccagggY+W{`ĈxÆ :ujq@P;pt5e{oؼdf9 #SPrD'!i@٪s0N [nSk:JMd `dji"8f8!Rg٬8G{?5�5z:u@T*%!!..Nm699 &LL\g&;FR>zaȐ!駟{ / 5<�jƮaW^=-i.kז/pKɉ'зo_Po˥֭+5[lܿe˖HJJof>~v>?3dU̝\yn%oѪU+?~>1u?r5O?P{z(ڻQuPO70PI-a[71f=ia:!u�1xB4)R V@ٜDfSie*wJTR@ỳٳxg?:vڡ9УG\xQ]]_!ݻk1`�L<Y_N|?^PVE;̽M\o3qp)As}sa_cر>|xsC~@ttZm⋕Ν 0rWWW+dٳUϴ[[Ii 1'g||t0&!' fvhc  i{@)O�o&ʚi0�+:x[(2P9b:>X[P;IM%4;ʰB%K{z~�4lt�2JJ޽ +!!z?0Դ<#m-7<'ZMh6EjfϞ .T]0b7UOsmمƮyS} Z>!(hѢ9ư6}9M=|(NPM~gԬYԳMXL;5@i깻U$55U?-;;[>3999j';VqC3Li׉aѸdftiIj!uH]Pr_)HdL4?5 b{?h$T6I雀OaXFS(o 8L^ T{{{Ճr8l>cV (-9OuC% (MgiRkӦ :'Mm~3Unx<_wyLddeeImN cI�eeanx+ {udߙ듌 9&c oyFkULggJSݭ"�ޒ$L~zMüشǺLG}Nh[bQ"|$%)G(oN`g^ {㹗CxQ2&Bt@I375tKP!r ze]E"R{gN@Եs(9lPnΞreuC% (׺uk4qe4'Ϝ}&wq5k!$Ma2ַiioMЦ>a7L#Tqi %PPk5@YV3Q65k֠YfHKK3 ɕʧQGw<uI4n!49N3)vkdו7f I&�;SWChImnEӷ�ɎrLj(ѠK8t]PX&P:D]{O4b5P2am=R Ƙ=qnGXߖ~UWsR36dPoN#R+"N~|rxva^y*)TK)Cjc }cFJ&kx|DḌxѯ_?}y e|aEIFLq}Gi7p-GvSSǁ3ӦM~>!m޼YjϜ9#(@gЇ_ꙶ(+.yeW9x4|(vpǓ=\X(=E74m%aRj*iζ-1y3lH:I?=@r&Ǝ)1Q(mJMl(4s-:lKѤ@ AP?IM彎 l7y3'_JeJԪsg >#SşZ9gSa@r} ?k4M�rƪ1g{5Us@iڨݚJBdhnh:FtٸqcF3=ґ^իWK554Ys˃|+ ִKFΟ?i7d8m#<8@}2'۷oy]wI@U h=+m�ee#{k;OnxLhᔊD e` `yxlg/DK͹!ڈȷ}o!z \ǻyxh#yyRt=-m6 }Qhe_q Aî%6Bٻv 8`v@e+8M'?]R_|F.? >yF ݄;mŧO?.T=͵Q%J(=%//=[L(yy^ 4r6ք`9_\JM?fmChL Ho&o߼=܃y0d E w�{!`^,NT̠⸭p;s$o;Cv;ݠ[fhYx:Qg<H>~6* I$' k(s" ((bNkĜPE$EA9}} 7 03kstwU0=ujhzB%l=B@9XaS󣟽R[i)bMkRQh#h2o3ME(˫s@bM6M3>zH }JcP~>;̃2[:mWI0YԄm$eq_Rjn:H!he9Z[{0lKl=>MK8u\&!Ҷˤ}HvXV`aFr1l Por\m%;K0  %'&RRTP>|BIM# PV<.Z~T,ʞ#'J$15y3X{6V3KQr\ w]BBtơ&oqzLCw'?wc1i":N| Ӱ61XNP'3}'K_ LNjuB0DF6`z!Lm J7nF5\a,o^~3¥<y>h])67卓`:P<?ej(+qEqLCpHMۗWOEȉbXP굙C`XVq;-@iv\VȩЇehn"g +ŀm 7vA"|IbrCr4 SiBi"Aei{m5\|Ա{%@IM1+MMIzTSzy!Y~o<W</*_(# !5YωzZOt]+sd/E7_˫s@bX (mǢbԕR4yRw]- ѰPF<u1hFt1irPh6n $ r�KcE2[`äU!hHIu$5H<D#$Y,)ܣ"|0[yҗC/r@bX P},;̄VrڭJmJII:4%U/Z"RaVڅ¥21oBa*Ơ y0j5-^y 20 )mC@i(Ag`j H,-`ĉbX(@u),*hZv[) \°i~5 ]A}�N}QFX-.%5tY)i69Q87bPsENZ ,4-J"&X# e ,B-`p`2'Jbnm1 NKa67Bz躯Bg-% %p4,z伤0 ATm�HJ&dR2r^):PoNPۅ-l ,`r> $4Fr!%ԵFM<-Y 81PX,uGDfCvLݧzvBB_=6!0MD}(3 E .X=R+$:-%i?F #8P'E0CMd4l:ecjn>W,$-:} > 5:O"8qbdX,Jvв�{Ў`γ`s0u l:gIiuG}9n7 :̓X"4FQ�4kh1 碾4sz.u ]&4mHm'JE}'ou Ě1it"8qb|U,F�͘P|TC zmu]Ce0m+a an5<¸ZJy'-HTJkIJ:iհh 洞LH+`IIl' zaK`iuKHA0R }0u ,/|RC6c1Dp@0Fw||<E_CCC5 U_ʏ4VP*WyBQĘ!C@Į'O}TU~l۶ ^^^e_gu}t]ăDW**()7GjB gQfжNn8�h-+/h5-)OJZ`im(7 -i?}P/OhKIWZ`n?h#e/i -RMsiju g0jzA~ 8qbTꏵC~Gq=ƍnݺ_۵k:3f_~Wk׮UvO/yKeGe럕w߉4w\W*Rʭеj#|*DufnLr@Y8PV-KpX?1 |}}/SL&NQrb_Xx1,,,#Fয়~**ONNF˖-;vxB[5P:eSs|ۥ&˻+Va 94ix.J^iY|hhtqb,ZH.)zLѽT.3?Y{ ,]TP֬YSdE2=ER(9q@ES*}4i[͛Ŏ`oO> EAAAٳgEۯYX~-ӧU(**J>~X4ajPS9j۶-Lwyd�%_pa5y|޽ɩ|ҥ ?.Rǎ|vkzȒE0Le(Ν;O<huPO\#'t/~R2=Ebĉ]x&&&tٳ�tc֭[ׯ_/Z&kLzid 6ĭ[ٔ;2UfÆ xI<AMyTto|hll MMMpNڵke^ۊ%q?F-}@Du)ٙ0aDMS^*SE7|Sd,L>#JMϗ*=U@ɉ%RSSKUզ2~DSnV1YOޯ)r>?e4)??_X|tuuaee%*=EPS^=$յuRV(+c7+|K,~wY_Kesh}YtQ*Se_ 81P2PPDDS6jH$Yqe,d߾Av():6>_L|?vO& Uڵ/ʞ"Qڲ,4_{ZZ*@鉃 [W^*SU, ey=E*(Y,!`׋,+7nܨrP/>a4d%D>c&?'.Q� (*TFF2)<:#8#9jB߾z*:Ƿ]ԋzv gϞ-*寳3@evOKS(PvI!eee v-ļR1P,MHfU7o^1Ԓ>틁b|ǡ,sY#G" FA2dVi^IOÖzRdžzy!XӦM#L*DBOII)Aake΃,IcW֋{˖-Ŷ/m4u|s#۷$e9 IJzЗvOKS(>; '|ȔRFѽT.=g /Ν;s){~/ʿT%@ɑrX7Mҕ+W`ii7U(Y,JJhlI{}Ϗo @IiFNoTG@C]X,JRu#&1c`bU(;v5>&NCg#<p6g<q5S73)I;<nkR#'}<C:`.h%fIa"j´Ձj֩%%@M_i-#<>1n(ݾo]K1kXNJ3Ѹ9u'Í0@bX dXȬ AOJx⨏\>k[㩓u:kax T._8m;@6jLꩣIM렉jcIp]̞YmeR hS$4҃>F6M%ԃlְ.\:Ä飱e*$fD`灕:k\:Oɓ|Y,Jb.fn#3}o1z# P'C4-KC<C{=<]43҅fPӪ cu|j u1az16Oԃ6jk6jJ6AfimM|[ HZm-Am3#,^9n`[ahb1PX,5:Z94Àaambt<h;xַ5>6x: {4n񤫔~6x<% ]5al=uXi &tCFЕ۶ՆT]hKXGS�Q 4MI%#] 1eu:p2t `d=3[@CC2@bX֣-L%HW3<Z2_.8_Uyxh, /bk ێ#%AjHM Em�J)�'ysTց~]}A�&7 ͬPPR 0lhݑcᲱXx8xcT,%b(4oPz,wK<vӾm|lW<; O'[S#|ydO<HJCXjk46!L tQ#wCh4Z2{ir-¥s[EPjFi'lboħAXd<n-2PA B>}ޘPa@@bXW 7vC8KOg Ɠ%#Ax6'tx<;yy?y0\t4QSWjT6n\ѷF{v!}'5Aw8 Qupްqg통& 32bD @][i+kFurssER4қaJwi0OCj׮-TҮEZ)Չ@@bXW1`xOsߵ OG#=nx<l';<=[Afh~0k:u$Gڵ6u*Jc -ѦucFںPӃ9Bf'M!8t|;E8qgqY\hJڪ4PݼyS2uAݺu뭹oDkڵb,\._ wV0sby#Fƍ((5=Oܿc@oLGKjnVܮo;#:།>rl vȵC povm!>>)¤OfQG:FSjR>׃i02GM:40Bvظy"Xğ@zV4nĭ{~;U"HKK�QFYK~z_̕+i1#`mѢ+,oZKc"~* Ns7m$n:݇~?CkЬY3ZjbWf(B||J/ DtyIٳg(G'ZԩSh۶7lhhaÆgJowQ?ƪcU΃Hﱞ={)UL}6%*R6QMƎPK_-aN/lڣ3C`M>¸qصo5zmڨTӤ>)H~#AhH�YGJPI@Y4u,fd�k L aǞEގ.l\gp2J$5}Rөż9о(2AJjeUBBBDĉJr\r˖-byȐ![nܹ/]vu&M~W^[p႘W^ғ!yS(ꫢe^KKKry8qBX#K~ PcǎK"Zwwwkcc?X>EzۀU_c~ @YubȻl޽{J^sU( 6D C}vtFAէl['enz?A4kSACdd]ۂl3kh`ff( #j~a,B|Yd :P71ĬPZB]ZaĨ1 Ƕ .ҲN & Gcb*?E$]d<#=yD,S裏J2ˠLy?>0Pݻw7n\>菄133{i[7|#>cq T<>>>b?ʖN޸q|:3P2Pԏ?(,wƌ8p@QYǏ_옿0՗>)<?1I-TrbSŋaaammmO?'''eK]h9رcK֠AUGiǐ+ʜ ~IWگXB|,sDzJ;۷/{zz T澪z? Q̻ﲒם麑{cyE@iԤ!z a3FàIh3QS 2gm+fp OáPl:,={ھ5BTڇ%>u$'POSh tQͰ6A�Vb.LXm3tt]1yr/>o{瑔SF 2$ߜ]F '"TIeyC]ڱ*d.s<Degg}"K`+[Gr,3yY$ ^K,ʖDMu=z(ld,Mgl2tMRs]&M\Jlmm1O~oqJ,�EԹSV.5k ӧS `GQTPVy(E %){\{3D.\XUꔒk=zRU _ԲGV{ ͼ*]VIVRP^TL@;vlzfm$&hd awjl6ӱp7 @XjD 50xc{hXA͌-QL5M.>5 RZgzå9gV\3cj>n:3MYC*d.΃lܾ8yB&JRc2rERfY1+c,D_m$/URQLm޼Y�8{l۰%eY!АYU/џSLL :w1֭ׯ-_z͗,ߞ9飈*2bÆ UZU",]xe,nݻw +s˯]V潩&RUPZIס4U7.<gȠDM2n)+/@Yj[]sijVʶ)+vs7aqvl8;/Ď9p`"9cH[Y¾ cf€1h 롉 ~{"P8[eb&{wo۶#9.'|I_Ǖ (%󡤯#%V$k^M "@)AtP|?74}Y!~NFF([U%9rJԜM�O2<<\_ IIIIRN"ad,gEBK5j /Z WY&巧j $oM _hc|CX*@YPS9ϠW+{oT4Qː/2W}ǝ-yMTmw\AY/o_ Rz  #dؼ' gl> .ƜYy!6m=HNމ؄HʈD|^L_0 CQ}бgԷ)Ga13} Cmxa3vtEѝK9̣HˎAqI~#)q$z3V,AH2$ =zISzlSsrYJ�eUdj"J4fbbbQ9jo޼?Tު%5OӏURhLddd$ h/TNiǏ/NT50P2PReqIId\ %Y䷧wZ(,n 9Wy?\_zK>_U %͗eTZ~]Atr2@\2w*MUuދ R [M'WL C+~[�V>Q' ,b X+FxÛ{: 'u)i{|z=N-˧a}P[J3c4FOж0F-}닩sیq<>1Sg0c$p]6LƤ)]0rܻzGtzr!G7ET@)u[AGM_䣥2eB/DqԂ VՁ_]PPSkџ#}tD̥uN{Ap"+]&t˫s|ׁR+goUZPtt7(} P*:."%oFQ-)z)W(c2t\2 v,]8zs^eb`("53gB)g !qJ8p7&OHе j>-iS=n,Mia(R x< '  l#`>l; {Wb)1{Ek) 5ycԩ`(+'^WÇ?JjBVJj#Y]o?LQMM{TZ/or 0tGc[,2d!&k uNT<Zdoo_sV62Tt:P*:E^7=G&L(ך|QK mJE%7opsĪͼ@YwYeދ rq> ubظ^ .p6 FXJL؉әǐqΝ@j=HKَiz:%Fzaf.nƆp0ix1LPM#7FV5-bvhD'xR:6б#:,}q(z3Vo;V`L[ 4&uZX_,%ŪXB ei ;�{"Wc۞Eضo9bτIpo[S|tL "d$ 2#6~ 2#A$AШ tׇ9Z̡]fMt[v}3lѣ7pO#w-=#-?dEnw6?͇b1PX ,J s3j /G#D%ǖv3#f�Oة:wi9F3vÌYhQISX jƆfTM] 5M Y&-ѻWCx5ƠANIX(ıp8tvhd79.Ĥy+sl"0%d[zu~_@ddXNd@е<: Q3MZass^կ9uo~^8t0Cбbn̩ :5`ֲ Nflݑ89v]A8u&RJҙ#8p4vE𺍘<o1l،=z0`ơ,˷Ƭ^bZ�Uꗁ1^hu@bX(7_}'waOt?uG3  Mmʡ. ňǫ5z8y" {y J>Qp .<Dvu5 fb^üоoWsͳȿK3qf f (}K8yȸn0ΌFlZd 'ISo2P*W4E(`ddX,;u G`�uEpfa=`Rbq0Fv@` EzN2rSgz4mlȶ~kCBRW' 8֭ð~=\[q%r^4}|0%ܕo߿[.")#J8\ry'(i4566~iV@R;xF6'$ߖD S;w10)4QV()g/_cXX[6WY=J;D=+od~JR"ՉZg%]95g{v1EuUq(Y,^S;qL8Vm[A]a ]v=5Q'v")+. {z~?OEjn2;cЯX[ACIMs3,44w2\NJqY>G_\->ϤJy{voБP$Fֽsz;J`OWhZ?hU^4|AZZZQF5#v XOqL_E6n(_4@-Xr4%TwIPHaJY(RA*A,{cvU^4?{Ah ,zDz$b2c)=:7̀Y=lAj)tWng惋^˸Qp/2`ܠ4 Q5nn 5 4MPXօuݲVVLx:>!,E`yU՛ضcS *#ʲDceRF2GmK$:,,LX2ZG~2~1ץ@,%ECy%*:VGiyU^d,4k@bX,J@y,i?Nw$ +D&eF#r .<krqEzt _0yKI+wv)RfN5n ^ݠS.ٵ¸۹E lܽAGK/J>OISP.\y6tJ$>̮26lX%Mɧ2A!  bbbW,l{b!CU1,z:HUdS 6*XU^ [ֱeeյ=svvʒ_מbX5PƦE!6(");qf-FDVHa$#Z6rnHyISIlu9h�gb/z cᘱ`V.31*vmKPHy(R>~"IOSk7$Yg< (WՌbzxx@]]]Lif̘!˂ouBpdr EP)\o{%1?>G!T6e-S;A%MɧDHD>ueYu-y(<\׮]gdX,'ɸp#ypy\-# d\̔Yd 17]ľDZ&< ;`db>1;d^h׽քE$gaہm1qI|A0yHpY2ȼgqc>YL_^3Pwz;#~X(.p+K\)e^igԋgqe?]q(9nbKQ,9cؼ%2o&΁⹰q@m ( E�_�7,ؑXrH=kHPޗ=.I ._X+8(C\X E3e{mVw}WeCUSU_;S(6~vbiCh+B<s1Yӑq5iS{,NMɬӢM|v$% >' W\NDSȹUa(nۇ0oY.9pQPЃh"̕@k`,^ ǐO p5{*'pE;z]}a.Mǚ?{P` %@&:::V(-4<X(رcf^{N}FRݻ+2O 1I 2F&"R~&o_@Dr84\wE0앾f cپHyR^_t m[85%rֲ@mKs6n=0gy?# Gs: 7^ϻds Y:ee2q=JR~ 333ܺuB@I~(ʋ:ѰY4*%oaĉ"@+W|iBzwҘh:ɔ-[z077C^fxWz*s3H] Q%u.Z)ʕ+J_˒ZbIפIVں=x?PZWWW?DPIX+#~9Npj,]ĞOE)?Cbnro"PG {t2.Ò=;q$HB ՍU5 cyCS1ԭKA>'#P jۏ<lHxE /I?3X&"qA@650((3n8ZB1Z:v5iҤhT7oׂ о}{<}T$&Ѐ2Qer׬Y#:ұ,F=~FRBY(˫s|׀wx�6&999VZ X]nZkYXg/\u{𾈞e˖[ne>ԔMIk ꫯ鿂ЫP;Kq3q%G$ƅ%8VGt^�Ƞ]ᘻu?vH_6(wc8t~#`<_ԕa I#h耐-DFx\Y� q(AkBIf>bNaͺ qWu ٢[6iEԳgONÃu}EdW^2͗,ߞ"Ub@V)LMM_O<ЇhU",]JCh2Ui&(Syfec߳k׮y{(EݻK#44}L6(Ȑ!4hPB@?> yHM†(<ج$l:vk#+%aϩ'D$?Ԝ$d\LAz~,iK?O 3 VҗqF:g Fw7D%D ̋ȼ&ƳL-ȑGO"1- 8d$!<j<ܼ2PVES6&+jbm_~)}!�ϟ?dr۷ѷo__5[(Y (o1H%Tr_,IGey+\~{ @ߗ/,^dY-,ʞ",]ʲ'+S*ײ䱔g=x_ߋV-ooDBy4 _rg>KD$$H0d H, �Pȼdd䥈p:Ξ !s`he ˦2%>a6\ap<](D,<SW. 9<CnwVy%zt`ąʭ,\2PVESѥK:vX=Ź޺u9c޶m[ԩS<847 >yd=@ގ?dj$}(SG*c$+GM/΃mA W,ʞ 7 ?+Zg,=xߠ")4e,ϡJ@~/Dj~<^>+I8w%U38JИ̼$d' +diD垖2 )98s07x´n}Ξ}˺i�8C fYk;<s\:Nr qj&]BXvnC޾\}N 䊔.ؾ{5%̬Bez\Aʶ/GzA:ѽ{wLMѥ9gd1Pzʬ/_P샔z_G+}oO(ƍCG0`@Q9Ȥw\bړvyP}{U~'$KH^˒ǒh,wˢfjop TY>=m螓K&j7YÅ{+J@ya$_8RCx-'R2PJyb|F@ef~ 柑$/tD ;&E0g,Z74bPغ8 [fmp:fH0Yȹ'#9o9:N}|>wQ49mW v\NAtBX*囬HIȄL7KzK udYoJeU>*8e.34/>o|JMrF5mǏ/*>Y=D1j鐉:ZPs*aX+z'E=e=F~'$#7P,7=_&L(g~e>|XrVVM� u6֥{LlB]vӡC=,)ʬ($ 58{9$|A|4 3'A߅gt9b^J)y< ^@AavhЬ ,?k 髫MK .C!hf ٗp~~A.KoI+HEjn<WGzia�^ƍ{9صOǵȕ:ʳP|ruHDdGP'!՟bdX,?%@3 HxH)g. )?rRpl2=$%'bW|<Bcbz6EGcñh<˷/ǀhܪ%,5U=oM5[Ъ.,Y >{ D_\r>-kHʌ‘H(hϯ|<1)Z:(S}(;uTl{OqW^-?kP&򁉖}=޿_tad1PX,1'0vSJ(vǎcX{`7n߄`cTCQXr0<a4=cȹz=© 4oM?C{[4iv-QiCX5FM挫wrpU.1j&N$0'm&n\@\\[98pxT!]Ͻq�;vlQUpp0>䓢;w$S$j heMJ%bJz|HFaObz 9) ۋ5[ 6RҐԼL$])9sٸ|'97t0۷CKg4wC7شk6h֦Z8ߩGG\x(k2N>/[H' if}<%gr >3'$،3YK}#Ғ6%bO\ ڰX GXR4I\&!J&/g"%? g20"o;,\+`N!hN]:­WOi+:xvEnpv7 $ S)=y~׮K`4\1Χ!-5 qKyc^P4LƣGD???~X ,z?rR'�>#s:{go{wO%Ч?f,^CGn6L H):t8: ACeht6^HiM&aT?L BL틸 ._@bB2cN#iܸw33(m$!8Di>.&% @P1cb1PX,#ǐt.1HɎEZ)?HLAlr4aTD:K`.&͜&`=�=z¹S'q󀭫ں;tB' N^^{Fq1a4_!a֍غoŽEp\4RpA=G{{X ,z@wOtݽzǀ^ B/3?!cԄ173N܅sduֆ +~:lݽ "'G!\ 3qY]y Bӳ~1I8mbX!d _sa$8CFC=b0|Y,Jb.l׮VAJ)]GF~rcz>iq2(#"wbW6l޽붮ö۰^.])30lxS yk/Oxtꂶnpl 'Ws"&!>+A _̞7!aJڻQq!%ƙd&BAxY_)-aX ,zM@IkiikT2f0}dL,Mba\#1|Ot\ҢExjvӎt1$gi ϜEٓRA 5g!>;]#t&`r_0qx;#F ǰქ4HJC0r0aYKbX ,zM@I5v$ ;{2BmĮPؿ+7ͫlR- Ĭ3at?C3yO!7 zDK[;4j@֭n.ڽ# q0&\_c@lؼ;Cᭈ݇>KIȿ<.8/_�c#40@bX 'OMTMJTGjf$@bX7(Y,%bX ,bX ,bX ,bX ,bX,JbX ,bX ,bXP?~PSS{6:R r b(Y,�>CTV5Dj"АRՋʪ*>k^q(OCהRj5E]X ,z@II{a1 ȯ!R Hu,bX (j5V�cէ%WAb(Y,R]]5jg|R.ЀebX ( A�/7 N:@bX jo+PVg|Ւ>}1ݻ7-Z@bX7(X@2<}#F!>cǎo{1^TW###ɓ*?P>|gǷ~[@٥K}^^^Q^nnȣ7]ϟtMʺ.} Ԯ][�iU3Lu(Y,f�CY^E@Ig8q~'\v |nܣGPNŔ + @DqFԬYW_}UeqMޡCw֭7vZ3kXK$///޽IQDbXo Pʡ*J[]C%9rX˖-e_?F jذ!֯_/KP if͚ժUӸol߾M67h�6meiذab۶m+uVOQV}Zh,R+Vqƕ^EeڴibHKK~~~*_5+,%/KUJDP\e2- ,z @�=U$$_u?xP)S2ANIxYz5Ο?_l… b^zERސ!Ce@CVUy2SwP3)9,,L,/sߕ9YV(e͵^>@),'}gE@W Jy+/mUe2$ 6%b|k됅L>iK AoV7K]I�"w-7nXҲW>Ϟ=+#U_~}W\HEOeG}Pw 97C@I Pl4|||~Dϝ}bdX,kJuKF)Ե|)Tb°%STr=2B2UFbDȀcLY˟~iqe,t."P*Bill\B?֕oVz+ SzRBI@U>,W],Y"gUbXoR ֖=l<g;|4>w�zu:ڵѻktzbȱ#{A=kxwi޺zw#7og7-0@i>3^Ju;PGZeeJi ˖ŬgʈnU,P.[LeEΥc*s(t�B)2J<uJ@YR7oXCbX7 (+,Фa#8s6hڠ-vN.pkvNhYSã+L $oQ]ѭz<Ё;Upisg% Y|S�qҥbd ̧|* 2?A_~v`| eiY/oLɚm(2{yWŹW'e=22R4LW(e>!%\�%5W S]ajjZG{eIT 60PX,bp"(Nf-)OM.X,bTD^\ӹh2We^XxED F= ,/:@o߾?A3j^:VnڢVZ"֕,Iu)՝Rj%5%S}Y"R־SzlSzYM[dKk׮]D&t"ŋUZNu:W ,zm@^(Kt(0+)U" 秤bI-\oL.)bXP˒FqX,5zh1;5ySS@bXoRn?edU^{Ƿ>7%bXT-#?tRbdX,֛ j&R ^,G㭵P: ,zRUPVκI I@^^9*I4MD(Y,z%r$e{yܦz=cǎbTfΝ;�JJb1P~+]6{\4wɸÛ:}e$PGjՊmKJJJaܹSH+4V()ɉ/_cJҘvvvVnݺKŋ%k:$qcve?Yݹsڵw3''GWŵgdX,2cA)%5 h聭[0})(KnZS -4Ũ ȝV:`$m/ Z!+|%EáS)O?$.KgϞŐ!C)!!A@*A,).ΡE{A}5kVeמbX @]C1z8Nܲjk=w)?NS*JVYXXJmCE-[$EE!_?ҶO1„%uAAA2~ץ@,%ECy+.饼:VGiyU^d#\k@bX,J֐ୱNdoq.!3˺EWc,lަ8jECժ2 Eӧ܆Kٶ>(!"AYLLLQ9YJPy=Zl?EPW\B*dQ%HIV <Q&WWWTPV^V]K3ggga, Uq(Y,^ej҆0/ܹ/ۏ/|l]MYA]GjT/N9jUʲ|Jm;c 72>CCCOV^PP RfҥK011);.-YDeT,#!A;T?Pԕ&W~@YV]K޳k׮K ,b$ e 3/e 3X_޿_ 'ooSKA9Yr@r�gdX,e@I Gol~|,Y:ص<z<}+,m Am!PJ0f,,%bX(�J ]nC(BǢe[|#vEw? ?p#[5x9/,oЋ,%bԐ=]84Z 5hԀs&Xj1fŠ}0 Fbip1 <�X+-](|JbXo�P�JChal mu XcݿA3faL׾>0t0xtٓMj;k =ż�J;P1 40ePf1PX,J-5-tn]a1ݝzd3~|>Rs`??tUϺ 2'!BI! WQ4A PW?""E(Z([@ ~w 3$$yss+.^8(4"7-l<Λrjd8%bX J?-0+fMX(omŏ} ->~???9_+gOEk!A�(Qj빱9d|4:g5C{F7NMIHw'$$D/\~:ɓG}$b<>qDUUU(//ϠmlJKK駟h+@bX(}$â1o9?4nQ/ U./?o?C՞ύk?0�Y i#]ϣ ^V+~WFy9>gƌС>C\yƴ]ӧOGǎ%( sW\)9^^^XjUرcw:oΝr3 G(Y ,ź0B1}.ni1~{2c-n\eX4~  m Xm/۵kW_^hSTTtj;vȑ#h45 Bi>f^w)SsGDW& ,Jb]@yieO�JZ!lD/4J,[0}ܵކU6>eμϯۀɷ`cި HU m۶!99)))x/8*~)~?E >餝`|rXϥcڷo/Oj@bdX,u-:(1_G e96tPFcM1FL-iM_Œƣ{<`̚g5ځJd}7VDQ ȡpR~~]<EB J%b#I6o[" 5A 98i|v.| > x$</ݺ /Q>mؠ9M6J$ҼI|95_|<WzzѢEzŊei:"gΜ t(Y ,źNҿ�9KZambUun|⻯Ē` 1$Xq�yrde�% K*o<>tP9\.zΜ9馛O:%w!y}Ay}26m`) ,Jb]@S(11(+>/ކX߻//{PCD}hJ{PVCHR_bXNqN:e0rڵ;Ǫ~_| [_ {棴k;(".$+/߃RF-lL?.\s琗 &6%b@Y[TB0f4'Su'MFloGZAnhN7E#~վ@l2 y2Df(Y,@h^dtT4VF!CQ A`dcSҳ%@bX,J!??gu?BC׫`BQ!$ TI?9W _=RF-obdX,vQB?? /xydq ߎ] M>rK@bXt  ~Rv1vMzmv\wח/`_}ƍY,Jb]-$䴑`MA@ׇPc= K-i[~N#ܶM;~,%b6P^z%9sUSi#,%b!dX ,b1PX,Jb1PX,Jb1PX,Jb1PX,Jb(Y,JJb1PX,Jb1PX,Jb9^@۶m{olNm3H@bXk�(K: Y3DDk T Qi1^4 Fc4b)>7$۰3#ؐdŞ6)8R ;gxlUP5#jjT'x68V8ZcpWJqbT/<'Ɖ}qlx9^,}0j01qm.obdX,JL 0E! 2^aqjLn Xc2Y [L`3ck;[zJmp G[XW7 wSK{T*~r$Alp6T탪 ĉIq|L_[ZcQzƙ+3Y$t<6b1PX,*% sEbRf5XI[Rؑnl=S7?a8й%hy&v>٨ Uspv"jN-S +Q5NXUqjb_t N <:;WbmNK ;PPѶIn0I = -V` gX,Jb]%c fI1 tZͤ&|mvOžtDf@I <# G+8[x`[^\ӏ ÙMT.ĩQ7N%7f|'Gİ8TY ZcŌ[HmiË9 {O,!rhhzt@?ebXW (im0A|bĶVؓgL蒅Ce8XGz <ڻ5~mq|dĩݧw3qj�yq8%>fĉqrX tzųY nbوmKv%`{M` Ҁ(zObdX,v6ks033Id*vO1Pv@)`PEku &i>^986= Z2�V %"LęsPug?ݰOݳry^m#;b|lH+C 'c�mmxbZ LV+2#^w}5fBYY5JJJ0{lJJb^@UM2.+ zlH`O4{ pwL.ϒɣŧvMǮS&2XK@ǩ{F8V[x%*ъɞR( ;r!Æ1=k1WoPP/hr~n@xx8:wǏ_Ux~@+> -ZӶlق QQQ4h,gׯ)S ((:uL4=҇~(_2P2PX,�X`witxf[R8P&P�8Zy)BFt<aţ6-3OO ?{ƾp`|v3{NMZlI6vdv W&`{dl/0YىXj6K%qT0hdCj(P?,*PY$=3MZ_cjɒ%2dH|l޼~aÆ:ʕHIIٳg; ON }@@bX(MbRە,Մx%3<_C]2q\;-d,J2ciZ<ӂlX!&crOW"7Z8LwG{ ^ Ҋ6l¯&aG~6g0Lm@a1teӣˆt@IH ]{{{W/DL&|||`4|rk"==ի/ܹsP(zΜ9nEQR;g.].+>W'r~M7݄$n۞'#oA@@@uffN{֭=(7n܈JJb@| ՘bF]z=VxȠL>\qtd Ŗḏ1fļD30cN 3l0h@�qq@A`[; -Yf ݊m=mV)B@fA"fZQCrbhFBH-QZ$(Bi2:-[&ƍ'Lnj# ZbL#`駟ru|GP… ݶ 4׿U~U_]IOy5A;IXMiNNN5%O>Do{ PS((Y,;�+PcP 3z=V ܒf@yO6N.j-ݻ5Ljd3Ͳ\e%`H`8dG('0F|#u[+ ^H r%nVl/PY.>K-/[[�e�6qZ 1Z kZ7|qv2tG"kJKR4Ws/5.mҥ顇,**4[J_0L盺Ӎ7(˹TҞ{?sJJb@6ņ璭M8& KF<h¾T/r�ŕ8 d ZT j**+(G~y*JD*\ƣ ZLl4cg욄]@v.@YdKm-ؔnÆ0YQd1Z,`25րG( 5A]4Miv!0k&v(JA#""dt6egg4d :F<tOYuѤ%E]W_0k׮ddX, (MK<LR)2# NWdi p[nظ8X&b�)3tDȎї>pT ώGQfS3P%IVh<+^ڂ'rdZ)74ބ  T+CIѬY394mK%Bi& nWm_2rJi}u{ү�%͡:EGGcݗJJbZT)Q8GŢ<:1 a㙖6l˴aoA n8ص^K4CuFtUjQEO eYPvxFgP5Jjl�Vlϳack3֧.ل5&<h1lk4a> =:t@)ތ<%T_^^ϟ?zW_}U=א <;N8:x Gw-VVVHkJ_`Aʼ3gWOUvHcpm(M1P2PX,w�>+ը�3Z28t!�sZzf۰!͈R)k�Ni0@�dgZ�ŪP#҄jExJZ ‹f#^]Vg xܦj+:�ŀ'Ŋ8S:Ia@g56L$_1P҂J駟~¼ydDi.$A3RV],ste^ 6HkJluaVy{ү�%-hwxi!)9yd9M.ۇV-&ǹ ,jBѣR@LZp9J`* �8H$"@ЫԬpUjTps(@PI@End<z G qx5^%$ܘdsF<*~%/7ؠ�tzn2`Έ*#,2:٭JV;kE>)bX#PV CF6 X!dP0$^)G20E@|CgV9j5 СBe�1jazĊr"0* tRGnD<(b=m1cnaKDMbъ 0m`d(Y,uSL�-Si0+^& P)1d &Lh0ҬD= |hZ35:yc*ToL< ,s3; \@{Sg{VnŋfJ4cY< `r%5?NY22PX ,ź@yk-zɪ .d.3j1>ɂ)5=,i0י d6bŌgM&,Vk@n^!1 z|N8%uKhpp'+'`*'hXj4ȅ:cZʽ)o%@bXSLL4aRJ%&+xجl< `q^rsV&g&cjV :(F߈HQcgJ1N@E^EL$Fj0ӢF?]DZ(P[x$Fa{VRx8Me۰ C4Z0G7Wǘx Rh0BXa(Y,f@a |%p�sd$H Ǩ$d)c�_�a#-XiҠ2*©!"/:=tjxy#cbqRx-BT�` ó632[5(%Qx`R}c @_F)>/wy򓮛*h7ΦUiiix<P֭l}k ,bt7N�H>2E%h1(>}ͼPfT!t@($ 3aeӍˤM ,D*% }P!8 j. dah!ipEa  Ӵ:T  Su=il:Ǜ6v'q9Q:qG#G AMm~bX &$Y0^�ew�Zx#fi0q$`2 h LĂ,#eqܕf 4&XbD6`(/_d^P5k1qH -[<:J Pi8%dFb~C DA~ 6w<~ `uVFC;m&a|G^ R;Ǔ~2w\#IHΙ3g"XjELsA`` "@ݞNBv+ӴjU=<x-[GSTwޑҳiLs}3PX,ʙpfJ@*A!ݪFFH,"$+qHBv|<6`u[3:ƄMxF"1P@ &qOK$k1;Qq-r"㇔`t >01:a"@Q1h0|)�rhhF a~Co>麮]F:mNC >={޿L%EIL [oի_w_L'دitg߲eKut*"Ag߆… HMMi]M wO~*ŋ'5fdX,u-fܦ"54 a]0(U(">H FZX ⣠ B˘h,v:Da1H A~t8(UD"/2#BU<V`d$"!-!k%sX89Sh"y­CD[psL,X,T!6\ǡR^P)3v4s)Ly~9uMC HYcmy#vTkP()Rؗn;JO=Tޣzܵջ4;TRű<=˞^2PX,ʿ'pOI0E$>(X�}L!'< eEgj?m( rE44}b#CM^F� z5CQ&-, i$+": XvyQ Ob"=hZB-&$ 50-^@ICC4,?-`ч#Ir(sx޽{!S|5k ..~,)"G}6Pl tղ/Jߣzܵջ#)n8R^~T:kfdX,uo5"*8 q0 @Ba^>m#B2qK%tC�Km@ E~( 0 JҼyc3ygx#:f>0 QXvE<&Ҟ4w "$`>gaWjJhO3Iz+ +9ZC>,tbѼe>}YYYx7=Wc%@{vYtIT{kwGS+iNem}%A+y ,źطo_ W,Q9(hNIps7nBid(t r221(mZe"/3 21H)@|nl܈`$5l@IWjx8G  Tqh;nu h"Z-[ᅲ2<[ZV|v2PaAg5Yr4?+@bX=B9h$-J hpѩ،9hU No½1'#lܟ7zù* z#E]z߀Kz7J¢6A~|+KF}H|/ؖC9-y#nI ,j2?&l6aw@flvC\ l6fufl6@fl6;r׮]k}̞oѦꏧl6f6ricHm ?q8EH5lJ6f uJjeuكǏĉjz&eml6f{tL\Shg]'))`cǎZ?fl(tcQP<yI@fl6 Lt}<z^m@YUUդfdl6@`|M޹sn\i@fl6} %-ti+{IRg{e+jSN5(l6;EKb k#ƌŽ˖7(L/",X|/>j9kʳ],wu4uӧ/3-9{t(p~`yWbdl3]W> @wEvn -Uܸy3 l+(mwL}m+1}1>Ϝ=0/.+Z(2[ rW~8X~U!@y�ĺ@t%fopaU1u+k0d(^ڴνScL 1O~ц~jۿ_6}QGG{EC]+  "Ak+_P+/egٷν0w[u,J6f3gСc1Nxy+(Y)#d:'裏(Zc}o={jYh'_5S[?x])P޺[[7[j{u"mڇ%W m. oױm9e[;#]{ wƍ0tXÀ>ՎCyF,aԚ5.�||GS{yJ6f7PRVz[4̺Kp:rrs2x$9>|D͉կu>6>BS S[˗+IqPkϺ)gs+{m[m}o\%Ab&L s=YU6~is?(zzuW#LE? *=@YLzRf].)z lQTk#cv={U_SDKm8qd5IZfe׸;T_ӳS[Nn_1P޺[t>r7ߒ7z>K5nV[%e2 LjPbl,O:U4&+TjJ"rg۟*(l6]ۯ[zM|<{Z= :*BIs({%v_پ]¤㐵'}. |Ҥ i2Cu+PgҊ59^?ӗ$E8)>{�%G^ڣg|J6f7P[YhNk]]v5򥍛(/%E#uA'^za?Y>4P7WsBKJzCm]Jzh]9ԉZ#ݾ(si^:a*W_Ӗ-dnsA)DifyMW@f^u[Wq'IGO`c[hq9yB 8r5k*)wLkR4D78lԘzA+<DZ@w߾Qع+W?,/Jw;V/Oo4t ]mvɪ:{aa.a*P={2/ZF[)^g1Pl6�3>+>QVnݶƐsW=w! >} &s3W[~}(?ިs{k/E,iu}#{슁6B'P7_ZYʛRn{EE_zr3gevYNA=nJJg9AЙ4UvS>ϫ/P}4SڡCf$-{(l6G[oFAq߿x2;I ~jӼFJE31q?Hq]@ynP}/>PڹspeweoGe,@f?7_ǣ4r߅%7.\pYJpڀ@SӼ?@$œ{(l6}=h yI7 ?%mPS"z9tWJpJ;T~ J6f�%MnmJ7v 5%flJ'�PwS`dl6;rݺuryKD&�kgUUU6$6rMɓfl6ݻw_TF@X0Gm6dSǓl6ft@I<ݻWFeSfwlxR?fl(?ZkxZ?fl(l6flJ6fll6flvC/����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/images/paned.png���������������������������������������������������������������0000644�0001750�0001750�00000162704�13112005742�017741� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����@���7&8���sBIT|d���tEXtSoftware�gnome-screenshot>��VIDATxuxG7f;Fd옙eb!cLbAI6h'^¥VkGh4[}<g{Ts?O?{UAAApC͠Ǐ=?ȟɟɟɟɟyG4EjbK%E寿AAT8  Be<vطok AAA,?Oa7i AA*PSRXAAPSAAOX   T  B AAJ#RAA^aKAA*KᦦW/ʔU\nz l+zՏKv񏟬K_s(ュ:$qU[;SgZApC psbNB\w*+gF|}.za<e66w@6}L)KRΌ�%'-JT{Vs(luk WxS0@}_g$i!VqLΩ3-Y KGNs^'O`Ʋt,)LiLwu,ʷ,h? /2L˞ii1tU_:Lc{7?8U>kVVL=Նs ӎ#gQy+6q6p\̲bU<~'ξX^^=myUz]gm')Yyy ߫>c`νb3Y=geIwtn啾VYɳnMÇ3׻#O6Ӫ,,M_^ ;/!Sgc?0#g-Ħ_|YKz'[-X=gf9Tse߿o*1&0`:__ܴl 4غ %sWTu=ևcϷ޻ 1?T: 6/X$!W6!SitOMJJ,kWeNj6&/^<}tY{%e3k3ğϘ4f>owǺ]vs'M\=ꮳٶ1]<}<m{D b1;{i97˪gewtG+>?sؓg)Z+w=W"ʹʖ'R鿸o>> "),_x<W{Z}卷;U'~m!d{}wͩ^cGc+ԝkJA;Ke~%nܳ|=kĎ)sW?^ϬӘu~AO?A:g^mcA;q&WV;|=~wmz./Nt}._7…bVPpzgXZ[Y\s/;5g^]yګ6qlriqUV<}<m~I_??0?zVTEX|X>cOp K󯦄g_~$Gz2K.7;w l߃?NCY3?OC`f>msh_J~Iys~2ZUatvļƫo^4:~ty}gU|97WyXu™ֻlCO+فS%۩r]oJ1-lZL՛ \=Ef]3㉧O82𝺞w=^i}:?ow9{a]{&=ꨳs>wӶp>V}ǎכYgRV[Nw}7>;'RKQLly",kg2;п*B*Sr.v$eu4:!:1EByOG 1<_}ϕiq%X9m6saZzr@LݶAYυ )zhI?EZ\cW:wvkDz{ګ6ql,[[J:WV<}<m{Ӣι|8J+$wM=+L9+n UZ&6ףVyRĜ:T]8mc_9OUYX믂parulz>Uy(J(,y\Sse?D8s(|fr.^W=YTNeVu#FX~Q˻WN.*c\49.:/a ܂rqwoǟ{xXeP kOiL[㝡&zxު=n6)l_!_P;Ty}Mez?orYg-$M*ۅYɣVyR~}35U~7JLly",ǧc:avk:/Ojpᭋ%>y+lߍ3[`o0?#W׉N/_GR^J׉m3o ?dRos*7n#=`V¹b؋0nݵAYυ—~[)}Kw]~]g¹t04Mt;TX&X~ąˊ~g3g)kp}(WPSu1ӾVIXr lϜ'VIP$b:J7C_@|qg^spHtYu2O纻窎CC,]&I5C W|>) feAYυںKϯtWu3U=Y _yMJ?31lpr;TQXs:We]=LJ<Nx,FG \cRaR cP2&$ ms(S=nN YXybYqSz"mS=x B"R1 1!3WM/OjI{ aYkŤCc3AyDX  +,?  Ba)  Tӟ$  F  P_~AAJ#RAA^a?  B)   T  KAAA   RAADXVGBå]AZKvh;vM񓧪^&S/k6sI8"-ҳ7< (g]1gnǧϞԶVV}*RO M#, ?%GwuvF/\C">+\|_W\A\.xsi<<7{'RA%ezv8PHZRsN{̳7xB-H;wqov%66le|w(\{KW_8Х (ޫ tv,իW؎4fs}y> >6pu\:`*ff&r7z[o^>#[or^n=b:&R7?7Az;? |lx+",iM:|_EI\[zgCXM5~no΂EH.q3Jy^U(D.]Oĥ>Ќ;^9wʌG!Cq6trk{:q|yqgj"J_Zm;wwha͡ts?%=㺽wWlka+埛 pcK~N6C>qx$œ:tM[Ah%2-fqe>\kk9_rݽWQt f>ۖ0_5”*﹖GOS]4%ko(ާiyqySkĩ>r8uꚽwW%m- ^X>sF<'OjXt|tGwjtUŒMxCc瘖]OZ,-XK'C=/}Nex-8mC64WrVu T?ɡekkuwWZAj$=ט dl C幜5(Ų"ҹceKO{9me-U:zZ,ɔz/˪_yϋaIz̄zU*mX,ANX;yyyz'ơs -LW񝺸,gew}X7,w-zNy/^{ 3s{ w^^sx쩧a/9qx <9NUxᥗ!z6nي(''p=߻Wܦ6Xry>  ’*zt~p>~!mq 3=v9JÓ>)aI zޥ8o=`uޫq,{gaR:vF-OXjWT:Ue=/^_xXsyhzy{^9{; B .$  R KADX KAAA   RAA{'  XXς  PiDX  ",AAׄsصkWu:p  QD#GpBu2&/  ",k9 k*X' LQ^:AAx̳:sb;v£aze i8s3EG}T+d' 7__@ՂA:bʘΘ3 ƌ!#cn?OqbX07fLAㆠa:$`4G}fp>C{aΔ13lz:3Cc�t=23M^# vX ĘQ1RoX0+Ə yfwB^X6=0S0zT7 - W|UTACbNX86o99-ukR6Bw*Gh94Vh0x%gߒ,]Yph)踬kw.({&904`F4 Ak|j$&`DJ&%c"+1;/Wo&$$B4aW!rjX.3W!gR$Kƚ=iXkv$!F˵5iί;~$6EC'7 TMNE.h; eA\4XQ%u6]S&f^lu^.tmS.uWU{~?;C^y'x*G١u6u^mG>ӡWф4Y)K!GETCsuMҸW&Zȁuj`GexyK5+L¬3p0vً~ .:vo2]+׬E>}^ D#.3=6T V´Ysjڜ˵bф藜"Xm:C\ގn;9u':@TNXoEm.\%k;k oCdu|ɶmnDUhh\FYֳ#"ieEyv꺱̷S7!lbVD.ZvfUFSe;mʝMߊflÃS6a}=Z;?g3ƯZ)k , WCea)[ ?#0Qm۱LV5),sy;w_~:~Oe;/ '#s9u 3N N]`I?x\?ꫯ"c"?8� :94`zPohYFE`jV_֠N7H{l5G!<ZS_Q?q CvW݀&{*s@ݾ?Muh1n-We^F}@]^CձJcn uzFPGT;4&9k 6e5LY 7X͈w/괞HߴuN0_ڤro:r2=ʺ쩧tY;`%ġz]Eu�?qc!Ga jVFGBē~^zLH[,"c0th-pʵv_דkxZ?D ]zꝘ`!^|JuwgcÊҟ,3:uWqV~ߋQ&ɧkawGgIYa B &<fљh1u8Ł: Skn뢶;NjJKTǹݥ(sA7!s%)c-Zz)Au%uv^**c~\d-;:0!:䡁:޸CT3 8;vTJuVX;rWgp2Dfyxp|6XiaYkǢaq[tv<w~gyzo0t^{ } eS0/FW /4ZY#<5t6<UXw?Ͽ"FDi+.iEKt> fwצezlC uu6hɧ>zlۺwt3K˲4n&mB;gEWU8<y'N>&K/5ؿ5{0Z(aJɀYJe*@yc|%Զ~|4R| $^Sy$b0ޮ� :Bĕha+X *c\4Q)e--lB4 T|4Sy9v4s(ZhPRW6Uд3HZ=3p>kvn*a!`/@x^ ʖ ",,ΰgA,] *=TlWKtL㰤Ei/]q-eAZ̘}.a-kBX:CǴ7|8>i;ڴtH,a1eٳ/eT>Ӫv/k>m]ֻ1*mZdy]8j{7aQ a˶㪬okoĩ=.p<c'fwOD*Zƥ"$rRQø,%$ώh`X)qD J5QIL*O~Mqyq ha:G FuWL6|ԹJ,<6[ H_%*}V'VSQ|JxFSh5U4QbSHչ~l$d|<sl>�ɫ ftЬ;c\",9|!fΝ8vLRUa\D|ܿd3[yBñecBXw?(eM(kHϳgbEz<wҴu0ӗ AZVvyw'+׮ؽ[r{ZV{2,B/hћs@|+TOA, \⮁LS20& H}6W¯5C fJPj"E %G %[ز>)bCQ>B"O% 8'1 8 K%<-,xssԵrԶV>Ng\4V}'Xwp' 87AYV>_cO+E0<چ̜\-t*[+*#,mS:R;հ�m^zҎ V(o8猱3eY|ɪh²tWrˋP"]s<M-szu \GAa2'wH,l ŗ۞W\a!~O  Y;Ia&44N%JtzEg)1bUO :?%2cɄwTYRyL8o5J`/P<)QHGmO,9"Y"eEfJZ}UװLRobSr X}Qk)0! K8uZ|%;(νfIaiҹGO%.] 9 K:}k*,cWgsؓ^ܧ"2@VVXCõU vU=G>TC就9\[kTÝБE?b*)Su%)Jyi,۱Nsʒ9PKeklIJF#r4jqmU 槶@ B/HQ\*hQydUE@] ?%(V(1Y� ʘ<� N%,*ScL#(*j[M Z %,h!FU~ou$�u:mW^ JX:Ш}5󯟰|%(oZiayk%!*,2N&;TUX</;u%Yjf\a%4SX1Rs-^c'N8+-++,M:rV;z%u>yܣ˴n<޲}8rOs֙x,36+SEKYmz3s眾[|N'-%GsJzf9啥\wOeha3,<^4%βD"]PDSm`5G_ZTL4)D#bALW5H @D#Yn.?˸FѵվfTv0T[suڴh*ڠ4 EvMX^ɜù'O,f /R ι*/TLm/(Eg),M q[ۄ%;Ov]!aaKZt< 7I=pC^уy=8Wilxz9W}9s,‹/\n`:Zq(?XKy\:˜;;*=I[Μѩ{|g=:;ɉ:xYQ:o}-MI-Ωx]^ BMZ,'2w-EKxG,or ,�"/#ݟT%EPڎ@p-V"VƠLFön][%)(T4�}gWص@ BKXRG;WCOB!v]:da̢Ck+,iə0eZg瞽' KcgZ҄m6u',M [>Mu G%drZifH]y]YyGj?|’#zER@% 9ZeiaJ8[)6)"3lC6!q&%63x6\ރ ։ư:Q"4LuD(% %d+Pҡ)2TZK%0o5,V*_pw\x9/m.feQ5X:{n6O\m&ai2 3Ve:9:< y9}n<[|E i΁k{ⓔ 4r[�!MeѰaF@D&(<KyayKƾ 9JFH ԍz/:YmΝ20﹈NjJ4fvZ% ҚAEB2ĒKvm |N+*TRʎIE4tK-@CXz*~naI/eKrkWa@mZMaY׽pa2#'#k X5ap&.N1>!W[J`"ј[iKmͤC-W[3ֵv^ͯ5pԱs$XևeI/ uw۰];ʐ T>:fWҡihUhӺ-hE%,;fQ,<0}[CpC\!2ש Cta) d{ /ݱɸ3f 3N\Dk`@aJ Kz3OO-Z\r=@ >Η; .Qb,/CSVt{2,ٱ}/I!n; =2X JmR H Qb�1Zr.-MP'.[ t 栞ms-%uneៃA*ws�Z.F"a"&GaĪɋR4\1%-Yf7laHvBRe\2O{Bǧdy[eK‘8 :lIp 8, !9J42,ȷx<\c ԖKZ4C(d ŒE\ǚe&n@LXc23QW]7t%C0Le˯nay#/0K!hj4A ˦w WEcJHBs[^](}2Ϣnz!pH规彖dlU˽xj onDJmdh�%ZG 'v Ңs1r^%hIG uQ|}iǡi0<ԣ(,Nyzi3VJ<usPc!ykYtkHna�黕�.aYׄd<o:HZ݇ pwѹhLd4fy jK&Dgz%?-N@d|-Fv֥_+XWԖI+q9ya+eW =eqqsULቔX0ZǡGapzNCAt+@*^JJA4ԫ air=t+%|Ǖ.7ے6lKq:!qՖ?8/@^YNf*Nce)i% ͘LsFrZ ۸gyihUbK 2 yϣD#[Õu]{T}zzr C9;~bRҋN<#uLʀ C\F1,1nI |dm erǼ/>u8}N:`zޫ3P5OߩҏXՂD| wXGʢawCX>QhnDv阋]Rؚzs_X6CX(߾xZeUem"’036WYv]q^v^}t9>@/g1>;%^+5ҌLsf}oܼE{ ZJOax|.["+,^\aeuGy]=˻GA9~m%6ÖEX2(V'*]L-@~BB&Uy|Yz@%GN1[E.֫zI 3u/ >7PIјd^72U Ŭ3&AEa:W MXLԉKAhbQ HBn^>^>wJZtJ"ܾtʎz v\03`:~OAչgcPszۥ;ߣog(Z}ea_١긏򄥻zw s,63qg=-BD'< ^%0\۟A#2ZAH~Jy)AmIs2uKypmYRHYa,ۋua'q@# rKeY&kH^>RA*DBu}oUǕe|L-\gao v˵ihսԋX ²6p+ KYsK<|D[︢ͷѭ {Y=c9,\w>Kz 0<~׊,ֻv}',ճ{A< 74^mfT-k7]&BE K_%"} 2v:2sC+K ԣ!s~lT2k~:tq%.?r,&,َ�kZ : A9jXط" vzgaK_eZ\zAt*)vԋZtk/V#KcΖ߿pw¤9pjb%WbI xpo6F%v.N{qV]AbO{ROOQApht1Ih]3%G$-lYz(܇CJ&# ,f=;{Þocʂø3.K_!t-4ώ'Oa#3ҷ鳧j/,^5䳧1Kߩd1w2"Ky1oq&vx/aC@0I%-)z~Fg^ʓcIa)²fIXry M#Ǝ_ǵ1GAaɹ'_e+J]t:y6Fzѿ[5o~hclQY} ťtùZw>]=˻GA9o{CXYMhnQ(1š /E ~(]CߨTNE5 rCs3zU^#O˱eal|;c0`Z<q#lDκ}vILOيJ\vF;Q\(}6,xE;qOB <*W (Vj"-, #?KpOu4eX,EXִ, K@rjZ ftҭrWA!Ԍbojn;)ڜɺN97GYg ]?8G!)q]r`1{%wWQAkv x-=EXڲtGor(V";2^i:5S1<!꼰h{G<mxp <$:^9yc\VQ~ZЃz[ƣ`|oXBq@u,b鯄&Ŧڕ8nz@h:",EX֜w#ۑ'AJX6g_)x9hW�<x+m* d?DS$*};tp+N}[ܹC '?ޢ܆Usga}ꐣ$[5ɘGRLz3:`<! 9-!wLB<ԏ\ Re_5髇 pC9<Rq\@s%*[i�GA`zylrl岉v%rp9=~->qGO–}G1fF=,&&möhO.^:6 a>u)ЮwŁGŒ͖J*~JL2&EkmƱɨXQEXF޾sAn8av$"ZX6w-޴BF‡R 8sxK8fZw(<nKD&XFeZ ,Z]kOڡS~3Rg1l{i<_ƨy[vwEzx¶eD:Z/GX\8Sxb@x"=LWah#^?[JoMO:v#1K=. 7lz XRPnPx>ÇX sQ`퍯(Ƕq.ZLK$[g,2΃展:Ve^@ sr7_BHێOĆ3'c7,JZ`u4[5Eŗ×a.3 k%}Pxe$>#ow:<嗵˗/:j?6q axbT5Y?ykn9wOd*nGPt-,[i12(*Øh1]viؒpWd #TLu<X+|c O`in:r<Vѿ�ǟ;-a-IOþ^1PC;oΒ^31:ҕv(1kZ2к-lvX@ h QVoR6J֍u%W _z#-hJt/ZQlEbѫ@kK9srmgFy&Zŵ\~΂:=g װ B˓²Hyԅ%p+{q"r=cyOsn"rۮb^; ,UE~<-m�Og PO;8|LZ> {bI,٥KH?ϜAʊ}X�<q+ILOqcq<sùRGFyw@<4j;?pUCε ։ucoEa9wjmz؎;fٲU3oUt=U]'|;v jC^}*a?{Y6k.Z:Nv;Oڧlӊ 0mFvNw 9Z' [{+v<C+er( )RCg K3P\r8Z <C� PmڱX dڋ {)Nހ{ySذ(~ 2"b@% #DagHt:(:9v%KG][L:IB!&Nוhe?B;w/ xswꢙhN3{3yc-c2n۱mky,Ύ>4%m@!mZ@NRrm53:`詥q.} `O(c<-۶_vg)NYC*PUybX੥յ˫/gjf~Vk48.xe2{]6𣏊-[%kaEi_?Xƾݰy˲)tՋTVX67O;#';+aH%,JMorPXWa)znw0)aZGKxHheh땏g}GbQ7(܏')9E#W R۹:3J}*l50yv Hw p3? p[\=ha}}dK%Wwѝ`\gʠ䋗%k8NJ/h 06W)-bVl=]u.}ӜWl{~b�<3JX,EfE%'1*neo. Cqy9}%U)^-X=s+zeJzfv[v],vМ:͚S>*>iC32 iUJ>E mgD c*F/]B.]}J})=]kQ@=`qykq~f驰o8|“h_%ڏGs ^J]V,,"W P204UY:A65Y9i=ǺH+؇Ͽ,<~ m{|lj5>Cx RbW:-XW"n s'|O%x}lz혉 =<MPs’ՓO?۴\%{bki k'~Z⚕ΞiuJTJ! Ӹ4$?|Bs,MJϫ/Tݜ˦U}~ڻ0-*;}P8tB.KX͜?W9.ws Њ>_wQ佮H<M%_rE[4}N{YeM0=ɥ^E*̘3cK_yU;:HW1w9h?M#%-"RjX,'kag 7 G-u0M dc "a^^CنՒb1Ɓc7C[wC8v8:!kp{dZ*@AQv-ԚĤGO<}yXB.M1=s6sEX 5>uKR8q8*kTg_/~sxU,';%*R6;MAmz^\#LWby1?tĨ*[u}ٯu{^:!~ŝ8 O]o-RK֑D!>_O5>iC[PfO[J_Q'躇GN:/ZlZWi叔p<ť’#o%, GGkgoxHs( 06r*Ox0n"?,ڙۭ9xlf;| cas%X[2ne6dZXSosh<Wqܖ)T3V:nbm hŰ=:KPt!gk48yܣW kDM_Φ2tU֚~3ғN' WbYڢF kޞ ʾ%:s",+c,8yJ9NKVVaUx^W O~m#0dH=<] vh~:3sgwVu7U^<6p²6F%,R0tbMm9Ekȣ92̘k6VI3}hTK^~HqIk&gai㘗 N[.Zs<s;ѡ#s6Mshb3ڮs8\; kg>]Oa)ԬwWW^}<I<z5qV%?LpOʦy^|e}U<9߫2s,9>69PmNU2<TZx9o`",9_ϹVY[iai:h餪Ϸkz>mC!s 琺saIg#N5;Z.cceͱM^zP9ǜV^=wy >J"*=  t<ԓ8Z-b­Ji+%- w*ȕx(P (RXriEi9ü8rYuw:zEҚ4[$* +fH^*Ab:^~2S[R z9L4 \x'RYa_h8ͼ_*:۔>#pUI&L3>W#rYVCcOle~񥗵g/1eYyXs,;zģL@ qy۸:ڛmi&}r(!;vԴϷ*²+\=OLO=w3 Uw˓佮L#iNBZKZH^[w^P4#媼O\ײ؏{R; qU9NZZ#EXzbd镉Щh^ ݈ó!fiaI&hom0yci =$Nq98r Kb584:!E’2: <8,KB :xi*WVOTrq[b6',EB4\"RwfĤ<?.ŵc�a)/1 -y6aN =7Қk8Ɗ8ځ2{,9:Qz<_$2['8w2TPi^HICFGQ!UеC<nS׳kpߘSo@睄44[&WuKA ڇoKAplx[?=2հ<Z5e 4x‹5*BZH4eο(:kƨ9۵SOpQ\JR=E˖ 9JDE;mKU?/%*)I|wX hzi͕yڋW RDX P%,2:1G̅WQBӯ(xf+0P2?ܘOoaؤ�~zl}=UyښI(eC3ВCV[I瞈c]ZrR^ +ѬJ-.O%, Ж Y1^m(6zynKAAQeӻ+Q{:d|=G'" ~nR[CN`ԫКIt->NEkEډLJPQ_1?cQZs oΩb"$:O ʖZhiK̹^JLrumК:h5S)<* KMpZA\.B r<'O?cP+?W-CvX`O@n~A W10?EX 5cy@%2qwL L7<ňO`n6,:'S{b3\PeKKjS-LQet_ L(S{Z2c 9Vcf;TE<n?[|8av@b=v(@<4Aݎ٨6E{{_p}~=\zQLrcۄKfFWb+v1rg ť>p{=>^Uuf",A[]X6g|K.Z+oRi~J`Ғa�աV"_ϹX RV?$)N 3R o9z cŚ`R}Ϫj9FoE籴j;sYL\x`zSZ<W>s#wYtp*Zs@)|}�|@+? CxtEiiw%E֕dxJVzW*!š;F©gw ب1%E",A[]X6w^ұU,chW�<-(,9z^l?'!@3H?˟Ĥrs2O`ԼXw,?-/6t-V츀;raF,;S/!kY /bܼ'8Vm=&$CgNGdzgg9=sv:iF nbѣ;qR"{Sgξ^ok֭i] Kz)5W=షoq)RAՅe9wQ3uGKqe<R\*I3!87RVi;2+O=ɸ+*-i˒;UZe#b9ZE&;lXasZ)=*]ν^3RS"ud*+S=C\"t>7sAMߚ ߶k^X"//?6W2c:&{pVYv^#7a) s, ߨLiGpdf;sp9[?yG\#sl02=,dy K#bu Y"2`~pQaJ($ej6S-0r8GubOKTS02 G"2f.GphcUtO_XٲРc"'UBk2:q;<:~mvmʕ+(X njuynmX|ğy8 RAQ+xGLvVlٵc Sŭ@@L>cduy:R'q HRw-Jة[YqGt.Z)ڒhq{x BکtU֪*-hlT*+U~+%oFHQlLZ'ۦ"]^7D*a鯮F c}Cgռ%t,=GY7Dq,kKX ۏ+3JX6S+6O{SXhQvaH%,)C Q\J|hq桓F%_ ;iILC`SOVVB2DĖaghj?] Q燄eObmt*bci1lR m`S3rYm7刱㊇¹ァ[X;a._FJzFs,w뻼7˫W?A>}� Xz:"Ʈ"+2H[*U^M諭F<IƚZk\aSR"/ѥj J,a4% Ӵ jGc!<%#_LVRf h+aɲtWeiT:feX<:3g-vޡ(y nȱ'w`c/t1)=Mr+\Anuabc̱B)h%˃Oqy K'JĤѴ`'@ǺԖK�%(ײ(eX'VWz^d djcn),?Eiez;(4E gv%&,XM'2MbrQ7�msgˁSo=z 7ŋz⠼c) l18`}j5<΁JX2ef̀cԛC ARIiW"T S[zQAzF;B8/8*qZdlDIA@ۥISi*O�-lLJ^ 0 LGS[&w/o9h7-vRXߴO,Ky9nXyGAnuaf|#ЪaиJ4SxuZĕJ4/@;B3~|:y|cze>SB5 :Ob5bORdF;4t PS\KAHxCӵ7"؎"2Y %?~綞j  LCԍOCcaߐiIG˲B %vڼm  ܐpD^.9FסYhỪ?] WpCtEyhLZ,J@H#_- 9RjaisMpFzXR"Xem|x!il@- kIECiڂQioMEh3t:zgdi2$^3aY9v<~Gy1AA! -%ODԋD3K: OO2*Fk|Avp+<UIAEǕHP;ȥ!]{n( U~q %Pi52YH=J@.s.)48Q%6Y>)hFKQ'l!XxčFX  pz/&Ol4xx*<8MfMC'ŃS x?2C yh4{`2Z<0UM:iTZJMC@۩J0΁_WAQ b]D Qbrv'2GQ{hJSC# v ڌEPIh8gÉ <Ϟ#RA8sx0<q@KqL3 t}rPw;薃v} h|<=^Q @<<xJ[נ̀h7` BE!j{z]aaWU QS>x-sյ3蛇~~WirѮGvƒUv۷wV"lZ3] Ϟ=+RA:I5wGOlw+) ;YPCEq+Ju;�[r%kar퐣҃ t0u#dJ*mz؛CAEs2v('VgJ[r32SUgb[|.K;103Faq_XOt1a) PI zz+Z 苆-;Qp'M.hzGw;{qhx{74+|MZ&.hҺ<MZ;YhvGO4Uy^Pyz]ѠuwxHƨk$*V=дU74QhhMDmyMb8([h`OxtEˇqC6<6]+u",AAհsgC:<Q17ﭬo  B#RAAa)  AADX  a  Ba)  AADX  ",AAA  P_k.AAj_yr;|\,WXN<˗/?Atkpi>ra^gp-\aIu??#~'AAJAa_kw}?έ ʻr%,MAh)߭ ʻOwmAᷘ}eMR *ϠRi {a믿(剚߭ DX 5a8]_.S\a){([D7ET@PwEE6eWqa@EA?(0eG"&$!!!aIBBB|}]K߿zS˩<uSM@X^xDJԔt*=xi++%,srrʜ{e24F+{w%F˖YV(K{Fէ8yRΟ?/ X4Sڞ sҥKeҤI2~x3g=z’FhTz{Ǝ{$JQ'G~&k֭=\ d?OwlW TTW4 XiSڞ Kfo_PXh4̊JJԬDM Ǔ&KRRd^$wj{{@~~gmy}*_ BkӐuJ۳fKXZڇ~JG۴i?X/_.\c-ZH>0a,\P]0-Bg2e5eaH7k.u>@Ӷ΅FhלJ>o>Y@㏏U<eLґ6ҹvwGIBBAdwdSHveVPwds\zo[q[=@;z"_~5ϥaJ-C_Zy|XұX/0a9w\׏xC͛7OFN-}̙*ʉCW^-+Vp'fm͛嫯R>׮]>)\؍7ʗNF(*/GW^C,GŽeE),?9g$J)Ӧ:aW>C{M"(X ;R>WgEFE?D-~k+>ޡDEG+4va9aҧԟIh-Zi,ұ.UkzKkiXT KZV\)'OVoM~gG4 .4 ED:ӦMh!.ch4Jʕ+W\S K')</fuٻ<]pZƾ?^:tyJE?k_k^hǫs.z!toeK[. ~Cd_,˖/;+{xX+:::X4uւA7jːq% CD4Q[Q7n8 ũ&晎y`k!oy𶾷e4ZY5o }\>y.Yg3Su\ᄀGc+zٖ9s PiNg%jϛ"Ĥ$0qǕ؁iQ7Lk阷n6Ibb|`],"]InCE۟f>?oۮ 'NH2za]!l �,mˑn^ K"w#b k}Dۧjhp5 Aopꡣh4Xʧ|%@cb tˠ/raM\VT7]jDsp71g3="fyxZːMX[S8Mx3ݚ±Sqi<π  HddŠPߥ}v/4c ,Yb ܲej5(h4ɷ˾*,Nka:*:Ʊ2AP0]Xh臺!Gx2<\>dpBpv٣ܵK>|1cwYAʁ@N-Nv9kv;flъ<دg^X A7 e?ѣǔaZu.ot̟/}ǏWB߰8qalرc\b w.#W}/Ca}Tm(,i4H\"-2*Z}6i,s*,8)igVƟ}kCh<ߔy㓪@zii.2/$DEN>+_=bh<utiAIΛ/mh?|S /S�b2>7u.G m-aHh4ZY7gU~njn]X"`O uMuOaSDZBv7tk<Az.׾_){z|0u]Pb0uJ۳FaIh4�K/I5%`_~2av4FWKO㉶%Y_E@Ѣk꟏0EeNi;O[FhfvޕRf%jJ: R +IaIh4we|||)U(’Fh4 K%FheAXێ%iVW%!B|wSJԬDMI"XE~ K;E!266ĉ}m.ǿהd˻U{`ur׮]~z݄B.,cbbJuz_˱-|g(yZ K m߽{R(84FJ4|yZ KFh4͎QXh4F(,i4Fh4Fh4 KFh4’Fh4V’ hf/4Fs7]XB)k-!؇’B(, !’B(, !’B(, !’B(,), ! ˙BHYR!4ς姟 KBrss%xW_ KrصKoڲ’BaJyxD$%!e_濚Ž.9sŋ0|ײ#p R,Clμuv3uV&k֭WjɲewSg[ǐ/TN&BJ. ,e7eܵ{;zT_KDb.G qu65qy~}}α !8eVVqsdVPN~<(I$' &BJ^Xj G_\xu 5XH3>cBHq #aGݢ׮+P%Da hqޗ8%b2xgs C ]1X5h=eg'&˿_y_e?JZ?<!4c7 :W@("vM!%,ӽVvo馂ATb7~’RU"D39|՚:'l?tGK:{;&}cLӺDDFn?7m$?a NG˗_S>Et4ٷOվ>pp8YQV&Vr6|f/1)I,]xOaI)²8#uaI!BaI!BaI!BaI!BaI!’B(, !’B(, ! TFJXh41bI!XBH`#{t׫QXBH!%!$(,^}BHYbֺlڴ’BCXBk- ZXRR񈊊&Mٳge;vT�yfWZ%,va<![a٪U+rvQXBJ={1R>!99mytt4o<233SnuL^t’Ba G7b ї^Z eذaRNe2˗/f͚*}ĉnaÆRF ߿dddcʔ)rwKJԲ'NH^>U^()))nNΚ{r[ mΝrwX%zk… |ТE(, !pthZj֬e[cǎ9ѣGKN$..NYe̘1zرcUz||n~ɪ JKK~ѽ{wIHHЗ=CqF 8 2ĭIN[o%Fq۶m ,@^z3<|P-g KBu&K.+WJ.] FIXX>aiܸ>it>?~\OJJ #&&D.\"TLPޱc4TnUTQvQ\Fs<%!ņ Tͻe˖~­jժIIXfnoTvת4EL5v-:tPMSTL%FI߾}e;*Ha9k,(%*/(, !M6U <"Gq8щ.i5Jz nrrrT/Pac)_~믿V?8%!Ҏ9r[KD}sΪ% :uZf# 9t4u֕˗ABj qZjB*h ӧO-={mSa*aXt KBE Ǵk׮uT8nP}c|YFE:w~j{AOgMH`F_~; x0a:11%! KB)++=z.ZD-[fSa)":<k(, !R_:B%!PXB%!PXB%!PXB%%!PXB%!PXB%!PXB%!PXB$ KB)G²eq~wXX^}Uٴi%! *|ڵ~&,): )yI&꿾+Wd̙??r7#<"r&==]z-{䦛nmÇUڪUd8x@KH骰[U-eV6Ү]; KBHӳgO 6l=zTdƌm}ʋ/(qqq)~wSiwJXjm4*V'11Q^x[p +LaiޞO8 ;woYի'sa'^a;vԟ͛7oU!#F}իeРAn#;;[9:u(4i\|Y,5kT'Nt>//OƏ/ 65jH%##CO -ZHժUAn/mǸ={䮻S|IX7֝2e}RR%>+>Ate-??__v-44護pai&.T͛'mڴ@O>IIIEOSX|8qBE,XXyXIW5RSS󚜜ܪBn),d5k;֭[˱c ѣSN*"�k߾3FO;vJӍO<Yc _~2|p=;K*6`�:9.xZThX7޽$$$%OМ=j(uPC,Tf@s"�z*,T5\~}9~(B v*fYf=*?ޝN𠸂t/":-</'+,!"璐Pa߹sq[U-%֭v+W.](50}q<=Ӎ?yj֍«ZԩSh`]l4A/꼱MLL \B�*;vfC]v-(UT˗i۷o/p3Qa^{54ihˇ*^Te=TBnܸq裏Wp>P߈o>G;؍Zby@Gsα UܖܰamlR֯__pkTXfn+WkUiػw*hU$:9!y[꼱IRxU&)))Ȑ!CH#GJ޽Ub??z::kU̪H#ZPIFwn6կRbl%,яS_S w}>Vh]%K/̂OJŽ #'Vr[4mT&X9rm{tE- Fnw['9)Lj>qքK.-;}<*zo ȕ"@Z)DgDQG,T!,/AuqR fV xÉ68>zk$8*�TT=fi :tZEx#Lú1@0}uD4PsC%n8ںC~Gz\b;hySXؚw֭jgӷx@MK='5fϞ@QTҪ-ğ\xQ[ 5@dΉ Wp�W[piIJ(c=+ Dc),IIT5?FT",QC35?A8уڵk{Uf|*!V *Zƍmo8uX}5=S), 藷h"}Lo k51,B3w%Y N+)a4еkW5ч~ۭoU%}Ew_DSai<(~XKgKo'DuKFIg4Zة/ !eT(ќ F-[f^Ykޢ իW/5Hn%9pm6>:DXZ+8hʻᆱ>+ނ K;h BywI9xw7>wV), !$’Bcn’B(, !$ PXB%!PXB%!PXB%!Wa4F3%!PXh4ZK^#Fs7 KFh4 KFh4 K@ќ+dˉ׺q4VLM*|̊xayhs$."Bwug?&eKDrSn?w*#eK\aY|U [|pq [FBn),O&e3ܗ,s²΃FmHiJ߿ovDJN䋹͎( TS.,|#DgH<%xΒW'؋H*U/92b_YWdgdǥ]Ĝ͖7\rz6 ڳVA#r䀫2+Ty( U[376S\VrKaloLZ/Cn@wW!X?Me^Qi,3ϩ9[ݶ|ٞ"IrTa!p=eq*;s1Gxb<øW>#F37H?^$ʮ\/ .D<| UB@A!=]j^"Eu vwITm)9}~yo&Rn6kfw+dUPr 7lѮT᪘ r 3NʌϨV^;rKa69IYhͮߥf_2RLEҿk t?%+c=;+B6 ߹jyLy@4˧9h4s[/M4F -[O^Fߠɕ/]\*VֽCb$e7eVM8%]Pfc9ҭ*׾"TZT샶$|y )Y9y+v0wkJõ_{"JاVi뺆W#,G:+q5V,u힇]k?o,QgcŠ(4ҜR<˵.K9Z PY/%U!U캇Q.G%ުBn),q+eK{�<L akܰs^ҍ#D$&hhښ^ f:Gf\8 @n^LXs붨ܢsűo ?rVͯVX+FAy_f_DЗӈE xew۩#F, K <h;:K2jD t툡bGʃ<{l?gp[쾋ӣN3b)nf-3N Wϣ)<p„̹w}Xr[ vi7�AcX}n <&F"FP±Na%,iu4FXI&^Yty._Kr(=< u*V})B2—m>kTGhG_fk+1cb(G},_EٮɃ{z`6lz^y҄v~h;yfϸZZ p9wOS_#[CqW*ܱ˰*.肁حSWKs']`j--*߁< 2Qylo|=Gc<D|5Ϡ1EbX[wRY7;m)y<T~q DfA!̦Ŭrm%fT:fUTPyu>]0 ! yؽnf3UwM9=w!ZxIC ziYܷVJB:w`xtMfii 0^N|`~d y@qX<]M`CmĭF<Ԁ&\d8дn,VHѬkE7|m=PtUcFX/-ɦ&h~/EsRG!D.1yDlTw9:Xb,b4k0/ݓwFfX+Kv>_,{_ CǜD%џZtRCITȽUmA4D(nv*Psut¹Ռ|X%-#ߩI٠6g7 :Ikq7noOshIQx :Z!/b(Fb^GCƻʢ4P"DžpE48[Y6�!ं3j{ʵU9x1kga /@kJվlguk#Q8=wOՖAủsYT<ޖP\r 7 JNBs8t 9ґF CEm{>J;m0F$Y z^VX+V/ҮWN*u 5 /-ʵU9AkMF; &iZSgJXZUGm_Vslv|T:=gjK`c_[T`Y/U!7pk  9%FXXʧ5h[W),i4’FaI(,i4’FaIQXh4%FQXh4%FWaI! KF$ KF$ KF$ KF$VX!} Ⱦ^}Uٴi%Fk$((kתDi!$DEEI&Mٳ$U6k,=ܹs-"%,,LO[j 8’ߑT[(,sY<zyy)-eVl׮!ٳ-[rt6:uKJJL:U|I=-::Z7o0as6[\wne8گ?/Rp%/_R3r姓e1%7r)'OWk92b$)Eʏ.HZf#mϟE5(²(om \o͟{g:?v]rĈ/[z 4MXfgg˰aäN:0etlSfM'w}rq5/*U51N8!zRVzE%!={Ƚ+nGׯzH|FFvmzzVVz.2B9ыv(<7%*,^3e ?e{"]KA+"e_l,ۛ&}"K@DQ,.kPޅ嶈tT`9&xnvm]D鑄KnBլk),ԬY3WWZnQȍ=ZE┵o^ƌz)%a.h:T 5=sLZ̞=[rظq\tIΟ?/C qk¢$|[oy'_TREZl)^xLyիLX˼"Idu]r4'RN;!q 9*C>#/ڒ}׋+[sx\̺"˯T:mdRKױ.xA؟ tN:?9*ӲrԵ0nfܭ)zྫྷrUf]Ƃ!6 WH 5z\#TκٛKD~p<}B¥+>EovſN[ntRԥKBQFn>,7vKsϩi3ϨyZn׼]pAn KB*رgzzzCF߄ioھ}{@aGO_+HCe[kQcQΊ.w{|:@@� ԗ9͋70(>R_KnjUؼe?6S^2R^tLGK]cuq{9/lQ_G\/1㬄98O;z.pm!|xR'0L/qP3*Gƾ#vY^g5ByW@\/MJ6i}6*CNgk'&CƬ�"hKXnذAZh6<hR26/a14tm{D RQhnD6lwҡCArTŗ4D'c4 ҿ}wQ@ 7;ɣ!``?&)4/:?Y#"Yj9/Xy&RF/;}>GH"Bd%,obls߉^<ut]˹HG% İ<5v&NXtF3n^5z\# cKU38g_=Ox.GxgdȢ gqMM6U5*b \yD08T5}PXRA_HH֭[U%(FQI]c# 4_~%MhhNuH5s")K n:aʮUYj/ӼX7D,9�4uj/ hov#z2Dc\kƦV˜S`!g.V6&N" ysg ssv E;csqi1{K8~鈄-,FEc_(XOr~ڴiC~'MOSn]Y||FFF<Tpe}+*貣ѱcG05З{,vGgշ{~},ݓ0Fд%z{I:͋}`�MTi $-,ah9.v"^B<7n}Og>kiY^6 ,D?ϰ]aX=vK$QR%B- TcwЇmLD"h mT8=!b4c׮][}^ɓjTPƗȚ5k]褰$0`�YhQ.3fiF6r!ՇoVUGW�HDDDK]/ kOs?8�1xAw_o/IyTBTbP'Oۑ7>0x˜7qџI7FZ^ERXB:"I$+DeQЈ."rT~uN`ԩCxNaacY]g5B:Dm))WRDhͺvFInJ?@@!b|GW޽eٲeVXb*7FЏ Pxqd?tcC%F:'o!-׵䋹j]cG/QTbp1ON Dqh1cTNDch.,DVXjq_0jŨpoGc2TXZ]g5B_S%dR!,{伛09{ٴ]+DrQ @eT7|S%&&F5Ou'�yFeh^lx)W^;B%FaI�N!4%’B(,i4’B(,i4’B(,i4’BaI! KB$ KB$ &,"bƊ+3M(, !8%D^PPP?ޢ_DEEI&M}k7`7o.MRR٬YTڪUdR\²UVrJk׎’RS ,OMMU#99@ʕ+s^-͛7$#F}իeРAn0;;[ &uQi,&g뮻AٖR~?{%77@Ν;;ݨQy#++KnV KB).af͚I~~Zֺuk9v옛�=ztI┵o^ƌU,]MTjRnK)[>"*m۶h_/UT-[ʾ}4իSXBHq KЭ[7YtjRҥKبQ# >,7*,;c W/nږR~Awǎ^ƎZRHOOWRcl '6l-Z(~bjժIIXMXYw)m !jժIJJ״}-qi3RXBH1 KдiSeZxQF,}}ĉÈ%!t״?j[J2ɑ h$bfi#GtءCPY7!!A}V䣏>-!pi5jԐӧOXH%33S OTDѥ̞=[wnzL KB)a&Cꣵ1ml.캉*JږR~0`,Zm Æ hg6m7xHDD%!$ƍGW޽eٲeQXB%! KB)LJ51q=*zRHaI!D(, !$NFhf&,i4n<i4Fh4;FaIh4Fh4FQXh4F(,i4Fh4aɑL4Fh /JRSSŷyB3! EK^H> B}%B}!>’!/B}%%!gB(,y̜R|O?AuDq=r/,5ˊ<rss%xWż?/ <s!t TR,²op{9GDk!E'LBaIaY(</Vl)i˞=rqBǚu1,[~׮_(JaHrm+˯IМjZ9s߄+,E/ v,v7#a)aiU=4ϒ$1)I_'//O~޶]̛ﳵDJ8V'ÕHI9+J7*aoK{^Mni.tZZXiι�;瑕n VٖXpQ O+1![X:YHXݸI]wGyc)NMZ /ٳoZ4柶8U2%T=4ԕ+WJ_L\V ܄Ӊ|b9#aGݢ׮y=akTt\tv![X.y\ԋeɷ1aailkPvz",xcaiC`T6{ND={TSo߄b94Qگ2Br/_!R֖/p=11PX󳿜㵂! K;eێiNR-,=ťSQTXnqwC'jtai#bj֌ �d=$R_B!|K;eێ"~ ,SRe|e!4T K!gSXco~Bj9IJY>Z~E|rL~Ŗ!}aiOt9}wNNĞ:BʮSh -0mW[y.Q a)bˬ'ٳ|mF:99E~olr2:~uaVBʾ'Yr'`!SX}Ūl@V-vi_+yB3! ny^@aɗ!>R}¦-?IFfj Gr’/ B}!>OP0BE`i5KBAO(q(,@B3! | ! K>D! UXdi4FhZD, !BHTXٳq=z\q=m=F, !BHG,Is5"2kJ(,KSΝ;7,Փ9s8PPPk׮ʑOQ!?~ZU&UVGyD.]Z"²$οʊIӦM%44ԧ,.wAm۶.:BE,}]'N=# ,4{~[jUoڵkWeQ!^ tY;rԮ][>sIHH,ٶmٳDmQk 5zm߾H?,wڵt^|/͛'mڴL:I.pqf̘~G!!!!իWˠA܎-Æ :u(4iO,5kT'Nt>//OƏ/ 65jH%##COGME*"ѠA !(zYʧs$"Yf2Ç ]F}YOMaU]֘ƹV^]֭+|G8xmٲoW_}U&Lk)SJ*hsjܸ�XIig ~\?|I@ץ s'[': ѣ;T_s9oTT4kLղ֭[˱c܎ctI┵o^ƌ;V'O,;vTү_?>|y N8<V|Z#!AXCKzܸq裏ԪUK 2GXB^pAK7d} o]?_L{Vw"/m&M6vff̨Q䩧R9JXy_~P)4iDX:I.*W ę3gG^~e֭r\+W.]8fFT? (QSgq{4ɠ֡jO>]N:e܋<V|Z#!AX&&&󙙙r7۸ 2GXjTa9 7?zxby'y%K+&&/߅} ڹuVk`g(vץ;w&pD�t thONNqݰajjiٲ_1Dat2tpkVWc޽֊5:uaa0˧9R2eW_w#,ЗLM]vu;+}u]n#VtAz ?҉NtcduFXiNǟ%GU}4~@qpb1k&{˧s$ KeW^tXzG#]w]X4_vz_}``!|JX6bi..:?n!^tBwi#GtԡCE`X׸ԩSղG޽{789�cyoޠ9ŸY>Α.,|"�>Di}WqK|饗 ,ʷb… U$#ыBXXO,oK':}htDȶ^x;ih~:t>#mQ#~-[ԼysYbsB C4_lܸYbde y Q˙3gpiuTtaY2VrM7O<!?2*a4CɦM ,߼yos˖-SSBX^av}R\ N?B!ʽ A KB!o͎O[(’B!AH|M᯼�KB(, !B%!B$B!’B!PXB! KB!BaI!BeߢBHy'PXI1nT`ڵkvrv΃Re龝|t֭UV$5kH۶ms~wK/$IIIZwݺuҡCZJ0`={²#kժ\rmyvʜ, |Yy'eĈ꥙-7o~%)wo^;9w\xQƍaaEA7==]Μ9#tڕ²(%UHHl2h }‰ 6Lԩ Xqe<xԬYSO8m<?~4lPjԨ! ==44TZhj 4`=v:|9GBʋSN8!zR>ZjҳgOIIIqϔ)S_UTI-͕ѣGKz駟?k,UP~a9|-h/c+<mVyv3nfr !<7t-㹮'x),PXFEEIf$??_-kݺ;vmp:u8e!3FO;vJӍO<Y:v쨎&ÇO/]T9Xvrn:+aiOs$;e7ʥK2d8p~w. >@E>#""Tz7ѣDGG+ģ>j[Xm[ ;>N}*^ӭguO)L0-Kx[ד+Vn$E(,Anݔ`Zrtҥ>5j$aaa<jݍ71nǏhA-^{ӧ˩S un:+aiOs$<Ʌ TtҸu>QH>r7fz˷+,͎g Kn6۷0w?{BHi7ڵkP9Yw߾}߿?eQ 6&ޖ-[ 8YYY<,ݸ=iʕ]{* {U5o]~0f:GBʓ*kwV$9| ~iGNӭ|Ea/bF>guO)VQ_QFnڴI-[ܞ24mTX9rm&M +pl¨G Uq^*h z˧s$r5|IMMU}k%PY3XcF, CK'fqi|֭ZGEIzd׮]ǡ 4K9r[#zG?RΝUK5n?uTѣjϡCwzz>}G�Zj< Og,VHHy54T/_#GFFA#Vb?T},>E%,+_ቷ}Xש@1Gn~m !|V qNNzXZh#(, i^pd4Ĵ }Ă Fo"�[S͛7Wh5.\jۈy ̍Fͫ?灨FnjgΜ鶽Y>Α$,m9*U(a%bxwUs| Fc|'au\>Y4a]YC "?{BHiaɒ%j_6Af]o: B!$ PXB! KB!BaI!B(, !B$B!B!’B!PXB!BaI!B(,ɯ!ůпBaY.YntAww) g:rAAA]o(kg?Ey^z), !EB۶mM[~~իK5_Z)<Ja(,}O*?S?s]:rZ+W-o׮]Eu1''G壏>RzϞ=2o<iӦiy/e˖ z#<"#Gs){w2 K\xQU91BBBBeWAl6lԩSGL2x`YJ8qyyy2~xiذQ_222PiѢ6h@(fE}ގa\+vΑ$,L0Awϟ8qBzQϞ=%%%V9g͚#Ç'Rvm7xCe*o)SJ*o&חǏ(oyD40裏7tF.\P(,mb y$5k[n-ǎsqGN:I\\˘1ccǪx=ݸɓcǎXxX'ÇьtRUMN":+aiOs$ ˈ;zH6n(.]ː!Cd{=$::ZUƍ@k`~lqa !$vҤI^qDc099YhU>�QFe6طoe;ݜnݺ)GrJҥKרQ# Ahܸ>it>uh$%%=#ӧOSNzyX K|Z#!UXBϥ/!o[Lҍeȑ#neت[ q[ʿBΝ;U8Zt^h`r<*xk-6V),}i&lRĆ T&_DTVV>i,3K7nn4 w^w k;4˧9R^%"jwޭK̍iy7.ôS_dL7BH`A6Z�%ZЯ(,MXhk.^M6U9U""oҤjڲFȺu˴~Nqx Bȉ[>#!MXb�*%55U ïrdGX0D,Vx?ͼS>Я[=42[B4ЯsnO:U-C>СCһwo=O>q# /e DB/P灇}з }%Ѵn,VHHy*R QA-芣|rՇ`Ȏ4LPZqy;#o8~V&<),mz|~(M?CGZb4'h^hMoѧ oi޼hpBCM\okͫ?FjUgΜ鶽Y>Αs|A8Yf*'UTQ_ ȎF߼nʸU޼ʿBWXA?;o[w'O1vzJU), !BHAaI!B(, !B%!B$B!’B!PXB! KB!BaI!B%!B$¿<#Be{۶m[ޗ^zI׮]0 <B{Y󴢨HZ]?OHǬAΝ;7,Փ9sPX}wɹsŋ2n8С#ݪU+rvڕ9aYTA)~FaI7oiƴ['N=# ,4{.rM79r#F}իeРAn72;;[ &uQi,Ӹ| <Xj֬'N}^^?^6l(5jԐKFF*-ZUJ $88kt1|9R2e}RRBc$ԮO>Dj׮|o|!X~}9~xm <uD3l8 &H׮]$YfnZ;vF-:u8e!3FO;vJӍO<Y:v쨎_~2|p=K*ĀG+qV,VHHEݻwBXbZS0L{B^{54i{A"ݏ7*/nRXp0$uʕ+K.n\F$,,L?|4nXǴgq|P:4? O.N(f:GBʓ1c阘GQ Kc?r['vܩxA+WV3g(ӧvpႊ>㎅ To˖-en$~yLcYqoQ\ص^w^ѣ~rA7y{V,VHHyvrPTX^wu1_JBHGQ-N|/TZ5INN!. K' hڴ2O�M4hYn]}G8/L}>11-vϑ ,=qZ>>9x2}i,fĒg|X MOc)1 K^x9z!C8ci'mȑn}1jԨQz:/`(qSe+޽{M# ШUڮ8GU#O}дn,VHHENˇqv|￯"_n4)LXBʆ1[ |Zwk A K,YDz!U?tvMMM :t>&% flDo7͛ˊ+ "h޸qNիW/ԈP?9sf:GB*tZ><Y�T .D/FS_믻}R] $(C!H_NBaI!’BaI!’BaI!B(, !B$B!B!’B!PXB!BaI!B(,ɯqӧB(,(m۶ux~PPPk׮ۉ%`g?Eyi*V۳,R1XntAV*wy 0@Ξ='//(5kT>vX K;̛7OڴiS(a٪U+rvڕ9aYTAW$'|R̙3kI׮] ^~eӧ$%%){geܹfI#F}իeРAnΖaÆI:ua4._,V5O8m<?~4lPjԨ! ==44TZhj' 4`5>o0.O;HHEvڔ)SJ*ʧ8qBzҫU&={ B!/^Tܛ=~=P&M*TGEEIf$??_-kݺ;vm_GN:I\\˘1ct<ytQ B_~2|p=KOll {;R<Y>Α$,픵ݻKBB|C=$7nK.eȐ!2p@ B!+VܧDM7ݤ4iZ/!,yիSXbΝ Ѳ KЭ[7%V\)]t)FIXX>aiܸ>it>k is=2}t9uꔣYJX )/NK;e-&&gY)\pAE? !}~ٽ{<o_xy畠W: K_<#**Dys6lPM-[~yLcYqoQ*WkUiػwC,~շ0f:GBʋfi v7v \=BHaӦMJTnٲ6hM4F$SSS@?P֭Ka$zD\mڴ2<rM4hiZ8233D[>#!AX:`S>|@~9âE^zk.G~]g }+Ia�Kbȑn)5jT;wV`X׸ԩSղGN޽{ 0iԪUKmWqԠDӺq{|Z#!IXZ5+aiSP[|jTy(, )`%z{Qq{W :TOG38|>;pBեm²%p66Sc6B͵k:*}n͛θو!blt7>`k3'N?9sf:GB**kVʧYF*U%!x3|~ȓ%K|x%Z3g ap>c>$B!’B!PXB! KB!BaI!B%!B)ja4Fh4Z’Fh4FaIh4Fh4FQXҊ�F+K6~U:_u4Z 6[_.ś'NT`~;@9[;)h}Ŭ+32]ύ h.2x>GF,>U}>(R~<vA2s%J$}V!zvԌ\ =zAEj_ƁSƂF ۟Lʒg/?YeQF^̎owʑKe#?_k }loz9v줼)%:-^=.fKȎJf_�AlԿfy}ù؟&2(4i\ӫS ٚ}WI#W䇰 wIDr\v8\̑iWvk:|9G<:yVN~e~@<ħq۠-ɪ9$9=3K̒Cb4ʹ{nM1f>ߘ,N}g/tY̏{x{mI9ZVޯҫmQvsWXjddܟS MY(ظ1gg DG3j'U x3uVj/~ 5ovӿk t?%~W zvVlt \BPKG ^4'R{e JXi Jɖ-3Nda#2]G.s`{įOF" w OXV�;K<: hõ8{Y̏ٹ>{|ߖ.N~btVW9KA':oa+e&A [}i_'G~{b2 8;h}Ӯei/.+ͣ66|1Wfm:\aqV/9|Z#VXr9_y@f"e9Qj=]!2m,w(f>0>N~7 Qسk�Ȧĸc\=cTbxiZk DڽU+`p9Q9~kHęl<EICdXf˩勲ߺ$hCQ5l]Vn #,=Y>ΑF+MTpۄY|waEt&  ҉33FD#SVˏٸ>pɋɺj9D/",+6̢,`h/6{14]@%q*^ҜG, D,zo$FCK)I{˧sʫDYDEjj¯HSXw2_Џ_o~0Er<1KvVƬգ8I-'.3ƠK ^ƴER *M~9{4{sZ<"Ĩc48:5+@OMiu4Zy(:H1J$z+N">1yV*ޖ9 jX-kVʏ+U}gY ȵ9Sea} 5Uy| J8"vĴ8L4>=i#Ѯ<2AOG!bl �0vTGtn^9<|A|iu4Zyܼ|HVKu=!ϪʣV̩o;r|Vʏ+џ4Zjm+.-֒Hh4!pZFI嵠i_:h4MDhVgx|RiU7(^%Fʴ!atf\]#0n݆x=h4Fh4%Fh4’Fh4V:%!B!@aI!B(, !B%!B$5\Ë@)~~Basr7KzdΜ9jPPPk׮aOQ!yY+rgv\oi'-"*_ \ -CC#e0E&AAAe""$dhоp,!p| .ד+`$$d&LozuNԮ:d~k}+jװw}W:td>$m۶uo۶Mճ%KJ*UdȐ!믿h,sHMMjժ_|!.\ ۷FiӦr۷w2R 䟺+W>zƒ Xblw߹sg`{U9s 6LvO_Χ~R#5n8Yjn2|p yM=zTTI ֭[2b)[J5kwޕӧK͚5˵k;wJƍG5d幞u7pCw O7e$K7um N|۵%dunyrСqqݶA [L2ҫW/9w�L`%%%%:ԝ`|ehL 0@.^&& 4{94kL>spN:ɉ'$..L:uJ2ӭϝ;W:v΅K~dرf:n:i]^Utʧc馮7)]㦷z)0N6MZjtﱜ9snuԨQ#ٵk\~].]$#GCzj )qٶ{z/mڴ 'XPX1СAyIݻ}ӦMժUKe<׮]\gtSOOV=^pdffD:cO] )(M]s[oBSvǭ<uꔹ-J ^*" ._,O<%)TٳG cA${Ys_Z=$vء4i"۷ou!1s s;vPBEUikʕ:ux`eK|HHA2ބRt[ck^Gxkuo>59Źi,IaEjoQo 'X!|I֧`%_1JebbuUCM:pnkU\\WHV40@O.nHHA0ބRt?vmXzM[rJ9 ci )팝ճ5k֨{ 'X)O/˃mM4'.Oԓ'O6uuux$&&LG" 7@ *T}]Gʁ*Xf* Ywʧ4cބRt?vmXz==n  6cǎ<ci )L T/$p:߿;n0\3j(s&#>[sbV(PbEYሣBR%aÆ*`ժg�=hn<c)z0+Ԙxb+#!X:՛PꔮǮ-KڻJ<zn۠-[xfsDu!!ݱ'XB!@cI!Bh, !B%!B$B!ƒB!XB!KB!BcI!B%!B$rBBc)S˖-˵~֭!7Rj'  ޽{[n{ms W x-dݺuaooM.l I~a˖-Ҷm[)QTRE(O}^( h@z-OSӦMΝ;>۷oeA7~5\UڳgnȑG=c(+VEɓ'ƍ{nիWۛЩ@H *QQQ~zx\rEM&:tpgŊҲeˀ2H~i87NVZeۼy >"ܼySF-*URg\1Bʖ-g͚ݻweRfM1x`v횙sNiܸaQ,_ܶg 5ց馌wU9sseGzFF>^_Zjɽ{u?:/<9xio<8y'"EHܹsf:z+T0d6j޼:t6ߺm4?ƕ<0^*KX/\ իWpqFPy}MKKSC\FcجY39|E2etIN883}ԩ*HOǎչׯ;LGW7z[ј4d=(X:SWFB 0@O Nj/h>̵iS}hҤz`3رc<SA)._'iܠB)ۣG ;c 3]:U={T +zyZjX:m;ydyT^.]X~3g4vaÆٳ'eɞ%޽2L6m\OIII2lk׮m.uz' JI٠ZjpB r茥S>ue$ aXjժ.W111tROO?U=/:G0uXbjZw{iڄ@18~|1 cİį^ڱ:uꔹ-J h,s|g4~c-9rv#4aTuE31ċ۷*6uN`ч-\rRNU`eK|HHA�CsA0 0:I3>?S}@ ={V}ƺ`TP�/7Pʃe0:ӧa}ݺuڪ@fNaBm:!˗/QQc4Lг>X |}]ԯ__hBDu4!*sc8r:ݯr1œ~vt[FB;"E oǏ^C߾}0b_y啠T޽O>qltm&;.zcy5 iРA d%kG [vK6@}ҤI>qI �qKA%mϟ?_P=&$$$a3 B ج!p1F5BL0n)2RP$9ԋm۶e^k֬ > {'^&` 03ql/m@M( t֭[Kv믿vg8%'k>KcIWo N1n'ަK 5#LJ|'31 ݬp&"{yFc]vixǂ!y-z/0;Ҙxb+#!İ7˨0�̔C),wH p8[@6)nĐg8%_l})^8侰vZiԨz6`rfxy,%!^ d<(?@CcI!@s%5b̘1*3񚤿 ƒBɏƍo!x k> $B!ƒB!XB!KB!BcI!B%!B$B!4$:Bh,ǎ^xAXKølٲ\nrFq"YBo] wֵ@s;Y%$tڶm߲eڦDRJ8p>}LwH?;je�Zh!&M/*jiӦr۷w2R DLzW6TVX!-[tGEErL6M:t`/]T4i"iiiJ|r@.]Z}/_V4HƍUV6o,Ç7oޔѣGKJ nݺ%#Fe˪Yf]>}ԬYS=1 <X]fܹS7n,%K5jm/Faw@tSFB p႔/_^Ν;g}TPAΜ9<o<)֥J޽USLի9 y7U6]Wum<K,Qmڎ͛ˡC+ӹ|O-!y%իW\uͩ]z ܪU+@GҥKʭO<YroР5ܬY39|υ2etIN8'`ԩ*=++L?w\ر:~,cǚ^n2y2dOO*X:SWFB #G3f+ڵs=ɓFɮ]몽9곏A{N_]+OϞ=%==]U)ӹ|O-!yaÆٳm۝@uk̙> WgϞU4@#`G4޽2L6m\VZd.iv2>[Wz0@jPZ5Ypdffz:cO] )(Rc8o4``՞ zݬXvbbb픮6NWSNRT)߹Yvߓ%Ag5/>�¨đ#GE5"Ŋ Wi:rǎj۷ou!1|s s)ݺ?Q\HikpD_\9SOcj9t)2RP4}BݺuUc\o>7ajb9`YWuW{ԕXn@+`#^| х6mژc4Xԯ__htBDouX0 FldʕunU<Л`^]>ݖ`,3ݻeРAkwӕ+W$=Z٩?]Wum\8Nr=ڙ`@#TXzt4z,'NM3ϭx"y إK%W뒓U|BBĘ鱱F [ժU4cQ|wBb0n)2R%hݺkN됍%6lؠ1Ԏ *X |vJ_]Nc+ӱ|OvǺܿUo1č05[c,1q=?XG}T瞓G&aQF:,F qT~A|ݬp&" jذǛ鈿Bz 1sգ:לx)z01cӘxb+#!X>#N*cwա/^\ocF;ozSڸpK]Y!w]VMZ{<LAOFǏo{„ |%!GS?OA5TYqD0!$th, !$W<jؘ22<C?IM*$XBHĘQhѢzf, !4B!ƒB!XB!BcI!Bh, !B%!B$B!Ʋ BBh,/^Hٲe|2uT erߺuk7pL' 5;crB&m۶%JH*Udrim.L244hƪ/ziӦr۷w2R V$?dʕ+2m4СCXu䭷ޢ Dr̙32e֭=5ƍUV6o,ÇX7oޔѣGKJ nݺ%#FP=H5kwޕӧK͚5˵k;wJƍdɒRF Y|FˡO7e$0K][cL2EW.=̙3LKMM޽{cǡW^r9Ƕk_dۨ͛7Cz.]ڶ^{5O?deeX:˳gϚ0h$ҤAr=YfraSNr %<MřG:.nܹұcGu .H~dرf:F>##C GrnzNԕ`,um}jѣ3LkԨڵK_..]#GСC]MٳBjՊ̙3k׮%Ba<,Xk`ƍ'49_^}Ue(W^yEz!7ݻ+ôi&ujժ%III2k׮m.uzIJJU TVM.\(od,O] )()IG׽/_'xSNRT)^tBp{SbE9rٷoz>ZAoerr2ϟWfCڙ1cT\ٳܱcmҤl߾=Wa7nuN8+VLhѢ*  8z [N5&cj9t7&|HHAiе:濿4gθᠾ{lr$FBڴij{&ڍ~ݭ[7}i,mXh2$ׯd %cݺuVs\HVdKa ]>ݖl,um-P%rJ@.kVsĂ#<^"mhB;KǗSWVCPnִI&&`f:bt lkjܟ 111f:fG [ժUʹ *8v]BG\b:+uNԕ`,uma1ǎc 6!/c"u_K$$o0?۷o3S}bQF-[Ԟ2?\vY<5 CFPlJ|) l Q!nV8bR5lPtb7C7tkk(3AYߋ/)2RPS-1H&Nb'qyix_լq7ImOcIH`ڵj?:̆ F(}#x;1܏i, !BHX$B!4B!ƒB!XB!BcI!Bh, !B%!B$B!ƒB!XF)m6Bh,uxܻwO~mquy-[k֭[Cn<9N$A@v)?9m>OckȖ.]*M44%|^|6mTܹ㳾}XF~pyKB.+V-[sR_i,shѢzB>jqǍ'V2m޼YsΛ7oѣRJJunݒ#FHٲeUY|{L>]j֬zV,׮]3w)7%KJ5Ls)#\M )mޮ^ڈH@ƒs^h͢mi,5_L2eܹsٳgհ㢧Azf>2etIN8%qqqfԩSUzVVnܹұcGu.�'cǎ5ӫT"֭S ~FF 2sI8ʡ3Nԕ`,#u^O$./4DaÆٳmnKҥU{`\#4-*o6Xb۽{we6m$ѹYV-IJJ2:$k6?ݺzԓӧUAjd…(O] kdƒȲg5]s-:ۧFunjCcKc5ċ۷:'~oܸa.39[/U20ҳgO)WԩSgxߋ S>ue$2:'u^KB" 0y`1OXԯ__V 211guJzz6?87*Wl+R}+n8Sl{|-#!XYuvƒȷ3N?{[X,Yp7i&MSСL<LGS.]T%mϟ?_KNNV}$&&LU?`تVjUPAw?S>m4l+#!XYu^ڈHy|BcIȃmw㾍JeiQF^csxB?~օ&L=n0| a̬gb03(+Vh;+]*Q4lPիW^bXk׮]fQ6/?`ˁ_Yߋ/)2R$8un6"Ru._X7hlvZiԨæ (tƒB!DKB!BcI!Bh, !BHa2%nv܎q;nc%!B oʕ+)((*h̙3EQEQh,)((K((*oV ><޽[[H)( ۶mg, ȫCyKeϞ=ac\REQEcic, .IX͛/_VyTH,pLLSEQEZciׯGL8Ge@DZ$L$SEQEjcQ:cQXREQEcX^z5rk׮:LMMh,)( `,\5}Zzn9GcIQEQ%&ޱ}bIKO&sX%EQU4{'2/c^c"s/X^x10l|4g={VYսwLKu@V:cyȑ\ěiKN]P]d>vǢ(*[AZ] JJj~iҲ]lA>xZ}QiQsVh(K;(=΋ǂ>pB.}K Emz>/)c@kȀ?Uuc,1:C/CcIQE} ," : 5?_R+sU/-w&O UcYz[#Ne}<|.o<2!9wMiPx//N)@03i5tXv^g,<Y 8kߥw>X4EQtx4k\7@kÙcbi|LhVV=kש>cL|+~?_>O*:.Zc@C_[ltՕ 1y_͞y [PXo$t|y8=P+zʑ]_P0͛eÂ3CiX̓LNbjBO08nffmU؞ƒ(n >]$񦹮y#2a2oPPbL8L5w [uVcXC*/=X2`jӱrʯ|MN�dK&N 'bt2erWqSvEKs~1 ]_x98cy9 ۪/оa5p_ǫVsxKt=%EQTqeGOɓ'e|X3ILLʕ }e`Ewᓇ))2:Elej@ϴ)WK_]yu*С'n2s}0#2'_Fln;}7ˮ=_̹}"z&^\&[g,1)G'_vX[tk5xN_ҼnOcIQE 3_88UO&J<׽0:(O8a.sSfZ5v=IJNo(P'J)bs-Ӳc<"!Xzy:[mg2DKl6K<z9'ƒ(rc.1l51m Wv1Ic+/L&ze f64;ԕ.k^jh=^18NB|7>;/?5x^-۶2eƊz֭j4EQoO}aB !"~c ^f2S8nQ]ʹf92TM5#cׇ;nV'EX C (O,�珛6=K]ѣ[_l*{ݳwe8Ca3Wayt{jYeklMvދLKK˥ٟ+!.>PypEcIQU8//b6qJCg|02G3>r~S݇#_3 c̒gPΌ`w'ǩN ifs:{,sd}ף:Y̟?B6D#zGanP.c+;&?+(_>/ˆ\]\gcǂ3K.Y5k*siz%ρ xIsB:j,ߜJe~)Aݿ}CcIQE}gt-|2_|7Ɋ޻pC;v֭[u\4{,Ode)3*c8lU;~PyWCᱯ4lm%EQ_ΈliINLQ*z2ba*'mB=% [!^!#3SJ>4EQT~0 pz-Ç@ۄzXի? XREQE`,I6^EcIQEQe�cH*砱((ʃrڵj:5`uT@D^&D@)))((*r޽qFe"e`,eW9P!#Y7((*ܷoꅃBW9P!#Y7((*0cwܑE<nOQEQUh%EQEQEXREQEQXREQEQTGI..����IENDB`������������������������������������������������������������quodlibet-3.9.1/docs/images/tagedit.png�������������������������������������������������������������0000644�0001750�0001750�00000141700�13112005742�020264� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����������sBIT|d���tEXtSoftware�gnome-screenshot>��RIDATx|e?ֵ|_ڻe翲?YQD]l,G)>"+E4VUi"ENBzO'$$'0\ΙFz]3}瞙\5:IzzVZK. sY˄Fh4F5AA_bŊ8B!B9}@y,4۳^QQ!4Fh44ډ'|ӎ4xVFh4r }͚5kҥh4Fhe˖- `/geh4Fh-Ϡ!4Fh4:;Fh4ch4Fh4Z 3 vFh45Gh4Fhf4Fh4Zk5554Fh4;Fk x1'hc?坎ceeih6+ثi4سo?ordfTnc{dr(E/#Mz4֌F[_d0)OƉ''0|y55Ƶ@[Nk:m[[6`*5؂ȲџG{Sy0xȵrk^F!v6 㘮#1F9Nw#)0i UUU4nL/5!ly2i!e{>z\:a=zئ~ yCe{5O0wMþ]᧔M߱eR/ R]2ģ}bq1d t7fL),DOYG:Y&_y{l{o\2b/q-hSȱu{a= vƛ>5C@oڱKSe?(7x'2eWpD>|0~Gj~ (/ir/iyJyKNm>-2>QҲl+c?)gcY.EK_R3eĤe_u xfO&= -;OK`cZBJHEEGm/7Zn-Pb⤴mFk.Ds}ߕwkC5uӧhbՄb5]Hͨ9ꆋy辨X5~Ƚ~&1TxeU6`= =VK+{m$/5@*]뀑.H°~9핗+Tˌ_Kk(2Fu7\4+!qOxǴnFۛ6`㚰u8KZؖ WS ]L-[ڟ޴Tфi>Z./qy vx_4Tx捎Cwl{9)ZG׋ˀƩyQ.e%}t}}T*̇'5XWTTh4Z1_H-Z[{1¥+K"{ȸYZ(Hv3Q'vioo}ǥ-z@z !% Pq yTo)э鱜,r&eWpʂ{>0i;Fʓ,O=~е̇ȋG>L;잷x*aQT;tgik7Lt _\ۦ{lھQXMDKzVHcd]ϪU뱜3rA(mFk9MK(* :2:3i hbn*m9_y&aHw ZN׏қ;.Mk`I[ϻ;Hnh6j2mʧAhm(i4 "%V.dk(&yi42F5/[pefr<h43 vFkbC;9:0Ik(;:/q<h4ZK쥥4FkBHoVFNQh4FhA;NFh4ŒFh4Fk ph4Fhf4Fh4Zk%%%4Fh4;Fh4nh4Fh-܂oh#GbFhanNF}׮]{nٳgݻWYpp0Fh4O4;!M(qHhhh4FY2hhh vBPb HhFh4Cfv`' ;.4\x'4Fh�� -ANH vŗ,))Fh4ͧizZQܯ(7NH{i-9!!A]4Fh�� -aIk( 1eiu"ܿ'{X[mh4FkZ۹kr|$%̇i^vh{}=wy{.t2wi4Fky>},e  Ш݊=9%EVJ~LG(밶a?+7N4Q5ejo v"O`Orv씣GJxdOv vb=&&Չook`d?%՜_ɪV{f̚-;OaDtN{)m,$þlJ5,-U5.юe+#mP;nNۤH5{=dͺujj y~ r 4^5TW.#mP[fGCu׏[k/5SM_G>!|8Lur5ڰ\~^//G|1>o,[6oq{+7OVZQ52{\}Y_Α-~`>Ÿ'ؼ/l-׹zXnb<ʅ{X.jY=!Nm8uWu~5Ha;w.̮9*x5Ei/]+**{;VI|Ȩ(%#%Ƭ c'|"7mV)ȏ?2nڈT߷C8e;CU[?Y#o{u?5i 6i?\)ۙz`|J@?4H/_0ڴN8UWqvu @㡡ajxނx} v:3/_Rö;8^B>aZWHіVw= lz9+eklne^mQƷn.r19#7n#: obJ}Fzy.O>ֽdzj́7{;,y}pi:̟zr?,TӴ1$>\_hm^_^AL׮Qb|N`ij�xjJ:31'M[uY|n8s d[A_HW5\kmJ;>[h!VE,QKG(۸`7|`?_/W:uRb\̑tz=/z~%}'>֧h i%۷P6E\O {OدUbU|tjag^{06^1/wȹϹ6R[g0;!)1M$OSU߻y[e4;΃?ڰq;s(`( krJIathX;f }V  v:Rg׆.)R:{vb4kq+eklnu\L!&|6ɝm)qڵ^ex%1zZRk�9z*7lPNb^gi! /=rC,+M=OB`7`_q;]_M>r؛R[@7u?`o.?L۱sK8� �x9VuV؂>)!{[_;nس^b`<|Rק|z=tO+l몇 6Q4P/p=~e7J[A/1;ʁM7%):Cz>T v|(i,qO۾c,a^O +>mάlMK>٭#!Ӛ =@ HG3tqh!/vHش6aO>Qb+\zmAvյuCNgu vBZ`%OM#A{c|9o_.Wp !%5ƺh۾? 섴B]񣇝Fha{poǯ`4Fh4Z13Si4Z=Fh4;FNh4‹F`h4FNC?\t4: ځݢ=**JTњ9Zs1F5A3@;@C@K .1.5R^󫬌izAQ_A T$c{qٶT^YAQҊ2i4ֶT{{d_g)m&l[t/>R&ϓK^sb˩(iEB! 2v!8M/P19 Iɯe?4Y["_aӌe7&8ny7ۿmg_HT ?ɒ"²2e?99]ٽלt9~"B!YZy0mN/\y6ˬaX^,+E^VlY/ KB,Tږ`7ڿmowȋsefPT~O?R,0 Zs7EUALN! fp iT Wd{~&Gu^|1y?68߇]Ӭ vηm_=?G>~Yϲ<]G[ELN! a74ti$>%k}oH Š%PE2;!B([V 6ofcؗ]/ڑbCLN! vˆSA`_naG/*KwIz@9rQSaϮH"}aǰ>~{Jwx!8S3B!þ*D~4]#PAn 34Y LqG.𴣧9;DcXמh6cU}zΤ%Fʎf6%84 vB!PK}㿨( !BRlMLmsqTq v;!B([}Pʏ?R`QB!F`'B`Z`4FڇQhTEv;]#mBw vBH/: v!6J!PS 6J`'PS  vB`'QB;_s$~@`o! 'NK.2rH5McҥK9kzK-OǏ=q14̿]!~ ṽ}rK/$~u:ٸq<N7xC xU!~k el)9݂}?hqL_* vBϗ{Wax…O<lڴI˕H߿'M${<44T߰0˔)SU!!!rw*۷o_&UN~Νep8L&L^HAw~|Bt]T8 !)hHK1]nݶcm8oB;vT\Ý:u<E]di6M*9~/sϕӧqLJmmL8Qnf۷TTTnwޑɓ'+v=?s@ˉu<^jYn*綾^*7p޽c٩SʕW^4U^.^mH'߯w%K^ٶ;Q<,eװ?vrJ$.\,]BE-Xs=Q8\s!do'M"q/E{ZjZ/1U+Ƽ!HC| ڵkG\zHr={ʻ+ ۂڵ򗔔H>}dС~[SS#]v*05`Ȑ/28PJKKeѢEr6~}y,ۭ[79t2 ?v :{á;z}4My�|KՔd5/X?<2򔗂aR믒r'8=?*&n`uڳ4`kTjZOMKSnG7##~gzx0|Yg\6O6bΜ9/au]{Rr�Zn;馛nwŊ*]Gvʕ"ثTNe-'G/g%))InVۄ4v;0[{gf$fSÉ6_,KTVVBwيj"ڦK8`|\3?,[D4`OJnmشΡ5ξڪ xk!! v;w*O}@j_%/bW/ 0D@_wwzد ZNc=a| xǍP :>6K4E囓b~/XV;+eoJ^ǟ7lT/ 6|ʆ/;il=En\{v$ح/_\y=O?>Do4`ذajgu/sww+ isZ&rG=a׋vؐ%صJaopO_q{z\|| .S;ilf/&hvlj7ofO'%P[ׄڰ2 !Hϛ7ϰlx㍲OXJ~c9t`/3gTi-\)3@Х7+3f̨`k""k}r"}{v ;=^SŃEȅg{r GKk6eş6zɀm젫%)AWr2Z{ȾPu14`Ow=^̀ڪtT|cLC=BH;xi0#FxL'"ر,_uV+ٳU87;>pET7v? vR\з9a^zcTΆ vπ<>E>=?i{¯pOzCȋjOKϐUȢo(CoNnn Ç7=\ïÙն=_P +MiȵGiGmY 5xAz6J!섂݉HEeJ}o>6NBN`'섂%<t V}aBN`'PS QB`'bQB;!bPB;!섰B() iFh4Z6 vBa'B= vB!PB $5-E'J,9òڤ'Bi͂ĉ2|pK9RMظq<Ny7 B_W袋Γ;ʪU e:mOu~ 5E| U:}aᑺǎ=;)!Қ{,e^p{~Νep8L&L ]t\$+eΜ9'"={lX-ж{Bbz2)+/28KKY"5ߖ%mAR=oT/X [9 v۽i&8;uwr ,ॗ^/4c 3Pjkkeĉr7+߾}½NjjK.R @QQ{{V<Fx ٲe{|ΝңGzSNU/"AkiVǏ˘1coT ~>Ǫ_*e4\BnR|Pun۶mr=yXFBNq8Z֭['&MRedcC^{ JCgT y-S2m槆ĭ[Ķe#5.~:Ć6JBN niQV^PPP-_@tN<-\pWf3)=1}tڵH>}dС:t;vHUU8N<x/2Ho9viiiu&R[.~*?dddC 1,S}U? /(cnn2xǎ /1<6 "[oT-Z$^x*6~}y,kT m{A(Ay)q({IKgJ-./xmj섂 v3TTgu_O m! ƗGC?-;;c;S8G2 >Pn]ІaÆyGϭjv;cO[<ʋ}ˋe㕕r={XSOJ Ǒnڃ`VQjW̬tɀeIzFY-QAU sNI޼Q~MMmra2T/FG+K}bw}WE>"׃ !HaP7n<# }S !ax2ՈTxk}Fc䰯]V.ⱞ%øZ-;կoV~k~tt_ver{Phܬڃ`9)Q/.)rY 9Rk$E?Ip. #1QM c"9QJhG~ZEaݻw?1?! @s!`^_ }ws$z~;Z.|Cn֏=מ5k{1 ןWszح Tnzc vzlhk=6-UW*\e\%֏&/w{ThQ(YVwa[Ҏ;mFļk~*#Do\\JeX`zd9s\`1!!AzѸfRT/u+)72r?2h^cXU1+g}rQnv_ϱ5 o=<;V*/zX دz t_ͨHtL%'saGB~RX0M$h5,REHS@pCXVBa6!>H1まrJ瞫rIz S"Q UMˆ[hns9G`Yp:ǬO>{=w 0kVvЏ?Xc}>ǪCsYb²epǷ�Q== vq pGi;Cv-%7%Kg&|,c6,REfv3Ҁ<P;;!줉nmcKQc ҤDalX^.IQVE1"2YlY-͢H/E9~NY_;!섂{DdX]?L$5uTHNr;$EGN v,_,f1o"1Af9F-%<Es瞲;C"4~'*JN;`g=!Q'س3$"; [)Y r0'[Γ#BMB#>>^?"`'% Yt̚>ErJvJزҥ _NTUUJuukOj) i1HЍ|J!Җ{\|TyA~TKm~hG7@Hy=>R%PBڀ`w8Jh`lDDnD !BN{3 vB!P‹B!PB!BN! vB(؛KIjZ$O$XreIyE9O"!Қ;p>|Aȑ#u>ПÜG eiN6nܨ k7xC x~ 5ET맂?Jpu#u9z'BiM}rJVV2 /\,Y"=PiS ٖ]Ν;իpHYYL0At+8]YY!eRV^*eNq!Ej-;Kۂz<^@'&B!EwQ6mpN<A7x8pQ{MMrUW)0闝:u#K/T $G Fez'd˖-;wJ=,V&N(7|>W***<;c gqe?aj\}ղn:4i* 7 ww]\+X%!ֳsl*<˖) IHSSCH-b۲YhonsZҋ;i= J?Y=\[oiTpes=c E]$EEEB%$_>=3Fu&%;vDz!e?~|nr19~s=fi?ӧOW+^Z#C?/yyy(h" e^uɓ'_HHq1Jk^uDJv;^RwDK~A -A[G XO+5k(gGFF曍.51b<ì|B(gy>묳aaa*r$''gC~~RR|#/7_|Æ ;SE4~M7y]nWÈ,x#=кЎt^)DE+(+zfVd2$=#UR j; sNI޼Q~MMmzKuW^*2@Ϟ==V#Tm۶;O]Z^K~>˼yՆcN m~aDs h0! v3;RfpcDݴ𰭮vc˱vZ뮻TZW//0`y@7Px uqGN{IzqI ^(EG tw̑Z&)IwIXɍjzСرCt(R~<ڶ~>^j4z&~iP~yiF{O}gΝ_}{p}V&rx1la7SYf)σqbگE=ސ6.c܂^ue[RBBnWv@55h۶~={OENLSiVS3Ϩ+C<᧟~ZK/$7oVBZ`G8J/1VŦFQ@&GX{m syP#Sotqv|\`i?3gTܿpȇQ_{5?2A#أc"�/9;wϗzib%ITtD Hum#D }~Ztt o@Nv<҆uxcqg(z诬Te֫O4;.bu# pх7= oXQp0`( �?!|IKA^ y^swcGh/>ݨ+WTa[p�#>I�w^3$o)Qb}I\׻zV]o2Q'!4phxaƯu|E|-cذaeh]B@bR6\7f秞zJL5�=awD !LDnbR[/1p)MYN։Rae);0&!^0333{f,B/+q^k.!F8zѧMa+mnqF*_:N� p&i'L````o&V{y8S7IMa]/Ui;).Iaё6Kkx97`7P-[Lm)-KvÎ^W'V۰6g"ۈwd`\X} v v v fu=;#I"P)O θ*s<)) G6`'B(۰`'aJUKˬS$7ad-+] tHUUTWW>!aB`'y{\|TyA~TKm~hG7B`'QD-df{%:&J !B( `o&N! vBxQB! vB!PB( !BN{s 2IMKKN6)(I$BZ`GÇW^Fo ?O_1'G ǿ5&G}T{5\#oJ`WHM**\bHD\#B!Hϟ?_^R 6m A<i$j?aaai)Sz޹sgYz8)++ &H.]x%P+ veeWIYy9YZ"2,ql yz9xU} !P;ʦMԩSǏ˘1coT/=V&N(7|W***|nfUW]s=WO<xPRSSW^r饗E]$={"w|Eʂeg̘!_q>jYnz@nٽ{DzSN+R4h\.^ X%!ֳsl*<˖) IHSSCH-b۲Yh`'><MBnICj*\~J$"e֬Y*^ѧ~*?ddd?p2d{v׮]#C݇zH�w}W 6#<;t ;v쐪*q:ޯ_?ÛYY?/yyy~yRZZ*- /PW<֭:tHǏsxi<yуW".>F rͫpH.vGK\=Sbnp/ȗ}%7hTh= 9噆;!E 3<#gu)Hddv 7nMN9p{y7tΙ3G^~e5|JNN\wujw*,ʂu n{eIIIr뭷& t^ ظh%vQJ XfgJʞ$a{]m+Av)ɛ7ʯM^oF-_(:^jT}?)}{>p�a6pX-W\q{,HT7wyR]]s?_(e_M_"r2^2&z/$nfe\8uaԓqƹ=`GeRl/#RB;Hm$$,dD5K24YVZ "kt<GRRR >s/fު`7&rnMnn`zO? 6L?eFA#_}|堛,`{1î#] (`W]YFrsX?TcVHnٔE"MVը!m瞓UV?,O=ǼLݕ}ٲeeڽY7Ш4! yl߯<_ZR 77@3gmcWBBJm1aLl /_ܽ k֬QmJ}>%AnEwYرc_{5U<,o s)5c"�/9;wϗzib%ITtD @[f&+=k} {G=lrJy:kx_Ofު`7&r <Hs1rJ⃇ QFy<X6f? ͞=[y /vZmWv)s9K}˄"ۻ4`rwQ G/8߿sH(5(-qpgHޮ%RƓb}wd"OE4AWVV)I vp]w)Ӯ<tHHH曆ʬ[fD !X [/1p)MYN։Rae);^#"ÛME4!MA D ;i~X{1پ}fj"JB( ;iau3uRC"9r(9)ر|mԛYt+H|AiGܹs)I vDYFh}vk?,[4!PSQ'س3$"; [)Y r0'[Γ|xDh vBKB( `L'd2kM*)bJ|q:RUU)㄄Z vB3TZBN{@JKHMMbvtI B( `D}!: v[>JtLNB!P7`'B;!( !BN;!B( !B`o\.$5-E'J,9òڤ'Bi͂}8 .#G<__xrŋ- ??_^{5w7GyD֯_o( ъoKAk裏k7ސ^9mTHM**\bHcDI%BZ`?{r .tOMMnA{%<SF]e$;w,W!eee2aҥ 6* veeWIYy9YZ"2,ql yz9xZQ2B!;vM61ܩS'8_~Y+_^^73nÎaM7$w<h Pm/\uU0i8r- cZ||ĉoVQ}JEE<D[N&M$^zzYڽ{DzSN+R4h5/^9mT'ĪcS)0YLɴeHzFGnۖRgԸD{K9ڣG^~2nܸ@"f@#V".9BZ`袋=^XX.n 1cƨnJ9&e{=IOOPn /fSB^fKUa֭*zرj"۶ms/$w>}tUE,ӧ :pRYh<=mW[e_d0<~xűO<Yz+ �ּg8bw%3%v |[rJ.FN(}7|S^~e%a/|ז6xA5۞ƒ%K䡇5GHKck= :,8!85nRVMwߕ뮻N.byW$//;r5*++f yrr{^[oU #ꀛw_Wyr:hv] Ã=o~Y}e9'i=6.Z vG]y3%&gDIX^W[IvJKH45E/x6mǵ1ӫW/5={oFi`Ե?Ö6x{cA=HxENH fv4 ܜX{<TWW1i�P?"x9 /D>~h <C_6{IzqI ^(EG tw̑Z&)IwIXɍjzCӢAZJߖ;t ;v쐪*q:*ԯ_?2! ?l~j+T+߿|IBifox{+xH83Z`7k9D@;P8}X v}0î&mLF;2R%w׷b9WK<fݮrXK:D[ @W4DW_}}>g[h,/T* "W섴p3rV0?z'o#FPyW\q߿E QFy#Wp[L>sL i һwz t_džv kyō9''Gy-v{tL%'saGB~RX0M$h6+BoˑBj&@buh􊐆v&B[g7P{}aA t{pإX~BN`{ذa"AP{?!qM P37lؠn(Æ8G*>@m^brf!0K \Z୘={nYvm v<w+WTs=W}pOڞ`!yHO咿%ֳz8mv|oo˘:AD} 4zEHC7NIM5h:v|=( i i=2*^blR(˥`4)ʊSwD]""ÛM#wW BI~\fzT/of+B2pR-[L9A)Yf"ޘEmB( ;{3Ȱ~KřIj zJ!Op9wH XY B=D!w/1Ss9GR~Y@FenX'111Fjo"ށFPD|!PS7`ITfJyqƭP9-III]IxDh vB!v/Ô�?!.YӧHnVN [V鐪Jr-}BI-;!BN{Xt _. юn !BN{3 vD}!: v[>JtL!B!PBLB!`'B;!B`'PB!y`䄂]LRR$y$<,M+y !,чտFOh . HXkveQNKK;%}㣏>k7xC )-q 5ET맂?Jpu#u9z'BiM}rJVV2 /\V?^⸸Xƌ#;v`?IΝed„ ҥKt vK$$Ʃ )(R)-sDe5W۲ı-H͓ xbb[ YC!yӦMq w:tG?_ /W]u2 cǕU/ݨ(d̙jV&N(7|W***Mc۶mr=y'7tK QZ֭['&MK/Tnٽ{DzSN+R4h5p\NnX%!ֳsl*<˖) IHSSCH-b۲Yhol[D#??_^{5uGGכ@#ǁD}믿!_~7'&ؑRTT/,,T7_@BAjeJnݺInn2xǎ^O?\222 2zWڵkO.]vUקO:tM([oT-Z$^x <=~}y,cK Ǐ]TL<Y cԃ_;%RⴋQ,"xϔؽ[$&*\ e_n */]7H'* ]v_WK]Jj$|MyU9a/|<'~g1䵞gue!To6Mͻ[$99ٽlbbznMM/RZwwʁkntSg|ْcpF<ѻOOOgK`Dl\RgfK,3M3R%ej н ;wf쩮Ky$ٳ,e5ޗ~5(޴i(؉8[ (r l3 $= vv`}z?!*)M9�'e1i G27NtBektS^xAovMhFǨz:%V9)Q/.)rY 9Rk$E?Ip. #1QRoCcө"RX(HL?Iۮţ`'$"ؽ# y vH8! voX.88Amt #aap6 /<fzgqy?6lPel,?F E;>ݒ`r vxՕeJožsGJy ݻ]y%}믿u $j61Dߎ}] _,Y"Ǿ?ٿ{ygҞyLs낂䡇 o/rFÎQT{ffv\!ѧ>>vxBB=9ީ=ăC#զ>ݗx޽sa}>n( nHǁ9VTd:Hb=_jݖ$QEGFF, HT Q3(;iDm{1K]sxG}P;~څgS;n8Æ S7؈#Ny#l_~Q/xx"a"?V8ܨf̘sO>D#!>T~˖-Sx}c v-70`�pV\=\G߿w><`7C wZ"%Jo<)֗KzXϪM&2vxqhD̢fV=S pZaG}vo̙<! v|P76Qc ҤDalX^.IQV8"2v5k֨UDj (?;6xM D33 EaUhc_Xd0B{G8ѧB( ;/,#"a//g&)*m^?ErP!),:rRcfoG_x9 2rMl=HGhSHċ$;"Ǿ0dۏŋU&]QBN(Iku=;#I"P)O θ*s<))KE m6N!PS{'d2kM*)bJ|q:RUU)UOHX>`'B( `o+.A^#55R[e! $!B( `o&p(Ѿ/4Dgn ٧^RݣB! fB`';!B( `'B;!B!P7`/+/ԴIޟ(I>hrDB!5 v<|pk7#GzFgqC1*f֖9oy\sRPPVKd@jT>OTG&;&r(O*!Қ)gee)… ;v(Fá죏>RΝ;իU=Ʉ K.lM& veeWIYy9YZ"2,ql yz9&MK !4`޴i{Ý:ur_pJ|ji }J^K/.Hz)EEEǏ1cȍ7ި<_|{^mmL8Qnf۷TTTo۶M9䦛nxU>l eݺu2i$UnAvԩS+T $G `X%!ֳsl*<˖) IHSSCH-b۲Yho "4E~o|{$BN`X B%^5^|E;v8N9=zYdǎRUU=x`ׯ{~*?ddd?{2d{ӥk׮*"y}C#eժURSS#z˰|T/"- /PE<֭:tHǏsx<yу{\|W,]b{"1Q_/wKnV6x``o~oBH 3<S!$>묳Rk^ ˃ay@v$ yr8Q. xgϞ-999g08&''Ǔ[o{ħR7`VQjW̬tɀeIzFY-QA^d箝y53fk3Pmo;**J:9s{޼yԽѶ|^]ƊE} i۷SBN`7Ëu};5F<`}{eax@^.L2)?f3ǰLF97NyZ &1';<%E.+b{b1Gjm(' %a!{$7&괉 L{=^m~z+dڵplJSO"+fU/ v\xZ섐"r!"i e!y6BfÆ ;X]aǰ/'M&c܂^ueum휫RBBnWv}/PCgggH /kS+++,X7z!/ؿ)섐fuzܸ ׬Y|&!q}aW !ox߯ һwo_~Y=<1t_ݻhF~ko qc;{S H%KNÎ 67amIqmòrY}7$fU/ v< ) !]!1l0w?#FxpSO=%_|~ZzBs9*79e!zr�O@>( ^#l2m<0[ %ص<UiCcʕ*=r)&% ۵DJXxR/.UכLdT v_ؾ a\兟6mZ@x5o`7E)Z`3D\섐.Iý0t ȨzKir0NG/ Ӥ(+Ny!@""ÛM#'k!6m9~CPB#{A(f佥=<Pg'!P 뇽TrxICyIk%<fi( 闃O>Ē`=h0w vYTwOף^ dey+ ! :$AIevlgJJ9rpԥG6`'5TV!  Yt̚>ErJvJزҥ _NTUUJuukOj) ! vB(؛GJKHMMwYvtI! vB(؛I;%J YBiWcGB`';!B( EGN! vB( !BN`'B;!%$5-E'J,9òڤ'Bi͂}8>\#!oȑ]p8_K/T.r7n\@oO>gkFx )((`+`o4HcTGI.A_Xxnc"GB!Iϟ?_^R /+ {饗믿HW:w,WV/=eee2aҥ [1{^+++LK)q9Hͷegc[Tϛ' vwҽH,q}f,p:*}ٖp ;ʦMԩ{.SDn G?=55Uzꥼ]tS<7twyJNp?~\ƌ#7x|y2qDUo߾RQQaX^,\}ղn:4i* 7 wXvԩrW r x`o4b Xα,[d2$=#MO #[mf)߳Gj\ x Lkאsfn aa!6gXCXn =+E333gQ0Y2yYY΅w]1$0۷Y=9 o޼Y9PzK-@!+m 򚝫V-Ѡ⸰P^c~~c:Ȏ;JN <X / 6Mmx/~<㒑fȐ!yӧO]GjXށJii,ZH.BUmX[nr!e?~ܓ'O=zPS7q1y)q({IKgJ-./xmj]@{:f@j*lgS [-YQF>HMZaɒ%Cr fe1; e۬/'xB9jPs>ub +ucV@I쨬ck= :,k&[+rga8FD|xeen;q1SoT^ݮkjjN~dxRRz~�t*` F#6.ZvQJ XfgJʞ$a{]3Av)ɛ7ʯ"Vm&s'mf1̟1cqj~_$̓M5;.3o<Y)ske]',(UW]%ӦM HؘEIr4`wnwg~Y]S } fe1:fמY&Aףپa4;G8 buɻn̎Ǭ6aXHG>S7GFFQC;qƋ}uu@c[0`=Z-80%aGy ш9)Q/.)rY 9Rk$E?Ip. #1QY $Zet-" ^< 3E0矗<4+?Q$Pd\uX4ScU@ĪBӟd֬Ycn_E)e5Z@m}(/(cǎUѣGiVzc0+sL@m ۆ5ivYv):Xݾնjv<f \:ל9soL4 /Y,䫟vqZ vþ<zю!`o4+H]i\%֏&/w7Fk)hѵOٳ%''p9hYD 󳳳 WO?l S d\uX߳C8U%<NxtsGCD"ǰe̬GoT;u fe1;FubI`uhV۰s}MZmy֍|^nmxH;iu!\#4bMeٲeO1oO?{|)>@8$?Ɱ[̙3+.^wtݻww{?07;M�Eoa`oLc"�/9;wϗzib%ITtD @%0 Vmf1@fǀR?)tfe&ح'+:V7 "�>o~}έtxv"XiVzԗÔ`Vsa!Y&}G}[mΩ5iܹS_} v1+o v\ vĈ7ŋ˵^BvHM oGVN'sQyR IF =StwJc v-0`lʕ*s4`o 4(-qpgHޮ%RƓb}wd"Z`C i x}]( <Vmf1_ $gt}`Ku~ˬn9Oj=|[u@7f7p^Aڎso}fa׋M}]F׋YYE uI`u16ofפ6|r>/ a5xjU4 !-#%.I?ˉ:\ 6L8yNjmDdx#=sуjAfk;F69C9M*6ThW\a`tnc'-YeDPlFPPJffy6E!Ɛy+Ӌ13\ՉY&پhV۰m]f=Q/ˬfYy v vB="2Rqnº_vS$'9\¢#';mqh=̝;c>a>JQE"b@F@{ tFeVDCErFl]ᆱh/1ff-J,<.;}S룶z7h E䩧/XO?> ZFc 0$0۷Y=۬ Sk󠣧+Xm=ƨV ;;`ovQ'س3$"; [)Y r0'[ΓbxDh vB!=k vB(aJUKˬS$7ad-+] tHUUTWW"aB`'y{\|TyA~TKm~hG7e`1! vBHGBCt춐}(!B( `o&N! vBxQB! vB!PB( !B~z0]/($5-E'J,9òڤ'Bi͂ݬ;1<|pV'#GZk?O/c3 ̿Uς NiӦVR?y7WW+RSJ~* X/,<R7מ:$BH+fvrJVV2 /\'M${<44T',,=m2eʔV%G!=?x;wիWᐲ20at҅WW+ qB+ʤTJ˜,-gC|[v8IyRz<c[XǭN׬Y#_}= HZkof;vTc wm6\uUrq5_ȹ+ӧOW㘎Z8q| ߷o_po+55Uz%^z\tEҳgO)**:\b妛n;O|AItK}{l +B2_S; 6Ȼ?+UAꫯu֩"lnݻw{,;uT+A? .2o=>!V rJ8ϲeJ-C3Ԑ=uضl={GAp.KA?Lyg}aL_hf [xwr4Z])믫ƍli,5$1y?o|U?󷌯�{rʵ^+/~BP5.<CVۿon#a]*/>Dt>}dСtAv!UUUt:g_~` /x`[}{_~EzᷞPFh_IIIد+8PJKKeѢEqa}lnСC0<~xž'OxIK5Y"%Nb/)rLݻEb% _ܠRm1JV=QmXaocjԨQJ>#5͛%Kg'YkZJ>z3 X0o/D쥗^t=YkHc>ff>kQ8,{?ay_ ] v4�}9:,3g:�o/999ruש޽{ N9p{=4xO =??=^YY)-ot'^*-[fXO=9SO6N_WjqMNNv'%%ɭs0xө[`V7hG]y3%&gDIX^W;HvJF'=i۶mr=h ~9DƌgQ=rF'̟1cN8 JdO5 ~͎L<ap"`9DJM1 !{G#G{=rXݿ灾}C]vG~ذJ[o@C hQ{u꿡ڗ`b z?۝b111fyccc/vNUW#22R!l5HC}r^|EUY?wqSPPx#޲e) V"0 KǜPRT|D BW}m$8xܘfT2j/[>O$F?d"OK^^{Z=+Q3;<WF_29OohU޶&͎υcǪs�/ѣ4=?+RIٿsƬ͇f}L?էސ^fڋw}C盵/4J5kV!F"< ʑzzou!9O?Æ S>{d<1' DCx@=Lu]ʴ~^ m cؗ]/&PF;2R%w휫RBBnW yS yxzgϞ"tFvm~1<a~vv1E̢fS/8@0ۯq 'C_{kf�!t =_4߿? kꫯ}~7O+m!2_ fŻ꿡/GĄv;Q̎Ǭ=>F~XYAM,yf̜9Siᆃ0IBBJ@_@#a z߸dz{1پ}{nhyJ P(4/񖯿Q?9@�᭓9SGD*^r2gv$/ٿ nKf쁴YoÉ_$}t{{F'ƌAQB}kv\u1k 6nv x&!Xiz_|l4S(o"ķbx6ۿY}Zi /yΟ1k/eV o־AtT|fcP�xO[`7˭ q+#Fx<Ԭܠׄj@} ޠAC.;<:}ڵp^s9G3aY z?}ios 쁔)z0`Goʕ*T{DI%5(-qPgHޮ%RƓb}wd"Z`Ǎi x}]#(;>V~k@[{G|/H5`˞@kt\fu[_{ؽd_O3Ѯf6tzacmESn{o �#:4@0;f0Ϭ:߬}!?1jpz3[zI]4AKi_]ۏ` [&,' czr)0M)B7 GUƎ;>`xÎvȓ&H`GU 궾s=f�AcC,THETCHHCёD%s12?,h{/o|6(oc9W<C F}OB -))[` 뇽TrxICyIk[`Mh̝;c>Xa>J!PD %_( $Rf$%&YWcQ ľ[c/1fǐzCA6olj}4:͇߬ 5O<|k!2ΟW_֨:߬}i5o7ԧz5/\cx4jv֧`o VQ'س3$"; [)Y r0'[Γ`xDh vB!=k vB(aJUKˬS$7ad-+] tHUUTW{Oj) ! vB(؛GJKHMMwYvtIZ~H! QD-df{%:&J}I! vB(؛IB!^tB`'B! vB!P|i+LRR$y$<,M+y !,ͺkhwcXoh6[O7*}ݍ"ҥ[cƻvh !cnM/8w2{k7xC (}p 5ET맂?Jpu#u>\mB!H[e O>,_Isu,SLiz`\/Jܚ{Νe/d„ %T'UVVHyEJiS%,sHqqoǶ 7O,㉉Z}5k_b?%O-i?R'߮WSS#\uU0irf^~ͦ;~/sϕӧqL9%\n&9TeHMM^zɥ^*]tS,<s/-[?ox1xbĉK.ZER}p {neN*W^y?h Myy\p>OUb=;ǦR` γliː45?5d$n"-|qvcosSaev=ayf }Ѽz[ly?=6{rʵ^+/võ;|pu_Euȑjm?z-HHH{<33SyU>1j@ջ<f3+[8^ueܸqt0j9)Of!!y1c3Fu&a;vl@~衇 H}]7l <^x%z+**SN:t;vHUU8Nׯ_@}78eQ}X9^,3p@)--Ew}ˢ: Ǐ]gңG v_u׼g8bw%3%v |[rJ…ش.OȦMS�t=5fYj|ᇖg S38Xϟ?_^Rᅺk׬|fy²cǎ2j(%la}fXdzyl{f4zo/D=쥗^XםY;f!!Ee{oob[o hsQ!''G:5޻wou跗?!: .^}UFާOzѾ9f1naD /$z~k'>==q(+zfVd2$=#UR ٹk$o(!m۶=ܣ<{H#oQ'rḞSg<f)Hwr)Y}hDEE{̙3O:8ݴilDgl>R f_D mWwj|bg>h^,^8pJ;3^cGo/2u׀y-]_FS/FZu曕Ǿo߾e6cאB>sV]]0oqq/Xъ8TohX鬳 .Z>i/\ q Ճ^z ߈9)Q/.)rY 9Rk$E?Ip. #1Q%$bԦ/"kO?TqP!Cx,g|幧m3Ti ~[X~\qvZ՛lu`t1R=fBbS JpX-}1kDϋ/86lwjZ}%}l{`>4p2Wz1z#Z[}I8tP׷|fvfV<ڭ`M y5oO? Æ S>EOϷZ@# nkmVVx*a_vhأ`!c܂^ueuwUbhR)Y!{+oD]<gVQ$n6Q3`>MFE۬Dۧە@{3x_0z߷ڢ`uG}i'/=SRP=aXl1+sADIsaXBH:M@* <gƎ޾k*R+"g}h^bNGp.N23ǘ35Ц{!^?InNAicv#}.>3aJ5ikx<TGHS?jykv+7UrfcV7K#(\~$? boc"�/9;wϗzib%ITtD @ڄ{ ^dh"\uHtAZQl[Ϭ>D@>}Eۚ`߹s4@=z;xZ=1POm;53}n1")))~ge{ z?D+%穕h^b@e�j;m-=Ƭ!υ%r+ހQAP= D8l_GC*~q\h"!w!sygO?jykvxDޫ;wF9f1_P匡 8\R <S(CK^Z"%Jo<)֗KzXϪM&2e v%T zR#;Ht:B0TwZ)Y}q�rFzjK Duk6_έA>w^P[u6*z@5f/Y{SFoh^cT<3ƚ_cڙY\hvBoɂ=2*^blR(˥`4)ʊSwD,""[`7.!)>`@xH\EȎvHtH# GྰղR><x`_Bj+81EL惠 .)h[|lԛY̶﫽r@ !Jy>?ciV@!fk-/8e˖)>2Wzwcq\86#TVicoH1f̬| y.P v F!"2Rqnº_vS$'9\¢#';mq,%D%#7s zݕQdW $:e$%FbfQ-+3 D4.ON:BXuזz"fz~!(wIZ#F8qmW}rSO=0|S?{h-^x7]h;=FחѼ@- ùw4j cڙY\`'BxD`H2;TS63nd%l9|8OJJB& ! ;!n”�?!.YӧHnVN [V鐪J7 '$,|RB!P7`J /ϑj >#BNi(Q}_h΂O>!B;!$ !BN/: vB!PBN! vB;!B( `o.^V^&i)?Q` }&<B;!CHM**\bHcDI%B( `o8B+ʤTJ˜,-gC|[v8IyR`OLl碽S?NNxBNił=>!V rJ8ϲeJ-C3Ԑ=uضl={%)Znښ`o-ǰqFyGw\s5oHAA333gK.D1pm>\^FY돷."O[']t!A;!FǨUw8KiX%E.){HLT˾ݒU.k%IgѹsgYz8)++ &(Qꏎ;ʨQ>HM˽+YYY0PwmfժUZ._C"O?  vB(؍VQjW̬tɀeIzFY-QAWd箝y,sƌrgĉoVþ}JEE:SN+R.R4hCz꥖WgϞRTT/Wǎ+BywzW]uڟ0͓nI;<y%BQZ'GzW˺udҤIj[7p޽۴-Nry{oyӦMq w|o~9tPˇv5p@y6m#BN1';<%E.+b{b1Gjm(' %a!{$7&Y ^ӦO.]vUB>}СC=֭0 ?ާ`СرCt_~j?3C =Z~iU.X-oח|fxPU}aNh" q+ҖPg 6ydwŋ/(cǎU 6 Ӭn/7Bbeuƍs\!0x~a>$`'PF;2R%w׷b9WK<fݮئN9p{INNv'%%ɭj(N5 @ӽg;l25|-HJJ{=v}|xeeו>v{f:k CT#==rhֿm3tQ:|={[-ڕ!/]cC vB(؍Td:Hb=_jݖ$Q*ؽa2կS]]ǰ>*5ЋxqC~l,JyZ'Vh6PgM)}/8?#~ׇ7yqL㽽#UgmP;\O=c|HBN�wHVVZ"%Jo<)֗KzXϪM&2y7H0ZGð?o2N-F x@BBB7tO7m1g0,x5nlt�"4q5V; np=;!P8[/1p)MYN։Rae);UϜ9Syn һwoukc9(׬Y<HGD~-<۷owOC|'|26 tFu<p'|s5`o ukmZQsrB(#/\`l{֨ ((Hz!cV>oƌpyq=s=|HBNau3uRC"9r(9)ر|i%f*w}]cGW 0#CMq 9眣ձ]}bȥ~5wO>DmvC|:A1zZ9smt9XrsU=ߝ﫜iiiSO_ /5kwذa~GqJ?Fy_C7 <%F3x!  v##{vFD}'١RAq+%+!TdyRRRlD~C<cD||`C�!PBn0%OȪe)USŖ.t:R 'D+?Rk 2Dzt3:# vB(A\|TyA~TKm~hG7-Z3s9HAh1ŗ7*os!PBڜ`w8Jh`lDD?+"B;!$ !BN/: vB!PBN! vB;!B( `o.^V^&i)?Q` }&<B;!CHM**\bHcDI%B( `o8B+ʤTJ˜,-gC|[v8IyR`OLl%cTWB;;!P'*AcS)0YLɴeHzFGnۖRgԸD;]-{7?µ4|pK9RMSyGOW_uE!C() iۂ=.>F=05Y"%Nb/)rLݻEb% _ܠRp!]+9N ˽+YYY0Pw-K,zȴ^WZ%~!2-c㢕`wڕG=3+]2`i*){VKTpٹk$o(61c;38CM'7߬<t} uN*W^y\z2h 9˹ T1K-/]Ϟ=H_5;&W\q:o555*?+'͛'7twyJt@aN:WꫯuɤIԶnٽ{siTFEEu]'3glqcǎi&8;u:pxrzСC| v vBڶ`9)Q/.)rY 9Rk$E?Ip. #1Q&ysO>}tUy`ӧ :cnݺ8 Ǐ):t ;v쐪*q:2x`ׯ>̽/"=zPãG~Z ֽ{w%_xlJN0@aN?p@)--EɅ^w}ΥQΫ]~zZvm^V;^6/E矛+^bG;;!m_F;2R%w׷b9WK<fݮrNBegg{L;M@y$''Ǔ[o$ @:G}ٲej[nz؟J9+}Z'v5~;KҨ f~rJDDD_VgnS�gu$,,L bV߿BNNH1JY AKmob=4ے$*:Y fe_=aVҥK}/ wqlBU@k_nEubfΥQΫŋG}tZqzg>Rf/4>,.!5(- ۵DJXxR/.UכLdT vo >bޓadLG[>o< !!!oyͶ=} 3<7`7*yrrmɴiZ`g|_[l'88BNNHQc ҤDalX^.IQV#|~Z;>$D3Bh1!!Azrʵ\i ;65k)0{?<c}vQFy?m1{0&#9=\v2WNjb[`zIikPPJ!v##"a//g&)*m^?ErP!),:rRc&:{lC}o$H0`G~7nTsQخ>mJk9�>'mXnc@aT'ӎs6`7*y x!뮻yi6j ǵ6l01b)VBNiu=;#I"P)O θ*s<))KEm6X"!#?z1">>^?7y! v vBڍ`SZXfM" [%;%\lYRP/NC*\}RN;賟!C(O.zAw|:;!PBt+.A^#55R[e! d{Z/%s99HAofcZR+/;!PB^O%,m!4+1QOm!BN{3 vB!P‹B!PB!BN! vB(؛KIjZ$O$XreIyE9O"!BNRSJ~* X/,<R71GyR ! vB(؛C'$Ʃ?N2)+/28KKY"5ߖ%mAR=oT/X [`+vD;!U X%!ֳsl*<˖) IHSSCH-b۲Yhx8}eh8u]pqFyGw\s5oHAA{_].Reܸq>|\r%^F鉋ݻ˅^(^{,^=oҥK9z-Kzwo~>$`'݈׼g8bw%3%v |[rJ…m8mܹ^Z 20aoJ^z%ϟ/{dee)Bݵ*7p|O<(?x ٴi{RGMr~r}BNqJ;Jʣ.4IH=%*8HBJRRܵS7o_]B9Dό3믗38CM'7߬<} uN*W^yJ4HrbW^j.Hz)EEEJacǎW\[MMjJv yM7ݤ>$x/?~\ƌ#7x~>%]w̜9ӰlnZ \TӀh;vT[Ý:urC嗖R6p@6m_/-! vbN vxԋK\V(B)*>"+ľc6IQOKBHnLT^ӦO.]vUD>}СC=֭:tHǏS0tAv!UUUt:eү_?5ß}{_~y=z<Ӫ\0Xݮ/Q /fS/W W}\222T}2}_^]ִ\-nZ`1N< ^XX}/V,ь2@D#|?#ǁWDOYfU#;WB`'ݗ`r vxՕeJožsGJy ݻ]y۽sdRdgg{L;qxկOJJ[oՒ*--Uix-[oIIIqYݮ/Q?ނݻrmZc{"9""9k u-Ad(===^W_}}xWv?3m`rc/HA{AL:C$22R0_жky|HBN1JY AKmob=4ے$*:Y B`+XuևH^2q+ =>ٮQUo=2+ E__ۃ�裏,P7-}}Yrjn+Q=Îzx̽ٹsw6,#ru?"f=PBn&%!yHO咿%ֳzj^ 3R${0ÎS"&<xx%ͼfm Q娛gVoÎxᑋlP7-Ev9s(aÎtxo|rE 7-^aG" DM`' ȨzKir0NG/ Ӥ(+Nyn ?="G]ݻ:țr1<vXۄr͚5#| Ox�o6j(<'|26(ENwwx3+ <a<98F(M4ɴ\-nZ`G\[999*_Îtd#% =SQQ/1QR|7RuBk {77z{  v#""a//g&)*m^?ErP!),:rRc&zKٳU.;=>4xh跉>!D9%Z]}bH~5wO>DmvCBh!5l[fe91xˌ!RjDK-ԍ-_rsUb*"~Ot<s=v lĈP^u ?:U^zoїx!B^𧻓YG4�B( `7 <Ngg$IDwR*)RB`N>'%%u) &K7x04F6t !PB=L jb5}&lpeKAA8j|pyBIm;v {x+ Y7BN{SiTyA~TKm>! dK >roFolcior5GB;;!F;%J YBiWcԇB`';!B( EGN! vB( !BN`'B;!%$5-E'J,9òڤ'B`'t)RX?QRKCxѣ<B;!!'UVVHyEJiS%,sHqqoǶ 7O,㉉\g]B;!'*AcS)0YLɴeHzFGnۖRgԸD;E+Cs96.\r#Gi̔gyF-0."|!\zr˸q<qFyGw\s5oHAA`;mG^f`qqqҽ{w kŋ[ G;!%04Y"%Nb/)rLݻEb% _ܠRp!{? vsϟ/{dee)Bkcǎ2j(%,a}UVɇ~7_V"K/_߹sgYzvYYL0Atby}%KC=Sa 7 ?z|PBZ`VQjW̬tɀeIzFY-QAWd箝yz681c38CM'7߬<} uN*W^y 4Hr|^zٳ)�5;&W\q:o555*?+U ϛ7On&9Dt#F_eVǏ˘1coT/g9뮓3gͨ_ ugLM Mԩ/%d5JKK4r!e]ڠD?wr[Y vm/ [C;!U"JPHA #MR=,?/yyyiӧO]*o&E>}dСtMǏߡCٱcTUUK~< geѣ=z<Ӫ\0nח`f) 3.ˬ,~<㒑sȐ!ceeڵeTfjR/B_|QƎ ^h%Lźu >4p?ɓ'ۭ/vqBOYfӭLx/HKOVHBNi==6-UW*ιJM^*1+$tvm7ml1;T? x֯OJJ[oT(�x;+u�e-")))?%㕕r[{חYYn6}lNGDDX>gFov]ejJ<Lw>묳.Kkɫ꾇+rg<0D:-Ra 1^eT/<];iCz \jBNiU=:&R 9#!?}|Mo&v[DEG4`,0%,_:q #ėPH^l{pw(/ dނݪ"ؽˬ,8}}yo/'ȳտRw) Îʮa4oZϞ2n+7Q>|G,˨Y[D>=[ C;!vM;JK$++Cv-%7%Kg&ռgb؟Qx#_|xx yͶ]Q7[Ϭ,~=77WyMfտRw) 4/,Vrر`ϙ3G T`mza1j8Ɓ6on$oV?PBZ` [&,' czr)0M*!<Hnj һwouSPc9þ ۚ5k)0{=l߾= |s؟|ɀ3+ <a<98FI&Y:gFov] ejJQ/1By뚇?>E_ ""E =Sŵ琛o<;޳6.)-؟>l!섐V!#"a//g&)*m^?ErP!),:rRc&ؑ[;{l n ,>`�6g4D9眣ձ]}bȡrz<y}O>Q۰x�f2+ )D#ǃ^f|mywu:VsfTf/Zΰa1SO=%_|2_=Ǵ߇W'+WT{JRD)o!W} x:^�?#*{xD`H2;TS63nd%l9|8OJJR#BM7oq?l"% vB(laJUKˬS$7ad-+] tHUUTWOjۉ`G{=@<~lBN{SiTyA~TKm~hG7A0j5_ i$HxUwMq,|�؜u\BN{#p(Ѿ/4Dgn ٧^R&B! fB`';!B( `'B;!B!PSB!PB!BN! vB( !BN`'B;!B;;!B`'PB! vB!PB( !BN;;!BNN;!B( !B`'B! vB!PBNN!PSBN! vB;!B( `'B;k vB!PBNN!P;PBN! vB;!B( `'B;;!B`'Bv`'B! vB!PBN! v vB( !BN;;!B@N;!B( !B`'B!PB! v vB!ځ vB!PB( !BN;!B() `'B;!B`'B! vB!PBN! v vB( !BN;;!B( `'B;!B!PB! vB!PBNN! vB( !BN`'B;!B``'B!PSB! vB!PB( !BN;!B() iAFh4Z0 vBZ`'B`'B!PSB! vB!PB( !BN;!B;!B`'B!PB!BN! vB( !B( `'B;!B`'B! vB!PBN!BNHyyy}vvٹsDB!섐͛7KiiN ~C<Рc?B!PyqqrqS6}ڰ.O>m"v?;N-?=,o޻<B;! ؑR]]m>2-;>df `b,)ѣ-BA{K! vBڭ`zVVV&&~?̜5t<TVV ~'}NҧJzF{>D/KO)0gzMljHaJ),,RY6o_yHn2i49vT3rh'Nؾ^f2tN:ːXES*BsY|JTLL5گv~5%rW3ϩ}~׶̎۬.""W_S5kyS  vBھ`G^?BZ&]t}/?BuC>&yKUU_H^m|wzwqM?V+~\܏׸ǧD}b0 [c-ʡϛ/oZ{^mW$"2JjjjKiO?X)ӤBV]^~6kkY+Ug -]͕2"eBS;?^$ !P;ra(9zA0G&ֻ>! IjY+0v{<x]h6箁tz={JfV{/yȈQ0޿f[0T8c ޷ϯo3#3ӽMmÞCx:ΓCz㛀,keF }+)17KD ._!B;!Gkx1T6pn.:u"%feqy.9)>ᡅhF]Q@?yo6'NXǨ^6~kuߺ1d@kvNf7)TT/^!P;ayv:=Eb㥠@-`*]ê84lx}Y[6+q7mbMcxؽ?oب<ᵵ귾"<e뫫NO{/v_2ۿY]jh`Ӟ!P&{NN2xC=DCuV-vml'Kf ^R*ݪ`y"YeU/Ƒ2a$!v }ɬϻ~3wRCьf}'OG?ߨvkk[f7KhACaOMB( i=%` Ug@ӴZT{9oguj&!q; ]ij@Z}eJ} 2ß|6Imj" '8Dwz\KFsvT/gϙqeV>Rg[ '! vBڴ`G?C/ 0Ma9&?C/O?+B( `o`߾}DDD(/:>(~ \xxT @jzAo0o$+B( `o`G?Hhh˪Ue*Mi>z!KB`']AAA*/)2 B( !% !B( `'B;!B!PB!BN! vB( !B( `'B;!B!PB!BN! vB( !B( `'B;!B!PB!BN! vB( !B( `'B;!B!섴!?Zyh%7yo%q#ܼy=zDnQF7KM6ᐊ ZuLNCzmku}z섴j56:| 5B7y65ɺ>? vBZ`촦5vsy|4;_^KsMO$+++i`|(Q v;;!켉@7GNH n>.e?M\i)KsJ섂PĤxIH8wedKk^MoL:U>'M)ʚ݆.Kë%1'[4QS $)-sޣ ߻K쒼?Qrrl{cRr;!-R!qV.{OsSӚb_o,``'qJWVVHYyg.^,`A F7IFfp]=o9Wn`9Ȩpϧ``'evt6x.KDB5}2+B7d~cYKgrۜyǟVK^a vBzr ArX/gCJv)IaJcǎe\}bECQUUU=fZHrϗyKCvW]D wjEE~F/e?Ҵ*"Me!_iV,!C7d~cYKn/as~2 vBz SQ/Y/*.#E&q񱒘ْ1NJ$k5 ɪLO Ks.^a^̧JNNu)Y* ھC\ DNiRoBS?Eޞ2nٛ1[~xE/4尮F/_-ZE2zy1>NcO<)sMiP\@f4˧e~CY_~잽0r|ٰi8Nu1s)Sr~j"�p/mdk91pק#aY(Ikht85^$EB)t|?(9JvMJzxɌ/NlC3s_Xw]zfEG%y?$׬Uo+KBʆOά/k֭Su9seڵR\\ܬ9 vB(qNJ岙3eHe7!/*ۚlN'G؏d]pZWyK7ɲٔaӴxhr0:$o 7ߚ{_cNqUgwb%%eJv8.ٺU[H}ەn|R5/4LQrb6Jnqm�Q_oTyhUK*5)iB**TR@ԇc68%"iIb/xo2޷g6^&vP o0^3c~<sps=>#+ۻ,Zso˗F5MW$YY.pz ($ZNFCƳ0}f)m25s_g#YW8ežcv;>D?13[}0$nmwZ踔;,'&MxnXjjdjz.H2ze}ua*gPqμyRc;'\|RO>/6Ԇ׼{L|,w cn&owTU ߽?dBp&ԕ=9Y,љ͕<O~74rIg>?,r%4f7 Γa<zuQ-ߣoKҤ:Q2OLNiuGgzJմD76 yfvvEG;NܴLݷ{L;Rd;Nw 1 33;]b0|&{yƩzgg;#C>KMlNkadhNUZWMekNb*rN3((h™|T&ʅ_E^TX~#-nc>l~[뻭w/55 9wO~K:aky`_o0 u4(sR"ӪܘyXnF`BS+iVro^,/^*l!x.2 ƴ`D76kiĨ0 Vݐ/#;'^yYnSK{ۉ96hvߞn-ŋ2}\˥~`\}nUcKZP ;!IqI)ꈑR`?%9_έcd6# FZ_Z.#?ׂL<,c{ztuw@ÙPWJqq2UYx*S';[&dR YX_nF菎~ҽ-wtソv-UmVݱ@߁NEjW]<2#O$ey</jgHWZCvn8va޶*]:pȀ%l6}u[rsLW/rN3(m'9|yy#kG?â=:iua]c;bbO!|Oq9ˠ<t]urc38[ TRm:w~m<�jbbRJJ˶$ Mk }o}s^S3whjo'/spN|PR%Ks&wg˖,vk 1lč'Y؛t:MiCI/>M#`d,Vݯݘjn㪰ヒD9Ga'v&3( KߑkoIBt_yO뷏ax~tBd{u?lL hd7HSD ]mEQf-c"`wZ@a'"jw1q$[,*%hY'KfBvn83q$qG(18Y2-ƽ6<\iAƴKnơ2q',Y/ͰOpsvB(!ɾߖTu>.yMOtttL<=Z&P!�ƐX: ;tJHd\:Ғ牴&鸆&`[T}wt*ѣGޮ}vt]d4ժ%O:%DDO/oGui;]" ;P1~/V'."3RgX֞RV(OyynU7lאy4(oeQ)aGBJ7%>e|Qb3ȩ/i;]" ;P-ciyicG^g:QHa~ʔN[V, ).1駘≱>=3SM+S npɼCy7vD*v ;.XRb*V)BB)*.oaQrs}P!<`YIa;Od ;PؙvNS S !vcVJvBag(vB([v iń?(P)PؿXXX1>>΄1Cke`e!<^#sLr_lGa'd{L&O~cB[ckCee.PY>;l52$ΖvBv"κ.`SHw!,7Y6넝B!NB!vB(vB!P B!NB!NB!NB!vB(vB!P B!NB!NB!ď3 0 0 ;Ju 'Q͏����IENDB`����������������������������������������������������������������quodlibet-3.9.1/docs/images/tagrename.png�����������������������������������������������������������0000644�0001750�0001750�00000200644�13112005742�020611� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����!���Jb7���sBIT|d���tEXtSoftware�gnome-screenshot>�6IDATx}t]ŹuHeB(!!ɃP)Lm1l`{/r{U.[jV>~+ifΜN"))̘&N!�$I$I$I$РM z̝;)S@   !�MЦۡQUR!I$I$I$amm@N<yb0T,C$I$I$IFQgΜ'NX]]-$I$I$I$-4iz֣4I$I$I$MV`*$I$I$IBR$I$I$I+X+++I$I$I$I2jHJ$I$I$IF` I$I$I$ɨ!+I$I$I$݂$I$I$I$$IFkkk 555 7�a8+iό3s8u-:mN!l)ZZfDyoCYoS$H]=$I4Ǐ'I >{rN_ij;8viYtSyRT\8rUg~W {z}Fgoc;+['%yھ?XG ݆9iI>dʩA̭ݼMq XQw4*/˘i3]C'}]et~U,[uאe$IIJdq歲|>jlaܶ{gcQJqxs }y$/@+(, 4Wmj<L�fi#}zִ+<ޭn٦|ҫYllz9ZZ.Ҁhyǜ;e<i,--  zieVϦ^ô+xʤYG_<-Nvc;V/tǫQ*禬ۥ٩\kv328fKJOwV͠aS1^|E.]fN;4Y9*n/ծxynjϭ?絼9}]d Iݡg}b>V q,lz1$ɨ6>-3KU>i}WB ܧݮ=b|[2b498f@&N_$'C8Ł4ǻ#3n:uh:JmYn4Kj_jF ykA ó,_!>dԔQ+<Xv~WA᎚czK%&YQцN699FZQ pO_{;mP86m̴c'_Ph[{ޟ=vŷޗy˕P6o*oZVemYKUq0 Dxg0yX N,l ㆴ"=/졕@o9{ʑY>U#kzw>Z(@92l]!I2h%X;Qty$c~ã`%I2ji&zcVބ$ifu.'7W5 $$ʃm_EWYVib"fjʨŇF6Z56nߩ/daѧ2x$9hDVh] WPGCðK=r4\eksԵPkN 4SR옗sjfGxN6*cvpbxxJEvklձ\ٰm8~Xutl{퐟8_* rryyemYwJYGWz]*o\1-p-o^ckd׾JģL^rdnTPX,zB{)#^1{I|yoCmӿvyWH^끴 %RӝVC$M[fǴ!�Q!ܬEKՋ,P] 4 a`"mRk߳QÔ!| h@V$ N >)` <̞C2 1+.X|5}#W,ivԳqyg֧_!+oR魞#f"eg]=рGc:K#@9WveN{۾"/9N wv׼-/&d:)Ni6-ׯ\0Ǵpޅz|#~rdnf^@|^ʈwL^5:vNyC+$IFja Vmx1Q$(>dXUh/[AmǭYg&X{[ygkaQ^j׈_z#%1Pd8C=3$nl6mm͙ljHh' w}ߪ!NklH7<tV[vvkϣ^ld;8868l*emkP+ڳ;~y-o%j(Qc|'av,I[M23 Vx>nVܖ? IѐJ :VC>:`---%I*jWmؤ<Άy`'v8iZ Eb0{'sC_ΗhBtӫM"WaʰiYxI 199xs=$nl&m:hBYx<-338ax0_ρy|6oj"')%1͞`NZG6{]q<[2R-ŗӚ[#Vݦٲ\Űa3i mҞuw|+b*:#ێŊuc>ʑY>xҮx}Ǵwۯ)aHnVܖw!V7 ihWc~ã`%I2jrzxL<8m@z@,[aY^lC|wl.7r<;j(Y}ҳ_MFAӴQ*!|X s?{ٶ{ ^NUo洹 ]MR"6vv4gœo6l:  9ٳ){_VM Bj촙Njσ!?́ٸmDTYwfrm:z8s=,Z_I9|[#|R'xiZ~$i"ky7+snˌջIѐJ V< ~؂H$'qh hs@/'ZvijQƞճhӁ_}ƴq0D_6vnҦ q_hţaž5{6ck<{99NjFM~6 W ưGZi-nuc>ʑU>ҩxy4Rʜ2c;Dd4$I'VWVMKh&?O '`-H$]֒$I?{5 ŃŰbM m RTA[$IZ$I2 auD >zi$uZPTL[$I$IB$II%)XI$I$I$EEE$I$I$I$5`%I$I$I$[$I$I$IdԐ$I$I$InZPP@$I$I$IQC V$I$I$I2k~~>I$I$I$IF u̘1$I!>|i$I$IfPQw+VUVիe͚5$I$I$٬v1h'SD Vk׮ˆ dƍ$I$I$,0hLJ ,XBܼylݺ$I$I$5.Fd Vh`/mdǎsN$I$IlD{bN`%Aھ}zAwM$I$I͚h}vrD!C Z=Ix9#{%I$I$fI.FdWUFRDd]^}$I$Idּ_+APH$I$,Z#.XxX˔i12lH8e޳*`mg>V$ٜt͊V$W-$EuO R.[.qf7 `mX}� Gz Odg1= 3d׮]i<621oUzK/ظfzR6:kGGN2UhӨd (otjDkӵ{9{( 𽉨[~xP#}=>Q^DX$uwT2k V)f ;`e~Oϸu .RzScx3fڦk22`H~e̸rժfk{U9A:.Z'C -y7:L78xU] v~]̮]و7!er߃MMs*ykV^mrCN}|};o+[m r+7wɞU:yX9{\yֿߡ6/ȤSef9o˕W׀@xɒB9ϙ7:|(O# x=k1S<#T==dƖIR*8I헖RLΙ;OA�5C0kٰa-Yì;o:6-tM9-AC{a5kʸ ec!FN6-PO5,,ZdZ . ~}=(qfNSgSh86+1,XOcv~]l"L 4t| u#[>_{ąF=yw=ϛ?_ms}i&NƎ:Ϝ)ϵ}Y Vc]]x:- JaK-pq\A齬Vuv>P? iELUvmxRG[6o&I3!ǥR32/*5c>۷}|C+.5005~XpzܗX}i˞veK~\iGլ щ=^MW[p?yvH͜fK^خ9_͛eW}biᠡ'P/jTQp]i ~4M7oS"=MZlF 4'j3\o'couno$<VA;ot[~k@yҏ 1ClL5Ĥd#4|hy JFf& A}Zպi=nxZ%]Qư&8-+Vlvidt`x\:mѥ@ָy3/�֮m < ZaSϵ[9bOnŢqM"au'.ǵzܼqtPYŅ:a6mk׮SxVv'r NlLV `mqbXViY Oj7{ݛKcG`QZ3 g\Q='E?"{V{ Ul۶ݳ@5I[8}Ͽ:蹦`b/D݈QUnӆn<dfxH$)X huܹ9f+zC3}^[͛>3fR2sj`ㇽ4ʞ~+f s[SU9`=uPFw$7nTC"Xjeaa V7i`u'l8w<U~ Vq+3f:-ܥ'O4{l [ ǵX |H C۸Sqc&<-7`%aŇ %1*ڢZc*8Z?xUmc>z85 bk({H_h$i+\_tnlfU)XOypǟ |V<&ϾV-Ebl28\&mn0i<̳j`yPz|Weʾ}k/5 i6mzXۥ~p@1 u[V0ƳcǏUW;ڲ~3I V \6j+7JҞ$I$IRAZİUu(ʀ=I$I`%A46V-0n1Y=I$I`%$I$I$#/XI#R$I$Id $I)XI$I$I$)XI$I$I$I V$I$I`%f#X)ZI .&ݐ I -V`ǡl;Z䟷cb/D$I2#ݐ I M.Fؕ`m-RZ^#G˫e|uL/B40V c Tȯg6:TT)oMɰ۬,I+Z9גCQ)8Z$I)H+$h`#ɇ˥El͉oO͐Jy}rzjk%WǧIѱjm= I^"KG`՛`%  5q:++M 4K*VNy$uyS\K"sl0.4~x(wIj),l^cfIW'XҘTYtTF&LJ$<Еjq{m<n:VБy*}O;q3›[kBJAADB�m /. مHX*WgJe2ckm(❴1_6*nM/}53L&n8vdύ8`yCdJȠ$P. Agu,tzvq!c{J\=?{{7{*|^ǰ=EAAX+vMԛ`}j)`@UT!<5Od5wf/\XFۇ^ 6LR^E}Ϗ8]N/sX̡ޘRW%3\3Tɠm;�(X  ֆx! Sw$ bLkvϏ[1/Vx!w.;2԰X Np:xX₧uLc3:` >7{NӔeV w`%  F&Xz1n7 GַsX̵DXx'}}ԯq V5yj5~K lYRPVEJAAUbpV v+d!+r<vӲ_2>MV&M;/oqk@\='ׄ7`C`:*KtCtaax}_L~S:Rq;gگ`ukʓ?|U/1m۟sZOJAA,XቊR8X5ԗ`*0agj^unl^rLOCR.RBH[wDjj-XHH[nlV l4hs4Vt;)݊R'vtb]@),-~ՂX+AAA4RJ:b s+iM/C  5j9s[ZIUOAAAIu bx0V]H V  `%I V  `%I2Md^$I$I2|mcâ$و+*%!!$I$Iɰ!GUTT… ma ,B)--%=vV VlD=Sɒ'G!I$Il2DX\\Zv0𘛛kkc VlѣGI$I$9~xծmsk$`-++SVH$I$vNC$)X$I$Tk4) V 41cnOצ%?)XI$I$ h W =G.= u-X[8mKj9_<3KvdIEuV=Ed u!p*S*)t%)yRJi$I$INA):}&p|?z'gR֥`#ɇ˥El ߖ^&]b$yrh,U$RJ#"R=5C + .fjk%WǧIѱj剅_"KG`nkeee?A lԗ-^6|cy%*J Hִ3fħe{ר_'Z?coll,k5q%H}l>fy}IRVQ1?.а/TCǥøS> 2v]W*{( >'[y);K5)%0/9^-e2rukAl㘙GՉ%*=V4&U$U&LJ$<Еjq{m<n:VБy*}O;q3›[|ijuƍ6NF\}OZ+}fir؀n OdzP{{IQocEkeOatL;!ZRBV*9``>s:tND$hH/~lcxc ]q도are{F:dY_,3YP)IesjQ2[6qـwf G\{!Ȟq< wɔVAI2gG,]GX"XBe{jBWol%aS aok׮ҹso4:>k}*N>RFOS6-o)+kAAA2\71CLY.;-296 ZcwD"IJV7"S|L<V-&]Sk.J:MHSެ"&XzJl<dU}ObH2fvq ŜS} k'p=ᭅ׭ 6LR tpe]\_19O3_XMg-Av�D`rśnI,YѸ޽{r%Ȍ3>?_.rYlY>!W]uwysIQQQ<|o߾/Jo۷Oz!u9#ZR=Vt .<\4x>c/:KJ2du?P 7|c>3nذAt"\?7Wqs<V"=Hn˭_~/.H]ߡCU浗r.^.>vR6.^z 0@[nEvQ't7.uYn䗛n>C 7$&ʊ-ɲi_lVu2gu=8w|?jKLL,(,>_W GZF! y :!=#CyZ8s#GIV }p/77WgeeQa}/&SweDl~1HgZ Z{<uGԋ%3jA@ lۉ9\p=y iutjw*�-LEj<gÝq�[h93v/"d{SbޱcǂATC>[^y 7oKTSO믿<+w}Ijjq ?tRz /`N3k{M[95/R2e8 mڴ1O?lkYIǎUwߕ{U˖-%===ϣA>N:t#6j"eV@lûEd-7n7jo'ؕK-YfɅ^(ӧO9HrrjtMNloN]"Yn/睞.Clho Ӎ7۲W*Xm1# Ub%;SsYQNX/]yX'M9?}欠`׭ NSx9;񒐘6!!QƎpZ\va,|76m٢7m,ͺKcsW ,`G uGŇԼI?=f%3au$_/6NqmI+kpkmq/6!mvU5I:biݺuHaq3 ߻wopehW_}ڵ+ωSJ#*=x2Sxv׺M[95$@ݻ^&e_?Uy3ܹS>ү^I (^Dr.~*v]Dx}_!K;"&?ĖNT9%rn~=ud] V3'pQbu!/aFbdU/\_&,ت氦?˓#G_9t̘) 9(''=ZCP7mYs͜='pli.2{<=ut[\ ;~Xn`#0vוa!+r<Hݲ_2>MV&"^6d9qe^?_P̃uk# *KtCtaax}_L~S:RU>{Nq ^qXy} ufi'`EG^KVWW;ѸџGG?Cuy Cek J0;TԴ!m*Na;g|.?ib+6oެ<M\p\s52o<mZ#^&xvmz`~njH'R54;I跍e6^ʍ[{>rBb&ⷳNYiq9gfv?]祜:۩9=guKpe6vE2s-B14 s^Ë,YSFX-goޣI܈/dvOʫW ).(~9q]EEŪ� TƸQ!laR8?Vh}rֺX%6L+WmVCN?IaHE^qHUMe i+b[?֍ÊUrQ՟ ma'Ec$V v^kuMmGc1V bUMMbOc8XU׎5J}�0 yt:m9hf/BCm %>sQM^x0k68Gͭif?cv/ңEDzmF֗=l~yܸK8y6cU.0+cH)ߜ3NHHyg$#M?L`ܺR9^w+VȊVv9 FˡC9;vzYn}Sz!1eu2eډy>< L)̭-7bSboٓGS0 ?̝ÐG}4x>{GqUcs۰Jbbi]x <F/4xa~z19cfCD0ZόB.h YC~n^y]1\`[_9nKqcp)Ǫ\PB"S9gfiu[nFD*;=c}$ j^rC) Iy$ PΞ%,޽e'c7lӦIfV2kܐygՇƆ@}߰qk4q0V_`v!AQ9J~E<E4r0WStjѸm׮F9|š;wj'?Q=W;oNR} ڪ9?a7c,x}5ώUKN2klbj,6 S>U4`zk$moNY85Re);=#I66`8aDZ^ՃKHuR4nS`Ŝ]GCłHƎ={\UXNadgTcuak gRF1"c8+c[څZSScK ۲eu hHg۪%ɼ'I`} VxV0 kS%+I6sJ$I$X+J!YU_]R^e9$$)XI$I$Hbd}V.QRd$I$IMhdgg7(C6wR$+I$IdXȭ!IJJ$I$I$IJ$I$xkfff$)XAAMhddd4()X)X@S?="%XO.A$kzzz1!!Aaa077ƾk�mɗ9Z^-S7cndw1*W,OMavo] E dv@[`!9 ;vȢEѣAkZZZp2{lֲk-X@.Ob//.GK)<3Lz͖G%II2nّQ֤[S2$B)Z:>MUK9Yp !^u/X=S$I$I h[Rlս= ǥS4l>fy}IR^UK� JCǥø4pF> 2v]W*P vi\HFɓkdPCxЕwJjO~2k{U+b\Ε; ἶҘTYtT]WVQ#kCKd!.?,+Jh=TT6[5TG`%  G @O1<Z�M)뺀'a[k'mva [+3G%˲b2IgPĶ^\:?pTv xl#=,&7  =~N+.1Ҫr E}ύ8r 8mx?<LI:|ܷ")X  Z}O 4lZ{l;:ŷ`}j)`@Uxkċ]>3gǗʶSC!sP{~{ <XzO[tᡬ+{`^kM /vn#V AAH+҄ GdO1߂DA@p@muRKE{Z„k}tO鼶yR3jjaW+3(+1j<`%  F"Xah=^YS/ևx CCݤ ӌcJNᙥǫVV<68Y든~ԋ=SVWu*WFΕK\eAAш+[%8.X ӆ9z Gbuv:a&!+rհ^~4`Y1_H-&<Lޘ2Ic{b8U.(R4cX RL^l` 'V vr`[ DP?Տ;sڧ`%  @ 93J /_}VJKX1v:'4|<{1oZ:&<`/J0[YvpwU #-ueOĉ_ō`0°W[wG`$I$IdcgD+ټg!A-i :++IJAPAP$+A+AAJAA$IRAPA$IZuVAA+IR։`AZ9mLhJ A+IRnxmA+5BAJa P7ֽ2eZ 1R&N"eJބWsӜw�<!G(VVUc8kpmiٹk:6h0=nXJi&~4#&LÆ ~/`%I ֆ{U˖KEElܼYݷ5,Az3#3SO!! kkk@J&%5Ujjjx5ذqIuu߯ίZ洰v\=~d~/`?Y)X~N2U@#Nc Kޜ9{L>w}bjuH ^?xI^pb2Ώ0˕X{AD Nے/5rZnW̮ݝu̓C} Ǻu)X8VY#;2ʤԨlfeQY]+UXLV ^ #` 7:O11z߰Qm #nj}'a~yUWAQ)XHri32E}bsNC7 ± Vm$.OJ3Lz͖G%[D l 'NRQ `uQΝ@LU“9|YSpׄq'ӂz^5q:++BytPTcRم*l?3?=qe),V6#X[IїS\KC_ Ŀ&騔Y|TrK2<4buwzց*kV6B~M{D) {=*>'[FSC~;-#ڑT<8?wGz#UQ(Xw>(ǒ89~jԠw  ܓ;֧KbcuXVUU)jKDZƎE:V]` fzaD`F͂]E2|UnXE9.,;XS2y6 jAx&n8`xeʓ Q,Xfl-O+.1Ҫ"vOp"M%|<]g1]ьLٔRzZ4GW֨}7b{zHGZQF`%fLճ[PAPכ /]&%'fϝ<mùH%Ayp]k{ADT ZQ7'Pzcr a$+<+ͩjƓfUb|<PQ0.MU5_6"m<\b&[ѪA4y ~g<Nӂl¨%v"jlpr[kܯysиRMC<mGPց`% VAQ$X<2a Vx/!t0df1a 9vA@U+j!ԁZ8<)]ͻD4ŻYt]a7xpwe OoՉ%ƒj-ia當2 }xd``%`%`/XZ!Ņ5y5Ģ<؇Ս`6 ׵ cq)x든~!MNτyN6w|֔ Y1|' vъ!AAkîV v+r7xa^3yc~Lx>'#XUaa`+deBI<J!XI?n5NV[F 3= T3O;sO<wDyn5sX)X (X (X.@ FpFJ_b>&~G 9Vv Q O(g˧sCKjjO\BsA1dj` *<ߚc.`V FX~/TVUURRAPAPd&<Xتo    ZeT!A+A+B16RѮ#Xј"I$I$H V   [l$)X  $I V  ,+IRAA+IR6=YT3gΔ_WMyK~Ds~\E49Gu$ kmmry']tQF? ݻW~Klll~jYv5ϗ?ӟT~ȨQbM .@Zl))))u;wPyy53<S.Ry$''[nkeS:NO[I>}oz² z X'ں.[1岾 V$\<Xn0=lذW<Qa[f76x0;vȅ^<GdyV6c}ޓujO-̙#JbΝfwy̘1C Dw.wuթ `7x#NZ 7}x2yF/XoF9~w /X1~*[1V1)PnS=oA+:KnVٽ{w|MMC*mӦ:1{lܳg.ri߾r_msZ8~GTz [V9sTJ<zRÎ8 cӋ`  WYYY*}j?>>^wfo_k >l_y֞> 0 XcT%\ޗ/B=_.+W .R_}U .?ϩNM�/\\\<p_+K!Tt .<wkWڮ~_WUU%\q*6}xҿeVbSv[o%ƍ h| zXe]&{-X|N6gׁ_~YK~k.䜟]>xyأC*-%_JkhyLݜ酚^DBhfecRY]+UXLQ+*}>%X[j%D^,Sn-((~Z|M8�~wPN.ޏ>H*_}~4lJff"N]vum;T?ɲeرcRTT$;vmۆEձpEթS'>NC k1,5&&F}T_ ê y:}O B ȇD9G_r- ?p64ZhAuj�lԫ)u#]NؘNݼ^pl$Xu},b lۦO h.4swuGtMы`F̚5+,;vurCP1EM}N@Gq/.GK)qfN]aݙY&=f#$((lU/G&X:/++g} k<q�ơ. ^cc/#sa ׭0OaqjՇvNbƋ]\?jC}}= .tfK߾}m;�<z&4X'=!=eGeh;'%%Q9?<p_]s;TXt {> VNϮ~_QV3ṩVcN~h0wbC~_ʦM<G?+?v+XhL2E>ԩS=O൮pm۳kuVVp{՛`hؗTJEu:.ƥI$Ry-$KY Z8]� /uAYt-Ij-we\;ru(xlxZBzXjw 3asF`(u�Ǐ}~\k Vؼya<G]ߩ}YcӋ..⣆x&4 - ziѻ!z<<5}lەcoT`(~!5/yfU}Tt {] VN]`W?\~myW?a<tR5lY,Zȓ`y}׵n!Vav#X~^{e} ֏v=unO4=e5SCNlCxVj%Ҏ>뒏*.(z<lUl(S,e_u#=L~@̉>$X,&I9rF8txȵ@ ǯ?b.l2jMlJ)(jw C{1<kGV-8o+jCb̀*`A x:S z+5@0quvi0-O'l+<u�|ĶU/Zy ` :Qo5zA*v,Na;f4x�cV?诃5:q*/yn3;=zV5ViuW^a[[4o5iW८pcxÊr޲)kjCyR3DL>5@pR&fTcR o9*Sa{y'䠝64ԐxOl)\b{8�XZۧ&ڵ+d1{'MzѵR1~!sXsz<"b[aXlV ƂШ 8p@x:`HV#/|jYZqhbx|;'s:CzO4t*hs3Ϩxѐg85X[nNyf<µVeӮ)l/Bg+agު?~sX>V7郗'N6Y৞ziL ,`ͨ60)f /W6n6v/u{`%=F>7pAB<V|yX1丕n-+tB鼓`uţ'<6=Y( ?;^c XpXs0O0O0Kňa-X@bNާ~*?O,XHH[Ia2nlVPK?�ҀU+a?Ot⣇2FS\z[ ڱfiAGlaHV?yƞ�V="G= Wj@}@A?\s-beJm~!q;CSjk*v,Na;f4x<@X]T[;2;<w>|?8<tJ?T!h+/7>A|ӎXB+M८pcu_sXpYxCÊX=^>lyXC) `%QSH4N4'0Dt۶mLgUcKh߇ V,zdJʄ%ް0PœK(:dE"WƧ7Qʻܞ7pVVlx޾ʛ [s++aA/1"a)h{`% (X}Vj̖5f/r5@V.W WbA+O+O 9پ+ m\*X5W#]x^0`WQp>,IJ%0 C]^z饐1  ߇& X[ORAADc-[(X)XI V  `%)XI V  `%I V V  $I V  `%I V V  $)X  $I 3gTԟI,4}3oY.k "ޣzF VlV}]9sΓ.]c.\(wuuYr饗ʋ/(Gq]YY?޽{6ꫯk^3|,?O75**?.Vy>g e˖ kw'{rzᅬwy晪|$''S[nkeyN/-i+?iէ|uXTXvСCO;`䷜Y][e+:9UrY+Iu.X,7pj6lX=ܣ>XGUkNZh>5ko[ٸqcW?C:رc\x ;'''?ӟ'FfpٳPk(y2c e޽oD}C)!XV[&O7(!WHt_{֭`mJ1I V?/mݦ7o s9'bA+T[oUv<_SS#=zJy۴i#q /={,?v񖗗Kϗ/XkۊwY] bǴc<Ju*=>yzꥆqMj:߯T~||:&͞믿^+Wⵌg+'}nfg{+g?61so?K.Q_|}ʕ!=袋W_}U***,FsOv...sڜ|W7|c)$ʱ1NaۅgxM|+v*+P~wCنWK_fṩˬm7ޗzKƍ<6o<-aj]v۷`cg?Sf*"^~e/ax=u8՛^{7СJk�mɗ9Z^-S7ck^&[xeVI9a @/0Zf$x X;iᘡXYY*Mյ*OM8m C_if͚%"֨mժzܳgO締@~iy7m@wiC9 x?#�C?OT7k׮?322,Oe˖ɱcǤH:v(m۶ cӋ`SNʳ 8P} \3bfLL!xXr7>-vsg3`+!VﶙO}�Ç䛶%Z  ?p<hzi:jee9=wn݂iJH8cc:v^x±`{}gʳ.믿n>M,o̫sHu]tM70/uܹj xX|ٯ`2,~nZW8EHkI>\.mF(bO)AҘT-oG%s#Ȋ%.YXV&(J,:ɾ悵217[d##ⴁ+j^�?яLݶm}۾}{ )O k<J�挡. ^cc/#sa>th@ <n?3z1cӬتbO<F�Pw}jGU)3ҷo_�7φ^` p?qk7|6# [ﶙO}l 3lx\!?þH14cc:v^x±{a,}|qcxn2?iTa>D9s?k*//eӦM#;v[CLpix:u'i3՛^ '{L>ݶ=[<.]ge7XptKY Z8$X!$U̲Y|Trmp(Z?t\:K ocBu?:7꽒ޣ-N�txp+0v]UI92zmJxwZFȵ#W; =n= Iʫj)Nú|rU_EBCe BX~D~5sǏxq=_c^<轴͛|9 >NȚ 7^<vq5xLhA [h93b1ҢwCy6y`iḵS>]C�UA!ɻmf/SǶ[ϣ& _HKڜ,;rlLSn R8r*wv]6/?sy=_j|ҥKհigh"O]׺Xf"ڍ`mϽ+Ǐch~者<pG~ʦH/`Ӌ'<>čG԰P -oO/gPwon`M+.1ҪJӜZ(u CNx bCt3x#-X*X*rMQcJ()+}}$5lCam?kg=~enԚ<ٔRJqsX,`^xy1zh5?b6  S:y+NqRí c>o|x!0-OKaW+xV0,(;+jS~ Ͱmg3f'` :QoIsrXڮ)l/Bc81+kf:Y3SЩ{N6sau}P0n+x19\{7ëKnoǧyqL[܏mzX=m+y˾<kخ=%,88C\1<zN^sRڏM z0p`U!>5@py IvHuͩߘc͝'+=s[m:ǸkC=5CE) $X1n` Q0qc"?@=8&MzѵR1~!sXsz<"b[a`lV ƂШ 8p@x:k)>}/~b&~p=o\}4q=hqv䁙=&]nd{#0sP`vH VZ Vths3Ϩx!X0aB?r9=7ӎklmW{axM[s03 o՟w[?S9H~OzCtSOy=納o& G^fԇ`u~?h᯶xMƮRW]BÊF/!~bn+pTlWĕ6DUb( zmSHߘyj~86F]:;;ޓuwQ  g-R¡! ?B�8y1 h^UO'?e h+a[?LƍÊjx�@y�x:=H4jJLLTܹ3(ڱfiAGlaHV?y`fOI94`_ch07ץ`uo`V{~Z�a<cNm vPMskk*v,Na;f4x-VVbdn?u(|gn҇'N6;䧞`<mE^fԇ`u~?0mˈ+Vv_۸i՛^ 7h?bΥqf_+E*_'o~1+}Ö!|#%Xώm3^b1iViFߠD("ѐhUcKhԈ V,JdJ0>/ vkn!sX58$XJ¨�[ 8kZp0p`kw,. (>I#Pvl c83qxv/RFГ^bER'A3 Շ`l)PCMi& !*B]`pT"m`lrJ0+4Bjj' ;WQpȮq`7f<>¢Iӄ4ObA aoe?U[%ϏŚ+3kqWU-Ò̗p0 uy饗B  / ֛M@OV>++AAܰe V   (XI V   (XI  `%I   (XI  h>`%I V  `%I%?!iw#˅Yx\DSٖ`%I V/xmmry']tQ4̟?_˙g)^z<sS/ٽuU^s5̝;W?OS;o޼}HСC3%\7̍ᾏDa֭VDŽ#$%<n}OZ}7|s[ .:ti,X`Y3klE=¶ +I$X,7p(b{ذawy̘1C Dw.wuW׮]+^{u뚵`ݱc\x2g)..VB;wl2{zK rYb{mB> ouS:C֧ML< oQCq&+2$mݦzP~e8G{ $W^yuYr뭷ݻ-m555ңGꪫǸM6RZZjƗ_~YK/]v!Czz%կ3P :w,_|"qL_-]tꫯJEEus9G|A˫3{<2`c{L٫:mc>[c+8'fυ0^ٳg/rYrH4\&#+E}7X 7eWN³zc 믿^#O몪?+Bw٦ZV*v>u󽰫Б7nܸ1i߾g+Vsˤw޾w&~̶LitA?₵EӶKiy-11Sc۬,I+Z9XT)j6ukj%JV%H iQ<.hQvg6W,OMn2Uh3rCeآE ߕ|V$55U^j;ql gϞrw+oqAA<oZƁ .LEl+dx@? ^]܃YYYOLO,[L;&EEEұcGi۶mcGOҥK/o[5DcHmN$))SxNyb~4>|̸Gl> ٨W+++= ح[`+!Tvt Md4x} Qu|zz⋦}gʳlۦO hn4Owu;%o&$XQ9f ;`e[2(B#.XHri32E}bs,|^LZ!4):V-=fKIYKkZJ"k aDDXª+$((ȂH,qaY.iqɻ"Y2 #30 SM=]]3L9uގշoUߪnzg_vG?~} 8QޛF-fѢDG.e㏛ /'xq#iN}/F�U\˗OȻ偩0O61#vNXl"j�w<.\'N%,[l=Ǐ9t0^@l !F< o+{=#GWq^x�~_Q6mieb'͛7M]Zsu#hpBjٲ:V{uZT>Aq)Θ1#͠r9zy~ʞꔇqI&#,QFFPxqڷo;%v ?zLˬ\ҵ?뛰1F4}=\v yl,v|ӿ5V\H1(m.:.F"]l|2݈MA\})T&RBr J}.^;te q_\ o\]sA߅;pn<z[=(?;#}-&Qxy"gVX@vݠ;I NyAfȎܢ&R=& OJɑVcFH18n$qïxbsӡd*?Sdxs3Q7~)<F.(Z*+:cFA]AGQVFz-D%۾n=2 0DOPG;{dwUu**o?IWbI)r8|ie藰ZìLl͛7kV!Ch {iGg;}ٗ'G&>n@] BOM(L/ D/ч$ @T6pZ[Q|Zw~xתTR3H<v2TxA *'xc%RɊlYE{m>v,&폸Km`'yN8m?C$;�ҍ9Ny` ۋm96dLv_SJ�#rJ3‹cʫĶӨ$Qbѩ>SV|@E<^et;XHӪTe,au~f`vOR^'VwTg]tt2<3౱61G|&bbtG ONjv^~e 㕰b(h%vN'h/y2SQ}l?H!Gj׿EhuSvv"uWq2Qi57ZkUD1!~xnKVSĴ:Rϥsk y"fZ8:XO"5XL.An?N<)jxw ک`<`l#E0!ѣb ; & bEǎX$U~v|qU6lX= 40>իԷsΉ}C >,8$!t갏0F$9Տ2_ `x,Z[&խnGFի83ZVwTg]ttVľ![n-:#l:yJ V/˅<2T.i/tϩ^r!vN'h/y2Xt ?2+ =ﱂC)Ę~L"Np!n\__ILUr+!`u0ےϒ"&So  *y,~!2 3R,25xoUy+ޟxl?HB`y''?ބF2䁕x6꫎?vؑ8LŊ=g'1Vö<mF^Yc`+nϝ;X> `5F5:Hr]񣫌.s1"i 4Xk~eKX{dd>3wPGd޸VwTg]ttV5V={v%Kg<b|0 4tPcw7:^M0:e۫]^bxh!vN'h/y2(bXq݀嗴;aᲈkzVx}x%p g#FxLӃ퓰"q>t2۫Έ_au+ÊZIUr=U&b]+#(guC@WY,^b*CW]?EJJ0gYp`9v7bXEDezVri"߄uיXA+bZs𒪦QyB?C *vL 0Rk 녻Zk!ʮ/# ?lJ1ؖcY?#6;Ű20n0 # ++DiHX o NargO<X%,a'++~7aӦya`,$/L� o!z3>?SE{~yy}_*r!4"zjjwbM 4m3 +I `0ʢSL Ĉ/Ng(V`0 FNƁr .>-b[r/LX2 `0LX9=SbzHV& `0 VNab`0 `ʄ'& `0 VN81ae0 `0ү?˄'& `0 VN2a͌7 FfKl^Ef1'|GLX9qʁ5%% DO?4,X>qj2@)eaLF!= uɓ'3eôqFQ?C=oߞ]=D<xʗ/E]S #,VZ=K̛7/M69',Pߛ^}ˌvr) ܹs^ϋ秹w У"YqQʕ3egN:j*u떐uт`3oo߾3#kF*X 6KfyZJJNN8^vmO+GOXwM/H{aš+UJVS!AGSk֬pMtt4 t krD>@dd$=ct)q>Ӈ-*q,4vX*]&wЁ޽k?s hт *D ͛STTy>!!z!Cɓ'k寺_NwܡyN:By=3'&&R"EDݑ+V֮]K&L,YvpIg{) b`xmۦkWmʩ-?Y52)7;uVTJ KJJÇvϝ2e|ǎ^-& nr;ӦM^^tjoO-2mذuaj%Jӧn�N:g? suuF8T~ny]t'k׮ZT0U@ݻ CNXoܤНɴ|Mq8qy]q 8ә6.@I)wd~oH:u_Dϫ9Eޣy76™<fS !7nZ ߟ q_޽W={0L?QlP~}|H1"(:uTW$ԵmۖgPm߾ݻGoߦ^zQΝ#G2h2䯺_aECotǏo^RƍhLL -X/3eo.5dGQlF#Yc0r*`aW1pkWmʩ[}ӕANQ+XBt/^H:uYY :]3:~N6mj-{W̰Udº~z18f͚kU.?zKX5kF:ꖇ]@.\/lҋnK tmJ(!'v¯ߧ_ ۟mf?c<-&7'Lenc^;=_iHj9;LW_g9vj1+:-'brarxIT.OtRlJXq5<qO<񄹿w^1[ ~bwO?v2eĉi+[kxYL1�b,1t0h�Ϸʤ~;!Stt90K,I͛7κxTZYǏ-CV1Sa0RpBjٲo/Xfc6*Ͳ祽Pɠk<3f̠K.^>N3;rAX5?U%.\ҭ&MRn:jԨg*gΜIŋ})Z{?zKX^jQ| [e˖om<._\K7 B+Wg}Vkz<}=s~R D>H'yl,~=iי�7s[j?6SxcN;op4݊K 8&?o{8:.)L_vGQl|2݈MA\z쌸ZL@3ϬޟN1=MfZz<QB~_5@uʅSb0FX5}]AÔQLKA)"0N/-O6p^Fla@Ƒ@q/.!Ld_uFz-dS_|QֈcYֆ7| LkWmʩ[}ӕANQ 0uZ2`�2KX $)-[iXbZgȐ!Z鸗>~ԧS5.-^nyX듗2ZF~U%< ZnP?%ǼvAq.q\&g{/ 2i':|1>\pN$x#6pK[Q|Zw~A/ @LUxXq_Sɧq|ت˴4XRGd<SΉa *=ӟD 4><^G4 mn=a OWmhnn dG^Xᣏ>R¶[ybӁYƏ{+VdT孲F,W;Yxll,:DL]> vV|ĽT锡Jn;=ڽ<7/HJX1mi:KXU훝NTzU'oSgd[+W443V]_c+^t񰢞({< ϧlsG1M-AÓ*?{g]vyDsZĹk57ܔź(v9:a^BVŠ^xI ]n<z4swx:�_gM +ܽ>~_ Y >eO? ܰaÂj��_`aGRV輬^ZL3ÔZ[cj@x U<#::B+X Dg@˲c[ei׮xot0)`~{yɩ[e3h+.]ttVľap[n-:#+:yJ V/զM2TmGCU^@/$պH ,L{jt"^O+;v4FU~,3 VV U'6stdDhdg H>E"<OǏb*f3z~up{9C?{L8P# <XCEXϞ=+/<bj h2Vö- pA W_}5`a(ܹsO\k]҂MUWo'YE8,a5Vh8+E|I'83#'dg̘1`튼fT孲H] F]EU|qx6c僁C ۉw7:^CatP%Uyda5<Zu^7;yh{wؑΝ;bŊu*U@Vx: gx kB1vaX߄yΐaJA<1ˢK}^WK@VmaS<fOހ [?[#SD:rf]ed02_rŠŋT/V ^f�u#HXj/_ŠU1v̺S"XXax?7D^]S #=lQSus4 YyY9vÊm9w۩eqVx 1LXYX:7Ä`0 Va]q o,:p+ߺ`5܋7(A_ܨȩ*_XJ^ > gfUG<guiEiD3AŹ;I` J0V'bMr?MGo񰜘2NCf͚&`0LXӍr m7rb`0 `LX3{”1 +V& `0 &LX3Ehu)&LX2 `02aĉ +`0 'NLX `0 &81ae0 `0�rĄ`0 `ʉ'&Y=H +\/ "3ɘzG&8@šB ~ ,H|8&k1VN)OfeƍTV-ʓ'=sԾ}{v,R3kTr]W~d}ժUK6#TysKs|ӦMo=s6V0z է@o +'NҝΝ;^{5:H؞?~49ڛUGCԩCV[nQll,=֭˽}#r߾}3}GQ%gF֌U6lHK.J*pvڞ&GOXwM/H{aš+V_#hj͚53Ι3J*Ey5jбc<cRҥCt]_ԧO*ZH1U =䄗XbvZ0a*TJ,Iv vҤIϊ={ǼܹCO=,xmۦm3TvG^خɓ';3gP-ĵ ͛STTs+}uknJ*U ٤$>|8 SLqZ-SNzi矧{̓nUXiѢE 6Pnݴ=X͵D4}t߄խMv҉=è./K.4qD}t5X듗~[Fݻ CNXoܤНɴ|Mq8ޜ0z2b)^2}Oڝ^@"R\JHNS? W2f4&Eޣy7Iͼp&uLX"0Ѹqhe#3+g}f6ڬY32Y:u*իWOx~m۶ԯ_?_˗E'sĈϫztbbbh?~ի_rkH=j(|4>7> m3TvpȑM1lPm߾ݻGoܹUM]t[0+VNŋSN׍7NxÅ?cW ]~2TtiӦtʕC>aAUVSNiS"Eh͚5AyX~연]Eup¦-K/'/e֟ѵ*}`򇜰e5 ~:|y^$ly~ˉu&V.U"V\2~?Gr/DdK8 -fѢDG.1ca}͆O<ak / xKX^jQ|}Lk9}XN=i4L2t s#we˖|^߼yԓus?`2,,{ F… e˖l~Xmש }8ɩ[A׾=Θ1.]z]r=fvpk~2KX/\[U;4iDuQF<{U=sL*^8۷Op[oG~ [Q-[Fo|r-X듗2p >V\ڟMX&+}xVe!KU wn(Imğ=WS|Tp H1Е)}q/0n۞(eKWĻ߈MA\ G 9p~[DŚZ I)L꘰ J5n`@@q~<bocǼ{Ƕs7|{ F*;hgH)A(rVgg7ueеn%0uZǏh_*/<l"Mc=͛7kV!CKGv$ adDwߥŋ-k}R^Oݴ➐VLmCBA6LX?<UdU=wu3gL':|1>\pN$x1&c-Ķ}{-j9;oFhݑa,R@Oƻ,.ˤ kPUj !#/( #zXu:TsmaI+1 Z V/(Nk\�Jv8o'*o�#* :BgntX|@f<*0SS*h^ڎ"+aE�i:KXUmNTzU'ooi\xq?Z3:‹>w&Mf<bACT m?cN q:x"f2`A:y3R䕼z;-Bf|~L=f :guAVL Z 7}ģ =y&uLX"rw[%uH!ɓbI޽�? 6yx.QjժO? H߰a<w3Af嘐vډE1 F^o3m uW hWSiϝ;'y;9Uy rЕAGWlEbОaz|:#+:yJ V/զM2TmGNU^@/$պH , aUv:QQVN;v4Kȭ?c+.A bA&fZ yLI/$ C o[ SV,rTǤ kP#H#N#d0`$XF]_}U_ 9�DX֩,nCIXU05X^O>)⭰ҟ`0@vƌf Vr=]q[% 2;wn.5ɩ-?#v%ttU.j<{K,yL{"0v`pС"ntȇ蔡Jn;=ڵwjxᡵJd;Aaǎiܹ*V[7^En[E(ȟ1քœ@`v CaUyXG )@XeYm'LZ1ŘI`+#cQ`020EСC,g6UV)K#;gBNXؑ*QzM?]كsᙝ'cUoİb%njX"Uv.A#VlBaj5(#cX2ae`0 aWrŁh1 b!@t{(ѾK/ O#9y왰b-J0i җ\Ɋy ^nYc4kW,G:uRetˉ +V6 `0LX5+2 `0`ʄV`0  +'&2 `0LX9qbʄ`0 'NLX `0 &81ae`0 9`ʉV`0  +'Nz___? ##=Hmnu7'|GLX9qʁ5%% DO?4,X>qLƑ#GA?~*^8}A,CY +5nݺE~!*Ty9rc^jJs7n2ɓ{9j߾=]v{| O<xʗ/TrݙUW~d}ժUKzr͛Mz~AF1W{zVN8;a;w.kty=|3gdɒxb/|=}nZ=4}WΖ>*ԩSVZ%Hwll,=֭ˬ |C}EAX3RWʇwlذ!-]4*UPrrrڵk{jǙ>zº{nz饗DڳgV&`Ą5_#hj͚5}ә3g`߿O}EmS5 -Z P)***9sPR(o޼TF :vy>!!z!s'OFp¢ `^ӧOMXqرcXbvZ0ax? :ڵ+I&ѳ>+S wܡzYm۶M[}tbLݻ혎ʹʩ-?!257uVTh.ȃuIII4|pa)Sʇv^-نMn'=b{ڴic=Mtk?O-2mذuaj%JӧKI'~wܭoaϩPtB'NG׮]yэ>y雹#B_ݻw򇜰ʰ;85}s&ݽOocd/./| 5t,%&ͻId D1VhܸqC4`pcZ( JŠׯO/_ ޽#F( *޽{tmիu9f͚QDD08⹑sCMXO(7Y�?϶`SA_yҌ~[G2&&,X pC'~ʕ5 ۣFC#ظqcf ~bb:uTWmR~<1iSl v>[btcPNl7n, Ǯd~Te|ӦMʕ+A|1‚VJN"ׯ"EК5k2_VW[wu}C_ؖɥX듗2pG1PD_O</?zz'U7ahh+ޜ0j1;':r)b"?~'}lðWLu1N@2eĉ>Fʖ-6 Fk^jQ|}<PvSwmڴ\r+c-4:[8qM>Qkw?~xέ԰0f ,\Zl[>0Bxc:6**dеkn3fХK\+WN>\]9?U%.\ҭM4~ݺuԨQ#^Ulc6ֹطo_ ѳ_ַJXP˖-~y\|nK#B_+WtϦa=c<Xicĕ{!'{VmDJHNSW i<v^Uy5 mO]I^fo򗳴[L&�tt\^w%DpGn n*&a 8oJ+Ǜ1U JLo1;l:v %aE $S=~x1�cckc C&>tnmXiy7y0>p :~Ut`א0sjtlUNU~l v.b$xq}^9ƭmZ .Cպ@۲e6,6oެEXAp `lGVsNII}W5b�SYQ^tcO^k_d8aKx@?8m&{.$<2IrA/ʼnߟNOЪ_v ч N?0'>uG]x]hL9G̥53Ԅկ@ 1U:{\a֬YF)9 "c*VLc0z 4vT[}49'Wi'*o 6bȠ+t1�ME�|ȬU%;^xtP%Ohw_ 0^ +(x;JN^O@ } 3V]xX4ۇ)Ιgɣ,a@]a#\cۉoû뇰3oi*_!S,0<:D1VbJ06�^O?4 NpÆ S6l^ZL ;w1~V=tz`ؒ%Kt4yJ* 18y򤐯w޾:rvzrl 3aM8^o [pQjժ/;f3T孲e2te[8g*MEzaU'O)bX!E>x00S*hiuϩ rҳ_`aZ~:uF;sVtь/}3~D(k.AaM Hg=E"ᘆLL>`}^B_xh>ybցQc*rȋ.b i&NF 1wb5G&@NBNG&!СCZB *@F'x8a5V!h0O š1 ;cƌ" 1\j6:vfɩ[eёF :�V5V={vy 8iX. :TݍN~bq2TmGOjjxᡵ*;yhwؑΝ;bŊuo֏e 㯣 a؇7UpyVLv75" <lyXeҊ)Lsaeߍ`xXάR FvGd8aGn5 KE<&{a}/JO;o8Q\ōz,@Ě':h)!~<la S1?:,✈V& nh `0=aXWӀŠP O+bGgmEXhdqGuq]xZKuƬbGƣ ^W X4Ex|IbM񰜘2a0 ȶ5#RR(); +V`0 F6aN,Ä +V`0 VN[ˉ +`0 'NLX `0 &81ae0 `0rĉ +`0 LX9qb`0 `0aĉVF/+3 ~ "3ɘzG&8@šB ~ ,H|8&k*Pֳ7nH+V'|ʖ-K .1u^sEŋ>'7cjբ<ys=G۷k׮qipA*_|Ϻ߮JNڍԕYep_jf*/|pn޼yioڴɱ>gNצw F7Tˌvr) ܹs^ϋ;b 0`9r)BW;wPxx8}G<msMbb"ф ��V5ԩCV[nQll,=֭,i:ٷoLQTə5#u|xdž ҥK<aR %'']'ɄݻwK/$Ҟ={2ara}<ZfM|0͙3O>ThQc;v pŊk BWP!*Y$ڵr*UK5jԠcǎ^uVT1'NMgΜ-Zwy}nݺI&y~_xwҥwCt݀<MF?<=cd~g={RBBN18SO1Kbdvn۶M3|=z0ɓ'; ʩ-?'+C(^DÇ^xA<wʔ)V«%$][$쫟vB>׿ZhylÆ bD4}t߄խoL Xs*?<Tb.]]^{韹:߽}t]r*ysBF&IXeK|@G.Q׿Ed 7L{ݡ_O7ed=ɪC67n Q˥KϣSP~}|H1"C ,S^ʕ+V 5k֌"""QLjLk1g/RN|yXe3Ϙ*T۷ӽ{:w} F]rE ~_SNz |tt4mۖpH7:z$l56_ȏFqٰ̒E[Uȑ#oðNDBeGrcte]jǍ'<*Aϋ^W?!|TjU:ua]~Uf͚<^~ڤPVҫ-ջ .\er駽RnPE?<^HEf$fWjlFEa3kpfM:~^(zӛ>f `'p<yR빈)eʔ'NQCln޼id>{AzG峽3f̰%~ +:bZFB􌎇ӧO|υ \[zrzbƈ/W3oٲXmשV;bS+C(W[]\9G|r ,[釰W05iDuQF<{U=sLþ}mSiBEXK-ջXl2z}˗^{)vYVrJl!Wn%R%la|sbqMr[q"aǂ!?;CK%}bdYaM}wawW1.#qI7pKL_VU"5sIG {Ɂ8KS]Ztu$QizדaT6bd ocǜ ~0s p`d#&OÊQj1c4J^T8Ȁ\_y/{˭XBx|MfJLLөΆ:}*;bS+C(W[m}oe9~xs2Y۲e6,6oެEXAp SoWv$ azNI~]Zx,#?2ZFa ?=Y;r؞ `3>_{80 p9SPunKqbz+HS1`y|}dej6,7'LȺm,S;I&U< tuwyUi='~yJG1ɥ_kzՓÊ;bX?<AXaT1g�#{8{ ʀ]즗 1(=(Cx(~uNjM.xN߲ <2iAQV03^o͎ɩ[e솮 nZdê3cp/<U:ei �ꐪ_~Y$x%wVU =$N^OȀ3j3V]]ֱ^XI;ONJw7_ԿՑbD&kv_t~TkoX<YF&U q`wQDžFlbM?aEtZxޓ8'Y"]J0F\j�J0b,~1CezVrH ViP~ k֭baJxIUӨc,(r!t2Ν:=1XR} jp~QjժR5be-ҴkNȁ%!>cXXz;CmZo͎ɩ[e솮 n)E +cX/W6mP%l<t^Hu ڱ`o6)ө32߉rcǎf\x韹:‹>9 LoŴYx@TfLG4tX+!aMHJ)$Qǯqϒba#etN&U{4k~J&Gj FƑt4A kIvցQctZ@K +F_ꫀ)${6Wö<$+F Zٳ}%Kya*T$Lu ~!ܹs+>)tw3F}AĖ W_ '&jx4\g`Q1ĩaD#΍x�3cpv[%͎ɩ[e솮 nZ_C1vxwE>XA Urf##!֪+ªM(tEھ;v9sN/3vYVx: gE\K_~E/ƉC؇'͋`6noRΈ_WaAҋtj<_v G*ݛBiIV% _YF? 0ET-rf]]ed0sW"+_7wu{- _qݼf7b[z,>yC䉿H=_]gbqI4vhbq!~K% y䯺_aE7k1Yy9$*݋ŞOU}&F|7F`09A.UxL:0 bYV ف'419"ӘuW#DsIRD'IC,(:얿~g :#<1-U#{B4ԕP&Ā`o"02 qSN3] e:`0 `df8p +'"cV`0  +L�,",e}0ae0 `0rĄ +`0  +VN2 `0LX9qĄ`0 q$ #}?L& `0 3ae0>de09.za_VIƜ;2ae0r aMIIAO?M O>D3p9/#at~zѓO>)~7lQ۸q#UXQYlYZpajtjբ<ys=G۷k׮`dR<xʗ/vIFϯ}H]UUV-]ۆP͛7/M69'[1W2& # ܹs^ϋ_uO֭[" 2D#GP"Ehݺu#+Fst >(G:uЪUDѣnݺ0FJΌ `;6lؐ.] k*U(999xڵ=L&޽^z%Ä +}+'FP `f͚SO=%Nf͚pl̙ԪU�6g*U͛jԨAǎs;ԧO*ZH1ycǎbŊڵki„ TP!*Y$ڵ˼ҥK tݻyEGG3<CQQQDAQV~k'MD>8߳gOJHHp|gwra0 xmrУGq/ɓę3gE PUNUn:9AnunJ*U ypV.))N/x)S\C{l#Nr;ӦM{1OUӢEc խ[7m+Vs-QM>7aukǝtG~ȗNŭPtB'NG׮]yэ>yKSt{/޽ + + l4nܸ!h-[#F۷7oذaW\t)_f͚QDD0I<eQ~}|HF`ʟ??ܯ\yԩS^z bڶm[ׯ_Ǐooqi.ŵxH=j(HY`02`aW1j4rHVΉHTPoN6ܹU]t@Ċ+DŋԩS'ƍ'<Ǯd~#n|ӦMʕ+A|+fXPժUԩSZ՘EfO鸗v ?zKXu,N疇] .l 2k}Rn][ ?V#lxl?>FAlMXF0A իW8ʗ/V2ʔ)C'N01J8Wy7o4e#ZsisqЁ #.1*dɒ4 Ǐx-F8a02!c/.Xש }8ɩ[Anxdg̘a;)_W\9G|r``ךvD^pAK* 4iDz4jI51{xo>%sJ:~연Y-ջXl2z}˗kZ[?EVrJ,V#VFqr +yW/>' Ǜضdg0 H 8_kщM/(F>ǮAt{'7ȄT8yaP ;{D*/b1% �UNUު츮 vӭ-bI)r8|%f 0 vDܖ-[Ĵigyf- >s:ێճBXu,^ש3VxbsSYW^tcO^kV}@^ÄȁU #L +MbX#?Ȭ>'xiKիW -vV\0U`d.`졲AV/(Nk\�J,_㼝X8:2 exf ccזcL2kaUɇAJ ONӣ{+zE2WŠdx,aUv:iu aZ~:uFrJ1Fj /߭?˄ƄAUjxX@hU ÇE< Z@I>5X% � FX% rF~:@X4y<yR,&p4 Fx7護 r<ǮAlРm9v]vB&tF<ǰ2XY~m!L֩#1a T�[eʠ+M}C 3LoϷnZtGEj<a|r jӦVӣ]*]/jF q;EXNN;v4K_ʭc+.A~& F$A8p?rY_JwyGD�:ܹs_c̯aňW_}eô޽{+a[tyBb^}Հ$2p_X}Sh`]Ħ`?Ⲱ"`02@vƌlba'`/V -F=5ɩ-?#v%ttV5V={vy+g<b|0Yr"O,S*hF##+�1<V]VU;n:y ر#;w~_xKStl}௣ ?V#VFhAQ+-0EСC,g6UV)K##)LX & ߈1LX `0ae`0aeši 7V.0ń`0 V& V& `0l0ae02 `0LX V`0  + +`0  +``0 `0ae02ae0 `~1V +`0 `0a?G #kT\/ "3ɘzG& F$)))4h z駩`'cnݺE~!*Ty9r;>|}]*P�͛^uZbE\mܸjժEy{ڷoO׮]`p<xʗ/E]S'?7#uGVY>WZtm{B[>87o޼47mX3kӻnPߛ^}ˌv2t'sΥ^{Ο?/ϟo裏uւt!_z~gYfѕ+W(>>vM͛7ϖN:j*AccciTn] FlA߾}3}GQ%gF֌U6lHK.J*pvڞ&GOXѷz饗DڳgV& F!vb�k֬i.\X<�Ho SLQ9sPRFt1O>ThQcnJ*U"p#_9=ر\X1Zv-M0AxK,Iv vҤI|Ϟ=)!!1;wSO=n۶m6ҥKY0:twaz!}<y#8s hB\/8rS[~NWW]ivj+%%%^ϵaV^%r~2tI؞6m=cyҭ߿?-Z<a֭(QON:g?KgT~ny]t'k׮ZT}/UHݻ 29pFƍ +*)R""" Afu0I3:ק˗//#z)0/^N:i5PZ`ϟzeW\9Z)Ge/Gƍ"39LLLԶ9SNz0Զm[ׯyaM2Pm߾ݻGoܹU_]tV7NxÅ?cW ]~2TtiӦbR0!|TjU:ua]~h׬Y9Wvyѳ_g<Tb4k-K/'/eҵ*}`3ae0r a}͆O<ak׎?mӦ ʕsۍ6Ǯ^jQ|2eЉ'}-[(3ҥKF57o4u,,b}O<qEf0r0.\H-[es0>f a�jNGINUު_ ٭ V+Wcf'\.*C… ZUVI&ԯ[5j䉤3gΤŋӾ}mS۽=%n}-ջXl2z}˗kZ[HVrJ,V#VTL!NjiY^ab ` aDӲ)^ }lb5P\ Lcsiqnɾ߿_ÞAʩ[ՕA>wm%h_*/<l"Mc=͛7kV!Ch~}<َD{!^Iz:c\x./'/eൌM> /a`@ªa't/(3�cP$,ضE&`0r&0kZ�:6_t zApm"~vrvʠ+t1�]bVׁyXUa#J UrTT"+aŴQx,aUv:Q9VNo)fY8fKzX![Eg2٘"m`LF#iNK,Si%ȑ#bZ,ˇD\C駟Q`nذayb C`tB0%�<'OMP 1ؖc:0C1 F^ok``W`=JZ2#LIɾ^ZL=wP4ɩ-?'+0؊7=V[[a"1^䃗 :eK;<t^Hu1 X'ªjt"^O@|'Bϊ;q~t*UHVx]LXHX1:p@1j4xi!_|hԱ-#:=bw^aiD>o¢Ci&{6Wö< D $F1 !{F]j-0O> Xψb09 ;cƌms:&.ÅxW_}5`A {J0'2wb\kS[~NWW]EUgϞpޭÀСCE{')C^1/ZtݷӉJϏz-?w>ǎ;߹s'UXѷnTe /_GA~& F$ `)ց>3k*%CLX & & `0LX V6 `0b`0ae`0 Ȓ8p�V +`0 `0ae0 `02LX2 `02 & `0 V +V`0 F3ae02 `0LX ֌B`0rc[B7P/29;Jwd`@ b$;РA駟 '|"P.T g( kG7RZ(O<sQڵkq0YgxGQVϯH]UUV-];-7o^6mrO~ӵ]cM>eF;LX FyX ܹs^ϋ?R/ kzb;ԩSVZEnݢX=z4խ[?# m߾}3}GQ%gF֌U6lHK.J*pvڞ&GOXwM/H{aʄ9_#]f͐=k7g*U͛jԨAǎ3ymy4vX*]wЁ޽kOHH=zPBhѢ4ydmŠx<Ŋk҄ D%K]v\;i$zg={ pzꩧ`0۶m}^gΜ-Zk (@͛7(G9Uydueеnm֭[RJ]A"%%%^ϝ2e|hՒN&[6m4z[a߿?-Z<a֭(QO޿#qM'~GϩPtB'NG׮]yэ>wEݻw3ae0 lTnܸ!&͚5aP1-`O:ի'<Զm[ׯy~ȑT~}˗/ Š^LL -XOz2+Wp<$l56_ Rƍ`0`a7CJޮPm߾ݻGoܹUI]tmGHŊ+DŋԩS'ƍ'<B|Y@OMkڴ)]r%AW^y Z*:uJ_)Bk֬o1`zgԽ#FG~ [PӅ 6m\zэ>y)PE +5 qaO;azG atӧOŨe҉'}!7o4>Qk?~\4R̰08, R˖-}ه`핛GIN/-?/A%-uΘ1.]z]r=fv 6ov-ݪ+ФIA׭[G5DR3gRi߾})(SL'vG~ [+auC.V,[~msqZ'/ewѵ*}\S + yAn$rïLG7퇰zǶyo`d`*/1% �UNUު줮 c$xq}^9E^r4`�2ۦY@Ss[lӦ^͛+ΐ!C^.Gv$ aN:+}]ZxL,/'/eൌM> /a`0aMaA4F|/vWMXa*VLc0A>m?!X{%oZPbqT햟-֕AGW�:DL]> vV|{)Cܪ6kyx%U/HJX1mi:KXU=;JN^OȀ4W\i8fzX}[E{2ae0r aE*^�5 O@$Å'O> 0]`GRVhРA@\Nam9N]vBVt0 `d `ի+ymb*s焷8o'*ol :R-[jW1Oa"\mڴ*Cܪ6kyzT6b A.O0O? wnذa:QQVSgd wgEǎ͸j?Qc+.A~& F$n1$�FX(F0ma(V3Vj={Iy68&D W_ X +#b E,a5V3a |I.3f!X{%o?A&r-VEy;9UydueѕmYdx6c+C1vxwE>XF Ur4Zt+\S;yر#;wRŊ}FUug`@š,͊`0~:t*e`dV kDB>LX `0ae`0aeg0 ``02 `0LX & `0 V`0 ``0ae`0 ``02 `0LX &LX `09_̄``0 `0ae0LX:2V,ezd Qz#V#V#92VN) cz7 IXe}խ[N<! .LM4ϧ27nZjQ<y瞣ӵkh1lqA*_|wu#:3RW~d}ժUK׶'Tyڛy9i&䷞'ye`wozo0ae0aB*2@ll,7*WLTT <x QVuSZnݺ%gbPG߾}3}GQ%gF|`;6lؐ.] k*U(999xڵ=LX=aݽ{7K"ٳ +V _U\9:}؎{\"O:%ߧ>}PѢEE6�>xƎKK Rݻ3gP-PBT@j޼ lG<d<yVUtʛ7藍hzgdOLL"EP=N6yQӌ'(~+Fk׮ &)Y$ڵ+I&ѳ>+SP>O=--۶mv= ۪֮**o}]tY7{uVTJ^DÇ^xA<wʔ);vLxd6GjlciѢE 6Pnݴ=X͵D4}tmw҉=!_؞3gCK5ju>sC.vҥ M8Q|]v 8E7j_UmwEݻw3ae0;aݻ7͝;WlϞ=[?(Y_>]|Y$xFa:u*իWOLok۶-<_Bھ};ݻwn߾MzΝ;G)d2d_u!=n:Ǐ7oq aY'ަMRdD=A$|}كkBQlEÏcFl6tavEV}V9Uy{Vʠͺ3L_bt_x:ud{f.tgt=*[mAW^yRRRıUBº~z18f͚kmÏf͚QDDmUz+Pc 2k}RnmPE +5 +a>;РA.S 8q¼#me˖u_i2@!FF VtWݯz'ı"voNLwODtLL̋w=1/F]}E�P6mAvZXuԢB jb}ߜ[I]Xd]sSC~Ki&*m楍t¨_;uR]]z_ǣ׵ѣam~| ޴p 6Hz6}_z} ~ƭ~:٥KJqqzzGp"?sm` }m?Sҥj^lۿdgg{{{c _w`uڇ+[l;kx}M9p­=RRR<}%kOe)]C9/_6iu[m尡|co~/LL1Z/kߺ%\m{k7m۶uܟCGis(6ַ z}uW{ڴiÛniЉumt۷! i+_i/>%XBԫZ}hk{m4#tYjjlG/W`Հ3cƌ8pBEΑ>SDs>ֆ|^ խ[7IJJ KWxiדsE mnC`X~k`ԩ }I^4�5&{xBo۠&ݿnǤؿqtkHfD ?|Tos7N>m X*>~밡+a۾[?mK-؄{O:>SĆۏp=n/t[sW4)VXQֱ nĭcg^ϟ׌򗿼Zfm^=Y+@`}wyG18ŋ}T2k֬zc'_~A t0:1#G䩧 ./۷o7%Mz O~ﶽS_F:U{e B[V3y9XN| ~}ΐ!CqXP0t(aCW췝۾[?mct~cVڎXpўRêaR?<xsVp6gnH :OC^kvSӫgB 6,8:o /.i X~roÇCziNcN#]2aGB踧71կ~e꺡XPE+%in;Y5V~H_ljhbX(D+gXNXK$:>H'ۿ[36Nge ;s̉umopO[i.jٗ8~}n]_$0_B͜9Ӽw[O{%ur?Э1i4ϱJ{6v{o&n|XPFF-gff?ux7{ПX0E|𠣝 zw}G=W%p?$VGtRX�  C3-_ �@`@`���bV ���XX���+@`%�� ���X+���b+@`����no`P( BPB` ���<H���� V+���@`�������� V��� ���X+����+@`�������� ���V�V��� X���+�+���@`�������� hZZZ*钘h4)++D��� q;vHMMu=]CM?��@`!ruvktLO*u(&Nb=Hõ5��X4z`MHH˗/*.]/sl*2t8aV��@`pnw_\ |&%%kki67duҥgoiA^ۮ Au,m7.WwaQL6ݬעm{?MΞ=\;%wnu ;[<=Dl-{{scө^v=Bs yi34 r{{C{]?(<>3Cɉ'nv|}"v;u zJH(0fNʕ+ͷL=m}bu���xP?̙3빚Yb ~n,#ƌSRSs^f2[޶#ǎ7J^zM}4XsJ]] -\zz6jZ֟*K7IMK7\fϝ΍YOz_lMfno H[m__ds;1~rZyvVjumO^Gӄ)pfNBEaey1��V UUUJE 4x K2p=},ٷ?'ݟ,/^4[5VPHaש΍YOzʒ^6a]?iLמke`Kŭhmd멬t:z.��V Tt`?=7o4=UϽ0B22cF~h`u_u, ;Gƌ5ZZؾ/ξ/;z:qH@unz:N{w5\^28V^j=4.9}%:-m]oדKs.��V ;~JI |F3U/uՌe`okmXz;R>gˎuk_ Ro[="@g>s<^|;^Ƽ8Aֽ?jxs_{\õ5!Ub ={m_͜΅<�� <PW),,D߁UMCi_`&=qRΘUo[ TxP:NТ22SFko0uYxDz6s +]{scө^7m W%ڷmyXu<K: :n޶^^O~ΥӹxưjvzX?��@`EX@zfaԀcl-fKW-XxL=L#[Y]uKgƋtW[=B+\c$J^ܘtW(-\}ޟrOss⒰L mVԙYpu'?v;impKs�U,z.k1�� L`aS VtINNnc�� ִ46RuEz999ɓV���+F :RJJdee]E1Q���V;˃u?.ߵkWU��� X���+�+���@`��������  ���V ���XX���+@`�������� ��� U`---tILL4TtyZZq"���@`иU;_^^PGi|p� M5##C*++r5עΖ]I{^ }$=UiE8(&AN1D;&cV4��V> re_ҥKq%HUu\rErVMx>h_f#ߛ<˺c3p{��V>݅ |sIRR뾛i+"~ȶ cpf| ?Hv:K卅Li8eeҾS+l51IE+IHJ6q]^˛CÏRs^Ҵekyf09qdp> :>6$$^72˴m}LW +*qVTTf:-b_둲cOŭzV=zILxUkי<cŀC=wy>WEE2ytE21~={uuoܸaݥgo/^"qj#u:Hqm"'R;o:y�@`pP?̙3LgQqkȲ?6aJ|0 )#ǎ7AO^zM:<;ٳ/0w4ug>sr?Մ^rZyvVtSo{ \Y˗S&[S[~dmۃBMRM`P={<ρթ׭aFKqIԜEoS}kPxlR[y?hd:Ey>߾~I1b89UZjy+eK"S }mVPn~^o��XܶZUUTk@|kwi.N^zAXYYcH?'ݟni3g(?}GM1+=M[ C{wV=feY/c0Q^4܏iks[{,7nbOݵ#hTok2A:V9sW{V@Wzmj/b$Nm־^+5[}Bo:y�@`pk9!K`>czxHn޼RlJ/K,<~\?7<6O?}6;ۄ>9Cܪi˥rϛKA5%v~<nz1Xk2ІΩt\=vL^3ִu,{굮(uV }.vp ǼWkmq;pupz�@`pRRR;R5vOUNvJ{15 hO;K'Mq|zjV5 fQ_4u*u B/_1 NJoKsڷw{}߾n~OKxrj#/ 6N Nn4Q��V�-*q'gH{:̌k92 |V yָEmcg;vKmHWQ>i/Ƃj@^bepyͦך<z_/ɴt"! r)sCxȒSnVo\i J4k]t!nMڴO3IsIx$Nm־nn{m܎7\�� 5?Ak)**XIt\~֌J'O-̰z b^zaКغW/͍6s\ݏ%t` :5ۮ޶_Yhs]\s>A/2=ez9ު".]#bo`u:W:#[o5Np謹۩GөmﶍS}µ񆫃��V�%j@hr+^AA$''ߑ7'+��@` iiimƥ .rrr$##�� h(HVV߿ߵz~ lAV���+@`:˃u?.ߵk ����x+���@`@`�������� ���VJ`�������  ���V ���XX���+@`���@`ZZZ*钘h4)++D��� q;vHMMu=]mÇ<z_&om ���!ruvktL}WVUWgK\Ҥeky~HٽwPd_c.sX��}X˾ʥKQ˛Kޑjr|0񎇝;+X��}Xu .*Ν$}7kVjk/E :b<!ytCnP :u6q իW#A`Y}.!!1bgaQL6ݬۢm{?MΞ=\V=zI$Ov:V/vShe֮3Ԟ{d;:u)8(w.I6eCiҹg/I1�� ۟P?̙3d7$b ؄)RQQv==rxbuxo4|sPL0h6˰QDjjˢNozV /^mbD<y"^ݶcgI\ץr=w�� _UUR^^ <wֲ]+No˓OX]f_ɓǰjDK>}[ӾXeB- ul w>*?[=7oӧ ���5vs*:CjW]}FDn޼Aˢ:.]~ y1yaXi!xmq_~XV/ wzw-幏x\&O:t ~7+�� XOO)))XZsI?{ê=g7nsauzXVXhGKX!w}f -��� _qqRXX(7qX{u%.3Z-:1/w`5V|媈uЉxH!LUZFT)3}8S]n SݎinU`yR^4:Y͜e,Љ4e���V;RTT)jH^q4�;d3{Kg륫,4+]hu]i=LzyK3[/ߡ]=3S3z۱:ۭ^ <1' ֬5w~ٟ^N���Vju-^AA$''ߑw?��@`&f\�\]]r]/''G222��� h(HVV߿ߵz~YY���V�XКj.D*|׮]w,���V �������� V����V ���X+��� V��� ���X+���@`@`��������_kiiKbbOҤ���+ >w!555trN=&�� RYY)ׯ_k׮]OtweU|uu*MZG{Nbѧ)~Dٗ%OzZE+D_7l[D.w[{�� /_U.]$^7^\TUW˕+W$oe܄}Pһ�S9MJێ%-#Sjk/IqI+���xnw_ܹsfmښ)؋ұ[yi!m ҮSgip\z1 }QtKl- &'N .иͷ}.m}y Y}Y(sޘMTK3y wNAO{—\%{V;IH&OnڷE21~={m>^7nܐUkIu\ys%Nu8-bI-eǼa���+pV ~ʙ3g<֡#FoJQqk?6aJTTTF i#ǎ+*L+Vq xJiY <+׬g.8hC-GǼnJc:حM4>zz6j顭9/c?hd:Ey;#m*!)YF'JK3^-^X.$5-ݴwYy̞;7 ��@`ZUUTΝ@]Z^~%b?VVVOqNOǍZ榭wݧѾ?C}j.h2u6qm`ѧoĞ`tEӓtܶqO(^iS:u)7oq ��JK�X` ?3{ vgLٰ]͛7CZ-mK n?C/g\َ2n$m=3z\~c˜R\~hss䶍h~<nzW['ڛ�� z`aSJJJ|Vu֌XcVV/T f-n2/mcXnO1=O?\ԘmTp^4,9 {331��X{<*oYYpgM'Y23ӢƿêcNw[Qo .[2._~폷<ꜹf /mO陻C~̘ђS<?AOg)Ku{LyݶqOAҦM:V2u,:L9|k`е;o�� 5?Ak)**X54L %bt2{cPYy z1 : 5Kޮ %k`Չr~{PwUY;:w`]=3T ^I_{8iBݞm{h/CDzj[8Ȅx:+SXg I���=XwXTChnnk $99? ���+ִ46RuEz999A`���@VD)%%EdE&!�� XXКj.D*|׮]w,���V �������� V����V ���X+��� V��� ���X+���@`@`��������_kiiKbbOҤ���+ >w!555tmjmAD;��+@`-##C*++r5עQ5Xy�  re_ҥK:V��@`QV… ʹs$)))&@v xz4mZ:%)?.qㆬZN-:ȫcr$W\o%;u1Eoc<| &'N<x'9{lqYn۱TWq<ѧ?WTMIEE_P`{9f}ұ[V=zI;7EE2ytih^&Owllz[=6N���5Urָ̙.$5-r=w^pYBR3NN 9ٲ%Oȱt= =F?RZVf5k#nEe ǿ@Mz,N?5eeG&lݶ=xA z9f} SaW^^-%%fEo)sP̗ zl{QߩnmVp[}BEN���5WY`ԽlܼEOe{%UUuŊ[>=xݟ[y+M[^%N^9YUs/_~z,NϿ7+Kzwe~K3e_{:f}^i﬽ŋMacS=ޭm=pupj?��@`1Tt`/ZիW=i2x؏Mc:F?,h~h`FuK>RoOKys >Nϯkxd.7=U^jmvz_tvGƌ5i]k_c[@?VpDN���5UO)))X;+=e] {]iP,^zX#*>|X^ymNêƼ8Aֽ?jxs_{\scР'Q>s55fnhz[=mﶍS}1vѴS��+@`A`-..U %11u߫֬GyyKf2!O{^݃˒6m2cB 'eYVCoV*^!Fos<O޴YZ N~_z=pǠc5Rб22K]w[ۻ3n8G'㲋��Xkk~CRTT)P Ӫg: jѱڳuUDǢftla~IzϧX'7fu! \:&R%=Qu}Y{~Qqcw KgꪗL=Le:.WmG,ߩnmVpۻmT`Ig%o;�� j (Hrr}3,:9����@`MKKl3.Ug�Xt#u;ϤX[T���X܁(HVV߿ߵz~x5찛n��@`pZSSSHEڵ��� +���@`@`�������� ���VJ`�������  ���V ���XX���+@`���@`�������� V���4lIII1(mCX+���bVw)W\1@Ooh%V���D=/_:JKMMiO+@`��@>i`4hh X��9B`���縋/RbT����1w…F)H_Uhw7+@`��@ ?ǝ?Q_JN'zX+���b9NgE).)YӔ_Rk'?i,XlM At<f7+@`��@ ?ǝ={6&Eꅋƍf\a=rU+9Ҳ|߶ ?ȮTYv-˗fHNZgw~z6f!V���sܙ3gbRܼyS`?Ck̔;ʇfF:$6 5Z,~KN>-.Ȩq/ƬY����1W]]b֤ka9>v|סd7ibʷ=&G}V8Є#GȔnO֏IUU zܹsZ~?qjA?NM(#{2Zm},As{ɻˤSҪ]Lk!V���ܥU0@R_$W/9صd=d:v~$^<z[ #yˑ<}<%{̬j1_f ~FRwj.y!rݕȰP˦͜%/ V���ܭ1e[>[<~l=˷�{'do۶9اcΝ;رc2乧oOii̞3Wtmˤ䧟~ .3 ?\!wn%n$L ;aJ$mdn_cܖ:ez[cuZ����1WQQ}sIƍ&y6,_<6i"[$kzo$9Ώ?(e?rELOːÃeesGzj){YhNN<)'N01]ִU6]u X��p֕k1OK~e[ n ݟ|"0nzM=k ϕ:zKѶfZi?uLYr,[\kJa-,*W+:~+@`��mMyE'm/&jk~~WǓfffJ^^ ~f-1fZRR"'N s/.oߩ|fq&j-ؽ[?ה={oHHG40F0yJ̎?ϿV ���q1(7[_LOjYYڵkeN,Xg߲(燙`mӡi&>ҼAT ܣ)zzL ((=5˘+@`��]Xg̚&W\5kXllzZ LO>zjs G{akkk;_ }̍\'`K{ZBmDnkT ��.W^^2%~qڣzêRC?ތa}~1{X+���b9N/ݍE?I-[*%,yϓ_yE4]&O&cƿ(C ~O >Ksǎ  �� tXo9 ƌ0^  �� t"$Jl  ��J`@`��?RbS����1JM!V���HJJIQQEGۓ X��O>D?.(' �� U{%7X+���p"V��� X ���� ���V�V��� X���+�+���@`��������  ���V ���wBP( BP(?9+fv6I����IENDB`��������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/images/plugins.png�������������������������������������������������������������0000644�0001750�0001750�00000113513�13112005742�020325� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��x����� ;���sBIT|d���tEXtSoftware�gnome-screenshot>��IDATxtG:::óf6"hL9G9D9"EF $P crph(ߙonݪʒ%KFޠo>Bh4FKf/_nѢE'h5Z_ٳ?Ff>!BI<x@lOccc~vY6| /!BH:B'/^M=wB!˝;wM>}aׯE!BI;vlOB</!BHܹs{w]B!b"</ o!BHƂB!B!PB!xwB!b"<ՏB!$AG!BG!B(!B!BHZi/T|}vEz)73^cym !f#$ 5X,Hz+[x'cpW (RLG١K8y2M<PBҹի2(dZܭ{yC ,,y 7E'ֱ/ fx޳Z:rIzr-!d,~y7<]vMz  :y q9\ʲ#"ž'bn^ rz(15Ǜ5g흂>7o3T%~%*'MWMt}2Jw-ݯ:禭NΓ*JyDr2mL]z'xU|E"ٳa*S(\rFֻڳi׾s%4/Y!<EKVV˗/ۥQ>]2s܎ul/P<uZ9@a"O3bhyCƎ>k֮z_ !Gu[%$֕(]TZ3~=!\]rE:4ꉇgϡ+0.X/.>RrU cZ-'N ǹh<f;GxsZbʸ͓e;x<v1'mr)I^?G(%Nz(!I*XW.^>gn5 ^]xz»Dm;kM'PփtfcwZ+_ݏ6j3v@EBBߏCGH&h55kqeyi8+<g>{3p` 6"1x-ik˔M7"%K9#oZx,YQB.𴦽Wf= /)*J ޱj#Q)|oD!b6oQ6^h4{ވq7u=I<cྸ iAqmؠ:hyp xL /x :.YUa<tLϛ!iMXɳcNջMy2-l鮧ruۚuf|jx>6t<u85kY:o4BD:Ie)r {+kӣwPc9kca|C۱\tdX7AfW>},%~|O!}6CAG9-kϟǢ#xٳ{Kz%{my!)͓'OѣGN@,c(!z" ͙A0}T!Պ$dXܸqC!,,T!$BGxm!"<ՏB!$AG!BG!B(!BH ׯ !B1OZrGG!#B#B!xB!B!$rڵ4GV*H!B!B!BIիB!B2xB!M!B8d>}B!C~M!BHƁB!B!PB! <B!BG!B(!B(!B!B#B!xB!B!Oc˖-`NLرBW -y X&ǏB#yBgߗd͛Z݇'O˗ʕ+$ߍXQFdRdiɚ)zl/I!~xhwIFpqիWۄxBO{dĪ5kIVP'GN!O^)TR4ifjłڽgoݻwI `$͹xΝ;^ z+ҡs8xPΝ;'cbd_Fzi"^$1x04{#f͙JæMKj5${N"g5Rf-ɖ+d˙[*ר9qQiۡ,Z\y  6Yʣ-mR^ɑ'ț_*W)+V%9fϝQ?_3 <BHxn")� U+isiWR!.\pw;%QjE^uT.]&gϞcǎ jږx۰AGZ8iӾaf5k6U2!$] <t�x[&7 ޣG1o~8fv7u5ѳ)шmi4q/^t{3y< <6l۵{}[LLVtY׮m޲ #ow \anܠ_H*VaH}ҌC^rrVi6i rp*s;z옥<v>w ((!V]~۶R+锆er!*Tf֭P4)𢣏HN`Ng&ð1fQ> <BHx {ImL=0tL Ǐ UqLN6цfv .Ty,k5hMw.fil%dZX<%@Xƶ&FiGcP <bIa{ѣRqSרVے[y&(uRaRDB�/];YԬW_u YJެVx<1lݪG}fΙc5N '𬌦%RISv횢^&x{:Tv┩qϚSTz|BӧϤӄL-%ᢪw)U10ٱäUäT)aW'ڬUkSXhm߹wJ Tq;: ܪm;ٰqWfΞ#EJRT|E%)!Za $4hL,[f_?p4hx[NN.],bh $wƎS]ByBYqVr9>.^fۤ#Dbbc?`WmHCk+"ۼ)Hio,[QoLO9{V5oǨ| <B3%;~t=I>t;a9űi%#\Taam9xNǫt4,'PBC' 3`۶'پuvb% Qmw\NhRE&�mxB.0ݻ: n6aS)iCSX|aRʤ# <S$ȣ#BGG2b\ !< I#3B # <Sٳ$#xBRL9s�xBH ӧOHhf, <i<ShT39?s:dkY-X@ԩS$QZ>`XM0EH7u$WJ/5/ ǵ(眞^f=}ZݻeٲerqILL$�-1}Xfzh#z#ϕW]7UriMe< <^feL;wd޽+pmqqyHr~d9ٷ-_RM=΃W~ [ھ}݆ RqS 4tD *!9v:+/wujfsBKȴ3=퓧NSժ={F{ZOseҴe+PPr/['LzwXXFke3~jJ u=Gt} =5{iPP ,$9LYq~)Z@-9zTǣǎ}t2ꖧ@S)XHbbb;;gk]p]_,]\]Xqٰqi9&&.0-y KסÇTvU*UqgDzieځUqf<hZ pQY%4C`˞[Q2|TQӞnt|cZ3˔ kׯgH||tK:t 6}>Z}#RN=CҨYs p!!RQcj7h9 ##uѧ}^~?<X8ҭgo<y,)SX2zj0'޳ZONBBL9KΫT+9&!$s4`[<-_!u6}8 E}o*�Ĩ:q4Ixttq::(e�_Fz#\K 5Sdiٳw{QQ8Bwmec9gx<yz"𬜇yƾZ;`4h\5oFVZeXfCʃ?aXv…~OF@YzO<i@c.7!$k7\&XO%˖KKQ0%9hZ>ZS!ؾs ((JQ/3_cߗ}x۶u=xo0e#'<= S?_+J̖y9}b)?.>^5#BdiPFe6kZ-XAeʪr;>,лzVޜ?ox <hHpV/7qCnYլctL8?uj1{|ou=pt͚3WyЉV^HI=x{-9Ŧ3:__ߏxF <衣G&t--s֭RjumN~DYß am^HOeys|QB2:UA"bʔ(~;nD3w><-b/eJT E=A(ʋzlwKgd{c<xln+BG @|xqӠ9|\\:}bVʬR3vzΌm{,V!NDN<9FGIs/uE sK*)s՜E!i9AΞfb5:/]S S9Us6ʷr>ZW4# ,d64u f//Cf/6!x&qfzH.gt^#v=kZ?x0R87f{_gF6={x+9F_+:x*˛s-MdAI_P@@*kAP'k <Wÿŋˎ;$""C~4Ҝ1c̟?_nܸ!nR[=*Ǧ7o,cƌS}h4Z昪L޶C*8`˪}^ <Co>իի\2 ={T 0¾;sСC2k,9pXb2qD4hhBqw3{\c8"4ۡcpWtq.I`┩x=x)eW\M6̙3ƍUFBH:x4J ;~2Lsל <FainF:pqzVx >-K </L.5/#>(h4 $?p@ r/['<_vIk 3Z8>BGQ(/GO|8RCG)0Fff@ݾc(RLu0S6Řl`i}s+_Hʸmzi6R`g$cS ]+c8 8]?c}O꫍/^Fw'{{}\&4fη{>le|=?b<Nʵ2s|{: <f^ԀC+tK:t <*ᢲ%-:;=1һ C w<Cs`yoݮt]+H󎃌}5knEVLVEr[2y\™2z|R /v f^nFg܌'z8$i a$;8x0=>rDjԩg`m:?b;r>#)h4ZoŸ)`j4#nsbGm#k^(p<&F+6[?q5m۝}1޹띛xzi6Uj6hT7oFVZe/iaLnrzo{⸬W_sݕWtO͜kV7:?b;r>#3SDoD}cX3B(g roRn=՜57;{ܩ< !<xqj^>xl&m.u:^ NR/7eѹ)w/Sǫ&(ce:/eznFz86<} zϬS3Fw_0S7ߘke{!*?ś7oz cbr31Ő!Cdڵjcs<Ď;&;m{Ĉ*g|x ̕'O)>< DŽژۓiۺ`M.7C\Ml+cwfT;1@y{\+u6ѣU3%kofVgY=7zw0wh{j|d}Ϩ w<#|�Ki._,O<Ǐ|nJa1SEEEm_r %.]DcXXQ%,Y"P_.S^CTރe O>xh.u|pB|hGXvA|]wK6Ȇel3/s3*1Hs,QBb6m|WY(&N('ф3:?W{bqӠO =CYVuG[O!wxS7WNʵ2s=vw.ZATݿݓ9s={(Aa5-:n&go߾-=R"1͚5+!('B JX&yO (jJ 1 < <+XrbAJ,=-\/z!]B4téy Q>ℾ1SG 8.vLf^>zfT>sĖq@/G:Cxqzr>v]> <s܌'fNu[wPիG{j|ѡFQeF_}q7usĨ\,3cw璮A`YƍjnYgCm۶MPϟK~ׯ˝;wW7MF1y;Ȓ%KT} kժDA4Sد_?y7v-ӧ|wxtɂze n =eݽM#g$ جfU#%&&p:yM%nyl+M]S"Pk]oSWʗ//cǎ$/K)䫯jY=x@Zl)f6ݱ\\ǿo2|pt܆ethyw孷ޒMÇ(J5z<衉!@zyO7^L/1¥K zܢu/gϞ۶a{Vېh&E}*ҊЂy�̝;e׵kW T.j ݺu3b \t1]ʆw`GTNx|z+0hn)(X<yU3,KH 4HA JB>4AX!.zXƾz+8y- "j8<x# >L9b_Gg MGFRh6:s,;::کl! * �/ޱի7o8 C(s\ !=4)yP<x|YxhEͰkr!;ud꘮OlZxHZ<3{@IfД&X=�ݻ[vJ܅o٬bݻw+/ g@ - -t([Oy^K_|Ļ el16gHq6;aУjj3 !Ta7 Hࡣy c{ ./*lݺU r!3֨zѢ3bѴ^kN"0n �^Boh<tlo- .]8a`Z~WʕKz'MR… cGxu>^կ 6JM(R#С93ȇ(0!H / 6! 0zb]vY3S9ִiӒν1 ]Ř<�;)K=,ڼys{/Y,6; 6xJ^޾9r(O'|"cƌ؋7ߔƍ/ҷӦƐ޻}L*,5fլi$wơ#BZ]Y18)ʑ74nRbO=}NyG&Gy^fLhknVQ0+05{uXbX<uꝈ0sL+ 9f:5Ƙ6ٴ3&$E>/MݻẀadlݺuJࡉ4IC:e4f8^ze FS/H5W f,02<DYvW~2+C1*<]{]uyo_zom=֪Mu#eTwwu3蚺c ]A۟JpJě{:x0fxSdAtb0bcV(0ˀ E.QB0*:Z:tKxWxb%0˄ȇwidv 4 o X Qp2 <&1^Eu4=8Gzꉩ³ aywH/PҫUvnE>Vk=M:]xGma<&7O`j6#|YZOyh&CO 3Rw"9@EMX_hjBp_࡙q ,F~==M~DZ9bI45jMȫw z6kZ-X`:i j <>F=Sw6$Zv3X2"l_ڄK C.:OszMfbh4  х:O(o֜DiE0l٫P۶c'`<&V맿7<ǀ0Ń9kgsĄ̗6!Thxqת[OPYxy�eݷOyw--G̕A+:\X JZvz@lzc} RqyZ::gVnF]S3t"Fr[;i)eJ  e]B(h4?:&h=.Tg O b7J\A,[nO_2Ly#C^!nObcߡsw츀h󤷏55#q&pM^S+aFh^:ak鈡MM8xPh4^zr0tHĮR8$!x40JeU!4-zbMȄ <{t┩|#Cc4v Ru!FQBIq!LC:527俋v ;mMQBI j*y!?ƺ2cMzΔg=Ʀ(!$4a/_'O9c@>7|99qN!$H+l"oX{+fZxWlaBH:x~w̙3Tqt^VFK^aRMu]a2=+&Yf_~Y>s5mzK㎴Pg= <B!Pa۷-q 5kicQWc%Vfo8&ן%U{D^eϠ`(22RyYdEUVx(!UAYڵk }d2mx̖d?AҤI'֍|2vX<-[{ァ29 '9rHTT}<{̞v!y[>Sy7vrr*^03Tλv*2d୷R#ؓϨ(QF oU'RQBI.wK\tP4_J5+ 61l;pTHY8p.N'֍  c.y2t@@@tI)SF@ٳʕK?QBDw}CBB`jPVjժI6m-]O^}a}+O&ժU+ע{*izORX1upNh"%O:%u֥#\j9Ak$ RY+^l?H1gqQRD ir5x܎cXx(T{߽{W^{5<j(Ppj믿 $r,ӫ//pYXvMxz;G'[G+ixB'y\O;n5ʿJu~ aD믫Tb`3/>t,ñyן<mkZKxFpޮe߿_y�~m/p;4 <B!$QTج FW-g/:{@ĨQ'j7~x<xzBr2x`VJJ5OZbKn/^ttȃ׸rJy(!$C\Y?eE)o΃GIAЭj\w&j^_t-:<h֥K 0Bqwp>|*ѣsÇbŊ墷/'۷Kgt-X9-c9)R)RJJA}TpxBk<x bcc A>xfϞ =˵O?'ό9iӦ95 6osˎ͐FB&4&WE bKLr1=[zѣGҹsg{{ѓzbw}װ^=Pn eK^z%{ܹsMMhxBAan={(z^z#HG{0|x61OV(J_~iZҾahX-]\,-Y |fBI+Mi/;vHDD!ȇWCsпE"d_n]C0z+!eZn͋K"`ܣ$?BłTٻCBҒD\<@:b!:Y|NkSDS1hׯR2} R:!X>!4&h4Zx .>^)Xȭ1?y:}dϝWʔ}#PI6;EBjc�)P*1·l5k}-4ի!Ph4(< ;^ISmwP Q듧MYϗcҡs/P%ʖ?ia}DbOn={>FԶ%˖3gdƍRqSx!x4-}4jy0L~`Ot|9摣G:BLC-O᠒j}\3ș;{u29!F= 4UvGݏ6ITo_oe_mZVKCOeWChiJ y~Mσg�o۾CT +!Fo7nDe* ^aT\޾˾\c0MLqe6O/V _< <`RUrͯרZp_ov_w/\zѢ 4MO11V I;vCIa(/71qΝ?kgD,#2wm˶ryidxB2X[jܼy ٲʵWݦ=|V&�DmޕgoNQB/s^|Y<y"?6?<<4{ty\\휜xFΜ?%s {\>}*7Hbr=kV`\i4 <BVa[޽{2g×9鳧Jmd7o(ˆd0%�W's۵ͭ[Ʌ}MYXXd —_~Y>s:ujhdszV^]}yW$O<bŊd=A#Aݾ}7nܐYff̚<tg;/ $ 9#'-e62y(<tP#uˍwyG,YrjJPB/)<xŋOzQQBD ׮]3%͘^♓c~Yq]J֬[)KV :Ȉd9ңgwYآ<\\رcuСCդ/چz[>Sy7vr>111R\9y뭷_e˪hw^0͌t?Jz2-[{ァ2y:/9<zեQF*u8p6loV^}UOdĉTcxBҒr%.]dJM>QwQ9yDFaDj2h`/1DL`X.ӧuLҥU`BBB`jIjժI6m|Igf͚Izt_FeZ޼yyr ]v@5>nݺ鞗< bŊc… ;ȢE<uԭ[jBHZxVA,7y/!F֭_%k7XR"z=QRrq2l@?ad_sl2N۾k9~}ͤ<y2LOHY-o/RJ'gɑ#GQQQ*PDz r>P]M#OҘ%3oJ%ʉr2D.!'|+h⮜D6~WN/GxzB7^_|Q__*>5ۻw(P@5jMȫ'3xg߆Ntb ئw^ <qE4L2o˗_~ΡQBIC^+Al1ɦMdo�yw&$ޑ)2v(S1xǏꫯ$!!>Z\zUh|V4[n<+<WsW/3|<x^+W4 <=[l 6OI?p*Gf\xc'Rcߝ)g4G>wʡ&Dq 6zl)^_t-:8 ÇGÇRbE{: zk: 8^Jz :tPqyu)6靗zxF狺8)R)RJJ!>C1 <⃸[z=ha=w8xA|Z͞=ƌ }>ųrzE uoWúɁoɎ#eϾrXܽ{WFnxM]8q 6mDK D{饗?VyA7x#I/Z2] Bc!/Dc3(:ahhd멣k<q4hp}]իʫܹshEoZtؠQ?}q@|;~ߩ"0={=dT #03Bu dLre0^^6.wlJ\ tCG 3-h)kx$}'d9ŋ+bDD!ȇBGS1ZUJDi/[Mm᠜:(W]7!Kc 4cZR=p0[E#$ЊAxDUs^ 1q^N3ȕr yǼׯ_)& 1:MW_TIA !Txe 2m:|a~g 1@&M qq|hxRW=!$!F#&d<(h4Zon'w@Aiش:|8q!ns$پfzKM:h&'ARf- xׯ_7 VˮP9q{z-VGB)&!RZs=w^1'H%k6̫<tD *!9v:1}֬]'?U$-i3fu&f&*c\mСҬUPPr/M[SgPRo~ݲ y ڷ^-=u:.>r*)lC`a]7q;fZ֡#<xktJoԬ=v̾mʣ\̄Һ]շ==ᢲ%rYV/tv]"V(vP\vMz/vs۬UkIL<%7oޒQcI՚u>q)_>6jŪw< NF(Wl;w>M[6EI-F䏦+JGIO^MHQQNI?`_?<DzbeI}$ͬb,2FG2KX,)ІCe۶l薍.]&+VLls<nɟ~VN+ǀ]ռV!&NQ*X)3U^.ߵBm6-=kђf^%ڏ 4D.ͪ۲-ΞC&5њo;qFRedE*fK.H[޾cԬ[_5}j/!\[ǼxhqOeo**U+WM[">J^5 $&&OI"FRM $EJKO$?Րo5!7h4>$RHŤr4 I/>eX6+%"u{xhҪ9 <#.64xJ+gu?xOG9VE.U޿kC1ɓ'*!C'mB_Te]IS}t[R*]^W˷O\Hβ 71U5`]wK6[i+{>O (\y Ri{k|eX6tMގiGK:cԪ>zưXN߷eo߹g!끠XMPOsM֝3 N}ҪJRWXzfKJ39 ]w!U^led=^Zx!tKJ\A,[nOpԡ&zӮ]qə/Pd4b ޲Z'Ǐ*bJkVz۬]~]͜)%qW]s^B`žjun]q`SS/R!Uu$R<}"]sJstiPVJS;ԗʃ7tVܸDyʍ>!u#7SHP2d& .r5H:$?>Tw Z6op,SMKHF"UQv.#GoE龘t/5_:m;+PY<^0)5hZnߥ45U-;Z:[[2joh–KXYz\Del@>y&z$#6\4Ls5l #3v^7OdMxdZYFluZyܺ]#@?ސoQ~XY4s:vvAN]1.^l(n"gϝUߕ(yu*vTu}z<~![d܀eC՜+"nK䙳<uWjLS:sWbOz]yN>64W5q%9xԞ/ƞMnʯNy=;ԓPm8 3xZz<bsnj�R(%O=g(O >ON3&ɝQ:{#6c!;Ȭat~䙓͝59>I\ 3U잶~c7Q/U|PL8U&T^?ԓd|G <v"qS |`AKH<e(~\AaңwWt7Q2o3\qn\US awKOšy(2=se۪imYSig(çt7#_aBH#UӧܹkCo}(7d\˕/ :T}ܵ]hb/VW.pi^^!e1x1rf:%y1r衻\T;_=(=/dG x*#"B.XVئ'h$$|&KKNkw)\Ե$xމsisZn3а-: ZG/uh y:E+sm۴-1B'8ݙIs=K8 VWo6KGG2@B2:^|B:uJbccg -�Nu0*6p)WAZo-6oN I4 n_[\oisI M#{bٱ)tʻ&R茩4c, :BMGla-{  $..N=_ !NMPY~ҡ6a;|KքKڣM.ya#I<yKՊK1E:m;!xݻw˲eO5!$3~}\]6HdŚMaȲ՛$g[U$[ɳ6`Y-B"CrRj TܹsGݫB?=ww<M}Sc3⛚#%O^O䐃ҴvEݦ7_PeZ9i4Z0w~xM>kf|BG! #!xB(#BGG! *h4Z1 <B(!Ph4 <B!R;wN6m$3g7nKQBIbmժUrMS/C .KQLF_z̛7OƏ2!׈4"6o,/_V#.?~Cp×eʠ!>"D6ow,K,x$%g϶ϙfXD5#$ތ3w̙34"t-]yྜྷ[nʞdQ*ݕU+L$k֬/.SNM"$΅�G… ٳSy<|N2! yn߾m7nȬY _NƏɵkWܼy]޽rEFF;#K,Q9yԪU+]< < <B% <xZ_@#$ <6+\v͔6} ";w9Щ >D>ca˗cZ6l ~'ĉy -[{ァ29ݻwoy7WzK>#ٲec[#ʕSi-[֩Ie޸~9rP2}&MALI;>|X,XZm0iY'�b2x- I%wK\tɔ` <# :X坿O?ӧO{->YhJNu۵kW 3g([nN@̠ʤI4k̾wy}.<|Y4D=իWϩ2eHBBzSreO޽7kzx|= |z-39[s  ~7D%4J@2},ϰ/J%g�ə8Hm;N߷rЃ֌[b[fϙ7jw~-CXԶ++8y <xBCC +w~gr:<Usիv:ؾNe9Fkf_G]mR^k鮷ҥK8<e -Ŋ˜y%..N/mM&O.*VC+<m!01x;Wжe\*2qA* 8 =uV߿_y~m/հ/z1%a<cn\yl+yp/P&_|5vWo6?A -.Y`'<tD * Yyi}|Cr|e䘱N;6wiRx >gnX޳Ǟa bA !O@=q©y $qWg4/(=A*Br|e, -s'OUj5dE*:+רKV <xQ=ֳ+YdQsxٿfDn\ ۖ˱MsDnY&6.]a3dp(c/"aXir'H={&+WTh ^yѼxFc[ɋc^Yww{@K;Qr1Kzտ`:H郇ZȑG%vkԩgI(%BpzP )kוj}]{4-ߪk~nSfo+K/Jv$;=g=~2&L;>)m<&,OWE՟_:txe˕GJ+/&NR}-=GNbcc՟7x͜%m;vJ/v̂ m[A,+ucen6J ll}QS<]=` C�[T)'qQR%%>�?GQѺtVpp_ѹVBpg/nC + V1x�`F >gT'ٷ}xLiEK={]"GcǏʖ3/Uɣysݺ˼ ^OeqkU*_@(kݺu$vZ;wWgϡZiVT]mZ ߾GV<ul5kq C`=Գ~Edd!>C[ls;/iӦ9yЫS9f'q/W_}ѓ =BBT/Sh^l޼'+}xFc[ɋ:Kx9+°QFwMҋVҎ5b F&hͷ�ͦ#cي�2*h;ҬUk`:2e崇|zex#IJ <ЩP:p�ܹk<pS@cqPh']rxвSJ"an=xȇ,og[y[<gHK? -絁}i4Z <mFhTVR$ ^7m8g~FX2o[n U˦p&2(FJ R^^(MQYJZN <Y7bMv' */^,;v쐈Cg}> էb_޸ U}ԳcҢ/t`(XCK�6mnT{d]Eud^FG =h܉ؔ0߾}7`_ae|_ouNMea[ǟ2<33[:ͯh=s|/ZM_^5)pcZ#q0Fq+_^'MRrKJ\A,[6X(I/Z<0M25I/ZeQ=Qv`+ izc`aTtAOJ6&0)6x{E& <kd:Y,\XʔhE`:Yާ;qM/Z^f1)_@g:hǘJ yശ}Q%!x4/Y@&[PtF2g5n&(ג <F,u@Sah"C`1m{elChBG2#cuVOFX2! yBG(Hc݂ ZelC /!x4ܲS,c{BG(!$8xp;8xV Vm۾U/+#FS`ېF(!Q!87ozܸqCl%ȩzY\|7J#/k׮*mHCFG!O91iD?~lFFn.P)TL:Q.]MI  m[ī4I"/K,i|}4 <B!iL3`]/M%xn}@Ǝ\}RB YxHeH9$ iOZ?I>CPL33 /Rzu#ݾ}[[nI}."2|Έ ^:.kr-=Q!"&ϊ�x葜8qB'o۷/S ;v_عsgxz#Lqu~<\wy ~f͚bZhCS`xWn=sI;y8yʃx߿.]کcG˖-S`Y~rqQ_xv1gر'ȫ*9r䐨(;,&&Fʕ+'oRlY5f>&Mt?h CӠAu 6xw}WߴiSu<޽~eٲe(룏>-[TϡCwu4!Py)41.]! Q* 5\^Doə+oՁ2amʃ];ywUSHnTZeܸqjy̘1Ja,'mE)SF~ٳʕm=odӦMr޽U5zӻw8oxXvM+`G':L4I?k}O06=xxB'ț.:w.mw.hwQJa+o޶D9zDY;kxɦd8b 1y}gr:<oZ^jT\Y-+VLڷo/%JPCb8Cܽ{W^{5;;8J3u_O̟?_ *d_h(cNu3#0&\_yꙘ&Z <B!x𞀈]DFCrEfhse:uC)R1WpwM;ux1D3,c&!p_ofh47B}3ǃݻW (5?⋺ ŋ;a䱞zurf֭ٳgxxB-N>*bn'3_;p@/js,@E2o{lMyN^mz$<74bZ![{-߅6Eʀpj^&ã1:q4tՃ/' ok!ȃeǺAAj?zjX<!PA+۱3B$%YݧiԩSq&&-8(+ɘQ\iw=-}^L <ϝ 5ҥSLg#F_2dZ<xZ J,Y4T >M89O)$$Dj֬d{:uTwt,ˎ+D|! qK*g{Q; <Be<x bccXG% :̞=:qÐEcG$bN 5Lf͞!gLukOC9A3$:ShZLsA~$Ƕ"&_}K+! QF ]zѢvpɚ5n/Z߸qc60<y1&xV( cMxErXyz�؆4^#&ݳg:=t۽{'O6U:^�mKZep�YtL:I:tlK FGHPQjq+,cҐyyH <tXx6""۷ˢE1Tf ͵C X6- *);w!!V|hxXp syhj3=aې<ȋ}xH <M_^աHqYRaC)Wl޲ov4% ނNiz RTx4/%@|oRjN hFS{j /(2=(h4Zx^&70':bNv Po}Q/:J@ :L7?B{˙8Hm!O^QݷF]G!{.]Tyl km;vmEmdƬO6]U,V`yڌ> <m9!1QrPh%OwP)TBmשFMGlopv2rXS٘mHRN±mݨNx ͫ׮] xM}#Yk_ȫRՐaX\F,Gb)>gn <qf/nݮt:Ojk G#GFz^f?^kEIaX~|Q؆�=`3ʘ0a=gv\mL"ư!)?f=q¾}=\=x#Fx4-Ma6}8[.T}(hj&m}=^'OQM3ZZVmd┩]@R|x I01w2Pֺu2=kmΝM?m핰ڶoc~P^9GݿD;)h4Ze˙[= ȇOh: <h3?r,c:&Z xҥK>2P "o&CP̓gr\>mKCAu8xV1Iqh4ZxAeÞG7JOox~-i+ƎS12x/ J |M2D;fV_k 3li9*]z5kJ͑S3dO<Qe"�caF7nDa�'pҢ/ xfQو+^1hD>>KSMZgo(؛?gޙx0.\} ovJ/]fiCՔcZ=DڢIZZ% AMDҊ]زTnyω<$A]<lD߽<~~?LdT7MVU1'oA<wʇ~mMз?v_7b@dfes<J3tӚUWk8vcq4K9U)oo(ZsHYZs=G4)6 idHu}&ln zx x6c!hٿe`~OEeN2w uVU.=-,Zl)^2|0IEK"D4Wz#z򾾚ȗ1|p7-ٻҨ\B>}T�GuI."l+Ⱦr ~ lz=mAS^n޼Wp<:Jn#ѓ #zzQ;={_|5k:{,XW^yD#TIĉɓL9r'Ⱦr ~Y\Rz{�6-sX"xWu9:q4HE2Q/1du*f/^VZE4i53xLv)\l̙36l:^ӦM1tP9T̮O :t@acc>}{hܸ1ڷouY~˗/G۶mQ^=M^moo֭[+dYIRSSղђ})))\kbPK$Oul( Ve&eRG/w/?CO$KKgK*ûg9:DUR+,GF9Efy\Gp?+<t znݪwV ^~ yi dz'3O:P֭[7L('c̘1f}Ezz:ȑ#`(gﯤKF= Hwr`IʽHWV+WT'CSLѼF<B2?eddL~2cYmR&uώ<T33F/s.sդ駓%bKRIK6!l 3tBC['z{~=HɳF𒒒 뉉ԩI*A9X2D2S殩K.,t�,>? VÓEˌѱcGAM9?To6f͚wyGKG}uZW51(xEd7鷾c5>v,6):Ry肧*A%OO^}wz8SҖ ^vn&NUJrjr2r&I5n٬'T ^˖-<8Y؜Yٲ18dĕ lHd5h55iDׯO}xgs)sYϞ=M޽kO1"{+$,VirgkbPHNm6ժ!ȲlhYRO2/dƒ'Ccud\dT%q'M;DI>oNX\|edْ LU<_>OTF~[YΝ;VM6.Mf.'[oaѢE0`Z߿Z%רuG!> $;'s<R|_jVg٦/cG1Gq:$Oaݿ%v̒ѣG̟?_SyHH, >x"}DlvڥI 0W2-P}d 01P(2' [?)'''>xtvv6{zz駟6 &YtZ&YKQ(x<B!i<ȉCY8A'Ob<p".{{QO/N>mRG2Qad j4?N80zԜ,o'#@o>jذe+d4ۊhUkԨv@CE)!&8,';\i.0'S*)heٸVsOd]G#rO:FGGȖ~DPeH;~kW'Rw,:v#v5&A`P!<'&i d)$SbȀ K/`\VgĎǠByO/y2&۪rɀݍ#vu]<Bc-x#d�H4%c0(xB(x G!`0(xB(x G!`P!P(x B`P!<v2ϝԩ O`a<xsw.v~EE;VE> !/bvEbL /Wuw݉+W*-+\wMyأĤ[{ B(x5<[&d"bX%տ( |gfܽ{q\A,d#BΤWEgsppWQuk?(ʛ+uh[?(xB1fRXhAg/O0pwܽp${C Aq>%A˾֙8<m*.-\bi GeX*)U-Q!Am*1s\~sW|8}eJ.'瑞u2lz G`"|Na= WZTQ!<R'B': wodlٲEJ2sΩ]H|h?A\]2}/͟ )PgOhѢZn%KT4#g@YfhӦ vލ/B"""L.^ZR&MR׫X:t@acc7oZ|oZ5=Vf̙36l*kڴ)CyYY&L`̬Pt7Fn: !'K9.aYN'w}#>!QյD6l^2Ӑv>EG2ΜKBjZ"p;~7Ke_ jgΝ~!77999ݻwhEdSOaɆW^yŤY7o}Ezz:\#G{*ϡ[n CII/wtƌc(wvvoFx  >}Y+Qѣ)xB,ӗf/9̅ìن駓%w2M%5^|:B8;~Ϳ"'Y<K iN:!))ɰO 52k|mzѥKT{*ϡbmְޱcG嚬zyy!;;MBLgI3<==zA!*$cfi8s)H\-zS[\Yb3,'B!;g,W6^}4i 4Pԯ__՗ޛVyMoG5Y:D {'Nヒgy=)xB,, cM$o={#I5_^ffY+֬[k 1{sd%wy&ٰMj45޵"xP%JDիd8׹sgdddT޴kz<9IOsi\Ӻ}QAAO B'xҗI\( z=!:&Vmӗ ҧ[[ }5rwÝ䍿8m 6Tk*Z<g˸[U"ҲeK$''?P36Yvuu5{xxk1bU^זpڵKeΟ?\;998pU()2<B!O<xiKKKSȺdY]z9|8\<xy;דE\qr| D}HJI[C'xk'N?SdjUheԧhFh&Nh)B,}ǤYڵ+-7o߾}* װaCkN]q4Ɏ7pk}lݺU_ze4 BybOAt2BʪBʥ0{'w`P."k8#?O?2-^_Y$x'/N>?O}S!W-毀�DFF"**J#G'dVxJhptjQv3QtWHo)xx6kL:U ,L2m4 ! %կNlB%']Nm@aQڵbܾSu^ j&di;vjƧBY(x+22ӱ XԀWK~e1-׳7G!,x G!`0(xB1<B!<A#Bc0<B!<A#pW9<wR*]xթSqp[89q&f ,at1s;';A# ^uOd-88׮]#c+ 9%Χ!;'SwMQTT;deTG\G> !P+xNقϸ}&ROꇇ[1'Oc;fINM4:o~C`P!]WZEII |}}kIi&6{aJR$a`U<G! lqUc˖-$;LZ2l'O4JG! 5\rESm[2;Hakk-ZuXdfxۙ3g0l0ӦM1tP,m.WUFΝ;pssCмys͛&/_m۶Ezh4 !PjG "??_Sf#q%ml.öe8ݲ{d—?͝;Cnn.rrrлwo[njT4EN<cƌv5jZvwwG߾}xȑppp0Ȑ!j$3A#RkgqdIV.:6JIv qUN4Jmz9Dv5שS'$%%!#%f=zoz.]j(CM̤0(xBjW${d <Ttޯg {IfǰQ55nX ч,[#x111ӧjRc 4O>ݻ̡>4iׯO޽KaP!Ԯegg[ddcsa;y<QIvR8:[T,5D}D�oݺeXd |.EEEZgUR_d9br-;wFFFl0(xBI1K<S{o�cX$%+fXi5n8i<-YXk]FL ѣϟ; <ؤM6صkϫZ'}V=<<x1ǠBIFN---M')cǣ0a ƌ(|:F6?14Nbp֭((GF}D&LX[ju(Z믫L[rI}TaÆh׮4(Z_5j]vE`` A#rO-Yi )zGMހa.ܽ?pt Tlş$+_x0,"ŠBybO 22QQQH=/5nلUkV`]z[M<B K^HHj:U!塡r'!ͬ*ͮZVV lM,A#BRGH3qkUܯ&YG!`0(xB(x G!`0(xB(x B`P!P Bc7^XXzy\|a<xԩ8-Ϝfa8f`0g:f NƝB'k׮YzRҥKV=滹PxSp|s2utEEc]@Vv:ΞKEx!u䓝B'-((?۷ok"~xxUpT f$&~ B(x<yXiiU׷Vd?s%xg0cqÒs<WUl<B!<ȍ7[l&ٳa'JΤ%vGV(Z !:!x"lpMIv񄁿8Zu)tw5leviܹsnnnС7oܼy丫VBѸqcHHH4kh[VȲl3.0aZh/^lr,U݇%bP!<WXXh0'+i[d7+]`1tIV/|i:;jg^~eCBB+ewwwJRG P7|ѣV2x...ׯrrr{o, 0XZֱ݇<B!Y{A%xRnV8~ iahv&YiM8`?ծ}𼽽1|pC+VP]tAjj,//Oek<:֭[hҤId QԩIyJJa]Kⲹ:G!1<}&R$%x;$C1m(<Cn7&Ycԧ~FEV;wU4mTL,6  (ׯ#?*ڤTCeqqK\:9G!1lT q}M=y6تb@?K.Œ%KGwY5[Zs\m{d2x残< !'D_deei Ìؽ7�ѱGqt,I347N4,vX5֮_]#~wӟ<<<T?d#>>#FXZlε999ӧ g\n/n&*FŠBy H[ZZ&RO`>>>fLǎGagcQt lFbh<V'y(--[7QPpwGHYxDR}5j]"00b1A͚5E[uI3a,Wl7n۪U+|hذֱ<B!ɻeUVIFUK sqoL`+&Yx#)d?˴.]^bP!<b'MtDTT&RO;lŷ[6a՚ؽg6~^5ViiSNU_%*ӹL6ͪ<G!<I5i:U!ҧMK$U[U_JU7Ai}RBmV5;VMobMymA# if5nz 62<B!1 ! B`P!Pd0(xB(x G!`0(xB<xaaary%U;tƄ>˧8A#R'k׮YzR_ނ`m6lsÆ!}p[{G!vO)[PPoDIp͇SaQ""_"W/~>g#لl>sRM#x ~*JJJpUr wUI/_? ={*&⤤$ k-ʨ$u֮$ju=>s2(xBɶ7nXEqq1l٢p:OٮM"wpU;Se~;:u )T^}U4^zQ<B!GDجʕ+V ޖz4v,Rmmqo_DdG8Hc$|xL9F_'0i4haŋUVhѢ&MrCݲ2ۣu Ym]|9ڶmz{4(eӧOWT &wCh޼9lllpJ8s N!gܥ\iɒ%_s2(xBZE~~U:|8tR3x0b~/c:![Si'؎^O? vם'--Ͱ_~yuqqQrrr{y १_TRRRLwwwG_g"uEG ֭-"ߓ'OƘ1c s5ܳuɠBgqd%ky 1[z ?Nb}?mm{l'b`$''?}D-[m3g4O$Rԩacǎ& &fffh%{[ou]tAjja=//۷\2Y2xOSq꜓A#RO2R Ko&N[Ν38ЭB^}ۛ7G 8~8|tu$Gk/,00?<ڵki Ї,7nذ.e}:2/x&MA2i\111ӧjՋouɠBm2OVU^B ﷪d°S'w;u{7bccq9S}> ^Ϟ=n:xzz~lUed ^Őx\EΝ;###Tv.> i|̊<ZV,7uɠB#',%++"sj8pX UO E8$'9zWh5<T!綾^Rro>xlɤd͞e˖^{er<!=bjӦ vڥ') Yo\uɠBIFNM#h!$p`cǎL5CYO,#DE:"##h읟 8QҼ8qDQ|igggE+͛I h֬gLdKkԨv͝k߾}Jh6ler?++]q9'G!! [6::ZeddԪBʥqҊϜfL4FEEvr.*<E6XFZnPB<B!OIi@@ʢi!dbpo͙d<D2dջ~a<G!^d4JPN Lx{{tixxz`pvq90k&N>a#>aD A# ^M~E\ILr uu2`0(xB`0(xB(x G!< A#Bc0<B!<A#Bc0<B!w0~YsIy$ h Bȃ<`\v͢ԓ.]w'6A#rO)[PP^#9|8%^#' 5Rohܸ1/^̧9A# ^m~Lk %%%|8s\V (*}~AN8vIL%{Hae<伵qmUCĸ|ڵ/Xcun<B!ɶ7nXEqq1lbt(*=?^i Mcn:[rFlbF%.IH]<K*kzQ!<'f W\_Id%x{0sf0JakkkmSq&AVZE4i u`oo֭[+dYwh۶-իgQ:Z7}t5PFAAA0aG!qBKcU 3x^|#8!YUOO^\\^xOXݻwGZZa?9GnnB͛gEmQ&2du\ ֹ१_ݻwն^{ )))< !Q=< g8c{(F8np*%ۤdy69˖-Sٶ3g엔ӵ$&&SN;'$$_6he=[#x?كz< !D$#e qD$ދAϩu f]ϣ]v*Ce ч,^}Ȳr_i~d$BBBTV_64eS(xBCζ bҊe/ݐg(ooowm#驮֭'lllɲ!}񴢲:ՆI zYQ!<',%++*S&B<s]?ýiS&'*:wl綾^B||aɲq7'''~q}􁳳lf:Z纟gG#̃'96ȀO^K7W֬F{!OR읟 8Q͛7ĉMFJ3ad,7V&?h֬Y1ֹՅ<B@ݲ*$#dDʥ^LL N掽"F@!|9~c0(xB ADTT&RO;lk 8ڥM<Bό%OFWJsԩ ) 3dѮU,(x ! 1 ! B1 ! A;BQ ! B1 !G`0~YsI::,gb LL>wɸ|3<BUWDւq58RO_tɪ|7W ArJΝOCvN.@w Ns8|3<BUW䝲qmMA5cNǔw̒�iv|?7P!'׏ZEII |}}kIi&6{aJR$aTF]ڸ6ɘ?A6mШQ#ػw/G!ȍ7[l&9MG%xgҒa;y##Jӧ#//eee*G#B\Dجʕ+gmߒ8b "t&A[x1Zj-Z`ҤI(//7qG֭,یϻ|rmճ(XUsUzJuU!akkKdUv}ܹ777t͛7 n޼iQyUTc0=S!Pt "??_Sf#q%ml.öe8ݲ{d—?^O? viii\,ϛ7ϰږݻ7\]]M;d5긦<sU7|vvv8{ls5ܛx;t%#GX~=Fe>5>}<B!j<@?IV.:6JIv qUN4Jmz9Dv5'"l2m9s~IIIDtɰޱcGr?33VhU1iv„ o<裏LDSx<kK.HMM59_-.8zϲiSG!&` M<Ttޯg {IfǰQ5ڵCJJ~2HDܸqcú,+޽[+u.s!ߥdzix^&MРAEU\~/$&8KQL#Bmζ bɤvx=f<}rϥpt;Xj"x">֭UUHU 鋧ձ6W1_UlݺudTqyΝQ̕KN2wGx>)xB(x ,Ms1 :(NERr9iX&ىcђ؎-x^B?K/x~ 0e~oNNN&}gggmٲ%^oeuU1d�,C8{l/ϸɱG? M=<<>r2A>#FXT.}V;:fMˣ4zG!jσ'96餮ԓӱQ0c`Xa>#|џd'OIK nݺxԿO:~~~&7p{FmʨΉ'\y QlDX@f͚hb,́'8l0]gѤܗ_QzU&O\Q^^^ߜk׮ Ԓrsh&߇L#D [6::ZeHdlQQQHԋQTsqoL`+&Yx#)d?~<BUGbcc~ٰa6nܨ*"H=/̈́Csyq6""cϾ@l]`7Vw/u7 N.{xzjRO6W=i8֣BZ<Ȑ\+uBCCCqẼ4Js4JkYY%Ȳ5Mh~#B3#xG # !BB! !BB! !BB!<;vp B0o422!gի󄐺<Bi"Y!,B,'!|!P(xP!P!<B!'뗳qar\< ! ޣW͸rd73!<B!G\[(9K߯@qnZϗP!P87nfq(MއĽ]e4((ޠ}Xf-<HJNy' ~<B!'h䇯GiNĠ,+ WOw?B@'z׮]ٳ W !  Ap#Q^Toq!xލ*^avRiX]m݊CHXfBe߰.˗ձdR\YU<)?zV[o[6sV>gҰ-^cOBRCP-ʲ ho ,#%ћp9EQU/MCBp*e*`W .]Cqq1"~>[Gm~~nm29ntlZQc~0$ڂ'פŪYva=B=8n\_FmEy^¾ߋ:dw*\/4A^_\{'g̡<Oooo6 '7װ.ٽufRRRdyG@�]j=pV,_W}*n3wmUfz;<!(xB(x?Jx,=>[Aٹ( 0t"r|o7M3&Y9fOYm5%Tj5\~$YܵUOff]wG!`wW 7–$Hj[I7lyQ\y\1gLievHQ5C?C%WA %<sINIQF#B{ \>Vؗ(Kۃ0Qy!(O?P;"/1{9*,,ġÇU<KepxI?m;p8"P~q{4~.͠[𴮭}vݫJV]7 ! ^B+nwEI'pttT߫e{KqczQ=Y*:i\z vޭX*S"2B?RUE/\gegu)U 갴%umst<ٸI}26YQ!P@Uf,~3RPv_G� Omӱ]-?JOoTu]wd+?CB#Bk\س{YU>3$<B!:7ݩႬm֡ۧ01!BB(xB(xP!P(xP!P!<B!<BBC;vWfIH'??_;BV>@ r'V,B,QYi!Mߨ[UoX;BB! !BB! !BB!P!BB!P!BB!P!B(xB!G!BKyΧca����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/images/soundcloud-browser.png��������������������������������������������������0000644�0001750�0001750�00000442216�13112005742�022511� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��S��t���ӳ���sBIT|d���tEXtSoftware�gnome-screenshot>�� �IDATxwŕV7NfF%P@ I�m# X`w51{ENBD9h4ۡǽhii=]UΩӧ۔;gylڰ6<eQQQsg24MClݺE;:xGhok0ut]c珂R xUrm MG?V4]u=�.?4M04'w~}_߾} a>>>>>>>>>>>>>>>>>>>Qs%1tc9"IaLSg{0kDhlT u=4>8"ΐp\)%aE$DZOo'q<C)Rr3YW#f$r.:v+4QR%O1vXƎMYY9 fYX硡ӃמҰms( Y_F*c#=rK3"A1KC!\>gTŇ}p_SqsC|BX+ >!L$PES2PK4aL[;I"FRh\rD"aB&R !D+YT7^ "G:hJAӑpAI!j*vFP3zcGm] xPug@H%5RvHy)5qY\ɀ@zTx)2.(v}lџK1;olϟ2<xL <lRve_j&#$߾dQ/wvnMK! O 3 %W\t:կa:K_Zu68"DN jJ8k4M Iiv 'Zstp`6z68:Nlw1(m"S:\7$ Fҩq5}S:t;qBװ:Ց�9;fҫf:l&y3$$ZUNk!X(M7 `xS&t_%_7q<%QٯD1.*yHY DᡆR&mȺY1Cgx? U)ş*[X/ؚb 3. pL3AL<khFoO2FSFw+ :;\a2xo92;SZ*t.K.u\4 !pp~0wv 0 HH'!.<de20 s:N3t#v>AځL{]&{2GM&IED# #xF'o8&CĽHvp~e:w]҉8&*CA3iWS2&I5%:{<+Hu)`Dy�/?8=kI}e}AyIi"ڄΨ�9#JgG;ٜ۫y5JA<3N:k0Uiak F(qOsAJT6G..?mW BΆ3AY?76ry~y٢<"Hc g:."]ϗ90ɾRx"e-Ʊm<Tr0Yg#-7=*S?|Fe'xɓmU8MPJNw[i_ICH-@Ű* tI `X*BعUon +~1s-i ^SBx3ogir@oMDC X ɑNtH9Ie+ﳌ V=]6$sxgHHWP:PMB/{} 0H$VE âݽEy Nqł/}dúxPuep@8([@=DXTv6|@U*+BZ6MdMԨkߎ0yiOxZAfʲ։&z*d锢rA8wY$Q?B̞̄J:h9vm`ՆCXaOPaO>u*>rěkx(XEJ¸n? ͞: h ΄?Փ eGع^{(%asN:9;xGy?|_U,G˵0}d)&ɓyw ?IZ+1[G/$y9 c$wcgWNGЙDϻRx0c!?7Τ]p G$/k.@%Iɛ<֖F06Y sMc}x㵶!K|bp(eu3))w3SJ+/ǃ!\?!JwKf8y}[7ꝴKѿiAEAJHdʹ0͂ڟXHQ@l}Ÿ g32.31!4e͛!?`�qyZXyp,~ƗNxl<ЀT&ã49L8vyz;02l*FC\TDp8-kĈXmgT@CmPY+W6K/]<3GDg^ʌF[uXx#Aggv9ڊ4M')àSW$ \OSH+rG `PUA A<!4 YaA DK>s  i2iN4]l!0LHx_ti�BǑ;ƕj="$Ǫ7k:_*x2ɐON}]5A2$ڳ8BC"FMBo<;]Pr=E*`gM'('uNnI'؅,M#28Rd1 h@@"lDDIl4K,@G3M*"8$J`M1؞4 բ v7Iv"tiGR9c'( h`-A~K Hp\E#q tr"+Tە@3tK80Nei\ h1K#dYxBN'qҢF$ EtWzyl'z$v2S5} W*}:V=1|p! :l[}K&H REDh{hi@ O0&5e᢬3kKS- qﭣ%%1c4Oe;Os$uR%!VSIC6㡇jrucWքC^ÕMh^6Y~bZWZ ^M4kA'2~"4=}`,J{2[dS5Au@IomE Hmr{5J"!~9e̽5 r\U5{>1XwDj&r+pMڸN\(r)r<6BDCFCAZ[Ynbait2fUDI"e F4Qt߷kl ]$ Ϩl]wb5wq%NOW"'춳$El ʒJ2>U WS<+\4b;^]e*>#~ )B*A,uNЂ֎q`}7kz5#1,ьAټjD#^z*{j2O�PwQ%<iHtnw?upB HfL.n.#CaȂ&2{3<fh,-'bf_4+Ͼ-7v Di>,K$A?W>|sFâ^*#8N6!9[;]7?N)eb0isUx%N(du˪N.=5$kk94뮻?sxd)2Yw39Mⅇ,s]TN`j*Ib<X#dR3Y珡<t:M|miwpw?}ñJ0&- fD5b`fFp *%KgyuQZ3JF^HϺh+j*B@\Ymm$rt2؛U ⳼+Sq<%q-  Kocs\'up/' 3'/`rUK+\ `J׹_DDbr#.E0@&ؾzO#RJ*g0e,?ꘅ�d[W3nhs&&tFY)pj}j5%|aH{eecٷs*h~D)?̂g9T)pw=ƿ0h1zus$7}QLA2 0?dȚ XXdz+Hn=/gg@U˲k/`rUNG`OV']!7̴gJ #{$Μ,eaTG-4@ؽysaKv8ʂ{7 =qh.v>Lޭ<~X2Y6!@$罓-@m PVNEIұٳHUph#/⢺ͬn:ܴ@>2*LaW9vR2~E-"r0C_ۿ|=Pud-{2+gӿe;+.ɢ�~6n1), I)ʘg0 jغ+D,_JŹӈ8AZ1uMJdwӝ}QZ3: -o PZHyCF1Cwp(v?/et9v4'q ).cJtTC%WޫJCgR˹vtFT3;׽so#pzrPd >q.匳‹ x*~;v dV2eT;R8VvןMV=:v )J f0 rYVŌq Zђggܒ#rՓy? og޸Gk^7cE8$1 Y4L5c ye{v O b@->v3/ɻ>@V)wPĊ�ũW^k?pBP[b3G}C]F2IJn{+qݩyv'm(c9qMP Ǿld[sET,Xw~&uTc+^' WH'=k`Ț[;xb,l;&U1;7٭YQSgqNC Lq|<zeae&Rd2C˸|ٳb9Ϭ=D\b M.8'Ii#}FXQRB[edԠ>.K}k52n'Ksд^l#U#b}[/J?ZW0u]F.2B2\ 1_8oI17$څ3Md!u3>% ) T֙i[a_%@:?6ǕBY x7pp\ TŷlNǤɍR�1:膁F`0 MZ�"%љPq,φi{Qx{YO0%dG Z&'NЖĪQa "%V�dINl6)D�%, o=ΓtbR4d#؆Fz22D2)1nB#3:V2Qa%ݼI $RS\|{9ڰ±dKn7O&ē!MAuXq22Uŷqeěc;IQV!f|Y80 tP ˥>u0Λ:*qJޚB5aBNfi fmMBCӫl 0ъҙ ne+ChNZ3 ɔC\/fJUl-Y"QeuWg9(9Z_z XPƁȹAMk:j!t\[xWezU:I<%>�%%QJY!Hک\uG's)JQSbikfsn+-d{eP1ο|鴃,t\9Sa*c&F/[k>^7ب|({L l਼cҩ4W\Ǭ΋Eupp.seu}?usKIf݁VYg2E K+ a|v}{Ztaj+,8!iOp:,MS\QDf(A9H-%kg2�aL]1>$2 pт-/[/<w~Mڳ9P(]"XN66iSUˬgRfQόj0;04\*c>l&yZ?):d?C*50,f!pǠ)oKfR.K3לKC ҉4"2/դSI]])0FL wdǻ!0z_ecL]C-gXo?ޯ穧8{͝nO,enܰshD(SUjм}%?{Xdy̨8slHXb2S\Ť�к'v{ަPg/)3n3ÑNw?Sǂ+/fVC @Pw|,ȳYGPz=:'?oC-öɃn鳐lDA[ų$C8U~3*̲R b˸s3R{!ۀ ~RΚ8}\礝eR<ΩgZ8^:QۨАR!%8}͚5XΛwA[V`HY@wj_z+LPx.ifN8:t#glQ8+l{?p us /6˦ѵm^ߎ1n)_lJL&qT`558g* 'XGy(dsQ>C9X@a0H$9֖Bud&Q]VB&CG"QSU- VCE~oٲT ٷqٜCa8fJŊq4=m cnd^a;2T@⸃= q*0"ɪgOjXJu *@exxu+7O"2r m]Eɱ>"(]O)(<K?Ȉ9|-/%>&*>ydo=`aDfp5#u̞"ȱ{)*$[; MHId]߹_Bx^3/a8Õ% (FJO[\fP#ТJwytղT̙KO]eOVL,sF{5|yFE}>'E##c33-2MvmmPPimT!0)[hs)_9|<)W"w镌tk] bFՏ/_˘sʰOsؑ`yBREFc nKc1U/ǝ;&MfB9)G{ŽQ^|r C!s t�*:E@ ?׷S%V4BMl\aGQ"Y Ss M@yvL½ڼ&s݅\?`^%2rfS:ԻHYsQEI_RSF<¶{0V곅G.'}�� �IDATC4dArizKlT8=FrsbV�!^x0�q `ON2EXr~I%Wg6~ӕٟuߺ`.:x!͝3:>+"㺸ZWӮ&VA( NJ I\F0thT Ai�y�); fάM-^ͣYxa-^<S'y!n5,cˋu%  :VUO%i:v0S(w�8& ҊluO¸5<e@X~~}nAbܷkBF<%UkCv%fF~x BA vmhP2a 9(& *v=Sn׿v鸧nUV';sD|L"#r~z^HMVW.�~hXi>>>>>>>>>gC|JAv)Uh_K#ylQFy)!-[A:oX8weXxggR쐲 վtO֙ dT4ygK1cM?~Kc8vY$ ´zR|$Uhy{=Sa>L$4Tb7GE4˛>qЂ&J)4$Ҷ]c&QF�ٔ'J)$cn*1D7Mtb-6)LhW= af$t'V9t1q곖Ј㯸.쥧ag4lm[Ȣ*r޾*t4#eCOaQjjK 6l|>I6js+ե[,[q+–6V2Bh4p]=6>s2FVxq/ G~ ^bӃ{aj^8Ѻɪ .{CK;׵\ɤwm*X2FV*[O![wcsc\}yUlmLO+~h!@ņQٮu^Zԡ$%PZEp Ph 8Z (\4UBzACZTK!ɁÝĂ"{r'?+YxL{+6`"{*{DXM*ǞZ:Y+C8ο[ 壨 @v.N]>¦FCvp*c]1T^Z8 0J1\u՜suϲUXw}j`?C uYGx#QRٮL,SUP(kw&*ɸ.^> d#oon}ؚ:ّNE؄-DDem]SzNܸoh V8hK^z.?{d5ZP'+ m/$6δĊ@IQPu*9.]+\s*oR$uA>5g"<>v5@{^f$aS w)=a!Ռ2+}Xz<7^q>: 4o�KG#:k/Ndmպb]y@^Ou=x!_.^;qDYqŊO|ƭ9S"Z䲰ljYQ,$) :3}HJ7 $m^N00urpQ Đ(y>WE ֽJlfon&32*MP P{2ATMO H f7*3o?s*.fvtA<'tkokBH$5}PY`UtO֙`g^27X`4ѕmNdф IiU(pBP t4ڎ]`;6' `xR2<f0 k#]EOt]ƛ锒41gj:$iTD&G@7(]{ޭye7-D4vB/IWs%ƤM/bw nf>TtE\<w_3=]r0FrZHvITNtG :F '^:AP}}S)y]HbJٵc'R u%V:#� ԖZعLO͟ƈ3yH/|a,`i ;Gï2 O&ٳ=N8�%.;I[nWSF2!b;82=\oh;ӛYh4!dw]DKyKt Z A]O0!CL286*'&A؛�`o<ɰ;sFQe#빨^I2LQ* ^u3@: |`^{}^9 *󥿺ᥳh Pgt#āaN,f":x^h Pqק5/+b[NA#~l6QRY:F>qZ qFmo^f쪮ZP= �G22. duV4q̫`cDAL4ߣ A^TG(7ePRG{8~ZP Bؽ=zюZ}Pj F- *#ʢ�v .=Ab(LIaH]ͭcML&VδZ}I\41ȓ@:ɫOQџ ӰqgO!쨃#MĔ9hcDl?2!E)E10\1(Fȏh"oy҄M"D4(MT(MБlwj.E ㊂[n``(!5VF1~hB0{x5—hEǹ IMř)axG#Nh4eL͌ 0sdڴis2\P!?K# 1` l߀{2LK>k9H(1KհcPѥ;CUlɌeVl6HޚF–](r>,Q~-Ȋɦ$#%:c[BR( ׮۝Q kp :X$/l<JΫh�!bR^"w Iiu&@^}c#P2&Wr&?+ֿX>L>sgjœڔ- =`<Kdgz^+C/J)L0h!t%F1e8ou~SPit9d6wq89Bd Sז2~z R %D8ɺgŻ+spm}) 7O 7'ش,׏ 2eNӇiVVAB=!BQiPh_ItU ]Fa;Ͱhh+.k&v% +eRVi{NAT"%Ί틹cZ ^ rvhdѲ1&_m s_>}0oqp@8�S4e>TØR8 k!@ނ܉$cT?1!H+/#حÏ]'{YרX X|>+-V3Ԏ(3<zv/On?>Rn:;Kk&B m9)&S'Fxn ?xv~N0]˙,ۊasŧ%шƁGoܞTF 7 r} +A6?~c6$R *AqL>'߹Z$2dʣ˒v9;(rC&9sF&ٻV9+n'-A):2@(1ex[W$ܝ2$B8+0k(TAnN2 =_9v02{лT:Y4`s-EPLRv͕GBgTD}XȏjH#cNo><>gr O77*n2ְSE̼dKH%}1| ,Chpφ<q0ˎV3ywΩTȒyy*4mpAhxC nfh{ܟ¼4z+Мt0?.km#Et2>=}||||||||<35`N F $K2 ^&ogc#sY@hLkND=Ӡdu%eQfhu ĢAeͿpr:;:u&眐sy7z峗#pNJFh:Zr'/_*^eqh D>cI#tOvf]\ȼ.2TaJ5 +̸*&+8ۘv@&Ί9-1ˆQTK'I0um;ŴLi*p4 CՕxBnU;?|/r#GIj"/ODҠS4Ջ'iVOz4d(6`?F<Ͽ=VwyQ}|:P�r^c) Mgh:VV]ve0ίu"D =ĦWٜ4ٖdîDBFڙ}0@ :,+'+4�TaĞw7ߘURu??O \@4"hDK� a_.$3*PRєI^X7;fEiNr t8ɦ6 ^S3kMM˷–S\߫rQ~/Ң*{$q())Z2NUyOp;9j#r+5:3. B  pyP]jol M":P@uB1;|tB*{~'Nޯ\ArXy,2~V3reZ^yTS(IE}VG^t-GSx, Uնw<t+Y-y "rD&~"{%L6_۴lNptr&|Mb(W\Ϳa_Y^E|;ϯ[]Ǩ_iiq[te4wm <B_Ƹ7Uk%p_,%oF@Uov TdOgj٣n|ۆle<v?\ЄޙAv }C!L֣XQQw ![X#Ŭa-o\ X+Py1.$p+ _.kC^d|rfY 3Jo\A@zxrg1ˁ @' 4E}i:d{�Ywn]7vgO{PSn=@l]|cno+hcmvoBgzߣ(4$58(g=-S!2o>Nz_6n;N¨`)Zy]N, in#BJv ㊷_O1-KO~,,3/#+lh5m臎~R m/TA&q)PJ\/GIRqk$.veY?8xuϓ؎ gjmi\ '7SP (OzzKͮ,V{zH4&Ԛxl!&0P8'v xB4~#q<^ +,Rn6xGON l|f-@Ye!I Z.JhE=o$/'͉0 Md{ٴ?+dO1$ӑm|<ƸUYQÈxid_4m:%TWgطw< hm-oN 5nj؝i4h|襭MzPo}|_t]A0hM& 9dڏu<FW J?s~Nf#qMs;#_.%`Yy]JBy{X2B"K{qNƝ> $ByMtӡ-`Fc!ݚo7ON41J#|˜vG-&SGeZhU&!Snw62 aA4 ox}_;`,D:򓧷w*5 [=y6J,sF "glll`6ؾblp M HBeUN<S}?ffsU�<tuUuթ]O 9qna{c'3Ѳ▄`>:QP .oAnǟwѡK74C`k \~E=,-~7'UIf܅r5<C3ɝ,jC$Na􂭔0n(:U{$;乧XxԼ WԔEM$ɪl\4,ҕB < o-)@n=;rmV_ ᯮ.E �P8#r׼c~m |&o=csװ#2ȊVgVi,oX=/x$-Uo|l\Dp&#op8\)Ky�,JyVݺ] Od9Rmyk{ױ@։Ѯ9O 4_g!a`ϦPs%[^;YJHg}4jW~4IlfJǞ kESA\zRT7J%S7m|\WZV3{?y9bw/lfYDBâYsAͥd:qwob;|} 7w||z:mtk zY7L.$]yu5.ׇc'Mb C;ɧY\fԌLjmꢀOHmM6iQ-eHzs<& *.VСHQQQQi#N6YjZ+;`�f"׎sKV扻!�ŶTyfrJ帒=5" L޽M+ɫ5"Q۶t°?=Dv ZS-(IOc+NihCԴq LC~0@ia%lBgrc57AM'.vF;�KfX89H{x5&oՐ dAulD[T<?3r6 k`HG"<$tXjl[)I=HrN:8 |jrqյDŽ=GR ,NFpқiFQH'pIvfەMïCoh Oa'BCcOh=Nj#&pD"4k&y `ueu z�F,l/HK!D*\%na^W Fm | qXJ73},`I C׉%l^A7兊TbKHh~b;YBCȃҋ9 !2G$;~0pLDmIQZ�YdŽa#$gZ(_H$]N!r+56 C#?F#p1)luK"NʍL,aK/R'Bc/[Xj!4$O4 ӱ5#tmՓ y>K4Vc9 .p5o&˜- R'n8HhA/I͌x5*ߋ-Z%�f 9:qRl~6C,RJrMr$�Q[{/( {0]1K"8vZy M#_[WO3zH-ʕ$v= 4D p8ꢓHfW�i'Q]chZ *RjDcf),7@ >v<|k="8htшk1N �� �IDAT!NZNHY7R;ǃh $�fMn:K{uB{dF^Rm!Zo 7:/D$fb[fJWD?f)tš-9ό k7A9lA0Im[FU_6E(OE$VfqChA}ڰ3ٌՖPQ+ BP(uN9Mc*60M1&Zy+clI"  4uDj"b1^W׿RC!my @띿7tHŕ#/-,AjMJt%nƐ4UDC֘`5w1+OU{Xk/ rp,$рP(qe�;~rATLd{c;̪5* BP(G u[Z]||a,R]kkzf5m xIIb%f _y^ H)@ P`N[?}>/Cu^_)WJtp^jg[$V2}6\; SQzkS^GҠ/ &]xwkzq7/FcHx>"OB8Zl^UQL4!;ӭW%M{<) BP(R"N2)+T:'L/]H(RީTBP( BP(E<SM2jW jB*p"< BP( BP]2XVP( BP( BP(#3UP( BP( BP("噪 BP( BP( B*RJ 0z( BP( BP( ſ4aɯ BP( BP( B/iT BP( BP( BʘP( BP( BP(m}P|3RQw BP( BP(` 嗪8H0tlP( BP( BP _q BP( BP(_cOO:v$$yg{Xt*fIP( BP( 䬋.e#y9,Zx'Dz\H}ep0aPD9O?ْ cJ_ ؘA0W6$sHH*t!9`٘#GGJY[ʹV%M׈Q ̂ & sA~eҐ>4`s_~kWA.9HqppumxoX`d88.vm|VqX#ҕ BP(I=v4xh+)S"[Ci:KDRgҘaL=˶Y{ؿ2Ga !quF>OaT]HV3X["=zWI"%8!oʐJ=CL�2cH1Dd/Y}7/l^f<T  G�!ӫUɵAE~6~u:Jhݛ^t ]#K2ڋ]toEډHX ۡ=:*ݪ[%w>~] JURP( 3sZ6 i(gL?3u.$Nʐj[GX:x\1/o{Pc3+-Ĕ[ }Q|%l3 E0$l7i60.ףLۡ$F$ hMZ v5RF,a;)Up4TVjƘ}(G7IUeԶU0B# N^� ~n&ût0Iiws 0| |P[Ⱥrtχk @cOb~h$V"Avpp+2dhL?k16U G�*)[N Vx~^b-n@{VZTWD�p^ᒨ&jhr Y68I"iaYNfc7k}$D6y\hxK{UI8N@1м>&KH N鐌'Rm4jW;Fe>͟C~Pnm,jL\Dte}&WVmE&u-I4Ë?'iaUqM*c4U ׫ BP}zbg[<.VEǃ@z qD+%|)d42~ ]&t 2 @!=.8C\{^*>|kR̡P7hR5H7-\)؜ [t1Rw[A*�R)#V',v?euǍhpCkʐ3J!sSf?۰l{#D.yȼSc�nz%1qĥi$:={&gN^(gۆU|:oYJkvs0g^@&*ؽu=g8>Q"pt7xF| O55$esi}u:$�.:?! 4~&SZƫ54y3q 4\?zU:C\N1n,}<y9:tMbI1Ӹt 7/]s{ټv5% Z]n79.y=BT%kGFO>d[~ wO7l{�#`jVw~D8 dDylyx:I"N/sa`A+7y^_gg*ducv%}[*ѕ^\w>-?o=n�\opg׋<âlbf? s- |:r .gL`jH3)ݯCP(=|>IK~RBN{~v-acN_}Cx{Ē5Ӳ)%unq%Ys3HeKORZYmui1b`Ld71 zAa�%tb;(;2@/G!bϨ‰QR.3P{vЃ45 ňJihqP"_껡x&2*a/Rא@$7ۦ3U!5LY7ІpI,So'6NIkx/S30ľcMʱ N䧿  =M$~vsKZ>]x4Jk@hj[W~JYad?BafÕt`;t}G\ JRG$#]73L z2rrOFN>q_+:^C۹^)1=3yhqV5DsK'k(6*ϛKmq<{w lʏB?:Q'ʭ %|:_*5h2?Es;˪8BksYB"�3jz0D u'nsE;&ұV_:.y/ȧ|߷'`T<;'k[{uP( E[+k<|-˲ܱ,]k7i&ؼc/g]K&ʃ!r`dVTqL<{<�c/>Ν|~Rnc0=ӵ3q2mg 6]MaXql23<iŽsOG/_@.]s'ހ~Jr|F$•>'CdB*h 6L-n4Ȼ%TTA݇#O۟NngAyϱig3mlMJ;I4 iHaS8!1+�4yyү:VCRj:qA\w5Xɶ/W؝{])[G1p11cKٸr*L"zJϊOX^A+ߵDb&F: @e!KZ8m4]ipTTPf rg&GM"'STH`Wѷ uITQI eֺJXe51|1H''<o*2c&'-,q3˳ |0a$CVp>u6mT8~jڌm[|L;x?^E$w"Y]+r#z߻up :ԦRA:j*b)S}3 \r~J` c_ ֲB"d\rt=;7Vzy㬞=%e.POcb//M{g`B#-~%%`ތ9a5˩r"~NleI Z5 K'}kΐܦG9ɭc{|o�'\p</<vƧYWM;ɂ/JEb#], O(Z[4C]{xvȶ?/C:mHu|ZыgEóp=YˏZ4g:jzq7a*?LbO--u]"Hu˛CAȨ]#{dcDlw~wTV4@ ѷ$}r7v8_{SH;V|Q( -ZePXL(GJ+l߽SvUޙ{݋ӯҥceh%5=nk /7^>]ӈUo#5Ut+0se*fOU^t ,Ÿ+沵FqT4zxQ=餖T'RVlКYޯ_vmش]gk#0,&l|ȝ9^ufq̴9o`ӕN9Xѽ5a)/զNt̵9SFt&ER.rx#2wF H~O&88Ά )<LdwT׋tg(9=W3=mH;`crBd w% :lrYdM;u329`R{3 _{W6p&rfvw,pLޥ;y8f7+?z_Z=W?k~W~uL^b]1/<+=t5t?O-'2/߯FŒ2bPozh|+A^b4 ΎEfYk=ve7y݂`UlgټY<btj7UyL~{z=dr=zcCD.=/!\<p R+hTǧ>/Ŝ tN ^A}^]9!* 6O[mJ?[u3{7.? G(^{ltxR>t} 0hlL"_Q6{Yi~ yFŝqt7'75;MhCj af 277wrv!PؓEmu'a|?uǬ'xgIXw<?ad6SJfu{hmV"YogN =9&uz!sxvh<R*ٰt1 zE7Ȉ+/ܾ<1_ 2boKR@$IKП~9dy+7^0/2ԋvZz8K9ohm\w[tvi+BJ:=;<s Bhтqͫsp�D |u.}b~pYhTQz:VeUD5/`I:Q 4GҳУKV"9b6RV>E\ f϶vnd4W`QPXȇKV!L_Wjy+ @]Xʹ!uL)RqVA4ܰ**;Cj)gfH,R|-Hr8{-�xw(B \=4;v BsyɭMBs8sDr:E"lY%mĸ!9Y=ߪX1 tN)㝿`G 9[OА -j"Vo%D2oƘC |λv"̸O6x1>ՍQ@K{Il0not[6cg=}[zS F)2h\0/35 -y8'ZzJ"VK+Ϫ$o77xz)o/O&͔yߠ[rRF×5$l�M�2>�2V+ @ }<ɋũ.S,9U@|ų<! gܕ\~_Cq 8ؔ!@t2ŀwԅ9]SJj}O{75+om?*K:6{vPe'YVꐵisY</hǵgwe wN[u)fd`W%|>OE47!_r'ҥ#FL;aMx:#MLD*E.砵C~paژؕF`,e?'Gsyř < K# ~oDx/q%dk#Soҟ`SʵeX-̙ΧM73mxN:ZM;GP(v"@AN(ȣw՛QKǂ[z6}{йcB N\w񙼻` _̚ĭwl& :>η<;aԏa[ʮmې6TH.47܇48w>5UlL¢cb?%ٰi++J]*#Q�W(@JB jI-s2qPq-zv [v/1Z\+"&<I8o[l{/1d 12^P?b]8i wyL뺂7@_}!}FKu)RKj6/b`' &` qEjְdD I/5M n56:L9. YϊvrE`sk*v}ygQ0T.zV_f} fp�O>T9tّ-t~J|F QvF@cU70-κj|]SCѸә: �]N֋sۋ{pӷ V:|,b+V>KC_S }|Gl7(qKVb0>/xj ٴ}6iδM-6=N<#F]CVdV[ނe%wmC4iO1JRN:qzy3ӂݹ8@C--Mq0W ##:a_?YFl>"3R/&+(Yz/j~H-% NY{7 ;·ePTEx?[D;k"'ZEY$s?&_vam lYJ2nC4*b ?( '[],q/n>�6_FH$|>c<�^{b3]c^-={:` ɴn_0{67͆?gc3_[/kWtվn:H @�뚋!*pQe\gٯ9 ^| U?b xmK,ݖ^ύS"|G \}Ro\=]aӃ/@rC/J@9KGOkʯ{wD�?s~S;\9.^>l5]NĈ&3}Q0f ǒ,ve$iP�M;* B%~۵TGb̸$-5= B܏6+o%ҧGޙ5S5&1|.$7<?Suõw>@(f.,P9R�� �IDAT]NWȁ];u%ISsoN>Djr=6l5$HaDL6:~^iS {II" DL4ǭ=1jGtr2]`;Ik>X5dzrB>|i�n}MI>@'ց2؟3qFMGըZӡdTڴe t|UkNyçspps>X^HxuD˛}~sPl<UQk'<D%8oڕr$ x�_QkABf&lXNA=!m*y?e6;Mw+'Bi~iֿ~==6%%;N΅ШʶCu Nx~66f]6mE@J} >+q`]nAi_vr-X]a[Գ3Mt'#^9`<{/1\.IœϳaveLrҕ]N.�&_<:K$Ff2-e0{ᡌC'V%гt7HX1ͽ �8*-4Yɀ?{ECB:\1OJ^䉅MRʩwK}Y+m6>!#}y~@CxcK[zP墳z{m6?Oێ%^S n_p{e,^{1¥G%ӃK.lTﻳQ0y.[l#t +g2qLk+6˯+1j&k_9Hw2alװD3ФD#Tt95R /Ǻ7ƫ B6yp~$l,r&G͈}wݻ.{d]oj:x%n`73f laŗ[HV;pLsØ9 ˶a /+〿F MP^U&+a&8&�?qT.M09nDM4IA ׭>"qꉤ r}t\ ZFO>iPTWԻ1mraKXR.kGpr"΁%VRB`hy>fZYְõF6${bڳn!D`>zʪmt 鍢�~OM,󚔣U5Zkase^t�n=M=[yoa%CoW][/ QkZD7@"d|'v<BPw5V5C}?5{\ ^Fm08DYi9/^/{JҔMg(k1~&5풇AKvkd+wYg͘DyN> E@|{,7x/ޣ<{ܽ|Oy|iU/(@!^ vU9zlܗh$V"ٕ/o<(h g _tfMWǏ:־kKeARtd)z{tw3KT CE<1SRζO(iXbIoe ?fkp/-%F|Z:!ugzB4Oó&N}?¯Og(bЄ޷s 6տ0-L׎;2Ch"rA؉RZN9lG~)_GrB dWNA#c} |.(fFHn}G6<~Q( IL^~AKڻkWiZ*v JJ#d]u4Є`˞h!t梡|r RwprBTVGb8XRAKeSƎ}202PEVV]@ M@P ꄽ8zF$AzqNM=n�+_khʹfjaK[(b$^Syt.yeye~gyiDu[XwM R7XިnzY?%�'2aڠԠ(Ov5o2vW ctW6M`4ibΐRvf cd}3nm\>ʘaljݦ&g~ƊTancs=04_6.m9犔 $;4YiH?㣏?,X)"M%6Dɧ<doߛ%[ f 'Xt[(bP@ DD&t?_w;Su3VޚJL[Bmӊߌk,Фlvy*>~14migl]Nx1g=-..3f)M9"z}%f\`w5orbs:InƦ1 2SBJvDz#c[uÎyߗ)P; tJ T6O9x)?'}~#IF/Y4A/2J\t^^Aky$mb&x'"nMs}/*f枣P( !iz|V!W5 ]KE@Uhhh/`z@w|N$g/yv2LaPC.Qa?_$]V>!E9Jm8A/R<H)eDHW֋Ǐ@u7B6`R!\4iCOMx9O>{-;\xt֕xgl0_p>'p>< hP=9񯫎ɤKyר4.S={1,_<35 Dx!>P멀\&MKOi)6[Setahm`o<R/Wbs?,ęEbNmϲu1sX/6 yŶ!+DE3?4o8~fɹ@\? v8FjѹBe0|DK*۟w/;qpEzMr|Us3scNNyϲq13p!^3AЪP@gBCNgރ$.Kk}74I$&N\24d i9]u$Zõk¡J6'>?^E'NSOyz E~9j~fkOm&`r׼zF*|3V[ d ]}1?)>a"C,ciz3~q~@ưDO) hjɬSP FQDDŽu')NA@R21e"iZX@gHКƩl3a3)ٸk(З_(} W|Rڥ50NkР-ڡq]f묯I4:0zt\Weescqi;H+FRҥwt*Yu:{x;W\|h79<;�+=GJoTÖյT3ѢHHU `ı%Z6O^lնBB#\ GJ!DǐV~:!#ְfcv 5!ҨvF6SĊ?1e,hU CQ( =Z*h@5\W Rg1ەh{W�.&2el4ׇѤ-W>t Q\:I u"#Aa#4V>=6+k &qy&0@OwcI OD8F$@ ^!r]HZT�D=U!0zA6ZLTTĕW\ʨ[Mi^L8ܶyM>Nĸq7-zu֕z֭ȳϽ}6Ezp꘴ir=<1{녢~tz�N?+dd |i1| N_ ^p3%\6-Z v2сVvM8|z 垧Nd0s=x}j^~fWgE-0.;>]J_nMOq-b wo/V7MeNpc6;4 _: (`ڝ[Zq|[2kM`�Nqtq|�:]?yuY'ǩ9yٙ}};x d'=&-pp6"^r@?CZ˵ EVS޳Qi Ʋh,GF`۟l$!CwnNF"[kAnU7jYCm+jwY 2rakEm__KT&4:f� >C< IsŸ: f)[Kax{yVb8ۧ=Aȼ Nlj?\w3n,LQ9'\D0sDznxڙ<K&)~>+6 ?Lf-ݍo xɄK>{Yrvˋ}(e58T.Z]1&rF&`m|҃=:(d5`ec[qpt,R$fӛouyֳyo%1ȩ?.=eSU'JI��3Po?O8~#ITZ:c/ۂ8C]˒cI_+1׊i‭jZ앾>2,*6'o]<&?j^;}Q( ==wX%Nd].u1t=N 6i,´mH,%1o"9e  s6ēI>c҅}NykT#%8ht3b@q'-¶'\0bq3k 'e1n #z:‹/ϥ>Zݟ^=a'l.y*#$5/vyN=kYa/nz󉌡T8.z$5z<t:t< }$C0/'̳/y2࣏yelɯc6d2貹_&ʵpjhq; U,{yVyC2 I=[ON͸sYRL7pBju`q'2~38Y[>TĭNǤ31Q:M*$/ Wr֪U<}!+뇂))2H qҔ9&u^$@-.zDrmkZE{׍Qּ4سz}m!�+y1~Xz{oLO M>']@__ȍ7nvWd^9 k{E_^E*x,U@I\Է8_Ŕ@Mψg)w-_52 /1N.ߎoÏnxEz#6`fNhn0H(z4痖r,&S Lr>lvmf|YсN`zn1o:~r weq<{%/Du/>F4Ie/FRd| _XGØfkVAw7;G�_wäH;m<.etD&ā1v,f1켓(tp'47bC8::hzdVٻx>s3HHZQs[[Z;<}jk:?UK[':"ʌa H2ޛy<qnB "n=k>{=~Mk9|3}h$}F=ffnZ^wםOu~<ᓹ-CSYCi1m[گ>n.�\_ﺌSwGC#wrKOg)CܵɝvLrS~k8||A3}ū.8;ngjmcYeYOcV#{'L5K()y,h M9e*}UY"u:`618ś&'#ǐγΛ&0y VYehF`GãV<%RpΙkI<0$n=R :ذk7aiB@OgG}Ci98 IJ*6gB�\yc<%xBoO@P W8g?Oa�˗-O?!>R杛RWBz|c{0lAN{:9M~~*[ލY A3_}/;^85Cr\u|'r'8iL164N_`P nw\*?q 5T#c/gu+YR9X˱lz'<4LCh[_J~5 h59=GokQ@3u\qы8cS_f8%T~֑6bC 5l 5<@<={n?x|B~/01Bfv#W߱M碳V �er5w~clMȁ׳,]CGo?{?cy:4QG\+Q\GӹW1.^qj@Ӛf`Z>uΜ >( vFspY9ʀo ~)0ypwr{N-_q7#%:678uɯÇq}_2N]ZA6e.̪38eq=C?$ɮM<dnfGFяgos鍇g5-𜃟kf7^͵q2㕼ێ8n$~|}-R8/ǹ׀ eMjsh3mȾ ^rꊹטGk޽#dmL_c;^{'OͿ- fnG7ok̍~'~V^fK{ 8nNg?䁡piW,SޫXС$HA69n<4+迓_+?cf.;y{@ꅨd#wPXrkm{'~J1=o||)~Ѷ,˲I59U8]rAGzY b>nN15`)"ueBRSˁ(4/22I LFNwTFb۳^D۽#Q!b�CԚ-4q sE$ 7JQڠ}_.碔BjC>Cd.xK&zkJe:5oL_ߑ畏Gx9mڣnkczvF QǾ}=Ï ޵s5S_+\zDh4Y<aG#[׮?C?{&ǔe 'O#M,XquED/`}~A2 ^+$g�ў;[7s{mi� xR'Sϲds~x5~h/T/' XeYuL/p>Cd i7w6{jB޹vS #IҔ`h'}9sqaj!�ݎ]W\LWG(azn!t&kZk$$LиՔJEb; [(V|㶻909Ci[e~1EGl T#FvԎo}y,bZgqw^b80410,a[ _�� �IDAT x|HҔ [yce3ͱ|߻O\z{{2K|c <η'fukw?}6w^%N|ûxߺâzkr7 熽V'e~+|"}*N<|~["i宖eYG<ݛlsOkNJ_y/ 6_(-˲,s@bڵk͐-{6b|LMFIa@Il:9gͪԫ!б4&tyxN*1uUVBb3]l;0I8 NWL 〗gD(QZ?lX`i&F Uy4(̴Z(C5f%* 249ֆ={N(|#xI+ٺo?1Bp'f|r#Ϡ4|S:q146qׯ#a^+QLmO}NN~xkX}zKy6ˠq`eYO_|"/ ;($n G6۲,˲,s 48r]P ( CrJ`d0%Бz8.Qmԑ-$) r=za daq |DfӦ404ݜ,)τG%(SȹdEJ#)+s9G4SO` 9@ӈ"rCN)(&4r.e |*8TPьXQȓ}|&d"I2:1}LLom{e|Wq1,Q|a奶kTr#l_ǖKl;?g9M/cZE<;϶;>^3e=} C^#&b'Wsܷ/,˲穜#ɀD\rq*RrR\%H!0Z ShxQ/_woȁ*n tТCwUǑXNZ$BU..Rfpu W)͟lKV.䔵x姝 ^`k5A1nraʚ%Yp伕Ki!9\={i/ uS{<w2SSS?O_'m@; 6r饗P'|xwB@Eý7]juO:vzf^=sow,˲,˲,˲,˲m#a LL206Af 3*0#S3(Gb (f!Gjl$ 3<j-kC12R͆qM 3Ƹ ꀆs7%`#aZ%,`gjA0l;G O֊[)Ccb\ 0qj ьypf'IN15c I5j;|j\o?Zy\ϸf7m̶myk.\4M~o{}|0|b=s??eq'߽Z(wsM$Q ,ZeYeYeYeI0E+Es)9b{. o}R12EiˡSΗhM'WO4[JBThjA(IQǣX =1C 22ЯztP-(3c:Z@!! |R|>;:Ψr]EdTCni="{D-N=mfCd9"lL}vBmIps=ַ^iN}ܸO/9l|eL|6-uzhm7#\o2<<2Oq쉩y;5n&-˲,˲,˲,˲\4sXՉ6xAO{㰸q 7=XOxNPt{p;c`E4US8!Y\eILb;=,01 in*ʀJ".YFWciWF ?4u;vVp" #s$~ThN쩰.4C茾\!$bTPavUc οg`l|ϟ3NMo|=-w1#ko|s, #co߽{jkeM쎁*uo} YZtwkZS]]%ëKuUC gk ||@)CJOyu]ELMTIrzO(da2fF+&OZ"eYeYeYeYOA(4vP1>3,kuJ{G'lQPHG$lAigVHYĬpGͩ0<3IbipbRI<~Jgr*&i cފiTbtm 9/[¶xzA"|E=56/%}xb)G}F3;ۤTH<:Ky 2;>6W'Ub.ZjV3V~h=obÛrl^K__מr?+;\p=0'{cy̞jGK}X'\̟5^Wx':~!{𾝅_oG; E3?|ҡ͓dTJ^<ȿ?!>5iɷ6 6?MBcz1kRwp- mo˲,˲,˲,˲v Tc RB! B92U1d^>XQ.y,(tfݡ>KM< 'InVBRiKL.-3,]N:GEgЃŹ"d>yY)ƔFkVʤalhrD!M&:q2JBH 0-1x(`z,8z0:kZρi15>A-3 BrEbf&s=ukYC�F?2+Hą\ys<ﻈ? 'ns$ T(-|kP>e=Bӯk>y\s |or6|�(I }ox;fbH筫G|QXpjv.DVB::.9VjDf�!qs:ʹZsہt| y4 -˲,˲,˲,z2A4 E \({/%x,j%(hȜb/QX<GQ aqg#D>N`QNe0\SV1K~,K* a=vT P>Qy.K<1?@$$#) GQx2atl@ p1 VYww2USid͈Vmc E\<si"8x=Ծ=[aeK6;}%~$~PO ?>=x_p#?яۣW*&o{t>r+CψYlg`[oG_9u|aavI6]wpeCW|w<g|s|7& ~Txϯt[sa$u Ǟ䈳\;S8">}0W~ϼEl76 !*[=>hrr4&`eYeYeY$sCU-vL0VQt}fYD ?g"bZ$I0Ymp\A%gغs-,5/ LbQ<\uOqQVӉ?Ij ]^&r CYqBNLFItLnen!ՄI0ŘJdRҐiT=FkH̨MrC?%SBd$I995 sAչhc;TOu8ke=v:xƫq4봋ݟ`(@ H:02ca+7s%o޹bc%>=8\~(7$pۑW7~]οŝ unxGx_ݟx~ͬ{-W>r%?xy Kg|&j3'I?k ǽ\~>2ghd,/|i-o\v9|_M7\<Xt.o~ǓO,eYeYeYeYC%! )R\^+=\zitp< _SVR!#]^ԑ5c8&|@�X<TgS$QlyB0Vw.-EIFDӭ-Pr] FR,p Ƒ cLjB2ץT$LbZi#SL#�u0`nP|FpС]o=_4ݲ`]}o8EodlFuqӛ3>~?F9_`Ӭ&{~5v#7w]g8=uc%GŋQqv2rWn>v>inO,-eyF?bх[xhyjςƞӈ8Zw6:cӴFE;ydbvЯO߫yh{<-<S`YeYeYeYPW<c: V-e8BSӼh2:r(/YD:+yfTsV-Ri"R3kN/G,!MST &3j8ׁ)M sݴpPCbQ> x._έDQ/Zr"Ra(_)Jyń1f6䮇283.x!8iRN]1k]*tK4Z-6mSf.k`zQ$961zKbqoyx޹Źmm ;TJw_=u6?4B0\zR[>|/"`뾽>Z^ƃ<bN)cw|/el؝m)\R)@`w_z:DFnn=B-OӃyLହ|N]Mb|dv:+t &bf:rj1LƲ,˲,˲,˲z|L ؐqj! S5 };G|<\O\1,i2%*<8j*},ܸc#_gt @9#%%#0BSEh%W rjXj'ݍ&SLgW)Vgy>vMM0'$35L$A+eG b%%G8I906 =̡UoK[zԱSIzwl 8Vv9?~Z{,],#v:Sϲ/q]>n?TwM{8uFkhw3 OgDO~_7'`.-ӈ1ccU߫؟=?ɤڷ=a}o_j*ZeYeYeYV RfhFF '-cZR)U8P=@g)OOLD* ){t&av=2r Wy Ry&}ƣ=\X!SSma$%LS.t^CIW]&z ZqW5}RG,(Hd"d~g$lﺌ)<R@_O7t" G Q@PytUԚ!cӳy꓇SmT!TtJF9N;g)hl@@cǭ;A^TO<p>~Yʫ/b/oX[*e{?q/{LΓi׹H8"H4! V;9ǯq{h=YɎ?]+ )$ڧR簿KNe\P'7A?\拷�˲,˲,˲,zAK@ pI\hE! zEr񩌋\B?z)RHtxfhdf;T\AKe\B I";9yIq{IdV# JWJA|ʡ-pӥIr,"5Ep]{7d` drYwр(y˒yZ3Mŀ*kV,j!TJ&Mdڠ\١Sf< J߷U+B/z3<9b5Qnu ^GE<Oꁶ.Qnk {GV}\^ΫG曈:u|®Oe˖Q> WW W|{{7m2-] 9ݼo?ko-Mpjy3W߸)vL3yݥ]Le,˲,˲,˲,@J@f`B1h0]iqf2nJ !d졵AIhF18&Ms5Q25f36'IӔR8;26\周@丈,#u$y\t!4L#u0LG籸~ igtugl;0L3j $Ɨ=# vOҧ<&[)Igd-Ȳ ϑa(#!CHV5bkZϊcMLEGę5y}h 7c'ױrfNnzE_MlȞpali/_뾸{(�ŮƝg/qmـ_ @Zǽ|oo5#S=ifwzky+.u�C85ȶC; =м�?WUx篼|e2m2`s@B8eYeYeYB8r.Ӓvq.oar/ 㘞g ԡm+4XS4* QѦO) g.rxf֦ BA,:M !SA@'6 p=(T@ΡH.JQ;0qP `<a@r'u2g4&NRnύ=V!@0^;F0t;}ռ~_uy%IJ.eϴ!KR48pɧ?ͅ~a7,˲,˲,˲,募,VdZfx1=rJ{!kvdp|@h8Lgx3a^ENL'-Ieh#+Wl V.9j1 sR;g8s!%w0 e^[n@mh]9~ZAIeLWh6#DT iL5[{:I|q hmF̭&Cds#׹k{ g1>IY>_;\Q%שeYeYeYeYּGR-Ph"S%lYh9ԤAHq,CF(nalfMX)VmC2?cb4s!kj! ᧒PECj2h8ШS:>͔'\Ӭ3Qm0i8ˠcK9xFi[hIҾ^|W1U329F"4 4^Ba)!3L{G)j[ q؟g]¯~#Pbk*,˲,˲,˲,˲'\ֆL a<(Q\f(X EFK3.7?e[Fc4K2k5XFH0[X@&J"<Jyi1wE~2W-) !6 bq⑐:KYrYL-XP頧Ps6eW.ba?Fh JRާ �WIaFfUP%rznr0:w^GTK?\eYeYeYeY JR-Ɍ!_4ӐQmkCx8"Kb/5&fܲw[yq2z++W�� �IDAT;cm-#;Q19Q&6TK4tr W W⦚PXC/?Mjj!֚l]m$%(SMK֏q MFH n @D5v1 1ƴJhCjd;T(Р ƀ0 Q!a|ؔ?Yl,˲,˲,˲,˲BPьOJeMu!(eLOB0;Kd``rSM~8,8+=.,5 a"usn?#6gL &/)i$ 5a'\ZDРiܝ#Ls͢G mhjCZO0c-d% LP5e%]If 6f()gZdLH]SU*E;Dۮ`澛/ekZϒgmeYeYeYeY4Ha\I#c|F2MQ׆Ւюޜ]SvhÆ %C5xpguGLY3V`rj!F#CAK//H@ R1BM$y|*8#cB2ըW$�}dH %н! Ƒ`&i#!5C�Mdl,L_db$#M#<*`kZ?sz,˲,˲,˲,zn) yMTC" i*1ziE" ,RNʵ<8 =!. q=ͯtpFK* eC@@:ed'HR#2MXM(쩒Ccyf#%kͶ(R"ʹAƛIMXN?F(C`A*4Stk.i`4( /B&$&$JHhdZujYeYeYeYeY`IgYr`BPkfg$n)ezL3Ʀelx͂ra8.iH`* ؜乤Aw H]B!A-*v1MR1kހdQ i;UI{A=ӌ-Hv< L@@%fNmZ\ /\ ҀPq%2RMasWEIMAOzmTaW[eYeYeYe\a!*8-šO03`v7{%/Jw6`]GF4qxYJBoh$[뒗,XY1žInS(刢ݻOD8|}Rjeh&"3PŁK4,&i N"\nT'#4HHv(VEyhcH1D$< n)$Bx584F*E�L/`ceYeYeYeY??xx+?Lp$D3z>k{'l T A fe<U xm nk!YFeȍGhG\'8YDg@TX4לHL߃$D)B RL$BDX()dUC.18!IF BH 0R` SVgQlדeYeYeYeYsڇa=4gRܒG;4tx>irJhfH'$gIzDo\"p{"U g\�K8{Z.Y$TK<IG@>*4K XXG _ F7[F At dhL\ %wQ�Kц=4s8$ [*(i :A)A4O׀ƾg,˲,˲,˲,˲S矲Ȁ'V8ŕ ǻOtHVWwO&pw7 yi%TUe}@JFP)|iH.>ڀ,C(AdvĚ/̓pԑ'jFt읥*=<e'MfANB �%A ̓@)HP AYJ4E$)HdB`!$€R4%R8 Zk0Z#l?weYeYeYeYeY϶zӚ^VЇR^Z03b̢W ,rS^\h@cm֕b: 9YSwh鰡8`4Wm@TS uM;4/CN8 )i<ТVu%; )]#L+jbq\4t 3^6՘0LcH43jx>ZA(3t*ɒct{[ 0sh g8eYeYeYeYع�N(SH0JѭC^ڰ+$Wt5pV@\1'=n:kW &MMQ׎,]yLɄ@ aFe4  x h0S1bE8 T&! w9>t0a:�n`3SlLgh =^]w}2cPBi4#F*sڹBb(63ղ,˲,˲,˲,˲^*aY֨4OSCp v-&=c%V/: `$bNԊgehqPp B*Rc( 6$/-`A j_ AB֛ІlLr4n/8%碘 t+' YvR h Z3XM,!3(< (ݾ,AB5YA\BY Z,˲,˲,˲,ze@_w "`j2uA9w&tUΊ\F*.Y<*)4B8 hJ?M1'%(IH剐 >ɉr '5ĝ>ev䵡#`ρDIW&ZfXڍlT}]Uk@@*0hFd}GQyJ{H@d L`x5:ശw]ۯ:506&&$YB(4JStJG# a$|Ι3=USEC]Rj`(TF.Y%B!B!B%2qsb.˘N^9H9x:9<C6Hi<Qۤ3Y^Iv$☘b@,SRqSt?DM-?ٵ؎bk+R;407d1ʝ(T6+BT:0P~X"EU~xJj% URy, ԕ֯䮁 ޯ: AiB@.LF%!B!B&gRVJ{KF9k\HPJ\Ec( ZJޕGx̻j6^Yde8qUX D۲8AjCXsӟZ gu=DgbI)𵢤CTo;)RyO`$hSvgmYH/I5Jhjz Vc2W*@kX5F8\Yi*=SB!B!;3vq=$$26S Mx1dɧHg Q7Q:ttA�ࢰ&КHgj/O8I)L |Wq{eر=m_3cn/X&Ũ (Ƙ"xGrHR (*|^%45HU*�V*^C]B5 l!F�AVjV3U瑜OB!B!T""26cfz§s6fO9G7)/Cj'X&-ss,Fd2JwA"bi ;[F1-i-e w>Hc �tgד0'Hd OA!QFr)T&NƧ6m+UG1hR<2 0 A)RJp �*Rء"*B!گTgD_b4WB!B!@_T ?<!V!'B8lb EMIJLc&ђaHoPŢ>2X U),D0 ўGuObĠ0&Ir5lx%6ai釷L􉌭!Y=+0aB7@5ɖA#gBYaHp=MTTYF[5h+CE*զAXj(a%%UWdF[VA%>(.Ѻ~{͵[!B!B!^|Dw a%[tY\aكh!ϤCȕ eCUEXFPt"8:2LP6q|QGM Cg Qo{~RBkqQt&Vm$ԕ1cƀ `$4-qQEqX ȹsC}mQi*D)2ypl01WWz |࿾<60mT84|~RL7T V4A]C5Uvm-% tl:"H) 1-RBP&N$16)KB!B!86Kp(%aeX?d7r_iL5\+YڝAkfNfd e)1MCeDҟ@<Jӱ)�mXQޮMi[U$a�]_./)JNh$Pv>NGM96S + kMhe pPXJa`0hz%/$PUAvlck;ϨW+?FMu_q•gv*?bik:Xh3?/>1kĺ0AԀ~Jvqu�*qߺa=-\­b֙ӏa*ȰōEyۏ{kֶ?0.B!B!LMN[&Eik.*8e 6<j2:R4B5m(PrjmxAHX+3{Qm8CsH͚@"qJ0]Q5m1P"R\^ $!r52eu]+%1)EGiM]6WcaG&DCe(r!u@>.64n rº:>ɏSWW[9pZ<*ֶ0kL:(|Q~'}z3v&8ů)0[^}-�e%7<?|"%Lb:"C9�_zQ~}] \}u5PsI!B!B3lHOͻSbW;)L) xSL !϶v!Z71E4j +D Seī!_fϰJ)h1 z;Vs-1 "}Q<c1~|UQ!6AH CCVFk(JIA"u�M YW+rӚCeh|Cec^)6+P,k~|n͍e͚5̞=O8{Y3g2w>LF3g_<s?Pа'/.ً:\Wm$!6ndimT֎l9mc+sh}ѯ[�w\||SB!B!8_XbTnx 3k0(x~}}Lr~LO0�N&agגK0S.3Ν6Btesȡ5.:0#pQn"xaE{..1@)EcKu!XAy`�QE64![<ac8+BsXgu|҉s_={63gGyAgӬ֥[((Wr]۸�x=UFH2GVǨk!# }liw:gW /E@@UB!B!8 G9 кAJR,gx=_߈,Ѐ労d0-E胶NxoPH0P(v a(l|oMP?؉;L:b󰎟C!݇i>Vmx"v12W)UMGTD.AL ̘(Vؑ(c GiЃRbELe),h ڢ8Їv8nIxkv3�d;-[�& Jٛh IJɨ 株jJ|@nɭ'ۉ#?:V2$t@{l '?wC¨_T!B!B7G18$H355l48*lƏg~.<aΟPef̍ *ȕJ2a(0 Q0F$]֏|G[?5㫚uij&Nfva$L;t NϬ#ʊhd2r tɗ=ʁ&O* 5[$QWK_r|bI�.34K헁\[VhfI.u1*դAh@"}Beb__Z{ na,R>eʭW-y'>~/Y;¶ɾ|gtĩB!B!o4r`%3>D(!ಷ!wioN,EДθJer ,&` } De ]"M)>ϼꑪS6t|z ^@)E,a7Ch0m <?` L?RDoz n~KNS eS()gz<cʕ;(&ΛK驍)H{>Q gttt2qD�҃Ԥ�dboHX$OzGD:\[%<MHݓذ;oaNwsckni:7gMykʋܾe;cf\/s jB!B!^Lg4谠:y1 n#;w<\q hLb pT*F%$(%ЎR Ew{SqCk>I]&Ξӱc$ 1l(}Wmky 0~f7G 5h4l/EM<pz{L.>T=StnV;p#b1R5M,]QIP`#8ķs09Г-L44fvyHԇgu�-k[>}�m}!c0֬G֒}i3RNam-}]1k~nZ'7'lS2%[ep0njr<;X._%H溟ӽ=:. 4Hm6`&7 ܁ !B!-6APfn} 1#༚2yŮkBnᅨw}=Dg6,EswS;PV ey>41&fiYkj8ai<?䦿1ѻCQY9_Y%izZo\5 :v\f̝EuC-DISciHq+V1J-2X6q`%X뺀´,rCYd~1b) _ɔx23ӟ�|~d{[G>Ljxi.{%�\-,~t oו\Wܳw|OqǪ [5ʾuXֲy':fg<Kc[egES\lH|<μ jϱJ%wRkzпq͜w!`YU)}K}Iwwכ<b!B!BU}Cgd[.pkiՆeSԎWn-mL9z v1E[$9BMZ{PaO1''|I fɦx IS;܁0nXYp(/.YW �� �IDAT˸ cIT%p=4<Sir L9ij2r~X['7v,wCXJx/[ zYģq;R MA8�=SAz>;{iӦX˻${ѯYR}gF$`)n^֗�OU~ bj ѹ1nVy)\xe$Mb˪սcMqxX,sͿgㆍ 85w*h M$:uuA}wXGqSPe(z!(H<ICc$`\y;v v[8; `[&??(!B!twQLcjWg {"-x }Yr�0pII9cP3_5co`c23SlrOg.nٹq ͪOi <寬cq%z>8AJX4C6v"yb@w�~t~C�ugwuR 0Xp!bCO4Î=d ߶-`ieY68q<~IVU1MʱQ>0PA!N4F{ZƵ7g.8u_LsOW~t}7U�|o=Rto=w6E1v:}=^XtJf4-4_(|V>ϯ3:Ì^N "M%w;gp:byi _$Dj0H-=TB!B7*t fD8C~AwEcVS3_>&'Q:O/ˊaooXʐm~ljܾ72%&A6ITI&C=]iʑnx:6ϝc.Y L>j.%d"tlڌ.8c9#IhYʚUҲi1*uu՜p$1f̙{z"c'%UDi`:CWo/G96Bקk9&PiEb(2L3~2 N-f wxZ2[^ZF5L8ṿr |[iJ%Y~=O<["Gua@c/] ;5}!r-Ǭ yske[vh3eD Jku]OECXxj$w7CyB8#ը;_N8B4H*B!B H0pťG1F![SAOYJ}95#=8dG~l|KR=k}0dæ5}l6d,Pg^`K̊GC5)IU0'0bj?P꧌JԢ<M"6ִWٗڤiPM6[1ɧn.<B!tLB.gXJ e|'ߠɎ)8q=on#+P.<c2!\Q7Ǝ CCM�_.g]^`p8ξx&~ZCAÚ(>Kf. ^:rI$!nbܡȺng]e˖ya|eVw4nPJCE)5<1Q-B!BLN(?1ӿpث>[S 5Y.&khK˧rZʀxؗ/y؏s(,qb ƍ&e 7dCgMsc6bb_6^x% Y-&_2 L2 M4%6&I)_,n)/G! ߢ+>6abf?xIlX-ݤ4?6 M![eE a{Nf[@Jenx*Θ53WA+aC^cI!B>ih:-U = iw: B+ nL'4ŘkCeBp+C{ϦrB!BS&Zh5À'hk,gl-)'cV }=r:n A>7 _17p`cOlixeJ)l"PKzf43Cal=~/CGkДR8|7^ `[}}rTq1Բ 7]i|nJ-ki]'%{~w7wF)ܷ- 2C}RFkMI) vz+w6֫YѠ֟w>YAJfX/Uɝ׮R,߿2-pOn0Ib)j/շ_/PMd/930T b[Ƕ )ϫ|㱓4<FZM !B!?RDCBmGjIZTrvUV,": $? <s~@2qSj4{7ln_-Yj3˗0Mrl P.0 t6vԩl[e۸e뢵Pj$aH߈XL 1 [oݖGJ&4u<sOٓ{pe°j Ja1-4U5dGPwVX*SAA3 MU }C+ {oiW�#Bq%|1;+˔7bᄳbkY{.5uXmrf$'!meum{!B!h֔Jel{WUC\y3ww~<ٰc,d2i;λWr@6yӬ4Ȥ5{}|^*Uc<ɷA]0gG1}(No tKɵ%ۗ!({xwdiL14 EBM"Ke d`svwv e(Jhkxdž-;W)2xdMcOsc?CM}0Y5/`ʤqYF0\ulxMd3ĒU$RU|or{ SA!,ɓGФ r>n97Bl|Փˤ7<]70r{yC@tnss+kϝ_=ϑn&1E.wў. 4D\.G2P)E.#%B!B!vRĢ(j ~εO gLovažuda)Gt^*1s92^ ߼Դrw5lv,ˢ-lH9D\O/=t$YUye4+p 6'hBH>]$?+oTgݢaaivHK^%,MDhPS1Lz,[1sZu &͚Ϭx~*V!aLx\qodӖNjk8 JXk&eT懆cر(aXYn턄d61kp5  )ŏڀ qWj^S>s+hl:o;8B{elۀ%.bDlBL)1r_nױ/at!R.D TB!Ba9C=X߳o>[SQʰoYny|哇W'{Zeo;FR UZ�mG-mI_Weu6hnf~17Vw?IJ:)lxa=/ܻPM!VcmnNӾj-ʥkڧ1۶ftQ(eXӱI$x%gFxvbۻYpL?lx/gT۶>}֦,ӹFk(拘K;Tr㖞bTTP?Xh ǝw%+X;>x 駹kM׳׫lìwi-}cq{ϣ1"pMfpz:!83>~ . z{f_iadJ<ɄB!B!hٮio-!笂*h|?{>NJj. [~Eƻ(\`k$&LhS_ocA� &Eog)̠fX:Ez0+YC4x>mbFMRveI>ɡ cl>9gYR \ɓ0Gcc5kVqȂle9=pƪҜ} 5J<̋l܎VGp*UF|FkB I_M*SA"g ¹/,߈ mx{ ȍ?۶QEc8]S�A5YטUus wU&ѶoGX[vE)}/,ZO>yΊED !B!bT( f=fUD& w~rhwmW5&eĹB: ϮLŒ0uTT.h^ი^.`-NHTHMmb7C[?Db%Ӟ!H4No"n wjMM5Tmu5(`xɳeJ VΦ )}PVBŏ>GwGm] D՚R(`!s6u.ǭ.,bDZ1M {Xg=!<�s=wR.*U!B!U?Sg.0Lk   ĢWa(\߃/P()KXEì47PW((G!b33@>'V\LSa-t�C)Mgj':I*A"UEa@ ѡmSkZ9#x%9t6gV^;N>_^{f>ӻC}{%c)@"u]<ۮmx)ba1{l~׌B21v?R;쟹[9�xGHy�2 !B!1 EAϬ`yxVGM&מ_w~ul'2}(1tc�ؘE*NU2MH"jLi7,"fS)@YM{[mFJňDtvi8CuhY1c!4kmN+!?ՁnP,,ʨL*5JUd*Ŵqၾv8bHզrq?r)ϭ݉iB!B!Bʻf/Wm]7FM z*^_3fZ3[ĩqs8"@{!U.S30P*04 D2!Z]348H]}h<alhP,3{T|Sw==~&R jj@Y,[2tb&aw: L0 00 v*e0f\-SSD(lװ$C4-}7R)튅B!Bƹn*}@(6-kȋ`:FP?q5xAˢ!: PضA(CD’PF%2LS)L_*T zǸFUqB,Nf!S0zfLsϠTtYR O="ܺxOBckwn}yk R}C)jkkK>==ԧRevsI#DB!B!=[q)'e=iC. ŀsް#?'?'(Dlm1 &a (.B$D6*-4YpTr٧uSG3X,Bhà'j1ȃ>#I 3li?|!Sד套VQ Ý^`8DJ)E]} !1ud6oi-F瑜OB!B!΢3yкrU֚WнcH9A2acKU-QNshQ% *MDoXJO$P0$D.a`#b}wPrl:Q,`M6~*NweÐ?/⸓ԓ&;S*Gyyk{aR_D&~w}Ns.LB!B!-jUcIn|SO/!ˡu+tqY8cyІ8r gJJ%4%RPF+E6WJ2Tujp siM \bqSKM} IvlB|cв/: 5Yl1l}yT%^XzNW}ߊR(pl˒KمB!B!sr;Nd 8N[ٴ?իwT !B!Bj*Vy5=3U ۲PJz !B!B_R*Fȩ$B!B!o�B!B!Rr]B!B!B?0fA!B!B!z֙fA!B!B!z*34A!B!B!N&B!B!B aB!B!B SB!B!b/H*B!B!{AT!B!B! ֛=�!FK&啕+d2J%Jr0 !B!B}4o<V\9UJňFDQR$#LA=#�RJ /aFhll0PJai-B!B!~CCCTWJ&0$ Ñۙlޞzz{6u*Gq8Z:.TfiiY… ²,,rj+Fp !B!BuXE;vT֧3fdx1sUĮ4*#M3gJoB!B!(m0`7B1\l]eD# 5k6`.Se*ESSCB!B!dka8MMMtvvvLR*ҔRA@$B!B!lzvt4ٶ(vM S[^8#L !B!Bz.C)& .'axkS0 qgqc0_sDŽ,}<WΛ= #{Ct53Y~ӑsqs'ַǃK|!\4kⲙsR1!B!Wn[=.7|S ˶ `qٲe 777mJ =S7\OƻX6ag2]~^O]ˊWpW7Ϩwp|{ߒK^` 9_zUoTbՏxǹq !B!( `eד{; U8pn*a2---iMy翋L&3إ^ʵ\C,ݫu JvA@\~f/O"ا~ZcY.u~'/Io/|Mu_FVc{=?_x>U\sENi~SzEe8�8`㣗|\PV/U Gfn?ɏqێJ}3ܶIzHT˹/NhEOE/|opBrǫN_w798^%0"XiƱ8:.lQ='NsB!BQp۲ou)3gR ˲w2s/|KYo+}QΝI8i2(*U_RO}4@ Sۼ�� �IDATXf 0VëY-Tu +W" CR5,<$U]ó> C:͛'>IGe}/'0y<tvvo}Tu r5qp‰\x#?^.u]ДEܲlxU9\(9fIwI$xjF]>LS/<Qx`Sgr]ixwս_=C.ұ=|gsȯҩ\{|\qW!z4EZDZw^{>;(8CcB!B,H 8$|܇,Ch;hKO?_^.3gΜ].|P|gʇ>!͛~CnFN8L:n>^gW5 r<toٸa#{�\xx}|;\}wݍ{kz'`2XȔ Si¶M`cjQ@|;)n]\Զ :k=ysw*d˟Wa B>;qg>͛_G9x)IV"7BQ:㏺<nۑ0&Wn];N=˭Fմ}GQ^ItRHBB@(қ;"JQ(6"EҋJ*B]*)�;33ss%.N2{wwG̮κr-kCc�B[OSuؿn uϿkA= ^A�׼ϳ=稸BO͜ILƛ-a,(F:^M酃ssB"^H-غg4fT2&痦$\zwlۚ?e S &ީ_5<<o\:;&wC'3SrrYnSxm>N'slNxa\�3aU\6kSΫ< ϙcl'ޟaܼ9Ƃ{u1!B!z> 3/hhx6bh%ک황??Cw}7xpDzclLv>[#n|5CBrKLL"""{﹇I&*NVZ�+Znͪ+QU&Mxٰa-Z0yzP$F|%K{n<<<_6lM6С}{,(wy]/]<P%n;~_ǶӣqKvmJ> GIBi;}$ӌۢL941$rdkGfgzr4(¢?d<|c{!gYӞ?<A1/o!e^E~e p3 ۓ{/иXC=}qh52-4sztyrf=Y%~Mpv9|eDװ׍@CH1bͼ]m]ujs+9ޘZqYiHOW, 9vV1ulpj[ ܞRGS{9`ϥӤ";QI\ -grFw1$jcT9^P;6r�׷W1ѝ*i>>__ʲo|tr*dDu)vc6/OeT 1owGr{Yi8Ө,ssfGڰ: =ƒrW|YwmѢgޖ85u'>Z6% zeL!B!c��\?ϴfۧ(f�3jr5w^vO[HZ .wa3s#we?;x'UW^ڵk<ٜ{ŗ^#v*<+V0~x{|sttd<�,dw~J" D1ePӶދ'{Ѹ NYw^<B1SE牗Db7'wmZ; v< Ssup5:WKelt~n5Pbx[uLhֱ^?9gtGWAq5o̞#2WMi{]f<:ꍤpEAZns[]8~�M:�#+gÝzN7P=u7\T�Տ '32frtiv3ݺ&},0g3rll٪/ໞkd-w_64K]ߐ&Ǿ9Ӕvґq36yfxj)Nl0(vճ<8|K֛FNɣ=wmH|t~? 1&%wt#x6!mQƄB!BfRII|R,(MkAal7x0׮8*ԙ|JvmK$9m0`ɒ|wZUWO?|R4lAk>)))ti3Ro=%%%}ϯ xmd|}} L_`` �,V ڞb6n�U#%Zy_Xt ʹ8A `_72$`!`aG/0 =ށY/Mшڈ[osj¨u t1XvoNY\ٌx͘P'[:ƴi26acy߉[+߁$G%6aI%_̉ MڟoJ#N:0&v-a+neJI#jv[ -=s(j\P"H>jo=sR5…\0kꒉ86_C ' h>X4pŽ?چ$=>Ճ0RPpB!Bf�hϛM#a\9F{=&vq?~TT̽vf˖r5Z<=s}SO>ɰ5nš_K.8;;uVFmi#!uOOOl`断iQFgs#矙Wixx?-[g6mZວ $8׭#99lI^#0f*7Gd4�BI ۫8wpQ89%Ib` gwhao]=1j 8aOeS;ਜMGG ((+:tjfx{ƛ ?}W|gˡy5Q$7S?s-ys7|o\1&/~դP\Ң .88ݠ((Z ;8 yO`^AҎ=_q+ E6?cJaU TXfgNIUHTO;fjGtRǨv]aqNa.gC];YжFm1!B!ʆ4P݌ӑy}mvZ՚fۧ(CS9{)TX{?$Ϟ=Kηޤ ݺuChFpPC9~jٳ [�ۇ ˖-;%Ngfѩs …S�k׮o>4oVZb/` /꫓2ÿui͕cؕB}ء~ժU}X JWEpHjϝW=˔4A:�o $8CN 8L㭾Ἷrޝo/ c?^zM&Ps͠iie`jG 3^O»mg 1`j9z)Ma8ः^YKɚXvl їߠ/ iISf5=}37d0u +.#-l9 5bqk7@hL;�hK@</{QI\؊;%}g\:C٨:@tqKatzf"> 2($Gl<|\@,ם %0|n:0jtvMWmQƄB!|"Fz5AS<yLAԌ<]w/~kܦtd2ȑt=7Yf1q$t: İaO0i$bccYx1II4mڔ9gc4 Ǽ>u*XVڵk'3g䙆 /1u>xϘAHH&GgnopfϞ{bܸϘ133f>9ʬfsNBBBOpuU9xCcckam!Q0*SkRk(:kԇ8k~jFPtx)Rеz#LfN�!4oaQ2BܥlHn iCB8[#m gG^WǛa v%&b.R>.85@wJg1RQ\7ץWOdwi65mcgNMee3a_)>ز-.bDޣ%aMM(XjZwb9R-=6ǔ`ΣmV?8v7וTg1Kk/BZ nXfI?-Djؒ׳ac7낆G{&$A:ŗwYW׻ 5sI̵ Roy`"8t ZW V\eL!B!D.�dP--EL-αl)W�zW`XT?3NS&c0j^Fȑ#}uC9c~IIId ~ )) łtsCUUbc?nXƍ9뚼3b$&&1nsL 'g8[Vɓ_cҤmtw:M}_g1m:.z3:\=s|? gަ߲%AmC(XII9!z% W.\-w] jб6{n)NK{0p$  DQs< y<Eke͒})Y32ΛVgq,?[L>7v.<91�0z}a~w$�th'kS r^K}=T/MUv3~]<~vq ]ȽE�؈[5R--+s(ljBy/M/elp?7q;Mӷd. 0,s_ 8~>T\<3˻<UDŽg<oK_Oh?FU[˄$@ţtV*?972&B!"/lMbi6 ߱'K_NÒؘzV^wߝmmhٸ6>é^ [ Z2&/xsYǯrhK=t#ڶ twgrORHOeL!B!ĭDk4M#>>[ҧw/RL-!!JSm=kSE,en\<95'װ/b/`٧* a'dMjJˎ|D]ƄB!BZٜtf~cBh$555G ƵbCGK7]^Yʲc;f�|Dwbz{(ڛyu/ Us$'2&B!QӿŚaXqp(x0U^g4h�___YP!B!HNNꕈ/hMӸv:ϟ]۶>/3SEi`29s5|||d0U!B!ȘZ3SV+11\(p2**4MϿKݺu3׵AU!B!B-c|4S3N1|2Mi|TQYV| `ƍ닛:UUQUU3-B!B!ʿx4Mjp02XUӬ$$&CtL `6CL(z*##qF wYL B!B!ӧK,>MӲMSɄ7>>89:j.pHSEqsi3PeBB!B!DbXPDHH%Hh;+Vծ򘿨4-B!B!BE !B!B!D%'B!B!BaLB!B!B;`B!B!BA߱#: BjPAحNB!B!f?} DFێ9*e!B!BQYN&[!,2wSjGGEUjW&rDE"U!?ir+K>+K>eQھ="?$TrDE"U!?ir+K>+K>e+2*D*I/rDE"U!?ir+K>+K>e B䧒T2!JT$R^*׺䳲CQv*K**Қ.( UIΕH !D'muQUuegeɇTv##kcdiJ+i�POwpwb",-S+{s%*)BQI[]uTk]YYY!(;ݸ9j{ߓ&5i[:C\qsӓ± yLr\E RNuP\wxe5[TȢh*/'eIΕH !D'muQUuegeɇTv l^kLte>#.?A9Z<?ŞR~6ŲHQ0v HzVFb MΕH !D'muQUuegeɇTv##>Ցuku&կP;7l>vצ]wugy틫, b3 J`oݏڰnR/#~X썦$e{@Xe"+K$;&!VG*%V4N[('!DPx*8j []yGP %BSŪh|-f)@(gAL]|v OgD<D蔷KLCem}v ^ /yop㛩KBX팣d[u|ϭT&Sѵ$.qX~ryۉ� 5m͛}.!9UFk_=.`Y% VIQ1U( s[bؿ'.~_RLLQgXMEb '۳MWbHg{^e)!�nlR{N_>YB)]/ڕ+m4w%㡍Xj`Dq7E|z<M<xӾ&\m!煉x<!ӿ_ea9:v@ڵ$W=jIiꠀ:|M/aI@}<N-ѹ9IXCoTwt^&~_ZڕF/Ƚ$y}xEEes*ǎmq\v?8v;4)X1j%[q§FA~苑RsU}tq.Ο(Z.a=Z?%޸ٝDh6o(msԔ=oħDY*4UIQ1H|?-`;8r9 g44'쀯4T~d _zfՕMr)RwN�� �IDATV>5MaG_qxҿ!ܸ `UNjVO'1&9Pv"d,T–;hU:&W\.\ݜϲu;9FC{T:қ4H/Feyl4ZZI;+ _5pd+#5pWRQHZ5d))(lbO`w?KrΓ넮tH"y$#tڏ鱩h"Nh V=q;Sa< tVL(1�Gw]n/A/-[HZ}8>4s$_K-~U45 qۛ;iM$6._ۣ'Sg}2ďihhwE9W^Z2B3 C$839ιlWœoR#>VyϜDʚF̾_gmQ3qIpܽUci5•mrDCwa(r^'!DdW`pq{$gs WPU6e-ŸۓOMSt(իdab #^ye|>>z'R5pRHԒҎQlZ F5KnuijMjqVC~eCawg h 4 }%gi%##�=dR) zz XUŨ7`c;55E"~QML<Hݽ䭫1_InjS{,<J�R/[7xcXu7GΞAiz(ϢCo\S{;ĺikd?K؄@Z ^XǓW̜ jPa_om#/#{W_rz/=yAY=y/KwG?cF+G`y7j\l|:l=ɥ$4/~dCZ8Kc̀txlO*mt4MsO.-Y:Vl p hA#xw 8k ~˼6s"ڂcp>8;�(}1od@56ǘ_d븢R)*FnL5�̸p wN'<Kg򈿰eM_c4v*\zڴmk۲=N@t|Lk {:ș$oC\\9,X( 8xѰ$>Tcyʑu6L![$q|tykm=D% lhk+"l*A^cߞ2|u"߮|j8ߠizF4õvcgvTK*<3jJ ziZb&>ڍ5EF�F v\tĝZХk4Cf|'Fq%r&~8yٙY^ed*Bґ= != uTO^e�nDj!ʓ{STF<#_zaNUr*~_Qx0rkuMe}lY+w a; ȇ5);Fs=:FGN$b@QQӧZp<&7W\CT!ֹ4Gר V}0=XwKbjWP|ǀ@U=c9!39jΐYPṛ+L, pEQٙ7Qu֫3hƊ{ydl\Un_sg_}>E&O_tXVš}¸э0Ys/Y[x}@2'Mi2hU>\3XKu0Rh$qWґO`+Vf޴7q]Z8px[2'L:k<=H}H¸OxS^qPeSZ3s9(|YӢA+ FF׹>;{qFevR/n3*a:KW/9Ay^ē\;<`4:UaBqͶ:.|,Cdώɚw[i>D(}q! y8{*iiV"DZ h#ABVE#2,wfpn�ԪCn�j<3V-PSÆMnNˮT$48UUq67bnꛍ9f B1a$/?gWZ(A;s]0f<(aJW6Pv>vT>G(&4Tn{V呧FR/؇?Wdܴ7Y6&E_лG?Z5ÒC +ˮ5S[ư:<>vg6Qg%68geߍpԭɱsǹ5̓:KH#'2x,NfRK♤a/UHXq�-=pHHGU@UNO3ƚv6Uy\*fN q6/1? S`6ogH7 dyw>+J85e`MkYw/(q2<{G�I*9,x^X++V9 Gشh.!CnL'>耆5UʺmW,<wx8�4|jζ*P=ַ+>HHΔ8n?E*\؜㨅.kV"4bt~pvY37CKicϦq hA7g&B.4hւ:(ԡA>_7 hv#!DWp[m9^ 6vО)g[l>D(}$qa۝qG4{'9ʐ}<_,}ޓ.jLR T0b&(Pu1`  +6u8v?YSM$\6j|d&5]P}0Z4m# d[4zmY(]G?$ɢ…+6"WB+_V_,uLyܽaŁ1~ ah7Bٱs7{vp(F@Q1`KX3#Yt^qt6Ѯ>Dg(�6Fx:{jV]<'Qp/i؎~('aG�7CIVa�XRYI_5#w o`r!0Yf+r=95͹H6)Dl[̗sUq Zd,Lj +o+9DXZi2dq 1j7q&C5k\$fgv)JqQ 2@Rh6LFKTh>\FS+׌|ln[h ],Qciw6B o.5ԓ2#M|1spӟn)8վz0<0nld0UZKm#>IхomQ2{_}l_Gl?kq#) q1ھ,&C{GΠܜd2ע�:XqT<UKHوљu|=b(  ծ|d>s Fr7,<l4 V2S Ƶʏa(Xi}ڰ=&?GpzXI[ Ωf5:[ҳ# dƼt8۴ůF-dzkfAcz :vӘQFV3ja۩m jɇ?^ICCpa,1#&UHJL&lct^)nߌ50V`chgT>m8svj3_uoH9q ^(b>G̠yd턧"k?ίV4Bo-|S<thϘ%q\E^5c`AE_{ vpO') MGͰFقL8\ ؿ,sV6a?6qp<!Vf ~s=Ԝtt5_ug{so*6FUGz8cGJC7kZ'+ZƬY|lglE90!([ `s$hfj%dmo!ʇ%ݏ.=1!5F,(6n'~ot$(N#))|ޫڋ~#f57ߑ]<uP}Eo@K1A5G6Ôj!(M54 % f~Ly(߈֨n0W߳cH>y];0/tl^Vzacܯ5Sy&19lWEQI0[8yw˃a۵M|LĬ 1bLˮvi7) $L" `uOclN @"S?aݵ±8ߖNIR$f͞D'!iǹ,XLjrYdP`Ee`'>תOzӣgM98OM|'|u@׼tV1dؤb߈ >uK4-K>WN~֭ ҭukVkD<Grǁ~|sD"!0KU븢)Fm㢕5 W c8eC=t|ߖoZ[Ѿc泤H7ɓRv>Ԛn9~/5n !DlNޕmMySmeId\خ~t1S!z4\5cI~UU`4kW/^ C'� .n8AQPU95gOlʶp眫nC%Nʨ paФW`(^<;Ƀ�_J?zGR +*ѫv#N{U8pvx/ge;$~kuG="n- M) tOv4}b+H.Fw5}0EꆷIݐv]zgZlx\;L"xc>{vjhUߵ.X C,ov \5K'WhŐ;ܙ-fk]ga8^<%:*n-/~Ƈ<gK4.h٫=~n-x ,{jHĶEݫ 6IػVF`?˘Ba 1g\ nzv CMǕwGT>%}7ϯ7/FY\fql0a.6=u7 5_}8~R,l֫|L5X͡c1`-BM!Z1k4<S@\uID͸a{g8g7T+8֧a`]g|\eƝ$:̓O�C{|B}.Z5x;j uݕg>afU?ѝ$\Ӫ z]]5#FMQX ߇ qQ<w#mp;H_h#K}jKrZ _]O}G`gS:}T¢b4Τ^$ZT._:^#[  Ū8p tz'yn|XY3D՛=)q.D&&Di+͵5״hxwy|9'Hf-ui==kJ˧,>Mqv ϘHo&ECÅLcl,7<BBQI{ZfRPs )sn<YaiܗsփӘ8V|Ft.^ 5y2&sjFuM'dX/}jtxl3 -lOl,{f檏 \R/lb9'Z<SKTdP~Z/xn=٪Wy-9[`u3R,-]@Ku6L!nV[14\gpNVqRЊlj�mlI~__ms_klW?~{ۓOMo_N9Ѡ'NύONAhOiAOOyuG(A]$ysg&j| |OsDpq1獃 Unṏ Oi '49)4-wf)Jh# z#a_pJ/NmC2w5*UPߟF=͗ζ+ 0^;+Vw+�4k8cRŅP5 NgƊq).%o|#@zBc[iӾS۶o;,t:Ν9E@wTUҗ=9{KHmK~9gKS�Z&^{=;<K'b<N˞۳~I=#Y^ $ˌܜ͸&Y>u\Q)]^3dY?ί>fVf.;&U#.̳ɫRl=9/LBTuEms*@=0{+\?2/_KmO=gS BffT1)%XP9Z,@<:dT.V98UEwWX@`�X�+:,X1H,;OV0'ᅠU!EGy,e14Dzg\%T|$X h̨\8`P&S<2qAWCnYb q5q-T>}#ͫÝ3?ޮ.yS0qAk.✫gW<9g䵽_a.t>ž:qB_6#g@jǷ}Lm+|΄iݧB_䯤źf,ֲjAOs7;*h`Ag&,2yOAnGO0`YW_u}"_s!D;F#͒n꒳=jc̀xgkSXpǒ t�{^ *PKʑM,5ybP.*ܹUZy/)ֳmC+WyoE)׺ "%CQv*J+rq%dd2L*ps  {/ fKsY?3X(75C2IQI Xuk]rPY!(;08(t'UEQTUEӡ*!323UTѸ[5RUEKB後ȏB! aR^uiK>CQv*HZptss((5SldP~rDE"U!?ir+K>+K>eXJRje"JT$R^*׺䳲CQv*K2~-M6_w] *{s%*)BQI[]uTk]YYY!(;ݸ*tᖦEie"JT$R^*׺䳲CQv*K1VILL$âڴ~mws-ZNH!B!BT5NGU^z nuB!B!D%w:B!B!BQ`B!B!BASB!B!2*B e'H.Xɼ$)y,YdX)|俬Xc9l> QW} g|]XSʛ{GGEɿ $�1zK\RIE JԡT֨)c$.–cX~|OB)X2Ųo,v<5Ciu"$ϋ%ruêK\/z/2\Z3KvEy&Q6}*QAϯiOZ*[D=�(:n\,]�� �IDATvͯKIKzMs>Ҩ9 maV2{{x@HC?n ň:?%va\u/&!nb_e>.ch+!t55Kg3oz^G{Q㽌-<arKaӤ1&#[ [u御q{#%^X1~@Xa05DWzl^8Vox4 xlB0b`C\ [\e|Um5}nL1a8wfMFx{ԛy oHJ<;nw}̏SZdo2oE](Rk$f}É:OCwz^`|K[*W7O<+<̽t{ˣ|<hм#=⦅^ErS* yn=2b`D)isZ3ζkVIXTWVmW^lCK^;Di*NLrҷ./,}386dp_=ʍhmtM+RSx$ZjN{%LM>ʜ/GI|1=$q^h]UFX`Dqkƞ&x62mt6wqhPMGţĥBy[Jh7͇?&_0˛vf _աP?ht!9/;JBd TĔ ]fM 5ޣI\ /0't35KGظkf<Jsx$8?hO?ȼ#M=j\8#Ѡ<fۡ3snˌ"xgCcX?gSf4 'ٰh.s VHOZMl{+B!Sx+/%(|U[=LOͲ[ξ�Z#7D W}qys귴Y Ju@"|ÔoӒHԥcm)X/~O4ŵa?GPYi1$t&ϝj"Plג孁}VTmx/ߋ&QNCQ6tw302Z1~Mvlג8|2/|zNM'f;+t{oGCRElկCφC7DŽXXOu7(^`Wlu\ߵCXsצ~ne [ؗ&d5w3N|x#'F||q1d&.̨`vN ~ǹ<32f~,3]1,o;,qptDHQX]c{/1}{C{71D5{bl ҥw* \yQvgfʔE1+2؂PV89j@@Ack"�FmݍPS wpy[M3Vaљu(!(sW|*UAUV^]W4⌁>_keOy&(N3\񫈭5Sg;g:s: ZX&%bD1$o7ߵsOuleKyk^5.-eDkKKϹ3Ye^ݗb@Yչ>R]$bdF,=T5Hmc5M&u-d߹ ~bA?ASN~MFĤQwHnc˿eRjJD=W߂e!KZLLiΧ2c>΢ɞa/RTY�Rfh;܌@R›݆3//F͍NEץj{%gp(,.}AVjoEzGfmf8ҸI0e\)7 >'5ߢ-.ȰMYf +=2XT7gx~_$3<g6x>T:f:贏 ej)_o^-O<Mv˵蚏ogCHKlCovhB髷yQ<`S>z2Ķޔ;S>;b 6nTs1}]KkҶ/OHKV?U'&vW2-p5W1vuVmq|dJNZ_o7PāR[;;OalXRSК#C(2g" mݤ4mͻz*[Vc�*o]:$b;/YoȈ  JXCiI^͜?3r1a?.`qoYI%weX gf=?CYn2Yb# 9eȆl_c"mdDl(Sx^Lyf w/a ܶ._AbFyJγkrYP!6) Z[-ŃBNdh3nf=LIJmO%ef^K]>EZ%AJr=97!ܺ cC2r;'ZD*T$X6vXIEg1ɗu]!|Ĥx+sDNٻ:b6Rw(".s%^we7ԩU7pC2W©2#JGݡ Wok;*A'H2*COgCNme!<laQRF>h/:~] }P')i?|1ףjoEz u &j~FRٸ*-P�O~ǡ]WXJ^cMYz.d|KdB/{TaYt+k8EmBYNP&EN&ƞ+?MT˶2 ;"JN-sU/7 Wv(Woy3>sAc?}1}24kYD((.ܶ5KPA_/&4|Mr! V囮ymM3?ڽD}l>#+@~#P=Wi_dbaS; ,Bj2*酽M9I aʬ1\7ݚVW\)]q45|^S\e)څ 6bɦ/_I9Jan =ݤJewȜic0}dHKº9aY+֞糨\v򜱨lG]ggdraV>Ix2BGjӸ 68%ħtf(Wnя.)34qn*xxog,{cZ1u}ϞCϦoܒm[R%:,kwGPnNvDTphJX>vW͠ 7y?%]|;]UL뛝F̞t5{;2aeNԨ5[Ʌs8|1N5Sst1ߞ0vCQR,zK)?_rg*Ai}m6SޭNYaҶdT|2a)_FsQu5׸t0!^NKcw̱2_r0qvKj7W3|TRy Ĕ/O &NVdp##)D̩P$O 5L+xg&k3�,Q?]LB@$Afb9BB"A=!=+b= ʤj/Eݯ  gF)8]YMgԏn=|m0Z$x\v}vNdI`)8qg_ϫWI2JW 'cb,U5V) yv3O_'GN)li o tDŽROXyGV!ȱXԢtoЭ\E:<_k;:Ȯ~?"mBtKaڤ ~8r:st<5f]kֈ涵̾Iμ>7)U1GheV.Pq_>uֹ:nes %f _'S > iID@HU:\N~JS;3uLU+Q*9&B,`YƵBL,_>Xٹ4*`p#3)f�~6u(ҹ+FnIjL`ӓ[X5k!-UOuGƌ )mRzuLkW)bd%0 kG0'Ϳ0W%7.a)]LL_x3#yflѮg[R,Tp"6M*Nh|qtRưNn?_~bj585QJBMԙ;R#.r'ݔ5 |fD^n4% /q?IM]pϒQRЄ?g3diʎXW5so7<U;y,{|Ǡj.뉧~sg,x]0=fWY#2nhO@iRYړySRR$y$b ScYw7F$ZUТ'29Sreyl7Jxɘb�ut2`=ddGnEvmiTP$ݡ~ZU!{Jc"ڦr6%OZK<eEL,^ؒ]uqڶ>; =mWfaQ8|?%kdohؽ%a;XU=/pWԴzF6 L@bclJ ,%'SRGZmBYN1 _&*f˷s;4|]:kttuxq\o #j;]]՛Tyu@/k]jJ ZK QuaER2 ]k_}GjCsK92|ߍB&Onoq0 .FT8jAêo1<>?ަOk3 ]#+A@LE d"JqT$6^ӳ|jՠ[ ȏftrܧp\Jacg^W#P?ñmI=e)Etc}gvȜPd?*vVx{#);h; |%\?;O=O1B`U㍏"^#Ƽ\DlfvToPG7DTߕ ;I19AtRFJe iEBM_͛'JARQdTͺULi^5G@,ǣ=+g_`ۍL7:3{JJ*oz({U!kN[=PwOxY*Tf+'; "$bPf8; WJpR.X3:qErF60&a<'fd͋�FtƏ;1w665ʱ(o ',Ii|:jz`me"nΧ°&֝a4ӋfQ"SJExo.l.ʳ4k,1l_qzR._mc~r/2S8:0}7?!kXNW yҌ&VQt3}{\xFe*(\ۋ BEHGދTGZl"-M>(qka#nI5Ӭ[k=FndL6.E臾)[`; CODzuB/R!Am8xhrŢ0]m[�=GCGVu ,J&b�$Ƨj5.Vz?fBfrȟGAf EBHyoZ"8QòT +é= dIo0uLԕ6MҨY/jE:J5hVIJ3<SBƣOp/9V O\txz 5tqÆ4lؐm&pRO1jOLƠi߱ʳs)>ϯլm*H�x$8!>&QWa3sugk# p5HK1144}Щ"ʑ*'"fjRf x\Dj^D"1"d(`GٲxgyljSTK5r4+GZVy.FYo2coqw%JL}h]˂߱FJZaY\Vy. ֥\y,txҡojzYև%q҆iOlTlaYwH+g[dg^q qxUsѢgXםƖ͛q>K,xk涧fT\9Wɋ|tad!_ͪ_Pwiׇ_#}E_P_7HR^<Wg}Tsl(fuW'fչXrqۯaa)'VX3Ma5Qu&YoN+rkYڻ3^%:ڤH:͒}v޶UvߴS>c?ѡlˀԵޟ` mnk7Sn6/y}'3 GmOd삏=D^c=fe[H̑gVfPL5p:_c[~aHrrd413Lqlx@l ds* !ʾ>g w5R/}r,###}v]lk5Wy~e?הh8j:#{!:ʪDvcLܚ@ _L%?5ĚAYӻif,RMѷ_XQ9#K!$yu((?MrAdY~\ySWF,9o@ 0DΕP=exޝaeS u+R8MgBLJUMh-J0tm>g6Wd'46`hFұ+fL@II~˗RIyûu�ߡq8R+.dzml&]%Z+.6/7yGDf}1Ɨ&>=1vkiOg)@.[i\_BС\}r9G6{>J5/A*a /ڊctV{LUq\*OtYy:u.316 Yv[]W%fARʰ'"1,dǓ?ȩs`fLȔVIuhۼ+Gf_ -~]JDz˽ a-5C;@9?-t5g=eX3JT܏A! nuȆ-q94nRLa1NTq,$zϸ¸$D=FoyjP<m (lBڹXuNSlOs9\J ;yfِA~[&L?ٺGEG̋Ë mzö('(}mGqnQ.hm'}mT.Z6|PS_:4w9<Vf|lZ˝n=d5&u ޠ.2jR.4c?C7Zt(ΥKɂL\Ve0iz=Q~ >*&LՄ*R`\REO.lI5 J$!ҿ-,G˯~8Mpb~KهWz=IS z(W\sR{\ ~ lx|ؘf;UyOP,6N[p Y^;p'VIi{Gs%V)ٽhr�#l}d " X̪0i0#-(5or[.bL؞ Rk|̡n75Fl Jdw ʓ.fȵ**|J>N/rEswU sݪ4}?+'s v&^lɌAݩbV>j pl2/tekh2\H^�� �IDATS2WJ0wt. ەuIjI)�OI`Rܻ"4q6+d@dLI�8g/ J7 bZԘY%xdmƭ_Eō}pw(�&}L0 _.kO DZDZ%ʓݘU,s/fY++RSD*̸ݴs`OEuK 1Zt:~6,<iTlY_PI占,X v:r# -.ӆҧm3m__Y}X:~N/dLଁ־R"gt5qɺL^%732cH>+of:/a_ώ1?1}OYetۿ)wj{ Թ8^GPvV<>2TiĄfDi <t&>TJytyTv-[\o `PD{󴶓SdwͶP2�Ѫ.qn|$muTn#`nbEE&ѷ#Pzf?0߲hUc\玡kVMDiii:Ģ`9a&Se}+3AIr %PsYA>-Zޙzo}?ߎPhM i*;W\i ;"6ϥ,/r{ {~N 2ŠQyZ5Em\vyfjDNL>3| y&DêfX1{Rض7Jcq!-C9ɾJ\=1UsoYuޛ_S#tZ'!;{8 3w*?Fubfl]B Q'fxLͷw/LHC<SJ *EHFHMJ9sRNL˙[։%mͫ qkKy҉N Q</eoQ}EZLHYRmH}-3ơf*7`vJ�Ԏ BmYaV:Γ,L 7];ŌFzYIJ6_Y v>qGQyۑrƦ\ 35'()jv꾍 Gv |\sD궺n�T*TB睩 aHm9㔔ҁZp%v{\-EH3H|t]L(#<Z]gC@@@@@@CH}4*5)S#6R~^}QBP<DݍˬBTnt+yI*GV-c`&St@La2U@@@@@@@@@@@@@@@@@@@@T JϫXŒs^ҽ(}@fۅ8:+(nxPyZ6G" dUϹg%+=@.e 'VLaM?ʺur/M -2 'y, ˺֣U u ~[32#x._.žNU)4:{.D0TGN]ȴA>&!ֆ.d0* NyS6?'l2?le߱aΆ7tUr"먠ou.dD"7Xv u2ar#^)BIѥ)siҀEcT$N<;ɷ!8$43r{7\-0f 3P72]=$_s3>BNcx9`gQA!t˩<5ΑU'o^ɋ7"{Ő:Ztw5=sD393j*[1|6_z }VdLh.=w", &oLm[ oc y5\PH8.!!4H +lܓfB iL+8<T "Om`R !vSZʼngNy 663W:>w2~ �,D2?լ6گ 7*btkـM&p.ӫ�9l6*˻f1ScjR}&mb B un>~F8ll8<w)(2eɒUQM:[˟&,~$E%IJ@?ƌs9aY_ \I IU3]ԕ߬}qeO.C'm;n* 3=g a!w5UQfMA|oQ;2s&?3~ݍP2#OiL)вjFdxU[4#osnϼ03JG<!3ET#orl|*JVzԏΟyoV.%Cd*>Gwaզ<QMΛiWPob-K$_\9=3gpVDdȜ1T4 Es8TMC5.ƊЂrqOwf\/OOiOe893g0ߜԴO9,=㭫RP|E'?]RPpq/gxeCrA?Nִ G7c6 ;R_Uĝ^Ĥ ԬDKP'nHx KV3&4C<0* P$Ԥ>N}Ԫ9 '*+ʘܺseIJ7q BD0:q?~ʪϜV YJ@Ϲ3Ye^ݗ Wӌ=cd_&/%Μ8|=[ #!b66E @ȕlan(Pw|&Օ5o،Z-+:ϓ4>Fv9ù- X9GӧʇZʐSN~MFĤ1y]G:<C*㋦[<b,ݫѼzq: 2Ķ\��( JP?'؂PV89j H#yH&qbW F'cs8 `5ɺ`]Ă*;tn) E1+2Q*BK Ys$>2@q|?qg9]L 0ɑ3cHJԽ ?.g\{*${jݽ0*"y1w?oіO dئ, @3D=2X-3|ڍHR1ãA&nZ>c悏_El�ըʵ>9s/n$bdF,=T5Hmc5M&u-d߹ ~bA?o4˕B؍\m[uejꖈU1;_?iw�Zq__o\�d e!KZLLiy[l &ٓZ¿HAfۇY439p]LP3}~dە>̬fVR�-2 `݈ %v9ǧ48J9|6 V)PfH?8 Ųyv?=jͨ $%m8b!N6w QVYbLq%-lź.o/* c}�b5]}тHhk"nM-Yw|p {4Di ~S0+_Z.Y~85sh׵[>8oumO]BS]5W1vuVmqnJSoby%͑?SsEU+bq0:ȳ&"L :snj�gO6[%^=O16S*D)cE!F6@MF=^~*@-'>V[DJ%CA&m^fj&-v~wSʒ$2#sn?Cu& ƆdvNy.=}fxMȹ~(7e83! %;:3i/ f$:5sJUۘC0]ɍt8̷ne9բg2J0y%Kigtq|1 W䱕ȌlܟG^F8E Ej/^!¾SaK؜+H ƁT6}vL<2{۹ʹ~(C6$PXfyl#˦$hdW ̕L| P_\$]#&g^ԇ!yݤqL8䵇눜k3hS*@h W2 9r5L 7L_8 kb^==evqô0K҅oIpLe*l?.`se6x] g^M&)ѷ#<TI)ʷ)'RL},Z<IN ;4 &Ƴ^i Ge5RhZc\L[FS;mO5ݲ ME*Yr2x!de}DSem'F~+6*ǀe[kx�Cv.^iğ{49*-44z97tt7cPT3{K"$9FF$۩u7/!v&c6?tzl{=ِS[YdO%[XΉr =Hݲ|{'.ݕVzRS4R_TIXh\uCD8`@bוZ=Jm:17Tq{EϨً^_WiJ0}"tiO|^MmڽD}l>#+@~#P9?'V囮ZԢr=Kγkr9-L ['릒$�R*4bⱰqq27|<JVہ2!7nJ&I1)`_w%Oco/_qX*^Be\:jٻ�hI?{=n¿qKZmI ~fPrmoJ8˦_q꾞^+$y/K8�=%\95ǟұne0qŧuX&mpb<J!iCǬgJIgNn/aEiOB4Jԏn=|m0Z$x\vD6Of~fؿ^4W+wuylî*͖*>=kVw�>uĵD:9[taHIy I8zW7ϓF)8aVYzuYdQ StB.I@7'{)jb}5=qi2JW 'cb,U5V) yv3O_'G.Ggnͥm9sAg(gFڑ?~.\1JzsRJ-Sv%bk>>FT1nűZxRkܬ(&S?Y,NY|Ou{A ڸ<� q47,U_ &<GHV"=S)7Ŋ$b=aBY}R8Kѷ9ϡ{YBg7MN|Moʶ_l\' ݾ_Y1~9E77g 2s4JTAGYL8:Ш^+䋊4 i.&?5,邧+-/zxNӸIN){ɡ3{FEW+o&}[> M.XM yU`Snf_0wP2l0UQ)f@$?Eʙ1u 9 ϲ>naq lMup 0ıJ;q+Q,05i=𯄳; TU#Avܲ7@CC!%R6UZ3S̃\I7ůVxzJS|*pНyp;RaMFs\ ,D.Z@ҳd:<#UkAbG:naoѷ}iBuC2[mȃG^3 :?+tɌI+;lF%q *A%'[Ѱ[G%Iݿncި7rd)8F% 5L ldD\”ufM#RXDTRvcSRq4E3=n֯eբѾ,wV`ؖd}~-cק=MP~g]uF:jyF FvEzJt/wnj0dl]Tsղ:y%2q:�C,Xz{}RkxEuFLNۋ߼.j7˹ {p?));b1_,mդF="R@u𐉐b8N֠1߂m[R D]aUZHIfBfe?j7ߌz=N!|CEj#>_G.,y=zD3NIVTyf>5]>+yMqwJ4pՂU}.@cha{o d6ӣq|oA/ #Xz Fw# ; Ľ|^uF)c}\ހ9n]0w栐qlݱ 1!R)0wu&o+iħ 1xKY{{"Ɛ@;"C[*J$zϘŜ !2CSVWE�FBs}XK2/M R1T ZuHKsXH zO7W(w2c}8Uglg\-+uK3~H(SSXWND-ő#y[ꎚ̹ sFĖ,bKp2TߐFL;՝Um^ Hd!*0aF 5 j!_' u=.<2XKymg{gO"Ae^EH(>#3{w]Y*Tf+'; 6FOLƧØ055/yqj?ܡd+֢{9S\vCs"x  4v|DMq⇈:ȍlpiTĞXք_r޺3Fwzq}7b_g=xT{+@QdTͺULi^$YLۃ6vrƀt#û/`Ʈl[#b[Ԯ&cᯈ|zᦁ|YF/oFa|JPi8FmS<#\=uIݔ?-+6өOV^o:z"!@b|/U+HIz5x̡_#:׎(X@,ǣ=+g_`ۍL[/. !!͈)S'l˭{O*N˅8w1*[R"8PFYM}sQ}қOK�" !-Ar!>&Q{s:N)8jµZ3t4+GPͬ 7?W1Nyʠs ~y�T{ ѿhFsl(f&^z4W2b|z]WĖ meuCxHSv* z"*n& pϴse3*iy;|TFuax2!YKJ Բ`JR“YPEuB K9)~NJhH!/g�Py.FH<}P ϲ>-8Wiy[4Ѝ6s*V nH<i?hh=j$k*.'h8cڭrVVY!";}<Gjزy3_6Χ{i*�� �IDATc̙_4H])ٰJNtށPz}5#g]{&2cor7EFGI+QbF6?˨8l2 C)MDN4g9m6z|Ne-ȧI?hA}]K11cӂG~ub&q(V9& ^p:bUcuKD.CyrGcO>]f<2f:f3EbD(gk3U@#«^ j!IÙr.ߙ䅊Fr$X0"-$o+;mшJN M_kL~.UH0234Rܚ@ _L%?5ĚAH Uk2s6~6H@)F߶N|ccEi,=8@VVdY~\y4X3n&+bjn1ư?`'hSp-e Fkj{\Ěb (mD,=ox++_Dk虞̳Pv?q*Ǡ:CdÖf3I~uۋ~8 Yrހ k{Ĵ\|MŘVlA@XUb{+9GXj ls<¸tlD*;U0=0lX Y93:LKRW#[?(c>4" O})RI~˗RIyûu�ߡqN8Qy9 R K|Ay*q/〩*7V"rQ vCtU3Ef)1.=]3cM}6:wWWdx:< oV?D$ 'RHqi2ld 1siFGEj=GDv8? iĭzƟvĽ;ʦvV 1<qvB:v/\Ğams?УW߆gҶ˟\9RpZ\3&dJ+^+}{wOWм`-)x QL|J HZ&W(yu((?Mp=(+q&J8^o*Z_CV?-rThf5^<JqlmhMv߬gB KĨs"ߤf%'{׊C7Zt(ΥKɂL\VewFI{+?MMgBLJUMhnI |@gG-(km5,پ//]&&Ey^Q8ц#;myx2)*,Y-vRZ4ˠquse9U3Ty?뙍L,J9EaUӿgChݻ"4q6+d@dLI�8‰A˙o2a{&H22[Xs9bL\&KL X̪0i0#-kc 'S5?R-_. \1]QR<>z;,.Yɋdf]@b,]ig%{MٌYځ嵟o$2b<:^^Qb/`\ȡ2ǯO^ F%ĒЛl헵kQ5L9~ܗ X_IJpOS֭WshȌKf<U3Z殾"˿.2 1&֖p'ʷo^މ&~:Oa30)vegՒRtԓ V=1X__&IMmW2nrtNGg�"]>m-E(|/E-21_9>G:/ϏMyGU}M6R))!@:;/(EH E MPFD:"MNBK6ew =$8uC93;癙L9p˦ #k=sAG"~FO?ca.U ?=6]YňoAI#790gZaTX(K^R Zmy!-  Dc5׽*y6cWz3 [fn՟svtCS*$ kHԁ1#'Lፙal Z@^i4㍜{% yZֽ쉴�rsUq}ZlX ^Tʰq:w͓o妀m8{-bi'6Q5XWnœt_*1עPYT)_Gп <>#> rF`DdKARo~&ypN?BN_p2Jm6j+˟A2?ZӃ FN(*_7ˑl[X+CV@/0W",P,nojPIgT@ ń<F) &|֒1jT@ F+ܼq=+f%cy"woP΀N@ ņE~|a`ٔк\ J]=pщ[> ?"!xȌ_8<67 J=1@ @ AI#@ @ @ @ @`�b2U @ @  @L @ @ T@ @ @ 0�1*@ @  &SAF•Y& eY6@ (LgPtQtav_hm=Nǣ.ڒ $Q'qijVp̒.KI#lE~Ĝ Ci_xXAѐIF_4%&;仓64*?t4Y6CeVh˛GI((Ę|_Vq_Kz uB}ÙYe"av_hHu84L@ hQsm|.EOc|tY c u":ȩTm]_y/@L EB\7½&fB)L>= jO̡sp0$IMAɢg`}ǃw/=0ok3o凓YvȄ.u"B_#h~wLLI.-P$Ff B`[9(D:6Ne``} Ͽ@Cƽ}Bl$`hJQqt&nVW1,h($NKǐgҡ+o_7MlI!8D7^M"Guvϻ3ŸR6M̱O߳-t;Mu_b5Yt,,z:;2o'B n&fllM\貓OԤbϒ1jm1Fyg3wNˠq,y]XNPg,fh̯I`~A$^QEÐm_DB$uڀ1C._} /-\q4rqŬDUYtKUQ0 28 ηDC\&V'H~ G!Hҋ› gI[e;Q4co<OɁhg:4eƈFؗD]A5)ic/y͗|8Õkio0q}M]D~#tMg#Cr7QRhmh|y儌 :QLj")>0gjӈ76*/0"/dS6B +-eEMZ\"x tJ+ʩ҉_;魥,}).;m)̟ߣeA)_| ,6 &"ˌ MߧwqgLά̎)ۤ>;IDY"'?Â56} -Sc&Mp{jeK5Ÿl@$_9Ǖ 79V>ZB(z._x̥=!j+1<1WKWe:&5f[Rje iw/Hv6sc|T3F*=}?J}<,!QrΎl~hWvETZΌ51^<=Q~Vy+Ƴ٤gB`!ہ~++Q< (lLг?9Nҷ xWUt9[kW| i:}.#iw34Qt-ˡYeN@p\~&v߻䧘g̣U#~2vҖ0,6:osz4~~Y}:0kdǒ1CN`^]no^ &8U&܅'rvycuJ'Z Zǵ|/5䃯vt iI3k'T+l_Mc4oՓp"5*eԴ6.gRUZirTU5jhU(KEɽ\ scFk)[HkkAyQǿMiySfƃ뜼N˶03'}9M`"ދ:аIsڽ97Ogչ7]dHSȎƝLOB^ W-ZeZlA+ltno֞Ѝw]%}J=Z, ?OF�)m:ol~2{ iޤ)mzV6(oC rN>13} [SVSz?jq7i):~ߤ3(Ys\"W]d aEi s*csQ[DZP3|5]X.&iP!�rw<ao-c9L{OZ{[Y{eT*^0$Ɛ*)1@ntO)h|iнvg>TpY][ƌ߉SK(S6kkjz&+ eT{R%ӒҲ/ 4s?o$Q> nˮXzQe#*Zg8Sp54dfS / .]$ ($ť1t FEܛk[6p4*?γʇdT5F聋+?"l!3*A(4) Ì xtֶ#Adzfp`8Vjʌu tkLCPreFmy@# m]]~d9.>&jȀ|o˘4?Ur]` Wg7Ȱt]EOq*:Z> n<zN۷{V\d|J?cӚc?f-cԩ^*+GNܟp![X"^ s`UYԑAo3m;=ZJ< yq?Ĵh$%'n խȇ 3\Kɚ bcu rjœEzE4vȁwl@Y>_$hcwq.IH~VMJc!Q3 lRc7x`V^laNŲ/]ɿl\ A`*r5?N l. "R:?Uj!u tk46}z.˨F~H}"1c~l~HXʘ'E \L[doCڞV_frO'P+ynKINB ,a' <~"U+g˷-bK&OqǫS>'_v~q(C9]&ͨho8s巆ӿtjLl< wyc9UQ&h`zmk ¢Ds&-芙*3r{SpȎ l9[d1Fty o(0^0t\;A03+[{%,㠺 Z_괄>CL  ĵN dcȻ"!6 ³1=x45MSԗ/ʇ:U=ni;\w/8d8l+k$-v4Aұ/!.j q(`+aےv9Y!Я9u'b1T!U З%{f8>BI<źmﺊJvZΡtu_­w8 F&Ϙ[ǻ,{4 R넿x@JgnG8̜ͪ}gyX&wFQPό 'z:DpӆX? # Tuz,M^fȏC Cδ?2wN9l=IRx|8Oia/( 39D]Β x8@rt<LTYpf T3#.O'?rN,*ڵjVi5ӴbẒśm 3>ΰV,YIEfG`E8z&qY-9et*_$g[uٷb]w:4r1FJ~۾enr@N-s.sL ŹQIh{!oD~OO=9G (`:u^l}"Tq}O.Ȇܤ7c$I9#W;sT 7H I^l|Cx7fr<OnO'trOb>4tm0}%ɺ#p9k:uh39XU e3m>AR~L_|!M=W7pO/WKDk'dbi� ڲܩ%p8(^Q?>Pm> en~c^́@`,2k<үY'-l܅A> ƽv#3ѰZ;4=˥8W4$:5rdxw}5v t{IUCyy&l$l~.D>$[l@S+l d=m- W,O}qq(}LG(ou[YoS];Zdz-ZbȝfCrs?9ФOeegZü_* gP /gF_$2KC޴^7q'FO5.q ـȭq)oqx~2;5)m8>u=n,[{sNP}§ߢv " Ƕ4yyAcMPZ $-,m, 0E+T]ރYQTd$Es֮8T CbY2Kl, +-~YPH Щq:Kgt: z?rn,jPgt>- ۾c>0+'z7ޣ;c)+=^:X7z7Nka0SODCûDgyҫ5U1vʵ5hIFݑ'iLӗ{�%M3DLco u9n_q+YCU22sqkXu4 %ij G}-U<6Z]t\-=<fعۣHs1l+߿AT1 /i֥yIȰtEU?H-E;)Z4DD<2uޕtJ#*4B~=E\u{1t?25֐@ neҴ-d2i‰]&@wFT/|U@_ؿh9?Dhq�,[5{z4fՕW."6U ^fGqu*d�PAAՌϝVj82s Pzڷe)@_MNK f}_ eq,F-p>\CIA|鳓NNMɭFpӕtZ6͵Tfde=ZN=ץChkX3T&s;}GRUa`[,BIz(-JMMˆUqVs7@ �� �IDATIڌq:y"i2k8lS Tч ,8W$ھez/Eݶ,ͯc;W&1(-]tvk)72'BnNZTU {3\"S, ![շ_?hvb_iˤ|-3o*Z#IxhpeBj}IAwFd#AYRqY|<)Q2`[\sjﻆ4_ x{3(W<ΆM,J=| &okQPүӺ1?eچAǕ(pض7~՛WzLJ{O,˙cp=ԮF'|}ӈOK[ d%ase_[啊 ; HO M ʻgwEjUCHbqwI(EטvJp.; 𨋷Y*1->oT>)$\'29~<ˉ}װnҙv!oY>>OlID-^$bӚ'cV8 .}ąg1qsA=�'5_%Nq&ΜjMLX%ܑʮ(FtM4RuiitJ2gm`[,";Xp)_F=NUS:Ѯw=ʝ l,Yoj#GM,lu/.f_CK~%[Sq7.o`Ǫϕejh?-Hn#FWPiŌ~{VT/{�V5 t\7lϱC2O|Ύ˩M~33BkC!P*T>+~U'ph$xWחՉ{.Ffd]T_xP]g;1|a/I$߱)Wc~6,DQV;QmZq,:'•$5hLAOna)q 1I1KKJO&}/EыZI,l<jMqJaig B]<M?QsMӈH~:'!slz3r$>MfeJ枴hMߐE7QSD]δOyf+2Ν> Ȱɝx 6OaH^iGmQoSw>`lU*1q6tbU,~`[ ej3w̭jг/?J-?,Cz0۩LA&^frͻE'sߍYU/֕'rpkǦqy_~owpw㪧q;Ķjѷ_M|:yU7Ck7rϭ+SXOp=UW9sQٳi;;0VH6yúDu2&i4D[ "6?ZI\<7̩;D醴2/Tp1Ίece.uj% Ws.^J[KN bזVl _uo=&LdqDwxI+ߟR[[u/ǃEm,dzϕyڨi~XIhf姼7OaUF]d?WU(ER|gc\` '%h+]E+Lq8Ӕ3h$:wqOOW^㈿;=gT?zX##fYي;bTfٍ[]+lb4փ*<}Z f}KʖĜU_ +$D/ )F-xn?GG= ڻM]q?LGzu:(sL/YlZG }& 60#r<m:C\٢ Lm11t޵\J 7Nr/^+KJ% yZL &A|ts9TET>wǩjKib,X;(W_rybR8X ڝV0jj\ɴA*L5 {?˜[q.Tk[ Z[͚rY} ӿUrlݪT%G_Hh"~=)5ҾRkv n̘r?s8mU|I9u- ev4K2IJ[QkX긂Ow.g٠pniS/FH SxcfB'9P|6u\ra4<]oT,?eI0¿[ɌY  zSxJ">̶,毝8um|ur$Cy7ԠĤ0gZgXe&q׍ %yy_mPJ~FVpo֑*+7!3A+n?0u0D[އvѸC G*hȠоR2/xpt/l0s9rl̙jc%j4xIk򪿳Ro̰$Vma\ed";C[,_Tc۵rMNد$~voNXL& ;A?{ϕy,?7O($]qx|u?{}F|`J5Ⱦ>B1_ X֢emS^w|l/M&}nݰG^S7SoFv9۲�65hJE䷾> :bFNF_[ &X0[/c9L\ң>?\;*-\ܶ3;U{+-罗RsU߆H_`FQ90gK7|^44r+oT[.8^<{: \BeQ|"a_H_Ӥ i4Rc ~3A̓ <wwK$bǰ>|1?/n_4Yl<`28K:_?wjM*4X,cm1o |#:A2bBpb6c'5SȺ!ZmBRdE}W,v @ҠQZ$fJ~ [R;0,K=/~N؁ut奜OOE%׷-|4AI9GzwlyD+ŁLe!.Wwd8-@/<7U%})zj/E3Ϧ އeS@P/bĦdv|Fn^^IQ!bA</(@ @ %o~.@ @ @ @ @`�b2U @ @  @L @ @ T@ @ @ 0�1*@ @  &SAF•Y& eY6@ (LgPtQtav_hm=NǣsBɥ &886Cp;/euvf,鲔fT9G~Kk6?eeFY.D*ThHp$F/[Dŝ_GdFBğr~:,!2У$//|_Vq_K(T*).Y!t7yh ۋ)Z)r!և.X|ފdŠ/eQW*( _|@ (96~>[zKD=tSڸ.X(O]i^T(B{hoF`ʨn$0 1*M s9i3)M*ẅ́RFi?}p{&)٪I<1>(&5%&  jrܽ|t\VkLͼNf!&ԉ }֣! 0C0]&tB?1 n?\:6Ne``} Ͽ!>fuv68c!cvDl&fll!:k6q&&heqGC$qrN_:ht[ͅx2/ds]eP2Q<ј:/$rtZ<ݶKޝ.ƕI2u=Lt>QC1Z,e:\v:.;IDM-,Cv)?IQ8ア? *2q*4Ӕ%ZwYT /I}*Nӛ 4rihY&ɫ&T˗4&a dpzo9v{ O"0B7=|Aϒ̷( w;hǬxvvt.)'hʌ/(ĽkRfӲ!^(c/p+t,Na( ɻFx QF:#|%Фȩ}ؑq0W~XКr儌 :QLj")>0gjӈ76*/mȢ ?T_qP$:gBv!¥ ]P�Ԥ%GB*k[>ZʒؗeqY6cC\47{Դ,(EQZ~r~\[=[yYg>;IDY"'?Â56} -Sc&Mp{`89JX.ƪ ~16%]j)}p:mm\L_ B ,!%I׮bfN<|{>BERt"✸ջZaSZ%$=JqMOxgn"!eF LppÞ\?]~;eR3U0ÿTHv@H<C,(zny@0Bϒ:K.^rvSaLr]Đ# 2v7SNUAJ]L϶N]BGS̳mщ ê{;niKuKUُ9q_y{vDUsz >52ԏc;%_]no^ &8U&܅'rvycuJ'Z Zǵ|[dv ૝|?BZҮ8& " ۾vӘ1[䃹G6H@,f5ͤ ~&1w{7iJ1 ܶ1'r2rCo]"aEz6u!LsfR8i`[,ϐNd4 ,>? v%[ Hם{Q~6iN70uVVv:l:_oY9Q܃.RT>cq'ӓWUbKT_dפs̩xwUm[w#rk<nvE_)Ǒd*tTՔZ\M4Nҿ?u=ꔔc9L/}ߚC D|Ty!-S#>àA;)u6j:LPrEEb' "q%>VT84s?o$Q> nˮl4~FT21q.:bkht5^.]HQ+çIKccG)P7b?3lib'U'g1 ",1ékG9W~bEBfTQhR86?@錭mGՃlYw:͎qՔF(֘ʺ1]Gr]|L6(p^01ci<!0#ίbao,aR(Tt|@:7@Sy�ro='1p6-E: a0'0q5]~D_[ƪSr-WUW$ҹ?3&B J (TD@0fO.#~#Afw{[yxLm7iWIT= KN3d@[巐 3\{5Ƥk5\- +<h]' y#N!]�rdW[JoRRS+*='['#Mng0E+D]V(jIYmzUA95˶0wGs'"q5L5jT*UGet~-qހ]dr5?N l=Jm{h6d Z&Vy(0aOռ0 6OZHE ǿ'M^Ľ2j>Q:(_mmXֶ2IQ<vCd9W1ӯŖ5+FPU(E_9 !a' <~"U+g˷pdB<-mgNpWV!J!b�cwgnsA.OZ, [ ]I7yO&O]6$D݇Ts~JC="F&XnmsX~uuZ>D0ׯOEӒ1LCfk4/nw}VEBm�gc:4{2hj/_⁕u{Y T)w|5Fu_pC&q*VHZ }iӃc_Cl]F 2bQV.Ʒ%|sC_siO8c0hCj$O(3q|>t(0 M)m|U, PUr&ߤ3nY0vށu^=Q넿x@JgnG@̜}gyX&wFQPό 'z:DpӆX?XO{Ը!4NR ~�O\"ah\ߴܙqTΒ)<5LJ 2IĞ,yO&`%#ft8J@Qwṧ:0 + =SH{He׮Wӽ\xgs"Nb g|aXLV:ݫhAM&#"wإɺ#p9ZԸv{3w."ڌjY=#=NxAQ:/D3[1; U> W[&? ;6nJ@-?L=hTڞnc~Ŋvz'BENǹ+4lMN^I?uz^i틁U39coe7dhNN>ViLOPӗ%@dp|Sc&(?i`y GuԛDt.Cb<)ߑ?4Ķچ@YUh@oTCř<y跇Hm43_xO*";L\>.N#&SYؕ~rpD>ig.t V^4_ΟyLr!Y.ŹRA�6%iħ1/gs {3˯Cwn8utও5{L3c#as!!)bZdk %nliиb_.9bGšt1mIfneRMuDj{kkKԘ7*c<ȁ&} -+8Ӻ]R_8jh93"YbҼ%;1zȰt<L@nKy+#U󓩀ܩ9Mi{9}$vg"ޛs>FS27Nka.&Lx؛FC.LV, e*2zdk׎d Vm %6!(o>̟;SvT]_;~jd{H^z>5Tu.-/U~S$u 6τtX2ԠϜ0}Z8\I+}}xaVNVoҽGw:wRVzνtHi_8:|"%:˃^'Wԏ9W ]̨vRPͱ/ #37UH�!�� �IDATPM/ɢ.u@LEA!7nE= ̂o!xNq%~}ZD:mPLLLD{-:ADj=>N6/.h2d,+|Qi$P^Vȱp}r^5.VHWAݭLW1mB�]8u2ʔ~᫢F'Ei!܄$ E oϲU/z4fՕW."6Uuپ1NR?FI; sRpdFo0SZ4n \D5[YZxI|Թ 63 8̃ 4Xig'5 [S;Ujէw}Foc̨v2 l, #-֚^=ץChkX`Wv}lܟ~NߑTU˺d GKTZx>Tgws )79s,VYO:s;3=|Y ڌq:y"i2k8lS Tч ,8W$ھez/Eݶ,ͯc;W*ʅ@A܃.x:[Iju~%g5IX6{fC2o%M1~2haE 9Bh\.9yHhfz|]Ccdad(}vzm-_A= %3cԤX#ON#>@%Wa h7rf)&yH'̱?8}jWRJ>>iħ2@̰칲/-JEs@'ݳƏ^ûѢn5סzgV Urut=w.)5_ ΅*G]RgȏmYxH'Q l, =!=_ؗΑYN컆uԶ3 y˒EĵLܼ}yM%gK2$k&U^F<9_`֐v3&.<Ck ;v*Owu3qTke�X&#CEf-Tv5G0kj&hKKC4J2gm`[,";Xp)_; ԉݸcJ'ZUQ\ZNH𨇯])U-tb6K[<ƅ>GTeg{q1V^X+ܚJ1vWl~ۇ{p<V-},UC1hEҐv)/^=t'f^FsK@+<{9D=ye#̼QH-17}qvʇ` @//6, Ue)}tZgLؙ*2j'B:n%_=\r)-< %N?f5׼6fs!Y$p%4zQ+IVY5`3.Pe�fXYBz<*POsOT\g4".ތ2oӻ7vY�'-{~97dEEb(.!t<C3퓺l g%9sOj2<j_!er ¸Sm9kڑt�?Fbr[۔+"AFxLM X XFkCsReE˥O.(Юv*-FУٱܹoAnqʼn&wcmku0yڱi\@W/ĸiD\G%ZW=c^tMڍsʔfWf)WԨGʽJw NW;Lћ=$m-}Nj%ɏrv0vTx2QdH[,B㬨Y&RS|Av\ wJ]코Nͷ2ք9e*ЭQG6OsMA �5Lg+4Yio2 m`jSG䨈?:VH ]bזVl _uo=&LdqDwxZH+ߟR[[u/ǃEm,dzϕyڨi~YIhfE_ZR>ѳ1A_s v놿[M ޮRl}993g6XV$W:Z\a&QiqZ"巐jsm㳏^Gm ]'?a`6eVFj7#) ƴ_NBW{K砐'+Q1LL$87ZBuerFé|<S8 XPvP4 tιĤq,4;),ma6.iǪT3(2XocnQغPmy2�+jo5kʭf5LV ȱuJP=AS!X|ld֔nHJ?ƌ)0{KZ3s z/3y9w]dv4K2IJ[QkX긂Ow.g٠pniS/FH SxcfB'9P|6u\ra4<]oT,?eI0¿[ɌY  zSxJ">̶,毝8um|ur$Cy7ԠĤ0gZgXe&q׍ %⪕ <>#> rF`Dcpo֑*+7!3A+>e=$Ra{O,.q;TѐA33}\;4 he_8^n4ad> VxB|8;¥3Qs JhU\umEa,^ƪs^G}:w^q{6<yIn \d~s0A-e6 Kbeu_F&ri?l-?4łዘE5ֿ]+䔁Jg]d2콃49Ⱥ\sBBۥu~IXQa/]G{I,\kf2?{EH-;h4Al"( *PEADT* $^%:Η}̾)ba|[ٽm#GUðѭ- D|~K.Ng|05ly (5^i_+v <((l%"((O(rTo>R )x/׽?]VRARUUkˏ4orWY"@ Y|Oˏ[}/=U~,($J؛73f=(p} s;ۢyS>ڶ3Y0< XNOϻ}>@ qTm{Q5OFtfRkX*mjܡdj\_gvnfB͐GL[՚Iw |­^8;yy .%%1i=,">b93mxIH'@ .8N?)Yp$̓~Z/5n' `T 0m{yPq~=0 _裮3 ^bY{=B m_ @ @p l@ @ @ 1*@ @  S@ @  �`@ @ @ L@ @ �@ @ @�b0U k3hQl7ZAJ{`'hY@ -L˹yO4v/DzMphY9.}B~ܑmlh{X9gq-@ n&`@poXKA܊*O&vє0"32sqݦ}=G\lH w`qtL�5ut&..}><;c~؝RRY?>sAI^Ũqtys j>rZOn<ӫ∋kO~d >qUl3<; >i%&qqp=IVW08.Ή+ED Ė@+]GKL_x{k_@‛'?aDѱK|3`:ZwJKϵ@Ia;l }K(?)8j*=g82�$lø]hG\L]p\KA_Nr塻xo|1&k_࿈qu:*gvr/u:Ugroq5R?y/`>L\< +&~Ūt:GXӏ.w&'a/T>O5CAw T(ك PeR!w,xy/K �, iM:/œ/6,Oƙ;8Z1!@{\=n?ݙ0=1{Y`ůR2,QN% fi;?.̗3)u=S9E4G+EKϷ 8qՋf1sZ(P , _]ȥn%_a/g~7ƴ̥Y4iCb7~}.5Cz]! 3^c[m)"O]m8ϊaTK*V}gB6Q&Ԍ=|5e9?˜ѝ[܏b,;<_WN)M孍8c(ɮE2mKϤOya<wGI {%i껌éctpjh,ي=sF9|Gb0U "ŢrP$Y1bKs"Qzi4y`=ķSyˌR;nHՓAe}'ѾnSACJj�ZѡKwF0q'F3/XY|$>}1­rs,2gyϯ\bgo2םh T7OD9}g*R'}T0H\d͔ | +*u8JILQݨjK>gP<3ەYtVX$"bkS<P Mclj�($2nS\ m3c]4iIF<u5aCFa-&_ $mbck]WL$;B\eB�'g}UPF"[Ma5Kв>t(~Y_'D.Z ЧES/&0iLɎ$wzg3*260HR>ZYpy_ٟCQ>6SN@�rd~u8}YPu*MhWytNxw/DV~L<ӓ?j%v|AN%[Ȋ-0o[8}zs-ͅ_'3eU$]^ϥO^gcV ȍ8 T*ΤCӽͩR^GUYRԮ[/kb36576ɟ?k )G0{zDlKsldT.zya˜Y*B5^6:/_ආ&:~qkwJ$rjtJwJ߶U=bQ3}G^ \8N2-'C-"E'4p v ,/X %hZ.ݏgx~[p~\ HܷGRp� gcSwˊ44 eB(4^˫ݻ Z$QY'4*geZCրVv_o^j;i{;& տ x[a!ܹb bh;9? 櫷Gm,Uu|Y9tM'xH\iX}RsxithshL:mƕ×bѹ29}gK H{W@_ɴS_sU W�5[%꘺;/sG|=b̤O9l6qCܠ F?zެqW]t79A :GP=J( 6 C(j^cEhqk<^eG!qO+نM9N!fm? :Q%Lr&-9:]b)L3yҧ[.tk{%eBRؽds<C3lN -:F|Ō7,_3v8/d2ڗCvR?rzb?"ЏWޜNy=XHpemggD8l̩ _FǢG"hIh(}lif)G>q@x~B+ݜQ y>lOvSjxPd&o✦U ͺk|ʅ=??VvjCY?y'Wy55KEKP+Khj#) ŪRLͮ,]?rJ1T.lXK|JT3Y"U .L % !DF=/Հ ?ps$Smͬ+݂sX$6[p~\  P4¯auE�RM2{౰yZ9CjW*X7aqpedK6sr56 qEeB t&מ"o=/O}5?cpO%UqXw(Ɏ;7T1d&_3ۋS)GJ9J|&nX .X9q-a-tN,`K\d}7mTuI4>Z@XZśx%,\;WC醴}.u?_w␲?&Rl& ZԸ"'�HDD]<}+Ek?͖-5Yf`qI!4]G&9_m]kiÆr4C8m%<O ~FIi9"׺,&ՔbYj [Ĉ�*kصa+מW/wЊ;_*v6{SJʬo)k&imbo$UW9NԯLM^so9-'` J9b wd*L_Чj<2jD޼o=JYi1\2ܬ$# y‬A< JkT4ONfz:k'ӽdO)$:|J榗`f g^| D@\\=օƺ|]YccLj 꽅Cٷ(^G*&F_)uBfߕNO"C͉+=T©U$gm%# =vm ?.n`jܕGzb-;zJ5A<%j5FYvn;Lma*S(TjXa7 O8NʢW}쐦$i[B~RQxƴNq=J^;#a;WEqdD?2~ (|B›~; k>c>=mYR s>=10')6q] ^前 �ǹpݴ -F`#~]9'8wBVjm1ww,#)<66;ѵpOE3B6lJJ=]8άby|i:DN9?:q^ͮd5ZϪ`rcOqʁz6e!bRN2 o}vpfA"ԋ� ;8Pa7q4~qZx9s(Z1lt;+ٛ1+WSm+ěOL`>)bx9̙3NddjT9L�� �IDATIw +4|C_ױc#՗Fg?s9Zȷ7?տǣic]o{Ao6r/Q&.HNS$8JT2Hhlw ђoڡ ܎m:낈h&| ԿTPHI5gz6p*,)ߨyUh|_%$AxlY_(zʑ9$r⩎,:/@[4hxצcqqmg Q//]Mn#[WGj"b)c{'#zk<+#SRuo?,y$ 73:]]C!� ::s|*(GѤG+BGgr8nj̐*\ɂM5OᣞY7rEieW"uޘJ-zmX&᝔c$ N]i-z:XPi#'jTH(h<j#z֭6$!'>^ם .Jz;Z .`̽wnM_9}S(?9_2@_zUPe PJp'(%r1iqM1+&9~b?Cq*Vҵ%LN~~_9wȆTYJ5(6,d^k`Q|.kHQJErFHɺ3x6>X ppfk<.ꎚɫ8zc)XN5m3S^ֻ̀,ZzHe7I0wx@ QD7{V<Nj204^ 'h\:}i"I%*Y~ۙFBWB~[~664κGLcq?0GS)pPyΓ^ ٶ~ [F)V̄{Yk"%{NbY̺V\# #3lBwft�RR>g:QtU`e5զk?gB XOmyhP7SjS-FY\z/]Lv>L$"|b;9YgjyoP)[ ?gh,$Uz w(u..ckIV JE1+٣.{/Pb[S? KW.Z@ ٟXF4p/]JLl8;XIaP$ІS"lln >sfCrU ԭy}DϩyU _Ό�ʿNA:@Kp@p^�c\(5*##Z7|6:'3~+RY]:ns$IF…זl2G7y#rȽJż3{՟&H-3�G2 xD}ǒ 녤#xJ{3c ڽy]ԍR8 Ynqv3ےTmQٯ Ώ|X%Aj.]Ma6]ְ)QLU*x2uԠ^Zhٷ<K:գy F%u֤[R$ez`l ^i_~c=C{8=lb%% [Z6 ~A ɳc,sч{ҾnYe3Қa`C:k~e: Zk&>řwI&#{ rRd ˓_E)z%q)@qY￘G.w~P+�U͂`ȍ{uǘa!pG4.qgL̮2zRk| jEɬ(mKj]K2t^GI<U @l}z [g~G[|GsKq]Cޜ[ݢwp9s$afĤ${%"J/!G*/Rw0͟t +b,<>fucʧ^3e֒$ !q|oQ;A*$u+Yj <Jdkro"\$oWr{&p *F3']ġDB(_8;R_<?:;PZ|cC|;w3jU)!yv7?"ҥU�4ir%s5o%ekPݬj";|M#(cbTs<ULePk?9K5y/YT{us&hT%}@ \} G9v6kY:2~BWjmMz?RLbRt_tnY\ qBaRrq>څj{#rGA۱ QAS!$)SGk\;vy@IfX>F2yjuO^ j_F'^eB#arx~9�ȲTox>ͽu 6=z_aoB Z:Mi]Uˤ<{~rLE> n׺(@'fq|c.2Uh^(y -cCdWz-հ͂RQ<Lyo:ذ&zrwL\Nz5qW2mI&Lc沏Ra/<ЖR՛q _(l@?{gU}fB;|͛HFbbqWY&}gV]ĴD; ۜ~HH #ULqd{`oNgSxXu{Ɉo9}Ĉne,Ejh?&<"EP7iߢZWoW,eL;OKi_\)ؑm]?xk;eUxR%]̫-52oc<zWYO}i_~Bpo3.9�C17Ii 38> pF͟y++B0a@ZF`>ɖ# Xbԓ_*+6 7?9k̴ h?~&IS.Flk7+f cjE+եyGg}&[ïEKz7IfTUOˏ4orWY"@ J8@V%T!|8N0w@_Tw<ވ.@ T@ +srp{|ّ7ŊT@ @ @ \OX`柔މ}8=X @ 71*D_-@X_K-@ @p @ @ A�T@ @ @ �_ps7Z@ @ Nωb0Upc4h@ @ `Gn@ @ �b0Up#T@ @ u@ ny`@ Lh[<JvGQo<ode"ж M'onYon%/s+@VGDq!EQΕX6v:c?8 >pچw{MLT|8_#|"GݘFA;􇗑yU2c/WG>O4Epfͧ~ AWБ9֣m7͂1Mtw<f,N^ah7E{+(#k@=)/:Ļ=^86G nyL~O\O`3nE4C$8yalidBI{{N1) eHGHWric|a /2{+\F8zl R$G^8ovɣ' oGqhw"e6TJ]m`hmt(D=0?7ėI­+cbL|�Ř]-THYs o2癌?-IVXl>Ҭ7vv@=XPJNQ D=oK>Ts4Q:׍ зIHfhKui>Zl`;~ Gι': _`=\lmi38BGs hGLϼvϳ.?x:8A\k =EP/n;X<X;RʠARlάXRBB۴Bcpϰ' W=|y|$VV?Es{)ȵzک+Q:#%dHalZYXeE1탏F2oO04R>\Ч/I]NXW=r) OhNɋ(CgW6h:N QؓHR"]bjk??S";cl]Q.ڷ opd/Hbh}h4[I4WX&S>4tMXNqdJ+"R*rXX'F 1AcoO9΄J$jcd9wIx lDq7LCj3uxwnϺq5m:T$rQjb|j*Ʋ87-$IT)l}&9KP?ZXm9mz)TM5Іguz#e&] *Ǎݥ}v-}w1)s`G>[B*R t>ǭ*b )-l=ξڏ?bk Cf?mɭ�IT4Rd,^""GWGߺVG<g zOE&䢵зO:d7[r!x0VD8w݁,v`pSL~a yR7_D{DL}xcUcgU|aH=~hRlEE&nۛEwaOK?M <?OlaeC+ ׷%.n].&SEZbaI{@燘jsSBѵI7Q5ч FxTI6>R�R?(Z/ajpW T;y;zϼ׊er PL eoy&y~!H0vDע MqwkXu.GI ny5UiH>þ,?~QjuB+ ۢ]3{]5k5 K0ힹ9fI߅w?FڷQ<n8<[&XNߝoƱ{읧a<ߺq0ƒ`b]0q^vc@{8e/b,C9vSNphuQ=4K<Rqwi"+ ?1=@,Ǡ{p,ƺUф�Pu 4 AW$v&sɊAeßVer3c!*(Q@$뿐j "b4[jvtm$$l]?ZvIEeגM!mI8׌#CovQL}ڽ9nmڠ Ӡ&GXvtR hq_1]6/OE)~z~a&"/MqXz7_1�M v0݉ŭ~�˿SzX+a9ÙH]կmrL$.!B֜:&#!&T$Y:)qHuѯكܟ)KL1ߑ6m6.= x#R }eZpw_'7KLjmӸNCQut+3hGBWʄ51-tu|#qyq%}޷N W=t۔ r㑘b[&/+*+%8 z_pY 6?[Q.:p9Z+I.`Qvv%>ُc)\,50e2WmAUy1 k'cWzp;rƣ͇tGuð˸ŏ֝'gέZެڐ8G)ֽEs}i1F1XoB«"tJ_#ϑd* ~ه̣שJ6!vAO[?^c'ҁzf\\v^1).h"'C/NcsAF%dDŽF$}8-X#@.E&Rwf~mQUAu>㼛�~p>KP+%|md:T_T 6qg-'wT-O ]7ꈮfK/Ķn// M'0ނ%#>݋53ӷ83 W`"!U>tq2A K13_ևX<CS]>ן3qx]\]䣛P =>s-\Gym&&!MKIX)9mfha^ RjH Q R0vyӥyd*u$%sT]`얆/0�%yaI{H->\9k/#s^TMQ5C]t)8~ m X+kbk>]y'VeW`첎廬<[|uqd: Rȶ%@6u�5<d@};D}'-ȵb|d:;,\֋vca 26IzEI*MU,@=].Oz&w 1hBVl+^r^0plɁS^=]t6<"G2,;`jݶwpZTUЩ1l+stIBTc^Ox\FZ֏Aqz!h?KBj0Uq6N$B9X Nta/Z* +%XG`kA}=+ WC uR7uiݠn`*�B�>*ח|}:ׄr]-ekggW}?v<% )>0מ\ Nނ#/w ځMa5d8u!�9]?7"GBQT&J};urѨDZ]Ed3Êw?46Jk)_\!s?sVwNt3Hif*(x\e.N-SlFqDzgs؆$!i{h2%7c3\YCS\"+Y hpA}9|y7~d@ C?ݏN/9.R0F^܉iXv#LK0>F 2f 0׶_tosS\283/O0-G׮#CE\L/ m!_U˳{ꉹdP.01+]vZ)W>�lq^]͸G-YAi\9e\^�*1ر#ԋp% q\~$RV3=8Be7.M }qn G #kKhZȫݖ*vj ggƌ@_%[R"5д(_O*QGO"1˾TFQ3-P 6u&$mvr,\6ЬG|%y;|5%yd+3r8`9P GVx�jׄ�_Rl/>-ڇ3Sh~uz^Ԧ)ZK=KĤg=*w`Kv!'_05تc|�9mk¶.z*@#@j>)" lp%}9Z;p=@ F^% +>5BQpol U@_7er24ck=GfϺuW芅<e}N (3Fxnkؓ] ӗxiP:<3XM߯/]I6ەY^/(].'\Imۇ2Vi8~} @dV!@;L%IfA5h]>"c~ l+K\ؿ#}7h�� �IDATh?K&8ԯs X/ c\C=:]HlI݉DkZ=#M݊pf*.~ u꭫|c=d<?{}o*%)ߞ_co^э_^ ~-�@F0<ed)|mwY\sl*ps?Au>㼛 ~VgmCoCW^zr-5[ph!!}\"T-ЌBWkbpσMļTl[@)CTd$51<}Ԇ'L $wTIh'qX>"Isg{I˦;1v!7V�r+v ۣ-^LT-pʘ[~|R9Tb:$Il6($H7ۇC3̠ GHd9ב9i$9+˲̝؏:m͆e(QF{#-Aڦ`cݡس_&g=].KB*=X?z{Fkm _pVљq?sjO5(�:3P4(|xꥀ 'avMΠbFIc|Փcurׯ[j"R`)?a޶lB6Jm@X^hw@۱ x G 9 E"id$˼벵݃b2]芣 sNBVCӗlo`@"I;Qϙ̅kQU @S;{?"LBǃNt_Rz(o=ub;@ us /'W^5ٗgAkɄ$L Z&>4be%=b_0 gJ�J|cءWldڵZ䆽Ъ0H )W?9Q@Z2Rr8֭ejFAۤ}qY 0c\#cszw@S*y8F_.G|U5~مHԩ'6(6vs}iPQS3 $9�G|ZlC;8<=ё>:Z6 :_qM?{|/A*لR"c7(zP{ZIWvbO.TO!gMTk&Ջ_^230]g3JĹc7犥8oB4,Š{G�I5w` B;'Q -X m G=5ڽE3<i9�]X$Wx˜M0 ;>żb/3 m$/=g;*21%6u dM* Jr4.'ZzΚۦM;_&scVV͸2Ԝ̧PPigY"BeΖן];O`G8!BAƲ 93mE&ߥ*x费{+H@Ve_e| RBS>̛lD $MpecbVG!i$ܯK2Z i"\'AҀfٱڢES}$AdE$RQ̮v|£Y@hvhZ@%IK\U.RΓI$�_A2:Le'_Ah8²/iYB!Lo|nQ١Ps>ױ[)%=RT1$Et*a! eHD A=U{l4e5zx*5!7~up~739ǍM1 c^wXm}L#%:Dqb 5 оTto^6dkVKW^~ol]'iKP/&R<~ˎ<m=O]{kƙ?q:,O>#:j6Eq8fŸu$:I=)= ?q9,4L% "fn½jOTǎ?`05K\Ne1C_=hߑG_'6! cP6N$ 7>yGtiَmя $.G0.}ỵ)PVҡc3xy吋G&p:p�%;y ж*~ׂtm8C֮,#W _#<f 5z7ەئ :9q \.koR)75 gkG6I2~;a$d}:(& mrFrhSw8@R3Q- *㡏� FOX-|KťCSFO&fNf87]{F&YX[Mضgi�/qQB^-\IBؿ@$!?֘TM($i{?EHdB!ʡow/rjIYo}-Y%NW~5(ʩX~+ ][!kI@ƫn,]O~m8 OˑHBΗ SqUʸ^*|dnkb6u% )mLMj9zi6܉qmE/ĵ=$$ȱ0uok X9;}D54!V )9ÕRBDqMc q~8\Dٱt!Es_qN|\i))C>ȷN׼t&eDJ;Bz+|6SM ϢHYȱא2h@=AL\n: QL^"UFNضCjEH7hfR<iJ5žu+ʅ_S7mC}yX;U)>Nź9-eWd\�cVi"TAS~t -ޜ˝w0uJt4W<yU5"Fsfٽ:\ڏuB0+I jN?wk׎ G&KYvjَ})BۼF:Өڲh€4|#86@a$!眃9e]&HׯSqTGѬ3rQ msRJϮD_U+EДAT'HJ"vc8-.g$e7۱?Mhf8iE*NKt2hc&h%$ւsipStxc`,*jn@IC9q 5G=E*[UBs>)mǵyb8TΫӵm8sS6 A9䰢]We펬sHV;#5G=eolݰ%O&9`i_n;woE׬ PV-z<gÛ6I' " YN@d " 8W l CT@* l({MJI~$yy9'3|yK-FK k!%nSUͷ<*ו#SPYYtWhl~IùݖdoL&IV*8T;Qmbɹ'8k{cydKR]i R-}q,2%ղg;k{A7ӿȖ:\^'eK%dwHv#YvϜ|?spV';knG^#^;v*SuF{}YO㞞2ǬV?ddzLd YO%:ͫ򼯓g+够<ʆe lac(-:<-۪U%xR<)aa/()z'˧m9v,{#1Vu}zri"Wc>gGK2=M>A?(#:VuZkdۨy<i=np˶dk~i'ݾ椞*;qIv֒gdJAiQ)['*^)en6Xǡ\07>J~l6<y\Rf.dI&)zR>|Bd=vstG2_ V8Ғ#ѬLG*KkeDNDyf\!]8B{i1I}Wz4A4N{F%|AV˫S/۶—4,UW)6̨^/Ⱦba_93x/" qg=v"c3?OaJL'[]CJ;z!mZG7K{ugt%ag>/[ '_bIm:o'nl]wJ~m !V;+\gRJK8&k'}B37NTZ9~D�4QmMRNYRsr\I[ZۧG* äx% ˷$Ggw(BJd`;]:VvO9[Id=J8[I}W'3}}?7s|v8}\WuX}ӿ}vG&O_yzi1)eoHI2yeEI?NU?W|AJ=yJPOKeKmv*]Jqcy9<K(9.æ<]R@ڴXOPEJocd8$W}o} %7@>eGη&O^TҗҼ2۵K={\NpUɻ}W  .U3ߗGC g.SguӺ?w+Y޳ɾa#&ǑUJ#{Ă鹘$SR֫!rzGI!= n[CS7:vG)%}ǐ$YM?2~.oY&ȣs.ȵ8N<m.Kir>me[e+rwe@rL#0W+iEw}N>Qr8$jWmͿwwÜԳ^Ed*Z^Ie۷HI-QZ$v&9P>-FɯIs`Rhr8]֬Ty~i/ja5.�\!5p<QG 4:!S!J:R[GHI<e p_؅� 1͟T /�-Shy>4 /J8utɱs6ʫeGyx@ޞY>>?:\��Pc�7<T yD�rz]ypq',%{uut8+~uEb2y{ʑ-G\$= ��nx�)ufGf}zvH8'GBK�zD<������\ s������\]^E������nJ �������p# L�������S�������T��6{|5KӗPJa9˚Rz}ckLȵ��t:XZWbz�\"L.CI*_SXXP?.+Gm: {^ݑfjh#.jEZ:s6uL7;��nFWݿl~6q,D_u>~د+0G}9 =:Bgg:BjG \.GmX.hD_㸚dzC":M֮^w"-mт^j;r$_GuPDDD_{꙱;6"Z ԗ/Z +BOڬ8GL>_׀neD""CƲt:p9_ ɕ7/k9f~*]*~9_ _?9 Sa_wDD(vzYLޯ7RܛN;'r^#P5zsKuO>WizFDq[_ҝw5gq:DDh9~u#Mg{_CQDD1\e'-]wuԣC/^妐_l59IɩYְ:ޮȵ3ayNq(mNgzNo͹ ^NGA~gޙxuo;u)CE;{5]PcZ˞Gн#ьէ[+ cӱ}Ծe""U׺ټw 8h3JF%JrƉRl[dxjl:l}w.LNWzix)o_ oW)!qڒt1j6To\}WOPojμmj;L>y_Tchp$ ԼA@O^AXسU{%N=G_+o^e4rzVT>Rw}8wj/tXyM [Ɣ:+bձ#œX=S9F?ϚqC*9d?ugkւ_t.{N^|W] *E)Gv05ȲRk#)tl G!;ex ˋtDͽ"Ф guw^c{tׄ-U4-Qhy6hRoNz` G_v庎#YfFRNz>X:D|ns䲜 ~O-J'h75mp~2K=+CҸT<4ɫDy]e,vWvlO+׊C~T =p:USV`j^0ݫSP]:-ɱoo+.;K9P_~{)V\Eq\Hާҽ詣/i켯tu_U+5ݪh*P`ժ$5W;랙OiȂњ3hxB̚%]?Rߪ^RSWgMɜO֞iޒl -`r~Q7I3ݦ%(LdzN$:$uON|LO rH V;VW뗝QJTF05m@ [*sN=gC'L XK%OK*%I}t'w{oP$ίNt>y%(#Ǭ<> W1ڹtf,ZgU-j8 mo۫yYKgK:q]OygvlL 'd(Hju8B-{hn}Kc4UIj\>F;|蝶A:[6X<v;MJ~]y,bb$*Z3WҬ2jٟ?'3qIȶ+k6xs^j,^=E~_}x e? @GS5�a>yZzAϷÎdu}:{kj<UU5yv^&Zu*h5g@,tY_Ñ_Os?lO &!og]-t؜f_T~$(y,_D|er6=w_ՕerX?nS΃HT~kp Q=+;}@ժW?!6/K`W:-J~!WPuy<S<Y(Fx1Y*w8]g%wԞө Ր.dVdFqVNܥu隹Gs*~]iyVͣg 1RS*%{^DvVy~.o{-~ 6m>'(wBK~N/_ا'?h.M|Q]ˤ[UeQw>WHʿor;):/cdWdoWR@F_AooA$Q $RSK+*8kEY$9uInkxsrbDc5S}5B9땾GԨg݇*Iȓ9H_%5a U2LzB__ߡo־JirW|d)y6nH�� �IDATB=zj&*x%*#OYTv;=1!6+nך:u)S[(O[oٮ}5~t=w3hλj)zVkڌ[b| 0^چ#(0휶-ǎROggyO-i̗RD|kgʘn<mҦ(jV򔔤헣|/-etw߼hTdEgUkCE_XL-˗Sx3֎4/:PWzI%Br&Y|sDdJzI֓۴Y5ZԥD=4UbJm[Oe:ԗeJ٣i8֣Z6n+[nKish`jȿ+uhSCkVid5i.j;Kُymh=4Q"ꛯvcDJ?Y=^iJ8O?NYnU0y_Ci[ɯK֦<bOozbuNEODOfvQǷvhÜ/շ#:iΙdoדm+\Es\f9MUf/:Ի:O4WV l6[RdeR5H/,Uo6|fg}茩nc\)ߺ| d'׎ӾuǑ꣺}O9/ޛNYjCe~,au?ȹ5hy59T.֢<Uz6LSU<v:*Yֳz O>ĻKrm֙-*r_IJ3O~yW%Oux9YIܫSwUV ѷTbm>yDђ<CfǂTvO%ժR߃T}lGދب5 3Zp̷fy{Pk,'Ql3)N6d3>+S@U5,+z.X[(ЧE? ԉ-G}@2"ogv3U]m+g]II?} +񑊺t.'4n _+}^oe-RJi&mܥǫ(Ez_}ʄyƶoTæ?;\TMZqe%oXY1?|%I&սWu,zR9yI*qBf7mJ:O֘,g:&]quٟTghҀz7IJ['ǰ~[VaTmʲ/ӫxUZ6[7Mo{_*Rj\b[ۡGBJc2+í:b\wn i'OSܹɿt}R-ӇkA<_[mЩJp^v)ELb}HHYޤоs3$dvፗ^Gkk!,XM|K3z֖NwDu(wq09kxǝRTqSի$jNƠN>!8Ӵ~UZ鑇RP"WN[/Vjznns*gYu=D[NUն^{@ OÕ ,vj7iªþIs-.ЎH[բi/ԭWyC}\sz>LncUG4:똢]aGտk26"'hg_(,# ,a\:g9G쟚A6K Uz=nlH>^}XVUVͲsrٟRn4_FyRnzu je [6y;dSWƪLCc;F`.;xdMIEݪSw|ڰ.E?Y~&oqJHEֶ?ϩFg9tlv](ZWd=.~U%Dmn/ֺ3wc{<UXGƼvv.ӨN*,_>dTEiç/Y%G͔sѻDYNǥIHf_(#S!t $8/J~j޸l!Hc=S/NuǙ ֪R+7NznݥeU ^2G]<˘?ԨLS;\VEQ՟_עhKk6;Ų]RIoINƞvy OPi]vY[nSuW񕎟S]*dEaj9=^d77k{v?=i-JGW]N^ݦZɣ6GZM6Fi/KOj#]E^.5F4nAu~_Z&g7u#N'IeZޯn YRJõ}P~C|ڜN~t(1EYCԲk+UC{iײj:[&n3S* ݡVξM>JhκՇ6r ؏)ؼ\aj f t4ѡgiɌ 㼜].I=E)ۢUFm5U݈JҔ:Pcy;pYa35z SD6fdEr(ڍ0(KTbu(!ïUfSJ:_M2٭ X.ZJSwiYO?_sLKI~q6?^VVwrGyBnPM2/-w6Vjز{%HvV ؈Z}a>V=C4z __AcEv2;&Y<-ݮB;p$Yi,=;ۀ"jPsXOv=;~aX-W7MdM{&/ཛྷetcn]hVulU'VoWar%SSOXEJ5ծ/ !ie֏"4^F%b]GfyC74}1?_#]ARblR߾:ye~ҷz+enIdKuv$hkúmgٲ[KώS ]w~=P|Jrժ_uA:IU<]EYEj}*33Α *ٻB-6yH*׳*ɖczۜKtn+dySң<Mw['k;GPQX[s=35Ev9䩆fjh}<Bd.@9(p?�rΌLu8Ly)6,E9w ,#c2ժJ.*WNjuv#3mOjW+%d>^;uH<fw7@I>='S2~qy=|sZgCunm6:.{%D8o*D͚=[3fjXs?+O{Tsp=;eіy3[rVWտ: R䟄Ƕ航kNjQ;LUR✳!\W왠"dRPa}m\OuЭ9w^M*Vꅩgnhq|uYR5T]Peq)?/)):IPTֳt=)b׾u{b'7  kZ`/WK>MFj[]T>oO$K&I.P{%랲L 𒒢b_e\j%ҶxN�n<U:P?־zΩn(L 77LwGVl̕#Yɒ<)} 5|OUҩo>ֆvןȒwk[;(uo*-E[ї?vJT-!sysp^δ{?Ge<˳t=+);x>s.xQEKUTҥ*W[)kp<g[w1+:sϟKeU9YC)g~>x8]Fy\ЫL]UL Yk֎_K!uU9#NWuv30y*TYwiͲ*9J>KQ" ksUJHjm߳_ፕם[!_ߖ[T߻N˚E\ϡK>z=LxHهj i4*<M <-9q?u̞訽fWny] p,)@{ւ@.jS͉:whv&ԳO4P P}eVGE݌o2n.g n=*ɏES֬G'ZR,P.圉nޚ;�B[X_%JjS%jyM1\]DK0@j/5AN:Uxl}ڨj{_iKkVߎ~D'*֐:wRȿlU ߢO*Cթr~`\ߖi UŬ>% DgrǞd+ckzlWe\qlwt1=4GV͚JN3?|˿{Mm5H+~!p]~GZYQLѤVuSBq;t֮+~TmpqZ4+z&sZ̒+P?۶=YqiǏKdjn2\5Q&*W vsQUELN?YTQ"I>.x@ߵϘI ԯ/}Kkr4\q\'0*ghc5)MC:Ndq>QSU |˰HS=1Dp'mv^GOxyV*oln?&r720/,4#m,ӮohN_E*qe14m{Ic?g.T:3^ܨ|R_CgwVګW>=GꕀATG'x٨g%2tov[;Zߣ^Q̓e]~&Q7jd`eFwؕu@OFЎ_5Ǝr\]fG H.^(VWKE~*u%U$0gRqzMSYuѭt6B mZIU-}Gtկ4L%=ndi_`i$rN+pf.~FΝiwk"$JP{(.M{V}Dޚ;MV%֦<o)7-w LG5{EgidIf&uKdG=UC_5[0F;:y_Ku%M1 詵ݹ-|R'V{y9&Ht/qR*a2+Ez`4 :Imǥc-6K5F7af To74z!C%vןQ+Lӯ,Jҭ5`d jWR:^['=8-FCZgnxW=_׸7g4b$Wl;]i>c <Y2+bC}~P{C? ӜjfrfQ`hv-Cd5Xek4P1}r'i\5.Ѻ5l$+6Q/YIv󪪞NS7<]* .s-\5\=*zJ9= 9嬥ٚ(AWɚj=x.^z;Ei*O!TV uՇv_9w1arβ6�UnXOe~^q/̗dVP&9~*v3,FqQ"N$@:ӻS)YYL{ KlfW>-idX<A/̱;:􁞾3.lurJ5d{3 G_gS*uԤ%B ?>&af4M~ѝv%+zHsڻ?*қ#G #Wh=x��aL#r3-/PP?Yɕ��\SdwX dm}p&u R:vTyU($ϤtmkdM��]7S?ȲL \Y��\KcbI5sSWJ|')j:䫐ڭ䁺ԕ ��*1FfZ^ 6\������5+2������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L������� �� �IDAT�S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������T�������00������� L�������S�������]۷v�B˔-"�������Xja�������{��������������������`�a*�������@ ��������������������`�a*�������@ ��������������������`ǕHllN>D+1I,.������p.;L=~ℬ4UXIEbꢢZŸiŋ:yRta ������,)5ժڵklJ, mڴI/b������vY ɨ()S V5uta������,uejbb-*qs87`<x������\˺nwpU*\X,a2������HB������˺_սU>j>N)EI~ťҵe <|.km�����p30KX9>'gSؾD?{S|G������J_IKߖV ZllN} KgHrjժU|;CũSNѣvYn4[lѰa?+S�����p3(+SnJIHq$CڻVv*K|A\ u1l\R $EFFjʔ):tz9\XXJ7[lQ|||a������ T'~LV6Gdh7-{XX{&LД)S ( ӌW\\\XR```!l7/od>ϫ+N�����_RW&&Ii6_L;)PZPcƌQddfϞ6kLSaÆi֭ 0tPo^Rz9l0:uJRzX;f)>>^'Oի3߿w.)Ё]vÄ7 Eyf{:th2_^&L]v3fL9xi֭Ӝ9s29<<<[ ������ܬd.T)%AIeZ9A:w(=,u82^zߙ#2-y^dڹJJxe˖E)22R ,Ђ Ծ}̫G3ϨzZ|x f^9{l_^̙3ղeKM2E[l6H͜9SGV||fϞ׫{Z`Zlŋg7**JÇW `OW֪U144T˗/̙3UzuIRծ];I̙3s]5 ������\߮mTY޹WeSٚ<*7e+}LV6̩{Iiݼ_ m29Bj8-;6$$D:66V 4А!C2?[r5zh($$D/^XFʼ5<<\ӢE9nݺ)<<\ڲe֯_m!!!ׯ$iȐ!Z~/UV-34Tjժi߾}Zjڵk!!! Qxxx/×sy�������nW5L5EG/ӁrDv9$]9oq3z*MR6***nݺiݺu4hկ_1**J5KWfe˖ںuk.+$ph߾} ѢE2WddTZ5乎}f*a*������nW6˫wt| P׮-vjv)K@@;>>gf[R[ w ]j[<#֥VŅ[EOkV** .mEuR K@HHsyHf2]y]\gg;/fٔqׇ7m/u#Kok\+UDDDDDDDDDlgj}SQge77 u6n mcVy ׅuV֮]ӣ>_TTDQQ3gdڵk)-- =.4n8�JKKCOݪѺBtLaa!BWqHIIe˖KݛXԙ*""""""""ǃ}UBz4ߛ-wp{W>Nٰa6l`ѢE̘1O5kְh"~?~PhYTT (++3gU'L Xf eee̟?m۶FCpSVVgѢE9j̙3CklEDDDDDDDD7=zvR;G[~Qcr۶m̘1d&O+5YhQٳg8999̚53e�Nuuuhߌ3;wn^{-ƍؙi[ >3fpB֮]cpԜ~cpTqB]wƍc…Q:SEDDDDDDDx05|a[ 6`44u6};m4;b<5 yП)..fÆ �z &uVRRRZ=JGn݊ow[0}V]b&N,mk9b -U """"""""rԄ$ۢ~ 졣~vz6QعC=d'u&vzqdLs-WCԞli۱Cc.Lj6X綤T9l `N6�uw<@zp�&5m�P|sW&|AYDDDDDDDD=*DT4ίk*,itIOJJO5SIuu5z"""""""""]ҥ\O q?;XOEDDDDDDDDKԙڧj?%%%׏$.Ӫר39HIIOc=%.r򙗗KEe%_|V]v:S8ny^GZZڱHuKiFz:q)f """""""""".(LqAa SEDDDDDDDDD\P*"""""""""T0UDDDDDDDDD"""""""""".U+c= ڻ{eiq0 """"""""""n1q"�8Qvwa4Ay}Ѹ_0q<\8mض8x<e0Ҳ, 4ML0 RRR$#=xסfÔ'}ޡEDDDDDDDDgfT}N~?dffRx W7!XXSrP[[Kyy9O> :$\as]OSR6lUc?oۋQ'M*m&e6ҽ>>80#--An:e1tJwhg$=-MH/;_:Ĉ#0M3vƆN]3xax^ 9X~Ԩ畗wK=a?XNzZZ'"""""""""]ٟ/^#G�mpn]c8Mff&555QnmjϭzZ_[[av,Va,<-܎|.nF:ԩ;1 @ Z!@߲@DDDDDDDHg:rgkOϥ4r)iSz;k (𧠠]v;PEEcu}L@ a*˲:]O;}YyԬ*TٱVan,;US-xuy-c lƦG]:&##IgŴiy]t߾}ys=[Ӵ|4666F8Nz�< o**Ӳ^o.z_DDDDDDDu5f˜|/\5_Ϫ9Ut9#7Ԕ|WS/c8cSSy *6w(|= d哟J]Ѹտ~ge<`$0}<b0qQ\q3O? 8[zmmcYib[Vؠ^| !CsH�^#9) &o&e58aygybv|"""""""]<_c=é 6XI㲺7;p/&LRzs"ruׯT{C͖}[$=8q^W ?y Y?lz&AӋ߱p#eTl!?reϟoٳy7+yh޼оo;wϜ"5\W x ֮] RM["q'l=֭`ܹ0bDԹ""""""""ƛJУySwQɴ:v?.+-`_0kʐn>Mkb+E|2鲫< ŏGp=5s!SO: iR>*@C9}S20c#?fWW)\CxhyEsq"GgMj?~;DE]ƨa+65j:f_3{Ĵ߱쯟_1gJ_5<]~țd~L|c.~Ȏa~gp9|hHbקΥ @)/v+36o>5OY\ rX|j1^]Ϟ#3:.?)o3Oyu;:r{r`ҥ8w֏IhնcEEE;wd̞=Ag�EBA*+q6Pm6T4??0UGzZt0ڤ0wI#nZ.Ll{\yq'p`K,͝n</}~sO ٪`kKYQwr@^^8Ĩ\M'f+_g{jO:dMN3GfQu5L=GۍUf1vsm?;¾!fZh,oB6{#ҁw[֥'#In_-aœ)p*?$g,YGGW{gpSQ.>L3ᡎmsof�/f#&e]|ۊ~='02O8evZkyZl-+{.h-Z رcqO?+W�S#|=_DDDDDDD'ܟ1x ״$ G+CS0J[ǿ%9aNҗ7bi4_2.{ǎ"8qg3frn&3Vsni#I4:_hŪ<@|^6|=@Ӹq Hid׺a4f]&a|㴦~ '3b.o;S @fOc᳸m(RG݃F2v( h%Ϛȩ=0zK75yۗˠABS1+_>dNhxkA>zOu{+ ;L }ꫩ%11%08-3X_y$~ZOhtI̞5[o1GrJ/_~t1vouڌ/""""""",|e>3pфa)L-~Ffl*9h/Jqr>GTF6&|a&璗G`6QҐ7G+v#K[wQ^٧L1 :IW*x;qdn {,~ g\w ZM[g&#i~@8;b]xp3{;]]\ÇX_U_Tu8 Pۀ2-ວ?CmOIZ:m̚9t-]W[Vq-ylܸo֚:ujNjPO*++yٱc˟}6H |{?f*'FNpg5/Ľ/|H3cD(`xɇM1<[gzIAc]\TWaM#/j+jbim0^�Z[q >?b]]%sbÃ6x|Lͥ.';zD7x>ڍ57%Ul%Ko6k5ÉؙS3##͛7>h JJJsݡ5Ft[�4~<rK}>[n/Zu4%RX;j̹nvm͛7зo)H?2'YH@_|{5WF2[˖ }FQ̡d5lݸhFG+>P�5vg϶S<KCƠUݞd%/TZ[@3xBq߭&P׿{ops / >k| `F2~IkvG0C4w:|'tض+b?h ~&Lի;^{;~+RSSo^yarQQ$qM7vZ pqmhaai;g~*^JKKصkWn'[h|nPS ͂ĈM' H+ټ |H30R0er~ǒ[_"Om2|> {&Fx.95'McҰDgUChhh-caFMo cͲ<*)c)y ޫ̴s;gqQ78ky<>N{d lb=<wL^9T[I"/+8$#7O~^qq8a5ߡwrsǍsG·hUR?JFE3V66W3dTvR#e�\s OZzm SLĶ,n ޽/w j:mM8!|>/^xa`ha#o &Nȥ\|?""""""""XF^53px%Ar.tƧ@<C/ͬ,[_o$~|Ӿr-NHaqyicw m`&`nђ~dUZIx=&f6,bɚGsCBx.8?}ǀ nb<xEH =ocG 13S:Q|uW{qq>)^X oF2;-u)Xʣ}< >>QXm$xXbFwe6U+Cid kgi6%^l)))!//ٳf[73l+x,9i8D-Ïֻ0ͽ2 {߽1?͡ϩ?FouҮy+xo}fW��HIDATE*Nwotz;K]mɛfsx{ÈrhG?7bepuR*ЧTHKM { t4BԖ:ROZj*f ㋈j^OnƖOǟ(&}%ちiW^HX~EIs*E'Qi zeoԟw/5H Jٙ<V �G6}j鄸e[m hJc\zRS{v|Sρ-9@YW1!sod;I(J4Ɠ5 RifxceQR, Ƕnz{ * 0Lî9ˆCM˲ؽgzŒ_SSCa UEDDDDDDDDzٱZEiŦ?'h4MLi<^p|c1MVM6ٷ/96M.c}3/"""""""""=Xd7 x7!;;tL1&e'RHNN8`mc6մxlee%_~%eeҷoF7j'>>z㋈H8_.`Y~[P]]M}}=55wXnoDP0x<IFz:y䐜fO}}]zGNN㋈H]dMlpQ N<؆ZOW[ٟ7V8i[ٟF0����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/images/exfalso.png�������������������������������������������������������������0000644�0001750�0001750�00000160760�13112005742�020313� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�� �����c���sBIT|d���tEXtSoftware�gnome-screenshot>��IDATxxUUG6c׮3^^AAʠ82& t҂P!I�I $7 F$ޕ9'<k9{W;]5'OaC׭[dPABQEQEQUKSmڴiٹsmذ!ҀB!BH}azGqqTVVREQEQE՛.]$'îJX9EQEQE59n:w֭ xPEQEQE5֯_Rʠ(((".\(((jP{ЀPEQEQոEQEQEQ *((߀TTTPEQEQE5h@(((j|R^^NQEQEQՠ(E 6yƐr`?`tJ_0Nm]5n3f9(j(>ĔSʋ|_cCʑ#GOˈˉd==;'GVo"_Xj\Ϧ)vnn(h@(jq$TjCX\oꍴܼ<9`rLeeޓ=pnk~Kye4?/z$ضvn㞋4Cpm)�.,*oΒ_6o}22hd=D ѓ 5R9�nէT϶K]o{pBun׷%Ve3AQTβ.ǐST1wWgRZZJQ쥵5>âc'C7IaSL>ްYoΕz|;cIψ1{~w. FgG_`'95MFL!~>T͚'3jC&LQQt*+ʄ>[z οa`гѠ&Tr üD=.=f4ueI(_l2wJ;r|d(-;Tm]zu_e})@`-U=<0g V-pUF<Jie$m+gZiឍV9LPr,ŷj5|4 EX7&'[AJ$Cp!JY95ʯ&Ny~2%'$ҏ'q'UoBy"K֬3Tf9_P  shgѪ2ԆDF@y_Rg.Yۭ+Ks(PRWoRf. 5Lu[g[XyT<X`nb7]6J#y-ȑ{O3Ulo-%(<R ~&(jDJĔTe:?_^Tl@CQ՜eTc{ҵRb5Lf>8F:dZa31BT>'Ҵ�ph>eRNm(@PxyO8hUjI8Ǫ[#T,c\Wd\0?(CinR=ۺ/l09Z3,\8% c �eX~^нž_~Lk^PO>ELi9ֶKvh@(jA2chy`gRmb@,Ky`3/@ l̔VZ˹s2kP4 p U(i mkbe-ճbn,a@2 C90 Dx9rdx>3I*-`}&(r -JCb{W#~ـSE5Kah$al?><1Q-ޣe*O9n+T!mXn&MWf"%Mjm{U2tT=ô˯i*eO꬜3x5մ<ᰴm-ճR[YDE`'̙%8r-\ٻW)iUôfdν>P3\Ɲ^?E5̃P+U|=^c_mGBQT`a~[vyKc kJ;T306߇I裦'c1ۧNSgL&9ˋs 1X i]6ϝo0U?k76¢b,~?OWeiZsҶT϶K}~ʴ{2 ' @/ħ_}#.PC_{ ijNI`hogU@3~\ EQ/sBTYpx Tg[(,jq~-X}΍y�8c,іlҶZG0?wi srX~K4~o[nKlV֮I[XqЖߙ{4mdJKku3AQ՜DBQEQEQTB(( EQEQEQo@ (((T4 EQEQE5ϧ(((jPрPEQEQ$//(((AEBQEQEQT\(( EQEQEQo@rrr(((TYz5EQ-HΝ((jtr((BBQEQ !M((EB _СCEQEQNK%W @AB D@@JPPEQEQTF5 .S13  0(Z  36 10 !ˀ)QQQEQEQ /g8m@BH6 h>0bbbbcc)(K @|8 ȥK$&7le+uц7~k稬�Yj͞cdæͲ\w}΀ C@uY*U^Ѐ0 &EKEtt((O @|8 Hl Pa)P0!f11Bc{T 6&l=Z>~׫I)r9sxЀ0 z?7g|a9((r󓅋\տH@6^6=.*.VEEj-1>f}y 6 oT%%%&eFϊ۲,EE: q€h9 ~Xn ~SEQ% 0.&qE 50 V 6[;+-t,_al%Y^].'9%'i@bn>m_ZPĺjz@k i0YjUq1Ζŋ)_~'i b|F3agQ?(TVWK߶qa4h@^[P~\&k~]'GBBZ2 HMݷ& HXx>h>G9 a-޷_r*5UM(W]{ AUY_D H`>j{a/` |s 0.>On߮ HӾW{My`A>z/^*P0{`<t*X'N&-[jV.լԩTٶs*ufVOBRGL5fZ[0ޮMo0_{^k 15zxھco7gj`xڭ"/rs77BV[^O\eej1FZxQ]+d԰]wϛqVbXRP.=pBm;ZgP#( :?XTs}6>n^Ybgfϛ{b6Ϟ9k(/7gRkBi2u*~Hh2#1^&N"^ԽPv>}欪}Ǩ5G|3yھQmvZ [3�Gm R?խvT6^n[-]}@_>\qI絻*�B�y b) m2 z-{uf}Fu m*>u{^xР=NG﹣Ϟ#eo{:ܜM !^ HPpp1yNjСCj1 povvW5ZV x`drOy;aL wz /<h~(PjpTg HxiyQw|>> ڽV?3 +Vغ>{8/_& 4 yV*C6 ;vOGZn`ixLzS3eÌv՚5cua< E;GO2.VC:hV]z@ϷRDhݖԘH93B,<h7v- rvl{:LB,= m}Om5|V`~͏z@p/hte�VOdqp h?UcxUuBlD3AA-W0 Kr8RWb3t:l !Ҿ{n֛==Hۀ8/s!-j0怠~~jULlݦXzOP|;~*9 }?RvxxhEZN3�  F*т X0 i@vzzs@eaHCG &N||L s /4tę{=wvۑշq=_$tB H _|`-qQmBj &ҫ[}OGVuקj,^^ )hU*Xb~5L 5ZPӀ0C>ڵ*X i@3 uGޟ &NcU}}|d?e&:9rOy앭!V/s^B H !"%{YMWPXAQT!œZʀX3!OװH@a5 !0 Ǝc41mܴYJ4%H Y7E55aS?(S'wpJȃ4k&0QVvVjߩR/ [1|1jNƺ(տ|5 X\q<]5>l`<0= EQuu,K{@!b@((h@!4 EQEрBh@((!Ѐ((BH>0˄7?j4EQT4 Bh@,~@i 1�Y(W'W @AR *s2.wGJJJ=~]usե-r�EQx)//UXX !!ln{j.ܹ$%%5h|%Ȯ]ߖoQx۷dgg.]QF.wq|jzWs43!BiHh@j+TrsuIIIobǙ0 YYY2zhy7];#^^^RTT?\:v K,_~Y//_u453@B!e% @-K~p, 3<裪5^Sw4*++eԩc>}HqqnAAr-&͓zH\+4***drwٳg[A/B?v֬Y*=77Wne4Ο?/s Jaaz믿 ^jժ[� !Bh@Z�nc>u.mx,$7 'G%C"}HZ#[]vde,&Ol(H6mT+>޽{ˈ# p!K.r}߄ m۶Ժuk8q>i$~i=ݚ?~tAj׮>x`>}~={Lz-¶m7ԷaFNffao,X@.^`3@B!^;4:i*菜 >mLn馛g}V?ogddr[&BtILSRRL<j ?6^[3 8ױcmGQ=�=%ׯ W=:kV]wD=:!!! 6 gB!4 -#{lx,p, 3}D8CƓx}ҭk<|>@=(3<#v-|}}8ps)-omB!Ѐ�~lsS+!o}14Qj�;5kW_�tiubaNK]!B ˰yHM?|퐴㑷ILǏٳ^ ȸqL`y[Z3 8xO[ok\\p.ԋ%0.`K19<dȐ+b@mӀB!*dn>gh|b  7p<ju} BpC ׽ks,0`~)S7y?æpmu -  o԰)S7n^xA9z`B!^9~s29 +(yMw?HB!Ѐ\%LүVBޖ VªNXm K>\Oϗ~Z "4 B!LLL)!d0oC0jYYB!4 ((!4i!aBixȬ_B!4 4 Bh@!4 4 K!B�K!BR,^L2 HSxV!Ѐ4 wlfhB;E]oc\4r_z5_~]l}yY|REEڇ4c *"ȴ kiMni 6ӀB HuRZZ"e $$$X-_͵{W@ؚ"P6>]w%;w d?Yj1 ;w?Ah6d~FEǨDs j_dtƱr% ܆U޷O!Ū+TrsuIIIobǑeeeeѣ7hPrg}VMހDFF=#;v0<Gʌ`;**YGU{Uk*Ucpyh޳`鵵އcTk?ɺ $&6Q -[AQYY)U[d-**Rupߴz_lc?gGz!aٸɂ?c{˒8$<qssG}TnFy$&&$:u<crwH>}ac@[n1I7o<Cr5ר}W_}ݧا3;SϞ=j}fR鹹rw+S�80`�eƌ[zJ?^>}Z]3g1Ct/ݻwW[[nʽo>y饗Խ=\|C\]]M-ZHz, Hn^ l5{OQ@j°hC *Al\!!5LNC#ix6.^( :W?7ӀuU'NV/8zsC!4 4 ۘOgm[*!?K:M<%>dć oH-.Gֈ*3k׮ɓUVziF Bֻwo1bCD1>һt`„ Ҷm[IKKSjݺL8QO4iJG�[3 Ǐ:Cڵ,ӧO׏ݳgtرViekcӤ!Cdɒ%U(,]T:tz /J~~*k~͛7>uja"SSSMaoh ӂĤdI2<xK*G |Vφ!܀sҥ[~]nҒ_XXHR@VyxRkXgK zKlݿ<7BB %˿?M3h)o#馛m /ZAFFjie@45SN`b6'COxmǹ\Y@>-=11Qy}zJ֯__aywm7(|Q15j]vY<?zKd?,\ 7`b4#S\ Ȯ=*C&Π+Vdמ=-C C=T njeC_S rrs#\RBh@h@#{lx,p, 3>뮻NkUikˀhA40�8(ǹX >@=(3<z)K{vZ}{͚5&)Z> -–z$ ~[/^Tz`0-DdmyyNO/}ٜ֫&6YS)N)ce~= ܵjիͿU#T=okFECSBh@h@F|(\J[_.g9#g{@bcckW_U?Z!ͼL̜9S 96zDT0)7hu[-~hqzb̴h4cbeʀhû M>7VRDz``zҀW}6=]0?Fp8P3˜LH08T=[^0 ̏sC!4 4 ˰yHM?|퐴㑷 G�&::qƙAO�rh`wp5si߾}Ī\o߿vEGM7/ӂ ns9sm Ҁqغu+LHwܽzR& Z5y_a6[?[U0 jGp$g hø̏?q2A6o*+~^yg! șgU=X[ካ`9V.\ПŶ3l!sC!4 4 œ}Z yˀ A C˶mՀUxȕ'{6WB>N;eM @Q0a׷~???ykĉj[[bɓ1 e|Թy]Y*7 a5,LdSX Hs /!R4 Bh@ 3u553tN<3uaV|d𫍫4 W>@=pPKJT/zC`@ӀB!LүVBޖ̰a^Xm K>\OO?u5qՄg}yF4 Bh@ S?(S'wpJȃ-[P% ߿ ^:Wki@ ~ !ЀBh@ ӀB!ЀЀ/!B d/!ۀ7?4 &)(j(Q !BBBQ !Bh@(GaQğ8&qGc$6Qʩd)*.=!Br4z1gΑ?&]~�Wc\i:x1)-++6sU;ϟ?!B|5mRZZ"e $0(Hf-X5e}@ SXvQOI j@U4cWK.IIIJaQK~AIvvJONI}{Mʖ- 11MC?XIc۶mҫW/IIIԨ|޽O{6!0`�eEB |CSV*ٺ So.RLD{kil ɑ3.nA? cDEG(󑒚\l$%'JbrL8JnI޽Kr fxtbgy`4i&yk<xL6MΣWz{9r#D.^X{9馛_hӛ:;w~>e޲d' ":c@7%9^&_I;._gIFy)*(qOד,>)e+MҗȔ r.?mWrQ O#*O }׏?KpKҋ]xB >^P$TzPir$Xχ2l(<u}ַ3.#m u.8[2 /Hqy8YgȨpe0^\ϑl2D-.R|͠;ݺuv1cᆱRϱ+ ofs嫯GJYY,ZH^|Eӛ:C{mx,$7 'G%C"}HZ# UäL ̖8�4"D#9V [r1>L,}x# A+Jd]PkPUҭ9\|C: K?vƠ> _STN282˥ߪd=v-^ v-՟qYo~6hC*Z? M݀DD)Wz<NJxBN&˱[$^ h]r1>͇ tPYY)SN{Lӧ󛫚PyUЮ!}r-rˏ?(ڵSX{[oU=5TWeРA?ʻ+*v.vm{niժjа5kʪq:|MO:%=zo]NUF[e>s|rwg;wVtz%P^;<<~{5\okn}m]τr 7(c{ Gi2:6Iv4͠j3uNO]f-:!.i2`u;:$#5Nl霐/-g/Y e\^c(Za ^gdsbs0dkWߖ}o~;o#b,gn@« z<s ʔL>'$U*$+79tOJZxh|uiF 3͕޽{ˈ#Ue6gsJff a�nF9{+ _~Yk'd֬Y.2zhi߾Jǹp0h0vC ٳ5/]T]/=@Z </a~̙39 7c Pie//*F�?j(1o<5ܪuث{<?]V>C]/fBdݗM?ecDcy2xK5*omFf00$>[ bX2kYU]k0jsSvԜ exv`ZԷs~ٽfumr| z= υj]GE:) Uoզf@L?~ܤu- ȑ#k[ڭ4}m'D ΅ Ƀ2A q:vXD; z�z_PTC@ݼB+3@ L0kmrJUVڤ[{_{aQo&M2?d{֮E H҄ϻe<[_A3X9b@9\h)9^&_oHq 6 =t,ؗ!KΩz@ڼV}~&f+5e En\s`T\6%'9VBÎ\5C=:kV/Q9;y1?ފ�S1qǙo?#ǐ Կo3a<hIoݺݡC2o %B #׆b>}b^Ke0} 7@c??jow%01)11tc,Wf< C]/z!4 MFw5sF#e_;$<[_d_!PdkS@|a9 %j.0y U` wZP5;)\՛Zxsd0?8,4u\IJJ3~$Wj.; #j3 @m {X seFc Z50楗^[?cYjz'-mr&3yd5LK5iiiVρaZ`0Z,sHi5Wwt7[Z{ Mڻ{ugYуqDl/osZf1}ߗg 9C o}|{N/^dC0Ei@0ĵUxV^ 특|rRQXE s3!2_ e^]VUu_c~U?(Yh$$4*XRC.eFT0w-YIg‘F3 - c`K?mVSQQ&7?%!5=ZaB0t??z+J@@@ז~mհ7<7ҿ5pϚޓ-[lm�`":?z:0_=!XN uϑTf̑A�L8s)0tIVXϓ5Iڐ*{X{_{a17sw`b70n}1K.g$iigɲ)_Ț_:%YGaMQ2Bs!-w@UHQ{Iyf)=#gwΔԸ`9}df6 8Q>`1c̭   h8so߾~7,4TMF]`^&kh֖5~mi0008߫*7nzyXx`, BkίzX/QzTz\\t???eD}xOz˳~z"zp^~s|AWBg/kk:= `�a$ad1bų~Z "Ѐ4)}6?jJ?<ےÆV²È>t;)s+'m@TX9wJ1ɏ(Iсr*55#H`Ұ'k׮R`,![7~ceB4w{g y%*`9a8Vꕮ�Fи/ӀH2d󺕲eE{Kʱ`IN:)钟'%RVݗ$(TҀB|L"p-G1e!4 EрDFEH`dJyyTVZ e{ !D=0:y1Cjh@tr 9`CkPmB(B!4 !e}PЀB!BB!B  !Bh@!΀Jcw4FbhJ"DB!0}TY-q̝;Z'_M\niݔ cR~&X^`>`P23<^LB HeO<. \5i5VkjwutY4A24 GtL!’b)*.¢)(̗\/̓,$yJ-[&bbDrB Hdzc ! FVV=ZxfeKre0`>RRՐ+DILN 'Tz|A-ɻwIRn0!WK�ҒW6B ¯=e~ ":ɣ>*7xkc[YY)SN{Lӧ;-b>o<y衇kQկw}Jx}2p@;Uٳ~"_|;k,)8r[Hy'T%ҽ{wU[oUufR>{mX}K/ʉ._Ȩpu?^\ϑl2D-.Ruv%)4QBh@IBvJ9MN_>$$?5Vr@9'iޒ!Q޿|vUU:ydiժ"mڴQ-v{-#Fp|Hҥ9sF7ai۶)nZ&NO4Icދǹ?^:tkNO<xL>]?vϞ=ұc:۪×_~Y{W^yE~GJKK%??__~_{cxټy2jN}X H^AHL:) P 9/nC{%(_bcWvyEqlhSssi%9f>m2Bh@Z suS%tB8*A9eoM7ݤo?rq};##C}1Մ/N:IBBIzJJI'm6Oes;vLF>-=11Qy% ~z1 pѢEңG=?WWWD` wo,?, .Fh$ڀ#;7ˠLɔsAr|\2K~C$(6J3̥|[= lk !Ѐ4f}N(AJ9 ":ekk뮻NkUiy$VƲ2}V/[kRh~|FgQ=#ZxdffBBBV{n{R] c?W5 ARB|Tĭ _gcanN-K{˶' e(C!4 ̀ۉ1 <[_A:Zn//Z}ق yW% @>z \G}$sQ$>c?RNNZٻn{ֽ@ !5 a!r|@~K2H-9ɱv =sj\{mO6k!~me߈&9$<[__W]GU㎣gϞj@ƍg2� h`8 `c}\ ڷo_=1ޒ7~Zx>[�-ouۻ7իW/ejp< ȃ>𽲷}PJRR[%|xVwIi0IUe6gN-ս6=d>-a !Ѐ0&i-[\1N yl160n^mV_h2d>[Ih {mNDN2EzC1&B fP> @=[<jK 'ZE1! Z VrKU#]2<fKVR#!f@SKu0-i)/ e!17}hSB >&ͨQX9AT ȑ)*x/)ϬZݪ􄏜9SRӒuڀF7{RЊѷ~lOKyi@(C!4 -q!Nl?)!d &bb'V>|0 e#U$%!V]#%)RtC#7JRtJMgHnn0#f@a !Ѐ4:~J-<ے 桵jM .iY$HKyJY2SҢ%X$'tY͓)+äK|X*i@Ue!4 &KRb0R^^& e{ a !B H^^2!tHWaM~tB!4 B!ЀЀBh@!BB!B !B!4 fj@ %1;#P\RN%KQqo"!Brؾc̝7D}źrqS.wK5Հ?&7>j,6sU;ϟM%Bh@/T?(TXX !!ln{j.ܹ$%%5hS/#sN_*_a@c"KQqHAaJ~adgg$۷Wܤl2ӤL. /!zcrsu"\Ǚ!e,=z 5@1괾EFF=#;v0<[ʌ`;**e0`>RRՐ+DILN 'Tz|A-ɻwIRn0!4 W7g!+²q_ K%c?qH8yי`M}Q^J:u<crwH>}/SrIyԯ^s5j_yy|Wr})5iTTT;Tg϶!_|;k,)8 ׷i:Ոݻk[[n9XѣƯ /ZHz HdT2ZG^~HN^fHD`IHÇH^o)[B!4 1: ڶTB<~puxJ|~A![$]x-KU^g]Jrr 'O,Z]\\M6j޽{ˈ#bz@χ.]ș3g}&LmJZZR֭eĉzITӧtkCPvc#;v@!Ԙ^xA|||Tϩ &(55dfo@""Ô+Q=I'%J<!'-zhKllJ.Oh0~ -siɀh{A)n5~ C|/۷o3fs=re@yٽ{Nثk{ `H~[.\P<򈺟sέu!Ѐ@\G4AMSy\GTocrM7ݤo?rq};##C}bׄ/N:IBBIzJJI'xBm|>6^[3 8ױcm3z>�zJ֯_ Vz8c@n&m7݀Wxdf)9}N27HT&{IVor萟Fw\f!2 ab cӶ_ye@"""S_z%9qCumqRqYoqcڴiC}"ajA!4 -#{lx,p, 3}:kVomصt} -++ӷ8�ǹX>@=(3<<{Am HciHH۪5S++i= ARB|Tĭ _?-s=66;b@rrrti  -cok{ `ב7z)cm #>mcj%䭯`A:Zۜbw6|צɫ*gK sDX6Նx?8sC Q"zt.W9D*S.tْ+aG̀8c.ږwĀzޚ| {״m6_zL?OյK 04Nػ58A!4 -aeJ~!i#o}W =:GGGۜ\2n89 0Cc1x؃� 2Ҿ}Uz-ٿ1 UuVJe3`|,&=l&8_Kb#@mD3y gVI2]wGRjY!g@K[= xmlnZi@l_>/_. ,Ps%k{ umg>!2gh7q3VB 1qq…C1y:X-vC WkV<me+cUoSL믿P~ g] R_u驂 \ZjqN䘈j`1Ƽ<%y HV|y`)!2#Gdx̖H3�GB̀3母 :^/9+9~Mt+?yU##umqc 3c>نBiY|?P9ԅX ~|>V5j+>(9T; E%U[;gJj\>sZ2U_(f\Z[ /4q_x1 9 شi!AO#umq9;vj`A0 Be'Y5_-a &{b՗ÇiXQ駟Ve#U$%!V]#%)RtC#7JRtJMgHnn0#f@H5.Bh@-S?(S'wpJȃ- 5@ Z)﯏&]O&-Ӏ)CqI6[) \fJZ 䤓n0yRZZ"eeX)JB!4 !%*eRYy0!XЀB!ЀԊ\eB鐮Ú%,<TM%B !B!4 4 B!ЀBh@!BB!B !¢B?qLH,mSRT\ěH!Ѐ*s2.wGmr.+ٔͥ:r< ~x`>`P23U<^7Bi.Q~@Saa˲KTv [SC뮻sΒԠA~c ]oʆ)HC%%RT\(ERP/_'Y*=9%I277)[L.B!4 ͓UW@UPg~s!Bg0 YYY2zhy7m0uJ0$*:B d5 f#)9Qd pPbwK]RtLHS7 4+7"X"//O>S;I&9k.yox@k0٬xBi,/YtloY2cy GU_VVVԩS;C#>r-ϛ7Oz!kԾrꫯSkӨ/{Ϟ=j}fR9 0Eϟ{Gm@Rf^_ҽ{wUztMzJ?^>}Z̙3jرc*Ȩpe0^\ϑl2D-.R|9 H32"ϤW^ԣG駟NwKKǎYBҴqsmK%g ^'ѾI\ćP?9-1E¼߲Tu&Xڵ$'' xҪU+=EڴiQ!ݻ1¡/t|Hҥ &H۶m%--Mu2qD=HG[3 Ǐ:Cڵ,ӧO׏ݳgOSk3/G^xA|||TO 2D,Y^/^XKCm$"2L㑘tRr2!^"JPFc3ݶ̥aiLhG&`2{rSXX!&^;4:i*菜 mLn馛g}Vo)׾hѲo ]N:IBBIzJJI'xBm<6^[3 8Z5OKOLLGyD|�_A H] F'uQF{К!$݀Wxdf)9}N27HT&{IVor萟FgmKkτ -݀dffxfovٶmb#‘=dx\6I<NtH8yי`>]wҵ^02}V5coexgT�gHƀԥNͯͼ5ڵ=CD100Kh!7fk@"Bu^xI[-9['E$ w/ {ۖL8ۘВ ȿ/O?<gDDDBh@6?PeJT/t[֪ɫ*jwC0uSgWv 999jYY5>wߕ3gaj�ֱh$,<D9й_%Ll>=fKNri4bt2֞ gZ LC0tw8]WKBh@>.ú#6CҎG ϟ=zTK={֫7nVˡ9"1±ւtxHk'j[+b@i}D[nU=B~9.X@n6;wڞ3g^pa0 +ȕ9Jr6`>V =rz@M=siigZ1Ug`V4!Ѐ\M eL\E@7p<j<s}bR ^j+[{ﵹ  0@?vʔ)rכʏVI\ە0 6cOOOt1i|'N(O<" HHhU v\ʌ2a1["U  n4bt3X gZ*4`h"=&c !&Aee͌/!A]X ~Ma\L&AT ȑ)*x/)ϬZݪ􄏜9SRӒuڀF7{۞D�IuiLhja`ʕoVC1Ùtk?T9WBh@,ӿ$%3l0 Vª?ÇӰbO?ZI6 G HJBٻFJR蘇Gn@9"gϞܪaNG̀B!љyG2=ܿSBm` Xje'MxmB %ټn,p)iޒr,XNJFFIiiaK|X*i@!B HmHO2hX,K!B HU&p` 8_CՏB!BB!B !B !K8h@!$ !|PЀB!d(娩¢B?qLH,mSRT#Bzb)(e)ǤTGMÃyj"'Bh@(qHC%%RT\(ERP/_'Y*=9%I277)[L.\]JS-mۤW^Vӓqҽ{wӟ$sOmBaˊ b@#HIMVC`6%19AN&P%{$%EJ\ j3#M0<hf[=fӦM?x`6mGX+w9rH 4xby䦛n_]NoܹSLjZ WCϕ˖,I,rI-e˗3oe֭,s/nj#}]=zm_ .\ 7|6@[+9zɢE_t8,?<#JBh@(j)$"2L㑘tRr2!^"JPF [QQ!;S>={}K/$7x<&A5 &#<"~̝;nnn*kc4̒i0/ԩSy~پ}̘1C;k,{UA5jTVVs=crwH>}$yT5Թ~D?G###C>#[Ү];J#z:XJq=wߕT_;Ώ끀<v޽[ZjZ14l͚5zy9j\7h7|S"""SNI==}Bm̙3駟w߭uYM~d@yQpQTT?okn}m]τr 7(c{ GiU(`5^m@㑝ePddJV9 9>R%YQɡC~pPCvҤIҶm[9}I֭:7or@WO0!F +Æ 39G׮]U`*8rƀ$Ȋ+T@H+brv=^,H6m԰(w2b]t1 ne6gU-33S0�0fgϞ z_o7eU}=Zڷoq.\̓�.2 .ֳgO׍k^t^̪K9srYkeľBc /@QlL([6ڻ{u{ڵ�}Y^9! !e}P4Yz(%Kj]GE:) Uo'8}A5g…zk1O=I@QRRZh1 h̷k|=5?~ܤ7= SRR~#G<xPoFk#4ͷa&Nhr.-GiB AcǎUA ` Ke:t { 2 +WTeMwc bb]Ç9yGu^7ywOl6}7Om)M۔n vܝ8 qq1`mpl@T#zh6� FQMQ3̝<}߽w,sKBHN9%(5-:+/ڽ˚/9YL;ޖ`9�Q|+F,#c9z06p)J;eeeǬ]v-6L=b3f t7]a{9tF&1_|8 hCHT,D=g?Y E1#M-X"A~*^3 # կu{G-Ay G�!$D&TTX~l/>IM|T͖u.;E@10P8T:$" A -%C 1٨ .b#h|h z&u5[|P֯_z衁PSXA !MKup!T1~m6ft�HH Q 4ۮZhدu{v%=G-RNi2B(@! &μ< 5SӤ!O|l⼊Y:y޸�X3w,У3>L Uч G j3P;b,S-Z:01iRj|;m4DR^y?{ddd\j?L:UwOPG{ur-k׮�)B#G P/H�"\hX#j̨5'G-7vX5fDPɄɓ'U|*:=jPNя~P_⠮BBHֹ}iio~hݪ8̓Lm 8Mj(ԛTi$Ap2u0n MmV rٵ𽅡},#>>^]"cA-(#/ Z۶mXǬX(F'@c֧5.ZG$D{{|:ɘ2ٳ*n˖-* *G@OكO~jرcnj#8 xČP0]=n{0ҡf+韅l05{-;E V~1WUE�!D$3OTZ%&U=T\<#UՕjۥ;2\3B.i!dY)[ sN,BF�A.Çe݆֪ղVw]P +gk$yRsTeLjh|ގ^9yZ ~P"rk!Z""}B "@{PLkeztm <iZ::_ i{ !D> DRPBnzz%@Z#%iےflxR@(0)o'ںcw|*㴬Yu?&SԸמ}:L#Cx<n%BN0ة8IVE܄Bd㖭J� cRXT|{.hb@<ttvɌ ~0ݤ.$=)-+S-:ٹjۉTA' zRU;B! jٰis@4b5J@ 4lo韻Uo5 \}~oD;"q1[?;  U B(@!2 @*UmmɑM["7o؏T(l0 l FA؄jxLAaY-֠B(@!r #ztcͺ_aݲm{HDQPR6n_�! B $%mYU"P19y5  !j@" ]Pd> UX/A�Bnl,%ERPxIa*-L$BF�;{uj*D@ @<@͂]_rH$Y%ef2&HBCԳU( jvutvB!M\O r >o'L( /W/-|Viim&ij-f46:~kexIҞ(݆H//ʱ׻/B!D#HB4/!dt + k[-Rf)UK2Nȥrt$&Zbh 퓟'|@}@ } pVG9W|#|F֬Yx9p?~~>㚀o@BH8KJd$5#m\vJ nrBzuQ\n&F%;)urq9tPWj5R~&vǣ&y饗_^k؄pLrr<3%>͛6sٿ}O0Aƌ? B9Jx\*Q^Q&XyYJ.>uHΞ9)豣Rp`h۵ pn'>by4ԡ˧>)ṳITDWns̑/}K\{챁2.'6N^QpL�)..&$'6m`bcҥWMhBG\!r ~G۩Y4X/ug2[N9uꘜ8!5or53'|Rƍp/K`°<{o >O Yf [SSQ@k!G^Î'7) !#՟T%:@P *] GUѠX? BH� z(Hͱ :\΂Ғ]Μ<!ƙ� I>[PP0/_ֿ:uh*@ІK.:7 zTVVs8{J?b}D'Ν?(,, W Q_~<ސ]g^^�B(@! Frr)Agl_yY|}]\|ɺ. >;p Ƕc:Ї=xk&@Fp1AhO7?E%C}cW?ezWlGz>&vӏ=Ǐ2h7d O[**,b?^J|ۤv&>*f:}}"~O``T`׾&V5"E@Y5 ! *ZAjX Rڐup9uu$@ȶmlZ!#OܲF$6ȹ˳`Y3)?MzG68+ΫHWWd˼.ӟ޽[Ô`рT,-Zj9/}g*@P#`lm#Z]]jb88! ^N<:ҶB)wz血,cHA S!FQ:w; -M-/ }[ǞyR])6M�7+xާŋ_!YĊpjA݋o}[HL8&M`۪ވ,E8 E#4cƌ{! D*xd"tFb2HܪٖORlIiS%q+h BfV�K֡M<#-E{{mxF+ᰋݗu B!\ew܍!Nq%e_<;dȜUW7IŃRY)֊2#mm>iooӎOB!=yr[uU/u v9^)Ņ*Çdj:wC0@ yF]mttk_�"B!d I�)))VouvytI3F.iKKG}ΥqhnoAd2+&lm+nI/l-t)@V" Ӻl?B!"nj%@"HRXKtٞ$)RX\(sM%R!PA;#Y\ɜ=vwEܽL6i>: K!P �Yf*ǖBE@`y}>KJJeɲ2fQqD./ֱ\`oC>E:oLBl<픺.m9X$w-+ 86x8[<..ܭ"6O46wIgOնKʁ/)<x|=ʰmƍ[^J 48vIjmھ[^: K!P �YbUY[WGUMXb-KB)Y]TuwЖ$V0 w{[ jfE5ɮwg[U!ߠ 5>y|]s=miQmC `R.yU>ytu2D%m8<r2YtNڻvzY}{h]7 6ƶS*ZS.!B2$a%@!pX~A ߘ'cF fm/]DzW-Hո;e: 05aϷ{=xYܹT: QZom7qx",ѓus lmDJƭ3O¿B 7樖(H` d9F@@/|#LjSE:˝=QהDZѶʖok3O20^Ii^|X�JK+?F!ZsCu5b̡g}-sg HRHnftFD6H,6# .: MqIo|\ ><ت]]"O!+TzaQ,�9{�APf >EڿX9(ҞR4G-"6dՀ>L Hsej@0 Um0#�1Ԁ`X_roהZրP\ rykfinifxmHcSVV'X!퉉ҭ _M?b^Wnkۿ+ ѣGy#3]Nq{uzn4N �ARr[IvDnN$Gz .n̂h쐗Q8۲\j,̢=iQpYlL�g¸Pna}Ю[f̠wF2\@|TV[UF\ʭ)}(\:X9 -'NH&BFS~ }kl {̎;[obO>)sΕ.D_y啁ſJVV֨q4\|?|CrŨt#ƍGI gLaI@Ah(2:iM ' |u0(@�9!Wѣxс.Oz b,HnvSǥAi_d;U&r2{+sSp׃n?,mmm8xPӴҥK__?ұZo}%!S<3mH _[M::ڥߴeԔ2f =^)o[+)@h HQs<M.(( T,%Rtbd:$gϜrQ)8OzJJCn4 (g//6A'> G?j /|A>oΖ~hѢ}+V/~~P?S$:g?iIMMW_}U?~<˧>)ҤIi/}K\{1immx_??:uuuG>5%Kȯ~+r pOT"JOz[hcs;Ca6m<@>~\c_UU%osó#nˣ>*'Umݦ UTŸsss#n7E=^}f7u{|J� B�2}zcT55ye?- Q(@En�AģԬA] l3udya:uLfo=-GQoQT cJ҄Y,q?>`n}wqrKqEL8Q[$WV.ƦG/f)ò1o/~ 2kx駟x_̘2e̜9s`~_WA9�_CΞ=;0Ls=|TV]>+- }E{[8w^%t.v}En\ʕ+D7j"ۚUHܸqrO6-v3 4n55{D͛�PG?Խp׋{GWieSe?9^⟌Iq2a0q=!qS]s(@/@,%Rsl.W⣳`n3'hH7JTVVix; ) rRV>\Q7}pu|>z{�c�-x؂|<aP\\@" 3g ?3W8'NxݺsGCm!=Jo N2b9c6et^yD J�܇PSO=>f DNpZXXf+`:=۬YΟ<yrwOf ![h4 k)@rr)Agl_yY|}]\|ɺ$ssx5}{ >޺p쏴eq@`y{7}11E ,kņGL<cƌבEJƨ;8 +sJgo ׿Vog !/z�!PcFZC �}UiFP30ǼH~ͮCG-Adz<#PhDUTX~l/>IM|T͖u. P ~D po\ ^ |%bFEI^ Z2b`LUHEG6Aɿۿ ~ejXd7ۊAZҴt RLCh}%$$PlH3�Dz FQi]M?Oյ#_0Koc/h Fb¹˳`Y3)?MzG68+ΫsL&39x{{nք(H7aQ}j@N1}L (�A^ec: QtLjLy�AJ1|GA׽+b{ߓ+C#"5uT* Rʞx UShA[nEv #E�PHz!z DBP'A=@;PcF "8q<j)ԽcǪ1#N&`N<åT&\favQ#?я Z.B(@h4M$@ΝyI%o#3O 2fI_UK9fiOS}{JYxqq7j&p:CgQ DU03^ŷ"@Y0x%\jA9˶m.GòU0ڇ8A]>ͮq9:0ha[36S1{RBmٲEF C`';q(ԇ#>q 2'))Iգ\ڤPBg?p]ٽ�o-@HB"+R_J"\g*GԽ4)){ewl$EIel:u4Ȱ'@*-uh*HK^[*.Jݗޔu ruA$�|2``۹s'o!#Alٝ*.wrSvIٗ&Ϯ9FǎF�2gk$yRsTeLjH[Oۑ+g3O=PD"e("Rߗ!p=yr[uU/u v9^)Ņ*C25;~7$=(e-^Ȧ3 yF]m"B"HC>fFds%@JJU~q$lݱ]]elGKZ;#osmFV'gʬv|O:{z-{德,19ۋbmPp~Hs{dUʸ'@p1W9yҞ%[t^$&Zb]QvMp\H [g2 vj2NvRrrU7!BF�Yq }kk^)jX%rDlON),.9ɦϒubV(rB?ZԬ* w/+S^lֵ؄k|&@C ߚ(E'@7ȁKaik+p27߭BG[,hG3utB!\ZBxrr%|˒ee̢d8HBmЎiޙ?S{-tMiqk4t7]"xܭKhhVQ'޾Ȑ&6vJ]S IkOlʩ#"D5p\OQmo ;<AFb8?}i^oVX}ݳP!9Y>}R]g8սGvTS<yܶtXB!#^,k*@BUebK@Yiy,HxS.*Y4:hpF۞n/k_-&Jec@jWI]Ψ�A+{rLvMJ uQEtuݝ:钒ھ*M0Α&ٕs g<\#w,-Uo4GC"8�j6D G}޶iBC >OƼ3H,� 5^\CGҢCuW[_/o86O3.WajLb B!xd T, _ o̓ # |3ŗb+vLm6yK8[-1-oQ4dW^1F37HӁt1@@`_S$E D3PS1hK yq+LJ^I?^D(T @Qa<6n*oאB!7�ycMlj鏂T۬ @Λc*@W]b KBtX䭕*j3 mxRr}Dfȷ�Վ& `{ IUv�Y:Fifz-" }¬\DNgrM$u`XuPB! >_8QW#vl}VgHт�=w�5 ;Tt۪Tp]T6&p@$@_G 5@-@HgL:+huѐP(ƛxh�A*ج4:H5ʤk H,rHAB!B,U^X9 !@fΞi*@P<YZ?MhiqDj!q e˸xIr&tڋXf53c ~`B7W1A Z h�,Xƚ5݋}58v"xqmYbH[6uPB!d fPqQ^(OSϚ D�*M #w@t"9oi?#p D 0>ղ#Q G* Cr[K!= {,cT1MfN1D١ ߓ>.)ю#Vu9ֈ"}Uxw(,{0@ �g}G톔 B!X2}ƴD<0-oKkZaL&@ pڕ<Өmו1_BV/B!& L.6|m6h~ӖSS&˘ 4!B(@!@L).WcT55ye?- H҆섇bGBB!P �2ytD8yO'$nRL4A&L/aOHܔrלtin BFQPB!FQB!FQB!FQB!d U9-mݥNIٓ,`;$9u,J:(Vfө(@!B2tew܍[ )ZKgcGQB!dhd{%6[uU/u v9^)ŅÇdj:w77 h4 B!X9i %%rҥ+,==]5%Yvd/-=9p8SfJ%[t􊫵[ DKTmW6vU ߶Tqҁmouv tq_4;f<!BF�Yq }kk^)jX%rDlON),.9ɦϒubV(rBzݠe.dܻL^^&4j_TmpJyӚ�S מr^h Cy.4 B!Rj M(d+糤X,[,cGt~bm`A;Ѷʤ7!h<?Dt*_c;vMyH5wIvNQmo ƚ Q `"@ړN?ƱGSW67vh-/ٕHù 2mGێ(@!2J_ }u~TTL,b)(+-/T oE___y9m`HҜuUVhSBXΰȾ^(kK#JI-sZ;" Qm9(yU>ydu<" hMD ˛qFjePwUH_/oTۃy.4 B!Bd a# |%@1O.,@j(A Xx#?n}Eڲ#rY-VюƖnH ?X>~R4wx$nu`ё!@`U}oۗ^zXsQB!d 7樖(H` d9zF@c6RJjԵ˓:hDqҲ0$�TXpֻ"!x =QH뱴=B�!B( >_8QW#vl}VgHт�=w�5 pv:vڪ 1֓jlykL"5jŽ{dʀmX;F)lE` B!L,U^X9 !@fΞi*@P=YwI&h/R>cA4BԪ^m9`~ǠF Vxz5E}D/7d84[6JpHm=!BnBJX<Nq4R%xi3ף|nƳdLK5k}pv٫0SްiSfhBW_@XZ:h XfRhPt<{DB1խzTq%&@"m\h B ?DX-kQe0uӚ�)/_նi BiS�ņU}&o2xjdB!  S1ƚ2i䖅t(@(@(@!B�2ytD8yO'$nRL4A&L/aOHܔrלth4 B!P Nh4  B!Ph4 B!Ph4 B!PPh4 B!|*GԽ4)){ewl$EIel:u4!B(@.@NQ} $غ:Qk}icth4 B!P MlOޢFsKx.qꥮ.6G+P~{LM<BnٖQ2t"4PB!d4 I�)))K.]a!G..2u~h#%~i葷Ϲ6tq3%[[W4{6ioFceyxU0⣫ո]QvM4+Ŧ~7]=j&y0BBB!!@m\H_!W"k=.ۓ$55E eNbpX;䱵ʰ^7h<|V  )۪=`m$x&Yqu'sؕ{yB!7�Yf&@RTT2˕YRRZ,K-1#:?Evy16{۠h 44w ֘-2sWZ&gۗJJ[<eXƶHc7np-f<I+2aߘx)uM]*R'evŘm.~DܾnAZTQ <i;*gk$rT"&9U->מt{{{6ó k��!B Z,~M} QUS!֪2XRPEJ$)cFt~|~e8 ѴWVhTd!~S\ pa}kfi0ҁ`xKlcLB&RzSqFџw &"8뇨@HQqsEQq ^=dѡ:iKwʭY:dzqC{KhajL ֝r! B!P �IX@ °X~A ߘ'cF aʱױA F+ljjd[ q"šmEnMŠR"h(mwR[^v/Uݩ"@F'+l=M4p6kD"5^C4"⒜(Fwx?26 g  B!\ RY 3bA̝7T\R`U/;5C;8ȘAրDu }^ݫ Jq|֍/٥9:g<'H,}FzFCB4FBB!!@^{}n�qF9ϐ2{lSrk@1p;^vjJ,hgvYE֜l IE{Hb3Y H{doWu%3SEQKPAJ!B�yY(r C̜=T,=\?YG^i4mta`V$m%f�cB!p QaDXX:o`#iJ9^qwc2kw0E6cJT HCqgP}j@l9\wm8~\ՒB!WI0{.S\n=G =^x�A r&; :I�AQ}&*,x(mWCc0$}0׎`3bi<v8jNA8 8m`ŝS?�g,^(^7hq@�uk׆t0LhדPPB! ,@Ϙ!’mimV_2,ӞH6=J AeXF֗3K P~ B!@<3m J[O;ڤ]::M[OM,cPn��!B S1ƚ2i䖅tli  B�]<mLzjL<Q'Kq7)N&L &'$nTk^:4!B(@'@h4!B(@h4!B(@h4!B(@(@h4!BF�[#I]픔=ɲ; CSwʢ2ne6:B! C [vݨl]]⨵Kʾ4yv1:v4!B(@&@'oQbY<^8]R`JjR\\(~_=|H&sh\)b6JFY !B(@ J˥KtՐ#[wlGd:?c4ۑt\jѡՉƙX5scmf eyxUy'TJU|~"G<k}?tpg[䱵#C BdJE>bj{X-b=9IRSSP$&:?K׉C9e0,' 2ko r7`[&x|=H&w,)۫%2*Vn+-C6 B!PD#@VY rr%|˒ee̢vbXrA-Zˬ)@~"Mm=Է߶Tڶ-꘵'==rpDoJdi5u&kYY@p-?wֈCE꛻[Cl?{FkN6Dy>ya-`ۉfY}a؜۵1x`Xp͡3ښ( *rf=u,/.Z~bUND<`(@!2_ }u~TTL,b)(+-/T oE8^FmN`Y{�"W*;c26a" i!9}ɪh8&'.Wg/ <񅓎 ̑&ٕLyK@ [+ry7pP3ۏzG5Pt!-֔H}@H`Lƴlc{A_ws肸!%KKe%oı�!BȈ K(RXX6/WddD;LE  ZD?$U)gpƒ ^sb&]þ^1pnFk@5^.߭ t׊J|P3ۏۯza|60<;"k Hm19={q2րdjbB'Ա i B G@lbsTKMf 0̈2wSr# =Ԁ,m,pm,#uJ_U9? ~'oӖ43 l n?s%bl'XhD#Ԙ %Z|ڧRt&ϛB!7�y!kPf>C칳Mȵ 6V`8ȔmUR\ۮ4H`98"))=:+&n_g54+%5+7tE >-RjZqn i7Xx]�!B$@^~e*B/, 3g4 Kif/iV& 'h*{Љv袭M 8&Pec}c j<7qso?xԄ WfQoTcX X{FܹTU3h-PC-ҹA CԀ D;V9{w7Ę�AhA`:lB!7�ya %,\Nq{uzn4Q >7YS7nw;{uCv7pXkCfWcJBJ u{ЬT[wϪD%8iD E՟~,Xw@ V1PP XYBP`a.e[K=/\K!=hNJh w8 B!2}ƴD<0-oKkZaL&@ na "^W\1:!B(@ @6E ]lZ'm.-L1 n>)Um+S(@!B�2}\Q5IS$,,Ye-(@h B=Ӧˤ&%~r?'qd¤ 2ax{BL쥃GQB!dpFQPB!FQB!FQB!FQB!d U9-mݥNIٓ,`;$9u,J:(Vfө(@!B2tew܍[ )ZKgcGQB!dhd{%6[uU/u v9^)ŅÇdj⑛ҙ#-g%N6W B1 J˥KtՐ#[wlGd:?c4ۑt\j҉ƙ2k6isT/nYt.&mVM*+o,8X;}oYG^U~} f8X{UDi<B!A۸Z ȇC5RmkE,9z"]''IjjʜdSg:wck+a9!nY{OlJCsZ vM+nYxȜ=v{Y<B48xA\^sgz{RBg8|jk!Bntj M(d+糤X,[,cGt~bm`A;`fAl,?Z?hgdi,=\Q.镢vT N脯/%|gK_3Xj҄X8C&ZG^O^m3ufgܿS<5==rےҨH"۵Sܪ?o|)g[pcxO̸}R]i;Î)g7G{d!BnNHm}_U5b*XJ,J UdA›2vQaD9{@[7Xb*]^zaܻ,jgKEM"9ħ5їɦ3[%KKUiC!R<SkDZ4'X>sWdUG8aןWGV+f횢 Egg>]ֳ1 D ֢pcgyJC^VvL<H;=!BnJd a# |%@1O.,@ԛ|[}&Î4PYWO/;wjNhgwoͼ߭yk}ׯoE.j"!?}9nu`=~UսD+@"݋PϴVk;ʨ ??k 7vQǘzƑ#=�!BM)@X8?bZj 6kaF, k !Boˣt,q|O|?PԸ;=w;#8ƺm?cs onhqC B!ܔ 8jĮC )Z 6 ׺$_[6: u x滵m؄٪bqڧlv:b5 Rl"oK$^:jLioH �32b�!B)@^~e*B/, 3g4 (,XC~p f,X#y9,Xf3h!)U(V9EE[LYqw"@r 5 X&ìmD)&mضLW@ " I6n]\^(>0oq@5-o62g:H e B3pyr;iץ>Jg^G5܌gMRc*M #w@t"9Wf)Os@"t3g-; vOhKԩnXq>f񃚂1 y$DXD ٷ0 VN4gd܆t#m`a�R@$9`)DB0ղ#&@qQ߃,X Bdi", x`Zޖfi(2:iMKlcfa*c*Hmd!BF�yf%@tkkvwIGGtt 2Y,�NC ٸ>G�!BHD2eLqj+InYXL'o�Fh7B! =Ӧˤ&%~r?'qd¤ 2ax{BL쥃GQB!dpFQPB!FQB!FQB!FQB!d U9-mݥNIٓ,`;$9u,J:(Vfө(@!B2tew܍[ )ZKgcGQB!dhd{%6[uU/u v9^)ŅÇdj:wW챋[=8!BF�ٜA bt{d,Sgf;]ᗖyKm3~O'g*t|٩6l^,mZܯ%SWPb.j[qԸG3=+&k5Z%ILPhPB!F 6V/{mT+ZmDHI"Ņ2'1YrN, eXNHm{.;sQ;k6WG^J=˔Sul_DanO]ۗʳ;%: 5>wEܭ=Mg|BB!7�Yf(d+糤X,[9"Gr< mvڣmOvyduyډfYv>`r9Xm!%-_2,c[mweeEړNvs{9ۇ=*Z>D2,-rˑ[FihVѦ'.GJdi5u(&d,8 bR]g8Uhڎlݽ B_ }u~TTL,b)(+-/T oE8Fm`H9YS5�ZUQMfƨ@R朏[_G_0,o>s g<\#w,-U%eU 1=B~"s/GVib$ڧ"PwIvE2<*POO_/ozFYw)Y BH’J �<4ŗ`c+ ѶG?&l䬡7XV87UuHw+-}۷l(z.5Pָ;ekX꛻" ޲ {͸u) 'h B䍅# 69? RmfĂ�;o�^f-@a:wD!r"D .ΏTRtB.x|cU AoD]iliFUOAB!P~G]5s(Y}!E d٦zՀgޮY;!FΥ3R+W?rE-#)\$滵*16DkA`Hq!QB! /2KEN~g 4 Vh{~W:5CՓ[fWpngς1<} 5vqY׶LW@ Iڶhlj|"B;ιT]C-5&(lRH UnsCF_ CԀ<֠ƎkD͕c ƍUKUd $�!B *@^=C ).SܞFq{]꣄[<M}zTxT`*lJU샞"UN1%q?"E*DLHcg},,S a= cgB-"FDh5ߖRu!8?x,X8#~UDh_ԓ(@!r 3$ iy[Zע `괧5R@'oZ4B��!Bu L.6|m6h~ӖSS&˘ t9n B!P BL>S\ƨkjʤ[ɣ#OBB! =Ӧˤ&%~r?'qd¤ 2ax{BL쥃GQB!dpFQPB!FQB!FQB!FQB!d U9-mݥNIٓ,`;$9u,J:(Vfө(@!B2tew܍[ )ZKgcG݄Fh4mX-Jl44^bsTIR ˻#tnoa\6G5o9(e-JB!Ċ�ٜA bt{d,Sgf;]ᗖyKm3::8Sf~]dV0,c[,Nk(nF2q:wHs{-oV\wr[5WG;9 B!Xnj%@"HRXKtٞ$)RX\(sM%RߡC휚Whm.wEY.fu5|Jh? r7p5JB!+@VY rr%|˒ee̢SlX.08:`fut.][ƶ:6WJ+ ڂelþ1 %SꚺTd`Aܵ,]8ΖnՖzӬmqxm&ZԱkO:QomKJ][Ns0,n؏c^soVX"^5ǵK:{z]7UF6?6ٳ³n*kQ KK}U[3Vh}n!B(@_ }u~TTL,b)(+-/T oE8{FGm`0N6ֳL6D[Y3)V8?R$r)oHIDņ Z[YUʰLpQmBO]@?_߯_W~iK_MxB IH6a40 g<\#w,-U ܇w Q ݧ;=qtfbC:V/c(@!2H’J �<0�SoٍoO1kN7ް`٘?GA@,;Rkܝ2~u`Pmlwk*jU]}2ocظۊdr[ _H /;5G3Bd)�Ԇ=4A뢫A(} щu\=wH2 B!JRY 3bA̝7T\XmA{z؆}p!`I7ЁN.aH2Ru,Ǻx]5 ܫh7n3fԟ*p gFu\oהB!J~G]5s(Y}!E d٦Z׀t^ݎ7�U-nxKn)vlvZ4k``yhk@N;bv"@pO|VP&kotF2.kJ I u; BWf"¢)X2sLŜݬ=$,X۲ AD݇MsHazTe|J9^l.fmhk醶@e}\F$'$P�A`AEӆ=�qeJqB ҍQ߇u\lfB{@h?ԩ;lB!7�ya %,\Nq{uzn4Q >7YS4lw9vDN$ʬq뭒]y; Dِ`3b%ȊmyWOXrݴ_Z1 cgBf=( Ω> % 88 Y)@PKfp( U50Ǹ5'ohsByh DRB!dT 3$ iy[Zע `괧5Ro~oìe_B'BH̴)Jb*m>ihv7m<5eY@2XCRoGs4 B!PEO).WcT55ye?- +ޘIIwK�!BȕFxL6]&=5Q&N(%8'&M x7e5g/<B!dpFQB!Ph4 B!PhSv9rlڴIΰp8B�h 1~ijjxkkkGB!Iĭʑmi$u.vJʞdٝ!ɩ;eQA2Nv G锞65;fڶQq-/O�z&}N|%^Q]}{ovI:1q1SMC0'ETA@Ay(bm8婢NAQ[ꜽ{>U|o1 HЅ266wX.𨋴-6Q*@_|葼�iaޢŴk>j0SSi@ad8`0"@Chmkf#uT[_Ez*\2Lt-}s;7ǁ9kkk)00P5jo@=JN^z>r!Zv^?QH.v]}=B_|{m?@cO}?~ltޜ4E֩%ˏ^>~m2VZ-kӲ☣~IR;B?y*<x0E=j8r&L&;y*8۪K{kebR}Mp c8 3'�)(ȧ>Lt|0N4~& O1NuvӹdLS 1[s[ZuSPbӆZYC'-;7O.mL_hNC b,ÍᕔUw?%'O accS9ǝH_^aH][^#~49|s.Z/" @Cvi`"^a_Yi3Z¥1Ku'BRNڴu1ۼ~RXxs(u]G ciּT^QA--ϻj_k,ND7bnJR]SClek`0�QMU5T^UFb*Ph 9CᔛK[|B4Z*/Jb{_t퀍QnViw [i>oMBl�U #ZWs̨h-0qN%4Pzy b0ܝ zo5^3[a8{&~JJKLٸO׮0XW߭{:KJu*Ֆ�euրXD}Ls�0S3δHHR93SKxtN Z c8 c�1Q^^M 'QAa>yO;4~;hCxy9Ulkχ 3mg4M4wt?%_}#c�W@ TXzI "s]sN(MDmb^actЂSeϼ?mʧOG@N.<!T|. !+}Sř m}"c~̙mʣ'bިrŚ3DOxb>G X5Fڹg/͚;ic^NT'lkL :D�x2vi;1mquTF GPuٹ4{Bwev~]s_վXK٫bh FБd'}E)ET˧’\ysܽg7ס[16 `~|Rjsi3؆hlx!$tJʮ3%iR|pnPXjRC'}'  oxNf5kz@6Q' d<-W+66̷d@A|34|\(Hb;0 4:]1h$ϟ_TaQѸ~̢n$ ?�O g]-Â%_ӱ'4�A؇GđQ>b 12Jz*ρjWQV]Zkܳ܍1/ Fdn)@rssz@ly1߱ˋq,@OCmӁO?Ҫ/F00)Xmrur 1gގ'r.{Rg!tt^0^ 8 <3K\MJ]{�oEH�tTإuxGcS#fwa}s8;.O#^eeeZXl\ Oh qVx:l{'Pt欜ڥBGE:V|u%K5 [iEe �j7'_gx2jŀتK}\f%X8�d[`0$@vrW, @zm PT{' rFKʨIwAm *3%gr?@- GiZmʧ.ƀpʍ]rhaKeonFeOZuk}qXAtR*:g 0 Yz�pA(_PX$ 徽w~e,Lbʏ>i?l.CG}/;q4mVh�j7 0Hne~ fC2n{ك+׮1U a!`0H^RMյT%X-YúbȦ4c@ly4 Hc%JնO�KZ<Uǔ{u)j`G6C28FP[u2Vޓ~l[{@7W:ˡQݮ GbK`JH<€"t: NOi.c`0Om Bs<  6 ve,t0h_\mIj9�SU/'n`#Lٙ_*m7?jUsLA PKU:`jN 1 lĀ G)]1·XCIII2+\FD>%''7�yLEŠ^Xj΂EsKX2  7d c(_JHM-=lny wkWk ɽL_;xGƟV}FVªNJ_/V*B3zWJ'R!\:i#&�%T Uham:2tVsx?GU[Բ`a,wK}s`M281,Ѹ`<!䰚~3F�APyhh(SBB&Q嫫Yx挜iCnq1x, c ׮}a=lmYB~e ]!7nܐӱP="/0`0 U˥�QF::QgguvKhn lh6`0 1(dhlpfZͷ4iO>lh�a0 �yoZ{Zt!-\,Y@ ϧӼEh¹4w8/F(`0 c`d�a0 `d2Y0 `d2Y0 `�a2,@ ` 27^0P B.)$"NQd�a0 p]] cc|5?* HbÎd`0 �  bd0Qm}UV멢sd2ѵM6\dPbX +nS ,@ `0<%@Ϝ 0::ZVd2u4;I,x>H;MM璍2M"7ξQySg,?<RLo9Sk')eW>MA_<'.H7WR88ƇO(:>)f`0 c�?)@z<TUSAUe+/b]މ3N'D񎩥Nx$E׺lH+l{Cmܮ+Yi(з irJ=dy=yvrJ %`0#@|Dyyy6= D}p?Mޛɫ Ϟc;^u:�ah{BO{'+{my,=/0d=hIz04_nt<6 u1uu?Zpaǯ Ny,P 7gߢ2i~lu6ҐU>:ꗺmi-m9;>+QIv� DAzN[*!e5Ⱦ RzMSǚ8O�a0 1zȡ#$HM]OR鋨XO9%S{4eoC㧽D}6c ]\ %mӧ|KQf^ 6mQw6sQOX }Q'je1 h[d4ڿ8VBײuh0 *p[}t/uOo4!0 tb@08}Df4{hZ)qΔ}{*eџE_@lډ1A T`0O,= 3ARRqqdpppHr ZTj>b^n~FI)}JG)T[IuöIA>)))}h?`ꆋu] dZat۟m$:'' }goQ̝t^xIZץO_ViUap?\Q*7D.�g}.Daweax#u-8~'w_S6D8\H3~x'E]|e|-S87W^3~ׄD}Im2=ѷvhNN=#`0! ڳRIT)Y+bAlBSNu`{דR]�>~@f~y@oueCBUM]SӠ?nzlQǴ)NF}QԄeW>b`0O`2,@ ` �e0E `0X0a-@(44Jn"6==9 2_7Gõ�ʕ+V;<\|ÇL7c1fpg<C{mdd2,@䣣:;;ndKKkGog}}` /{c=F L&s!@%Ds< z'p'+^Y0LH{{;)  & Q%@n߾MΝx` ڌ4[ <փ*@`<U|=pflCy[NU~*/fn9ڐS)  G4) 3(3;Y!"eff3okcDe)/ u4!@Z[[=> UFYUQuN E_<E ,@,@1'/ZZ<k16)'7+uu3e: 3!B2AJ%o޲0B` X,RO4wg,@X0X8bZzUF265@52(z xlh0PqI@BTPѣfB%&Qr}a%@C%o޲0z')4m<J*i?w$) J`q8 3#t>4Y0 )°h{&G 54Qco"z,(G�cl=zDSU9BS# FQe)xr]G}h:}6rrF�_7z60ԿKƗi{'.x_n\fy W]l;x Ã$)9Qjχ TT\Hi)2*JHu<H^~t/OTq8vL!֭T^^N׮_SOs B]TT,  li6Pfʼ2Nn|JRRRd9~ܻws^?m3yuvlC; 4g#)(ۅdu9k]ߺ1A?ZiE`koNGJl;97*ܻ1ɒG ;p@n|nG(jnn8އ˧~99t7>^='bsYܐGG!Q6f{x4iy I#Y2^SyuTS]AEɛ$e5u.]{tD#E]KUT}=F' ԋkfep0U {"".g߁_Ʌ9QXx8544xQ2РI]ʾ;ʎv%ҕH'OǏ7KRccp2G�<oOp/yw{sҵJFXKҾKqZ7T6Ҕ|辚*E>gI$o.j[zxv6FQMj~dzvkt*ܿHgϝw12nX{U(n)  sY<={z&iHc<{wL24IRSSJћk+՘O y3 ٕ .ߨ== yb 2m2Qw?x{K)֭%>!$.SݸAUն8EEEB<H8QWzQ2fO5uCi tf�pyAup�'ٚHc9qoAeO>wG@p# /@ŝҍtd:=L7iG:Q\Ry 4g" s[ӦSn^9?;'Wgw'FE ׮Qݙ3gR}p934䣜!"r~q𰏯ʼc'NJlP87Dayyڭ엋q}?)/^4](Ғ  @ R|4Qx 22Su7lS֎)XXc_VVF9`W__QY@�ȴ,q͑6f6R6q]>"W8R(&kkG@&KwRaD7SaX6KW_qBmcⴷ- #b UWO#|X},ZLDH4^1'5%`}__+WO,@Tp\Owz^~]ON kGSwfcu]X pXx[؜)|?po[RYUcjq<u/{PF-[  ;�޷Lŧ=#>})Y@ ĔEaiy nߔF0Vjh hoN5sORw5VPi6ʉ_;(gWH �)~,ȐQiYr>t:YzL{] KqZ\s48d`"c�q&@,*B$~'_KI~E`zMO;oSgO2eP8|JHihA89"]o0|b=zڳ>;fц'oip9g.]Leez\~YȜ?sl9DzT`a9DQ5$\IVqQt\:;?űJ=pMBHC`eT1))C+ߝiMTu\ LalT9#*KQE` U!R!DHh :2pME<"?a~zL}GO (^Vҵ<ѽ6 TM^\TPj3\'>7SVA??8Ƚ^,g@ (CBeeIƲ@>:sf=7]AZ#CkG P܀SōwȐ6+}MԲ]xj'CR}r#eSs]韵�*iďD #:QWG°ʫ6m]Wa m,V(n{c_'oN"Li)7chG<Dg{�x1v!T^xov^N~{bil/m)C\$1ϥKU} {·8~Cgv�q9_[pAn-aJ̒ipRn?ă@tL1@\g͛O9_Ιg1ZC%r#k8VP?I2nq]~ҀH1 x9~?Bky 7c@tj6c 7JuT_H,/IDi'<6ȇp wE�`zq1l6VW( /FLl QqɑB;O\�'~C=!L ^djZC ۸LƯqH&nzBء 8ɟ̞gA @o%Ϟ(-Ց]$@vC-P  ˖KU?Ks&a{\p Ȣ߶z4@kb .%履wgϕȂ%K)33K308 :˹Ư)@ TI\ԭE;](y2ͺUy烏* cY^7lZ�ay#1Vj廓#e^H<K$ cT?.4UbP A\~ż XCWB֒.{;fl2rA}ΏT SMX3hmiAU Odž4e TRR"W 1#0ZUl r~o#z|} � lkSƾd8D& ꮘJuRwǂ|}SݷGH[˝ tZSlK*SSԮGΰX H>^=ORT\bokVbab�?|{c^54x |<?.~J�/^2l୧\&N>yʘƛnqoM˻fgɛ0e%%ݘ8m60>MxW,WIG]j,@lqG"?('m )t!O!q22ZQ DYLdne ` eo7PeY }xjuttPbb!�q', l Lrf ֨d(z9oT;2~Ϩt2u !R9S9vQeYLuVzPPŠL&1 BW Ch=?2 q}#_] R/.Dηm+ Sy`(:SĈe?=3}\c%! &>ӳą^!{0=xE?|Oė(yO U'5G)[8^mw .<IvLA+xLx,@X0X8"+!߄CGdm5t+r%Dҥs yQ>|UNm<Rd�1V#ed4L;}ugM)>LeP`\5o?ja(C<}jSqiVreD}#ߞEk#VهU#65yO -1?&s3ƌ,ͣHՎ"ϯYbd$ysB< Q v7'%mz6C^'_iCO  i@-}v<"$&b9 (i �q�+m;wPtL4]v._KQQt!<Bx<ީr)DK8k`OO}:u' ƿ)?)O'EO <_,\jAZs&NHO쇇vmv V[T#6soI/}@'A9 m}b4Ⴜ|6zc[jFWZ-oLm[ŀ'D�<elxu Ȭ펱u J'итHx,@X0X8bY]BäP BWίa!0ҒQ&]łj8CJYh SN_KꊜAWߧϩGSL@Ki+ϮO v^1Ok g.vKV'K) Ug #A敩*WCmp`?ͺlNq&OWհo Z/ɪ?J@~oX`b{BU&&OG~O6#HV=ej-U%@Pu%y>ޔrmw ŞL   ! Ui;r=4j2WJI"-X Yގy~oAx=!@ټeE]Z| IT)BgiirʐlNC9DB2C-@F2S= ,XM`zA`]k2-e~+*9>KKI޿3W+S`Z]VAnPF"@? 4ĝXr477222sǟvy<3nںM%ۆ\3t?FdT g$k3)}/(1'VJ0|MH+"e,T[گKW0"D 2JY s:'O*X |lN$mu\z:338߭[/j>0O�a�a�U I<ƓyExX# yx/l#ҕ%''exŹj>D~O= wg2u oTS,<<^@BCC動},((c<` %KUsW롽6:%@gW2ͩ16̡ A'cvt.[obUsW롽6 2.\2[g.|y`0C)2/7 `0.@C%o޲0``0 c s i)/ u4L `0Cr! 2U/ u4L `0Cw,c'ўlAh}.:3L `0Ct�=pvl,@ `<d�a0 `d2Y0 `d2Y0 `�a2,@ `�a2,@ `2d2L&d2.b����IENDB`����������������quodlibet-3.9.1/docs/screenshots.rst����������������������������������������������������������������0000644�0001750�0001750�00000001747�13112005742�017770� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Screenshots: Screenshots =========== .. figure:: images/paned.png :scale: 50% The paned browser, providing a customizable hierarchy of filters for finding your music .. figure:: images/album.png :scale: 50% The album browser, giving a visual anchor for a large library .. figure:: images/queue_2browsers.png :scale: 50% Quod Libet's queue in action, and its handling of multiple browser windows .. figure:: images/tagedit.png :scale: 50% The powerful and feature-rich tag editor interface, shared by Quod Libet and Ex Falso, that gives you the freedom to tag your music how you see fit .. figure:: images/tagrename.png :scale: 50% Quod Libet and Ex Falso also share a powerful file-renaming system .. figure:: images/exfalso.png :scale: 50% Ex Falso, the standalone tagging application .. figure:: images/plugins.png :scale: 50% Quod Libet and Ex Falso are highly extensible through many included plugins �������������������������quodlibet-3.9.1/docs/downloads.rst������������������������������������������������������������������0000644�0001750�0001750�00000030315�13115500547�017421� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Downloads: .. include:: icons.rst Downloads ========= ================ ================================================ ========================================== **Linux:** |ubuntu-logo| :ref:`Ubuntu <ubuntu>` |debian-logo| :ref:`Debian <debian>` \ |fedora-logo| :ref:`Fedora <fedora>` |opensuse-logo| :ref:`openSUSE <opensuse>` \ |arch-logo| :ref:`Arch Linux <arch>` **Windows:** |windows-logo| :ref:`Windows <windows>` **Mac OS X:** |macosx-logo| :ref:`Mac OS X <macosx>` **Development:** |source-logo| :ref:`Release Tarballs <tarballs>` ================ ================================================ ========================================== All files are signed with the following key: `0EBF 782C 5D53 F7E5 FB02 A667 46BD 761F 7A49 B0EC <http://keyserver.ubuntu.com/pks/lookup?op=vindex&search=0x46BD761F7A49B0EC&fingerprint=on>`__ ---- .. _tarballs: |source-logo| Release Tarballs ------------------------------ ========================== =============================== ================================================== ============================================ Release File SHA256 PGP ========================== =============================== ================================================== ============================================ Quod Libet 3.8.1 quodlibet-3.8.1.tar.gz_ `SHA256 <quodlibet-3.8.1.tar.gz.sha256_>`_ `SIG <quodlibet-3.8.1.tar.gz.sig_>`_ Quod Libet 3.7.1 quodlibet-3.7.1.tar.gz_ `SHA256 <quodlibet-3.7.1.tar.gz.sha256_>`_ `SIG <quodlibet-3.7.1.tar.gz.sig_>`_ Quod Libet 3.6.2 quodlibet-3.6.2.tar.gz_ `SHA256 <quodlibet-3.6.2.tar.gz.sha256_>`_ `SIG <quodlibet-3.6.2.tar.gz.sig_>`_ ========================== =============================== ================================================== ============================================ .. _quodlibet-3.8.1.tar.gz: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.8.1.tar.gz .. _quodlibet-3.8.1.tar.gz.sha256: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.8.1.tar.gz.sha256 .. _quodlibet-3.8.1.tar.gz.sig: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.8.1.tar.gz.sig .. _quodlibet-3.7.1.tar.gz: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.7.1.tar.gz .. _quodlibet-3.7.1.tar.gz.sha256: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.7.1.tar.gz.sha256 .. _quodlibet-3.7.1.tar.gz.sig: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.7.1.tar.gz.sig .. _quodlibet-3.6.2.tar.gz: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.6.2.tar.gz .. _quodlibet-3.6.2.tar.gz.sha256: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.6.2.tar.gz.sha256 .. _quodlibet-3.6.2.tar.gz.sig: https://bitbucket.org/lazka/quodlibet-files/raw/default/releases/quodlibet-3.6.2.tar.gz.sig For old releases see the `full file listing <https://bitbucket.org/lazka/quodlibet-files/src/default/releases>`__. .. _ubuntu: |ubuntu-logo| Ubuntu -------------------- Stable Repo (14.04+): :: $ sudo add-apt-repository ppa:lazka/ppa Unstable PPA (16.04+): :: $ sudo add-apt-repository ppa:lazka/dumpingplace .. _debian: |debian-logo| Debian -------------------- Stable Repo: * Debian Stable:: # deb http://lazka.github.io/ql-debian/stable/ quodlibet-stable/ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5A62D0CAB6264964 sudo apt-get update sudo apt-get install quodlibet Unstable Repo: * Debian Testing:: # deb http://lazka.github.io/ql-debian/testing/ quodlibet-unstable/ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5A62D0CAB6264964 sudo apt-get update sudo apt-get install quodlibet .. _fedora: |fedora-logo| Fedora -------------------- * `Fedora Stable Repo <https://software.opensuse.org/download.html?project=home%3Alazka0%3Aql-stable&package=quodlibet>`__ * `Fedora Unstable Repo <https://software.opensuse.org/download.html?project=home%3Alazka0%3Aql-unstable&package=quodlibet>`__ For stable releases check out the `official repos <https://apps.fedoraproject.org/packages/quodlibet/overview/>`__ first - they usually contain the latest release: .. _opensuse: |opensuse-logo| openSUSE ------------------------ * `openSUSE Stable Repo <https://software.opensuse.org/download.html?project=home%3Alazka0%3Aql-stable&package=quodlibet>`__ * `openSUSE Unstable Repo <https://software.opensuse.org/download.html?project=home%3Alazka0%3Aql-unstable&package=quodlibet>`__ .. _arch: |arch-logo| Arch Linux ---------------------- Stable: :: $ pacman -S quodlibet Unstable: See `quodlibet-git <https://aur.archlinux.org/packages/quodlibet-git/>`__ in the `AUR <https://wiki.archlinux.org/index.php/AUR>`__. .. _windows: |windows-logo| Windows ---------------------- =========================== ============================== ================================================= ========================================== Release File SHA256 PGP =========================== ============================== ================================================= ========================================== Quod Libet 3.8.1 quodlibet-3.8.1-installer.exe_ `SHA256 <quodlibet-3.8.1-installer.exe.sha256_>`_ `SIG <quodlibet-3.8.1-installer.exe.sig_>`_ Quod Libet 3.8.1 (portable) quodlibet-3.8.1-portable.exe_ `SHA256 <quodlibet-3.8.1-portable.exe.sha256_>`_ `SIG <quodlibet-3.8.1-portable.exe.sig_>`_ Quod Libet 3.7.1 quodlibet-3.7.1-installer.exe_ `SHA256 <quodlibet-3.7.1-installer.exe.sha256_>`_ `SIG <quodlibet-3.7.1-installer.exe.sig_>`_ Quod Libet 3.7.1 (portable) quodlibet-3.7.1-portable.exe_ `SHA256 <quodlibet-3.7.1-portable.exe.sha256_>`_ `SIG <quodlibet-3.7.1-portable.exe.sig_>`_ Quod Libet 3.6.1 quodlibet-3.6.1-installer.exe_ `SHA256 <quodlibet-3.6.1-installer.exe.sha256_>`_ `SIG <quodlibet-3.6.1-installer.exe.sig_>`_ Quod Libet 3.6.1 (portable) quodlibet-3.6.1-portable.exe_ `SHA256 <quodlibet-3.6.1-portable.exe.sha256_>`_ `SIG <quodlibet-3.6.1-portable.exe.sig_>`_ =========================== ============================== ================================================= ========================================== The latest development installer: `quodlibet-latest-installer.exe <https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-latest-installer.exe>`__ .. _quodlibet-3.8.1-portable.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.8.1-portable.exe .. _quodlibet-3.8.1-portable.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.8.1-portable.exe.sha256 .. _quodlibet-3.8.1-portable.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.8.1-portable.exe.sig .. _quodlibet-3.8.1-installer.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.8.1-installer.exe .. _quodlibet-3.8.1-installer.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.8.1-installer.exe.sha256 .. _quodlibet-3.8.1-installer.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.8.1-installer.exe.sig .. _quodlibet-3.7.1-portable.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.7.1-portable.exe .. _quodlibet-3.7.1-portable.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.7.1-portable.exe.sha256 .. _quodlibet-3.7.1-portable.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.7.1-portable.exe.sig .. _quodlibet-3.7.1-installer.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.7.1-installer.exe .. _quodlibet-3.7.1-installer.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.7.1-installer.exe.sha256 .. _quodlibet-3.7.1-installer.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.7.1-installer.exe.sig .. _quodlibet-3.6.1-portable.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.6.1-portable.exe .. _quodlibet-3.6.1-portable.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.6.1-portable.exe.sha256 .. _quodlibet-3.6.1-portable.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.6.1-portable.exe.sig .. _quodlibet-3.6.1-installer.exe: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.6.1-installer.exe .. _quodlibet-3.6.1-installer.exe.sha256: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.6.1-installer.exe.sha256 .. _quodlibet-3.6.1-installer.exe.sig: https://bitbucket.org/lazka/quodlibet/downloads/quodlibet-3.6.1-installer.exe.sig For old releases see the `full file listing <https://bitbucket.org/lazka/quodlibet/downloads/>`__. .. _macosx: |macosx-logo| Mac OS X ---------------------- =========================== ============================== ========================================== ========================================== Release Application Bundle SHA256 PGP =========================== ============================== ========================================== ========================================== Quod Libet 3.8.1 QuodLibet-3.8.1.dmg_ `SHA256 <QuodLibet-3.8.1.dmg.sha256_>`_ `SIG <QuodLibet-3.8.1.dmg.sig_>`_ Ex Falso 3.8.1 ExFalso-3.8.1.dmg_ `SHA256 <ExFalso-3.8.1.dmg.sha256_>`_ `SIG <ExFalso-3.8.1.dmg.sig_>`_ Quod Libet 3.7.1 QuodLibet-3.7.1.dmg_ `SHA256 <QuodLibet-3.7.1.dmg.sha256_>`_ `SIG <QuodLibet-3.7.1.dmg.sig_>`_ Ex Falso 3.7.1 ExFalso-3.7.1.dmg_ `SHA256 <ExFalso-3.7.1.dmg.sha256_>`_ `SIG <ExFalso-3.7.1.dmg.sig_>`_ Quod Libet 3.6.1 QuodLibet-3.6.1.zip_ `SHA256 <QuodLibet-3.6.1.zip.sha256_>`_ `SIG <QuodLibet-3.6.1.zip.sig_>`_ Ex Falso 3.6.1 ExFalso-3.6.1.zip_ `SHA256 <ExFalso-3.6.1.zip.sha256_>`_ `SIG <ExFalso-3.6.1.zip.sig_>`_ =========================== ============================== ========================================== ========================================== The latest development bundle: `QuodLibet-latest.dmg <https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-latest.dmg>`__ For old releases see the `full file listing <https://bitbucket.org/lazka/quodlibet/downloads/>`__. .. _QuodLibet-3.8.1.dmg: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.8.1.dmg .. _QuodLibet-3.8.1.dmg.sha256: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.8.1.dmg.sha256 .. _QuodLibet-3.8.1.dmg.sig: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.8.1.dmg.sig .. _ExFalso-3.8.1.dmg: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.8.1.dmg .. _ExFalso-3.8.1.dmg.sha256: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.8.1.dmg.sha256 .. _ExFalso-3.8.1.dmg.sig: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.8.1.dmg.sig .. _QuodLibet-3.7.1.dmg: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.7.1.dmg .. _QuodLibet-3.7.1.dmg.sha256: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.7.1.dmg.sha256 .. _QuodLibet-3.7.1.dmg.sig: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.7.1.dmg.sig .. _ExFalso-3.7.1.dmg: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.7.1.dmg .. _ExFalso-3.7.1.dmg.sha256: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.7.1.dmg.sha256 .. _ExFalso-3.7.1.dmg.sig: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.7.1.dmg.sig .. _QuodLibet-3.6.1.zip: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.6.1.zip .. _QuodLibet-3.6.1.zip.sha256: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.6.1.zip.sha256 .. _QuodLibet-3.6.1.zip.sig: https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-3.6.1.zip.sig .. _ExFalso-3.6.1.zip: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.6.1.zip .. _ExFalso-3.6.1.zip.sha256: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.6.1.zip.sha256 .. _ExFalso-3.6.1.zip.sig: https://bitbucket.org/lazka/quodlibet/downloads/ExFalso-3.6.1.zip.sig �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/conf.py������������������������������������������������������������������������0000644�0001750�0001750�00000003647�13112005742�016176� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- import os import sys import types dir_ = os.path.dirname(os.path.realpath(__file__)) def exec_module(path): """Executes the Python file at `path` and returns it as the module""" globals_ = {} if sys.version_info[0] == 2: execfile(path, globals_) else: with open(path) as h: exec(h.read(), globals_) module = types.ModuleType("") module.__dict__.update(globals_) return module const = exec_module(os.path.join(dir_, "..", "quodlibet", "const.py")) needs_sphinx = "1.3" extensions = ['sphinx.ext.autodoc', 'sphinx.ext.extlinks'] source_suffix = '.rst' master_doc = 'index' project = 'Quod Libet' copyright = u"" exclude_patterns = ['_build', '_build_all', 'README.rst', '**/README.rst'] html_theme = "sphinx_rtd_theme" if const.BRANCH_NAME != "master": version = ".".join(const.VERSION.rsplit(".")[:2]) release = const.VERSION if release.endswith(".-1"): release = release[:-3] html_title = "%s (%s)" % (project, version) else: html_title = project extlinks = { 'bug': ('https://github.com/quodlibet/quodlibet/issues/%s', '#'), 'pr': ('https://github.com/quodlibet/quodlibet/pull/%s', '#'), 'user': ('https://github.com/%s', ''), } linkcheck_anchors = True linkcheck_workers = 20 linkcheck_ignore = [ ".*groups\.google\.com/.*", r".*keyserver\.ubuntu\.com.*" ] html_context = { 'extra_css_files': [ '//quodlibet.github.io/fonts/font-mfizz.css', '_static/extra.css', ], } html_static_path = [ "extra.css", ] html_theme_options = { "display_version": False, } html_favicon = "favicon/favicon.ico" html_show_copyright = False # on a stable branch which isn't a release if const.BRANCH_NAME != "master": rst_prolog = """ .. note:: There exists a newer version of this page and the content below may be outdated. See %s for the latest documentation. """ % (const.DOCS_LATEST) �����������������������������������������������������������������������������������������quodlibet-3.9.1/docs/favicon/�����������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�016310� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/favicon/favicon.svg������������������������������������������������������������0000644�0001750�0001750�00000025336�13112005742�020471� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="135" height="135" id="svg2" sodipodi:version="0.32" inkscape:version="0.91 r13725" version="1.0" sodipodi:docname="favicon.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape"> <defs id="defs4"> <inkscape:perspective sodipodi:type="inkscape:persp3d" inkscape:vp_x="0 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" id="perspective10" /> <inkscape:perspective sodipodi:type="inkscape:persp3d" inkscape:vp_x="0 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" id="perspective2897" /> <inkscape:perspective sodipodi:type="inkscape:persp3d" inkscape:vp_x="0 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" id="perspective2450" /> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2474"> <path d="m 0,450.7086 121.89,0 0,153.071 -121.89,0 0,-153.071 z" id="path2476" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2484"> <path d="m 1701.323,36.99957 283.465,0 0,595.276 -283.465,0 0,-595.276 z" id="path2486" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2494"> <path d="m 0,1802.8342 487.5601,0 0,578.1658 L 0,2381 0,1802.8342 z" id="path2496" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2504"> <path d="m -1.5e-6,-2.94433 2.3255315,0 0,3.88873 -2.3255315,0 0,-3.88873 z" id="path2506" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2514"> <path d="m 0,1802.8342 487.5601,0 0,578.1658 L 0,2381 0,1802.8342 z" id="path2516" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2532"> <path d="m 9.806,537.3086 104.874,0 0,28.203 -104.874,0 0,-28.203 z" id="path2534" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2542"> <path d="m 1701.323,36.99957 283.465,0 0,595.276 -283.465,0 0,-595.276 z" id="path2544" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2552"> <path d="m 39.2241,2149.2344 419.4961,0 0,112.812 -419.4961,0 0,-112.812 z" id="path2554" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2562"> <path d="m -0.0935124,-19.05134 2.7028824,0 0,21.10663 -2.7028824,0 0,-21.10663 z" id="path2564" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2572"> <path d="m 39.2241,2149.2344 419.4961,0 0,112.812 -419.4961,0 0,-112.812 z" id="path2574" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2612"> <path d="m 0,-9.1245 291.968,0 0,462.668 -291.968,0 0,-462.668 z" id="path2614" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2618"> <path d="m 0,0 283.5,0 0,453.5436 -283.5,0 L 0,0 z" id="path2620" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2628"> <path d="m 1701.323,36.99957 283.465,0 0,595.276 -283.465,0 0,-595.276 z" id="path2630" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2638"> <path d="m 0,0 1134,0 0,1814.1743 -1134,0 L 0,0 z" id="path2640" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2644"> <path d="m 0,0 1134,0 0,1814.1743 -1134,0 L 0,0 z" id="path2646" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2654"> <path d="m 8.716e-4,0.0203769 0.9688584,0 0,1.2848631 -0.9688584,0 0,-1.2848631 z" id="path2656" inkscape:connector-curvature="0" /> </clipPath> <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2664"> <path d="m 0,0 1134,0 0,1814.1743 -1134,0 L 0,0 z" id="path2666" inkscape:connector-curvature="0" /> </clipPath> <inkscape:perspective id="perspective2777" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" /> </defs> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.4" inkscape:cx="-45.20774" inkscape:cy="34.393848" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" inkscape:window-width="1280" inkscape:window-height="674" inkscape:window-x="12" inkscape:window-y="26" inkscape:window-maximized="0" showborder="true" fit-margin-top="9" fit-margin-left="9" fit-margin-right="9" fit-margin-bottom="9" /> <metadata id="metadata7"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title /> </cc:Work> </rdf:RDF> </metadata> <g inkscape:label="Ebene 1" inkscape:groupmode="layer" id="layer1" transform="translate(-74.24472,-374.35257)"> <rect style="fill:#000000;fill-opacity:1" id="rect3079" width="117" height="117" x="83.24472" y="383.35257" ry="10.173913" /> <rect style="fill:#2980b9;fill-opacity:1" id="rect3849" width="108" height="108" x="87.74472" y="387.85257" ry="8.9513502" /> <g id="g3855" transform="translate(0.7466894,0.04879762)" style="fill:#4e9a06" /> <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 125.7562,397.97838 c -3.75201,0.11817 -6.86751,2.28335 -8.4611,5.18277 -1.69326,3.08079 -1.66177,7.17185 0.91489,10.28464 2.40976,3.52887 6.26746,6.23305 10.55846,7.50265 3.25328,0.96256 6.81723,1.07759 10.08238,-0.084 0.008,20.33728 0.0903,42.71605 0.0903,62.80942 a 1.9917783,1.9917783 0 0 0 1.49058,1.92934 c 1.49213,0.38695 3.30675,-0.1216 4.15429,-1.23852 0.84756,-1.11691 0.96988,-2.2747 1.06114,-3.37323 0.0913,-1.09854 0.0695,-2.19071 0.0903,-3.10873 0.0208,-0.91804 0.14692,-1.68486 0.1867,-1.7862 a 1.9917783,1.9917783 0 0 0 0.0965,-0.32675 c 0.83315,-4.02208 3.29815,-7.15269 6.48508,-10.19439 3.18693,-3.0417 7.04187,-5.88943 10.21929,-9.37287 5.52161,-6.03468 6.25776,-15.26308 1.39722,-21.97272 -0.44728,-0.61745 -1.80181,-2.84019 -2.86289,-4.60864 -0.53056,-0.88422 -1.00448,-1.67375 -1.32877,-2.19383 -0.16213,-0.26005 -0.20489,-0.36511 -0.44809,-0.66906 -0.0608,-0.0759 0.0783,-0.12709 -0.59125,-0.51344 -0.0837,-0.0482 -0.34167,-0.15539 -0.34231,-0.1556 -6.3e-4,-2.3e-4 -0.63431,-0.11203 -0.63481,-0.11203 -5.3e-4,-1e-5 -0.96118,0.23628 -0.96156,0.2365 -3.9e-4,2.1e-4 -0.74035,0.68729 -0.74063,0.68771 -2.7e-4,4.4e-4 -0.26124,0.61551 -0.26138,0.61614 -1.5e-4,6.6e-4 -0.0465,0.28875 -0.0498,0.38899 -0.006,0.20047 0.0106,0.31427 0.0249,0.40142 0.1156,0.69728 0.15691,0.52664 0.21159,0.64728 a 1.9917783,1.9917783 0 0 0 0.028,0.0591 c 2.68494,5.44925 5.64548,11.00067 4.30366,16.11001 -1.73468,6.19078 -8.18578,10.41317 -15.03018,11.55426 -0.0293,-0.3107 -0.0293,-0.39049 -0.0934,-1.33808 l 0,-45.23063 a 1.9917783,1.9917783 0 0 0 -0.14937,-0.75929 c -2.93098,-7.10825 -10.95166,-11.5581 -18.68039,-11.36756 -0.25553,-0.0107 -0.50915,-0.0125 -0.75929,-0.005 z m 1.63683,5.93272 c 2.67259,-0.12031 5.84877,0.89692 8.0939,2.61083 2.19347,1.6745 3.39486,3.79871 3.17097,6.22369 -0.6258,1.93583 -2.13019,2.77326 -4.41881,2.98427 -2.3584,0.21743 -5.24815,-0.54727 -6.94252,-1.67729 a 1.9917783,1.9917783 0 0 0 -0.27696,-0.1556 c -1.77529,-0.81224 -3.58592,-2.92202 -4.16054,-4.85758 -0.2873,-0.96777 -0.28982,-1.83791 -0.0467,-2.53615 0.24275,-0.69706 0.69841,-1.31175 1.77064,-1.87644 0.002,-8e-4 7.9e-4,-0.002 0.003,-0.003 0.79854,-0.41468 1.77991,-0.65145 2.80688,-0.71261 z m -2.30899,13.4556 c 0.052,0.0347 0.12463,0.0437 0.17739,0.0779 0.0378,0.0179 0.0616,0.0573 0.0996,0.0746 l -0.27696,-0.15248 z" id="path7097" /> </g> </svg> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/favicon/Makefile���������������������������������������������������������������0000644�0001750�0001750�00000001436�13112005742�017756� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������SOURCE=favicon.svg DEST=favicon.ico all: $(DEST) favicon-16.png: $(SOURCE) inkscape $(SOURCE) --export-png $@ -w 16 -h 16 favicon-24.png: $(SOURCE) inkscape $(SOURCE) --export-png $@ -w 24 -h 24 favicon-32.png: $(SOURCE) inkscape $(SOURCE) --export-png $@ -w 32 -h 32 favicon-48.png: $(SOURCE) inkscape $(SOURCE) --export-png $@ -w 48 -h 48 favicon-64.png: $(SOURCE) inkscape $(SOURCE) --export-png $@ -w 64 -h 64 $(DEST): favicon-16.png favicon-24.png favicon-32.png favicon-48.png favicon-64.png convert favicon-16.png favicon-24.png favicon-32.png favicon-48.png favicon-64.png $(DEST) rm favicon-16.png favicon-24.png favicon-32.png favicon-48.png favicon-64.png .PHONY: clean clean: rm -f favicon-16.png favicon-24.png favicon-32.png favicon-48.png favicon-64.png favicon.ico ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/favicon/favicon.ico������������������������������������������������������������0000644�0001750�0001750�00000103276�13112005742�020444� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �h��V������ � ���� ��� ���F��00��� �%����@@��� �(B��D��(������ ���� �����������������������������������������������������������������������������������������B.M5M5M5M5M5M5M5M5M5M5A-���������B.)))))10)))))A-��������M5)))))Ъpٹ)))))M5��������M5)))))Ъp+))))M5��������M5)))))ѫqͫ,)))M5��������M5)))))ѫqа˧)))M5��������M5)))))ѫr׶,*))M5��������M5)))))ѫr׶*پ)))M5��������M5)))))ѫr׶ƘQ̣e)))M5��������M5)))9ܿ׶)))))M5��������M5))*̣dÚֵ)))))M5��������M5))*ǡ9)))))M5��������C.)))2ĔK*))))))B.���������C.M5M5M5M5M5M5M5M5M5M5B.�����������������������������������������������������������������������������������������������������(������0���� ������ ��v��v���������������������������������������������������������������������������������������������������������������������"���b���f���f���f���f���f���f���f���f���f���f���f���f���f���f���f���f���b���!���������������#W<oMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMV<���!�����������aW<))))))))))))))))))V<���a�����������foM))))))))Ӯwճ))))))))oM���f�����������foM))))))))))))))))oM���f�����������foM))))))))3)))))))oM���f�����������foM))))))))Է,))))))oM���f�����������foM))))))))׼0)))))oM���f�����������foM))))))))ѱ*))))oM���f�����������foM))))))))Ѳ)ˡaϨl))))oM���f�����������foM))))))))Ѳ))))))oM���f�����������foM))))))))Ѳ))ҭu))))oM���f�����������foM))))))))Ѳ)@.))))oM���f�����������foM))))))))Ѳ)Ъoˡa)))))oM���f�����������foM))))))ƗPӰzԷѲ))))))))oM���f�����������foM))))+ͪ׻Ѳ))))))))oM���f�����������foM))))ճ3)ҳέ))))))))oM���f�����������foM))))׶ΦjÚŖN))))))))oM���f�����������foM))))/ɤʦÑF)))))))))oM���f�����������aX=))))))))))))))))))W<���a�����������#X=oMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMW<���"���������������#���b���f���f���f���f���f���f���f���f���f���f���f���f���f���f���f���f���b���#������������������������������������������������������������������������������������������������������������������������������������������������������(��� ���@���� ��������H��H������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������� ������������������� kJe f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!e kJ ����������������������kJ))))))))))))))))))))))))jI����������������������ݓe )))))))))))ƘRŖN)))))))))))e ����������������������ݔf!)))))))))))Է)))))))))))f!����������������������ݔf!)))))))))))ո)))))))))))f!����������������������ݔf!)))))))))))չʞ\))))))))))f!����������������������ݔf!)))))))))))չ/)))))))))f!����������������������ݔf!)))))))))))չֺ.))))))))f!����������������������ݔf!)))))))))))ֹ5)))))))f!����������������������ݔf!)))))))))))ֹԷ1))))))f!����������������������ݔf!)))))))))))ֹ)@Ĝ))))))f!����������������������ݔf!)))))))))))ֺ))2))))))f!����������������������ݔf!)))))))))))ֺ)))Ɵ.)))))f!����������������������ݔf!)))))))))))ֺ)))ʥ))))))f!����������������������ݔf!)))))))))))׻)),ٹ))))))f!����������������������ݔf!)))))))))))׻))ѫq/))))))f!����������������������ݔf!)))))))))))׼))׶ʟ])))))))f!����������������������ݔf!))))))))+‘FēJ)))))))))))f!����������������������ݔf!)))))))Υh)))))))))))f!����������������������ݔf!))))))ѫṛֹeͥg)))))))))))f!����������������������ݔf!))))),پ)),)))))))))))f!����������������������ݔf!))))).ؾ6ŕLֹΦj)))))))))))f!����������������������ݔf!))))))ÙЩo))))))))))))f!����������������������ݓe )))))))ɞ[Ӱzˡa.)))))))))))))e ����������������������kJ))))))))))))))))))))))))kJ���������������������� lKe f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!f!e kJ ���������������������� ��������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(���0���`���� ������$��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���~���������������������������������������������������������������������������������������������������������������}��� ������������������������������� ��������� %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ������������ ������������������������������b ))))))))))))))))))))))))))))))))))b������~������������������������������c ))))))))))))))))))))))))))))))))))))b��������������������������������� )))))))))))))))))))))))))))))))))))))) ������������������������������%))))))))))))))))))׷ճ*)))))))))))))))))%������������������������������%))))))))))))))))))ˡ`)))))))))))))))))%������������������������������%))))))))))))))))))ճ)))))))))))))))))%������������������������������%))))))))))))))))))ٺ)))))))))))))))))%������������������������������%))))))))))))))))))پ)))))))))))))))))%������������������������������%)))))))))))))))))*ĔK))))))))))))))))%������������������������������%)))))))))))))))))*7)))))))))))))))%������������������������������%)))))))))))))))))*2))))))))))))))%������������������������������%)))))))))))))))))+;)))))))))))))%������������������������������%)))))))))))))))))+D))))))))))))%������������������������������%)))))))))))))))))+ÓI)))))))))))%������������������������������%))))))))))))))))),ͤe:ڼ4))))))))))%������������������������������%))))))))))))))))),ͤe))@ܿ))))))))))%������������������������������%))))))))))))))))),ͤe)))>))))))))))%������������������������������%))))))))))))))))),ͤe))))۽4)))))))))%������������������������������%))))))))))))))))),ͤe))))Φi8)))))))))%������������������������������%)))))))))))))))))-ͤe))))Ϩm))))))))))%������������������������������%)))))))))))))))))-ͤe))))ƞͫ))))))))))%������������������������������%)))))))))))))))))-ͤe)))0C))))))))))%������������������������������%))))))))))))))))).ͤe)))ղ~ٻ)))))))))))%������������������������������%))))))))))))))))).ͤe)))-)))))))))))%������������������������������%))))))))))))))))).ͤe)))ܿǙS))))))))))))%������������������������������%)))))))))))))))))/ͤe)))))))))))))))))%������������������������������%)))))))))))))țWȣոͤe)))))))))))))))))%������������������������������%)))))))))))6չͤe)))))))))))))))))%������������������������������%))))))))))3ϮӮwӮwͤe)))))))))))))))))%������������������������������%))))))))))ͪƘQ)))ÒGͤe)))))))))))))))))%������������������������������%)))))))))0ִ))))ҭuǙS)))))))))))))))))%������������������������������%)))))))))6Щo)))Χjؾ))))))))))))))))))%������������������������������%))))))))))έ̩8))))))))))))))))))%������������������������������%))))))))))ŖOŝ1)))))))))))))))))))%������������������������������%)))))))))));عʦܿѬt3)))))))))))))))))))))%������������������������������)))))))))))))))))))))))))))))))))))))) ���������������������������������c ))))))))))))))))))))))))))))))))))))b ������������������������������������c ))))))))))))))))))))))))))))))))))c ��������������������������������� ��������� %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ������������ ������������������������������� ��������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(���@������� ������@��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���p���������������������������������������������������������������������������������������������������������������������������������������������������o��� �����������������������������������������������1���������������������������������������������������������������������������������������������������������������������������������������������������������������/������������������������������������������������ N6kJoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMkJN6 ������������ �����������������������������������q������, v&))))))))))))))))))))))))))))))))))))))))))))))u&+ ���������o�������������������������������������� v&))))))))))))))))))))))))))))))))))))))))))))))))u& ��������������������������������������������N6))))))))))))))))))))))))))))))))))))))))))))))))))M5��������������������������������������������kJ))))))))))))))))))))))))))))))))))))))))))))))))))kJ��������������������������������������������oM)))))))))))))))))))))));ؽԶA)))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ЩnѲ)))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))Ъo)))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))Ъp)))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))Ъp*))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ѫqǚU))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ѫq˧))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ѫqŖO)))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ѫr7))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ѫr6)))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ѬsB))))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ѬsƗP)))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ѬsɝZ))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))Ѭt̢c)))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ѬtƘQڼǚU))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))Ѭt))+Ӯw.)))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ҭu))))ÑFִ)))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ҭu)))))ĔK)))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ҭu))))))˜-))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ҭu))))))ÒG@))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ҭu))))))*=))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ҭu))))))5*))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))Үv))))))̢cֹ)))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))Үv))))))Ɵˠ`)))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))Үv)))))0ֹ))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))Ӯw)))))ղ~@))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))Ӯw)))),׷)))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ӯx))))ɞ[,)))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ӯx)))).عÒG))))))))))))))))oM��������������������������������������������oM)))))))))))))))))))))))ӯy)))))))))))))))))))))))oM��������������������������������������������oM))))))))))))))))))/ɝ[Ա{ֵϨmٹ)))))))))))))))))))))))oM��������������������������������������������oM))))))))))))))))9Ɵ)))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))ͥg)))))))))))))))))))))))oM��������������������������������������������oM))))))))))))))Ѭsѱ׶ֵֺ)))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))ƗPͫ8))))ҳ)))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))Ϯ))))))™)))))))))))))))))))))))oM��������������������������������������������oM))))))))))))5>)))))/ǡ)))))))))))))))))))))))oM��������������������������������������������oM))))))))))))<.))))1չ?)))))))))))))))))))))))oM��������������������������������������������oM)))))))))))),ҳÒG/ÒH׷Щn))))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))ٺЪp)))))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))+а׼ÒG))))))))))))))))))))))))))oM��������������������������������������������oM)))))))))))))))ͥgҳոٺÑF))))))))))))))))))))))))))))oM��������������������������������������������kJ))))))))))))))))))))))))))))))))))))))))))))))))))kJ��������������������������������������������O7))))))))))))))))))))))))))))))))))))))))))))))))))N6�������������������������������������������� w&))))))))))))))))))))))))))))))))))))))))))))))))v& �����������������������������������������r������- w&))))))))))))))))))))))))))))))))))))))))))))))v&, ���������p�������������������������������������������� O7kJoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMoMkJO7 ���������������������������������������������������2���������������������������������������������������������������������������������������������������������������������������������������������������������������1��������������������������������������������������r���������������������������������������������������������������������������������������������������������������������������������������������������q�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/favicon/README.rst�������������������������������������������������������������0000644�0001750�0001750�00000000126�13112005742�020000� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������The svg is based on ``quodlibet/images/hicolor/scalable/apps/quodlibet-symbolic.svg`` ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/bugs_repo.rst������������������������������������������������������������������0000644�0001750�0001750�00000002134�13112005742�017404� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������====================== Bug Tracker / Git Repo ====================== .. include:: icons.rst .. _bugtracker: |bug-logo| Bug Tracker ---------------------- We use the GitHub bug tracker: * List of existing issues: https://github.com/quodlibet/quodlibet/issues * Create a new issue: https://github.com/quodlibet/quodlibet/issues/new .. _gitrepo: |github-logo| Git Repo ---------------------- Quod Libet uses `Git <https://git-scm.com/>`_ for source control and is hosted on `GitHub <https://github.com/>`_ as well as `Bitbucket <https://bitbucket.org/>`__: * https://github.com/quodlibet/quodlibet (primary) * https://bitbucket.org/lazka/quodlibet (mirror) .. _RunFromSource: **Running from Source** (no installation is needed) **:** :: $ git clone https://github.com/quodlibet/quodlibet.git $ ./quodlibet/quodlibet/quodlibet.py To get all the dependencies needed for running Quod Libet the easiest way is to use one of the unstable PPAs / repos listed on the :ref:`download page <Downloads>`. They pull in or contain all the needed dependencies for the latest code and are kept up to date. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/README.rst���������������������������������������������������������������������0000644�0001750�0001750�00000000564�13112005742�016361� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Quod Libet / Ex Falso Documentation =================================== Dependencies: * sphinx (http://sphinx-doc.org/) Build: make Build full documentation make guide Build only the user guide ../setup.py build_sphinx Build the user guide and put it into ``../build/sphinx``. This is meant for packagers who want to ship and install the user guide. ��������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/development/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017205� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/development/contributing.rst���������������������������������������������������0000644�0001750�0001750�00000007727�13115500547�022473� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Contribute: How to contribute ================= Testing ------- One of the most helpful things both regular users and developers can do is to test others' code. The easiest way to do this is to run the development version of Quod Libet. Development versions are kept stable, and the developers generally run the latest code to play their own music, so this is a safe and helpful way to contribute. Please keep in mind that Quod Libet is not forward compatible, meaning that if you use a newer version, reverting to an older version could lead to errors and data loss. So always backup your :ref:`config files<ConfigFiles>` if you plan to downgrade at a later point. You can find development packages in the :ref:`download section <Downloads>` . .. _BugReports: Filing bug reports ------------------ Useful Links * `List current bugs <https://github.com/quodlibet/quodlibet/issues>`_ * `Add a new bug <https://github.com/quodlibet/quodlibet/issues/new>`_ Writing a good bug report It helps the developers to format bugs in a standard way, with a short summary as the Issue title, ideally: 1. **Steps to reproduce** (how the bug can be demonstrated again) 2. **Expected output** (what *should* happen) 3. **Actual output** (what *did* happen) Also: the more logs, system details, and insight about the library / files the better the chance of a speedy resolution. For more general tips see `"How to Report Bugs Effectively" <http://www.chiark.greenend.org.uk/~sgtatham/bugs.html>`_. Look through existing issues Quod Libet is a mature project (in its second decade!), and there have been a *lot* of features and bugs discussed over the years. It's probable that what you're thinking has been discussed at some point, so please search through existing open (and to a lesser extent closed) issues before creating a new one. This reduces noise and saves the maintainers time. One bug per ticket Please do not create an item (ticket) in the issue tracker which contains reports of multiple unrelated issues. Even if you are reporting several very minor bugs, each one deserves its own issue. This allows each issue to receive independent discussion and analysis, and to be closed separately. Viewing Debug information If the bug you have found does not raise an exception, the debug window won't appear and the dump won't be generated. In this case, run quodlibet from the command line using the command ``quodlibet --debug``. It will show additional information that might be useful. Testing the latest code Some problems are fixed in the development branch which aren't yet fixed in the current release. If you can, try to reproduce your bug against a recent checkout before filing. Filing enhancement requests --------------------------- The most important component of an enhancement is the *why*. State what it is Quod Libet doesn't do for you, and give as much information about why you think adding a feature which accomplished this would be a good thing. If you have an idea as to how a feature might be implemented, suggestions are welcome, but be sure to explain why you want a feature before explaining how you envision it being implemented. Not only does this make your feature more likely to be supported, it allows others to enhance, generalize, and refine your ideas. As with bugs, please check for existing feature requests first and refrain from submitting multiple feature requests in the same issue. If you have related ideas, file them separately and mention the issue numbers of previous ideas. Translation ----------- Help us :ref:`translate Quod Libet into other languages<Translating>`. You don't need to know how to program in Python to do it. Submitting patches ------------------ Patches are always welcome, and should be in the form of a pull request or by attaching a patch. If you follow the :ref:`CodingGuidelines` it will be much easier to get your changes included quickly. �����������������������������������������quodlibet-3.9.1/docs/development/overview.rst�������������������������������������������������������0000644�0001750�0001750�00000001530�13112005742�021606� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������======== Overview ======== Building and Installing Quod Libet ---------------------------------- While Quod Libet uses distutils/setup.py for building and installing (``./setup.py build install`` etc.) we don't recommend it, as it doesn't provide a way to uninstall the application again and it might not do the right thing by default depending on your distribution/operating system. Instead we recommend running Quod Libet directly from the git checkout for development/experiments and use one of our unstable repositories for everyday use. See :ref:`DevEnv` on how to proceed. Testing Changes --------------- To make sure that your changes don't break any existing feature you should run the test suite by executing:: ./setup.py test For more details and options regarding testing, code quality testing and test coverage see :ref:`Testing`. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/development/index.rst����������������������������������������������������������0000644�0001750�0001750�00000000274�13112005742�021053� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Development Guide ================= .. toctree:: :titlesonly: overview devenv testing contributing guidelines plugins tools faq maint formats ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/development/guidelines.rst�����������������������������������������������������0000644�0001750�0001750�00000006351�13112005742�022076� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _CodingGuidelines: Coding Guidelines ================= Getting started --------------- Before you can start making changes to Quod Libet you have to set up a development environment. See ":ref:`DevEnv`" for further details. Source Overview --------------- ============ ========================================== browsers/* Things in the View menu ext/* Extensions to QL / EF (i.e. the plugins) formats/* File format support library/* Library management code plugins/* Base classes and structural enabling plugins operon/* Operon, the QL CLI tool qltk/* GTK+ widget subclasses/extensions util/* General utility functions and setup code ============ ========================================== If you want to get a full overview of QL's code, good places to start are ``browsers/_base.py``, ``formats/_audio.py``, and ``library/libraries.py``. Code Guidelines --------------- We try to keep Quod Libet's code in pretty good shape; when submitting a patch, it's much easier to get it included quickly if you run through this checklist of common-sense code quality items. Make sure your patch: * Is `PEP 8 <https://www.python.org/dev/peps/pep-0008/>`_ compliant and doesn't generate new `pyflakes <https://pypi.python.org/pypi/pyflakes>`__ warnings. You can test this by executing ``./setup.py quality`` * Passes existing tests. You can test this by executing ``./setup.py test`` * Is commented. * Adds your name to the copyright header of every file you touch. This helps you get credit and helps us keep track of authorship. General Guidelines ------------------ We prefer Python to C. We prefer ``ctypes`` to compiled C wrappers. A good way to get a new feature applied is if you include tests for it. Stock strings and string reuse are awesome, but don't make the interface awkward just to avoid a new string. Unit Tests ---------- Quod Libet comes with a lot of tests, which helps us control regression. To run them, run ``./setup.py test``. Your patch can't break any unit tests, and if you change tests in a non-obvious way (e.g. a patch that removes an entry point and also removes a test for it is obvious) you should explain why. It's possible, indeed encouraged, that a changeset was for no other purpose than to *improve* the testing / test coverage, as there have been plenty of bugs that have slipped through. As usual, any fix associated with a confirmed bug should include tests that would have found the original bug, where possible. Printing Text ------------- All terminal output should go through the ``print_``, ``print_w``, ``print_e``, or ``print_d`` functions. These will handle Unicode recoding. They also let us capture all output for debugging purposes. Translations ------------ All text that could be visible to users (with debugging mode disabled) should be marked translatable. You can do this by simply using the ``_`` function which is globally available (through __builtin__):: print_w(_("This is translatable")) To handle plural forms use ``ngettext``:: text = ngettext("%d second", "%d seconds", time) % time It is good practice to add a comment for translators if the translation depends on the context:: # Translators: As in "by Artist Name" text = _("by %s") % tag ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/development/formats.rst��������������������������������������������������������0000644�0001750�0001750�00000014274�13112005742�021424� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Tag Formats & Spec Deviations ============================= Deviations ---------- Quod Libet deviates from several of the standards it claims to support. We'll document them here, but most of the time we won't change them; we had a good reason for violating them in the first place. General Deviations ------------------ Since we translate to and from many formats, sometimes we're forced to accept the lowest common denominator among tag formats. Don't worry; if it's too low we'll figure out some way around it. * Dates are restricted to YYYY or YYYY-MM-DD formats. Blame ID3. * = and ~ are not allowed in tag names, and tag names must also be pure ASCII. * Tag names are always case-insensitive. * Newlines are not allowed in tag values. If you use a newline in a tag value, it will instead be treated as two values for the tag. ID3 --- UTF-8 and ID3 Tags ^^^^^^^^^^^^^^^^^^ If Quod Libet finds data in an MP3 claiming to be "latin 1", it won't trust it. It'll try UTF-8 and some other encodings before it gives up and actually considers it Latin 1. On the other hand, when it writes tags, it saves purely ASCII values as UTF-8 and any non-ASCII values as UTF-16. This means it won't try to "guess" when it reloads them, and other programs shouldn't either. Using a format like Ogg Vorbis, FLAC, or Musepack, the tag encoding is known and Unicode is perfectly supported. Genre and TCON ^^^^^^^^^^^^^^ The ID3 standard is ambiguous in its specification for the TCON frame. If you try to use a numeric genre in the form of 02 or (23) (for example) it will get translated into a text genre. This means there's no way to have a genre actually start with (xx) for MP3s. QuodLibet::TXXX Frames ^^^^^^^^^^^^^^^^^^^^^^ ID3 doesn't let you have frames named whatever you want like Ogg Vorbis and APEv2 do. However, it does let you create "TXXX" frames which are text data with an associated "description". Quod Libet uses these frames with a *`QuodLibet``::<tagname>* description to store tags that don't have ID3 counterparts. For example, labelid is stored as *`QuodLibet`::labelid*. RVA2 / ReplayGain ^^^^^^^^^^^^^^^^^ Quod Libet implements ReplayGain using MP3's RVA2 frame. Unfortunately there is no standard on how to read RVA2 frames to support RG properly. If the description string is "album" the gain is treated as the album/audiophile value. Any other value is read as the track/radio value, but an actual description of "track" will preempt other values. I've passed this information along to the GStreamer guys and their RVA2 support should match this, once it's completed. foobar2000-style TXXX:replaygain_* tags are also supported, but migrated to the proper RVA2 format on save. COMM Frame Language codes ^^^^^^^^^^^^^^^^^^^^^^^^^ Language codes in COMM frames with empty descriptors are replaced by \x00\x00\x00 on save. These tend to contain garbage rather than valid language codes anyway, and empty descriptors are usually a sign of comments migrated ID3v1 or other formats that do not support language markers. Legacy Stuff ^^^^^^^^^^^^ Multiframe Hack: Since versions of ID3 prior to 2.4 did not support multiple values in a single text frame, we stored multiple text frames of the same type with one value for each if you tried to save more than one value per frame. This was strictly a violation of the ID3 spec, but we never encountered an ID3 reader that had trouble reading the tags saved this way (and still haven't). Now that we use Mutagen, we store multiple values in the standard ID3v2.4 format. Old tags are migrated when you edit them. QuodLibet:: COMM Frames: Quod Libet used to use COMM frames instead of TXXX frames for its extended tag names. It will still load old COMM tags, but clears then when you save the file again. APEv2 ----- Naming Conflicts ^^^^^^^^^^^^^^^^ Since we turn APEv2's ``Subtitle`` tag into version, you can't edit a tag named ``subtitle`` in MPC files. Similar problems exist for ``Track``, ``Catalog``, ``Year``, and ``Record location`` tags. VorbisComment ------------- This is a list of Ogg Vorbis tags Quod Libet uses that require special handling. They are presented here in the hopes that other applications will adopt them. **rating** The rating tag has a subkey of an email address, and is formatted as e.g. ``rating:quodlibet@sacredchao.net``. The email is used as a unique identifier to allow multiple users to share the same files (it need not actually be an email address, but having it as such ensures that it's unique across users). It represents how much a user likes a song. Its value is a string representation of a floating point number between 0.0 and 1.0, inclusive. This format is chosen so the application may decide what precision it offers to the user, and how this information is presented. If no value is present, the rating should be assumed to be 0.5. Example: ``rating:quodlibet@sacredchao.net=0.67`` **playcount** The playcount tag has a subkey of an email address, and is formatted as e.g. ``playcount:quodlibet@sacredchao.net``. It stores how many times the user has played the song all the way through, as a numeric string. If no value is present, it should be assumed to be 0. Example: ``playcount:quodlibet@sacredchao.net=3`` **website** The website tag stores an absolute IRI (Internationalized Resource Identifier), as per RFC 3987. The intent is that it hold an IRI suitable for opening in a standard web browser (e.g. http, https, or ftp scheme). As it is an IRI, and not a URI, it should be stored in unescaped form. If an application needs a URI, it should follow the procedure in RFC 3987 section 3.1 to convert a valid IRI to a valid URI. As per the Vorbis comment specification, the tag must be a UTF-8 representation of the Unicode string. This tag may occur any number of times in a file. Performer Roles ^^^^^^^^^^^^^^^ This is similar to the ID3v2 IPLS (involved person list) frame. Quod Libet displays these tags by putting the role after the name, parenthesized (e.g. ``Béla Fleck (banjo)``), but in other supporting programs the role can be associated with the name in any understandable way, or simply ignored and treated like an ordinary performer tag. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/development/testing.rst��������������������������������������������������������0000644�0001750�0001750�00000003024�13115500547�021423� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _Testing: ======= Testing ======= Quod Libet uses the CPython unittest framework for testing and `pytest <http://docs.pytest.org>`__ as a test runner. All testing related code can be found under ``quodlibet/quodlibet/tests``. To run the full tests suite simply execute:: ./setup.py test We also provide a test for checking code quality using ``pep8`` and ``pyflakes``. To run it simply execute:: ./setup.py quality For checking the code coverage of the test suite run:: ./setup.py coverage Selecting a Specific Test ------------------------- To only test a subset of the test suite, pass a comma separated list of test class names to setup.py via the ``--to-run`` option. For example:: ./setup.py test --to-run=TMP3File,TAPICType Similarly the coverage report can also be generated for a subset of tests:: ./setup.py coverage --to-run=TMP3File,TAPICType Selecting by class name can take a long time because it needs to import all tests first. To speed things up you can just use pytest directly:: py.test tests/test_formats_mp3.py py.test tests/test_formats* py.test tests/test_formats_mp3.py::TMP3File Some helpful ``py.test`` options are ``-s`` for not hiding stdout and ``-x`` for stopping on the first error. For more information check out http://docs.pytest.org/en/latest/usage.html Abort on First Error -------------------- By passing ``-x`` to ``setup.py test`` the test suite will abort once it sees the first error instead of printing a summary of errors at the end:: ./setup.py test -x ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/development/maint.rst����������������������������������������������������������0000644�0001750�0001750�00000004366�13115500547�021070� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������===================== Maintainer Guidelines ===================== Downstream Bug Trackers ----------------------- Some bug reports never make it to us so check these once in a while. * `Fedora <https://apps.fedoraproject.org/packages/quodlibet/bugs>`_ * `Debian <http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=quodlibet>`_ * `Arch Linux <https://bugs.archlinux.org/?project=1&string=quodlibet>`_ * `Ubuntu <https://launchpad.net/ubuntu/+source/quodlibet/+bugs>`_ * `Gentoo <https://bugs.gentoo.org/buglist.cgi?quicksearch=media-sound%2Fquodlibet>`_ Tags & Branches --------------- At the point where no more functionality will be added to a release, a new branch gets created. All bug fixes pushed to the master branch should be cherry-picked to the respective stable branches and vice versa. :: . . /|\ /|\ | | | | 3.6.-1 / <--- "quodlibet-3.5" branch |_____/ . | /|\ | | | 3.4.1 <--- "release-3.4.1" tag | | | 3.4.0.-1 | | | 3.4 <--- "release-3.4.0" tag | | 3.5.-1 / |______/ <--- "quodlibet-3.4" branch | | <--- "master" branch 3.4.-1 | /|\ Release Checklist ----------------- New Stable branch: * setup.py update_po; git commit * git checkout -b quodlibet-x.y * change branch name in const.py * git commit; git push * git checkout master * version bump; git commit * enable branch version @readthedocs New Stable release: * git checkout quodlibet-x.y * cherry pick stuff from master * update NEWS; git commit * test OSX/Windows/Ubuntu/Buildbots * setup.py distcheck * setup.py update_po, update version to (X, Y, Z), commit "release prep" * add tag "release-x.y.z" * push tag * update version to (X, Y, Z, -1), commit "version bump" * cherry pick NEWS commit onto master * create Windows builds; create tarballs; create OSX dmgs * create checksums / signature, upload everything (tarballs to the repo) * update downloads page on master * run make linkcheck * update stable PPAs (ubuntu/debian/OBS) * update appcast feeds in quodlibet.github.io * write release mail ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/development/tools.rst����������������������������������������������������������0000644�0001750�0001750�00000010177�13115500547�021115� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Useful Development Tools ======================== Memory Profiling ---------------- GObject Instance Count Leak Check ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Requires a development (only available in debug mode) version of glib. Jhbuild recommended. :: jhbuild shell GOBJECT_DEBUG=instance-count GTK_DEBUG=interactive ./quodlibet.py * In the GTK+ Inspector switch to the "Statistics" tab * Sort by "Cumulative" and press the "Next" multimedia key to quickly switch songs. * If something in the "Cumulative" column steadily increases we have a leak. Performance Profiling --------------------- cProfile ^^^^^^^^ * https://docs.python.org/2/library/profile.html * bundled with python :: python -m cProfile -s [sort_order] quodlibet.py > cprof.txt where ``sort_order`` can one of the following: calls, cumulative, file, line, module, name, nfl, pcalls, stdname, time Example output:: 885311 function calls (866204 primitive calls) in 12.110 seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 1 0.002 0.002 12.112 12.112 quodlibet.py:11(<module>) 1 0.007 0.007 12.026 12.026 quodlibet.py:25(main) 19392/13067 0.151 0.000 4.342 0.000 __init__.py:639(__get__) 1 0.003 0.003 4.232 4.232 quodlibetwindow.py:121(__init__) 1 0.000 0.000 4.029 4.029 quodlibetwindow.py:549(select_browser) 1 0.002 0.002 4.022 4.022 albums.py:346(__init__) ... ... SnakeViz ^^^^^^^^ * https://jiffyclub.github.io/snakeviz/ * ``pip install snakeviz`` :: python -m cProfile -o prof.out quodlibet.py snakeviz prof.out Run Snake ^^^^^^^^^ * http://www.vrplumber.com/programming/runsnakerun/ * package runsnakerun in debian Wheezy :: python -m cProfile -o prof.out quodlibet.py runsnake prof.out Example: https://www.google.at/search?q=runsnakerun&tbm=isch Gprof2Dot ^^^^^^^^^ * https://github.com/jrfonseca/gprof2dot :: python -m cProfile -o output.pstats ./quodlibet.py gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png Line Profiler ^^^^^^^^^^^^^ * https://github.com/rkern/line_profiler :: # wrap all functions of interest with the @profile decorator ./kernprof.py -l ./quodlibet.py # creates quodlibet.py.lprof python line_profiler.py quodlibet.py.lprof > prof.txt Example output:: Timer unit: 1e-06 s File: test.py Function: a at line 2 Total time: 0.001528 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 2 @profile 3 def a(): 4 1 134 134.0 8.8 print "hello" 5 1 12 12.0 0.8 b = [] 6 101 628 6.2 41.1 for i in xrange(100): 7 100 696 7.0 45.5 b.append(i) 8 1 58 58.0 3.8 print "world" strace ^^^^^^ * https://linux.die.net/man/1/strace :: strace -c ./quodlibet.py Example output:: time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 81.64 0.013274 9 1444 178 read 7.04 0.001144 0 4041 3259 open 3.81 0.000619 11 54 getdents64 2.80 0.000456 0 1004 fstat64 1.84 0.000299 0 2221 1688 stat64 ... ... IOProfiler ^^^^^^^^^^ * http://code.google.com/p/ioapps/wiki/ioprofiler * strace GUI * Shows read/write to files (how many reads/writes per file, which parts of the files were affected) :: strace -q -a1 -s0 -f -tttT -oOUT_FILE -e trace=file,desc,process,socket ./quodlibet.py ioreplay -c -f OUT_FILE -o OUT_FILE.bin ioprofiler.py # open OUT_FILE.bin Example: http://code.google.com/p/ioapps/wiki/IOProfilerScreenshots �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/development/devenv.rst���������������������������������������������������������0000644�0001750�0001750�00000003776�13115500547�021253� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. include:: ../icons.rst .. _DevEnv: Creating a Development Environment ================================== This will show you how to get the latest and freshest Quod Libet running on your machine and allow you to change it as you wish. The main task here is to install all the software which Quod Libet uses and depends on. |linux-logo| Linux ------------------ The easiest and recommended way to get all the dependencies needed for the development version is to install one of our unstable repositories. By doing so all the needed dependencies are automatically installed along the way. See the :ref:`download section <Downloads>` for a list of available repositories. In case your distribution is not supported you have to find/install the dependencies yourself. See the :ref:`PackagingGuide` for a list of dependencies. Now clone the git repository and start Quod Libet:: $ git clone https://github.com/quodlibet/quodlibet.git $ ./quodlibet/quodlibet/quodlibet.py |macosx-logo| OS X ------------------ On OS X all the needed dependencies are included in the provided bundle itself. Download the latest bundle, which is guaranteed to work with current git master: `QuodLibet-latest.dmg <https://bitbucket.org/lazka/quodlibet/downloads/QuodLibet-latest.dmg>`__. It contains a "run" script which passes all arguments to the included Python with the right environment set up. :: $ git clone https://github.com/quodlibet/quodlibet.git $ ./QuodLibet.app/Contents/MacOS/run <path_to_git_repo>/quodlibet/quodlibet.py If you want to build a bundle yourself or change/add dependencies check out the `"osx_bundle" <https://github.com/quodlibet/quodlibet/tree/master/osx_bundle>`__ directory in the git repo for further instructions. |windows-logo| Windows ---------------------- On Windows we use the `msys2 <https://msys2.github.io/>`__ environment for development. Check out the `win_installer <https://github.com/quodlibet/quodlibet/tree/master/win_installer>`__ directory in the git repo for further instructions. ��quodlibet-3.9.1/docs/development/faq.rst������������������������������������������������������������0000644�0001750�0001750�00000004157�13112005742�020517� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Frequently Asked Questions ========================== Any plans to use Python 3? -------------------------- We are currently working on porting to Python 3. See the `github issue <https://github.com/quodlibet/quodlibet/issues/1580>`_ for updates. That said, at the moment Python 2 does its job well. Why don't you use SQLite for the song database? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Although the song data Quod Libet stores would benefit from a relational database, it does not have a predefined schema, and opts to let users define their own storage keys. This means relational databases based on SQL, which require predefined schemata, cannot be used directly. What about <my favourite NoSQL DB> then? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This gets asked fairly often. MongoDB, CouchDB etc are indeed a closer match to the existing setup, but there is *significant* work porting to any of these, and each comes with a compatibility / maintenance cost. There has to be a genuine case for the benefits outweighing the migration cost. Any environment variables I should know about? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ QUODLIBET_TEST_TRANS When set to a string will enclose all translatable strings with that string. This is useful for testing how the layout of the user interface behaves with longer text as can occur with translations and to see if all visible text is correctly marked as translatable. :: QUODLIBET_TEST_TRANS=XXX QUODLIBET_DEBUG When in the environment gives the same result as if ``--debug`` was passed. QUODLIBET_BACKEND Can be set to the audio backend, overriding the value present in the main config file. Useful for quickly testing a different audio backend. :: QUODLIBET_BACKEND=xinebe ./quodlibet.py QUODLIBET_USERDIR Can be set to a (potentially not existing) directory which will be used as the main config directory. Useful to test Quod Libet with a fresh config, test the initial user experience, or to try out things without them affecting your main library. :: QUODLIBET_USERDIR=foo ./quodlibet.py �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/docs/development/plugins.rst��������������������������������������������������������0000644�0001750�0001750�00000004754�13112005742�021434� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _PluginDev: Plugin Development ================== A Quod Libet / Ex Falso Plugin is a simple python module or package which contains sub-classes of special plugin classes and is placed anywhere in ``~/.quodlibet/plugins`` so it can be found by QL. These classes can provide special methods that get used by QL or can take action on certain events. At the moment the following plugin classes exist: Plugin Types ^^^^^^^^^^^^ Event Plugins * Are instantiated as long as they are enabled or QL is running. They get notified when songs start, get added etc. * Example: Last.fm scrobbler that watches what you play and sends the information to last.fm. Tag Editing Plugins * Can extend many parts of the tag editor. * Example: Title case your tags. GStreamer Plugins * Can inject elements into the GStreamer pipeline and configure them on the fly. * Example: Tempo adjustment to play music/audio books faster. Play Order Plugins * Can decide which song to play next or what happens if you select one. * Example: Follow cursor, which plays the selected song next. Songs Menu Plugins * Can be accessed through the play list context menu and get passed all selected songs. * Example: Album art search, to search album art for all selected songs. Playlist Plugins * Similar to Songs Menu plugin, and in fact derived on the same base class * Can be accessed through the playlist context menu in the :ref:`Playlist Browser <Playlists>` * Example: remove duplicate songs from a playlist. Cover Source Plugins * Fetch covers from external or local resources Creating a new Plugin ^^^^^^^^^^^^^^^^^^^^^ #. Create a file ``myplugin.py`` and place it under ``~/.quodlibet/plugins`` (create the folder if needed) #. Write the following into the file:: from quodlibet.plugins.events import EventPlugin class MyPlugin(EventPlugin): PLUGIN_ID = "myplugin" PLUGIN_NAME = _("My Plugin") #. Restart Quod Libet #. In Quod Libet open ``Music`` ⇒ ``Plugins`` and search the list for "My Plugin" Tips: ~~~~~ * The best way to find out what is possible is to read the documentation of the `plugin base classes <https://github.com/quodlibet/quodlibet/tree/master/quodlibet/quodlibet/plugins>`_ . * The easiest way to get started creating a new plugin is to look for `existing plugins <https://github.com/quodlibet/quodlibet/tree/master/quodlibet/quodlibet/ext>`_ that do something similar to what you want. ��������������������quodlibet-3.9.1/tests/������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�015075� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_aac.py�����������������������������������������������������������0000644�0001750�0001750�00000004325�13112005742�020773� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from mutagen.aac import AAC from quodlibet.formats.aac import AACFile from . import TestCase, get_data_path, skipUnless from .helper import get_temp_copy class _TAACFile(TestCase): NAME = None def setUp(self): self.f = get_temp_copy(get_data_path(self.NAME)) self.song = AACFile(self.f) def tearDown(self): os.unlink(self.f) class _TAACFileMixin(object): def test_basic(self): self.song["title"] = u"SomeTestValue" self.song.write() self.song.reload() self.assertEqual(self.song("title"), u"SomeTestValue") def test_write(self): self.song.write() def test_can_change(self): self.assertTrue(self.song.can_change("title")) self.assertFalse(self.song.can_change("foobar")) self.assertTrue("title" in self.song.can_change()) def test_can_multiple_values(self): self.assertEqual(self.song.can_multiple_values(), True) self.assertTrue(self.song.can_multiple_values("title")) def test_invalid(self): path = get_data_path('empty.xm') self.assertTrue(os.path.exists(path)) self.assertRaises(Exception, AACFile, path) def test_format_codec(self): self.assertEqual(self.song("~format"), "AAC") self.assertEqual(self.song("~codec"), "AAC") self.assertEqual(self.song("~encoding"), "") def test_channels(self): assert self.song("~#channels") == 2 @skipUnless(AAC, "too old mutagen") class TADTSFile(_TAACFile, _TAACFileMixin): NAME = "empty.aac" def test_length(self): self.assertAlmostEqual(self.song("~#length"), 3.7, 2) def test_bitrate(self): self.assertEqual(self.song("~#bitrate"), 3) @skipUnless(AAC, "too old mutagen") class TADIFFile(_TAACFile, _TAACFileMixin): NAME = "adif.aac" def test_length(self): self.assertAlmostEqual(self.song("~#length"), 0.25, 2) def test_bitrate(self): self.assertEqual(self.song("~#bitrate"), 128) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_player_xine.py�����������������������������������������������������������0000644�0001750�0001750�00000002016�13112005742�021026� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. from quodlibet.library import SongLibrarian from quodlibet.player import PlayerError try: from quodlibet.player.xinebe.player import XinePlaylistPlayer except ImportError: XinePlaylistPlayer = None from . import TestCase, skipUnless @skipUnless(XinePlaylistPlayer is not None, "no xinebe") class TXinePlaylistPlayer(TestCase): def test_init(self): try: player = XinePlaylistPlayer(None, SongLibrarian()) except PlayerError: # travis has no output pass else: player.destroy() def test_init_device_non_existing(self): with self.assertRaises(PlayerError): XinePlaylistPlayer(b"this is not a device", SongLibrarian()) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_delete.py�����������������������������������������������������������0000644�0001750�0001750�00000003261�13112005742�021007� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from senf import fsnative from tests import TestCase from quodlibet import config from quodlibet.formats import AudioFile from quodlibet.qltk.delete import DeleteDialog, TrashDialog, TrashMenuItem SONG = AudioFile({"~filename": fsnative(u"/dev/null")}) SONG.sanitize() class TDeleteDialog(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_delete_songs(self): dialog = DeleteDialog.for_songs(None, []) dialog.destroy() def test_delete_files(self): dialog = DeleteDialog.for_files(None, []) dialog.destroy() def test_trash_songs(self): dialog = TrashDialog.for_songs(None, []) dialog.destroy() def test_trash_files(self): dialog = TrashDialog.for_files(None, []) dialog.destroy() def test_delete_songs_full(self): w = Gtk.Window() dialog = DeleteDialog.for_songs(w, [SONG]) dialog.destroy() def test_delete_files_full(self): w = Gtk.Window() dialog = DeleteDialog.for_files(w, [SONG("~filename")]) dialog.destroy() def test_trash_songs_full(self): w = Gtk.Window() dialog = TrashDialog.for_songs(w, [SONG]) dialog.destroy() def test_trash_files_full(self): w = Gtk.Window() dialog = TrashDialog.for_files(w, [SONG("~filename")]) dialog.destroy() def test_menu_item(self): TrashMenuItem().destroy() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_errorreport.py�����������������������������������������������������������0000644�0001750�0001750�00000007130�13112005742�021076� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. import sys import os import shutil from gi.repository import Gtk from quodlibet.errorreport import faulthandling, enable_errorhook, errorhook from quodlibet.errorreport.faulthandling import FaultHandlerCrash from quodlibet.errorreport.github import get_github_issue_url from quodlibet.errorreport.logdump import dump_to_disk from quodlibet.errorreport.ui import ErrorDialog, SubmitErrorDialog from quodlibet.errorreport.main import get_sentry from quodlibet.errorreport.sentrywrapper import SentryError, CapturedException from quodlibet.compat import text_type from . import TestCase, mkdtemp from .helper import temp_filename class Tfaulthandling(TestCase): def test_basic(self): with temp_filename() as filename: faulthandling.enable(filename) faulthandling.raise_and_clear_error() faulthandling.disable() def test_error(self): with temp_filename() as filename: with open(filename, "wb") as h: h.write(b"something") faulthandling.enable(filename) with self.assertRaises(FaultHandlerCrash): faulthandling.raise_and_clear_error() faulthandling.disable() def test_stacktrace_grouping(self): stack1 = 'File "%s", line 486 in string_at' % ( os.path.join("foo", "bar", "quux.py"),) stack2 = 'File "%s", line 350 in string_at' % ( os.path.join("baz", "bar", "quux.py"),) stack3 = 'File "%s", line 350 in other' % ( os.path.join("baz", "bar", "quux.py"),) key1 = FaultHandlerCrash(stack1).get_grouping_key() key2 = FaultHandlerCrash(stack2).get_grouping_key() key3 = FaultHandlerCrash(stack3).get_grouping_key() assert key1 and key2 and key3 assert key1 == key2 != key3 class Tgithub(TestCase): def test_main(self): try: raise Exception("foo") except Exception: url = get_github_issue_url(sys.exc_info()) assert url assert url.startswith("https://") class Tlogdump(TestCase): def test_main(self): temp_dir = mkdtemp() try: dump_dir = os.path.join(temp_dir, "dump") try: raise Exception("foo") except Exception: dump_to_disk(dump_dir, sys.exc_info()) assert len(os.listdir(dump_dir)) == 1 finally: shutil.rmtree(temp_dir) class Terrorui(TestCase): def test_main(self): w = Gtk.Window() ErrorDialog(w, u"foo", True).destroy() ErrorDialog(w, u"foo", False).destroy() SubmitErrorDialog(w, u"foo").destroy() class Terrorreport(TestCase): def test_enable(self): enable_errorhook(True) enable_errorhook(False) try: raise Exception except Exception: errorhook() class Tsentrywrapper(TestCase): def test_main(self): sentry = get_sentry() try: raise Exception except Exception: exc_info = sys.exc_info() try: err = sentry.capture(exc_info) except SentryError: return assert isinstance(err, CapturedException) assert isinstance(err.get_report(), text_type) err.set_comment(u"foo") err.set_comment(u"bar") ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_library.py����������������������������������������������������������0000644�0001750�0001750�00000005451�13112005742�021216� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from senf import fsnative, expanduser from quodlibet import config from quodlibet.util.library import split_scan_dirs, set_scan_dirs, \ get_exclude_dirs, get_scan_dirs from quodlibet.util import is_windows from quodlibet.util.path import get_home_dir, unexpand from tests import TestCase STANDARD_PATH = fsnative(u"/home/user/Music") OTHER_PATH = fsnative(u"/opt/party") GVFS_PATH = fsnative(u"/run/user/12345/gvfs/smb-share" ":server=12.23.34.45,share=/foo/bar/baz/path") GVFS_PATH_ESCAPED = fsnative(u"/run/user/12345/gvfs/smb-share" "\:server=12.23.34.45,share=/foo/bar/baz/path") class Tlibrary_utils(TestCase): def test_basic(self): if is_windows(): res = split_scan_dirs(u":Z:\\foo:C:/windows:") self.assertEquals(res, [u"Z:\\foo", u"C:/windows"]) else: res = split_scan_dirs(":%s:%s:" % (STANDARD_PATH, OTHER_PATH)) self.assertEquals(res, [STANDARD_PATH, OTHER_PATH]) def test_colon_paths(self): if not is_windows(): res = split_scan_dirs( ":%s:%s" % (STANDARD_PATH, GVFS_PATH_ESCAPED)) self.assertEquals(res, [STANDARD_PATH, GVFS_PATH]) def test_get_exclude_dirs(self): some_path = os.path.join(unexpand(get_home_dir()), "foo") config.set('library', 'exclude', some_path) assert expanduser(some_path) in get_exclude_dirs() assert all([isinstance(p, fsnative) for p in get_exclude_dirs()]) def test_get_scan_dirs(self): some_path = os.path.join(unexpand(get_home_dir()), "foo") config.set('settings', 'scan', some_path) assert expanduser(some_path) in get_scan_dirs() assert all([isinstance(p, fsnative) for p in get_scan_dirs()]) class Tset_scan_dirs(TestCase): @property def scan_dirs(self): return config.get('settings', 'scan') def test_set_scan_dirs_empty(self): set_scan_dirs([]) self.assertEqual(self.scan_dirs, "") def test_set_scan_dirs_single(self): set_scan_dirs([STANDARD_PATH]) self.assertEqual(self.scan_dirs, STANDARD_PATH) def test_set_scan_dirs_multiple(self): set_scan_dirs([OTHER_PATH, STANDARD_PATH]) self.assertEqual(self.scan_dirs, "%s:%s" % (OTHER_PATH, STANDARD_PATH)) def test_set_scan_dirs_colons(self): set_scan_dirs([STANDARD_PATH, GVFS_PATH]) expected = GVFS_PATH if is_windows() else GVFS_PATH_ESCAPED self.assertEqual(self.scan_dirs, "%s:%s" % (STANDARD_PATH, expected)) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_information.py������������������������������������������������������0000644�0001750�0001750�00000003754�13112005742�022101� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import fsnative from tests import TestCase, init_fake_app, destroy_fake_app from quodlibet.formats import AudioFile from quodlibet.library import SongLibrary from quodlibet.qltk.information import Information, OneArtist, OneAlbum, \ ManySongs, OneSong import quodlibet.config def AF(*args, **kwargs): a = AudioFile(*args, **kwargs) a.sanitize() return a class TInformation(TestCase): def setUp(self): quodlibet.config.init() init_fake_app() self.inf = None self.library = SongLibrary() def tearDown(self): destroy_fake_app() self.library.destroy() quodlibet.config.quit() if self.inf: self.inf.destroy() def test_none(self): Information(self.library, []).destroy() def test_one(self): f = AF({"~filename": fsnative(u"/dev/null")}) self.inf = Information(self.library, [f]) self.assert_child_is(OneSong) def test_two(self): f = AF({"~filename": fsnative(u"/dev/null")}) f2 = AF({"~filename": fsnative(u"/dev/null2")}) self.inf = Information(self.library, [f, f2]) self.assert_child_is(ManySongs) def test_album(self): f = AF({"~filename": fsnative(u"/dev/null"), "album": "woo"}) f2 = AF({"~filename": fsnative(u"/dev/null2"), "album": "woo"}) self.inf = Information(self.library, [f, f2]) self.assert_child_is(OneAlbum) def test_artist(self): f = AF({"~filename": fsnative(u"/dev/null"), "artist": "woo"}) f2 = AF({"~filename": fsnative(u"/dev/null2"), "artist": "woo"}) self.inf = Information(self.library, [f, f2]) self.assert_child_is(OneArtist) def assert_child_is(self, cls): self.failUnless(isinstance(self.inf.get_child(), cls)) ��������������������quodlibet-3.9.1/tests/test_qltk_views.py������������������������������������������������������������0000644�0001750�0001750�00000021312�13112005742�020677� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.views import AllTreeView, BaseView, TreeViewColumn, \ DragScroll, MultiDragTreeView, RCMTreeView, DragIconTreeView import quodlibet.config from quodlibet.compat import xrange from quodlibet.util import is_windows from gi.repository import Gtk, Gdk from . import skipIf from .helper import send_key_click, visible, send_button_click, realized def _fill_view(view): """Adds a model with 100 text rows and a column to display them. Returns the model. """ model = Gtk.ListStore(str) column = Gtk.TreeViewColumn("foo") title = Gtk.CellRendererText() column.pack_start(title, True) column.add_attribute(title, "text", 0) view.append_column(column) for x in xrange(100): model.append(row=["foo"]) view.set_model(model) return model class THintedTreeView(TestCase): def setUp(self): quodlibet.config.init() self.c = AllTreeView() def test_exists(self): self.failUnless(self.c) def tearDown(self): self.c.destroy() quodlibet.config.quit() class TBaseView(TestCase): def setUp(self): self.m = Gtk.ListStore(str) self.c = BaseView(model=self.m) def test_selection_changed(self): events = [] def on_selection_changed(*args): events.append(args) self.c.connect("selection-changed", on_selection_changed) self.m.append(row=["foo"]) self.c.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) self.c.get_selection().select_all() self.assertTrue(events) def test_remove(self): self.m.append(row=["foo"]) self.c.remove_iters([self.m[0].iter]) self.failIf(len(self.m)) self.m.append(row=["foo"]) self.c.remove_iters([]) self.failUnless(len(self.m)) self.c.remove_paths([self.m[0].path]) self.failIf(len(self.m)) def test_key_events(self): with visible(self.c): send_key_click(self.c, "<Primary>Right") send_key_click(self.c, "<Primary>Left") def test_select_func(self): self.m.append(row=["foo"]) self.m.append(row=["bar"]) self.failUnless(self.c.select_by_func(lambda r: True)) self.failIf(self.c.select_by_func(lambda r: False)) self.c.select_by_func(lambda r: False, scroll=False, one=True) def test_iter_select_func(self): # empty self.assertFalse(self.c.iter_select_by_func(lambda r: False)) self.assertFalse(self.c.iter_select_by_func(lambda r: True)) self.m.append(row=["foo"]) self.m.append(row=["bar"]) self.m.append(row=["foo"]) self.c.remove_selection() self.assertTrue(self.c.iter_select_by_func(lambda r: r[0] == "foo")) selection = self.c.get_selection() model, iter_ = selection.get_selected() self.assertEqual(model.get_path(iter_)[:], [0]) self.assertTrue(self.c.iter_select_by_func(lambda r: r[0] == "foo")) model, iter_ = selection.get_selected() self.assertEqual(model.get_path(iter_)[:], [2]) self.assertTrue(self.c.iter_select_by_func(lambda r: r[0] == "foo")) model, iter_ = selection.get_selected() self.assertEqual(model.get_path(iter_)[:], [0]) self.assertTrue(self.c.iter_select_by_func(lambda r: r[0] == "bar")) model, iter_ = selection.get_selected() self.assertEqual(model.get_path(iter_)[:], [1]) self.assertFalse(self.c.iter_select_by_func(lambda r: r[0] == "bar")) def test_remove_select_single(self): # empty self.c.remove_selection() model = _fill_view(self.c) # select first and remove selection = self.c.get_selection() length = len(model) selection.select_path(model[0].path) self.c.remove_selection() self.assertEqual(len(model), length - 1) model, iter_ = selection.get_selected() # afterwards the first is selected self.assertEqual(model[iter_].path, model[0].path) def test_remove_select_multiple(self): selection = self.c.get_selection() selection.set_mode(Gtk.SelectionMode.MULTIPLE) # empty self.c.remove_selection() model = _fill_view(self.c) # select first two and remove selection = self.c.get_selection() length = len(model) selection.select_range(model[0].path, model[1].path) self.c.remove_selection() self.assertEqual(len(model), length - 2) # afterwards the first is selected model, paths = selection.get_selected_rows() self.assertEqual(paths, [model[0].path]) def test_without_model(self): column = TreeViewColumn() self.c.append_column(column) column = self.c.get_columns()[0] column.set_sort_indicator(True) self.c.set_search_column(0) with self.c.without_model() as model: self.assertEqual(model, self.m) self.assertTrue(self.c.get_model() is None) self.assertEqual(self.c.get_search_column(), 0) column = self.c.get_columns()[0] self.assertTrue(column.get_sort_indicator()) def test_set_drag_dest(self): x, y = self.c.convert_bin_window_to_widget_coords(0, 0) # empty model self.c.unset_rows_drag_dest() self.c.set_drag_dest(x, y) path, pos = self.c.get_drag_dest_row() self.assertTrue(path is None) # filled model but not realized, fall back to last path model = _fill_view(self.c) self.c.set_drag_dest(x, y) path, pos = self.c.get_drag_dest_row() self.assertEqual(model[-1].path, path) # realized now, so the first path with realized(self.c): x, y = self.c.convert_bin_window_to_widget_coords(0, 0) self.c.unset_rows_drag_dest() self.c.set_drag_dest(x, y, into_only=False) path, pos = self.c.get_drag_dest_row() self.assertEqual(model[0].path, path) self.assertEqual(pos, Gtk.TreeViewDropPosition.BEFORE) self.c.unset_rows_drag_dest() self.c.set_drag_dest(x, y, into_only=True) path, pos = self.c.get_drag_dest_row() self.assertEqual(model[0].path, path) self.assertEqual(pos, Gtk.TreeViewDropPosition.INTO_OR_BEFORE) def tearDown(self): self.c.destroy() class TMultiDragTreeView(TestCase): def setUp(self): self.c = MultiDragTreeView() _fill_view(self.c) def test_click(self): with visible(self.c): send_button_click(self.c, Gdk.BUTTON_PRIMARY) send_button_click(self.c, Gdk.BUTTON_PRIMARY, primary=True) class TRCMTreeView(TestCase): def setUp(self): self.c = RCMTreeView() _fill_view(self.c) def test_right_click(self): with visible(self.c): send_button_click(self.c, Gdk.BUTTON_SECONDARY) send_button_click(self.c, Gdk.BUTTON_SECONDARY, primary=True) def test_popup(self): menu = Gtk.Menu() selection = self.c.get_selection() selection.set_mode(Gtk.SelectionMode.MULTIPLE) with visible(self.c): # the popup only shows if the underlying row is selected, # so select all first selection.select_all() self.assertTrue(self.c.popup_menu(menu, Gdk.BUTTON_SECONDARY, 0)) class TDragIconTreeView(TestCase): def setUp(self): self.c = DragIconTreeView() _fill_view(self.c) def test_create_drag_icon(self): model = self.c.get_model() all_paths = [row.path for row in model] self.assertFalse(self.c.create_multi_row_drag_icon(all_paths, 1)) with visible(self.c): self.assertTrue(self.c.create_multi_row_drag_icon(all_paths, 1)) self.assertFalse(self.c.create_multi_row_drag_icon([], 1)) self.assertTrue( self.c.create_multi_row_drag_icon([all_paths[0]], 10)) class TDragScroll(TestCase): def setUp(self): class ScrollClass(BaseView, DragScroll): pass self.c = ScrollClass() _fill_view(self.c) @skipIf(is_windows(), "fixme") def test_basic(self): self.c.scroll_motion(0, 0) self.c.scroll_motion(42, 42) self.c.scroll_motion(999, 999) self.c.scroll_disable() class TTreeViewColumn(TestCase): def test_main(self): TreeViewColumn(title="foo") area = Gtk.CellAreaBox() tvc = TreeViewColumn(cell_area=area) self.assertEqual(tvc.get_area(), area) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_data_editors.py�����������������������������������������������������0000644�0001750�0001750�00000001514�13112005742�022206� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import config from tests import TestCase from quodlibet.qltk.data_editors import TagListEditor class TMultiStringEditor(TestCase): def setUp(self): config.init() def test_no_strings(self): mse = TagListEditor("title") self.failUnlessEqual(mse.get_strings(), []) self.failUnlessEqual(mse.get_title(), "title") mse.destroy() def test_defaulting(self): defaults = ["one", "two three"] mse = TagListEditor("title", defaults) self.failUnlessEqual(mse.get_strings(), defaults) mse.destroy() def tearDown(self): config.quit() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_image_support.py���������������������������������������������������������0000644�0001750�0001750�00000001643�13112005742�021372� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. from gi.repository import GdkPixbuf from tests import TestCase, get_data_path class Timage_support(TestCase): """Mostly targeted at Windows/OSX, to make sure we package all the image decoders correctly """ IMAGES = [ "image.svg", "image.bmp", "image.png", "image.gif", "image.jpg", ] def test_create_pixbuf(self): for name in self.IMAGES: file_path = get_data_path(name) pb = GdkPixbuf.Pixbuf.new_from_file(file_path) assert pb assert pb.get_width() == 16 assert pb.get_height() == 16 ���������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_tracker.py����������������������������������������������������������0000644�0001750�0001750�00000006552�13112005742�021206� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import shutil from tests import TestCase, mkdtemp from gi.repository import Gtk from quodlibet import config from quodlibet.formats import AudioFile from quodlibet.player.nullbe import NullPlayer from quodlibet.qltk.tracker import SongTracker, FSInterface from quodlibet.library import SongLibrary class TSongTracker(TestCase): def setUp(self): config.init() self.p = NullPlayer() self.w = SongLibrary() self.s1 = AudioFile( {"~#playcount": 0, "~#skipcount": 0, "~#lastplayed": 10, "~filename": "foo", "~#length": 1.5}) self.s2 = AudioFile( {"~#playcount": 0, "~#skipcount": 0, "~#lastplayed": 10, "~filename": "foo", "~#length": 1.5}) self.cm = SongTracker(self.w, self.p, self) self.current = None def do(self): while Gtk.events_pending(): Gtk.main_iteration() def test_destroy(self): self.cm.destroy() def test_play(self): import time # Allow at least 2 second to elapse to simulate playing self.p.song = self.s1 self.p.paused = False time.sleep(2) self.do() self.p.emit('song-ended', self.s1, False) self.do() t = time.time() self.assertEquals(self.s1["~#playcount"], 1) self.assertEquals(self.s1["~#skipcount"], 0) self.failUnless(t - self.s1["~#lastplayed"] <= 1) def test_skip(self): self.p.emit('song-ended', self.s1, True) self.do() self.assertEquals(self.s1["~#playcount"], 0) self.assertEquals(self.s1["~#skipcount"], 1) self.failUnless(self.s1["~#lastplayed"], 10) def test_error(self): self.current = self.p.song = self.s1 self.p._error('Test error') self.do() self.assertEquals(self.s1["~#playcount"], 0) self.assertEquals(self.s1["~#skipcount"], 0) self.failUnless(self.s1["~#lastplayed"], 10) def test_restart(self): self.current = self.s1 self.p.emit('song-ended', self.s1, True) self.do() self.assertEquals(self.s1["~#playcount"], 0) self.assertEquals(self.s1["~#skipcount"], 0) def tearDown(self): self.w.destroy() config.quit() class TFSInterface(TestCase): def setUp(self): self.p = NullPlayer() self.dir = mkdtemp() self.filename = os.path.join(self.dir, "foo") self.fs = FSInterface(self.filename, self.p) def tearDown(self): self.p.destroy() shutil.rmtree(self.dir) def do(self): while Gtk.events_pending(): Gtk.main_iteration() def test_init(self): self.do() self.failIf(os.path.exists(self.filename)) def test_start(self): self.p.emit('song_started', AudioFile({"woo": "bar", "~#length": 10})) self.do() with open(self.filename, "rb") as h: self.failUnless(b"woo=bar\n" in h.read()) def test_song_ended(self): self.p.emit('song-started', AudioFile({"woo": "bar", "~#length": 10})) self.do() self.p.emit('song-ended', {}, False) self.do() self.failIf(os.path.exists(self.filename)) ������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_edittags.py���������������������������������������������������������0000644�0001750�0001750�00000006013�13112005742�021347� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.edittags import SplitValues, SplitDisc, SplitTitle, \ SplitArranger, AddTagDialog, AudioFileGroup from quodlibet.formats import AudioFile from quodlibet.library import SongLibrary import quodlibet.config class TEditTags(TestCase): def setUp(self): quodlibet.config.init() def tearDown(self): quodlibet.config.quit() def test_items(self): SplitValues("foo", "bar").destroy() SplitDisc("foo", "bar").destroy() SplitTitle("foo", "bar").destroy() SplitArranger("foo", "bar").destroy() def test_addtag_dialog(self): lib = SongLibrary() AddTagDialog(None, ["artist"], lib).destroy() class GroupSong(AudioFile): def __init__(self, can_multiple=True, can_change=True, cant_change=[]): self._can_multiple = can_multiple self._can_change = can_change self._cant_change = cant_change def can_multiple_values(self, key=None): if key is None: return self._can_multiple if self._can_multiple is True: return True return key in self._can_multiple def can_change(self, key=None): if key is None: return self._can_change if self._can_change is True: return key not in self._cant_change return key in self._can_change class TAudioFileGroup(TestCase): def test_multiple_values(self): group = AudioFileGroup([GroupSong(True), GroupSong(True)]) self.assertTrue(group.can_multiple_values() is True) self.assertTrue(group.can_multiple_values("foo") is True) group = AudioFileGroup([GroupSong(["ha"]), GroupSong(True)]) self.assertEqual(group.can_multiple_values(), {"ha"}) self.assertFalse(group.can_multiple_values("foo")) self.assertTrue(group.can_multiple_values("ha")) group = AudioFileGroup([GroupSong(["foo", "ha"]), GroupSong(["ha"])]) self.assertEqual(group.can_multiple_values(), {"ha"}) self.assertFalse(group.can_multiple_values("foo")) self.assertTrue(group.can_multiple_values("ha")) def test_can_change(self): group = AudioFileGroup( [GroupSong(can_change=True), GroupSong(can_change=True)]) self.assertTrue(group.can_change() is True) self.assertTrue(group.can_change("foo") is True) group = AudioFileGroup( [GroupSong(can_change=["foo", "ha"]), GroupSong(can_change=["ha"])]) self.assertEqual(group.can_change(), {"ha"}) self.assertFalse(group.can_change("foo")) self.assertTrue(group.can_change("ha")) group = AudioFileGroup([GroupSong(), GroupSong(cant_change=["baz"])]) self.assertTrue(group.can_change()) self.assertFalse(group.can_change("baz")) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_vgm.py�����������������������������������������������������������0000644�0001750�0001750�00000002351�13112005742�021035� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, get_data_path from quodlibet.formats.vgm import VgmFile class TVgmFile(TestCase): def setUp(self): self.song = VgmFile(get_data_path('test.vgm')) def test_length(self): self.failUnlessAlmostEqual(2.81, self.song("~#length", 0), 1) def test_reload(self): self.song["title"] = "foobar" self.song.reload() self.failUnlessEqual(self.song("title"), "foobar") def test_write(self): self.song.write() def test_can_change(self): self.failUnlessEqual(self.song.can_change(), ["title"]) self.failUnless(self.song.can_change("title")) self.failIf(self.song.can_change("album")) def test_invalid(self): path = get_data_path('empty.xm') self.failUnlessRaises(Exception, VgmFile, path) def test_format_codec(self): self.assertEqual(self.song("~format"), "VGM") self.assertEqual(self.song("~codec"), "VGM") self.assertEqual(self.song("~encoding"), "") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_browsers_albums.py�������������������������������������������������������0000644�0001750�0001750�00000016155�13112005742�021731� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2014 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from functools import cmp_to_key from gi.repository import Gtk from senf import fsnative from quodlibet.browsers._base import DisplayPatternMixin from . import TestCase from .helper import realized from quodlibet import config from quodlibet.browsers.albums import AlbumList from quodlibet.browsers.albums.models import AlbumItem from quodlibet.browsers.albums.prefs import Preferences, DEFAULT_PATTERN_TEXT from quodlibet.browsers.albums.main import (compare_title, compare_artist, compare_genre, compare_rating, compare_date) from quodlibet.formats import AudioFile from quodlibet.library import SongLibrary, SongLibrarian from quodlibet.util.collection import Album SONGS = [ AudioFile({ "album": "one", "artist": "piman", "~filename": fsnative(u"/dev/null"), }), AudioFile({ "album": "two", "artist": "mu", "~filename": fsnative(u"/dev/zero"), }), AudioFile({ "album": "three", "artist": "boris", "~filename": fsnative(u"/bin/ls"), }), AudioFile({ "album": "three", "artist": "boris", "~filename": fsnative(u"/bin/ls2"), }), ] SONGS.sort() class TAlbumPrefs(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_main(self): class Browser(Gtk.Box, DisplayPatternMixin): _DEFAULT_PATTERN_TEXT = "" widget = Preferences(Browser()) widget.destroy() class TAlbumSort(TestCase): def _get_album(self, dict_): song = AudioFile(dict_) album = Album(song) album.songs.add(song) return AlbumItem(album) def assertOrder(self, func, list_): key = cmp_to_key(func) # sort twice for full line coverage of the compare function reversed_ = list(sorted(list_, key=key, reverse=True)) sorted_ = list(sorted(list_, key=key)) self.assertEqual(reversed_[::-1], sorted_) self.assertEqual(list_, sorted_) def test_sort_title(self): a = self._get_album({"album": "a"}) b = self._get_album({"album": "b"}) n = self._get_album({"album": ""}) self.assertOrder(compare_title, [AlbumItem(None), a, b, n]) def test_sort_artist(self): a = self._get_album({"album": "b", "artist": "x"}) b = self._get_album({"album": "a", "artist": "y"}) c = self._get_album({"album": "a", "artist": ""}) n = self._get_album({"album": ""}) self.assertOrder(compare_artist, [AlbumItem(None), a, b, c, n]) def test_sort_genre(self): a = self._get_album({"album": "b", "genre": "x"}) b = self._get_album({"album": "a", "genre": "y"}) c = self._get_album({"album": "a", "genre": ""}) n = self._get_album({"album": ""}) self.assertOrder(compare_genre, [AlbumItem(None), a, b, c, n]) def test_sort_date(self): a = self._get_album({"album": "b", "date": "1970"}) b = self._get_album({"album": "a", "date": "2038"}) c = self._get_album({"album": "a", "date": ""}) n = self._get_album({"album": ""}) self.assertOrder(compare_date, [AlbumItem(None), a, b, c, n]) def test_sort_rating(self): a = self._get_album({"album": "b", "~#rating": 0.5}) b = self._get_album({"album": "a", "~#rating": 0.25}) c = self._get_album({"album": "x", "~#rating": 0.0}) n = self._get_album({"album": "", "~#rating": 0.25}) self.assertOrder(compare_rating, [AlbumItem(None), a, b, c, n]) class TAlbumBrowser(TestCase): def setUp(self): config.init() library = SongLibrary() library.librarian = SongLibrarian() AlbumList.init(library) for af in SONGS: af.sanitize() library.add(SONGS) self.bar = AlbumList(library) self._id = self.bar.connect("songs-selected", self._selected) self._id2 = self.bar.connect("songs-activated", self._activated) with realized(self.bar): self.bar.filter_text("") self._wait() self.songs = [] self.activated = False def _activated(self, albumlist): self.activated = True def _selected(self, albumlist, songs, *args): self.songs = songs def _wait(self): while Gtk.events_pending(): Gtk.main_iteration() def test_activated(self): with realized(self.bar): view = self.bar.view view.row_activated(Gtk.TreePath((0,)), view.get_column(0)) self.failUnless(self.activated) def test_can_filter(self): with realized(self.bar): self.failUnless(self.bar.can_filter(None)) self.failUnless(self.bar.can_filter("album")) self.failUnless(self.bar.can_filter("foobar")) self.failIf(self.bar.can_filter("~#length")) self.failIf(self.bar.can_filter("title")) def test_set_text(self): with realized(self.bar): self.bar.filter_text("artist=piman") self._wait() self.failUnlessEqual(len(self.songs), 1) self.bar.filter_text("") self._wait() self.failUnlessEqual(set(self.songs), set(SONGS)) def test_filter_album(self): with realized(self.bar): self.bar.filter_text("dsagfsag") self._wait() self.failUnlessEqual(len(self.songs), 0) self.bar.filter_text("") self._wait() self.bar.filter("album", ["one", "three"]) self._wait() self.failUnlessEqual(len(self.songs), 3) def test_filter_artist(self): with realized(self.bar): self.bar.filter("artist", ["piman"]) self._wait() self.failUnlessEqual(len(self.songs), 1) self.failUnlessEqual(self.songs[0]("artist"), "piman") def test_header(self): self.failIf(self.bar.headers) def test_list(self): albums = self.bar.list_albums() self.failUnlessEqual(set(albums), {s.album_key for s in SONGS}) self.bar.filter_albums([SONGS[0].album_key]) self._wait() self.failUnlessEqual({s.album_key for s in self.songs}, {SONGS[0].album_key}) def test_active_filter(self): with realized(self.bar): self.bar.filter("artist", ["piman"]) self._wait() self.failUnless(self.bar.active_filter(self.songs[0])) for s in SONGS: if s is not self.songs[0]: self.failIf(self.bar.active_filter(s)) def test_default_display_pattern(self): pattern_text = self.bar.display_pattern_text self.failUnlessEqual(pattern_text, DEFAULT_PATTERN_TEXT) self.failUnless("<album>" in pattern_text) def tearDown(self): self.bar.disconnect(self._id) self.bar.disconnect(self._id2) config.quit() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_queue.py������������������������������������������������������������0000644�0001750�0001750�00000002367�13115325606�020706� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.order.reorder import OrderShuffle from tests import TestCase from quodlibet.player.nullbe import NullPlayer from quodlibet.qltk.queue import QueueExpander, PlaybackStatusIcon from quodlibet.library import SongLibrary import quodlibet.config class TQueueExpander(TestCase): def setUp(self): quodlibet.config.init() player = NullPlayer() self.queue = QueueExpander(SongLibrary(), player) def test_ctr(self): pass def test_status_icon(self): widget = PlaybackStatusIcon() widget.play() widget.stop() widget.pause() widget.pause() def test_random_at_startup(self): self.failIf(isinstance(self.queue.model.order, OrderShuffle)) quodlibet.config.set("memory", "shufflequeue", True) self.queue = self.queue = QueueExpander(SongLibrary(), NullPlayer()) # See issue #2411 self.failUnless(isinstance(self.queue.model.order, OrderShuffle)) def tearDown(self): self.queue.destroy() quodlibet.config.quit() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_cbes.py�������������������������������������������������������������0000644�0001750�0001750�00000010536�13112005742�020464� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, mkstemp import os from quodlibet.qltk.cbes import ComboBoxEntrySave, StandaloneEditor import quodlibet.config class TComboBoxEntrySave(TestCase): memory = "pattern 1\npattern 2\n" saved = "pattern text\npattern name\n" def setUp(self): quodlibet.config.init() h, self.fname = mkstemp() os.close(h) with open(self.fname, "w") as f: f.write(self.memory) with open(self.fname + ".saved", "w") as f: f.write(self.saved) self.cbes = ComboBoxEntrySave(self.fname, count=2) self.cbes2 = ComboBoxEntrySave(self.fname, count=2) def test_equivalence(self): model1 = self.cbes.get_model() model2 = self.cbes2.get_model() self.failUnlessEqual(model1, model2) rows1 = list(model1) rows2 = list(model2) for row1, row2 in zip(rows1, rows2): self.failUnlessEqual(row1[0], row2[0]) self.failUnlessEqual(row1[1], row2[1]) self.failUnlessEqual(row1[2], row2[2]) def test_text_changed_signal(self): called = [0] def cb(*args): called[0] += 1 def get_count(): c = called[0] called[0] = 0 return c self.cbes.connect("text-changed", cb) entry = self.cbes.get_child() entry.set_text("foo") self.failUnlessEqual(get_count(), 1) self.cbes.prepend_text("bar") # in case the model got changed but the entry is still the same # the text-changed signal should not be triggered self.failUnlessEqual(entry.get_text(), "foo") self.failUnlessEqual(get_count(), 0) def test_shared_model(self): self.cbes.prepend_text("a test") self.test_equivalence() def test_initial_size(self): # 1 saved, Edit, separator, 2 remembered self.failUnlessEqual(5, len(self.cbes.get_model())) def test_prepend_text(self): self.cbes.prepend_text("pattern 3") self.memory = "pattern 3\npattern 1\n" self.test_save() def test_save(self): self.cbes.write() self.failUnlessEqual(self.memory, open(self.fname).read()) self.failUnlessEqual(self.saved, open(self.fname + ".saved").read()) def test_set_text_then_prepend(self): self.cbes.get_child().set_text("foobar") self.cbes.prepend_text("foobar") self.memory = "foobar\npattern 1\n" self.test_save() def tearDown(self): self.cbes.destroy() self.cbes2.destroy() os.unlink(self.fname) os.unlink(self.fname + ".saved") quodlibet.config.quit() class TStandaloneEditor(TestCase): TEST_KV_DATA = [ ("Search Foo", "https://foo.com/search?q=<artist>-<title>")] def setUp(self): quodlibet.config.init() h, self.fname = mkstemp() os.close(h) with open(self.fname + ".saved", "w") as f: f.write( "%s\n%s\n" % (self.TEST_KV_DATA[0][1], self.TEST_KV_DATA[0][0])) self.sae = StandaloneEditor(self.fname, "test", None, None) def test_constructor(self): self.failUnless(self.sae.model) data = [(row[1], row[0]) for row in self.sae.model] self.failUnlessEqual(data, self.TEST_KV_DATA) def test_load_values(self): values = StandaloneEditor.load_values(self.fname + ".saved") self.failUnlessEqual(self.TEST_KV_DATA, values) def test_defaults(self): defaults = [("Dot-com Dream", "http://<artist>.com")] try: os.unlink(self.fname) except OSError: pass # Now create a new SAE without saved results and use defaults self.fname = "foo" self.sae.destroy() self.sae = StandaloneEditor(self.fname, "test2", defaults, None) self.sae.write() data = [(row[1], row[0]) for row in self.sae.model] self.failUnlessEqual(defaults, data) def tearDown(self): self.sae.destroy() try: os.unlink(self.fname) os.unlink(self.fname + ".saved") except OSError: pass quodlibet.config.quit() ������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_remote.py��������������������������������������������������������0000644�0001750�0001750�00000001563�13112005742�021543� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import fsnative from tests import TestCase from quodlibet.formats.remote import RemoteFile class TRemoteFile(TestCase): def test_path_types(self): f = RemoteFile("http://example.com") self.assertTrue(isinstance(f["~mountpoint"], fsnative)) self.assertTrue(isinstance(f["~filename"], fsnative)) def test_fix_old_types(self): f = RemoteFile("http://example.com") dict.__setitem__(f, "~filename", b"foo") self.assertTrue(isinstance(f["~filename"], fsnative)) dict.__setitem__(f, "~filename", u"foo") self.assertTrue(isinstance(f["~filename"], fsnative)) ���������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_tagscombobox.py�����������������������������������������������������0000644�0001750�0001750�00000002615�13112005742�022236� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, skipIf from quodlibet.util.tags import USER_TAGS from quodlibet.qltk import is_wayland class TagsCombo(TestCase): def setUp(self): self.all = self.Kind() self.some = self.Kind(["artist", "album", "~people", "foobar"]) def tearDown(self): self.all.destroy() self.some.destroy() class TagsComboMixin(object): def test_none(self): self.failUnlessRaises(ValueError, self.Kind, []) def test_some(self): self.some.set_active(2) self.failUnlessEqual(self.some.tag, "foobar") def test_all(self): tags = list(USER_TAGS) tags.sort() for i, value in enumerate(tags): self.all.set_active(i) self.failUnlessEqual(self.all.tag, value) @skipIf(is_wayland(), "crashes..") class TTagsComboBox(TagsCombo): from quodlibet.qltk.tagscombobox import TagsComboBox as Kind Kind @skipIf(is_wayland(), "crashes..") class TTagsComboBoxEntry(TagsCombo): from quodlibet.qltk.tagscombobox import TagsComboBoxEntry as Kind Kind def test_custom(self): self.all.get_child().set_text("a new tag") self.failUnlessEqual(self.all.tag, "a new tag") �������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_browsers_soundcloud.py���������������������������������������������������0000644�0001750�0001750�00000005412�13112005742�022617� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from unittest import TestCase import time from quodlibet import config from quodlibet.browsers.soundcloud import query from quodlibet.browsers.soundcloud.api import SoundcloudApiClient from quodlibet.browsers.soundcloud.query import SoundcloudQuery, convert_time from quodlibet import const from quodlibet.util.dprint import print_d NONE = set([]) class TestExtract(TestCase): @classmethod def setUpClass(cls): const.DEBUG = True @classmethod def tearDownClass(cls): const.DEBUG = False def test_extract_single_tag(self): self.verify("artist=jay z", {"jay z"}) def test_extract_unsupported(self): try: self.verify("musicbrainz_discid=12345", NONE) except query.error: pass else: self.fail("Should have thrown") def test_extract_composite_text(self): self.verify("&(foo, bar)", {"foo", "bar"}) self.verify("|(either, or)", {"either", "or"}) def test_numeric_simple(self): self.verify("#(length=180)", {'180000'}, term='duration') def test_extract_date(self): now = int(time.time()) terms = SoundcloudQuery("#(date>today)", clock=lambda: now).terms self.failUnlessEqual(terms['created_at[from]'].pop(), convert_time(now - 86400)) def test_numeric_relative(self): self.verify("#(length>180)", {'180000'}, term='duration[from]') self.verify("#(180<=length)", {'180000'}, term='duration[from]') self.verify("#(length<360)", {'360000'}, term='duration[to]') self.verify("#(360>=length)", {'360000'}, term='duration[to]') def test_extract_tag_inter(self): self.verify("genre=&(jazz, funk)", {'jazz', 'funk'}) def test_extract_tag_union(self): self.verify("genre=|(jazz, funk)", {'jazz', 'funk'}) def test_extract_complex(self): self.verify("&(artist='foo', genre=|(rock, metal))", {'foo', 'rock', 'metal'}) def verify(self, text, expected, term='q'): print_d("Trying '%s'..." % text) terms = SoundcloudQuery(text).terms self.failUnlessEqual(terms[term], expected, msg="terms[%s] wasn't %r. Full terms: %r" % (term, expected, terms)) class TestHttpsDefault(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_setup_default(self): self.failUnless(SoundcloudApiClient().root.startswith('https://'), msg="API client should use HTTPS") ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/quality/����������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�016565� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/quality/test_pyflakes.py������������������������������������������������������0000644�0001750�0001750�00000003167�13112005742�022025� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import pytest from quodlibet.compat import PY3 from quodlibet.util import is_wine, is_windows os.environ["PYFLAKES_NODOCTEST"] = "1" os.environ["PYFLAKES_BUILTINS"] = "execfile,reload" try: from pyflakes.scripts import pyflakes except ImportError: pyflakes = None from tests import TestCase from tests.helper import capture_output from .util import iter_project_py_files def create_pool(): if is_wine() or (PY3 and is_windows()): # ProcessPoolExecutor is broken under wine, and under py3+msys2 # https://github.com/Alexpux/MINGW-packages/issues/837 return ThreadPoolExecutor(1) else: return ProcessPoolExecutor(None) def _check_file(f): with capture_output() as (o, e): pyflakes.checkPath(f) return o.getvalue().splitlines() def check_files(files, ignore=[]): lines = [] with create_pool() as pool: for res in pool.map(_check_file, files): lines.extend(res) return sorted(lines) @pytest.mark.quality class TPyFlakes(TestCase): def test_all(self): assert pyflakes is not None, "pyflakes is missing" files = iter_project_py_files() files = (f for f in files if not f.endswith("compat.py")) errors = check_files(files) if errors: raise Exception("\n".join(errors)) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/quality/util.py���������������������������������������������������������������0000644�0001750�0001750�00000001602�13112005742�020115� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. import os import quodlibet def iter_py_files(root): for base, dirs, files in os.walk(root): for file_ in files: path = os.path.join(base, file_) if os.path.splitext(path)[1] == ".py": yield path def iter_project_py_files(): root = os.path.dirname(os.path.abspath(quodlibet.__path__[0])) skip = [ os.path.join(root, "quodlibet", "optpackages"), ] for path in iter_py_files(root): if any((path.startswith(s + os.sep) or s == path) for s in skip): continue yield path ������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/quality/__init__.py�����������������������������������������������������������0000644�0001750�0001750�00000000317�13112005742�020701� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/quality/test_pep8.py����������������������������������������������������������0000644�0001750�0001750�00000003402�13112005742�021053� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import itertools from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import pytest from quodlibet.compat import PY3 from quodlibet.util import is_wine, is_windows from tests import TestCase from tests.helper import capture_output from .util import iter_project_py_files try: import pep8 as pycodestyle except ImportError: try: import pycodestyle except ImportError: pycodestyle = None def create_pool(): if is_wine() or(PY3 and is_windows()): # ProcessPoolExecutor is broken under wine, and under py3+msys2 # https://github.com/Alexpux/MINGW-packages/issues/837 return ThreadPoolExecutor(1) else: return ProcessPoolExecutor(None) def _check_file(f, ignore): style = pycodestyle.StyleGuide(ignore=ignore) with capture_output() as (o, e): style.check_files([f]) return o.getvalue().splitlines() def check_files(files, ignore=[]): lines = [] with create_pool() as pool: for res in pool.map(_check_file, files, itertools.repeat(ignore)): lines.extend(res) return sorted(lines) @pytest.mark.quality class TPEP8(TestCase): IGNORE = ["E12", "E261", "E265", "E713", "W602", "E402", "E731", "W503", "E741", "E305", "W601", "E722"] def test_all(self): assert pycodestyle is not None, "pep8/pycodestyle is missing" files = iter_project_py_files() errors = check_files(files, ignore=self.IGNORE) if errors: raise Exception("\n".join(errors)) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_songmodel.py��������������������������������������������������������0000644�0001750�0001750�00000031513�13112005742�021535� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from gi.repository import Gtk from quodlibet.player.nullbe import NullPlayer from quodlibet.qltk.songmodel import PlaylistModel, PlaylistMux from quodlibet.qltk.playorder import Order, OrderShuffle, OrderInOrder, \ RepeatSongForever, RepeatListForever def do_events(): while Gtk.events_pending(): Gtk.main_iteration() class TPlaylistModel(TestCase): def setUp(self): self.pl = PlaylistModel() self.pl.set(range(10)) do_events() self.failUnless(self.pl.current is None) def test_current_recover(self): self.pl.set(range(10)) self.pl.next() self.failUnlessEqual(self.pl.current, 0) self.pl.set(range(20, 30)) self.failUnless(self.pl.current is None) self.pl.current_iter = self.pl.current_iter self.failUnless(self.pl.current is None) self.pl.set(range(10)) self.failUnlessEqual(self.pl.current, 0) def test_current_recover_unknown(self): self.pl.set([1, 2, 3, 4]) self.assertIs(self.pl.go_to(5), None) self.pl.set([1, 2, 3, 4, 5]) self.assertEqual(self.pl.current, 5) self.assertIsNot(self.pl.go_to(4), None) self.assertEqual(self.pl.current, 4) def test_isempty(self): self.failIf(self.pl.is_empty()) self.pl.clear() self.failUnless(self.pl.is_empty()) def test_get(self): self.assertEqual(self.pl.get(), list(range(10))) self.pl.set(range(12)) Gtk.main_iteration_do(False) self.assertEqual(self.pl.get(), list(range(12))) def test_next(self): self.pl.next() self.failUnlessEqual(self.pl.current, 0) self.pl.next() self.failUnlessEqual(self.pl.current, 1) self.pl.go_to(9) self.failUnlessEqual(self.pl.current, 9) self.pl.next() self.failUnless(self.pl.current is None) def test_find(self): self.failUnlessEqual(self.pl[self.pl.find(8)][0], 8) def test_find_not_there(self): self.failUnless(self.pl.find(22) is None) def test_find_all(self): to_find = [1, 4, 5, 8, 9] iters = self.pl.find_all(to_find) for i, v in zip(iters, to_find): self.failUnlessEqual(self.pl[i][0], v) def test_find_all_duplicates(self): # ignore duplicates in parameters self.assertTrue(len(self.pl.find_all([1, 1])), 1) # but find duplicates self.pl.set([1, 1]) self.assertTrue(len(self.pl.find_all([1])), 2) def test_find_all_some_missing(self): to_find = [1, 4, 18, 5, 8, 9, -1] iters = self.pl.find_all(to_find) to_find.remove(18) to_find.remove(-1) for i, v in zip(iters, to_find): self.failUnlessEqual(self.pl[i][0], v) def test_find_all_empty(self): to_find = [100, 200, -11] iters = self.pl.find_all(to_find) self.failUnlessEqual(iters, []) def test_contains(self): self.failUnless(1 in self.pl) self.failUnless(8 in self.pl) self.failIf(22 in self.pl) def test_removal(self): self.pl.go_to(8) for i in range(3, 8): self.pl.remove(self.pl.find(i)) self.pl.next() self.failUnlessEqual(self.pl.current, 9) def test_next_at_end_finishes(self): self.pl.go_to(9) self.pl.next() self.assertEqual(self.pl.current, None) def test_shuffle(self): self.pl.order = OrderShuffle() for i in range(5): history = [self.pl.current for _ in range(10) if self.pl.next() or True] self.assertNotEqual(history, list(range(10))) self.assertEqual(sorted(history), list(range(10))) self.pl.next() self.assertEqual(self.pl.current, None) self.pl.order.reset(self.pl) def test_shuffle_repeat_forever(self): self.pl.order = RepeatSongForever(OrderShuffle()) old = self.pl.current for i in range(5): self.pl.next_ended() self.assertEqual(self.pl.current, old) def test_shuffle_repeat(self): self.pl.order = RepeatListForever(OrderShuffle()) numbers = [self.pl.current for _ in range(30) if self.pl.next_ended() or True] allnums = sorted(list(range(10)) * 3) self.assertNotEqual(numbers, allnums) numbers.sort() self.assertEqual(numbers, allnums) def test_repeat_song_repeats_on_end(self): self.pl.order = RepeatSongForever(OrderInOrder()) self.pl.go_to(3) self.failUnlessEqual(self.pl.current, 3) self.pl.next_ended() self.failUnlessEqual(self.pl.current, 3) def test_repeat_song_uses_underlying_on_explicit(self): self.pl.order = RepeatSongForever(OrderInOrder()) self.pl.go_to(3) self.pl.next() self.failUnlessEqual(self.pl.current, 4) def test_repeat_all_cycles_playlist(self): self.pl.go_to(3) self.pl.order = RepeatListForever(OrderInOrder()) self.failUnlessEqual(self.pl.current, 3) self.pl.next() self.failUnlessEqual(self.pl.current, 4) for i in range(9): self.pl.next_ended() self.failUnlessEqual(self.pl.current, 3) def test_previous(self): self.pl.go_to(2) self.failUnlessEqual(self.pl.current, 2) self.pl.previous() self.failUnlessEqual(self.pl.current, 1) self.pl.previous() self.failUnlessEqual(self.pl.current, 0) self.pl.previous() self.failUnlessEqual(self.pl.current, 0) def test_go_to_saves_current(self): self.pl.go_to(5) self.failUnlessEqual(self.pl.current, 5) self.pl.set([5, 10, 15, 20]) Gtk.main_iteration_do(False) self.pl.next() self.failUnlessEqual(self.pl.current, 10) def test_go_to_order(self): self.pl.order = OrderShuffle() for i in range(5): self.pl.go_to(5) self.failUnlessEqual(self.pl.current, 5) self.pl.go_to(1) self.failUnlessEqual(self.pl.current, 1) def test_go_to(self): class SetOrder(Order): # most orders don't change iter here, # so make sure this gets handled right def set_explicit(self, playlist, iter): return playlist.iter_next(iter) def set_implicit(self, playlist, iter): return playlist.iter_next(playlist.iter_next(iter)) self.pl.order = SetOrder() self.failUnlessEqual(self.pl[self.pl.go_to(5, True)][0], 6) self.failUnlessEqual(self.pl[self.pl.go_to(5, False)][0], 7) def test_go_to_none(self): for i in range(5): self.pl.go_to(None) self.failUnlessEqual(self.pl.current, None) self.pl.next() self.failUnlessEqual(self.pl.current, 0) def test_reset(self): self.pl.go_to(5) self.failUnlessEqual(self.pl.current, 5) self.pl.reset() self.failUnlessEqual(self.pl.current, 0) def test_reset_order(self): self.pl.order = OrderInOrder() self.pl.go_to(5) self.failUnlessEqual(self.pl.current, 5) self.pl.reset() self.failUnlessEqual(self.pl.current, 0) def test_restart(self): self.pl.go_to(1) self.pl.set([101, 102, 103, 104]) Gtk.main_iteration_do(False) self.pl.next() self.failUnlessEqual(self.pl.current, 101) def test_next_nosong_536(self): self.pl.go_to(1) self.pl.order = OrderShuffle() self.pl.set([]) Gtk.main_iteration_do(False) self.pl.next() def test_clear_current(self): self.pl.go_to(1) self.pl.clear() self.pl.go_to(None) def shutDown(self): self.pl.destroy() class TPlaylistMux(TestCase): def setUp(self): self.q = PlaylistModel() self.pl = PlaylistModel() self.p = NullPlayer() self.mux = PlaylistMux(self.p, self.q, self.pl) self.p.setup(self.mux, None, 0) self.failUnless(self.pl.current is None) def test_destroy(self): self.mux.destroy() def test_only_pl(self): self.pl.set(range(10)) do_events() self.failUnless(self.mux.current is None) songs = [self.next() for i in range(10)] self.failUnlessEqual(songs, list(range(10))) self.next() self.failUnless(self.mux.current is None) def test_only_q(self): self.q.set(range(10)) do_events() self.failUnless(self.mux.current is None) songs = [self.next() for i in range(10)] self.failUnlessEqual(songs, list(range(10))) self.next() self.failUnless(self.mux.current is None) def test_mixed(self): self.q.set(range(5)) self.pl.set(range(5, 10)) do_events() self.failUnless(self.mux.current is None) songs = [self.next() for i in range(10)] self.failUnlessEqual(songs, list(range(10))) self.next() self.failUnless(self.mux.current is None) def test_newplaylist(self): self.pl.set(range(5, 10)) do_events() self.failUnless(self.mux.current is None) self.mux.go_to(7) self.failUnlessEqual(self.mux.current, 7) self.pl.set([3, 5, 12, 11]) do_events() self.failUnlessEqual(self.mux.current, None) self.pl.set([19, 8, 12, 3]) do_events() self.failUnlessEqual(self.mux.current, None) self.pl.set([3, 7, 9, 11]) do_events() self.mux.next() self.failUnlessEqual(self.mux.current, 9) def test_halfway(self): self.pl.set(range(10)) do_events() self.failUnless(self.mux.current is None) songs = [self.next() for i in range(5)] self.q.set(range(100, 105)) do_events() songs.extend([self.next() for i in range(10)]) self.failUnlessEqual( songs, [0, 1, 2, 3, 4, 100, 101, 102, 103, 104, 5, 6, 7, 8, 9]) self.next() self.failUnless(self.mux.current is None) def test_removal(self): self.pl.set(range(0, 5)) self.q.set(range(10, 15)) do_events() songs = [self.next() for i in range(3)] self.q.remove(self.q.find(14)) self.q.remove(self.q.find(13)) songs.extend([self.next() for i in range(5)]) self.failUnlessEqual(songs, [10, 11, 12, 0, 1, 2, 3, 4]) def next(self): self.mux.next() song = self.mux.current self.p.emit('song-started', self.mux.current) do_events() return song def test_goto(self): self.pl.set(range(10)) self.q.set(range(10, 20)) do_events() self.failUnless(self.mux.current is None) self.mux.go_to(5) self.failUnlessEqual(self.mux.current, 5) self.mux.go_to(2) self.failUnlessEqual(self.mux.current, 2) self.failUnlessEqual(self.next(), 10) self.mux.go_to(7) self.failUnlessEqual(self.mux.current, 7) self.failUnlessEqual(self.next(), 11) def test_random_queue_666(self): for i in range(5): self.mux.go_to(None) self.pl.set([1]) do_events() self.failUnless(self.mux.current is None) self.q.order = OrderShuffle() self.failUnless(self.next() == 1) self.q.set([10, 11]) do_events() value = self.next() self.failUnless( value in [10, 11], "got %r, expected 10 or 11" % value) if value == 10: next = 11 else: next = 10 self.failUnlessEqual(self.next(), next) def test_sourced(self): self.pl.set(range(10)) self.q.set(range(10)) self.mux.go_to(None) self.failUnless(self.pl.sourced) self.q.go_to(1) self.p.next() self.failIf(self.pl.sourced) def test_unqueue(self): self.q.set(range(100)) self.mux.unqueue(range(100)) self.failIf(len(self.q)) def test_queue(self): self.mux.enqueue(range(40)) self.failUnlessEqual(list(self.q.itervalues()), list(range(40))) def test_queue_move_entry(self): self.q.set(range(10)) self.p.next() self.assertEqual(self.p.song, 0) self.q.move_after(self.q[-1].iter, None) self.p.next() self.assertEqual(self.p.song, 9) def test_goto_queue(self): self.pl.set(range(20, 30)) self.q.set(range(10)) self.mux.go_to(self.q[-1].iter, source=self.q) self.assertTrue(self.q.sourced) self.assertEqual(self.mux.current, self.q[-1][0]) def tearDown(self): self.p.destroy() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_remote.py����������������������������������������������������������������0000644�0001750�0001750�00000002511�13112005742�020002� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import fsn2bytes, bytes2fsn from . import TestCase, skipIf from .helper import temp_filename from quodlibet.remote import QuodLibetUnixRemote from quodlibet.util import is_windows class Mock(object): def __init__(self, resp=None): self.lines = [] self.resp = resp def handle_line(self, app, line): self.lines.append(line) return self.resp @skipIf(is_windows(), "unix only") class TUnixRemote(TestCase): def test_fifo(self): mock = Mock() remote = QuodLibetUnixRemote(None, mock) remote._callback(b"foo\n") remote._callback(b"bar\nbaz") self.assertEqual( mock.lines, [bytes2fsn(b, None) for b in [b"foo", b"bar", b"baz"]]) def test_response(self): with temp_filename() as fn: mock = Mock(resp=bytes2fsn(b"resp", None)) remote = QuodLibetUnixRemote(None, mock) remote._callback(b"\x00foo\x00" + fsn2bytes(fn, None) + b"\x00") self.assertEqual(mock.lines, [bytes2fsn(b"foo", None)]) with open(fn, "rb") as h: self.assertEqual(h.read(), b"resp") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_collections.py������������������������������������������������������0000644�0001750�0001750�00000011472�13112005742�022070� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.util.collections import HashedList, DictProxy from quodlibet.compat import iteritems, iterkeys, itervalues class TDictMixin(TestCase): uses_mmap = False def setUp(self): self.fdict = DictProxy() self.rdict = {} self.fdict["foo"] = self.rdict["foo"] = "bar" def test_getsetitem(self): self.failUnlessEqual(self.fdict["foo"], "bar") self.failUnlessRaises(KeyError, self.fdict.__getitem__, "bar") def test_has_key_contains(self): self.failUnless("foo" in self.fdict) self.failIf("bar" in self.fdict) self.failUnless(self.fdict.has_key("foo")) self.failIf(self.fdict.has_key("bar")) def test_iter(self): self.failUnlessEqual(list(iter(self.fdict)), ["foo"]) def test_clear(self): self.fdict.clear() self.rdict.clear() self.failIf(self.fdict) def test_keys(self): self.failUnlessEqual(list(self.fdict.keys()), list(self.rdict.keys())) self.failUnlessEqual( list(iterkeys(self.fdict)), list(iterkeys(self.rdict))) def test_values(self): self.failUnlessEqual( list(self.fdict.values()), list(self.rdict.values())) self.failUnlessEqual( list(itervalues(self.fdict)), list(itervalues(self.rdict))) def test_items(self): self.failUnlessEqual( list(self.fdict.items()), list(self.rdict.items())) self.failUnlessEqual( list(iteritems(self.fdict)), list(iteritems(self.rdict))) def test_pop(self): self.failUnlessEqual(self.fdict.pop("foo"), self.rdict.pop("foo")) self.failUnlessRaises(KeyError, self.fdict.pop, "woo") def test_pop_bad(self): self.failUnlessRaises(TypeError, self.fdict.pop, "foo", 1, 2) def test_popitem(self): self.failUnlessEqual(self.fdict.popitem(), self.rdict.popitem()) self.failUnlessRaises(KeyError, self.fdict.popitem) def test_update_other(self): other = {"a": 1, "b": 2} self.fdict.update(other) self.rdict.update(other) def test_update_other_is_list(self): other = [("a", 1), ("b", 2)] self.fdict.update(other) self.rdict.update(dict(other)) def test_update_kwargs(self): self.fdict.update(a=1, b=2) other = {"a": 1, "b": 2} self.rdict.update(other) def test_setdefault(self): self.fdict.setdefault("foo", "baz") self.rdict.setdefault("foo", "baz") self.fdict.setdefault("bar", "baz") self.rdict.setdefault("bar", "baz") def test_get(self): self.failUnlessEqual(self.rdict.get("a"), self.fdict.get("a")) self.failUnlessEqual( self.rdict.get("a", "b"), self.fdict.get("a", "b")) self.failUnlessEqual(self.rdict.get("foo"), self.fdict.get("foo")) def test_repr(self): self.failUnlessEqual(repr(self.rdict), repr(self.fdict)) def test_len(self): self.failUnlessEqual(len(self.rdict), len(self.fdict)) def tearDown(self): self.failUnlessEqual(self.fdict, self.rdict) self.failUnlessEqual(self.rdict, self.fdict) class THashedList(TestCase): def test_init(self): l = HashedList([1, 2, 3]) self.failUnless(1 in l) l = HashedList() self.failIf(1 in l) def test_length(self): l = HashedList([1, 2, 3, 3]) self.failUnlessEqual(len(l), 4) def test_insert(self): l = HashedList([1, 2, 3, 3]) l.insert(0, 3) self.failUnlessEqual(len(l), 5) def test_delete(self): l = HashedList([2, 2]) self.failUnless(2 in l) del l[0] self.failUnless(2 in l) del l[0] self.failIf(2 in l) def test_iter(self): l = HashedList([1, 2, 3, 3]) new = [a for a in l] self.failUnlessEqual(new, [1, 2, 3, 3]) def test_del_slice(self): l = HashedList([1, 2, 3, 3]) del l[1:3] self.failUnlessEqual(len(l), 2) self.failUnless(1 in l) self.failUnless(3 in l) self.failIf(2 in l) def test_set_slice(self): l = HashedList([1, 2, 3, 3]) l[:3] = [4] self.failUnless(4 in l) self.failUnless(3 in l) self.failIf(2 in l) def test_extend(self): l = HashedList() l.extend([1, 1, 2]) self.failUnless(1 in l) self.failUnlessEqual(len(l), 3) def test_duplicates(self): l = HashedList() self.failIf(l.has_duplicates()) l = HashedList(range(10)) self.failIf(l.has_duplicates()) l.append(5) self.failUnless(l.has_duplicates()) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_query__match.py����������������������������������������������������������0000644�0001750�0001750�00000007023�13112005742�021172� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.query._match import numexprUnit, ParseError, NumexprTag from quodlibet.query._match import NumexprNow, numexprTagOrSpecial, Inter,\ True_, Neg from quodlibet.util import parse_date from quodlibet.formats import AudioFile class TQueryInter(TestCase): def test_main(self): q = Inter([]) assert q.filter([1]) == [1] q = Inter([True_()]) assert q.filter([1]) == [1] q = Inter([True_(), True_()]) assert q.filter([1]) == [1] q = Inter([True_(), Neg(True_())]) assert q.filter([1]) == [] q = Inter([Neg(True_()), True_()]) assert q.filter([1]) == [] q = Inter([Neg(True_())]) assert q.filter([1]) == [] class TQueryMatch(TestCase): def test_numexpr_unit(self): self.failUnless(numexprUnit(10, 'seconds').evaluate(None, 0, True) == 10) self.failUnless(numexprUnit(10, 'minutes').evaluate(None, 0, True) == 10 * 60) self.failUnless(numexprUnit(1, 'year').evaluate(None, 0, True) == 365 * 24 * 60 * 60) self.failUnless(numexprUnit(3, 'k').evaluate(None, 0, True) == 3 * 1024) self.failUnless(numexprUnit(3, 'megabytes').evaluate(None, 0, True) == 3 * 1024 ** 2) self.failUnlessRaises(ParseError, numexprUnit, 7, 'invalid unit') def test_time_tag(self): time = 424242 song = AudioFile({'~#added': 400000, '~#mtime': 410000, '~#length': 315}) self.failUnless(NumexprTag('added').evaluate(song, time, True) == 24242) self.failUnless(NumexprTag('length').evaluate(song, time, True) == 315) self.failUnless(NumexprTag('date').evaluate(song, time, True) is None) self.failUnless(NumexprTag('added').evaluate(song, time, True) > NumexprTag('mtime').evaluate(song, time, True)) def test_date_tag(self): song = AudioFile({'date': '2012-11-09'}) self.failUnless(NumexprTag('date').evaluate(song, 0, True) == parse_date('2012-11-09')) self.failUnless(NumexprTag('date').evaluate(song, 424242, True) == parse_date('2012-11-09')) self.failUnless(NumexprTag('date').evaluate(song, 0, True) > parse_date('2012-11-08')) self.failUnless(NumexprTag('date').evaluate(song, 0, True) < parse_date('2012-11-10')) def test_numexpr_now(self): time = 424242 day = 24 * 60 * 60 self.failUnless(NumexprNow().evaluate(None, time, True) == time) self.failUnless(NumexprNow(day).evaluate(None, time, True) == time - day) self.failUnless(NumexprNow().evaluate(None, time, True) == numexprTagOrSpecial('now').evaluate(None, time, True)) self.failUnless(NumexprNow(day).evaluate(None, time, True) == numexprTagOrSpecial('today') .evaluate(None, time, True)) self.failUnless(NumexprNow().__repr__() == numexprTagOrSpecial('now').__repr__()) self.failUnless(NumexprTag('genre').__repr__() == numexprTagOrSpecial('genre').__repr__()) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_json_data.py��������������������������������������������������������0000644�0001750�0001750�00000007314�13112005742�021514� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import json import os from quodlibet.util.json_data import JSONObjectDict, JSONObject from . import TestCase, mkstemp from .helper import capture_output Field = JSONObject.Field class TJsonData(TestCase): class WibbleData(JSONObject): """Test subclass""" FIELDS = {"name": Field("h name", "name"), "pattern": Field("h pattern", "pattern for stuff"), "wibble": Field("h wibble", "wobble"), } def __init__(self, name=None, pattern=None, wibble=False): JSONObject.__init__(self, name) self.pattern = pattern self.wibble = wibble self._dont_wibble = not wibble WIBBLE_JSON_STR = """{ "foo":{"name":"foo", "pattern":"echo '<~artist~title>.mp3'"}, "bar":{"name":"bar", "wibble":true} }""" def test_JSONObject(self): blah = JSONObject('blah') self.failUnlessEqual(blah.name, 'blah') self.failUnlessEqual({"name": "blah"}, blah.data) self.failUnlessEqual("{\"name\": \"blah\"}", blah.json) def test_field(self): blah = self.WibbleData('blah') self.failUnlessEqual(blah.field('wibble').doc, 'wobble') self.failIf(blah.field('not_here').doc) self.failUnlessEqual(blah.field("pattern").human_name, "h pattern") def test_nameless_construction(self): try: self.failIf(JSONObject()) except TypeError: pass else: self.fail("Name should be enforced at constructor") def test_subclass(self): blah = self.WibbleData('blah') self.failUnlessEqual(blah.name, 'blah') exp = {"name": "blah", "pattern": None, "wibble": False} self.failUnlessEqual(exp, dict(blah.data)) self.failUnlessEqual(exp, json.loads(blah.json)) def test_from_invalid_json(self): # Invalid JSON with capture_output(): jd = JSONObjectDict.from_json(JSONObject, '{"foo":{}') self.failIf(jd) # Valid but unexpected Command field self.failIf(JSONObjectDict.from_json(JSONObject, '{"bar":{"name":"bar", "invalid":"foo"}')) def test_subclass_from_json(self): coms = JSONObjectDict.from_json(self.WibbleData, self.WIBBLE_JSON_STR) self.failUnlessEqual(len(coms), 2) self.failUnlessEqual(coms['foo'].__class__, self.WibbleData) def test_save_all(self): data = JSONObjectDict.from_json(self.WibbleData, self.WIBBLE_JSON_STR) fd, filename = mkstemp(suffix=".json") os.close(fd) try: ret = data.save(filename) with open(filename, "rb") as f: jstr = f.read() # Check we also return the string as documented... self.failUnlessEqual(jstr, ret) finally: os.unlink(filename) jstr = jstr.decode("utf-8") # Check we have the right number of items self.failUnlessEqual(len(json.loads(jstr)), len(data)) # Check them one by one (for convenience of debugging) parsed = JSONObjectDict.from_json(self.WibbleData, jstr) for o in data.values(): self.failUnlessEqual(parsed[o.name], o) def test_from_list(self): baz_man = JSONObject("baz man!") lst = [JSONObject("foo"), JSONObject("bar"), baz_man] data = JSONObjectDict.from_list(lst) self.failUnlessEqual(len(data), len(lst)) self.failUnless("baz man!" in data) self.failUnlessEqual(baz_man, data["baz man!"]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats__audio.py��������������������������������������������������������0000644�0001750�0001750�00000101765�13112005742�021515� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, get_data_path import os from senf import fsnative, fsn2text, bytes2fsn, mkstemp, mkdtemp from quodlibet import config from quodlibet.compat import PY2, text_type, long, listkeys, PY3 from quodlibet.formats import AudioFile, types as format_types, AudioFileError from quodlibet.formats._audio import NUMERIC_ZERO_DEFAULT from quodlibet.formats import decode_value, MusicFile, FILESYSTEM_TAGS from quodlibet.util.tags import _TAGS as TAGS from quodlibet.util.path import normalize_path from .helper import temp_filename bar_1_1 = AudioFile({ "~filename": fsnative(u"/fakepath/1"), "title": "A song", "discnumber": "1/2", "tracknumber": "1/3", "artist": "Foo", "album": "Bar"}) bar_1_2 = AudioFile({ "~filename": fsnative(u"/fakepath/2"), "title": "Perhaps another", "titlesort": "Titles don't sort", "discnumber": "1", "tracknumber": "2/3", "artist": "Lali-ho!", "album": "Bar", "date": "2004-12-12", "originaldate": "2005-01-01", "~#filesize": 1024 ** 2, "~#bitrate": 128}) bar_2_1 = AudioFile({ "~filename": fsnative(u"does not/exist"), "title": "more songs", "discnumber": "2/2", "tracknumber": "1", "artist": "Foo\nI have two artists", "artistsort": "Foosort\n\nThird artist", "album": "Bar", "lyricist": "Foo", "composer": "Foo", "performer": "I have two artists"}) bar_va = AudioFile({ "~filename": "/fakepath/3", "title": "latest", "artist": "Foo\nI have two artists", "album": "Bar", "language": "de\neng", "albumartist": "Various Artists", "performer": "Jay-Z"}) num_call = AudioFile({"custom": "0.3"}) class TAudioFile(TestCase): def setUp(self): config.RATINGS = config.HardCodedRatingsPrefs() fd, filename = mkstemp() os.close(fd) self.quux = AudioFile({ "~filename": normalize_path(filename, True), "album": u"Quuxly" }) def tearDown(self): try: os.unlink(self.quux["~filename"]) except EnvironmentError: pass def test_format_type(self): for t in format_types: i = AudioFile.__new__(t) assert isinstance(i("~format"), text_type) def test_tag_text_types(self): for t in format_types: i = AudioFile.__new__(t) i["~filename"] = fsnative(u"foo") for tag in TAGS.values(): name = tag.name # brute force variants = [ name, "~" + name, name + "sort", "~" + name + "sort", name + ":role", "~" + name + ":role", "~" + name + "sort:role", name + "sort:role", ] for name in variants: if name in FILESYSTEM_TAGS: assert isinstance(i(name, fsnative()), fsnative) else: assert isinstance(i(name), text_type) def test_sort(self): l = [self.quux, bar_1_2, bar_2_1, bar_1_1] l.sort() self.assertEqual(l, [bar_1_1, bar_1_2, bar_2_1, self.quux]) self.assertEqual(self.quux, self.quux) self.assertEqual(bar_1_1, bar_1_1) self.assertNotEqual(bar_2_1, bar_1_2) def test_realkeys(self): self.failIf("artist" in self.quux.realkeys()) self.failIf("~filename" in self.quux.realkeys()) self.failUnless("album" in self.quux.realkeys()) def test_iterrealitems(self): af = AudioFile({ "~filename": fsnative(u"foo"), "album": u"Quuxly" }) assert list(af.iterrealitems()) == [('album', u'Quuxly')] def test_language(self): self.assertEqual(bar_va("~language"), "German\nEnglish") self.assertEqual(bar_va.list("~language"), ['German', 'English']) self.assertEqual(bar_1_1("~language", default="foo"), "foo") self.assertEqual(bar_1_1.list("~language"), []) def test_trackdisc(self): self.failUnlessEqual(bar_1_1("~#track"), 1) self.failUnlessEqual(bar_1_1("~#disc"), 1) self.failUnlessEqual(bar_1_1("~#tracks"), 3) self.failUnlessEqual(bar_1_1("~#discs"), 2) self.failIf(bar_1_2("~#discs")) self.failIf(bar_2_1("~#tracks")) def test_setitem_keys(self): af = AudioFile() af[u"foo"] = u"bar" assert "foo" in af assert isinstance(listkeys(af)[0], str) af.clear() af[u"öäü"] = u"bar" assert u"öäü" in af assert isinstance(listkeys(af)[0], text_type) with self.assertRaises(TypeError): af[42] = u"foo" if PY3: with self.assertRaises(TypeError): af[b"foo"] = u"bar" else: with self.assertRaises(ValueError): af[b"\xff"] = u"bar" def test_call(self): # real keys should lookup the same for key in bar_1_1.realkeys(): self.failUnlessEqual(bar_1_1[key], bar_1_1(key)) # fake/generated key checks af = AudioFile() self.failIf(af("not a key")) self.failUnlessEqual(af("not a key", "foo"), "foo") self.failUnlessEqual(af("artist"), "") assert self.quux("~basename") assert self.quux("~dirname") == os.path.dirname(self.quux("~filename")) assert self.quux("title") == \ "%s [Unknown]" % fsn2text(self.quux("~basename")) self.failUnlessEqual(bar_1_1("~#disc"), 1) self.failUnlessEqual(bar_1_2("~#disc"), 1) self.failUnlessEqual(bar_2_1("~#disc"), 2) self.failUnlessEqual(bar_1_1("~#track"), 1) self.failUnlessEqual(bar_1_2("~#track"), 2) self.failUnlessEqual(bar_2_1("~#track"), 1) def test_year(self): self.failUnlessEqual(bar_1_2("~year"), "2004") self.failUnlessEqual(bar_1_2("~#year"), 2004) self.failUnlessEqual(bar_1_1("~#year", 1999), 1999) def test_filesize(self): self.failUnlessEqual(bar_1_2("~filesize"), "1.00 MB") self.failUnlessEqual(bar_1_2("~#filesize"), 1024 ** 2) assert isinstance(bar_1_2("~filesize"), text_type) def test_bitrate(self): self.assertEqual(bar_1_2("~#bitrate"), 128) self.assertEqual(bar_1_2("~bitrate"), "128 kbps") def test_originalyear(self): self.failUnlessEqual(bar_1_2("~originalyear"), "2005") self.failUnlessEqual(bar_1_2("~#originalyear"), 2005) self.failUnlessEqual(bar_1_1("~#originalyear", 1999), 1999) def test_call_people(self): af = AudioFile() self.failUnlessEqual(af("~people"), "") self.failUnlessEqual(bar_1_1("~people"), "Foo") self.failUnlessEqual(bar_1_2("~people"), "Lali-ho!") self.failUnlessEqual(bar_2_1("~people"), "Foo\nI have two artists") # See Issue 1034 self.failUnlessEqual(bar_va("~people"), "Foo\nI have two artists\nVarious Artists\nJay-Z") def test_call_multiple(self): for song in [self.quux, bar_1_1, bar_2_1]: self.failUnlessEqual(song("~~people"), song("~people")) self.failUnlessEqual(song("~title~people"), song("title")) self.failUnlessEqual( song("~title~~people"), song("~title~artist")) def test_tied_filename_numeric(self): self.assertEqual( bar_1_2("~~filename~~#originalyear"), u'/fakepath/2 - 2005') def test_call_numeric(self): self.failUnlessAlmostEqual(num_call("~#custom"), 0.3) self.failUnlessEqual(num_call("~#blah~foo", 0), 0) def test_list(self): for key in bar_1_1.realkeys(): self.failUnlessEqual(bar_1_1.list(key), [bar_1_1(key)]) af = AudioFile({"~filename": fsnative(u"foo")}) self.failUnlessEqual(af.list("artist"), []) self.failUnlessEqual(af.list("title"), [af("title")]) self.failUnlessEqual(af.list("not a key"), []) self.failUnlessEqual(len(bar_2_1.list("artist")), 2) self.failUnlessEqual(bar_2_1.list("artist"), bar_2_1["artist"].split("\n")) def test_list_tied_tags(self): expected = ["%s - %s" % (bar_1_1("artist"), bar_1_1("title"))] self.failUnlessEqual(bar_1_1.list("~artist~title"), expected) def test_list_multiple_tied_tags(self): expected = ["%s - %s" % (bar_2_1.comma("artist"), bar_2_1("title"))] self.failUnlessEqual(bar_2_1.list("~artist~title"), expected) def test_list_sort(self): self.failUnlessEqual(bar_1_1.list_sort("title"), [("A song", "A song")]) self.failUnlessEqual(bar_1_1.list_sort("artist"), [("Foo", "Foo")]) af = AudioFile({"~filename": fsnative(u"foo")}) self.failUnlessEqual(af.list_sort("artist"), []) self.failUnlessEqual(af.list_sort("title"), [(af("title"), af("title"))]) self.failUnlessEqual(af.list_sort("not a key"), []) self.failUnlessEqual(bar_1_2.list_sort("title"), [("Perhaps another", "Perhaps another")]) self.failUnlessEqual(bar_2_1.list_sort("artist"), [("Foo", "Foosort"), ("I have two artists", "I have two artists")]) self.failUnlessEqual(bar_2_1.list_sort("~#track"), [('1', '1')]) def test_list_sort_empty_sort(self): # we don't want to care about empty sort values, make sure we ignore # them s = AudioFile({"artist": "x\ny\nz", "artistsort": "c\n\nd"}) self.assertEqual( s.list_sort("artist"), [("x", "c"), ("y", "y"), ("z", "d")]) def test_list_sort_noexist(self): self.failUnlessEqual(bar_1_1.list_sort("nopenopenope"), []) def test_list_separate_noexist(self): self.failUnlessEqual(bar_1_1.list_separate("nopenopenope"), []) def test_list_sort_length_diff(self): s = AudioFile({"artist": "a\nb", "artistsort": "c"}) self.assertEqual(s.list_sort("artist"), [("a", "c"), ("b", "b")]) s = AudioFile({"artist": "a\nb", "artistsort": "c\nd\ne"}) self.assertEqual(s.list_sort("artist"), [("a", "c"), ("b", "d")]) s = AudioFile({"artistsort": "c\nd\ne"}) self.assertEqual(s.list_sort("artist"), []) s = AudioFile({"artist": "a\nb"}) self.assertEqual(s.list_sort("artist"), [("a", "a"), ("b", "b")]) s = AudioFile({}) self.assertEqual(s.list_sort("artist"), []) def test_list_separate(self): self.failUnlessEqual(bar_1_1.list_separate("title"), [("A song", "A song")]) self.failUnlessEqual(bar_1_1.list_separate("artist"), [("Foo", "Foo")]) self.failUnlessEqual(bar_2_1.list_separate("~artist~album"), [('Foo', 'Foosort'), ('I have two artists', 'I have two artists'), ('Bar', 'Bar')]) self.failUnlessEqual(bar_2_1.list_separate("~artist~~#track"), [('Foo', 'Foosort'), ('I have two artists', 'I have two artists'), ('1', '1')]) def test_list_list_separate_types(self): res = bar_2_1.list_separate("~~#track~artist~~filename") self.assertEqual(res, [(u'1', u'1'), (u'Foo', u'Foosort'), (u'I have two artists', u'I have two artists'), (u'does not/exist', u'does not/exist')]) def test_list_numeric(self): self.assertEqual(bar_1_2.list('~#bitrate'), [128]) def test_comma(self): for key in bar_1_1.realkeys(): self.failUnlessEqual(bar_1_1.comma(key), bar_1_1(key)) self.failUnless(", " in bar_2_1.comma("artist")) def test_comma_filename(self): self.assertTrue(isinstance(bar_1_1.comma("~filename"), text_type)) def test_comma_mountpoint(self): assert not bar_1_1("~mountpoint") assert isinstance(bar_1_1.comma("~mountpoint"), text_type) assert bar_1_1.comma("~mountpoint") == u"" def test_exist(self): self.failIf(bar_2_1.exists()) self.failUnless(self.quux.exists()) def test_valid(self): self.failIf(bar_2_1.valid()) quux = self.quux quux["~#mtime"] = 0 self.failIf(quux.valid()) quux["~#mtime"] = os.path.getmtime(quux["~filename"]) self.failUnless(quux.valid()) os.utime(quux["~filename"], (quux["~#mtime"], quux["~#mtime"] - 1)) self.failIf(quux.valid()) quux["~#mtime"] = os.path.getmtime(quux["~filename"]) self.failUnless(quux.valid()) os.utime(quux["~filename"], (quux["~#mtime"], quux["~#mtime"] - 1)) quux.sanitize() self.failUnless(quux.valid()) def test_can_change(self): af = AudioFile() self.failIf(af.can_change("~foobar")) self.failIf(af.can_change("=foobar")) self.failIf(af.can_change("foo=bar")) self.failIf(af.can_change("")) self.failUnless(af.can_change("foo bar")) def test_is_writable(self): self.assertTrue(self.quux.is_writable()) os.chmod(self.quux["~filename"], 0o444) self.assertFalse(self.quux.is_writable()) os.chmod(self.quux["~filename"], 0o644) self.assertTrue(self.quux.is_writable()) def test_can_multiple_values(self): af = AudioFile() self.assertEqual(af.can_multiple_values(), True) self.assertTrue(af.can_multiple_values("artist")) def test_rename(self): old_fn = self.quux["~filename"] fd, new_fn = mkstemp() os.close(fd) os.unlink(new_fn) assert self.quux.exists() self.quux.rename(new_fn) assert not os.path.exists(old_fn) assert self.quux.exists() self.quux.rename(old_fn) assert not os.path.exists(new_fn) assert self.quux.exists() def test_rename_other_dir(self): old_fn = self.quux["~filename"] new_dir = mkdtemp() self.quux.rename(os.path.join(new_dir, "foo")) assert not os.path.exists(old_fn) assert self.quux.exists() self.quux.rename(old_fn) assert self.quux.exists() os.rmdir(new_dir) def test_rename_to_existing(self): self.quux.rename(self.quux("~filename")) if os.name != "nt": self.failUnlessRaises( ValueError, self.quux.rename, fsnative(u"/dev/null")) with temp_filename() as new_file: with self.assertRaises(ValueError): self.quux.rename(new_file) def test_lyric_filename(self): song = AudioFile() song["~filename"] = fsnative(u"filename") self.assertTrue(isinstance(song.lyric_filename, fsnative)) song["title"] = u"Title" song["artist"] = u"Artist" self.assertTrue(isinstance(song.lyric_filename, fsnative)) song["lyricist"] = u"Lyricist" self.assertTrue(isinstance(song.lyric_filename, fsnative)) def test_mountpoint(self): song = AudioFile() song["~filename"] = fsnative(u"filename") song.sanitize() assert isinstance(song["~mountpoint"], fsnative) assert isinstance(song.comma("~mointpoint"), text_type) def test_sanitize(self): q = AudioFile(self.quux) b = AudioFile(bar_1_1) q.sanitize() b.pop('~filename') self.failUnlessRaises(ValueError, b.sanitize) n = AudioFile({"artist": u"foo\0bar", "title": u"baz\0", "~filename": fsnative(u"whatever")}) n.sanitize() self.failUnlessEqual(n["artist"], "foo\nbar") self.failUnlessEqual(n["title"], "baz") def test_performers(self): q = AudioFile([("performer:vocals", "A"), ("performer:guitar", "B"), ("performer", "C")]) self.failUnlessEqual(set(q.list("~performers")), {"A", "B", "C"}) self.failUnlessEqual(set(q.list("~performers:roles")), {"A (Vocals)", "B (Guitar)", "C"}) def test_performers_multi_value(self): q = AudioFile([ ("performer:vocals", "X\nA\nY"), ("performer:guitar", "Y\nB\nA"), ("performer", "C\nF\nB\nA"), ]) self.failUnlessEqual( set(q.list("~performer")), {"A", "B", "C", "F", "X", "Y"}) self.failUnlessEqual( set(q.list("~performer:roles")), { "A (Guitar, Vocals)", "C", "B (Guitar)", "X (Vocals)", "Y (Guitar, Vocals)", "F", }) def test_people(self): q = AudioFile([("performer:vocals", "A"), ("performer:guitar", "B"), ("performer", "C"), ("arranger", "A"), ("albumartist", "B"), ("artist", "C")]) self.failUnlessEqual(q.list("~people"), ["C", "B", "A"]) self.failUnlessEqual(q.list("~people:roles"), ["C", "B (Guitar)", "A (Arrangement, Vocals)"]) def test_people_mix(self): q = AudioFile([ ("performer:arrangement", "A"), ("arranger", "A"), ("performer", "A"), ("performer:foo", "A"), ]) self.failUnlessEqual(q.list("~people"), ["A"]) self.failUnlessEqual(q.list("~people:roles"), ["A (Arrangement, Arrangement, Foo)"]) def test_people_multi_value(self): q = AudioFile([ ("arranger", "A\nX"), ("performer", "A\nY"), ("performer:foo", "A\nX"), ]) self.failUnlessEqual(q.list("~people"), ["A", "Y", "X"]) self.failUnlessEqual( q.list("~people:roles"), ["A (Arrangement, Foo)", "Y", "X (Arrangement, Foo)"]) def test_people_individuals(self): q = AudioFile({"artist": "A\nX", "albumartist": "Various Artists"}) self.failUnlessEqual(q.list("~people:real"), ["A", "X"]) lonely = AudioFile({"artist": "various artists", "title": "blah"}) self.failUnlessEqual(lonely.list("~people:real"), ["various artists"]) lots = AudioFile({"artist": "Various Artists", "albumartist": "V.A."}) self.failUnlessEqual(lots.list("~people:real"), ["Various Artists"]) def test_peoplesort(self): q = AudioFile([("performer:vocals", "The A"), ("performersort:vocals", "A, The"), ("performer:guitar", "The B"), ("performersort:guitar", "B, The"), ("performer", "The C"), ("performersort", "C, The"), ("albumartist", "The B"), ("albumartistsort", "B, The")]) self.failUnlessEqual(q.list("~peoplesort"), ["B, The", "C, The", "A, The"]) self.failUnlessEqual(q.list("~peoplesort:roles"), ["B, The (Guitar)", "C, The", "A, The (Vocals)"]) def test_to_dump(self): dump = bar_1_1.to_dump() num = len(set(bar_1_1.keys()) | NUMERIC_ZERO_DEFAULT) self.failUnlessEqual(dump.count(b"\n"), num + 2) for key, value in bar_1_1.items(): self.failUnless(key.encode("utf-8") in dump) self.failUnless(value.encode("utf-8") in dump) for key in NUMERIC_ZERO_DEFAULT: self.failUnless(key.encode("utf-8") in dump) n = AudioFile() n.from_dump(dump) self.failUnless( set(dump.split(b"\n")) == set(n.to_dump().split(b"\n"))) def test_to_dump_long(self): if not PY2: return b = AudioFile(bar_1_1) b["~#length"] = long(200000000000) dump = b.to_dump() num = len(set(bar_1_1.keys()) | NUMERIC_ZERO_DEFAULT) self.failUnlessEqual(dump.count("\n"), num + 2, msg=dump) n = AudioFile() n.from_dump(dump) self.failUnless(set(dump.split("\n")) == set(n.to_dump().split("\n"))) def test_to_dump_unicode(self): b = AudioFile(bar_1_1) b[u"öäü"] = u"öäü" dump = b.to_dump() n = AudioFile() n.from_dump(dump) self.assertEqual(n[u"öäü"], u"öäü") def test_add(self): song = AudioFile() self.failIf("foo" in song) song.add("foo", "bar") self.failUnlessEqual(song["foo"], "bar") song.add("foo", "another") self.failUnlessEqual(song.list("foo"), ["bar", "another"]) def test_remove(self): song = AudioFile() song.add("foo", "bar") song.add("foo", "another") song.add("foo", "one more") song.remove("foo", "another") self.failUnlessEqual(song.list("foo"), ["bar", "one more"]) song.remove("foo", "bar") self.failUnlessEqual(song.list("foo"), ["one more"]) song.remove("foo", "one more") self.failIf("foo" in song) def test_remove_unknown(self): song = AudioFile() song.add("foo", "bar") song.remove("foo", "not in list") song.remove("nope") self.failUnlessEqual(song.list("foo"), ["bar"]) def test_remove_all(self): song = AudioFile() song.add("foo", "bar") song.add("foo", "another") song.add("foo", "one more") song.remove("foo") self.assertFalse("foo" in song) def test_remove_empty(self): song = AudioFile() song.add("foo", u"") song.remove("foo", u"") self.assertFalse("foo" in song) def test_change(self): song = AudioFile() song.add("foo", "bar") song.add("foo", "another") song.change("foo", "bar", "one more") self.failUnlessEqual(song.list("foo"), ["one more", "another"]) song.change("foo", "does not exist", "finally") self.failUnlessEqual(song["foo"], "finally") song.change("foo", "finally", "we're done") self.failUnlessEqual(song["foo"], "we're done") def test_bookmarks_none(self): self.failUnlessEqual([], AudioFile().bookmarks) def test_bookmarks_simple(self): af = AudioFile({"~bookmark": "1:20 Mark 1"}) self.failUnlessEqual([(80, "Mark 1")], af.bookmarks) def test_bookmarks_two(self): af = AudioFile({"~bookmark": "1:40 Mark 2\n1:20 Mark 1"}) self.failUnlessEqual([(80, "Mark 1"), (100, "Mark 2")], af.bookmarks) def test_bookmark_invalid(self): af = AudioFile({"~bookmark": ("Not Valid\n1:40 Mark 2\n" "-20 Not Valid 2\n1:20 Mark 1")}) self.failUnlessEqual( [(80, "Mark 1"), (100, "Mark 2"), (-1, "Not Valid"), (-1, "-20 Not Valid 2")], af.bookmarks) def test_set_bookmarks_none(self): af = AudioFile({"bookmark": "foo"}) af.bookmarks = [] self.failUnlessEqual([], AudioFile().bookmarks) self.failIf("~bookmark" in af) def test_set_bookmarks_simple(self): af = AudioFile() af.bookmarks = [(120, "A mark"), (140, "Mark twain")] self.failUnlessEqual(af["~bookmark"], "2:00 A mark\n2:20 Mark twain") def test_set_bookmarks_invalid_value(self): self.failUnlessRaises( ValueError, setattr, AudioFile(), 'bookmarks', "huh?") def test_set_bookmarks_invalid_time(self): self.failUnlessRaises( TypeError, setattr, AudioFile(), 'bookmarks', [("notint", "!")]) def test_set_bookmarks_unrealistic_time(self): self.failUnlessRaises( ValueError, setattr, AudioFile(), 'bookmarks', [(-1, "!")]) def test_has_rating(self): song = AudioFile() self.assertFalse(song.has_rating) song["~#rating"] = 0.5 self.assertTrue(song.has_rating) song.remove_rating() self.assertFalse(song.has_rating) def test_remove_rating(self): song = AudioFile() self.assertFalse(song.has_rating) song.remove_rating() self.assertFalse(song.has_rating) song["~#rating"] = 0.5 self.assertTrue(song.has_rating) song.remove_rating() self.assertFalse(song.has_rating) def test_album_key(self): album_key_tests = [ ({}, ((), (), '')), ({'album': 'foo'}, (('foo',), (), '')), ({'labelid': 'foo'}, ((), (), 'foo')), ({'musicbrainz_albumid': 'foo'}, ((), (), 'foo')), ({'album': 'foo', 'labelid': 'bar'}, (('foo',), (), 'bar')), ({'album': 'foo', 'labelid': 'bar', 'musicbrainz_albumid': 'quux'}, (('foo',), (), 'bar')), ({'albumartist': 'a'}, ((), ('a',), '')), ] for tags, expected in album_key_tests: afile = AudioFile(**tags) afile.sanitize(fsnative(u'/dir/fn')) self.failUnlessEqual(afile.album_key, expected) def test_eq_ne(self): self.failIf(AudioFile({"a": "b"}) == AudioFile({"a": "b"})) self.failUnless(AudioFile({"a": "b"}) != AudioFile({"a": "b"})) def test_invalid_fs_encoding(self): # issue 798 a = AudioFile() if os.name != "nt": a["~filename"] = "/\xf6\xe4\xfc/\xf6\xe4\xfc.ogg" # latin 1 encoded a.sort_by_func("~filename")(a) a.sort_by_func("~basename")(a) else: # windows a["~filename"] = \ b"/\xf6\xe4\xfc/\xf6\xe4\xfc.ogg".decode("latin-1") a.sort_by_func("~filename")(a) a.sort_by_func("~basename")(a) a.sort_by_func("~dirname")(a) def test_sort_key_defaults(self): AF = AudioFile assert AF().sort_key == AF({"tracknumber": "1"}).sort_key assert AF().sort_key == AF({"tracknumber": "1/1"}).sort_key assert AF().sort_key < AF({"tracknumber": "2/2"}).sort_key assert AF().sort_key == AF({"discnumber": "1"}).sort_key assert AF().sort_key == AF({"discnumber": "1/1"}).sort_key assert AF().sort_key < AF({"discnumber": "2/2"}).sort_key def test_sort_cache(self): copy = AudioFile(bar_1_1) sort_1 = tuple(copy.sort_key) copy["title"] = copy["title"] + "something" sort_2 = tuple(copy.sort_key) self.failIfEqual(sort_1, sort_2) album_sort_1 = tuple(copy.album_key) copy["album"] = copy["album"] + "something" sort_3 = tuple(copy.sort_key) self.failIfEqual(sort_2, sort_3) album_sort_2 = tuple(copy.album_key) self.failIfEqual(album_sort_1, album_sort_2) def test_cache_attributes(self): x = AudioFile() x.multisong = not x.multisong x["a"] = "b" # clears cache # attribute should be unchanged self.failIfEqual(AudioFile().multisong, x.multisong) def test_sort_func(self): tags = [lambda s: s("foo"), "artistsort", "albumsort", "~filename", "~format", "discnumber", "~#track"] for tag in tags: f = AudioFile.sort_by_func(tag) f(bar_1_1) f(bar_1_2) f(bar_2_1) def test_uri(self): # On windows where we have unicode paths (windows encoding is utf-16) # we need to encode to utf-8 first, then escape. # On linux we take the byte stream and escape it. # see g_filename_to_uri if os.name == "nt": f = AudioFile({"~filename": u"/\xf6\xe4.mp3", "title": "win"}) self.failUnlessEqual(f("~uri"), "file:///%C3%B6%C3%A4.mp3") else: f = AudioFile({ "~filename": bytes2fsn(b"/\x87\x12.mp3", None), "title": "linux", }) self.failUnlessEqual(f("~uri"), "file:///%87%12.mp3") def test_reload(self): audio = MusicFile(get_data_path('silence-44-s.mp3')) audio["title"] = u"foo" audio.reload() self.assertNotEqual(audio.get("title"), u"foo") def test_reload_fail(self): audio = MusicFile(get_data_path('silence-44-s.mp3')) audio["title"] = u"foo" audio.sanitize(fsnative(u"/dev/null")) self.assertRaises(AudioFileError, audio.reload) self.assertEqual(audio["title"], u"foo") class TAudioFormats(TestCase): def setUp(self): with temp_filename() as filename: self.filename = filename def test_load_non_exist(self): for t in format_types: if not t.is_file: continue self.assertRaises(AudioFileError, t, self.filename) def test_write_non_existing(self): for t in format_types: if not t.is_file: continue instance = AudioFile.__new__(t) instance.sanitize(self.filename) try: instance.write() except AudioFileError: pass def test_reaload_non_existing(self): for t in format_types: if not t.is_file: continue instance = AudioFile.__new__(t) instance.sanitize(self.filename) try: instance.reload() except AudioFileError: pass class Tdecode_value(TestCase): def test_main(self): self.assertEqual(decode_value("~#foo", 0.25), u"0.25") self.assertEqual(decode_value("~#foo", 4), u"4") self.assertEqual(decode_value("~#foo", "bar"), u"bar") self.assertTrue(isinstance(decode_value("~#foo", "bar"), text_type)) path = fsnative(u"/foobar") self.assertEqual(decode_value("~filename", path), fsn2text(path)) def test_path(self): try: path = bytes2fsn(b"\xff\xff", "utf-8") except ValueError: return assert decode_value("~filename", path) == fsn2text(path) class Treplay_gain(TestCase): # -6dB is approximately equal to half magnitude minus_6db = 0.501187234 def setUp(self): self.rg_data = {"replaygain_album_gain": "-1.00 dB", "replaygain_album_peak": "1.1", "replaygain_track_gain": "+1.0000001 dB", "replaygain_track_peak": "0.9"} self.song = AudioFile(self.rg_data) self.no_rg_song = AudioFile() def test_no_rg_song(self): scale = self.no_rg_song.replay_gain(["track"], 0, -6.0) self.failUnlessAlmostEqual(scale, self.minus_6db) scale = self.no_rg_song.replay_gain(["track"], +10, +10) self.failUnlessEqual(scale, 1.0) scale = self.no_rg_song.replay_gain(["track"], -16.0, +10) self.failUnlessAlmostEqual(scale, self.minus_6db) def test_nogain(self): self.failUnlessEqual(self.song.replay_gain(["none", "track"]), 1) def test_fallback_track(self): del(self.song["replaygain_track_gain"]) self.failUnlessAlmostEqual( self.song.replay_gain(["track"], 0, -6.0), self.minus_6db) def test_fallback_album(self): del(self.song["replaygain_album_gain"]) self.failUnlessAlmostEqual( self.song.replay_gain(["album"], 0, -6.0), self.minus_6db) def test_fallback_and_preamp(self): del(self.song["replaygain_track_gain"]) self.failUnlessEqual(self.song.replay_gain(["track"], 9, -9), 1) def test_preamp_track(self): self.failUnlessAlmostEqual( self.song.replay_gain(["track"], -7.0, 0), self.minus_6db) def test_preamp_album(self): self.failUnlessAlmostEqual( self.song.replay_gain(["album"], -5.0, 0), self.minus_6db) def test_preamp_clip(self): # Make sure excess pre-amp won't clip a track (with peak data) self.failUnlessAlmostEqual( self.song.replay_gain(["track"], 12.0, 0), 1.0 / 0.9) def test_trackgain(self): self.failUnless(self.song.replay_gain(["track"]) > 1) def test_albumgain(self): self.failUnless(self.song.replay_gain(["album"]) < 1) def test_invalid(self): self.song["replaygain_album_gain"] = "fdsodgbdf" self.failUnlessEqual(self.song.replay_gain(["album"]), 1) def test_track_fallback(self): radio_rg = self.song.replay_gain(["track"]) del(self.song["replaygain_album_gain"]) del(self.song["replaygain_album_peak"]) # verify defaulting to track when album is present self.failUnlessAlmostEqual( self.song.replay_gain(["album", "track"]), radio_rg) def test_numeric_rg_tags(self): """"Tests fully-numeric (ie no "db") RG tags. See Issue 865""" self.failUnless(self.song("replaygain_album_gain"), "-1.00 db") for key, exp in self.rg_data.items(): # Hack the nasties off and produce the "real" expected value exp = float(exp.split(" ")[0]) # Compare as floats. Seems fairer. album_rg = self.song("~#%s" % key) try: val = float(album_rg) except ValueError: self.fail("Invalid %s returned: %s" % (key, album_rg)) self.failUnlessAlmostEqual( val, exp, places=5, msg="%s should be %s not %s" % (key, exp, val)) �����������quodlibet-3.9.1/tests/test_qltk_image.py������������������������������������������������������������0000644�0001750�0001750�00000005066�13112005742�020634� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase import cairo from gi.repository import Gtk, GdkPixbuf, Gdk from quodlibet.qltk.image import get_surface_extents, get_surface_for_pixbuf, \ scale, calc_scale_size, add_border, add_border_widget class TImageUtils(TestCase): def setUp(self): self.small = GdkPixbuf.Pixbuf.new( GdkPixbuf.Colorspace.RGB, True, 8, 10, 20) self.wide = GdkPixbuf.Pixbuf.new( GdkPixbuf.Colorspace.RGB, True, 8, 150, 10) self.high = GdkPixbuf.Pixbuf.new( GdkPixbuf.Colorspace.RGB, True, 8, 10, 100) def test_get_surface_for_pixbuf(self): w = Gtk.Button() rgb = GdkPixbuf.Colorspace.RGB newpb = GdkPixbuf.Pixbuf.new(rgb, True, 8, 10, 10) surface = get_surface_for_pixbuf(w, newpb) self.assertTrue(isinstance(surface, cairo.Surface)) def test_scale(s): nw = scale(s.wide, (50, 30)) s.failUnlessEqual((nw.get_width(), nw.get_height()), (50, 3)) nh = scale(s.high, (100, 20)) s.failUnlessEqual((nh.get_width(), nh.get_height()), (2, 20)) ns = scale(s.small, (500, 300)) s.failUnlessEqual((ns.get_width(), ns.get_height()), (150, 300)) ns = scale(s.small, (500, 300), scale_up=False) s.failUnlessEqual((ns.get_width(), ns.get_height()), (10, 20)) def test_calc_scale_size(self): self.assertRaises(ValueError, calc_scale_size, (1, 1), (1, 0)) res = calc_scale_size((100, 100), (500, 100)) self.assertEqual(res, (100, 20)) def test_add_border(self): color = Gdk.RGBA() w, h = self.small.get_width(), self.small.get_height() res = add_border(self.small, color) self.assertEqual(res.get_width(), w + 2) self.assertEqual(res.get_height(), h + 2) res = add_border(self.small, color) self.assertEqual(res.get_width(), w + 2) self.assertEqual(res.get_height(), h + 2) res = add_border(self.small, color, width=2) self.assertEqual(res.get_width(), w + 4) self.assertEqual(res.get_height(), h + 4) def test_add_border_widget(self): widget = Gtk.Button() add_border_widget(self.small, widget) def test_get_surface_extents(self): sf = cairo.ImageSurface(cairo.FORMAT_RGB24, 10, 11) self.assertEqual(get_surface_extents(sf), (0, 0, 10, 11)) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_string_titlecase.py�������������������������������������������������0000644�0001750�0001750�00000012210�13112005742�023104� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 Javier Kohen # 2010, 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.util import title from quodlibet.util.string.titlecase import human_title as ht class Ttitle(TestCase): def test_basics(s): s.assertEquals(u"Mama's Boy", title(u"mama's boy")) s.assertEquals(u"The A-Sides", title(u"the a-sides")) s.assertEquals(u"Hello Goodbye", title(u"hello goodbye")) s.assertEquals(u"HELLO GOODBYE", title(u"HELLO GOODBYE")) s.assertEquals(u"", title(u"")) def test_extra_spaces(s): s.assertEquals(u" Space", title(u" space")) s.assertEquals(u" Dodgy Spaces ", title(u" dodgy spaces ")) def test_quirks(s): # This character is not an apostrophe, it's a single quote! s.assertEquals(u"Mama’S Boy", title(u"mama’s boy")) # This is actually an accent character, not an apostrophe either. s.assertEquals(u"Mama`S Boy", title(u"mama`s boy")) def test_quotes(s): s.assertEquals(u"Hello Goodbye (A Song)", title(u"hello goodbye (a song)")) s.assertEquals(u"Hello Goodbye 'A Song'", title(u"hello goodbye 'a song'")) s.assertEquals(u'Hello Goodbye "A Song"', title(u'hello goodbye "a song"')) s.assertEquals(u"Hello Goodbye „A Song”", title(u"hello goodbye „a song”")) s.assertEquals(u"Hello Goodbye ‘A Song’", title(u"hello goodbye ‘a song’")) s.assertEquals(u"Hello Goodbye “A Song”", title(u"hello goodbye “a song”")) s.assertEquals(u"Hello Goodbye »A Song«", title(u"hello goodbye »a song«")) s.assertEquals(u"Hello Goodbye «A Song»", title(u"hello goodbye «a song»")) s.assertEquals(u"\"24\" Theme", title(u"\"24\" theme")) s.assertEquals(u"\"Mad-Dog\" Mike", title(u"\"mad-dog\" mike")) def test_unicode(s): s.assertEquals(u"Fooäbar", title(u"fooäbar")) s.assertEquals(u"Los Años Felices", title(u"los años felices")) s.assertEquals(u"Ñandú", title(u"ñandú")) s.assertEquals(u"Österreich", title(u"österreich")) # Not a real word - there is none with this character at the beginning # but still Python doesn't capitalize the es-zed properly. # s.assertEquals(u"SSbahn", title(u"ßbahn")) # Old tests, somewhat redundant with the above, but you can never have # too many tests... def test_empty(self): self.failUnlessEqual(title(""), "") def test_oneword(self): self.failUnlessEqual(title("foobar"), "Foobar") def test_twowords(self): self.failUnlessEqual(title("foo bar"), "Foo Bar") def test_preserve(self): self.failUnlessEqual(title("fooBar"), "FooBar") def test_nonalphabet(self): self.failUnlessEqual(title("foo 1bar"), "Foo 1bar") def test_two_words_and_one_not(self): self.failUnlessEqual(title("foo 1 bar"), "Foo 1 Bar") def test_apostrophe(self): self.failUnlessEqual(title("it's"), "It's") def test_english_human_title_case(s): s.assertEquals(u"System of a Down", ht(u"System Of A Down")) s.assertEquals(u"The Man with the Golden Gun", ht(u"The Man With The Golden gun")) s.assertEquals(u"Live and Let Die", ht(u"Live And Let Die")) # Updated to match modifications to is/are/am rules: s.assertEquals(u"The Vitamins Are in My Fresh California Raisins", ht(u"the vitamins are in my fresh california raisins")) s.assertEquals(u"Dig In", ht(u"dig in")) s.assertEquals(u"In da Club", ht(u"in da club")) # See Issue 616 s.assertEquals(u" Dodgy Are the Spaces ", ht(u" dodgy are the spaces ")) s.assertEquals(u"Space: The Final Frontier", ht(u"Space: the final frontier")) s.assertEquals(u"- Out of Space", ht(u"- out Of space")) def test_tricky_apostrophes(s): s.assertEquals(u"Guns 'n' Roses", ht(u"Guns 'n' roses")) s.assertEquals(u"Scarlett O'Hara", ht(u"scarlett o'hara")) s.assertEquals(u"Scarlett O'Hara", ht(u"Scarlett O'hara")) s.assertEquals(u"No Life 'til Leather", ht(u"no life 'til leather")) def test_english_humanise_sentences(s): """Checks trickier human title casing""" s.assertEquals(u"Buffy the Vampire Slayer: The Album", ht(u"Buffy the vampire slayer: the album")) s.assertEquals(u"Killing Is My Business... and Business Is Good!", ht(u"Killing is my business... And business is good!")) s.assertEquals(u"Herbie Hancock - The Definitive", ht(u"herbie hancock - the definitive")) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_browsers_media.py��������������������������������������������������������0000644�0001750�0001750�00000001570�13112005742�021520� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet import config from quodlibet.browsers.media import MediaDevices, DeviceProperties from quodlibet.library import SongLibrary class TMediaBrowser(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_init(self): library = SongLibrary() MediaDevices(library).destroy() def test_property(self): class FakeDevice(dict): block_device = "Fake" mountpoint = "/" Properties = lambda *x: [] fake = FakeDevice({"name": "Foo"}) DeviceProperties(None, fake).destroy() ����������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_completion.py�������������������������������������������������������0000644�0001750�0001750�00000002615�13112005742�021720� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from gi.repository import Gtk from quodlibet import config from quodlibet.library import SongLibrary from quodlibet.qltk.completion import EntryWordCompletion, LibraryTagCompletion from quodlibet.qltk.completion import LibraryValueCompletion class TEntryWordCompletion(TestCase): def test_ctr(self): w = EntryWordCompletion() e = Gtk.Entry() e.set_completion(w) self.failUnlessEqual(w.get_entry(), e) self.failUnlessEqual(e.get_completion(), w) e.destroy() class TLibraryTagCompletion(TestCase): def test_ctr(self): w = LibraryTagCompletion(SongLibrary()) e = Gtk.Entry() e.set_completion(w) self.failUnlessEqual(w.get_entry(), e) self.failUnlessEqual(e.get_completion(), w) e.destroy() class TLibraryValueCompletion(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_ctr(self): w = LibraryValueCompletion("artist", SongLibrary()) e = Gtk.Entry() e.set_completion(w) self.failUnlessEqual(w.get_entry(), e) self.failUnlessEqual(e.get_completion(), w) e.destroy() �������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_path.py�������������������������������������������������������������0000644�0001750�0001750�00000012230�13115477255�020516� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import unittest from senf import uri2fsn, fsn2uri, fsnative, environ from quodlibet.util.path import iscommand, limit_path, \ get_home_dir, uri_is_valid, ishidden from quodlibet.util import print_d from . import TestCase is_win = os.name == "nt" path_set = bool(environ.get('PATH', False)) class Tishidden(TestCase): def test_main(self): assert ishidden(fsnative(u".")) assert ishidden(fsnative(u"foo/.bar")) assert not ishidden(fsnative(u".foo/bar")) assert not ishidden(fsnative(u"foo")) class Turi(TestCase): def test_uri2fsn(self): if os.name != "nt": path = uri2fsn("file:///home/piman/cr%21azy") self.assertTrue(isinstance(path, fsnative)) self.assertEqual(path, fsnative(u"/home/piman/cr!azy")) else: path = uri2fsn("file:///C:/foo") self.assertTrue(isinstance(path, fsnative)) self.assertEqual(path, fsnative(u"C:\\foo")) def test_uri2fsn_invalid(self): self.assertRaises(ValueError, uri2fsn, "http://example.com") def test_path_as_uri(self): if os.name != "nt": self.assertRaises(ValueError, uri2fsn, "/foo") else: self.assertRaises(ValueError, uri2fsn, u"C:\\foo") def test_fsn2uri(self): if os.name != "nt": uri = fsn2uri(fsnative(u"/öäü.txt")) self.assertEqual(uri, u"file:///%C3%B6%C3%A4%C3%BC.txt") else: uri = fsn2uri(fsnative(u"C:\\öäü.txt")) self.assertEqual( uri, "file:///C:/%C3%B6%C3%A4%C3%BC.txt") self.assertEqual( fsn2uri(u"C:\\SomeDir\xe4"), "file:///C:/SomeDir%C3%A4") def test_roundtrip(self): if os.name == "nt": paths = [u"C:\\öäü.txt"] else: paths = [u"/öäü.txt", u"/a/foo/bar", u"/a/b/foo/bar"] for source in paths: path = uri2fsn(fsn2uri(fsnative(source))) self.assertTrue(isinstance(path, fsnative)) self.assertEqual(path, fsnative(source)) def test_win_unc_path(self): if os.name == "nt": self.assertEqual( fsn2uri(u"\\\\server\\share\\path"), u"file://server/share/path") def test_uri_is_valid(self): self.assertTrue(uri_is_valid(u"file:///foo")) self.assertTrue(uri_is_valid(u"file:///C:/foo")) self.assertTrue(uri_is_valid(u"http://www.example.com")) self.assertFalse(uri_is_valid(u"/bla")) self.assertFalse(uri_is_valid(u"test")) self.assertFalse(uri_is_valid(u"")) assert not uri_is_valid(u"file:///öäü") assert not uri_is_valid(u"file:///öäü".encode("utf-8")) class Tget_x_dir(TestCase): def test_get_home_dir(self): self.assertTrue(isinstance(get_home_dir(), fsnative)) self.assertTrue(os.path.isabs(get_home_dir())) class Tlimit_path(TestCase): def test_main(self): if os.name == "nt": path = u'C:\\foobar\\ä%s\\%s' % ("x" * 300, "x" * 300) path = limit_path(path) self.failUnlessEqual(len(path), 3 + 6 + 1 + 255 + 1 + 255) else: path = '/foobar/ä%s/%s' % ("x" * 300, "x" * 300) path = limit_path(path) self.failUnlessEqual(len(path), 1 + 6 + 1 + 255 + 1 + 255) path = fsnative(u"foo%s.ext" % (u"x" * 300)) new = limit_path(path, ellipsis=False) self.assertTrue(isinstance(new, fsnative)) self.assertEqual(len(new), 255) self.assertTrue(new.endswith(fsnative(u"xx.ext"))) new = limit_path(path) self.assertTrue(isinstance(new, fsnative)) self.assertEqual(len(new), 255) self.assertTrue(new.endswith(fsnative(u"...ext"))) self.assertTrue(isinstance(limit_path(fsnative()), fsnative)) self.assertEqual(limit_path(fsnative()), fsnative()) class Tiscommand(TestCase): @unittest.skipIf(is_win, "Unix only") def test_unix(self): self.failUnless(iscommand("ls")) self.failUnless(iscommand("/bin/ls")) self.failUnless(iscommand("whoami")) def test_both(self): self.failIf(iscommand("zzzzzzzzz")) self.failIf(iscommand("/bin/zzzzzzzzz")) self.failIf(iscommand("")) self.failIf(iscommand("/bin")) self.failIf(iscommand("X11")) @unittest.skipUnless(path_set, "Can only test with a valid $PATH") @unittest.skipIf(is_win, "needs porting") def test_looks_in_path(self): path_dirs = set(environ['PATH'].split(os.path.pathsep)) dirs = path_dirs - set(os.defpath.split(os.path.pathsep)) for d in dirs: if os.path.isdir(d): for file_path in sorted(os.listdir(d)): p = os.path.join(d, file_path) if os.path.isfile(p) and os.access(p, os.X_OK): print_d("Testing %s" % p) self.failUnless(iscommand(p), msg=p) return ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_soundcloudFile.py��������������������������������������������������������0000644�0001750�0001750�00000004470�13112005742�021474� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from collections import defaultdict from quodlibet import config from quodlibet.browsers.soundcloud.api import SoundcloudApiClient from quodlibet.browsers.soundcloud.library import SoundcloudLibrary, \ SoundcloudFile from tests import TestCase TRACK_ID = 1234 class TSoundcloudFile(TestCase): class FakeClient(SoundcloudApiClient): def __init__(self, token=None): super(TSoundcloudFile.FakeClient, self).__init__(token) self.online = True self.favoritings = defaultdict(int) self.unfavoritings = defaultdict(int) def _on_favorited(self, json): super(TSoundcloudFile.FakeClient, self)._on_favorited(json) def put_favorite(self, track_id): self.favoritings[track_id] += 1 def remove_favorite(self, track_id): self.unfavoritings[track_id] += 1 @classmethod def setUpClass(cls): config.RATINGS = config.HardCodedRatingsPrefs() def setUp(self): SoundcloudLibrary.librarian = None self.client = self.FakeClient() def test_favoriting(self): cl = self.client song = SoundcloudFile("http://uri", TRACK_ID, False, cl) self.failIf(song.has_rating) song['~#rating'] = 1.0 self.failUnless(song.has_rating) self.failUnlessEqual(song("~#rating"), 1.0) song.write() self.failUnless(song.favorite) self.failUnlessEqual(cl.favoritings[TRACK_ID], 1) self.failUnlessEqual(cl.unfavoritings[TRACK_ID], 0) song.write() self.failUnlessEqual(cl.favoritings[TRACK_ID], 1) def test_unfavoriting(self): cl = self.client song = SoundcloudFile("http://uri", TRACK_ID, True, cl) self.failUnless(song.has_rating) self.failUnlessEqual(song("~#rating"), 1.0) song['~#rating'] = 0.2 song.write() self.failIf(song.favorite) self.failUnlessEqual(cl.unfavoritings[TRACK_ID], 1) self.failUnlessEqual(cl.favoritings[TRACK_ID], 0) song.write() self.failUnlessEqual(cl.unfavoritings[TRACK_ID], 1) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_dbusutils.py��������������������������������������������������������0000644�0001750�0001750�00000011211�13112005742�021557� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from tests import TestCase, skipUnless from quodlibet.compat import text_type try: import dbus except ImportError: dbus = None else: from quodlibet.util.dbusutils import apply_signature, list_spec_properties from quodlibet.util.dbusutils import filter_property_spec, DBusProperty from quodlibet.util.dbusutils import dbus_unicode_validate ANN1 = b""" <property name="Position" type="s" access="read"> <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" \ value="false"/> </property> <property name="MinimumRate" type="s" access="read"/> """ ANN2 = b""" <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" \ value="false"/> <property name="Foobar" type="s" access="read"> <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" \ value="invalidates"/> </property> <property name="XXX" type="s" access="read"/> """ @skipUnless(dbus, "dbus missing") class TDbusUtils(TestCase): def test_prop_sig(self): value = apply_signature(2, "u") self.failUnless(isinstance(value, dbus.UInt32)) value = apply_signature({"a": "b"}, "a{ss}") self.failUnlessEqual(value.signature, "ss") self.failUnless(isinstance(value, dbus.Dictionary)) value = apply_signature(("a",), "a(s)") self.failUnlessEqual(value.signature, "s") self.failUnless(isinstance(value, dbus.Struct)) value = apply_signature(("a", "b"), "as") self.failUnlessEqual(value.signature, "s") self.failUnless(isinstance(value, dbus.Array)) self.failUnlessRaises(TypeError, apply_signature, 2, "a(s)") text = b'\xc3\xb6\xc3\xa4\xc3\xbc' value = apply_signature(text, "s", utf8_strings=True) self.failUnless(isinstance(value, str)) value = apply_signature(text, "s") self.failUnless(isinstance(value, text_type)) text = u"öäü" value = apply_signature(text, "s", utf8_strings=True) self.failUnless(isinstance(value, str)) value = apply_signature(text, "s") self.failUnless(isinstance(value, text_type)) def test_list_props(self): props = list_spec_properties(ANN1) self.failUnlessEqual(props["Position"]["access"], "read") self.failUnlessEqual(props["Position"]["emit"], "false") self.failUnlessEqual(props["Position"]["type"], "s") self.failUnlessEqual(props["MinimumRate"]["emit"], "true") props = list_spec_properties(ANN2) self.failUnlessEqual(props["Foobar"]["emit"], "invalidates") self.failUnlessEqual(props["XXX"]["emit"], "false") def test_filter_props(self): spec = filter_property_spec(ANN1, wl=["Position"]) self.failUnlessEqual( list(list_spec_properties(spec).keys()), ["Position"]) props = list_spec_properties(spec) self.failUnlessEqual(props["Position"]["emit"], "false") spec = filter_property_spec(ANN1, bl=["Position"]) self.failUnlessEqual(list(list_spec_properties(spec).keys()), ["MinimumRate"]) spec = filter_property_spec(ANN1) self.failUnlessEqual(len(list_spec_properties(spec).keys()), 2) def test_validate_utf8(self): self.failUnlessEqual(dbus_unicode_validate(u'X\ufffeX'), u"X\ufffdX") self.failUnlessEqual(dbus_unicode_validate(b'X\xef\xbf\xbeX'), u"X\ufffdX") def test_property_mixin(self): class X(DBusProperty): SUPPORTS_MULTIPLE_OBJECT_PATHS = False def set_introspection(self, *args): pass def get_property(self, interface, name): return interface def set_property(self, interface, name, value): pass x = X() x.set_properties("a1", ANN1) x.set_properties("a2", ANN2) x.implement_interface("a1", "a2") props = x.get_properties("a1") self.failUnless(("a1", "Position") in props) self.failUnless(("a2", "XXX") in props) props = x.get_properties("a2") self.failIf(("a1", "Position") in props) self.failUnlessEqual(x.get_interface("a2", "XXX"), "a2") self.failUnlessEqual(x.get_interface("a1", "XXX"), "a2") self.failUnlessEqual(x.get_value("a2", "XXX"), "a2") self.failUnlessEqual(x.get_value("a1", "XXX"), "a2") self.failUnlessEqual(x.get_value("a1", "Position"), "a1") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_plugins_events.py��������������������������������������������������������0000644�0001750�0001750�00000005325�13112005742�021562� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, mkstemp, mkdtemp import os import sys import shutil from quodlibet import player from quodlibet.library import SongLibrarian from quodlibet.plugins import PluginManager from quodlibet.plugins.events import EventPluginHandler class TEventPlugins(TestCase): def setUp(self): self.tempdir = mkdtemp() self.pm = PluginManager(folders=[self.tempdir]) self.lib = SongLibrarian() self.player = player.init_player("nullbe", self.lib) self.handler = EventPluginHandler( librarian=self.lib, player=self.player) self.pm.register_handler(self.handler) self.pm.rescan() self.assertEquals(self.pm.plugins, []) def tearDown(self): self.pm.quit() shutil.rmtree(self.tempdir) def create_plugin(self, name='', funcs=None): fd, fn = mkstemp(suffix='.py', text=True, dir=self.tempdir) file = os.fdopen(fd, 'w') file.write("from quodlibet.plugins.events import EventPlugin\n") file.write("log = []\n") file.write("class %s(EventPlugin):\n" % name) indent = ' ' file.write("%spass\n" % indent) if name: file.write("%sPLUGIN_ID = %r\n" % (indent, name)) file.write("%sPLUGIN_NAME = %r\n" % (indent, name)) for f in (funcs or []): file.write("%sdef %s(s, *args): log.append((%r, args))\n" % (indent, f, f)) file.flush() file.close() def _get_calls(self, plugin): mod = sys.modules[plugin.cls.__module__] return mod.log def test_found(self): self.create_plugin(name='Name') self.pm.rescan() self.assertEquals(len(self.pm.plugins), 1) def test_player_paused(self): self.create_plugin(name='Name', funcs=["plugin_on_paused"]) self.pm.rescan() self.assertEquals(len(self.pm.plugins), 1) plugin = self.pm.plugins[0] self.pm.enable(plugin, True) self.player.emit("paused") self.failUnlessEqual([("plugin_on_paused", tuple())], self._get_calls(plugin)) def test_lib_changed(self): self.create_plugin(name='Name', funcs=["plugin_on_changed"]) self.pm.rescan() self.assertEquals(len(self.pm.plugins), 1) plugin = self.pm.plugins[0] self.pm.enable(plugin, True) self.lib.emit("changed", [None]) self.failUnlessEqual([("plugin_on_changed", ([None],))], self._get_calls(plugin)) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_controls.py���������������������������������������������������������0000644�0001750�0001750�00000001633�13112005742�021411� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.controls import PlayControls, VolumeMenu from quodlibet.qltk.controls import Volume from quodlibet.library import SongLibrary from quodlibet.player.nullbe import NullPlayer from quodlibet import config class TControls(TestCase): def setUp(self): config.init() self.p = NullPlayer() self.l = SongLibrary() def tearDown(self): config.quit() def test_controls(self): w = PlayControls(self.p, self.l) w.destroy() def test_volumemenu(self): w = VolumeMenu(self.p) w.destroy() def test_volume(self): w = Volume(self.p) w.destroy() �����������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_fifo.py�������������������������������������������������������������0000644�0001750�0001750�00000004255�13112005742�020476� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import print_d from quodlibet.util import is_windows from tests import TestCase, skipIf from quodlibet.util.fifo import split_message, FIFO, fifo_exists, write_fifo from tests.helper import temp_filename class Tsplit_message(TestCase): def test_main(self): func = lambda d: list(split_message(d)) # no response format self.assertEqual(func(b""), []) self.assertEqual(func(b"foo"), [(b"foo", None)]) self.assertEqual(func(b"foo\nbar"), [(b"foo", None), (b"bar", None)]) # response format self.assertEqual(func(b"\x00a\x00/dev/null\x00"), [(b"a", b"/dev/null")]) self.assertEqual(func(b"\x00a\x00/dev/null\x00\x00b\x00/dev/foo\x00"), [(b"a", b"/dev/null"), (b"b", b"/dev/foo")]) # mixed self.assertEqual(func(b"foo\x00a\x00/dev\x00"), [(b"foo", None), (b"a", b"/dev")]) self.assertEqual(func(b"\x00a\x00/dev\x00foo"), [(b"a", b"/dev"), (b"foo", None)]) self.assertEqual(func(b"\x00a\x00/dev\x00foo\x00b\x00/arg\x00bla"), [(b"a", b"/dev"), (b"foo", None), (b"b", b"/arg"), (b"bla", None)]) # inval self.assertRaises(ValueError, func, b"foo\x00bar") @skipIf(is_windows(), "not on Windows") class TFIFO(TestCase): def test_creation_destruction(self): def cb(bs, _): print_d(bs) with temp_filename() as fn: fifo = FIFO(fn, cb) self.failIf(fifo_exists(fifo._path)) fifo.open() self.failUnless(fifo_exists(fifo._path)) # Should *not* error if file is gone fifo.destroy() def test_unwriteable_location(self): fifo = FIFO("/dev/not-here", None) fifo.open() with self.assertRaises(OSError): write_fifo(fifo._path, "foobar".encode()) fifo.destroy() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_browsers___init__.py�����������������������������������������������������0000644�0001750�0001750�00000004334�13112005742�022201� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys from tests import TestCase from quodlibet import browsers browsers.init() class TBrowsers(TestCase): def test_presence(self): self.failUnless(browsers.search) self.failUnless(browsers.paned) self.failUnless(browsers.iradio) self.failUnless(browsers.audiofeeds) self.failUnless(browsers.albums) self.failUnless(browsers.playlists) self.failUnless(browsers.filesystem) def test_get(self): self.failUnless(browsers.get("SearchBar") is browsers.search.SearchBar) self.failUnless( browsers.get("FileSystem") is browsers.filesystem.FileSystem) self.assertEqual(browsers.get("Paned"), browsers.paned.PanedBrowser) self.assertEqual(browsers.get("paned"), browsers.paned.PanedBrowser) self.assertEqual(browsers.get("panedbrowser"), browsers.paned.PanedBrowser) def test_default(self): self.assertEqual(browsers.default, browsers.search.SearchBar) def test_name(self): self.assertEqual(browsers.name(browsers.search.SearchBar), "SearchBar") def test_get_invalid(self): self.assertRaises(ValueError, browsers.get, "DoesNotExist") def test_index(self): self.assertEqual( browsers.browsers[browsers.index("SearchBar")], browsers.search.SearchBar) self.assertEqual( browsers.browsers[browsers.index("FileSystem")], browsers.filesystem.FileSystem) def test_index_invalid(self): self.assertRaises(ValueError, browsers.index, "DoesNotExist") def test_migrate(self): self.failUnless( sys.modules["browsers.audiofeeds"] is browsers.audiofeeds) self.failUnless( sys.modules["browsers.iradio"] is browsers.iradio) def test_old_names(self): self.assertEqual(browsers.get("PanedBrowser"), browsers.get("Paned")) self.assertEqual(browsers.get("PlaylistsBrowser"), browsers.get("Playlists")) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_player_gst.py������������������������������������������������������������0000644�0001750�0001750�00000021233�13112005742�020662� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import contextlib try: from gi.repository import Gst except ImportError: Gst = None from tests import TestCase, skipUnless, get_data_path try: from quodlibet.player.gstbe.util import GStreamerSink as Sink from quodlibet.player.gstbe.util import parse_gstreamer_taglist from quodlibet.player.gstbe.util import find_audio_sink from quodlibet.player.gstbe.prefs import GstPlayerPreferences except ImportError: pass from quodlibet.player import PlayerError from quodlibet.util import sanitize_tags, print_w from quodlibet.formats import MusicFile from quodlibet.compat import long, text_type from quodlibet import config @contextlib.contextmanager def ignore_gst_errors(): old = Gst.debug_get_default_threshold() Gst.debug_set_default_threshold(Gst.DebugLevel.NONE) yield Gst.debug_set_default_threshold(old) @skipUnless(Gst, "GStreamer missing") class TGstPlayerPrefs(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_main(self): widget = GstPlayerPreferences(None, True) widget.destroy() @skipUnless(Gst, "GStreamer missing") class TGStreamerSink(TestCase): def test_simple(self): sinks = ["gconfaudiosink", "alsasink"] for n in filter(Gst.ElementFactory.find, sinks): obj, name = Sink(n) self.failUnless(obj) self.failUnlessEqual(name, n) def test_invalid(self): with ignore_gst_errors(): self.assertRaises(PlayerError, Sink, "notarealsink") def test_fallback(self): obj, name = Sink("") self.failUnless(obj) if os.name == "nt": self.failUnlessEqual(name, "directsoundsink") else: self.failUnlessEqual(name, find_audio_sink()[1]) def test_append_sink(self): obj, name = Sink("volume") self.failUnless(obj) self.failUnlessEqual(name.split("!")[-1].strip(), Sink("")[1]) @skipUnless(Gst, "GStreamer missing") class TGstreamerTagList(TestCase): def test_parse(self): # gst.TagList can't be filled using pyGtk... so use a dict instead l = {} l["extended-comment"] = u"foo=bar" self.failUnless("foo" in parse_gstreamer_taglist(l)) l["extended-comment"] = [u"foo=bar", u"bar=foo", u"bar=foo2"] self.failUnless("foo" in parse_gstreamer_taglist(l)) self.failUnless("bar" in parse_gstreamer_taglist(l)) self.failUnlessEqual(parse_gstreamer_taglist(l)["bar"], "foo\nfoo2") # date is abstract, so define our own # (might work with pygobject now) class Foo(object): def to_iso8601_string(self): return "3000-10-2" l["date"] = Foo() date = Gst.DateTime Gst.DateTime = Foo self.failUnlessEqual(parse_gstreamer_taglist(l)["date"], "3000-10-2") Gst.DateTime = date l["foo"] = u"äöü" parsed = parse_gstreamer_taglist(l) self.assertTrue(isinstance(parsed["foo"], text_type)) self.assertTrue(u"äöü" in parsed["foo"].split("\n")) l["foo"] = u"äöü".encode("utf-8") parsed = parse_gstreamer_taglist(l) self.assertTrue(isinstance(parsed["foo"], text_type)) self.assertTrue(u"äöü" in parsed["foo"].split("\n")) l["bar"] = 1.2 self.failUnlessEqual(parse_gstreamer_taglist(l)["bar"], 1.2) l["bar"] = long(9) self.failUnlessEqual(parse_gstreamer_taglist(l)["bar"], 9) l["bar"] = 9 self.failUnlessEqual(parse_gstreamer_taglist(l)["bar"], 9) l["bar"] = Gst.TagList() # some random gst instance self.failUnless( isinstance(parse_gstreamer_taglist(l)["bar"], text_type)) self.failUnless("GstTagList" in parse_gstreamer_taglist(l)["bar"]) def test_sanitize(self): l = sanitize_tags({"location": u"http://foo"}) self.failUnless("website" in l) l = sanitize_tags({"channel-mode": u"joint-stereo"}) self.failUnlessEqual(l["channel-mode"], "stereo") l = sanitize_tags({"channel-mode": u"dual"}) self.failUnlessEqual(l["channel-mode"], "stereo") l = sanitize_tags({"audio-codec": u"mp3"}) self.failUnlessEqual(l["audio-codec"], "MP3") l = sanitize_tags({"audio-codec": u"Advanced Audio Coding"}) self.failUnlessEqual(l["audio-codec"], "MPEG-4 AAC") l = sanitize_tags({"audio-codec": u"vorbis"}) self.failUnlessEqual(l["audio-codec"], "Ogg Vorbis") l = {"a": u"http://www.shoutcast.com", "b": u"default genre"} l = sanitize_tags(l) self.failIf(l) l = sanitize_tags({"duration": 1000 * 42}, stream=True) self.failUnlessEqual(l["~#length"], 42) l = sanitize_tags({"duration": 1000 * 42}) self.failIf(l) l = sanitize_tags({"duration": u"bla"}, stream=True) self.failUnlessEqual(l["duration"], u"bla") l = sanitize_tags({"bitrate": 1000 * 42}, stream=True) self.failUnlessEqual(l["~#bitrate"], 42) l = sanitize_tags({"bitrate": 1000 * 42}) self.failIf(l) l = sanitize_tags({"bitrate": u"bla"}) self.failUnlessEqual(l["bitrate"], u"bla") l = sanitize_tags({"nominal-bitrate": 1000 * 42}) self.failUnlessEqual(l["~#bitrate"], 42) l = sanitize_tags({"nominal-bitrate": 1000 * 42}, stream=True) self.failIf(l) l = sanitize_tags({"nominal-bitrate": u"bla"}) self.failUnlessEqual(l["nominal-bitrate"], u"bla") l = {"emphasis": u"something"} self.failIf(sanitize_tags(l)) self.failIf(sanitize_tags(l)) l = {"title": u"something"} self.failIf(sanitize_tags(l)) self.failUnless(sanitize_tags(l, stream=True)) l = {"artist": u"something"} self.failIf(sanitize_tags(l)) self.failUnless(sanitize_tags(l, stream=True)) l = {"~#foo": 42, "bar": 42, "~#bla": u"42"} self.failUnless("~#foo" in sanitize_tags(l)) self.failUnless("~#bar" in sanitize_tags(l)) self.failUnless("bla" in sanitize_tags(l)) l = {} l["extended-comment"] = [u"location=1", u"website=2", u"website=3"] l = parse_gstreamer_taglist(l) l = sanitize_tags(l)["website"].split("\n") self.failUnless("1" in l) self.failUnless("2" in l) self.failUnless("3" in l) @skipUnless(Gst, "GStreamer missing") class TGStreamerCodecs(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def _check(self, song): old_threshold = Gst.debug_get_default_threshold() Gst.debug_set_default_threshold(Gst.DebugLevel.NONE) pipeline = Gst.parse_launch( "uridecodebin uri=%s ! fakesink" % song("~uri")) bus = pipeline.get_bus() pipeline.set_state(Gst.State.PLAYING) try: while 1: message = bus.timed_pop(Gst.SECOND * 10) if not message or message.type == Gst.MessageType.ERROR: if message: debug = message.parse_error()[0].message else: debug = "timed out" # only print a warning for platforms where we control # the shipped dependencies. if sys.platform == "darwin" or os.name == "nt": print_w("GStreamer: Decoding %r failed (%s)" % (song("~format"), debug)) break if message.type == Gst.MessageType.EOS: break finally: pipeline.set_state(Gst.State.NULL) Gst.debug_set_default_threshold(old_threshold) def test_decode_all(self): """Decode all kinds of formats using Gstreamer, to check if they all work and to notify us if a plugin is missing on platforms where we control the packaging. """ files = [ "coverart.wv", "empty.aac", "empty.flac", "empty.ogg", "empty.opus", "silence-44-s.mpc", "silence-44-s.sv8.mpc", "silence-44-s.tta", "test.mid", "test.spc", "test.vgm", "test.wma", "silence-44-s.spx", "empty.xm", ] for file_ in files: path = get_data_path(file_) song = MusicFile(path) if song is not None: self._check(song) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test___init__.py��������������������������������������������������������������0000644�0001750�0001750�00000003147�13112005742�020254� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import fsnative from tests import TestCase import quodlibet from quodlibet import config from quodlibet.const import Version class TQuodlibet(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_first_session(self): self.assertTrue(quodlibet.is_first_session("quodlibet")) self.assertTrue(quodlibet.is_first_session("quodlibet")) quodlibet.finish_first_session("exfalso") self.assertTrue(quodlibet.is_first_session("quodlibet")) quodlibet.finish_first_session("quodlibet") self.assertFalse(quodlibet.is_first_session("quodlibet")) def test_dirs(self): self.assertTrue(isinstance(quodlibet.get_base_dir(), fsnative)) self.assertTrue(isinstance(quodlibet.get_image_dir(), fsnative)) self.assertTrue(isinstance(quodlibet.get_user_dir(), fsnative)) def test_get_build_description(self): quodlibet.get_build_description() def test_get_build_version(self): ver = quodlibet.get_build_version() self.assertTrue(isinstance(ver, tuple)) class TVersion(TestCase): def test_message(self): v = Version("foo", 1, 2, message="bla") self.assertRaises(ImportError, v.check, (1, 1)) try: v.check((1, 1)) except ImportError as e: self.assertTrue("bla" in str(e)) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_unisearch.py�������������������������������������������������������������0000644�0001750�0001750�00000014022�13112005742�020470� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import re import unicodedata from tests import TestCase from quodlibet.unisearch import compile from quodlibet.unisearch.db import diacritic_for_letters from quodlibet.unisearch.parser import re_replace_literals, re_add_variants class TUniSearch(TestCase): def test_mapping(self): cache = diacritic_for_letters(False) new = diacritic_for_letters(True) self.assertEqual(sorted(cache.items()), sorted(new.items())) def test_normalize_input(self): assert re.match( re_add_variants(unicodedata.normalize("NFD", u"ö")), u"ö") def test_re_replace(self): r = re_add_variants(u"aa") self.assertTrue(u"[" in r and u"]" in r and r.count(u"ä") == 2) def test_re_replace_multi(self): r = re_add_variants(u"ae") self.assertEqual(r, u"(?:[aàáâãäåāăąǎǟǡǻȁȃȧḁạảấầẩẫậắằẳẵặ]" u"[eèéêëēĕėęěȅȇȩḕḗḙḛḝẹẻẽếềểễệ]|[æǣǽ])") r = re_add_variants(u"SS") self.assertEqual(r, u"(?:[SŚŜŞŠȘṠṢṤṦṨꞄ][SŚŜŞŠȘṠṢṤṦṨꞄ]|ẞ)") r = re_add_variants(u"ss") self.assertEqual(r, u"(?:[sśŝşšșṡṣṥṧṩꞅ][sśŝşšșṡṣṥṧṩꞅ]|ß)") def test_punct(self): r = re_add_variants(u"'") assert "`" in r assert "'" in r r = re_add_variants(u"''") assert "\"" in r r = re_add_variants(u'"') assert "”" in r assert "“" in r r = re_add_variants(u'\\*') assert re.match(r, "*") def test_re_replace_multi_fixme(self): # we don't handler overlapping sequences, so this doesn't match "LỺ" r = re_add_variants(u"LLL") self.assertEqual(r, u"(?:[LĹĻĽḶḸḺḼŁ][LĹĻĽḶḸḺḼŁ]|Ỻ)[LĹĻĽḶḸḺḼŁ]") def test_re_replace_multi_nested(self): r = re_add_variants(u"(եւ)") self.assertEqual(r, u"((?:եւ|և))") r = re_add_variants(u"(եւ)+") self.assertEqual(r, u"((?:եւ|և))+") def test_re_replace_escape(self): r = re_add_variants(u"n\\n") self.assertEqual(r, u"[nñńņňǹṅṇṉṋʼn]\n") def test_construct_regexp(self): res = [ (u"\\.", None), (u"..", None), (u"\\.", None), (u"^a\aa[ha-z]k{1,3}h*h+h?(x|yy)(a+b|cd)$", None), (u"(?=Asimov)", None), (u"(?!Asimov)", None), (u"(?<=abc)def", None), (u"(?<!foo)", None), (u"(?:foo)", None), (u"(?#foo)", u""), (u"(.+) \1", None), (u"\\A\\b\\B\\d\\D\\s\\S\\w\\W\\Z\a", u"\\A\\b\\B[\\d][\\D][\\s][\\S][\\w][\\W]\\Z\a"), (u"a{3,5}?a+?a*?a??", None), (u"^foo$", None), (u"[-+]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?", u"[\\-\\+]?([\\d]+(\\.[\\d]*)?|\\.[\\d]+)([eE][\\-\\+]?[\\d]+)?"), (u"(\$\d*)", u"(\\$[\\d]*)"), (u"\\$\\.\\^\\[\\]\\:\\-\\+\\?\\\\", None), (u"[^a][^ab]", None), (u"[ab][abc]", None), (u"[.]", u"\\."), (u"[^a-z]", None), (u"[^a-z\w]", None), ] for r, o in res: if o is None: o = r self.assertEqual(re_replace_literals(r, {}), o) def test_construct_regexp_broken(self): self.assertRaises(re.error, re_replace_literals, u"[", {}) self.assertRaises(NotImplementedError, re_replace_literals, u"(?P<quote>['\"]).*?(?P=quote)", {}) def test_seq(self): assert re_add_variants(u"[x-y]") == u"[ẋẍýÿŷȳẏẙỳỵỷỹx-y]" assert re_add_variants(u"[f-gm]") == u"[ḟꝼĝğġģǧǵḡᵹf-gmḿṁṃ]" assert re_add_variants(u"[^m]") == u"[^mḿṁṃ]" assert re_add_variants(u"[^m-m\w]") == u"[^ḿṁṃm-m\w]" assert re_add_variants(u"[^m-m]") == "[^ḿṁṃm-m]" assert re_add_variants(u"[^ö]") == u"[^ö]" assert re_add_variants(u"[LLL]") == u"[LĹĻĽḶḸḺḼŁ]" def test_literal(self): assert re_add_variants(u"f") == u"[fḟꝼ]" assert u"ø" in re_add_variants(u"o") assert u"Ø" in re_add_variants(u"O") assert re_add_variants(u"[^f]") == u"[^fḟꝼ]" class TCompileMatch(TestCase): def test_basics_default(self): assert compile(u"foo")(u"foo") assert compile(u"foo")(u"fooo") assert not compile(u"foo")(u"fo") def test_ignore_case(self): assert compile(u"foo", ignore_case=True)(u"Foo") assert not compile(u"foo", ignore_case=False)(u"Foo") def test_assert_dot_all(self): assert compile(u"a.b", dot_all=True)(u"a\nb") assert not compile(u"a.b", dot_all=False)(u"a\nb") assert compile(u"a.b", dot_all=False)(u"a b") def test_unicode_equivalence(self): assert compile(u"\u212B")(u"\u00C5") assert compile(u"\u00C5")(u"\u212B") assert compile(u"A\u030a")(u"\u00C5") assert compile(u"A\u030a")(u"\u212B") assert compile(u"o\u0308")(u"o\u0308") assert compile(u"o\u0308")(u"\xf6") assert compile(u"\xf6")(u"o\u0308") def test_assert_asym(self): assert compile(u"o", asym=True)(u"ö") assert not compile(u"o", asym=False)(u"ö") def test_assert_asym_unicode_equivalence(self): assert compile(u"A", asym=True)(u"\u00C5") assert compile(u"A\u030a", asym=True)(u"\u212B") assert compile(u"\u00C5", asym=True)(u"\u212B") assert compile(u"\u212B", asym=True)(u"\u00C5") def test_invalid(self): with self.assertRaises(ValueError): compile(u"(F", asym=False) with self.assertRaises(ValueError): compile(u"(F", asym=True) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_aiff.py����������������������������������������������������������0000644�0001750�0001750�00000001702�13112005742�021150� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, get_data_path from quodlibet.formats.aiff import AIFFFile class TAIFFFile(TestCase): def setUp(self): self.song = AIFFFile(get_data_path('test.aiff')) def test_length(self): self.assertAlmostEqual(self.song("~#length"), 1.0, 1) def test_bitrate(self): self.failUnlessEqual(self.song("~#bitrate"), 128) def test_format(self): self.assertEqual(self.song("~format"), "AIFF") def test_tags(self): self.assertEqual(self.song("artist"), "artist") self.assertEqual(self.song("album"), "album") self.assertEqual(self.song("genre"), "genre") def test_channels(self): assert self.song("~#channels") == 1 ��������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_bookmarks.py��������������������������������������������������������0000644�0001750�0001750�00000002040�13112005742�021527� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import fsnative from tests import TestCase from quodlibet.qltk.bookmarks import EditBookmarks, MenuItems from quodlibet.player.nullbe import NullPlayer from quodlibet.library import SongLibrary from quodlibet.formats import AudioFile from quodlibet import config class TBookmarks(TestCase): def setUp(self): config.init() player = NullPlayer() song = AudioFile() song.bookmarks = [(10, "bla")] song.sanitize(fsnative(u"/")) player.song = song self.player = player def tearDown(self): self.player.destroy() config.quit() def test_edit_window(self): EditBookmarks(None, SongLibrary(), self.player).destroy() def test_menu_items(self): MenuItems(self.player.song.bookmarks, self.player, False) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_library_libraries.py�����������������������������������������������������0000644�0001750�0001750�00000057662�13112005742�022230� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk import os import shutil from senf import fsnative from quodlibet.formats import AudioFileError from quodlibet import config from quodlibet.util import connect_obj, is_windows from quodlibet.formats import AudioFile from quodlibet.compat import text_type, iteritems, iterkeys, itervalues from tests import TestCase, get_data_path, mkstemp, mkdtemp, skipIf from .helper import capture_output, get_temp_copy from quodlibet.library.libraries import Library, PicklingMixin, SongLibrary, \ FileLibrary, AlbumLibrary, SongFileLibrary, iter_paths class Fake(int): def __init__(self, _): self.key = int(self) def Frange(*args): return list(map(Fake, range(*args))) class FakeSong(Fake): def list(self, tag): # Turn tag_values into a less-than query, for testing. if tag <= self: return [] else: return [int(self)] def rename(self, newname): self.key = newname class AlbumSong(AudioFile): """A mock AudioFile belong to one of three albums, based on a single number""" def __init__(self, num, album=None): super(AlbumSong, self).__init__() self["~filename"] = fsnative(u"file_%d.mp3" % (num + 1)) self["title"] = "Song %d" % (num + 1) self["artist"] = "Fakeman" if album is None: self["album"] = "Album %d" % (num % 3 + 1) else: self["album"] = album self["labelid"] = self["album"] class FakeSongFile(FakeSong): _valid = True _exists = True _mounted = True @property def mountpoint(self): return "/" if self._mounted else "/FAKE" def valid(self): return self._valid def exists(self): return self._exists def reload(self): if self._exists: self._valid = True else: raise IOError("doesn't exist") def mounted(self): return self._mounted # Custom range functions, to generate lists of song-like objects def FSFrange(*args): return list(map(FakeSongFile, range(*args))) def FSrange(*args): return list(map(FakeSong, range(*args))) def ASrange(*args): return list(map(AlbumSong, range(*args))) class TLibrary(TestCase): Fake = Fake Frange = staticmethod(Frange) Library = Library def setUp(self): self.library = self.Library() self.added = [] self.changed = [] self.removed = [] connect_obj(self.library, 'added', list.extend, self.added) connect_obj(self.library, 'changed', list.extend, self.changed) connect_obj(self.library, 'removed', list.extend, self.removed) def test_add(self): self.library.add(self.Frange(12)) self.failUnlessEqual(self.added, self.Frange(12)) del(self.added[:]) self.library.add(self.Frange(12, 24)) self.failUnlessEqual(self.added, self.Frange(12, 24)) def test_remove(self): self.library.add(self.Frange(10)) self.assertTrue(self.library.remove(self.Frange(3, 6))) self.failUnlessEqual(self.removed, self.Frange(3, 6)) # Neither the objects nor their keys should be present. self.failIf(self.Fake(3) in self.library) self.failUnless(self.Fake(6) in self.library) self.failIf(3 in self.library) self.failUnless(6 in self.library) def test_remove_when_not_present(self): self.assertFalse(self.library.remove([self.Fake(12)])) def test_changed(self): self.library.add(self.Frange(10)) self.library.changed(self.Frange(5)) while Gtk.events_pending(): Gtk.main_iteration() self.failUnlessEqual(self.changed, self.Frange(5)) def test_changed_not_present(self): self.library.add(self.Frange(10)) self.library.changed(self.Frange(2, 20, 3)) while Gtk.events_pending(): Gtk.main_iteration() self.failUnlessEqual(set(self.changed), {2, 5, 8}) def test_changed_none_present(self): self.library.changed(self.Frange(5)) while Gtk.events_pending(): Gtk.main_iteration() def test___iter__(self): self.library.add(self.Frange(10)) self.failUnlessEqual(sorted(list(self.library)), self.Frange(10)) def test___iter___empty(self): self.failIf(list(self.library)) def test___len__(self): self.failUnlessEqual(len(self.library), 0) self.library.add(self.Frange(10)) self.failUnlessEqual(len(self.library), 10) self.library.remove(self.Frange(3)) self.failUnlessEqual(len(self.library), 7) def test___getitem__(self): self.library.add(self.Frange(10)) self.failUnlessEqual(self.library[5], 5) new = self.Fake(12) new.key = 100 self.library.add([new]) self.failUnlessEqual(self.library[100], 12) self.failIf(12 in self.library) def test___getitem___not_present(self): self.library.add(self.Frange(10)) self.failUnlessRaises(KeyError, self.library.__getitem__, 12) def test___contains__(self): self.library.add(self.Frange(10)) new = self.Fake(12) new.key = 100 self.library.add([new]) for value in [0, 1, 2, 6, 9, 100, new]: # 0, 1, 2, 6, 9: all added by self.Frange # 100: key for new # new: is itself present self.failUnless(value in self.library, "didn't find %d" % value) for value in [-1, 10, 12, 101]: # -1, 10, 101: boundry values # 12: equal but non-key-equal to new self.failIf(value in self.library, "found %d" % value) def test_get(self): self.failUnless(self.library.get(12) is None) self.failUnless(self.library.get(12, "foo") == "foo") new = self.Fake(12) new.key = 100 self.library.add([new]) self.failUnless(self.library.get(12) is None) self.failUnless(self.library.get(100) is new) def test_keys(self): items = [] for i in range(20): items.append(self.Fake(i)) items[-1].key = i + 100 self.library.add(items) self.failUnlessEqual( sorted(self.library.keys()), list(range(100, 120))) self.failUnlessEqual( sorted(iterkeys(self.library)), list(range(100, 120))) def test_values(self): items = [] for i in range(20): items.append(self.Fake(i)) items[-1].key = i + 100 self.library.add(items) self.failUnlessEqual(sorted(self.library.values()), list(range(20))) self.failUnlessEqual( sorted(itervalues(self.library)), list(range(20))) def test_items(self): items = [] for i in range(20): items.append(self.Fake(i)) items[-1].key = i + 100 self.library.add(items) expected = list(zip(range(100, 120), range(20))) self.failUnlessEqual(sorted(self.library.items()), expected) self.failUnlessEqual(sorted(iteritems(self.library)), expected) def test_has_key(self): self.failIf(self.library.has_key(10)) new = self.Fake(10) new.key = 20 self.library.add([new]) self.failIf(self.library.has_key(10)) self.failUnless(self.library.has_key(20)) def tearDown(self): self.library.destroy() class FakeAudioFile(AudioFile): def __init__(self, key): self["~filename"] = fsnative(text_type(key)) def FakeAudioFileRange(*args): return list(map(FakeAudioFile, range(*args))) class TPicklingMixin(TestCase): class PicklingMockLibrary(PicklingMixin, Library): """A library-like class that implements enough to test PicklingMixin""" def __init__(self): PicklingMixin.__init__(self) self._contents = {} # set up just enough of the library interface to work self.values = self._contents.values self.items = self._contents.items def add(self, items): for item in items: self._contents[item.key] = item Library = PicklingMockLibrary Frange = staticmethod(FakeAudioFileRange) def setUp(self): self.library = self.Library() def test_load_noexist(self): fd, filename = mkstemp() os.close(fd) os.unlink(filename) library = self.Library() library.load(filename) assert len(library) == 0 def test_load_invalid(self): fd, filename = mkstemp() os.write(fd, b"nope") os.close(fd) try: library = self.Library() library.load(filename) assert len(library) == 0 finally: os.unlink(filename) def test_save_load(self): fd, filename = mkstemp() os.close(fd) try: self.library.add(self.Frange(30)) self.library.save(filename) library = self.Library() library.load(filename) for (k, v), (k2, v2) in zip( sorted(self.library.items()), sorted(library.items())): assert k == k2 assert v.key == v2.key finally: os.unlink(filename) class TSongLibrary(TLibrary): Fake = FakeSong Frange = staticmethod(FSrange) Library = SongLibrary def test_rename_dirty(self): self.library.dirty = False song = self.Fake(10) self.library.add([song]) self.failUnless(self.library.dirty) self.library.dirty = False self.library.rename(song, 20) self.failUnless(self.library.dirty) def test_rename(self): song = self.Fake(10) self.library.add([song]) self.library.rename(song, 20) while Gtk.events_pending(): Gtk.main_iteration() self.failUnless(song in self.changed) self.failUnless(song in self.library) self.failUnless(song.key in self.library) self.failUnlessEqual(song.key, 20) def test_rename_changed(self): song = self.Fake(10) self.library.add([song]) changed = set() self.library.rename(song, 20, changed=changed) self.assertEqual(len(changed), 1) self.assertTrue(song in changed) def test_tag_values(self): self.library.add(self.Frange(30)) del(self.added[:]) self.failUnlessEqual( sorted(self.library.tag_values(10)), list(range(10))) self.failUnlessEqual(sorted(self.library.tag_values(0)), []) self.failIf(self.changed or self.added or self.removed) class TFileLibrary(TLibrary): Fake = FakeSongFile Library = FileLibrary def test_mask_invalid_mount_point(self): new = self.Fake(1) self.library.add([new]) self.failIf(self.library.masked_mount_points) self.failUnless(len(self.library)) self.library.mask("/adsadsafaf") self.failIf(self.library.masked_mount_points) self.library.unmask("/adsadsafaf") self.failIf(self.library.masked_mount_points) self.failUnless(len(self.library)) def test_mask_basic(self): new = self.Fake(1) self.library.add([new]) self.failIf(self.library.masked_mount_points) self.library.mask(new.mountpoint) self.failUnlessEqual(self.library.masked_mount_points, [new.mountpoint]) self.failIf(len(self.library)) self.failUnlessEqual(self.library.get_masked(new.mountpoint), [new]) self.failUnless(self.library.masked(new)) self.library.unmask(new.mountpoint) self.failUnless(len(self.library)) self.failUnlessEqual(self.library.get_masked(new.mountpoint), []) def test_remove_masked(self): new = self.Fake(1) self.library.add([new]) self.library.mask(new.mountpoint) self.failUnless(self.library.masked_mount_points) self.library.remove_masked(new.mountpoint) self.failIf(self.library.masked_mount_points) def test_content_masked(self): new = self.Fake(100) new._mounted = False self.failIf(self.library.get_content()) self.library._load_init([new]) self.failUnless(self.library.masked(new)) self.failUnless(self.library.get_content()) def test_init_masked(self): new = self.Fake(100) new._mounted = False self.library._load_init([new]) self.failIf(self.library.items()) self.failUnless(self.library.masked(new)) def test_load_init_nonmasked(self): new = self.Fake(200) new._mounted = True self.library._load_init([new]) self.failUnlessEqual(list(self.library.values()), [new]) def test_reload(self): new = self.Fake(200) self.library.add([new]) changed = set() removed = set() self.library.reload(new, changed=changed, removed=removed) self.assertTrue(new in changed) self.assertFalse(removed) class TSongFileLibrary(TSongLibrary): Fake = FakeSongFile Frange = staticmethod(FSFrange) Library = SongFileLibrary def test__load_exists_invalid(self): new = self.Fake(100) new._valid = False changed, removed = self.library._load_item(new) self.failIf(removed) self.failUnless(changed) self.failUnless(new._valid) self.failUnless(new in self.library) def test__load_not_exists(self): new = self.Fake(100) new._valid = False new._exists = False changed, removed = self.library._load_item(new) self.failIf(removed) self.failIf(changed) self.failIf(new._valid) self.failIf(new in self.library) def test__load_error_during_reload(self): try: from quodlibet import util print_exc = util.print_exc util.print_exc = lambda *args, **kwargs: None new = self.Fake(100) def error(): raise AudioFileError new.reload = error new._valid = False changed, removed = self.library._load_item(new) self.failUnless(removed) self.failIf(changed) self.failIf(new._valid) self.failIf(new in self.library) finally: util.print_exc = print_exc def test__load_not_mounted(self): new = self.Fake(100) new._valid = False new._exists = False new._mounted = False changed, removed = self.library._load_item(new) self.failIf(removed) self.failIf(changed) self.failIf(new._valid) self.failIf(new in self.library) self.failUnless(self.library.masked(new)) def __get_file(self): return get_temp_copy(get_data_path('empty.flac')) def test_add_filename(self): config.init() try: filename = self.__get_file() ret = self.library.add_filename(filename) self.failUnless(ret) self.failUnlessEqual(1, len(self.library)) self.failUnlessEqual(len(self.added), 1) ret = self.library.add_filename(filename) self.failUnless(ret) self.failUnlessEqual(len(self.added), 1) os.unlink(filename) filename = self.__get_file() ret = self.library.add_filename(filename, add=False) self.failUnless(ret) self.failIf(ret in self.library) self.failUnlessEqual(len(self.added), 1) self.library.add([ret]) self.failUnless(ret in self.library) self.failUnlessEqual(len(self.added), 2) self.failUnlessEqual(2, len(self.library)) os.unlink(filename) with capture_output(): ret = self.library.add_filename("") self.failIf(ret) self.failUnlessEqual(len(self.added), 2) self.failUnlessEqual(2, len(self.library)) finally: config.quit() def test_contains_filename(self): filename = self.__get_file() try: assert not self.library.contains_filename(filename) assert self.library.add_filename(filename, add=False) assert not self.library.contains_filename(filename) assert self.library.add_filename(filename) assert self.library.contains_filename(filename) finally: os.unlink(filename) def test_add_filename_normalize_path(self): if not os.name == "nt": return config.init() filename = self.__get_file() # create a equivalent path different from the original one if filename.upper() == filename: other = filename.lower() else: other = filename.upper() song = self.library.add_filename(filename) other_song = self.library.add_filename(other) self.assertTrue(song is other_song) os.unlink(filename) config.quit() class TAlbumLibrary(TestCase): Fake = FakeSong Frange = staticmethod(ASrange) UnderlyingLibrary = Library def setUp(self): self.underlying = self.UnderlyingLibrary() self.added = [] self.changed = [] self.removed = [] self._sigs = [ connect_obj(self.underlying, 'added', list.extend, self.added), connect_obj(self.underlying, 'changed', list.extend, self.changed), connect_obj(self.underlying, 'removed', list.extend, self.removed), ] self.library = AlbumLibrary(self.underlying) # Populate for every test self.underlying.add(self.Frange(12)) def tearDown(self): for s in self._sigs: self.underlying.disconnect(s) self.underlying.destroy() self.library.destroy() def test_get(self): key = self.underlying.get("file_1.mp3").album_key self.failUnlessEqual(self.library.get(key).title, "Album 1") album = self.library.get(key) self.failUnlessEqual(album.key, key) self.failUnlessEqual(len(album.songs), 4) key = self.underlying.get("file_2.mp3").album_key self.failUnlessEqual(self.library.get(key).title, "Album 2") def test_getitem(self): key = self.underlying.get("file_4.mp3").album_key self.failUnlessEqual(self.library[key].key, key) def test_keys(self): self.failUnless(len(self.library.keys()), 3) def test_has_key(self): key = self.underlying.get("file_1.mp3").album_key self.failUnless(self.library.has_key(key)) def test_misc_collection(self): self.failUnless(itervalues(self.library)) self.failUnless(iteritems(self.library)) def test_items(self): self.failUnlessEqual(len(self.library.items()), 3) def test_items_2(self): albums = self.library.values() self.failUnlessEqual(len(albums), 3) songs = self.underlying._contents.values() # Make sure "all the songs' albums" == "all the albums", roughly self.failUnlessEqual({a.key for a in albums}, {s.album_key for s in songs}) def test_remove(self): key = self.underlying.get("file_1.mp3").album_key songs = self.underlying._contents # Remove all songs in Album 1 for i in range(1, 12, 3): song = songs["file_%d.mp3" % i] self.underlying.remove([song]) # Album 1 is all gone... self.failUnlessEqual(self.library.get(key), None) # ...but Album 2 is fine key = self.underlying.get("file_2.mp3").album_key album2 = self.library[key] self.failUnlessEqual(album2.key, key) self.failUnlessEqual(len(album2.songs), 4) def test_misc(self): # It shouldn't implement FileLibrary etc self.failIf(getattr(self.library, "filename", None)) class TAlbumLibrarySignals(TestCase): def setUp(self): lib = SongLibrary() received = [] def listen(name, items): received.append(name) self._sigs = [ connect_obj(lib, 'added', listen, 'added'), connect_obj(lib, 'changed', listen, 'changed'), connect_obj(lib, 'removed', listen, 'removed'), ] albums = lib.albums self._asigs = [ connect_obj(albums, 'added', listen, 'a_added'), connect_obj(albums, 'changed', listen, 'a_changed'), connect_obj(albums, 'removed', listen, 'a_removed'), ] self.lib = lib self.albums = albums self.received = received def test_add_one(self): self.lib.add([AlbumSong(1)]) self.failUnlessEqual(self.received, ["added", "a_added"]) def test_add_two_same(self): self.lib.add([AlbumSong(1, "a1")]) self.lib.add([AlbumSong(5, "a1")]) self.failUnlessEqual(self.received, ["added", "a_added", "added", "a_changed"]) def test_remove(self): songs = [AlbumSong(1, "a1"), AlbumSong(2, "a1"), AlbumSong(4, "a2")] self.lib.add(songs) self.lib.remove(songs[:2]) self.failUnlessEqual(self.received, ["added", "a_added", "removed", "a_removed"]) def test_change(self): songs = [AlbumSong(1, "a1"), AlbumSong(2, "a1"), AlbumSong(4, "a2")] self.lib.add(songs) self.lib.changed(songs) self.failUnlessEqual(self.received, ["added", "a_added", "changed", "a_changed"]) def tearDown(self): for s in self._asigs: self.albums.disconnect(s) for s in self._sigs: self.lib.disconnect(s) self.lib.destroy() class Titer_paths(TestCase): def setUp(self): # on osx the temp folder returned is a symlink self.root = os.path.realpath(mkdtemp()) def tearDown(self): shutil.rmtree(self.root) def test_empty(self): assert list(iter_paths(self.root)) == [] def test_one_file(self): fd, name = mkstemp(dir=self.root) os.close(fd) assert list(iter_paths(self.root)) == [name] def test_one_file_exclude(self): fd, name = mkstemp(dir=self.root) os.close(fd) assert list(iter_paths(self.root, exclude=[self.root])) == [] assert list(iter_paths(self.root, exclude=[os.path.dirname(self.root)])) == [] assert list(iter_paths(self.root, exclude=[name])) == [] assert list(iter_paths(self.root, exclude=[name + "a"])) == [name] @skipIf(is_windows(), "no symlink") def test_with_dir_symlink(self): child = mkdtemp(dir=self.root) link = os.path.join(self.root, "foo") os.symlink(child, link) fd, name = mkstemp(dir=link) os.close(fd) assert name not in list(iter_paths(self.root)) assert list(iter_paths(link)) == list(iter_paths(child)) assert list(iter_paths(link, exclude=[link])) == [] assert list(iter_paths(child, exclude=[child])) == [] assert list(iter_paths(link, exclude=[child])) == [] @skipIf(is_windows(), "no symlink") def test_with_file(self): fd, name = mkstemp(dir=self.root) os.close(fd) link = os.path.join(self.root, "foo") os.symlink(name, link) assert list(iter_paths(self.root)) == [name, name] assert list(iter_paths(self.root, exclude=[link])) == [name] assert list(iter_paths(self.root, exclude=[name])) == [] def test_hidden_dir(self): child = mkdtemp(dir=self.root, prefix=".") fd, name = mkstemp(dir=child) os.close(fd) assert list(iter_paths(child)) == [] assert list(iter_paths(child, skip_hidden=False)) == [name] assert list(iter_paths(self.root)) == [] assert list(iter_paths(self.root, skip_hidden=False)) == [name] def test_hidden_file(self): fd, name = mkstemp(dir=self.root, prefix=".") os.close(fd) assert list(iter_paths(self.root)) == [] ������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_ratingsmenu.py������������������������������������������������������0000644�0001750�0001750�00000004130�13112005742�022075� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from senf import fsnative from tests import TestCase from quodlibet import config from quodlibet.qltk.ratingsmenu import RatingsMenuItem from quodlibet.library import SongLibrary, SongLibrarian from quodlibet.formats import AudioFile NUM_RATINGS = 4 class TRatingsMenuItem(TestCase): def setUp(self): config.RATINGS = config.HardCodedRatingsPrefs() self.failUnlessEqual(config.RATINGS.number, NUM_RATINGS) self.library = SongLibrary() self.library.librarian = SongLibrarian() self.af = AudioFile({"~filename": fsnative(u"/foo"), "~#rating": 1.0}) self.af.sanitize() self.rmi = RatingsMenuItem([self.af], self.library) def tearDown(self): self.rmi.destroy() self.library.destroy() self.library.librarian.destroy() def test_menuitem_children(self): children = [mi for mi in self.rmi.get_submenu().get_children() if isinstance(mi, Gtk.CheckMenuItem)] self.failUnlessEqual(len(children), NUM_RATINGS + 1) highest = children[-1] self.failUnlessEqual(highest.get_active(), True) self.failUnlessEqual(children[1].get_active(), False) def test_no_rating(self): af = AudioFile({"~filename": fsnative(u"/foobar"), 'artist': 'foo'}) rmi = RatingsMenuItem([af], self.library) children = [mi for mi in rmi.get_submenu().get_children() if isinstance(mi, Gtk.CheckMenuItem)] self.failIf(any([c.get_active() for c in children])) def test_set_remove_rating(self): self.rmi.set_rating(0.5, [self.af], self.library) self.failUnless(self.af.has_rating) self.failUnlessEqual(self.af('~#rating'), 0.5) self.rmi.remove_rating([self.af], self.library) self.failIf(self.af.has_rating) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_appdata_files.py���������������������������������������������������������0000644�0001750�0001750�00000003523�13112005742�021307� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import subprocess from quodlibet.util.path import iscommand from quodlibet import util from tests import TestCase, mkstemp, skipUnless QLDATA_DIR = os.path.join(os.path.dirname(util.get_module_dir()), "data") class _TAppDataFileMixin(object): PATH = None def test_filename(self): self.assertTrue(self.PATH.endswith(".appdata.xml.in")) def test_validate(self): # strip translatable prefix from tags from xml.etree import ElementTree tree = ElementTree.parse(self.PATH) for x in tree.iter(): if x.tag.startswith("_"): x.tag = x.tag[1:] fd, name = mkstemp(suffix=".appdata.xml") os.close(fd) with open(name, "wb") as temp: header = open(self.PATH, "rb").read().splitlines()[0] temp.write(header + b"\n") temp.write(ElementTree.tostring(tree.getroot(), encoding="utf-8")) # pass to desktop-file-validate try: subprocess.check_output( ["appstream-util", "validate", "--nonet", name], stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: raise Exception(e.output) finally: os.remove(name) @skipUnless(iscommand("appstream-util"), "appstream-util not found") class TQLAppDataFile(TestCase, _TAppDataFileMixin): PATH = os.path.join(QLDATA_DIR, "quodlibet.appdata.xml.in") @skipUnless(iscommand("appstream-util"), "appstream-util not found") class TEFAppDataFile(TestCase, _TAppDataFileMixin): PATH = os.path.join(QLDATA_DIR, "exfalso.appdata.xml.in") �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_update.py����������������������������������������������������������������0000644�0001750�0001750�00000000566�13112005742�020001� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.update import UpdateDialog class TUpdateDialog(TestCase): def test_main(self): UpdateDialog(None).destroy() ������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_tags.py�������������������������������������������������������������0000644�0001750�0001750�00000002025�13112005742�020502� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.util.tags import sortkey, readable class TTags(TestCase): def test_basic(self): t = ["album", "title", "artist", "part", "musicbrainz_trackid"] t.sort(key=sortkey) expected = ["title", "artist", "album", "part", "musicbrainz_trackid"] self.failUnlessEqual(t, expected) def test_readable(self): self.assertEqual(readable("artistsort"), "artist (sort)") self.assertEqual(readable("~people:roles"), "people (roles)") self.assertEqual(readable("~peoplesort:roles"), "people (sort, roles)") self.assertEqual(readable("artist", plural=True), "artists") self.assertEqual(readable("artistsort", plural=True), "artists (sort)") self.assertEqual(readable("~"), "Invalid tag") �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_browsers__base.py��������������������������������������������������������0000644�0001750�0001750�00000016461�13112005742�021517� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2013 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk from quodlibet.browsers._base import FakeDisplayItem as FDI, \ DisplayPatternMixin, FakeDisplayItem from tests import TestCase, init_fake_app, destroy_fake_app, mkstemp from .helper import realized, dummy_path from quodlibet import browsers from quodlibet.formats import AudioFile from quodlibet import config from quodlibet.browsers import Browser from quodlibet.library import SongFileLibrary, SongLibrarian from quodlibet.compat import text_type SONGS = [ AudioFile({ "title": "one", "artist": "piman", "~filename": dummy_path(u"/dev/null"), }), AudioFile({ "title": "two", "artist": "mu", "~filename": dummy_path(u"/dev/zero"), }), AudioFile({ "title": "three", "artist": "boris", "~filename": dummy_path(u"/bin/ls"), }) ] SONGS.sort() for song in SONGS: song.sanitize() class TBrowser(TestCase): def setUp(self): self.browser = Browser() def test_can_filter(self): for key in ["foo", "title", "fake~key", "~woobar", "~#huh"]: self.failIf(self.browser.can_filter(key)) def test_defaults(self): self.failUnless(self.browser.background) self.failIf(self.browser.can_reorder) self.failIf(self.browser.headers) def test_status_bar(self): self.assertEqual(self.browser.status_text(1, "21s"), "1 song (21s)") self.assertEqual(self.browser.status_text(101, "2:03"), "101 songs (2:03)") def tearDown(self): self.browser = None class TBrowserBase(TestCase): Kind = None def setUp(self): config.init() init_fake_app() self.library = library = SongFileLibrary() library.librarian = SongLibrarian() library.add(SONGS) self.Kind.init(library) self.b = self.Kind(library) def tearDown(self): self.b.destroy() self.library.librarian = None self.library.destroy() config.quit() destroy_fake_app() class TBrowserMixin(object): def test_menu(self): # FIXME: the playlist browser accesses the song list directly if self.b.name == "Playlists": return menu = self.b.Menu([], self.library, []) self.assertTrue(isinstance(menu, Gtk.Menu)) def test_key(self): self.assertEqual(browsers.get(browsers.name(self.Kind)), self.Kind) def test_pack_unpack(self): to_pack = Gtk.Button() container = self.b.pack(to_pack) self.b.unpack(container, to_pack) def test_pack_noshow_songpane(self): to_pack = Gtk.Button() to_pack.hide() container = self.b.pack(to_pack) self.assertFalse(to_pack.get_visible()) self.b.unpack(container, to_pack) self.assertFalse(to_pack.get_visible()) def test_name(self): self.failIf("_" in self.b.name) self.failUnless("_" in self.b.accelerated_name) def test_init(self): self.Kind.init(self.library) def test_active_filter(self): with realized(self.b): if self.b.active_filter is not None: self.b.active_filter(SONGS[0]) def test_save_restore(self): self.b.restore() self.b.finalize(True) try: self.b.save() except NotImplementedError: pass def test_msic(self): with realized(self.b): self.b.activate() self.b.status_text(1000) self.b.status_text(1) song = AudioFile({"~filename": dummy_path(u"/fake")}) song.sanitize() self.b.scroll(song) def test_filters_caps(self): with realized(self.b): self.failUnless(isinstance(self.b.can_filter_tag("foo"), bool)) self.failUnless(isinstance(self.b.can_filter_text(), bool)) self.failUnless(isinstance(self.b.can_filter("foo"), bool)) def test_filter_text(self): with realized(self.b): if self.b.can_filter_tag("foo"): self.b.filter("foo", ["bar"]) if self.b.can_filter_tag("(((((##!!!!))),"): self.b.filter("(((((##!!!!))),", ["(((((##!!!!))),"]) if self.b.can_filter_text(): self.b.filter_text("foo") self.b.filter_text("(((((##!!!!))),,,==") def test_get_filter_text(self): with realized(self.b): if self.b.can_filter_text(): self.assertEqual(self.b.get_filter_text(), u"") self.assertTrue( isinstance(self.b.get_filter_text(), text_type)) self.b.filter_text(u"foo") self.assertEqual(self.b.get_filter_text(), u"foo") self.assertTrue( isinstance(self.b.get_filter_text(), text_type)) def test_filter_albums(self): with realized(self.b): if self.b.can_filter_albums(): self.b.filter_albums([]) self.b.filter_albums([object]) self.b.filter_albums(self.library.albums.values()) def test_filter_other(self): with realized(self.b): self.b.unfilter() class TFakeDisplayItem(TestCase): def test_call(self): self.assertEqual(FDI()("title"), "Title") self.assertEqual(FDI()("~title~artist"), "Title - Artist") self.assertEqual(FDI(title="foo")("title"), "foo") self.assertEqual(FDI(title="f")("~title~artist"), "f - Artist") self.assertEqual(FDI()("~#rating"), "Rating") self.assertEqual(FDI({"~#rating": 0.5})("~#rating"), 0.5) self.assertEqual(FDI()("~#rating:max"), "Rating<max>") def test_get(self): self.assertEqual(FDI().get("title"), "Title") def test_comma(self): self.assertEqual(FDI().comma("title"), "Title") self.assertEqual(FDI({"~#rating": 0.5}).comma("~#rating"), 0.5) self.assertEqual(FDI(title="a\nb").comma("title"), "a, b") class DummyDPM(DisplayPatternMixin): fd, _PATTERN_FN = mkstemp() os.close(fd) class TDisplayPatternMixin(TestCase): TEST_PATTERN = u"<~name>: <artist|<artist>|?> [b]<~length>[/b]" def setUp(self): with open(DummyDPM._PATTERN_FN, "wb") as f: f.write(self.TEST_PATTERN.encode("utf-8") + b"\n") @classmethod def tearDownClass(cls): os.unlink(DummyDPM._PATTERN_FN) def test_loading_pattern(self): dpm = DummyDPM() dpm.load_pattern() self.failUnlessEqual(dpm.display_pattern_text, self.TEST_PATTERN) def test_markup(self): dpm = DummyDPM() dpm.load_pattern() item = FakeDisplayItem({"~length": "2:34"}) self.failUnlessEqual(dpm.display_pattern % item, "Name: Artist <b>2:34</b>") browsers.init() # create a new test class for each browser for browser in browsers.browsers: cls = TBrowserBase name = "TB" + browser.__name__ new_test = type(name, (TBrowserBase, TBrowserMixin), {}) new_test.Kind = browser globals()[name] = new_test ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_prefs.py������������������������������������������������������������0000644�0001750�0001750�00000001416�13112005742�020664� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, init_fake_app, destroy_fake_app from quodlibet.qltk.prefs import PreferencesWindow from quodlibet.qltk.songlist import set_columns from quodlibet import config class TPreferencesWindow(TestCase): def setUp(self): config.init() init_fake_app() # Avoid warnings when running with empty config set_columns(["artist", "title"]) self.win = PreferencesWindow(None) def test_ctr(self): pass def tearDown(self): destroy_fake_app() self.win.destroy() config.quit() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_wavpack.py�������������������������������������������������������0000644�0001750�0001750�00000001620�13112005742�021676� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, get_data_path from quodlibet.formats.wavpack import WavpackFile class TWavpackFile(TestCase): def setUp(self): self.song = WavpackFile(get_data_path('silence-44-s.wv')) def test_length(self): self.assertAlmostEqual(self.song("~#length"), 3.68471, 3) def test_channels(self): assert self.song("~#channels") == 2 def test_bitrate(self): self.failUnlessEqual(self.song("~#bitrate"), 76) def test_format_codec(self): self.assertEqual(self.song("~format"), "WavPack") self.assertEqual(self.song("~codec"), "WavPack") self.assertEqual(self.song("~encoding"), "") ����������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�016006� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/empty.aac����������������������������������������������������������������0000644�0001750�0001750�00000005021�13112005742�017612� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������P?��libfaac 1.28��B� 2�GP!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#P!�I�#���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/empty.ogg����������������������������������������������������������������0000644�0001750�0001750�00000016660�13112005465�017657� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������>1n����@vorbis����D������ɯ������OggS����������>1n���'-Cvorbis���Xiph.Org libVorbis I 20030909����vorbis"BCV��� R!%BJc)RR)%cJhs9'A1.bkiRV!%S [hRT)cRJhs9FsB'c.b[Ic1&SJ(c1cPJ%tBG%t9c1"[ŞJ魅[JR*Td!|F[Jc1cdˁАU����@BCV� ��0EQАU�@��Eqq$G,BCV�@����(#9dIi'뺮n۶m۶ � ��4TD!����db@h*�� ��@$'IRa,&IRʣ<IƠRJ)RJ)RJa,GIRJb,FIRʣ<IƞRJ)RJ)Rʂ<iIנRJr4hɦRJDRJ)RJ)R|J)R՞\I)ROJ)RJ)RJ)RF ����F9D33MAR4{%Int9ݜr'��� B )B )B 1ĐCN9TPI%UTQeeYfeYfeYguYH!ZhXc椭9J餔RJ)t9!����! 2(B 1SNA%T@h*���@���(鈎舎舎xx(g院i*˶lۺ۾۶nqqqqqC ����B!B )S9J ������(8H$Yeiiy'zz(h{gzz隮꺮몮*k۶m۶m۶m۶m۶-!�� ��ɑIqɑ$ 4d� � ��EQq$ǒ,IDɴTdOtQu 4d��� ������C4DCtDKDQEQEQEQEQEQEQEQEQEQEQEQEQEQ<<<BCV���:#9b)")c9@h*�@�@��"9eYyy'(j@h*���@������XHx舒((((((((((((((���(GJA{xZ;bsgI˵tB(-טyǘsB bwJ9H5B��0H i i�������Hhh�������(������������������������������������������������������������������� y""�������h �������()������������������������������������������������������������������� i""�������h x �������(ij����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������p�� Y� ������������������������������������������������������������������������������ ��`� 2PhȊ� N�8��$i��8i��`i(�i���������������������������������������������������������������� ��`� 2PhJ� �,e4 i�x@����4%(4d%��`P˲,σi(B4Mi'43Ex&<L( DQU��8��ؠ)8@!+��Xy牢i*4DQM4Uy(i M<QETUׅy(iDQ4MTUuy(EQ4MTUue i꺮 DQ4MSU]W(i20ETUueY2@UUueY+ PUu]Ym�뺲,����*ф @!+(��S0&!$B&J RR(TJ !Rj)eJ) B)T��؁�؁PhJ� � D)cLBc9!T1眓P2sI)c9礔9sRJǜs9)s9眔RJsNJ)%A'9��T��`#A�R� cYig$iy(fYy'<OD4Uy(i*=Q4MSuU,zh0MQ4MUu]虦.d4Uu]n躲 \UU]W몪ڲ���VG8) ,4d%��@cR !BJ)R ��p��0 "���TRJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)QJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJRJ)RJ)RJRJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)�F8�>P Y ���(bb9)-X!sR-g1)XcΘsJI\J礴s9QJ)sΥbK))Xk9Zs9j9sls9[5�0� lXh,А�@H��aR1s:(d1 B1會B1B!R2sB!TJ眃B!PJsB!JIB!B)A!JIB!B B!PB%RR!B!RJJ%B!RJJRJ(!PJ*)PB!PJ*)RJ!B)TR !B(��� :ɨM�� �@xAI1"!娵b1c<$sRkhH1jS!ŤՎɔrTC)2dILXB#M����L�Q1��A U DD�hut1 t.  � p7x< @GQR����`��� \FGH������@"DDD3Waq�� �����@@@����� ���@@OggS�z�����>1n���OQ*-+++*,***+++,+++-+++*,***+++,+++-+++*,***+++,+++-+++*,***+++,+++-+++*,***+++,+'ؽۉ �20�=ܰ=����DD�����������˂�~lXӞ? n����@H���������e 2@B%=XӞ? ���� D���������THX0H,�=XӞ? n����@D���������@BE =ܰ=����DD���������@ e=ܰ=����@���������B2�=XӞ? n����@$$��������� E, ap%$�=ܰ=����H���������D `@P�=XӞ? ���� "��������� `b=ܰ=����@DD���������@"R@ =X^? 6���� I$���������H"0�=ܰ=����HD$���������B@ʠ=ܰ=����D"���������ʀ"�=ܰ=����$��������� AA�=ܰ=����D���������pU=XӞ? n����@D" ���������`@d@=ܰ~l����@""���������AeAPp~lXӞ? n����@H���������e 2@B%=XӞ? ���� D���������THX0H,�=XӞ? n����@D���������@BE =ܰ=����DD���������@ e=ܰ=����@���������B2�=XӞ? n����@$$��������� E, ap%$�=ܰ=����H���������D `@P�=XӞ? ���� "��������� `b=ܰ=����@DD���������@"R@ =X^? 6���� I$���������H"0�=ܰ=����HD$���������B@ʠ=ܰ=����D"���������ʀ"�=ܰ=����$��������� AA�=ܰ=����D���������pU=XӞ? n����@D" ���������`@d@=ܰ~l����@""���������AeAPp~lXӞ? n����@H���������e 2@B%=XӞ? ���� D���������THX0H,�=XӞ? n����@D���������@BE =ܰ=����DD���������@ e=ܰ=����@���������B2�=XӞ? n����@$$��������� E, ap%$�=ܰ=����H���������D `@P�=XӞ? ���� "��������� `b=ܰ=����@DD���������@"R@ =X^? 6���� I$���������H"0�=ܰ=����HD$���������B@ʠ=ܰ=����D"���������ʀ"�=ܰ=����$��������� AA�=ܰ=����D���������pU=XӞ? n����@D" ���������`@d@=ܰ~l����@""���������AeAPp~lXӞ? n����@H���������e 2@B%=XӞ? ���� D���������THX0H,�=XӞ? n����@D���������@BE =ܰ=����DD���������@ e=ܰ=����@���������B2�=XӞ? n����@$$��������� E, ap%$�=ܰ=����H���������D `@P�=XӞ? ���� "��������� `b=ܰ=����@DD���������@"R@ =X^? 6���� I$���������H"0�=ܰ=����HD$���������B@ʠ=ܰ=����D"���������ʀ"�=ܰ=����$��������� AA�=ܰ=����D���������pU=XӞ? n����@D" ���������`@d@=ܰ~l����@""���������AeAPp~lXӞ? n����@H���������e 2@B%=XӞ? ���� D���������THX0H,�=XӞ? n����@D���������@BE =ܰ=����DD���������@ e=ܰ=����@���������B2�=XӞ? n����@$$��������� E, ap%$�=ܰ=����H���������D `@P�=XӞ? ���� "��������� `b=ܰ=����@DD���������@"R@ =X^? 6���� I$���������H"0�=ܰ=����HD$���������B@ʠ=ܰ=����D"���������ʀ"�=ܰ=����$��������� AA�=ܰ=����D���������pU[ܰ[���������������@���������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/coverart.wv��������������������������������������������������������������0000644�0001750�0001750�00000110071�13112005742�020213� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������wvpk����z�����"V��1# !RIFF$ �WAVEfmt �����D�����data� �BWWGHC����������������������������e���� �2<g~J4���>ԡO�v_ Ih�t G3z|8Cp‡z1: Yp1ѳ00X8�E�f�?<�n�~PgC=�xG0� ��)\O8���NX3GY9S3SO8q`�'PAzh��3 }8Ss��< �f@ǀ�e ��D �>l���0z`88s�z!x i�O'�>�h�#8 ~o@�pwc ��0z-`�3 @O>O q@~VO=>'z4c�<>A |y�O#CH�G=9ҩ=#=HO~d�?7=`�!|�f�`�8tq�H @?:= `�N}�=�FcG�8`�HOp c=�x�< :t �p�c�e�zQx!:� �@z�F x�hF �ta�CO0�z1|6G=�c ���=Y~D0�C= >!:u0�/v�|ѣpG0:�0�a�84F8�<Dl0�|s�9��|0Sf@Ox�}.LTѳ~JϢs�?2�>ѩ|40�8�:!=��� �h � c@�C~PzF?3k9E?2GF342k90�3=jpOЃ~V< �4z1#�8!842C?S�s�<�N=� = I?*:0x�� ��':�  <kc�1�`�1���0� g8ҩ<�>9�>}C��|~c�FFxo 1�@|4t�~n�:`�|�q�:�>ԩcOl�?O�2�zփ��D?1SO�(�:(|2O5�0q�ԩ=z/#=h���~C3zc�? |s�?6ѧ@S 2~B�f�?z��� ��� s=s=!<�c��>�< 1��d�3G!�@3th38>f�$x�=1�!<|C�GtGz�Ip�@�>gz�38ty� Mx'z2�sOc��f �E40�< s>d�4zpi��1��c@�|�tq �<�0�38pd�d�< G0C0�£e�88C0gf��f�G2���?00�C=f �c���t I�>ѡ'> y�O03�~N3�H88C> Yc`��q�?4s�h�x�`�1}0O{@OCh@?g= @8S>�>'n� �>13DI/h�ǐ}:S �>=~d f_ �>7j`�f�3���.}1��Fc�O� T<�=>}:G}>�'x=!&g��~` �y � a@3�� �9j�|s��>A>`u =q�4x�?9�4�"z�<Ff`��CD `я=GS;K?00h`��}φp 3= `0��>O}C #�>42Ou�H?1����>ӏaz/ |2C�OH4z u�/1}8'T`�x8p/ "=8@�i��52�x9'�~B�>'C:0T??��~@4:>tC}>0>1Op Ⴡ�x�8�D3�h�D  ~ahCd�Cg}�r�d�@��f�Oz҃Fl`�40��F�pG#C}2��Y<c},h@2k�;0�_ it m�3f� `p@�}s�Ct�#�v�3O0:@O8�> Գ~Bx�8D |F>Wc�?�~`�0�|OpzӁ�1��?4�C�>1c@�N=< �|:1��3gz1h�:4O q@e�:��у\x@z³|c ��>h@4x}G p`�i�?`�O0:��>C}6pht3x�z ɀN�| 2CtYhG8L}EFODQ= �г5:� |2�LOtG0GxГF< 0Nѳ~H 8>h�h?Da�}:s�?<C31'}c� `}~l�@CO}pj48u qF0 d�?A4x� YpA8CxOt1���fG=a�z'4>i@t�c��f�O:<t�F4:0gl�x�>5�x`@q� i�/xA 3tԡѣ<гc�g}O �� �h��~b@��>ԡc`��d@Y y�c��q� ��F= y�?2c�:uSgAn�zgx9S��800��h`�8DL1C4z< �t�8l�?'�^:!1} =�}2'֡s� `` �ѩ��~@~j`�'z9z �@4�`�30��G}'x9`�8N=�`�88F�p pѳN}4e�O5PT�~n� �>G:�FgF `�x|2s@�>z�=00��>G2Gx`0|3CC:<c�f�?t Y#8c` ��3<s}8��|69s�O:(2'�~L�z:N= 3:~Tq�O2�< q�O8�v�3?Be�x�>i�#:~p` ��� i��4C >�>ֈԣ�Iˀ>1�� 'l�2CCx9StY I�D =' �N0�/ }�Cx5CAc��f �8`@0s�|�c �B�|310��xЃN��=t #= `z Q >gc�� '< @xGS"z�##4D3Qz'd�?3��f��>9�:0�`�#��ѣ!�80xԃNу |.>~b�'�|�!wvpkp����z�"V��"V��1+&ȋBWWGHC��������������������������� � <`,HcH�pC2їH?¡G�>�~`�C�g1��g}8t ��~f�?0�KA}23�1��� �xQ�40 p p @H?թc�=I 2`0z3= A 9�zA�~j� F�~f`��=ԩ`�I?15HP4<c=h:t }2�QG>Ќ�a�83xСG=k�4O <A0Wxx A24x��t�10�1�~l�x�h4TC=j,|��`p49��YPx}(te�L?CPO| �=/�|<=�@L>~D4xCL38o�> c=��~F=�xԏNF3|O`�|9�ـ|O i�3f�t@#84s�2gx~l�Ozԓ~npj�>Ca�'4x�ѩDd � A}0C<�Cz `0�@d�~d�Ha�p�2c�I >gs�?2 `p!) }G'z z9l��z`4?@>8O>c�?W:S:p }<�|3/D?$0��XOz>10�`��>x18|:C?h0l��N='cp�EO@`���>C� y���:~P`pux}g= `000�`��4�`�O�f|2O0zCa}0�pO��>4|$@?3�gz~j�dA?02C �4n_|00�1t xң|2O0c���p �S�|29Уp '1}69�c��~f�0Tj```��tA2/�c�@ = ��|60���=YX344��O}�~PF�Czi�O8p �0@ @�|`F4zgx=q�S30xֳpG`�8z<y`�:8p��c� 6ouj�<�<a``��>�0zM y��< �Ft��f�c��N= IY�< A?Otq �z8�>< ԓ �<':DO8#�h�2�1��O= A�~P"8p}61�>Hc���1O@?Oj1���d�zf�_I�!c��f@?s�0g4 zֳ A4`�?3x胁��4�>O�8u gX?5�< sh(8e��>�t|C�F >x}2|4�<�:0l�Ɂ�c��O>�e�/c `��u A:|<�zOz��4g2�<�!�f`4�^D?p 'Ɛ��>G`�\\�x�}4GCCOg}!zC�pI裁�Ozҡ=POH��|4 a�10d��v�60p�xO�0� .= 9 a�1��?9! q�|<�|2?j�uS}0s�'=|x҃>�)"L0!}s�#p |*x!8p `g= >g|��}0G9Oq�:6[?1YFc���@�Fpc}8�`t�>�|>0�0|4S> Q4zg:t �|$z��>z>0~B�C�|91|:g�C?s�?'w@?D>h1��^�N=u�za�~j�?4��<A>�=<a�;9!��p> g5|�?S}zЩ�FO| = l�`�xgp�i3z#>1'=Q8uti@H:h�A>| A}8cf�h<�=gp�x�>d@>Џ'�F}0SA3CO2����>ҩ/p<XϢ{ �>~b�O``@0�2�3=CCx�p΁1 �y`�g<чC�#2�}h00�zS= p i� QOc��i���Cz}> �Pp�'}CNC<`��s�j!=}s�30� @�N= g��p��>ѩC�>= f�'u1�� }�@>Ӄ>աCҳ |1oDOti� �8�Ρ@=k~H1��;`�>�0h�<СԳό�Ztcя Q?8  `:t �Lg`�O gd�t �<3}Ct� Џ90�g<i�SG=A?;c�#8e@d��f�xҏ��|2j4d`�1�'!|4�Cg`�=�~u ��i �90� @?-Y}<ti�p�t�-}>Dc`��4i�_C=kD;'�[C0` �'h�?+d� 32�F�>z�z��u“>Oc��f� c��f`��O ||:?Jk~b�N=�~`� S̀f``�� h�x:uACb�^ H1��;ߐp~b� `�>'T?!p� i�1OA�1��c���gC\\x80G�4�~@?;G}?k�=q �� Qd `4)�N}�=�@�F:p 0c��fd�1�:#�~m�z0�1��zGt�x�@ �p�f���pc� �\O>�|z9�`` �s�s�y`�x�G==G8�= h�~`��8�>l�= � �g�<< =Y?1g1�� �P#`�|��0�3x1OtI?4x }4 >�<~j�#O5x�0�`�x >�@�>�~L <AB>Y��~x�0/�G}"|6p <�>чx�1C!8d��F8e���� �||g}1K3:02c �!|:�C�><`@ϢDQ�8�ue� Y3�l�0�z�zЌ1���p�c�90zСOX]Hz�>O� @~v�Oѩ�C3s�>ч8 <kDOQ= `wvpk<����z�D��"V��1~LBWWGHC�������������R��������������D gz `"�|HNG|80hd�~b���|_d�>�h�^c4p�O �0g=p_Dz8p�q};�<jd�8<s�O|Ot`~~3�ht#}2'= |�`}c@�4�:p<f�3��>1>9E?A �N=5<AFDO�h�� ��i� <i`�1<ԏG0d �гG0xXрe�v` ��f�!�> 15:5�P��G��f�`t p|:өg�p >'X!}>ѯ `@�~N� `�P :է�Nc��~h�S0�|6c�ǀz֩x�4t�Oc��f�3$c�3�uI/h�?7>�u2�48g=' Z��|рh$@�>�~L G�F`t < |6҇l� g:0�:E809G=T?08e�Q:p'0@N0z�cg=kt@@_e�Fԏa�3'>x `0!g> q@}  Q>�>'t��~x�f�?c�OH�>AL)�!<>я D4:3L h q� `:�==A>Oi�>=ԃq�:[ 9c��> z�Oi� !|0�>Ӏ����t y�hta�3�FO8�N}ko�>�^:у>�=g@ԩCGxg=Y�FP?> < � ��Ā �?3�|C?0:��Ȁ�N�� ��7�0@z�~d�?<?@�48tԧ2C�^0s�|1<q``�� �pD?c�h0Gx��p�~TO:5u�?CcD3')zd� YO'pA?C�> < QS3�2���Os30`�!<i�38�f `��ѡ4HO:00:@3s� I �pzԏ< �pq�3G= 'gh��Ij�@�|0:u!�20�F>:Gd� @|<�z a`�G|d@:0� `Dof�ty��!�~NFpI��f�OxPO8p�l�3s@�tQd�O>�uczg:u '' I S>�d�x�p�f��0 | �Ft#�00 ��>�<i�3g= Y>9}|ѩG=Г>}>c��>O�d�8s�Գ>< >'zO!@:`�_�8G=j2��c�'=q�`�>'D �8��f�Q#c`��2�zGz0>O#}��1OxЏD4�GGh>g:54�O�~f��|0s�ta � �F�|10�Y?GC�p`g\0}":E?1'�Og0�':�C8�>�f�2>|8ty�>!}9!zO 3= �>ԏ }6�0zև@�~``� g�ԩ'�> | � �|O A3�i� �sQ:�>ѳ>)<��f��>ӳ��~ǸI Az!�d� �htg! @Xz�N��<\3e�OC>փv�C�}'c�~D ��0s�?3zԳFi�O� x9|>�(L3`�O0�< 8'= FO5:<0 УFϢ'`` ��f��~LOc�� 0>ч2O�^z14��b� >9xг>y�t1t<GD3:4`�v�_ Ȁ>փ>ψ ~@ g�Gh4Cd�\= Y '!�0@i<O42SO8,C|6<G=Yzpq�F:~B3 H~@� �>184z�>p �8�f`�4OpG,8��<}&:#x�v�!�N>zԈ|'�>�}GxС@�FOCt <A} tOz>AO:|S?s��h 7B#Pi�O2�c`��<S>� |8x�x8#f�p ԣ~B?60P4d�O Q 1��` �S�f��~Z}<>'z�F�IO40�`'d�h�:tq�?Lq�N�>IHGXO230�|<`�x9Ol�#80��A3&>�@�N1'='Ti�3�q� �;}0�:u 'x�=y���~Ry�xg0�g`�|�3Of��@+BOz �I:�>�>�``�g� Ѓ5CC�4zuh<0�i�?�4c�� �3� z1pjD'}6|у`�:5|�3g=q��~d@�h�C?|�|Sh���< �8�~k�oVf�az1�����p ��< `Op `9��e@i �#D��|>|;s� SN>�N=|C4s�?2k �,0�>�4� 2c�>gxx }1<�Ya t�c!Fc��0�I'}o�1��O2�`#:�~J}!A3�g=�D3| P?3G>�p A30��s�Q�N}Sl �>F2CQp s=I�>':t `d`�<C}0<'xGO c�C�1��T< ^2� �[�4X?0S?:g�Сǁ�z �Oh�}6  `�f�O EC`�ǀ~b � C}$<y�>1�' Gx|$:0�:$zz¡1�>�'zЃN}<�<y`�Gc�ppOp`k`�8' �pi� ��<�x H�8G)�'`�P>80z҃>~1'=1џ"tq�g:�?by��~n�2gwvpkN����z�f�"V��1H\7BWWGHC�������������������������� ��=Y`�>1C Qt`SzN O 5z0�G}4�c��X�24s� `��= y� ԟ5x8584c��}2d�?| i�?Ї85:``���~�_ht q�Y�0�ЏOI�O#9`�<y` ��~z�6S8G2$z�} 1��zС02C|�zty|7���ܢ0Y�>Oi�4TĀtg4ѓ~{�|�HOC8>��>G$H?2t IOz�N!z�>ң> zЩ4t�Gsx�F©'!<`@`�C�0�>С|:�F 'z Г `D?6{9s�t`�Ot��>ֳ�>C� ��:`@LOPpЩ�<s` `��x�4|=` Fi4� @8Txgx��z1��`�гEGd`��>�20�IСS~z�c��2op=y~Dl�C! �SO<i<c`�>1Ot9φ@:8 Ih �8Ei4Ou=,:#`�_ zG�}>sh�}CϚ|҃~l �����=q�:t<i3c �X#xa4@#�>ӣf��=g>��>A`�?20�q�L2C#8c:u �8q�x�Qz�NЃ>0��s�3ǁ� }��>�p� }c �>F::_��z�p �O�~Vi�!z>#�~K:��< oWPN7pjh8�>�>ϊ>GL s�9` �C?00�C:!�)g=��@85t�q��}S2'T3���Nz>҃f �7d@?::c}:>O�>!x't `zЩ10�` ����>׃>׃>�N= Q?0�=A�|0Q�AOz�@0xq�4~Jf�?3S<i@O21ѣ�³>g:t ~D|_d�� �t |�?3C�>ko�<G}!)0�:41�`��XD3��>S}O@<i�q�p��p9gz�`@���<Q<A=A�?9c��~@�|0O�>�~D88�!<Y0c�8d�@Ozip `0}$c ���>�`�i�0�� �L�t zҏ�`�d�?C 48s�j�;S�<� ��CC8810t�Oz4z@�4c�?5= �|2pQ�~l� `�p�?3O�2p Ч8u�}0ѣGb&�N90�|3�<k00i�i�Y_ ' �ph4:0d8Oe�гѧxc��}2gx0kz >ƀ�< ��4c ���`�;'':pt�V�ң@0�A Сhtj�< 9O�<�f��>ѓ~T:c���x'l�>�f� �xO >G:t�>ҏ Á!@#Tc ���3>'�'8>�4Dg�^ч}Oe�<y�?0s�� ҃>9s�  Q3 1xҏ'tS}2s�3OC1�� DS<a@�>p�3#t�>�01SA41��?�|8O�|( 8`�8tA A:4z'z �@;/@d`�O`'=Ok0�IO< ht y�~t�?2'c� E?:>Ǣ(CŐF�0Pa�f�}ѩ Ї:8O8`0t�c�4C �NN='0c@�>= at<~e�;�:sz `�d��>Щg>�p�C0z!8tԳN>�x�0|'|s�Oz@�^s�=5!<I?1_:�0�3}0D3'p�� �N}�cl�?0t�c�a� >gh�F>1)z�<A O �>)8D�uFz9s�?10\tj4O5��=Yc �z�/4D~t�|4=i�~`�3 =�~h@p�3f� f�C>ѧ8841xG:�FzgzOp y�~l�?$D?0ѡgl�F3?o�X�phd�1OpQq�~J�uy�D88d@|>� ``x'~ROh� 0O<�`cH `DC}0zp]3�|;2�A?3�HN=>�=I:0zև�~`�a`�O�p 'd�Џ C>1�@4��u�8����� `0�zӀ#:S>z'}68 <A�pf�C?0O8 )8D<�O<C?zҩ u'�>OГ '`�z=[a:�f�ƀ�< i��|GC�'�t QO< >0c��p}Gz9|01�h�OLMm�s�ԣ~L a�s�<j q��~l�>=GP?@OT0Ou0�20�|4Щs� x|`4zh�F1>'8d�z }�~l�> c}$z9�f�#z78D?C8pas@�52CO:��0x�>ׇz1c �g!:s�"x �0�|G}C�>өc�??aO`@G4 �4s� `0#�^0~n�Ј02C�!h���py�O<a:�#=cN=Y |���}2 88!8E�D aH�>ѓ~b  9���<<Q3|00��k��<Ix�C8�>'``�1� 7P�== Ѓ~@��>�F?0��~z�#}6��|20 �'~D?%1��?2?BO>ө�~B30�<`pSc��~`�0@=s�3G==�>2)<'@>>9©�0x|O |s�8 У~b�a�?0~d�G �ѳ>:�f�?3�N> �wvpkx����z�X�"V��1uBWWGHC�������������������������� �f�c�f��<C~Rd�@@OC8`@8 }ӏ1OφN I��0=�u hszhtOgd�z�N�N= � `�?5uh@s�?30� a�zЃp �0�A|G}(x�u:pc>O#@h��0<У5t�Oxo '�_<<hGg|<��}:��i�?6<a�4}ѡ5z�>c��08cz �`�G} w>|:2W}׃!||>�`���>� �S|C I?"<Сg}xb� G~Fd�d�?G��<GDF�>'0��a�l@�>4H3|:z9g < q@?6'=Iz�F?7S85x� С0<m�G2�a>�s`�g=0�t |2S?2G}O0G}8g1OpI39À^8E� p>֣Ft =i�s=}6e �=�0zc AzѧCx�F~@thFz1+)>Gc�чTOx��|'= Ij�0�� �<x�>O G4}6c�|8ч| 0��~b�d�!�@<�c��NL?08:u `>ѳ0z�0� �Oz�}0�3�> '= GxСSa>gx�8u� �Op� G�>z|3= A?5�|2Og��L}7/�>�p:p�<Q�>DO1��`��}8�Щc��> �Q�F8�PxӀ> 1��?3�|O5000��:_z҃~h`�O1}O���>�`�t G}�>� �?C�O!= �48`�}` ��|0S#=< 8�Щ<Y8#t@0�a= �<0�SzG8��y`�1[x:5x�CxЃ����000�� �= `<c��pGpi�G}:c�3�1��,POc�':8�d��Ftj��pI~w��t \��|4g`� v�?8>~f� 1��LCl�t'5D��O2=s}3u�x 1��3я 9Sz3� =Y |0 ч<j�c��'��@:p3}gc� `4zD2c�q�O:�>ѡc�# q@< I>�>��u�~b��x}6G�u1��Ta�210��:�^�>�=@= �x� `�xGx�e� �30xe�/8cH��f�# A0��N}�|O��<e�> #ѡС'ѳ>=!�8O�'=Àt|'}pGG y��>0SЇC}2s�;_}8<'d `�SOnph0� `@D8�>O����>5�:>9ѓ�><A }C>9p�CP8sT�><80zֳ�F3}>c�> 8Gzj?`1��h���#8>�0:e�i��>��z�>?Wk(=3:pjpi��>= �d�s=�~TX �~F?pjt��� �>`�9ғGs@ �4x���Fl�pA:d�= I0�D?5c��C `d��0 n��FoE `|>�h>=i�'�DOp }6G0�<|84=I~d:C:4|GA}4?@Si�>я >1S3O4Cx 38� �<a�|2CGt�>O'~l�s�� ���|g=�A?1|00 Q�N�t СSO<y�8D��<0�h3XzÁ!��>h4= q@841��4c��ѡg=>Џ��|8d`�“>֡C!��0�e�9O5z�F>9C� �xy��g}8c�ԡs� @3uq@:�p> i�EA!zOYtG�7':4�|�� @5X?�@0Y�4{ �tYxg@�|-:GhFp 0:�|G� z3}03}2уF:�~d`��>!:d�Fpt�p3�4�У12}2?`�3�<GE�f��>�^5|20��D>!|0gt u�:� �4��>�C:4g}8�:G�>t10��x45ߝo q�-!|0�}4}2N Y� �s�=@�|=C~``�:u I 'C1��3S@z1��30�'pj�>�>5Q?1�@e�?0Of@300��4�<c:!|1[}�oȀ~F8t D?1u0t�}|8C4O 'Sc`��1��!|}}<z~` �z�`�?>ҟ5Ѓ8� `(2�h0�~f�>Gx d�c�G8S1��3g}2t�NHo�6w=��gL�~f�N=|:C�Cy�DCS`�8ui�3c ��8f�|ѧ@ FOx�>�= �00�9s 9<0�<�xԣxԃ#z�у4�~F?0s�� `� |6pq��CxԳ a��p�  `3H���|0��>ӌ` ��S�<':<��F>i@q���v?5ѧ<y ��0�<pA q�c� a�?� !pi �h��~j�?<�zЇd� ֣>�>g8��~f�<e� ҡOp2�`�Gя L2s`�Gf�_ �x ``��>�>ֳO1�ht `>!q��0ggO��d�Ϻ2?`��}6�x�=�= h��8�~w�_ O1OtG='G=F'`�@DC?;' �xС9sx�5|'ujp�0� ��O|�F? �0')}t|CF�'�1��g!|?LO|1Op}<0�i@FE?0?FwvpkJ����z��"V��1yBWWGHC�������������������������� �}Oe�<y�?0s�� ҃>9s�  Q3 1xҏ'tS}2s�3OC1�� DS<a@�>p�3#t�>�01SA41��?�|8O�|( 8`�8tA A:4z'z �@;/@d`�O`'=Ok0�IO< ht y�~t�?2'c� E?:>Ǣ(CŐF�0Pa�f�}ѩ Ї:8O8`0t�c�4C �NN='0c@�>= at<~e�;�:sz `�d��>Щg>�p�C0z!8tԳN>�x�0|'|s�Oz@�^s�=5!<I?1_:�0�3}0D3'p�� �N}�cl�?0t�c�a� >gh�F>1)z�<A O �>)8D�uFz9s�?10\tj4O5��=Yc �z�/4D~t�|4=i�~`�3 =�~h@p�3f� f�C>ѧ8841xG:�FzgzOp y�~l�?$D?0ѡgl�F3?o�X�phd�1OpQq�~J�uy�D88d@|>� ``x'~ROh� 0O<�`cH `DC}0zp]3�|;2�A?3�HN=>�=I:0zև�~`�a`�O�p 'd�Џ C>1�@4��u�8����� `0�zӀ#:S>z'}68 <A�pf�C?0O8 )8D<�O<C?zҩ u'�>OГ '`�z=[a:�f�ƀ�< i��|GC�'�t QO< >0c��p}Gz9|01�h�OLMm�s�ԣ~L a�s�<j q��~l�>=GP?@OT0Ou0�20�|4Щs� x|`4zh�F1>'8d�z }�~l�> c}$z9�f�#z78D?C8pas@�52CO:��0x�>ׇz1c �g!:s�"x �0�|G}C�>өc�??aO`@G4 �4s� `0#�^0~n�Ј02C�!h���py�O<a:�#=cN=Y |���}2 88!8E�D aH�>ѓ~b  9���<<Q3|00��k��<Ix�C8�>'``�1� 7P�== Ѓ~@��>�F?0��~z�#}6��|20 �'~D?%1��?2?BO>ө�~B30�<`pSc��~`�0@=s�3G==�>2)<'@>>9©�0x|O |s�8 У~b�a�?0~d�G �ѳ>:�f�?3�N> �f�c�f��<C~Rd�@@OC8`@8 }ӏ1OφN I��0=�u hszhtOgd�z�N�N= � `�?5uh@s�?30� a�zЃp �0�A|G}(x�u:pc>O#@h��0<У5t�Oxo '�_<<hGg|<��}:��i�?6<a�4}ѡ5z�>c��08cz �`�G} w>|:2W}׃!||>�`���>� �S|C I?"<Сg}xb� G~Fd�d�?G��<GDF�>'0��a�l@�>4H3|:z9g < q@?6'=Iz�F?7S85x� С0<m�G2�a>�s`�g=0�t |2S?2G}O0G}8g1OpI39À^8E� p>֣Ft =i�s=}6e �=�0zc AzѧCx�F~@thFz1+)>Gc�чTOx��|'= Ij�0�� �<x�>O G4}6c�|8ч| 0��~b�d�!�@<�c��NL?08:u `>ѳ0z�0� �Oz�}0�3�> '= GxСSa>gx�8u� �Op� G�>z|3= A?5�|2Og��L}7/�>�p:p�<Q�>DO1��`��}8�Щc��> �Q�F8�PxӀ> 1��?3�|O5000��:_z҃~h`�O1}O���>�`�t G}�>� �?C�O!= �48`�}` ��|0S#=< 8�Щ<Y8#t@0�a= �<0�SzG8��y`�1[x:5x�CxЃ����000�� �= `<c��pGpi�G}:c�3�1��,POc�':8�d��Ftj��pI~w��t \��|4g`� v�?8>~f� 1��LCl�t'5D��O2=s}3u�x 1��3я 9Sz3� =Y |0 ч<j�c��'��@:p3}gc� `4zD2c�q�O:�>ѡc�# q@< I>�>��u�~b��x}6G�u1��Ta�210��:�^�>�=@= �x� `�xGx�e� �30xe�/8cH��f�# A0��N}�|O��<e�> #ѡС'ѳ>=!�8O�'=Àt|'}pGG y��>0SЇC}2s�;_}8<'d `�SOnph0� `@D8�>O����>5�:>9ѓ�><A }C>9p�CP8sT�><80zֳ�F3}>c�> 8Gzj?`1��h���#8>�0:e�i��>��z�>?Wk(=3:pjpi��>wvpk ����z��:��1BWWGHC������ ��������������������-�D>\2�>G4O00�yh��}?/4:8O,c��pGt$n��'g0��<0��?=�xУ�~`@Ox= >O �G=G}>= `{:<C�c���nf�'4�}~b@:zI=o�>@�!@ Q� �l�#�~Fx}G:'=y�N= y�Q�~P =G}:O#<y�p 0G�}0�s�xG`� �>a�p=hpI0=9�G:�n}0'}:c�YtxO i� xԡc�S��0 |'}(8t�~p�z�900��< ��>փ0p`�~D@4�f�Cx}�< <i ��= c��0�`tYϢ#20�a��uЩs?=1� �x8tS<C?}6ѡt`�4z10�Y':ugC cx|4�4z�sgzЧ:tSz|0/hN= ࣁ�>94�>Сg�>A?6�`� `�xGc��f� 8:z�41�_},<0|\L΁�Q3s�L i�d�L `『|0�8|u1:�L8< �pq�G=gp `d� A  ~`�OQ9�O>Wf� �8��>1`l� Yx��=�8e�?4N= Y��` ��7 +}gw'85D4z�~K�f��D gE |Ssx9�@0�_С�NCxg ~z � гd � � }:O8OGit�xO >ЩG | � �XN=q_ �~AA3�`2�O C>D'd�< `:0 =�0�` `���lAAy��ƀ �>gg a�'=� < �8�F?C3�4'�Q��f � Y 3:@?S�>�~p ]O2s��:�>�Sh�57�v�oz>�NCx �0c��},a�k>'�48CO8����8up3= �0s�c��G�@� 1s�? p��>'x� a�?z,x12|'=480̀>1���q �|04c�����|c�O:=Gf�0�|2џsGz9|5O `Df�z�� �!xGx�x|:'=@zG=a �1��v��>wOd�?6�|0}8'p�Oz@8t:d� �>Q#1b� ��W�5�4O4/p�~F�Fp�84}2O`Hx2�Yـ<1��> 5w=k@ �c@�@c��~`@1�`��|0Wt 8�F:v�k�Q��I4:5�thp'p��d�3g~|�I?g\1� @��<}6c�i�3h�< ~J#:e�G|c@1�` ��~tӓ~a�_ D �xGѳ~`�x >ѧ2��<9s�~iA 9�VO�<G:>9!�ѩ�0s�|8 `}:c �x� �Gp��>'`��>^ CxGC0�: Cx `== `�| 20�'0xғt 5zg𤧁@�p4:<S?:1�@@Ϣ AcGz!\؁�bHk�o|0l�3Sǀ> wCxҧx|:1�z�~`�~Nzx1 l� c0:�D2�9= `0C}2s� Գ~V �8u�N= �:pYF a`� <��>ӓ�>Gx9' �~bp�/x9p�t �/ kc��>G}8?j�s�>x�O1}6}:10O�~H|4CS�= �f��Otp S�f�s�:DG=9gz}.:5z'zi`� 1�}=g}S?:�>4Pti�?0hpCd�?4}8OF3@3G!LH<#`�=3=c8<�D?6}3}6S7|c�C842O'8O8 T?Gwvpk ����z�?�:��1R/VBWWGHC��� ���� ��������������������;�`�:<Sz�n}2S�>O�P0C0<qx֓F?|4� @HOzx�0x1|S0ѡ̀>g= 8�~L`Ox�~D`��}SuA g=C�~b�?000�'dh�G82��G�~H� � �:e�xc ���h� �h0z�=i@��x ЩS�=wxՓ>�{�ǁ�8D3�'zgz�ui`�xgQ= `:я�f�tIp|0g=`�3�c@�4GN��S�>ѣ!Փf`�:�@ 1�8D>#=�>�̀|4'}&6�9OtQ?0�9�5Sp `8c�?6Su|(x'}чz:sx���>9O�<�>O �0=k4`�Op~P 2�w>�q�?6 `>=� �3 ҡ809}c�'ch��< y�C= 1�x9G<ich ��>֣>סui�1П0'}0OHxa�x9v�/x�~H?7O hDOСc�4��`�O8<�0gh��FFDO@OX�>Џ�l�>gxzSd�OO0$`�I?1�ap~a�x�u `�>�5c��|<�!|� }00�c�|G�tp�A?s�f�a��f�`�?=>�`��>p i`�“~@?�'X � �?!�08�Щ1��?0��ge 9td� s h�?I �@xO G|�<�>'X�>9P `pQ?10P?2��f �Y�3 �R~P ``�L3Ct 1�@3��~T?)2� !0 >GuDzgCD hc�d�`�L:4x9=j4:t'32=a�f�d�x|0:49�0�c=A8u``�� zOjt s�>ң>< ad�X8F@xԧ}4c``��x��tQ}:< 7h�z/ U��4xУ 3�>>�f @�f�t G4�0�>C=f�胁1��1= `p�0�z֣>�D�>‡x>ӏA>�>�p|0�h��f�A`�ЩC�>ӡ�pг> <|1#XD?#2�}2ѣFc��#S Gd��~|�_p0g}6?n�Sx }�>�N=  a�8g=a�©}<pЇzG �6ot#G0@�~P i�d`@90�гc ��>>ҧCx> xG8 a@/c�~JC8sDQ#:4h�uA>2�`�= 1=`!<i�C?O:4@=jN\B1� яC}<���>֓O5| �s��g <y�Џ#>1S �>C�>�f�?1G}2O�| x1��N}ԇi:�@Y= �'= >�ƒf� pp<Щ~X 3}<:t�'}8p#f�c=�> �A�>'zЏ c�C��|̀`� �8t 8e��s� S}�|0c�>�1c� hpa�s�n�oI}<p i@ gp��>է��zЯ =A?40�'>'DO|`�� �0�:@z֣> ��Fa�ԡ�`�x�0�̀>G0�a��>©�Fz �}:�f�z�N=c`��<0�@ [|<!<A�f�Oc��~`�Oz�O�xGx1c�O884ѣ>1~~��Sxz}1�xЏz�^�|2Oe�#:5d�~f�O8k;s�O:��`��> �0x ��FOb;ԃ�D At A?3�g}!|6�:t Џ}c��'x҇:��<ip�ЏGp)= `f��,x�>hC�5``�1�c��|G8>O 1�O\0=�}G18'`�18�C i� f�:d�?1s�< >~APETAGEX��;�� ���������������������Date�2004�������Track�02/10�������Title�Silence�������Genre�Silence �������Artist�piman�jzig�������Album�Quod Libet Test Data�������Replaygain_Album_Gain�+9.27 dB�������Replaygain_Track_Gain�+9.27 dB�������Replaygain_Track_Peak�0.229712820826�������Replaygain_Album_Peak�0.229712820826�����Cover Art (Back)�hello.jpg��JFIF��`�`���C�     �C   ������������������������������������ ���!(9B��������������@> ,r�)� ���������!1A�2Q"$3Rab�?ljRCIG4剡dhVdK쯦woDv8qhĸcBem}?� H$)B,@�%������������1A"2a�?*OTbPm>c% y}7�'����������!�1A"%23Bq��?jWH+)<P`D*m~|jYqU=Ezs&%BvA:\_tL�����������!�1AQa��?!.!|L@m� myrFpW^mk� �����_������������!�1�?RdC7AMZkԠE:S+%{`SC$ �o_�����������!1�AQa�?'y={M mWU Qvh2TfFŦ(������������1!A��?I>*@0m`$u<r!Oo�����Cover Art (Front)�hello.jpg��JFIF��`�`���C�    $.' ",#(7),01444'9=82<.342�C  2!!22222222222222222222222222222222222222222222222222���"������������ ����}�!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������� ���w�!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz� ��?�+k3jFgh%$ݫq&n6j3Gq!Ͻq7>)5we;Yʇ.N;`NsZMtkQ=3MKn턀? lێ@APETAGEX��;�� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test2.lnk����������������������������������������������������������������0000644�0001750�0001750�00000001034�13112005742�017555� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������L��������������F��� ���J1yJ1yJ1y�����������������������B�@�2�����(EA{ �AEE0~1.TXT��&���(EA{(EA{����&.�t�x�t���������$������$���5����������d������������ ����C:\Documents and Settings\test\Desktop\??.txt�C�:�\�D�o�c�u�m�e�n�t�s� �a�n�d� �S�e�t�t�i�n�g�s�\�t�e�s�t�\�D�e�s�k�t�o�p�\��&.�t�x�t������� �.�\��&.�t�x�t�&�C�:�\�D�o�c�u�m�e�n�t�s� �a�n�d� �S�e�t�t�i�n�g�s�\�t�e�s�t�\�D�e�s�k�t�o�p�`�����X�������xy-fcf85a601536�[]SK)\(0%ܾl7�'$[]SK)\(0%ܾl7�'$��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.asf�����������������������������������������������������������������0000644�0001750�0001750�00000025146�13112005742�017472� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������0&uf��bl���������ܫG� Seh�������`Ȩ�@5HCf*������t_ _�������@���� ��������������m���m���f��_.� Se.�������ӫ� Se�����ܷ� Se�������@iM[�_\D+Pÿa�� ���������������B��@������� ����������P�P����������������������@Rц1�H�������ARц1�H�����M�i�c�r�o�s�o�f�t� �G�.�7�2�3�.�1����8� �k�H�z� �M�o�n�o�,� �5�3�3�3� �B�i�t�/�s����B�6&uf��bl(������`Ȩ�@5HC_���������]����x�����PF2� @#�N.: #>Ý@U: *fTZ"-;|r*Di)ûfE����������]w���x�h���P] g- SMzqtbd&ܪnt3Yd%8d(ZZDp&aʴn&X!8xG����������]���x����P&i҄S8AG3'vZjHl>CԲ�Fݢe#i#8|z5LLe:�Rq����������]g��x�X���P)ŪIKX&au_z9ߢuqjw̽M&yL GQࡺ ҅#NEYN����������]��x����P].63 6q'l Ct<A6Ѷ -;"^ ­(:$kW$ωd�����������]W��x�G���P"CVʠ� $78J2$2jʶcJ &P˭ J$&)xYSCI=aF!*$Z* `H#+|����������]��x����PRi#N p�� B$z'Bm9QB#"XuJ$2HÑP Zy����������]G��x�7���Pa6 r,몀ZZ| q)sE[}Ӽ|S O  Tuijw A����������]��x� ���Pmp$ꓞIA"|qڄ.j0>Zq4蚨ɘx+Wp$(^IGV˄\����������]7��x� '���P1p$^ ڹU!llg vN$}A|nlEЌ8e2ǍJr!lwW$BC����������]��x� ���P sxn]*ad˳݊N^uxGE7̱. :Tb� zHVF"$Jarϑ;8J����������]'��x� ���P1L 0w-68ud{Pr5:\5JZ}6:J q-"P@e����������]��x� ���PeZuJvW2DPmUj *a@l W Տ+|ߔRL@x����������]��x� ���P:TQDr񀘝Re>tgWiKؚCmE)xj%A�ӫ����������]��x����P]E#̺uVhbEyTBd%(8ʁkݞ��MӄO JY$4픘����������]��x����P>(E~]  Meq!VgeIGa=P`G[F9uߥi佡����������]��x�q���PMOƧ *1(h•G2RC [ZY"(ܲ]Ggw0 ȊUq|ht f.DU����������]��x����P"rUQ4Q; bǥrmw*uhmzq ؋2 e*ZT ����������]o��x�a ���PݒR/qOe 5 �^X2 WPW0z�9"*fh$1(*dVM`d quU�����������]��x� ���P P pO=g&j�@XTg3g 'kSz_tUc::xx����������]^ ��x�Q ���Pf\I\H` #ܝ:qt.18ȫt𚳊X4짵˙XJ겹O8P*l����������] ��x� ���Pj 2w CB AYZ.!]Ĥw0QlQ7&tL{v"LMcޤpM[����������]N ��x�A ���PtX%y˻6Z8|5ՔɚtS&CbY^̂%"sguY$FRy / dPuL\ P����������] ��x� ���PE*$SbMV[2D$?,©� �E"2j 5;LMUrV ,kWsZ0����������]> ��x�1 ���PE nXC8Qo�1Yv Cn;f=@cn#. ڢe򫿴`^X}����������] ��x� ���P2X/`ȼ2Q1ld�F2i2xUy.hxV�/~\ ����������]. ��x�# ���PZBDG3�FIJ�¥2b.2an D ´kʘA]9[(uvB9k8����������] ��x� ���P(pdn^`X3`A٫-h8GH PC1q ~z6)~kN0fw IXwz&ڱmM*q8����������] ��x����Per½c/KKyCy݈ AY-XVZe@Iع4V0QIM����������] ��x����Pu �VO1B+)c PnXT04Q#C̾:E~pltrP)ҳr{����������]��x����P-?ciuoa͢Ѓ\٫xUi.Ѣufn7բU6D(g=\����������]��x� {���PQvТ7Fc6re8 C?D"-KkV/DHTfIG+:vx42@A����������]��x�!���PiF+Ċ\΃2%ɲe}؊"@=ts t$r/ $B- `+&Ȣ����������]v��x�"k���PmǎZK?$�]ⴰinoleԚUF*J`Ķ<Ċ7L| .�����������]��x�#���PUzE^6òHXhrF 7LsWP)f4AR1L,J?a "jEqڷFb/uWԡ%;����������]f��x�$[���PYZ(bO6SߵQ69M[ben 쫧 ڦwRztdAC9ZRuq\tF'&@vg`G����������]��x�%���PƆB_0mS>a:J #g ;RwBB$90V$U{Pյ"J!,ꏛ%�:s ����������]U��x�&K���P -0tV @g3]٠J"�(<Ш)=QS|swײ~4PYȋ )����������]��x�'���PQcKD ld͓b!{5U5z(&h mukf2tK}"%arh#����������]E��x�(;���Pm[k5@t]_ܺuuݸ#ᅡ^x5EJ4E<bF68u`.rif[Q,7b~����������]��x�)���P5ԙsA(-Ȣ5H$ 7*�2$,ګ<DqB$"BjtM3����������]5��x�*,���PM>% E)igE~> *Ejf&LY,�VR2$#2E�PإI$Dw6;BC ����������]��x�+���P!30P|6YM(  ?l#H@1fa47F  "?@(u:4k?,$/&q.����������]%��x�,���P:fC0h*%":#B!~N)BR^B97=ډ ZY \l3����������]��x�-���P "5tϭDMsFrU'c?ku�PZKl/|e/рrE5_Zjiex����������]��x�. ���PiǀBEtVۊGrSڔn U]JAVj[յC$ &sV(i����������]��x�/���P]B3J.2"ȸOK*:)$d Q/L ie$@+gm&4U)dȜ����������]��x�0���P]FX:lDoo6X$a�%:6C\ϻ:ȳj&-^j4tB(r^����������]}��x�1u���P#ݓ,_ am{Qw vжzDÄ:�Yw UM3Nd҄V_a!Bdt9����������]��x�2���PFd' oঢƠ�> a4&Jݎ@,'9ᮣ"E|qn#‰NMcdXw����������]m��x�3e���PQ!:}Uu Sä1kn|LuҭMSIh4=L8XεmrEprjǭ����������]��x�4���PkZ߼߰Dg'q{Dp<nޝi<3&yrCt&mo"j.%V0����������]]��x�5U���PAoA'�7"FlQ˙f0 7#"%Ϸ骬44< 2 犉[ $=$ҷ'*8����������]��x�6���P<t(iC!H%$1fVPRq)F:ĥ$- @Z�R $`T"W����������]M��x�7E���P]"":!xR�{eb̡ U(Ȓf"% %jqy&X?|' kf HЇ����������]��x�8���PB=r( #M s-12& ҂hM!BU} ^)ĝ.(:uDuItc;����������]<��x�96���PlX2㾳%GiMW2%zJhY%VҍFdY25Ҽn#h6n7 dR5}hY5����������]��x�:���PpU[%nӏO+qth]<5*jnM{Hܲo~0r-Q Kir����������],��x�;&���POLUNot`Y֐\w :?:)H 12p p{@d����������]��x�<���P j�" VӯI :X'ՠ?O *d#nXb_aF DZ*#hĔgj����������]��x�=���P O 9b>(L)I2T]Ľ&I$ϡB BHfrZ4ј# !:H VeNa1Pz����������]��x�>���P}¬ $j0Ъi.!B"@Bu"7 /S!b0/bܘHҭ 9z.#T" t����������] ��x�?���P !j2*%yF ?j$"/2:SjSe:BHA$kDžc],T"'q6ؐl4F����������]��x�@���P*Uw`2`8-**[ņeUڥ"rx  ����������]��x�A���P:U,3؟CjakI_2e響! �Eo2tf"5 �XMS!:W€{����������]t��x�Bn���PEBiѝ, .D)JJkwc5�^ZhG r%! QS!buSFWSCL����������]��x�C���PQO)beHw}Ȝ͢F)bEL܈H,鄌s)j5X|T?X1N#zK]& p����������]d��x�D^ ���Pٲ)J �lyCe}WN_K٨B5'*8XYL" Gb����������]��x�E ���P^Q=H)|vkƂutF) idzuځI@ŵ6i¾e=XY&M)����������]T ��x�FO!���PZ`tI*Z.ԮBddK2E4QwPυff%f�5 (Mx10{!k®xg����������] ��x�G!���Pa„Ѩ}wۍ3G`QXt`-λduMS=#&H@iD5*$T/����������]D!��x�H@"���P)6hɉh5,:1Blq뢞I)CRQ�(Nq6>6CwH.3t4j>:vHN����������]!��x�I"���P :>ێ[xunpJtg�"pfj-ү[tM(XӉ����������]3"��x�J0#���P{iˋJ ]uX|ԋz@M0;WtV!5f':%h r%=*Yl{\����������]"��x�K#���PV^'R%(+3Ћez t04krYO9ы7kkDpl9ڤ&7 Btۨ_����������]##��x�L $���P42Bs  }Ak#Y*tvkb2;tM26^`Y6u>fB@����������]#��x�M$���P!X\$ W2w&$8Ҁ S&xtm0A#С4)9#P ?z����������]$��x�N%���PM"`f&H8UY^M底_PqM]Ԫu b\"Pxi*Țuf%DE1����������]$��x�O%���P1FѪW}EYdH PNjʬ vBTAӐYf)%:q � % [(`B3i@D����������]%��x�P�&���PR D5� P] D�RaQh=˱D)pYN L=QJ.GcN{4����������]{%��x�Qx&���P/zEqkt5x y+*qe1 Vb^:G}Lq Z2uwF bJ T����������]%��x�R&���PR*uȗx^ ȓyQK)"U� &-[1 eKCT:׃\V *E\d<s&Dy����������]k&��x�Sh'���Pv ]қ  cǔ2t3Q7KǮa*[6r) Q7 '|AS! H'����������]&��x�T'���P2"XK`]I: �4i p(M@J<ٲco2^ U}"_6����������]['��x�UY(���PBX (AU,yJS (ejp�J9;kd@&UAJvȋtȪ.o8ÿm����������]'��x�V(���PM_JunwzT%$ �iJfCb)6jSirBE=L'5!*SN>D����������]K(��x�WJ)���PQ#9ZfAT؞kaY /t}Al-�.Q ga-"%ߚ XρlS& ����������](��x�X)���P%2;t4oRxt\D9.FPE5;1rl{E{s(F켂en%ywh ;c3����������];)��x�Y:*���PB຅b#@q=/ soLB,DҬ ӵl<o2^*,Z7.ƾvl?tXdY>����������])��x�Z*���Pa*G\1] n\ ( yU&߅ Nƙvj7lop %4����������]+*��x�[)+���Pllbf#s 2*f@jp2YB+ Ç[9@=첥-$B;H-����������]*��x�\+���P:▱k ~^GD/tW@:U˶f>$7xHQ#VLcn����������]+��x�],���Pޥ-'m)kUU#[I, o,rQxq0LR"䊕'\Do����������]+��x�^,���P~JD $Q2, �H$!&Ϥ"L3cl O>J4z9":;#̉����������] ,��x�_ -���<>F4+9:_h+PJ_RbxKHo!X?.0JJ*D7G׼������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/empty.opus���������������������������������������������������������������0000644�0001750�0001750�00000050511�13112005742�020060� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������N;����OpusHeaddD�����OggS����������N;���yHOpusTags���libopus 0.9.14���&���ENCODER=opusenc from opus-tools 0.1.2 OggS��������N;���+ 2fgigijiijiijkjjjjjkkklkkkkllnlmkllmklklkkmkkklkH,JkY!�(A!㨂u pXBj+B?1uu!FOѤz4E0 33  cIZv&TDEs#*oQP͑9M 4'ydnnI)k;5yv)#7uUmMo$"}4vdKTr /ҳa=rQYEk(G g4'(U~8A&Jc_"9<R9RX qc6Ҡh,l2%m%a%Kzi&$_a{2i? 96q'8GSUx2UgA@)T 1!(\!n--L eP?gYaҏVvs%|^q4ۍΛ a߂G-̦`|OTeș" 67B18>@�MX1DyyKS$y1a5_ 'T8rGi4 E_V?3 ܸCe> #!@@ϪٽI|n5 a@#~yE"qM2ejjؿδ ҜOɪ{ackE#Q_TZ_̉PHg|]P_LIq^`;[xYa3 b=z?7 Gӽঔ,9ƎStV8rȽk BEԠ`iM+0ġkT}-�#+k Ժ]}E5a'"?#@u)X{ݫVs$Y4'<j`,GCXK*e1:/cyDa=RÈ]_g?LCF[\f 2r4\G!wKwi,x]/or jРȁviʦ- _ Έkjȃ5aB;j; O9=`BCT0x)*ɥu_d@CϽT;QNCUƶOfc*:yW?yjJa5߂GS`Ψ18" ! p r>9 Oqfj0W3rZ85>"tp*N/rHm/^V2asm{=h%Ta8Ds,du'Qc dj簘4rGJI⣩<s#2bG>hR1,QaK*s4Fwt}6Կ;:o%يa.tqof&ԈIP$rhA/?N2) sn˒ri|- έ0AhxNa[b(<3G)~$(0…x4*ҩocvΪ[^ΒyC%VLar>˂Pup;.Wĥ3U&~fZT0/JH Yj`TzO쮻}C2gy5|b5KW:\dg{:5zӬ6a3gXGZul&m~g?6]o6[ƽ͸*}G IiHuTzq?(p'p,vޡ/`ƺa>/KgA2%sĥ-lRb3*9c kPz0do>YyJ\^A~h,mDoG.bIKh an\O'BGx$v{\ {a|.fX.7Q&qREJh}#1Z$Hq'q1 pe&2aߴGzfRHe;)$!U\h7TAWGUWX\U˧D# s=:Ց5K.Fg,+ʩ%&5*^#aHwӾJf)X.fp߁uLk!9ipzjzl@IrMT+B}pBHv~= D`l- ia4^ }P{gr^aAH'0ۻځ"�.1I0T c=_m,l?Ot<7/'*>_.ZmmW,lLƢda@ou = R`6dfE@R)7âB`G6RRq9GuT.%a@",z'k*Ctq�8|F8cM&av?~ѹ5'>9`t)Á\T]Cr9iIg v՟alL�GVWTV XXPB!a$b„lOfM3S,i2=Oc%b8kwyo $Vb]<3šy<-~eV[OQ3Y㭱?TduL֑anmRfl&H.^ZVirg?#M?{g.y"Pզt]zkWsZiŪ1 Tp3 :?o[ޖa8)}Z`Wĭ^@;puf\9'Au֡'/hF;fGA<2 &OCe[&3_QEN ֋"8q_2:8a@|Ct׌|בNNr2⡥f?}�i!PA"LjG^Xр3H6Awp�MD^9)?IYoM%KNw�eEy}=Z&`#ޅ k @/6y>m(/YS,Sc;9+ yQc�8HeOS݁yua{(WV}@} Qq#Mye1ju8a F~UyU@ ÙV,!VZ}},۵@󰱾ݿ{PaK�Ͱ@O@4 eUAs(x..GXCJN:9czSO16BS<]w}l4Yb $fSтQڦsc�3\hRS5{E/yayÀ��Lq?lx}}J <4qoi Q;TGzxSHER2w%DxO0mmo~5r=\}a+@2M쳜8/W ]9dZlNĒd3QM4/WԜi7ƍUR#nB )lx *ѽ[2kSzBcqaꔚ1}Eb?ۧImA`�͹!8YU<l/3Jjp_sbg>GHS q*=> CɔK{X^H~8f)θ:b6ލYΆaO9]ZcP.-e|ٞ$aV:aK!h2`�ejwf;OhP]C*;.vIW7rM0 0DFc8a{Xr}VptةEָ6 l0hڊ֒:eE!|7ywPtBLF lsrM}aiÑnGo3R{ 9y+)Jy&R̆+ 4|<*iZ_`g=n=Im*7KIJqUkB5@a괢{}@ E&3miF`^#-%佯pi] xgF] ;תcHEblj7C\[L$y;R!ͦsk͔9q<N*M52 ذd1^!ً }q}\60>a#q)z310H o+M3Mb=} Y{d Lyjir^$b?qt^6cDJUU({t)u!}a`ӭb .EGuXY+NפD|(@@ޤFx!>Y3s+VFsC4ef1;eqN@}a<@rQjrBBv #M(l6*'gwb0>V%C?)6ٍnl}^N ٞ`̛ia{x+|yNF8hkw–N97A;[f3 mn>ȜykJ$K 󀨾W''|? WܞN(6̌)(ysaAg<n;a^"&Q$HP]xcc(DD 6B[]XS#{W#26nLI=VqzY|-_aAg=VH>zL:ͭU*w 2`lgA좥3j-5ao-C@CExNpG>*SJatU# 6KVKHzL<ijey\1 jalheN%ea_p?ltqS'n;)@Њu:-*ha :6@r[t< >.29q)fWkVZdtp&:~^,Əfwx'/^,NxٺQa괭]< h&W&m2kKV-N W6e`S d]][gCDhjLyc(7Bå0 hcce ǵaA"�QoZ\ZcqEzX zʅvr먾#Vs#׆y=edZyx-S=0$Ʀ]y/(szeX*a52PR^ڲc܅4cZ裰X+J0*\R S"!2͝s  ^ɸ WWAqՊ"uVvJԸi\9ɒ d*#Ftj6*G6=ϢuSIزA Aaj>r[f [u }&{)ڔem>m>nW8_%#xoC(ٹI]rD?+Pw@D#(0Vaa!1!s-SfRQs6D2:O ~p&pp:AEk/AKŰR'ӡyZ֧kDAOggS���w�����N;���Z 2kkklkkkklllkmjklknlkkmkllklllllmlklkkllmlnmllllmmnoQ1#_x޲,Ş6fTۻ̯Oq/U .[x"+TOל..I]$zS>qJ{^r4MFQ'AS~Wi`acN%H?lU&= &=llzӯ3H7|֠PKՒ΍gws5gњU^ͮkHѴq8bX(fa5c9F_?o.5F˚~(xW!ؓ�AF/6L?TIP0@N%sܴ(ܥD}BQ^]< au>4~Gh0S7(x:8biET<g - A ޲Kl;&Xɬ@ps7[am[א=N,܏Ud)R&hD_ihoTrm_7C.)=gV.X$@3z8+@%gD>o`a폆VQBhU r̼u!o{Kز>m`ݿB_GC_=Vdw^hrTQ^~^~p:h $ǎ{˜ 9^FKa+«xr:7x,==`&%'8f!n6owɀ Kq9E1mTAh>E<vA&[`x9Oaս:F@&pFZ:+BGuJߌ7vJQ+OVy TܓL3SL�+Iel@Fvo5~s-):~ƛA&rY' `$mu|~ëu["Hs!)[�{Y`"gPȶ JԌ,}~SK(nzj]-=q+Ja:"ߠMZ7a̅+7ar/@*:} t Q/*(NNLf~A49;d~9`+oLub~ 0amhTfÎOX)qd3@̿.Ð@+篘 =|&i,2l2^L+ĸ P 4C"l-X]dq1>+BaꡪE異lǂ< xë7p*]"t<tO/b$p8ɒcu9JpoJ!&auC8n߇Yp~`?ͅ,/5S=0б'?PW[:lmmWhN#. e]T~5OkgEȎ'tTa@cچ0G�MyK/c HdQt-$<BH<+ xa]Sb?aJR5<Pl%̘,,q,VQa+"Kh8t�;- z 5?fw[yckSت#ܖFBt\ibX{4? D}8Ad a? M X~ۿ_$8@q6H'ds,[NfvrHs%[&9 oL{g#(/؎Ca1SL~O;aKo\hC ߲,ysC|ې \S̚R9ۤ)HO w z 6�>EkR8 h8w:.5aáAK\__̀T]9 KWp+1ECPI:DLTw-t2t=]Y�wJGLg'5~"qsa\KG�\ǭVN5̵O;SUF$ug5%?M q!#`Dp w&[+(qa‹Jc/}s0m$LG=eJYay �gjɠ$"r#\W$c. in*70`3ᾘ}ΚaO9]:I 폞BZs|띨UEo`9_6Є5mNhZ O0�=Cr E\tJ7pIꀑaV_oQLٳf'seW&"� r8c<0LYӵԃ**\RvO=Xf' m=_2Ma{Omg͝7zm:*%��nV24HzޘRrsLVhB�f-Tl,l1/J=Y;vaX^""UdZP<kp _}N,_S?"}?0Jg;t*T%4zmhUB-Yā<VP<87ZaYȿ+$GGiJ�b΁uPHMƑݡ%sa>X!+ ^4BP{$0&"ql'1 j V~c}Za=r8KR,I Xv^#3_:،}=B>'>iKɏ8}t�l}<ZG*2j'% 0whyإa*.fHOBįZ8]L}0JZ4 v^FOHTū|0,6, &P}4V4.Ftc晎ܹM, sJqya!ӝp3v/}Qe;ygWK:֭|e4h7d禼;@15 d#d%˸4k�pta5#<z3=F@"1]<*_Dsk5hz۳>ȩDHQl0豈x#Jc<#aPmnN=Qo+/E9YLm aJ@2bzv_ M,hyƨ\RlPg59vxxB_?HUtߤ:k҈- 'P&e\7T*GpIaB=� OI -K$[׭P/|&xuCEEM2OFÓ=}%ޙXD&ˀ)F8yNoVHTl ɽThiNaMcUl;&dpxy(<G5DJXt';oIS$Lظ(axKV 5O >Uwa#/:kuw6N'.*sOGAl^pRot ?)�kfyLQ`~>8۲}w}C #57a@f�s/WȫpAhQ*?EtsIe}D2k0r[+%<h+ۑǖ8հ5vO{iqnh4Wla2>_mRBvh4\ԻO*Yr*F(u}@  M]GmiTi(ADX(oㆮ<2#O) ?}G7aQp$mRݪ5xv]x颛,>$>oU?vnj=Q GtL-w0=bJmkxa\\?|R~<s%Pa)<S"ϒ=D(ɺD J?SS 榷7JTAq Pd|e*a443 Wμy8 .zkaftrd!<86L=�ޖݣТF)@:<)g.S)T,0ުbuG>$~݂fDc>[ .Ca�[=Yh,nц@9TU(Z+, .`E?IEfSPn_Z9E$)3&tPyȼ`eDƽ(.atzʧϒ+NGHxK_OXj)#ࢸ5wҽ$ƂbH4φL;s* H x~Z}U a)?r{}\|82@J}#�=GvM^ (mr)NJ8J(MM�3#NaGhWa窝-?GYȂ_F̶n CXƯ0v·8%Zk7!YclEW'߁ȪS2?6a03KW(9UeoM,/l-KF7۴Mjas��-7 3zȰP] :܁ψUjPぷ5a|UpO%A.>݆24ȕR~Jd5UmJ^xE{1_x$ DoAE!:A5pqcYߌWME1Žk]]U u AyaսG i5dt ׀m5!5/>"铩e"zNko> }_U uc+SÃyYHls,pfaB}jq<oH1A] =�j^٭vVm(~z>/N,w31rXƠ6Z%JQrܗOgJCqi#Cߦpo]tya] hdiih$vI+PE~#]6R\'8lTa݅XR+4Y{q )#NyjwXdx!OSHC^ۖah# Cl<$%* #FQg `?כihY83%T}0S]CmE#Qd9#aGE[+braՀQFDM-܆2h5T5VզXTyDRr]pӖM5ʐ8@%Cyu/WFFiA4+zoۭD7(|ʡy/Ut6mS5CX;IĪcB/kT 1 kGerfm4N7+9+ۨԩ)He�F:B: /OggS��2�����N;���)*2llmlllllmlmlmkkkllkllkllkklkmllkklkllmmlklkllkoțozZa*BȤVJ (({eh<mIi*L3=`O {rJd/aM@MDESDfg )O(?@a)l)eaꎵVZMZ۲_ (ʟDꢺ9ͯ @ыkI nܑV"ۥDɘLߗwshM*iC|8GIaղe w`2fh=֎yl=d .|լa$;'g5zŠt}U;.إ.ˆsG}J?!a sFvN D.*.�WfCɃ %Iq<_"ja `\:"gHs-Yz d(715a24K`[jvC<ш^JcV25}$cߓ+/n48KrLQ)znFf,)+ c^"aH$aqaL&4F&Rſh5y☀#;!ew_:;L IdWӨB<aBn^x`*ޠPuAeHſ7ٮ3`~xP!a3JKW.f%#| =dn"OD_ΏxYf@›L:(2Lb(e%h(bRP La괹0)96QÛ.Q┧w7FlLb'dN!ʃܵ k1'ݖS-GKMS#NH^aV^ɽpfRk?&m@P#q(U1|vR3{e1N}@,oҖ.۰ Ca^.C2[G~6�k�B,SGqWjm;P. `esG\Z?Cs8Kh@,<8x'϶aERȾ]naTpd%6A�d�i`rZhf܊ T<WIq[I21y]b4?H~Y̮=I80al45Faҙ _BsD:z,Tk*$>M!2ZN:9cT,q-\>]KjWbodI} #)l|<ZEwx;7j/61rj:`aW9E+JT\o�3m/VF!::j `KHA{]?G:" yZHygްVE'DI?u9+,/]Z9Ua R0s*> Ike:]KO”4-#˙gsd1:)Alu9o9 ڄ,;M%y^g ]`8qax{1j71w1oX;@2ݔ.ZJv%m>=dx\  ̪屹 YG$D\P.PKC*#&˴Q^Be>`'dx9o ̡g˜aꡯʬGB߲HsSg!A|ǶGޚaC[#N !Ƴ2&md(%n ֖WjD&q${liaJ>{Y}D$rB ɚOS תq7a'l9_YvhH,dĎ3Ō{"_olSŘӥ0aAI1z<)yI}U 6q?gr"~I cU5G%%ݹ%>/?WU `ʎALiJ*_vcK?yƃ@<// -l>,av I\Dd' r';t1Kgꃴ;Rb|<EIWHzރ,,KEY/M4b4>uVaa괧 D׳ن Izær֔sل} u/Y9jɄάzyQ.a 54Iibc,<7ѥa@f�_Lpm /yB";l�YEPn GudL>O:J;ׯB D / ڃζ*7όn[5GစaD+yT!:>H6/1h;. AEt `)xK*6(bFFYO!ӱ]ѩ@4>;h{aH#W]m@.Xt@H]mzOIer-< //nՅi"xT_PAgff*;e arLרp51TYi5 Ya|:XU:}`8Mզ/ϩQb0/q)a^U9ҡ̗Ù$jR@*#[Y \REYi7ic8:>km|ANaҿM&a筣ϵk~)k) % ƒ‡RF.i"`mSP/Ȇ2Wv N+?XZ]KZo; T!*_9ap"lzi-@v}~Wp0HR oqAJI,ZVq8 lɒ)楗g,-[Ŗx$-0oS8*D5O:X%mLNJ.|=7W&r<?9K!2Pљojvړ ,` *pUщ=Aw>p f~ꙶw�aƼ^'!XJ-IfZ"Q Q=-5`0̎Y-piN=M8}4ؒi)2{M<@*a܇vSzfjr`z9'ֆ%WCS`ҷ)D6H0�6Y  4> WU6xX)NNT<daߴE]5  kTTNtIn0^' @RZDNsMDȋtBR'ĄGCCyɵiTASDkvSa GeͣOTuC\_{ @TW2B齫8D"w#_u[lAа3,riѼ3.S^ޓ+eB_ o]N;.qN\`]ux,uڄ$Ĕ@`ԍ"pFqs,RSe@XqKj_*A;)FhRɆ $sQd0ZRloțOE10;QNjU/{;C& l3@0kk$IL4Yq&r6>߈L.#i/˃#2+1 -=v&CaphhS L1!~qEnnj ~#$۟@=1He+}.u"L}|p$hح@ejb{\7 =uå5buuIDۦ7Y8CL͎dv_6bi a{O~h@ao.n F~.;9 I /5 \aꡪ?AR¨<x`cr>\D\ψ;?!o腩hpZ?~dӷ,nA'"gw:ׇR_[ YRR0q{d a}A00q"ĢᣄNgMyte@Mv` JWooïT{>!v0rEnΖ}?��T#*�$-VO(/4KaAgR}^M}O~F+Qq?hxb` S2tZpc_GznOܰ+c ko}7sM[&Z`@s >ay[r7I_I!$CѺw2W&G)P{Fe Yt(wt*z("yDn5i:_Av̔T?'tm a?(Tjdi >!ɞ7gk:aXsԴQ[N l ̐@+%E+'BKC P ^G,'0m+R;}|kPm-[aB㘍>>3~{Ė[p8 |y(ɲn,->J({H$}y5t rVřeTTL-! :&`*aôr_uB;?Y/{k-o{ /fCNDg?3 lH:_4s{Wl U0rJ]u0w>eHBY2havNEp -E9mXS7� K&ym, h9SC*8b׋̖ύg?oNOh!qa42\ՁGMx �e#Ⱥh vdJp&vHfkp,W\@g*?W|P&Q� 9F}NLTa괮(my"gMo ˂Y&p#F۷"hJYlY' i/㔗!qZvN'H|Kq3L m|=78ULaA= RFՁ.4wGf5{gU6>*TohAq+3yWēlr_:�ŗ;If Nc9 Ca괢w6̼0rDmH[v,YT>^[(:|!Wf.-K(Hא#N,6ef -8Vay9"C$7>Z(T2Ώns dgDLw*߆-=J{𝔢ovsMb.m{ڄ_i2a9~BR :kI-T7f'-9_bW A:P"⏦O Hαp5j"pg_ޟE18So͠5]mL0KhܨKZŠ SDm1+1~:~54#aϽ}lF5Aj$S/S!H׌"$ J>FER.'.5gpKZ49W.)*D 9OggS�G�����N;���smc#kklkklklmkkkmlkkkklmlkklkmllllkllla=4 /NĄxVq<OA:\=.8uJ_qݪ0;J=j^@d O�*Mr5ax{ܱ0`:i-*Hk™3"340JNz �\n-ak†^�rwY-\,>}ɐ~Y\aea{&NܢDuMS6W?}8 9}\Z[Ga5<TW󤂅Ȣ>*vJRs$e6l3HEC.u/A+oE:a �13XpjBmDtdpIS*cJ9$إyB.fÏ9v�pS}>.bGarLc0δfG&:aBF6'8RO)MC 44RS9|c�^_P(/W|,z㩒hXdQs�@$k )ahʅ:6O,=K:"6eƹ܏A$V;x]o<D׺Lԃ!)tG mw>^a"saß[ +s3,x9M <yj[6* U'7㥗 z%7+C(ZRfXG|r,=m7?a@e[kccGzVR_4?sD'JF|՘a2mD'`UIx!$ܽ%* ۮ,i7ME_u*C1`Eo]j�ͨl "aēz8LJlV5,!?J.1ص jS*ιGHtEwxyjO6k+=`q~9 af88FMй&Y@xn:R Gk /KK!C"7ɃRē(5 Q<)AԳԵ2a; VaNMW9piE] ]3ip]Y4&PY|usr%>@(tM;4b68siW`*OPZa .!^f�v,I}#h nOW3N9iزhb]l*ӽ>O70((Ÿ)zO91?y;6][:K`Y\%a� ȸ>i!sM(/ R>In`6vuÁ'iaJ.73$Qp2_*t))f'') )?ДBg&Ba3=۷G7/5L!c'[w>miYN@-$!,wbvL,gg_"o'0J,xC=^뿃^yI�zaӌҮH"a2aHPd~jYDE J<EFCW,տP`䭻`cԳl\FZ |LmS; =Rfa܄\zFm1KM W#xgRgڶ%эZ6u+à#&-bKYƾ@{o<H$A^[%&a<%a1c@T2776`PM"�i,")3l.هlGl)B& 0Gu}߀mU"Bs7ug*j´ shn@P"50Ia窤{1h$#ث�ݠ%A#A ۔9`2:,}%c>5n~ oD/v,5]C&jy▧g- JeLa2(ԑWtsmP?`ſΉs<&zkfUSEfL}G]~C�TƺmFPD2Ⱦ}JrK AN!aAOx,_Xfsqg3?Eb[Nuwz&hB$Oz8*vGMl&u<Jħ,8K(<~sU~)/b9kJaI2} x&}U^ '{iס:VyD9O1rd^Ɲ>7ʳ 'dFyŻt)Q^Sh=ɍ&ߗD5paEť4DgAX9n.Ȼ@TKH ǰ5iՑd}F/슁d·*@*d/gzCTa </hoact[ZIn>ƿ njbN^"-DzO�A* ,fuy&=$GsK/Gn1V꣺/)ADa:i3W�:uw {!B?~#ջ!w�`z'Akl.%RP3NT9O jJw3r6eAb巎^TA+uE%a@aɏy "@B=1 hPBH/#܇*DW$Ӊ/pԍ9:{VK>b~XsUʚ6u\e$lC,\qI\aüEX/PW~.E%r E[Dc$NJ$U0\h(<ܛ*,ZwX&V"!CA J!a<q 'gi?axQRjSֹ}_u aG +S^L0~V0ų>G]b'g˄}r -_#`a{vk?]\D |oxm4X'ŕS,ހ!�! "'u,( e $Y=DRx&Sil /a몏 bANnz-iz.h)x#$xϯlGe45tTQ9`@a伴NJ{"~OF BHa-3ڬ3Y9@![I 9ʒ3%Cʂ]Xܟ&RDV[J$j5H?JP!'lOX2a3TbWUW u?hqkxF'l 4=ψ}^7.-MkDcNh$뾃}Vwd2> ^?C$<a@x|i_ lZKv<1EcZDF/Ĩw7D@h׬59)i+؆\O[I3;=aLJf4"i$,bs+ aeCL%`wYK=r޲ c)lpB(Xj Y{I�ۧ )a+1 8*Y:9k;<8!�H \~xomESNaNӕnaźr}i},{VG؄8x5hgQ"G^ `䏿Mti/:e4MZ�cMD0[Gbr'FR0f?3튳%f%%]2UH`g8`KK\b ACc>mP֗hW px���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/image.jpg����������������������������������������������������������������0000644�0001750�0001750�00000001267�13112005742�017602� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��%�%���C�       �C ����������������������$���������"�!1���������������'��������!�1"2Aaq� ��?�'NJ9U񡳮l>^'b ^*e#D\* 'q)',KNڧq{ %V#i}-m X vhrFT>ANxI8TY|bbNLzLEr('eɟeM[1X4 $ <Y?#M4MO/(1ӛiFLv`2֌׬ 6ЏFF5|}_A҇mdHf$ Hj ru,O�y) Wy7~z$29$;qG² |nl潖#"|x$E^QyYvΡ02ªDCQFȯ$G =R>wbޤ(pU�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/adif.aac�����������������������������������������������������������������0000644�0001750�0001750�00000010000�13112005742�017350� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ADIF�>������! d! d! d! d! d��������������������������������������������������������������������������������������������������������������������������������������������������8! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7��������������������������������������������������������������p! d������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/silence-44-s.mpc���������������������������������������������������������0000644�0001750�0001750�00000003641�13112005465�020626� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MP+���\gg��Йs4}>|n"vKd"墲*{eiy\=sy4g/cX@Occ{҄-y^g2<DGjQ(5 lYR1ElŤ.<*0ZP>;ZK'?I%.]$Q(w%3V�I9_x{zÿLvZhߞ0|6H }7ܤ>_I]Y-&D.;"0I,H)zZb>sϱ ӷ]g;l*,/*'o֕ 5H6P&C(jAon]~пB8 xqKrJy=A8p:P1(iĝ7X?ZE?l:яӼ1F8Tp=|'mX/D*H hrn@{j-y-B^ BN9qL6.[`[&dN"hG Nc].h>;R'=2L<N7nc͔K H^2{fUt R{:r2q%L&9$ws> ǽ>{E0织F6/""K{|̜ [ĞK~zw69UTUDDWvB}|*^l] wLxInL sGSTI*}{O nQi5urNl i�m;IZX\^&ЖV*UAޮhn ȇYQ|8VM3yll mS33a)IqeZ9[f[-+gրOE uG&WG5&6|_{;V]sϤL/O} ۚ\%1b- ZU̓RT}:pFg+i}WiY<l[.cSfZzglnw= <S*b<zPz_v[o۞*ӈ{z=vpgf*Sjg禮ؑ#xs{RYo7$ Dp29|շvZ!#^% yyӤmnM<<g~ΟӞ3sϟg39{ϺaI%|Lq! `Y^H> �y럻+)2n$pմs9doZ���W dǩdoz۶mےcpz_UUU]?Vt.\tپpkU`__G뼪j$ҤLT<UU~r�[U5]ţK BUUuVAP~��:APETAGEX��M�� ���������������������Date�2004�������Track�02/10�������Title�Silence�������Genre�Silence �������Artist�piman�jzig�������Album�Quod Libet Test Data�������Replaygain_Album_Gain�+9.27 dB�������Replaygain_Track_Gain�+9.27 dB�������Replaygain_Track_Peak�0.229712820826�������Replaygain_Album_Peak�0.229712820826APETAGEX��M�� �������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.png�����������������������������������������������������������������0000644�0001750�0001750�00000000374�13112005742�017501� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������&���PLTE�~D���bKGD�H��� pHYs�� �� ����tIME#7@K7���iTXtComment�����Created with GIMPd.e���VIDATx��� nH@���������������������������������������������������������������� ����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/image.png����������������������������������������������������������������0000644�0001750�0001750�00000001055�13112005742�017601� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������a���sBIT|d��� pHYs����+���tEXtSoftware�www.inkscape.org<��IDAT8=hSa(V$UtRRi EGAqT(`gԂ&qhQqE(v 7iҥ;5s{P6Z=s7w2-/Z+ tgi#I|^asJJyZnmnR\0,VGh32 \)fmN  1On` Kjt{W`8(0罭F5l6\w\|J�uCc@_L9Q`5k 8l?K  enSQ`\Y$�雠W`0u~,G�Pe.KL>HkZ*[6L1Z[Bs"R-}K/e:SHa7u����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.wav�����������������������������������������������������������������0000644�0001750�0001750�00000005614�13112005742�017514� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFF ��WAVEfmt �����+��+������fact��� ��data ��~~~~~~~}~~~}~}~}~z}~~|{}z~~~y{|ywx|yx|}}}|~||sqrqplosmmoqvsnotw{}|toohdgggefnu~{|wuookflnou{y}|swqolegijsxxz|rrwroghmnq~~xu{yrkkqux{v{wwwnrvx~x}przstoqytuwv~}knljuqvy~s{zzzikhetqt{x|xx{jkfeutpyvzzykjekvpr|z{}tnhgtvu{xx|tommutwzvvu~iinvvnw{yypqsuzrs{szwnvwwtp{~us|rm~zxpo|~xkr}p|}vj||zqrvw|}~qu}rmptt{zvzwsqm|uzy||y|uqqw{{{rwrp~xwqgyumg}{p}kmmj{ptsurszt|vrolifoph`|nbrq:wrb^kglflH\|jtvPvzxrLf|rvl^npeHZzdȇcy_^RGFseȋ}el_XJXGƛ`ƍqbxmdEkiLkkda~uKKU[nj_{i{hvf?pcJdžc|`nbZOCVRrhɷxU`YVPUNƧWЕai|ulIULy̳aٞcxswgD]BoroԼfVYMV[GWodsL~rO^mNj]}̗^VcN\|qR҄_bzjS\NcʣYTy|YNdcOir͢TYWXvznH\häSZ_O_}sCzrSlTjO`pyAldzϜMpFV|yjN}h`W^Osz|xPqPjIaIiUXǎMӈIxNVw|FcmxP[Ln}mej]c\^rzZ{sk`]Upxsn^yu\fS`PqzfT~paaLYsnveuoxZb[xyxhvfvX_Tqoq~w}^nQa}sibkr`o{Jkbeyv~z{]ziczq~ur`rX[o{vun\\epqquezkYvpqvwqxXpgVppo{qqaVWKntqyragWS_xjorqbǁTYYqorrovvoTmsQi{wwzoVsSf^{v}}hck_y{{yv}xspjWvqV|jqor}qtcw_iduok{{h^{riy~u}xzZf^[wtz{ozyelg\uek{qtyv{`Zk`{}pjs|{ze[q]rl{}uugy\qb|uu{y~xwtl`x]ypnztvyy{nfxYhnvw~|wynuh~stx|||goj]wqpopyhwvi\yxWiins{tqxj}gektbkwrpryx{}re|`z~khpsrpszzsptbrpbnuqmt{}suouftxpprxnrquztqqqvxxy{tpqpulpuxxr|}~usrt~vot|wpyyrn~rtu~xvurt|ysx}}xtqsxxrpru{{x}vvoy}poyytv|~~}w{q~koyvmt{vtz|{xqx|tv}}z|{vsxz{yzxu}ystxwxyx{~~{tuxrnstruz}~}zwwttutsv~~~~}}yxwwvuw{zx~}}{~xw{|z{}|}zxzz{{|~}}|z{||{|~~~~}}~~}}~~~]LISTf���INFOIPRD���foobar2k-album��IART���foobar2k-artist�ICMT���foobar2k-comment��INAM���foobar2k-title��id3 ��ID3���� TXXX���G��C�U�S�T�O�M�_�N�A�M�E���f�o�o�b�a�r�2�k�-�C�U�S�T�O�M�V�A�L�U�E���COMM���,��eng��f�o�o�b�a�r�2�k�-�c�o�m�m�e�n�t���TIT2���!��f�o�o�b�a�r�2�k�-�t�i�t�l�e���TALB���!��f�o�o�b�a�r�2�k�-�a�l�b�u�m���TPE1���#��f�o�o�b�a�r�2�k�-�a�r�t�i�s�t�����������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.mid�����������������������������������������������������������������0000755�0001750�0001750�00000010100�13112005742�017455� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MThd������`MTrk���4�XXXXXX� Tempo/TimeSig�Y���QR�X�/�MTrk��~�bbbbbbb� aaaaaaaaaaaa�?���C_`C��C_`C��C_`C��?_H?��F_F��C_`C��?_H?��F_F��C_@C��J_`J��J_`J��J_`J��K_HK��F_F��B_`B��?_H?��F_F��C_@C��O_`O��C_HC��C_C��O_`O��N_HN��M_M��L_L��K_K��L_0L�0D_0D��I_`I��H_HH��G_G��F_F��E_E��F_0F�0?_0?��B_`B��?_H?��B_B��F_`F��C_HC��F_F��J_@J��O_`O��C_HC��C_C��O_`O��N_HN��M_M��L_L��K_K��L_0L�0D_0D��I_`I��H_HH��G_G��F_F��E_E��F_0F�0?_0?��B_`B��?_H?��F_F��C_`C��?_H?��F_F��C_@C��C_`C��C_`C��C_`C��?_H?��F_F��C_`C��?_H?��F_F��C_@C��J_`J��J_`J��J_`J��K_HK��F_F��B_`B��?_H?��F_F��C_@C��O_`O��C_HC��C_C��O_`O��N_HN��M_M��L_L��K_K��L_0L�0D_0D��I_`I��H_HH��G_G��F_F��E_E��F_0F�0?_0?��B_`B��?_H?��F_F��C_`C��?_H?��F_F��C_@C�0>_0>��?_0?��<_0<�0F_0F��E_0E��B_0B�0J_0J��I_0I��E_0E��H_0H��F_0F��B_0B��?_0?�0>_0>��?_0?��<_0<�0F_0F��E_0E��B_0B�0O_0O��J_0J��F_0F��D_0D��?_0?��;_0;��8_08�0>_0>��?_0?��<_0<�0F_0F��E_0E��B_0B�0J_0J��I_0I��E_0E��H_0H��F_0F��B_0B��?_0?�0?_0?��@_0@��=_0=�0G_0G��F_0F��C_0C�0P_0P��K_0K��G_0G��E_0E��@_0@��<_0<��9_09��E_`E��E_`E��E_`E��A_HA��H_H��E_`E��A_HA��H_H��E_@E��L_`L��L_`L��L_`L��M_HM��H_H��D_`D��A_HA��H_H��E_@E��Q_`Q��E_HE��E_E��Q_`Q��P_HP��O_O��N_N��M_M��N_0N�0F_0F��K_`K��J_HJ��I_I��H_H��G_G��H_0H�0A_0A��D_`D��A_HA��H_H��E_`E��A_HA��H_H��E_@E��Q_`Q��E_HE��E_E��Q_`Q��P_HP��O_O��N_N��M_M��N_0N�0F_0F��K_`K��J_HJ��I_I��H_H��G_G��H_0H�0A_0A��D_`D��A_HA��H_H��E_`E��A_HA��H_H��E_E��/�MTrk���Piano 1� Roland SC-55�?���>_`>��>_`>��>_`>��:_H:�>_`>��:_H:�>_@>��F_`F��F_`F��F_`F��F_HF�?_`?��:_H:�>_@>��J_`J�`J_`J��J_HJ�I_I�I_0I�`D_`D��D_HD�B_B�B_0B�`?_`?��:_H:�C_`C��:_H:�F_@F��K_`K�`K_`K��K_HK�I_I�I_0I�`D_`D��D_HD�B_B�B_0B�`?_`?��:_H:�>_`>��:_H:�>_@>��>_`>��>_`>��>_`>��:_H:�>_`>��:_H:�>_@>��F_`F��F_`F��F_`F��F_HF�?_`?��:_H:�>_@>��J_`J�`J_`J��J_HJ�I_I�I_0I�`D_`D��D_HD�B_B�B_0B�`?_`?��:_H:�>_`>��:_H:�>_@>��@_`@��@_`@��@_`@��<_H<�@_`@��<_H<�@_@@��H_`H��H_`H��H_`H��H_HH�A_`A��<_H<�@_@@��L_`L�`L_`L��L_HL�K_K�K_0K�`F_`F��F_HF�D_D�D_0D�`A_`A��<_H<�@_`@��<_H<�@_@@��M_`M�`L_`L��L_HL�K_K�K_0K�`F_`F��F_HF�D_D�D_0D�`A_`A��<_H<�@_`@��<_H<�@_@��/�MTrk���GGGGGGG� XXXXXXXXXXXX�?���:_`:��:_`:��:_`:��6_H6�:_`:��6_H6�:_@:��C_`C��C_`C��C_`C��B_HB�:_`:��6_H6�:_@:��F_`F�`F_`F��F_HF�D_D�D_0D�`@_`@��@_H@�?_?�?_0?�`:_`:��6_H6�>_`>�`C_@C��F_`F�`F_`F��F_HF�D_D�D_0D�`@_`@��@_H@�?_?�?_0?�`:_`:��6_H6�:_`:��6_H6�:_@:��:_`:��:_`:��:_`:��6_H6�:_`:��6_H6�:_@:��C_`C��C_`C��C_`C��B_HB�:_`:��6_H6�:_@:��F_`F�`F_`F��F_HF�D_D�D_0D�`@_`@��@_H@�?_?�?_0?�`:_`:��6_H6�:_`:��6_H6�:_@:��<_`<��<_`<��<_`<��8_H8�<_`<��8_H8�<_@<��E_`E��E_`E��E_`E��D_HD�<_`<��8_H8�<_@<��H_`H�`H_`H��H_HH�F_F�F_0F�`B_`B��B_HB�A_A�A_0A�`<_`<��8_H8�<_`<��8_H8�<_@<��H_`H�`H_`H��H_HH�F_F�F_0F�`B_`B��B_HB�A_A�A_0A�`<_`<��8_H8�<_`<��8_H8�<_<��/�MTrk���Piano 1� Roland SC-55�?���+_`+��+_`+��+_`+��'_`'��+_`+��'_`'��+_`+��+_`+��+_`+��+_`+��+_`+��'_`'��'_`'��'_`'��+_`+��+_`+��+_`+��+_`+��+_`+��+_`+��%_`%��%_`%��%_`%��%_`%��'_`'��'_`'��'_`'��'_`'��+_`+��'_`'��+_`+��+_`+��'_`'��'_`'��+_`+��+_`+��%_0%��1_01��%_0%��1_01��%_0%��1_01��%_0%��1_01��'_0'��3_03��'_0'��3_03��'_0'��3_03��'_0'��3_03��+_`+��$_`$��+_`+��+_`+��+_`+��+_`+��+_`+��'_`'��+_`+��'_`'��+_`+��+_`+��+_`+��+_`+��+_`+��'_`'��'_`'��'_`'��+_`+��+_`+��+_`+��+_`+��+_`+��+_`+��%_`%��%_`%��%_`%��%_`%��'_`'��'_`'��'_`'��'_`'��+_`+��$_`$��+_@+��2_@2��2_@2��2_@2��2_`2��2_`2��2_@2��2_@2��2_@2��2_`2��2_`2��+_@+��+_@+��+_@+��+_`+��+_`+��,_@,��,_@,��,_@,��-_`-��(_`(��-_`-��-_`-��-_`-��)_`)��-_`-��)_`)��-_`-��-_`-��-_`-��-_`-��-_`-��)_`)��)_`)��)_`)��-_`-��-_`-��-_`-��-_`-��-_`-��-_`-��'_`'��'_`'��'_`'��'_`'��)_`)��)_`)��)_`)��)_`)��-_`-��&_`&��-_@-��)_`)��)_`)��-_`-��-_`-��'_0'�0'_0'�0'_0'�0'_0'�0)_0)�0)_0)�0)_0)�0)_0)�0-_`-��)_`)��-_0-��)_0)��-_0-��/�MTrk����HHHHHHH� ZZZZZZZZZZZZ�?���C_`C�`C_`C��C_HC�X=_`=��=_H=�C_`C�`C_`C��C_HC�X=_`=��=_H=�C_`C�`C_`C��C_HC�X=_`=��=_H=�E_`E�`E_`E��E_HE�X?_`?��?_H?�E_`E�`E_`E��E_HE�X?_`?��?_H?��/�P�PĞJ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/image.bmp����������������������������������������������������������������0000644�0001750�0001750�00000002212�13112005742�017567� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������BM���������|���������� �������������������������������BGRs(` @33ff&@ff < $\2�����������������������������������������������u=stB������������������������������������������������+Հss��������������������������������������������r^sssq$������������sdsssss����sxsttssq ��������ssssssqsr��������q$sr}��������ss����������������rr�f������������s~s�����ss����������������sr����������������q+sp)����ss����������������ssm�����������������UssR����ss����������������sr`��������������������sta����ss����������������srS��������������������ssd����ss����������������ttc������������������stQ����ss����������������ss����������������u#st.����ss����������������ss��������������rrs�����ss����������������r&ssf��������oss��������ss��������������������rstssss��������ss���������������������svssrt!������������r{rk������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/silence-44-s.sv8.mpc�����������������������������������������������������0000644�0001750�0001750�00000001007�13112005742�021335� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MPCKSHQo@�RG ��������EISOW���APyR)fdc=eTM4Ǔ52Γ^-薂J40`i _Ɔ>L|A[_a@@=Y.]?j'5ؗh̙# <L05hGnK 0%rǚ@% 01+$脫CQ�])S?_,ɞ1D,֮W4,+ӆ\gk_̣A%i_׃M0{AP$d ܣ#&*O�VOZu~Gi q-<im2ͥa{>eO_pJ 2h * Sݗ׎ndosKi/-/gNO�E:f,K-sKR~AP*{_4=Ueи~Zٝ H4gST5 SE�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/image.svg����������������������������������������������������������������0000644�0001750�0001750�00000007226�13112005742�017622� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg8" version="1.1" viewBox="0 0 4.2333335 4.2333332" height="16" width="16" sodipodi:docname="image.svg" inkscape:version="0.92.1 r15371" inkscape:export-filename="/home/lazka/Desktop/test/image.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"> <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1366" inkscape:window-height="674" id="namedview10" showgrid="false" units="px" inkscape:zoom="15.610417" inkscape:cx="-6.6063539" inkscape:cy="9.4561455" inkscape:window-x="0" inkscape:window-y="26" inkscape:window-maximized="1" inkscape:current-layer="svg8" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" /> <defs id="defs2" /> <metadata id="metadata5"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title></dc:title> </cc:Work> </rdf:RDF> </metadata> <g transform="matrix(0.31181588,0,0,0.45905051,-19.184577,-57.606888)" id="layer1" style="fill:#73d216"> <g id="text4487" style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:6.61458302px;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#73d216;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" aria-label="QL"> <g transform="translate(1.211806,-3.3890332)" id="g4498" style="fill:#73d216"> <path style="stroke-width:0.26458332px;fill:#73d216" d="m 63.89053,129.73077 c -0.836179,-0.032 -1.648547,0.44658 -2.035225,1.18693 -0.507499,0.94941 -0.530472,2.0949 -0.312481,3.1289 0.199986,0.92522 0.897171,1.80492 1.872575,1.95332 0.828891,0.15869 1.763669,-0.10576 2.27347,-0.80695 0.697313,-0.91034 0.757099,-2.14483 0.587855,-3.23753 -0.151491,-0.96061 -0.784469,-1.93906 -1.784305,-2.15763 -0.196932,-0.0468 -0.399643,-0.0671 -0.601889,-0.067 z m 1.462442,6.8678 c 0.458198,0.50126 0.916396,1.00253 1.374594,1.50379 -0.420302,0 -0.840603,0 -1.260905,0 -0.380683,-0.41169 -0.761366,-0.82338 -1.142049,-1.23507 -1.102074,0.11737 -2.297754,-0.20075 -3.038575,-1.06471 -0.934863,-1.04533 -1.098815,-2.54844 -0.894668,-3.88469 0.184978,-1.26405 1.032444,-2.4689 2.284028,-2.85483 1.245685,-0.37945 2.750188,-0.18983 3.685306,0.77838 1.000843,0.99417 1.215466,2.50553 1.042512,3.84849 -0.147897,1.23482 -0.872683,2.41978 -2.050243,2.90864 z" id="path4489" inkscape:connector-curvature="0" /> <path style="stroke-width:0.26458332px;fill:#73d216" d="m 69.089178,129.02281 c 0.347955,0 0.695909,0 1.043864,0 0,2.27893 0,4.55786 0,6.83679 1.252292,0 2.504584,0 3.756876,0 0,0.29283 0,0.58567 0,0.8785 -1.600247,0 -3.200493,0 -4.80074,0 0,-2.57176 0,-5.14353 0,-7.71529 z" id="path4491" inkscape:connector-curvature="0" /> </g> </g> </g> </svg> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.wma�����������������������������������������������������������������0000644�0001750�0001750�00000105162�13112005742�017502� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������0&uf��bl���������3&uf��bl4������� �����t�e�s�t�����������ܫG� Seh�������CO;J)rJX������9.@ �����������<������������� �� ����_.� Se������ӫ� Se���FC|K)9>A\.��������s�k��� e�n�-�u�s���]&EG_eR�������ů[wHgDLz�����������4������D�e�v�i�c�e�C�o�n�f�o�r�m�a�n�c�e�T�e�m�p�l�a�t�e���L�2������ �����I�s�V�B�R�����t E˖p����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˥r2CiR[ZX��������������������������������������� �������.��������� ު|O(Uݘ"�����������������#DIANEpT���������@�^P���������W�M�F�S�D�K�V�e�r�s�i�o�n������1�0�.�0�0�.�0�0�.�3�6�4�6����W�M�F�S�D�K�N�e�e�d�e�d������0�.�0�.�0�.�0�0�0�0��� �I�s�V�B�R���������@Rц1�H�������ARц1�H�����W�i�n�d�o�w�s� �M�e�d�i�a� �A�u�d�i�o� �9�.�1���$� �6�4� �k�b�p�s�,� �4�8� �k�H�z�,� �s�t�e�r�e�o� �2�-�p�a�s�s� �C�B�R����aܷ� Ser�������@iM[�_\D+Pÿa�� ���������������a���A�� � �����*�� ��u{F�`ɢ �����������6&uf��blv������CO;J)rJ ���������]����U���� ���� ��% "" w=  ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]U��U���� ������AA����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]��U���� ��+��(��AA����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]��U���� �� ��8��AA����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]U��U���� �� ��H��AA����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]��U���� ��+ ��X��AA" w=  ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]��U���� �� ��h��AA����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]U ��U ���� ����x��AA����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������] ��U ���� ��+����AA����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������] ��U ���� ������AA����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]U ��U ���� ������AA" w=  ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/lame.mp3�����������������������������������������������������������������0000644�0001750�0001750�00000004046�13112005742�017353� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������d��������������������������������Xing��������&����PLAME3.99r����,<��5 $#M���&J&���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������d��%<��� � 5܀���4�����%Yw$ #p\cÂ@BPc�&>�h|�������(呤@ a鏂`$22019tS2 2R1E"200?0`.1$"�(tP8+V GYWG; ھ "j1*-t 9U΋OaCϬu˝Vj+.EpiѦI)DQ_yوfQAXfYV[S,9j勷2ݜk;9~??>/wy?zo=s_ܿ{>)�@0#ZXǏE$M@F,Hl F={d)W2ja -i7+OTL_o\C|EǾnYig88X|2cpU@Ybj[ eP;� >f@2b3QvC+p$ }Z NgSϰ؀6YϥWG ,P\$x;B aSRSNAEPlW+$Y[(ѝM#LHoA5baN`Tip]IHB" @9A0#'^rύQb mRv]Z`0΁D:W rKg])!!Fw8gCRI ϗu%GD.ʹG-;c3'<|KSxkӔr"�eD󙓕 Q8 MV� Hd�y5m�� �U?`k��4��MD� y3IGꄡYLX"څ>6[Y2WPD[A.Sp/Ehi g%Xf2/&rۊM9l#婫.AV RCJv[#( Jr@ A@ E'iL GVa2N>: KC40l3]WXԘ֬5&֬5&IC֫ƪaRj2IbRgV&5FX(*(S P wLAME3.99.5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUpdgP/3Z�� ��%E$q��4��UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU0dKk �� ������� ��4��UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/silence-44-s.wv����������������������������������������������������������0000644�0001750�0001750�00000104513�13112005465�020503� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������wvpk����z�����"V��1# !RIFF$ �WAVEfmt �����D�����data� �BWWGHC����������������������������e���� �2<g~J4���>ԡO�v_ Ih�t G3z|8Cp‡z1: Yp1ѳ00X8�E�f�?<�n�~PgC=�xG0� ��)\O8���NX3GY9S3SO8q`�'PAzh��3 }8Ss��< �f@ǀ�e ��D �>l���0z`88s�z!x i�O'�>�h�#8 ~o@�pwc ��0z-`�3 @O>O q@~VO=>'z4c�<>A |y�O#CH�G=9ҩ=#=HO~d�?7=`�!|�f�`�8tq�H @?:= `�N}�=�FcG�8`�HOp c=�x�< :t �p�c�e�zQx!:� �@z�F x�hF �ta�CO0�z1|6G=�c ���=Y~D0�C= >!:u0�/v�|ѣpG0:�0�a�84F8�<Dl0�|s�9��|0Sf@Ox�}.LTѳ~JϢs�?2�>ѩ|40�8�:!=��� �h � c@�C~PzF?3k9E?2GF342k90�3=jpOЃ~V< �4z1#�8!842C?S�s�<�N=� = I?*:0x�� ��':�  <kc�1�`�1���0� g8ҩ<�>9�>}C��|~c�FFxo 1�@|4t�~n�:`�|�q�:�>ԩcOl�?O�2�zփ��D?1SO�(�:(|2O5�0q�ԩ=z/#=h���~C3zc�? |s�?6ѧ@S 2~B�f�?z��� ��� s=s=!<�c��>�< 1��d�3G!�@3th38>f�$x�=1�!<|C�GtGz�Ip�@�>gz�38ty� Mx'z2�sOc��f �E40�< s>d�4zpi��1��c@�|�tq �<�0�38pd�d�< G0C0�£e�88C0gf��f�G2���?00�C=f �c���t I�>ѡ'> y�O03�~N3�H88C> Yc`��q�?4s�h�x�`�1}0O{@OCh@?g= @8S>�>'n� �>13DI/h�ǐ}:S �>=~d f_ �>7j`�f�3���.}1��Fc�O� T<�=>}:G}>�'x=!&g��~` �y � a@3�� �9j�|s��>A>`u =q�4x�?9�4�"z�<Ff`��CD `я=GS;K?00h`��}φp 3= `0��>O}C #�>42Ou�H?1����>ӏaz/ |2C�OH4z u�/1}8'T`�x8p/ "=8@�i��52�x9'�~B�>'C:0T??��~@4:>tC}>0>1Op Ⴡ�x�8�D3�h�D  ~ahCd�Cg}�r�d�@��f�Oz҃Fl`�40��F�pG#C}2��Y<c},h@2k�;0�_ it m�3f� `p@�}s�Ct�#�v�3O0:@O8�> Գ~Bx�8D |F>Wc�?�~`�0�|OpzӁ�1��?4�C�>1c@�N=< �|:1��3gz1h�:4O q@e�:��у\x@z³|c ��>h@4x}G p`�i�?`�O0:��>C}6pht3x�z ɀN�| 2CtYhG8L}EFODQ= �г5:� |2�LOtG0GxГF< 0Nѳ~H 8>h�h?Da�}:s�?<C31'}c� `}~l�@CO}pj48u qF0 d�?A4x� YpA8CxOt1���fG=a�z'4>i@t�c��f�O:<t�F4:0gl�x�>5�x`@q� i�/xA 3tԡѣ<гc�g}O �� �h��~b@��>ԡc`��d@Y y�c��q� ��F= y�?2c�:uSgAn�zgx9S��800��h`�8DL1C4z< �t�8l�?'�^:!1} =�}2'֡s� `` �ѩ��~@~j`�'z9z �@4�`�30��G}'x9`�8N=�`�88F�p pѳN}4e�O5PT�~n� �>G:�FgF `�x|2s@�>z�=00��>G2Gx`0|3CC:<c�f�?t Y#8c` ��3<s}8��|69s�O:(2'�~L�z:N= 3:~Tq�O2�< q�O8�v�3?Be�x�>i�#:~p` ��� i��4C >�>ֈԣ�Iˀ>1�� 'l�2CCx9StY I�D =' �N0�/ }�Cx5CAc��f �8`@0s�|�c �B�|310��xЃN��=t #= `z Q >gc�� '< @xGS"z�##4D3Qz'd�?3��f��>9�:0�`�#��ѣ!�80xԃNу |.>~b�'�|�!wvpkp����z�"V��"V��1+&ȋBWWGHC��������������������������� � <`,HcH�pC2їH?¡G�>�~`�C�g1��g}8t ��~f�?0�KA}23�1��� �xQ�40 p p @H?թc�=I 2`0z3= A 9�zA�~j� F�~f`��=ԩ`�I?15HP4<c=h:t }2�QG>Ќ�a�83xСG=k�4O <A0Wxx A24x��t�10�1�~l�x�h4TC=j,|��`p49��YPx}(te�L?CPO| �=/�|<=�@L>~D4xCL38o�> c=��~F=�xԏNF3|O`�|9�ـ|O i�3f�t@#84s�2gx~l�Ozԓ~npj�>Ca�'4x�ѩDd � A}0C<�Cz `0�@d�~d�Ha�p�2c�I >gs�?2 `p!) }G'z z9l��z`4?@>8O>c�?W:S:p }<�|3/D?$0��XOz>10�`��>x18|:C?h0l��N='cp�EO@`���>C� y���:~P`pux}g= `000�`��4�`�O�f|2O0zCa}0�pO��>4|$@?3�gz~j�dA?02C �4n_|00�1t xң|2O0c���p �S�|29Уp '1}69�c��~f�0Tj```��tA2/�c�@ = ��|60���=YX344��O}�~PF�Czi�O8p �0@ @�|`F4zgx=q�S30xֳpG`�8z<y`�:8p��c� 6ouj�<�<a``��>�0zM y��< �Ft��f�c��N= IY�< A?Otq �z8�>< ԓ �<':DO8#�h�2�1��O= A�~P"8p}61�>Hc���1O@?Oj1���d�zf�_I�!c��f@?s�0g4 zֳ A4`�?3x胁��4�>O�8u gX?5�< sh(8e��>�t|C�F >x}2|4�<�:0l�Ɂ�c��O>�e�/c `��u A:|<�zOz��4g2�<�!�f`4�^D?p 'Ɛ��>G`�\\�x�}4GCCOg}!zC�pI裁�Ozҡ=POH��|4 a�10d��v�60p�xO�0� .= 9 a�1��?9! q�|<�|2?j�uS}0s�'=|x҃>�)"L0!}s�#p |*x!8p `g= >g|��}0G9Oq�:6[?1YFc���@�Fpc}8�`t�>�|>0�0|4S> Q4zg:t �|$z��>z>0~B�C�|91|:g�C?s�?'w@?D>h1��^�N=u�za�~j�?4��<A>�=<a�;9!��p> g5|�?S}zЩ�FO| = l�`�xgp�i3z#>1'=Q8uti@H:h�A>| A}8cf�h<�=gp�x�>d@>Џ'�F}0SA3CO2����>ҩ/p<XϢ{ �>~b�O``@0�2�3=CCx�p΁1 �y`�g<чC�#2�}h00�zS= p i� QOc��i���Cz}> �Pp�'}CNC<`��s�j!=}s�30� @�N= g��p��>ѩC�>= f�'u1�� }�@>Ӄ>աCҳ |1oDOti� �8�Ρ@=k~H1��;`�>�0h�<СԳό�Ztcя Q?8  `:t �Lg`�O gd�t �<3}Ct� Џ90�g<i�SG=A?;c�#8e@d��f�xҏ��|2j4d`�1�'!|4�Cg`�=�~u ��i �90� @?-Y}<ti�p�t�-}>Dc`��4i�_C=kD;'�[C0` �'h�?+d� 32�F�>z�z��u“>Oc��f� c��f`��O ||:?Jk~b�N=�~`� S̀f``�� h�x:uACb�^ H1��;ߐp~b� `�>'T?!p� i�1OA�1��c���gC\\x80G�4�~@?;G}?k�=q �� Qd `4)�N}�=�@�F:p 0c��fd�1�:#�~m�z0�1��zGt�x�@ �p�f���pc� �\O>�|z9�`` �s�s�y`�x�G==G8�= h�~`��8�>l�= � �g�<< =Y?1g1�� �P#`�|��0�3x1OtI?4x }4 >�<~j�#O5x�0�`�x >�@�>�~L <AB>Y��~x�0/�G}"|6p <�>чx�1C!8d��F8e���� �||g}1K3:02c �!|:�C�><`@ϢDQ�8�ue� Y3�l�0�z�zЌ1���p�c�90zСOX]Hz�>O� @~v�Oѩ�C3s�>ч8 <kDOQ= `wvpk<����z�D��"V��1~LBWWGHC�������������R��������������D gz `"�|HNG|80hd�~b���|_d�>�h�^c4p�O �0g=p_Dz8p�q};�<jd�8<s�O|Ot`~~3�ht#}2'= |�`}c@�4�:p<f�3��>1>9E?A �N=5<AFDO�h�� ��i� <i`�1<ԏG0d �гG0xXрe�v` ��f�!�> 15:5�P��G��f�`t p|:өg�p >'X!}>ѯ `@�~N� `�P :է�Nc��~h�S0�|6c�ǀz֩x�4t�Oc��f�3$c�3�uI/h�?7>�u2�48g=' Z��|рh$@�>�~L G�F`t < |6҇l� g:0�:E809G=T?08e�Q:p'0@N0z�cg=kt@@_e�Fԏa�3'>x `0!g> q@}  Q>�>'t��~x�f�?c�OH�>AL)�!<>я D4:3L h q� `:�==A>Oi�>=ԃq�:[ 9c��> z�Oi� !|0�>Ӏ����t y�hta�3�FO8�N}ko�>�^:у>�=g@ԩCGxg=Y�FP?> < � ��Ā �?3�|C?0:��Ȁ�N�� ��7�0@z�~d�?<?@�48tԧ2C�^0s�|1<q``�� �pD?c�h0Gx��p�~TO:5u�?CcD3')zd� YO'pA?C�> < QS3�2���Os30`�!<i�38�f `��ѡ4HO:00:@3s� I �pzԏ< �pq�3G= 'gh��Ij�@�|0:u!�20�F>:Gd� @|<�z a`�G|d@:0� `Dof�ty��!�~NFpI��f�OxPO8p�l�3s@�tQd�O>�uczg:u '' I S>�d�x�p�f��0 | �Ft#�00 ��>�<i�3g= Y>9}|ѩG=Г>}>c��>O�d�8s�Գ>< >'zO!@:`�_�8G=j2��c�'=q�`�>'D �8��f�Q#c`��2�zGz0>O#}��1OxЏD4�GGh>g:54�O�~f��|0s�ta � �F�|10�Y?GC�p`g\0}":E?1'�Og0�':�C8�>�f�2>|8ty�>!}9!zO 3= �>ԏ }6�0zև@�~``� g�ԩ'�> | � �|O A3�i� �sQ:�>ѳ>)<��f��>ӳ��~ǸI Az!�d� �htg! @Xz�N��<\3e�OC>փv�C�}'c�~D ��0s�?3zԳFi�O� x9|>�(L3`�O0�< 8'= FO5:<0 УFϢ'`` ��f��~LOc�� 0>ч2O�^z14��b� >9xг>y�t1t<GD3:4`�v�_ Ȁ>փ>ψ ~@ g�Gh4Cd�\= Y '!�0@i<O42SO8,C|6<G=Yzpq�F:~B3 H~@� �>184z�>p �8�f`�4OpG,8��<}&:#x�v�!�N>zԈ|'�>�}GxС@�FOCt <A} tOz>AO:|S?s��h 7B#Pi�O2�c`��<S>� |8x�x8#f�p ԣ~B?60P4d�O Q 1��` �S�f��~Z}<>'z�F�IO40�`'d�h�:tq�?Lq�N�>IHGXO230�|<`�x9Ol�#80��A3&>�@�N1'='Ti�3�q� �;}0�:u 'x�=y���~Ry�xg0�g`�|�3Of��@+BOz �I:�>�>�``�g� Ѓ5CC�4zuh<0�i�?�4c�� �3� z1pjD'}6|у`�:5|�3g=q��~d@�h�C?|�|Sh���< �8�~k�oVf�az1�����p ��< `Op `9��e@i �#D��|>|;s� SN>�N=|C4s�?2k �,0�>�4� 2c�>gxx }1<�Ya t�c!Fc��0�I'}o�1��O2�`#:�~J}!A3�g=�D3| P?3G>�p A30��s�Q�N}Sl �>F2CQp s=I�>':t `d`�<C}0<'xGO c�C�1��T< ^2� �[�4X?0S?:g�Сǁ�z �Oh�}6  `�f�O EC`�ǀ~b � C}$<y�>1�' Gx|$:0�:$zz¡1�>�'zЃN}<�<y`�Gc�ppOp`k`�8' �pi� ��<�x H�8G)�'`�P>80z҃>~1'=1џ"tq�g:�?by��~n�2gwvpkN����z�f�"V��1H\7BWWGHC�������������������������� ��=Y`�>1C Qt`SzN O 5z0�G}4�c��X�24s� `��= y� ԟ5x8584c��}2d�?| i�?Ї85:``���~�_ht q�Y�0�ЏOI�O#9`�<y` ��~z�6S8G2$z�} 1��zС02C|�zty|7���ܢ0Y�>Oi�4TĀtg4ѓ~{�|�HOC8>��>G$H?2t IOz�N!z�>ң> zЩ4t�Gsx�F©'!<`@`�C�0�>С|:�F 'z Г `D?6{9s�t`�Ot��>ֳ�>C� ��:`@LOPpЩ�<s` `��x�4|=` Fi4� @8Txgx��z1��`�гEGd`��>�20�IСS~z�c��2op=y~Dl�C! �SO<i<c`�>1Ot9φ@:8 Ih �8Ei4Ou=,:#`�_ zG�}>sh�}CϚ|҃~l �����=q�:t<i3c �X#xa4@#�>ӣf��=g>��>A`�?20�q�L2C#8c:u �8q�x�Qz�NЃ>0��s�3ǁ� }��>�p� }c �>F::_��z�p �O�~Vi�!z>#�~K:��< oWPN7pjh8�>�>ϊ>GL s�9` �C?00�C:!�)g=��@85t�q��}S2'T3���Nz>҃f �7d@?::c}:>O�>!x't `zЩ10�` ����>׃>׃>�N= Q?0�=A�|0Q�AOz�@0xq�4~Jf�?3S<i@O21ѣ�³>g:t ~D|_d�� �t |�?3C�>ko�<G}!)0�:41�`��XD3��>S}O@<i�q�p��p9gz�`@���<Q<A=A�?9c��~@�|0O�>�~D88�!<Y0c�8d�@Ozip `0}$c ���>�`�i�0�� �L�t zҏ�`�d�?C 48s�j�;S�<� ��CC8810t�Oz4z@�4c�?5= �|2pQ�~l� `�p�?3O�2p Ч8u�}0ѣGb&�N90�|3�<k00i�i�Y_ ' �ph4:0d8Oe�гѧxc��}2gx0kz >ƀ�< ��4c ���`�;'':pt�V�ң@0�A Сhtj�< 9O�<�f��>ѓ~T:c���x'l�>�f� �xO >G:t�>ҏ Á!@#Tc ���3>'�'8>�4Dg�^ч}Oe�<y�?0s�� ҃>9s�  Q3 1xҏ'tS}2s�3OC1�� DS<a@�>p�3#t�>�01SA41��?�|8O�|( 8`�8tA A:4z'z �@;/@d`�O`'=Ok0�IO< ht y�~t�?2'c� E?:>Ǣ(CŐF�0Pa�f�}ѩ Ї:8O8`0t�c�4C �NN='0c@�>= at<~e�;�:sz `�d��>Щg>�p�C0z!8tԳN>�x�0|'|s�Oz@�^s�=5!<I?1_:�0�3}0D3'p�� �N}�cl�?0t�c�a� >gh�F>1)z�<A O �>)8D�uFz9s�?10\tj4O5��=Yc �z�/4D~t�|4=i�~`�3 =�~h@p�3f� f�C>ѧ8841xG:�FzgzOp y�~l�?$D?0ѡgl�F3?o�X�phd�1OpQq�~J�uy�D88d@|>� ``x'~ROh� 0O<�`cH `DC}0zp]3�|;2�A?3�HN=>�=I:0zև�~`�a`�O�p 'd�Џ C>1�@4��u�8����� `0�zӀ#:S>z'}68 <A�pf�C?0O8 )8D<�O<C?zҩ u'�>OГ '`�z=[a:�f�ƀ�< i��|GC�'�t QO< >0c��p}Gz9|01�h�OLMm�s�ԣ~L a�s�<j q��~l�>=GP?@OT0Ou0�20�|4Щs� x|`4zh�F1>'8d�z }�~l�> c}$z9�f�#z78D?C8pas@�52CO:��0x�>ׇz1c �g!:s�"x �0�|G}C�>өc�??aO`@G4 �4s� `0#�^0~n�Ј02C�!h���py�O<a:�#=cN=Y |���}2 88!8E�D aH�>ѓ~b  9���<<Q3|00��k��<Ix�C8�>'``�1� 7P�== Ѓ~@��>�F?0��~z�#}6��|20 �'~D?%1��?2?BO>ө�~B30�<`pSc��~`�0@=s�3G==�>2)<'@>>9©�0x|O |s�8 У~b�a�?0~d�G �ѳ>:�f�?3�N> �wvpkx����z�X�"V��1uBWWGHC�������������������������� �f�c�f��<C~Rd�@@OC8`@8 }ӏ1OφN I��0=�u hszhtOgd�z�N�N= � `�?5uh@s�?30� a�zЃp �0�A|G}(x�u:pc>O#@h��0<У5t�Oxo '�_<<hGg|<��}:��i�?6<a�4}ѡ5z�>c��08cz �`�G} w>|:2W}׃!||>�`���>� �S|C I?"<Сg}xb� G~Fd�d�?G��<GDF�>'0��a�l@�>4H3|:z9g < q@?6'=Iz�F?7S85x� С0<m�G2�a>�s`�g=0�t |2S?2G}O0G}8g1OpI39À^8E� p>֣Ft =i�s=}6e �=�0zc AzѧCx�F~@thFz1+)>Gc�чTOx��|'= Ij�0�� �<x�>O G4}6c�|8ч| 0��~b�d�!�@<�c��NL?08:u `>ѳ0z�0� �Oz�}0�3�> '= GxСSa>gx�8u� �Op� G�>z|3= A?5�|2Og��L}7/�>�p:p�<Q�>DO1��`��}8�Щc��> �Q�F8�PxӀ> 1��?3�|O5000��:_z҃~h`�O1}O���>�`�t G}�>� �?C�O!= �48`�}` ��|0S#=< 8�Щ<Y8#t@0�a= �<0�SzG8��y`�1[x:5x�CxЃ����000�� �= `<c��pGpi�G}:c�3�1��,POc�':8�d��Ftj��pI~w��t \��|4g`� v�?8>~f� 1��LCl�t'5D��O2=s}3u�x 1��3я 9Sz3� =Y |0 ч<j�c��'��@:p3}gc� `4zD2c�q�O:�>ѡc�# q@< I>�>��u�~b��x}6G�u1��Ta�210��:�^�>�=@= �x� `�xGx�e� �30xe�/8cH��f�# A0��N}�|O��<e�> #ѡС'ѳ>=!�8O�'=Àt|'}pGG y��>0SЇC}2s�;_}8<'d `�SOnph0� `@D8�>O����>5�:>9ѓ�><A }C>9p�CP8sT�><80zֳ�F3}>c�> 8Gzj?`1��h���#8>�0:e�i��>��z�>?Wk(=3:pjpi��>= �d�s=�~TX �~F?pjt��� �>`�9ғGs@ �4x���Fl�pA:d�= I0�D?5c��C `d��0 n��FoE `|>�h>=i�'�DOp }6G0�<|84=I~d:C:4|GA}4?@Si�>я >1S3O4Cx 38� �<a�|2CGt�>O'~l�s�� ���|g=�A?1|00 Q�N�t СSO<y�8D��<0�h3XzÁ!��>h4= q@841��4c��ѡg=>Џ��|8d`�“>֡C!��0�e�9O5z�F>9C� �xy��g}8c�ԡs� @3uq@:�p> i�EA!zOYtG�7':4�|�� @5X?�@0Y�4{ �tYxg@�|-:GhFp 0:�|G� z3}03}2уF:�~d`��>!:d�Fpt�p3�4�У12}2?`�3�<GE�f��>�^5|20��D>!|0gt u�:� �4��>�C:4g}8�:G�>t10��x45ߝo q�-!|0�}4}2N Y� �s�=@�|=C~``�:u I 'C1��3S@z1��30�'pj�>�>5Q?1�@e�?0Of@300��4�<c:!|1[}�oȀ~F8t D?1u0t�}|8C4O 'Sc`��1��!|}}<z~` �z�`�?>ҟ5Ѓ8� `(2�h0�~f�>Gx d�c�G8S1��3g}2t�NHo�6w=��gL�~f�N=|:C�Cy�DCS`�8ui�3c ��8f�|ѧ@ FOx�>�= �00�9s 9<0�<�xԣxԃ#z�у4�~F?0s�� `� |6pq��CxԳ a��p�  `3H���|0��>ӌ` ��S�<':<��F>i@q���v?5ѧ<y ��0�<pA q�c� a�?� !pi �h��~j�?<�zЇd� ֣>�>g8��~f�<e� ҡOp2�`�Gя L2s`�Gf�_ �x ``��>�>ֳO1�ht `>!q��0ggO��d�Ϻ2?`��}6�x�=�= h��8�~w�_ O1OtG='G=F'`�@DC?;' �xС9sx�5|'ujp�0� ��O|�F? �0')}t|CF�'�1��g!|?LO|1Op}<0�i@FE?0?FwvpkJ����z��"V��1yBWWGHC�������������������������� �}Oe�<y�?0s�� ҃>9s�  Q3 1xҏ'tS}2s�3OC1�� DS<a@�>p�3#t�>�01SA41��?�|8O�|( 8`�8tA A:4z'z �@;/@d`�O`'=Ok0�IO< ht y�~t�?2'c� E?:>Ǣ(CŐF�0Pa�f�}ѩ Ї:8O8`0t�c�4C �NN='0c@�>= at<~e�;�:sz `�d��>Щg>�p�C0z!8tԳN>�x�0|'|s�Oz@�^s�=5!<I?1_:�0�3}0D3'p�� �N}�cl�?0t�c�a� >gh�F>1)z�<A O �>)8D�uFz9s�?10\tj4O5��=Yc �z�/4D~t�|4=i�~`�3 =�~h@p�3f� f�C>ѧ8841xG:�FzgzOp y�~l�?$D?0ѡgl�F3?o�X�phd�1OpQq�~J�uy�D88d@|>� ``x'~ROh� 0O<�`cH `DC}0zp]3�|;2�A?3�HN=>�=I:0zև�~`�a`�O�p 'd�Џ C>1�@4��u�8����� `0�zӀ#:S>z'}68 <A�pf�C?0O8 )8D<�O<C?zҩ u'�>OГ '`�z=[a:�f�ƀ�< i��|GC�'�t QO< >0c��p}Gz9|01�h�OLMm�s�ԣ~L a�s�<j q��~l�>=GP?@OT0Ou0�20�|4Щs� x|`4zh�F1>'8d�z }�~l�> c}$z9�f�#z78D?C8pas@�52CO:��0x�>ׇz1c �g!:s�"x �0�|G}C�>өc�??aO`@G4 �4s� `0#�^0~n�Ј02C�!h���py�O<a:�#=cN=Y |���}2 88!8E�D aH�>ѓ~b  9���<<Q3|00��k��<Ix�C8�>'``�1� 7P�== Ѓ~@��>�F?0��~z�#}6��|20 �'~D?%1��?2?BO>ө�~B30�<`pSc��~`�0@=s�3G==�>2)<'@>>9©�0x|O |s�8 У~b�a�?0~d�G �ѳ>:�f�?3�N> �f�c�f��<C~Rd�@@OC8`@8 }ӏ1OφN I��0=�u hszhtOgd�z�N�N= � `�?5uh@s�?30� a�zЃp �0�A|G}(x�u:pc>O#@h��0<У5t�Oxo '�_<<hGg|<��}:��i�?6<a�4}ѡ5z�>c��08cz �`�G} w>|:2W}׃!||>�`���>� �S|C I?"<Сg}xb� G~Fd�d�?G��<GDF�>'0��a�l@�>4H3|:z9g < q@?6'=Iz�F?7S85x� С0<m�G2�a>�s`�g=0�t |2S?2G}O0G}8g1OpI39À^8E� p>֣Ft =i�s=}6e �=�0zc AzѧCx�F~@thFz1+)>Gc�чTOx��|'= Ij�0�� �<x�>O G4}6c�|8ч| 0��~b�d�!�@<�c��NL?08:u `>ѳ0z�0� �Oz�}0�3�> '= GxСSa>gx�8u� �Op� G�>z|3= A?5�|2Og��L}7/�>�p:p�<Q�>DO1��`��}8�Щc��> �Q�F8�PxӀ> 1��?3�|O5000��:_z҃~h`�O1}O���>�`�t G}�>� �?C�O!= �48`�}` ��|0S#=< 8�Щ<Y8#t@0�a= �<0�SzG8��y`�1[x:5x�CxЃ����000�� �= `<c��pGpi�G}:c�3�1��,POc�':8�d��Ftj��pI~w��t \��|4g`� v�?8>~f� 1��LCl�t'5D��O2=s}3u�x 1��3я 9Sz3� =Y |0 ч<j�c��'��@:p3}gc� `4zD2c�q�O:�>ѡc�# q@< I>�>��u�~b��x}6G�u1��Ta�210��:�^�>�=@= �x� `�xGx�e� �30xe�/8cH��f�# A0��N}�|O��<e�> #ѡС'ѳ>=!�8O�'=Àt|'}pGG y��>0SЇC}2s�;_}8<'d `�SOnph0� `@D8�>O����>5�:>9ѓ�><A }C>9p�CP8sT�><80zֳ�F3}>c�> 8Gzj?`1��h���#8>�0:e�i��>��z�>?Wk(=3:pjpi��>wvpk ����z��:��1BWWGHC������ ��������������������-�D>\2�>G4O00�yh��}?/4:8O,c��pGt$n��'g0��<0��?=�xУ�~`@Ox= >O �G=G}>= `{:<C�c���nf�'4�}~b@:zI=o�>@�!@ Q� �l�#�~Fx}G:'=y�N= y�Q�~P =G}:O#<y�p 0G�}0�s�xG`� �>a�p=hpI0=9�G:�n}0'}:c�YtxO i� xԡc�S��0 |'}(8t�~p�z�900��< ��>փ0p`�~D@4�f�Cx}�< <i ��= c��0�`tYϢ#20�a��uЩs?=1� �x8tS<C?}6ѡt`�4z10�Y':ugC cx|4�4z�sgzЧ:tSz|0/hN= ࣁ�>94�>Сg�>A?6�`� `�xGc��f� 8:z�41�_},<0|\L΁�Q3s�L i�d�L `『|0�8|u1:�L8< �pq�G=gp `d� A  ~`�OQ9�O>Wf� �8��>1`l� Yx��=�8e�?4N= Y��` ��7 +}gw'85D4z�~K�f��D gE |Ssx9�@0�_С�NCxg ~z � гd � � }:O8OGit�xO >ЩG | � �XN=q_ �~AA3�`2�O C>D'd�< `:0 =�0�` `���lAAy��ƀ �>gg a�'=� < �8�F?C3�4'�Q��f � Y 3:@?S�>�~p ]O2s��:�>�Sh�57�v�oz>�NCx �0c��},a�k>'�48CO8����8up3= �0s�c��G�@� 1s�? p��>'x� a�?z,x12|'=480̀>1���q �|04c�����|c�O:=Gf�0�|2џsGz9|5O `Df�z�� �!xGx�x|:'=@zG=a �1��v��>wOd�?6�|0}8'p�Oz@8t:d� �>Q#1b� ��W�5�4O4/p�~F�Fp�84}2O`Hx2�Yـ<1��> 5w=k@ �c@�@c��~`@1�`��|0Wt 8�F:v�k�Q��I4:5�thp'p��d�3g~|�I?g\1� @��<}6c�i�3h�< ~J#:e�G|c@1�` ��~tӓ~a�_ D �xGѳ~`�x >ѧ2��<9s�~iA 9�VO�<G:>9!�ѩ�0s�|8 `}:c �x� �Gp��>'`��>^ CxGC0�: Cx `== `�| 20�'0xғt 5zg𤧁@�p4:<S?:1�@@Ϣ AcGz!\؁�bHk�o|0l�3Sǀ> wCxҧx|:1�z�~`�~Nzx1 l� c0:�D2�9= `0C}2s� Գ~V �8u�N= �:pYF a`� <��>ӓ�>Gx9' �~bp�/x9p�t �/ kc��>G}8?j�s�>x�O1}6}:10O�~H|4CS�= �f��Otp S�f�s�:DG=9gz}.:5z'zi`� 1�}=g}S?:�>4Pti�?0hpCd�?4}8OF3@3G!LH<#`�=3=c8<�D?6}3}6S7|c�C842O'8O8 T?Gwvpk ����z�?�:��1R/VBWWGHC��� ���� ��������������������;�`�:<Sz�n}2S�>O�P0C0<qx֓F?|4� @HOzx�0x1|S0ѡ̀>g= 8�~L`Ox�~D`��}SuA g=C�~b�?000�'dh�G82��G�~H� � �:e�xc ���h� �h0z�=i@��x ЩS�=wxՓ>�{�ǁ�8D3�'zgz�ui`�xgQ= `:я�f�tIp|0g=`�3�c@�4GN��S�>ѣ!Փf`�:�@ 1�8D>#=�>�̀|4'}&6�9OtQ?0�9�5Sp `8c�?6Su|(x'}чz:sx���>9O�<�>O �0=k4`�Op~P 2�w>�q�?6 `>=� �3 ҡ809}c�'ch��< y�C= 1�x9G<ich ��>֣>סui�1П0'}0OHxa�x9v�/x�~H?7O hDOСc�4��`�O8<�0gh��FFDO@OX�>Џ�l�>gxzSd�OO0$`�I?1�ap~a�x�u `�>�5c��|<�!|� }00�c�|G�tp�A?s�f�a��f�`�?=>�`��>p i`�“~@?�'X � �?!�08�Щ1��?0��ge 9td� s h�?I �@xO G|�<�>'X�>9P `pQ?10P?2��f �Y�3 �R~P ``�L3Ct 1�@3��~T?)2� !0 >GuDzgCD hc�d�`�L:4x9=j4:t'32=a�f�d�x|0:49�0�c=A8u``�� zOjt s�>ң>< ad�X8F@xԧ}4c``��x��tQ}:< 7h�z/ U��4xУ 3�>>�f @�f�t G4�0�>C=f�胁1��1= `p�0�z֣>�D�>‡x>ӏA>�>�p|0�h��f�A`�ЩC�>ӡ�pг> <|1#XD?#2�}2ѣFc��#S Gd��~|�_p0g}6?n�Sx }�>�N=  a�8g=a�©}<pЇzG �6ot#G0@�~P i�d`@90�гc ��>>ҧCx> xG8 a@/c�~JC8sDQ#:4h�uA>2�`�= 1=`!<i�C?O:4@=jN\B1� яC}<���>֓O5| �s��g <y�Џ#>1S �>C�>�f�?1G}2O�| x1��N}ԇi:�@Y= �'= >�ƒf� pp<Щ~X 3}<:t�'}8p#f�c=�> �A�>'zЏ c�C��|̀`� �8t 8e��s� S}�|0c�>�1c� hpa�s�n�oI}<p i@ gp��>է��zЯ =A?40�'>'DO|`�� �0�:@z֣> ��Fa�ԡ�`�x�0�̀>G0�a��>©�Fz �}:�f�z�N=c`��<0�@ [|<!<A�f�Oc��~`�Oz�O�xGx1c�O884ѣ>1~~��Sxz}1�xЏz�^�|2Oe�#:5d�~f�O8k;s�O:��`��> �0x ��FOb;ԃ�D At A?3�g}!|6�:t Џ}c��'x҇:��<ip�ЏGp)= `f��,x�>hC�5``�1�c��|G8>O 1�O\0=�}G18'`�18�C i� f�:d�?1s�< >~APETAGEX��M�� ���������������������Date�2004�������Track�02/10�������Title�Silence�������Genre�Silence �������Artist�piman�jzig�������Album�Quod Libet Test Data�������Replaygain_Album_Gain�+9.27 dB�������Replaygain_Track_Gain�+9.27 dB�������Replaygain_Track_Peak�0.229712820826�������Replaygain_Album_Peak�0.229712820826APETAGEX��M�� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/image.gif����������������������������������������������������������������0000644�0001750�0001750�00000000225�13112005742�017560� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����sssrssrstt������������������!�� �,�������BPIBXا7JU%+^Hd㳾NV2r @]`]A(اI-AmC"�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.spc�����������������������������������������������������������������0000644�0001750�0001750�00000201060�13112005742�017475� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������SNES-SPC700 Sound File Data v0.30eE��Game Select���������������������Super Mario All-Stars�����������Datschge���������������������������������������������������25�7000�Koji Kondo�����������������������0������������������������������������������������������������� "�= e������������������!%`+%+tò���@�����2��������������<�<������������ �����������������������������������������������������������������������������0����������������������������1L��������Ja � �������� �������������j��������)����)����������Q�Q����������������������������������������������������������������������������������������� ����� ��������������������������������������������������������������������������������������������������e�;����������� � � ��� �� ����������������� � � ��� �� ��� �������@�������������������2�����nA�A�A�������������������������������������������������������������������0������������2�����n�A�A�A������������������� Ͻ�]��=�=? H?6` ??<]?��S� iMLL�]�EFD\\kk�m8`CC+?.�??????iML \LS`QQ ??_G�G1?== G&?_G&/��u���oʐ?" Ȱ$G(`P`a`\�|ՠ�԰� G^ GEԠԡ aa`a? ? �4 zM�]-ݍ�z+/K|=  m!z!z}\?-G$��o$$(?++(��no����ŀ<́<ł<̃<o�,?<?\??�&�o�&?͐Z�[Y? \_�ZYpY_ Y�_ohhhh0h(o_HF���ԏ�Go�@:@-@:@o`h"hh h hh�&-?�`]o@ HF�oGG$( # ?{ ՁՀաԱKGZhTPB_Y So �__ Wn ?_BB?B@/0��G1 �?" �Ԁ-G$ԑԐp== G�^GD1npd? ? 0011/0 �? 0-(>(>? h? /-G$?�pq/? ?g == G_< T VzRnTTRhdz``fzbnhh`jbZ\zXnZZX^�G1?( == Go - -\ 001o`_`�=$G:M}\]�(8 HH� GI/GNI���=! oQ(1�0oԑ-? P1? @Aoհ? ա? Ա�ձoձ-�ΞDo �XoZ? [YZ? \o�RoT? UST? VoPoա-G$o? ? o/�ՐՁ? -G$�Հ? ՑoՀo��oԐ-? ? o-G$Ձo@? A? Ԁ0011@0A1oJ? �`? �bHoh? iah? d? jch? fo`bHo? ? N? ]y?=`DoM}��dM+(HL`LL���H l?M}?H<m__o-G$&/D0h>G$ ? n/-? ? ԡ? Ԡ? `P(Հam? pqoa`okH�-�Do" {   ) Z c , 0 S | Z W ���� �? # G^/`?G/?R 0? G$^I10}\ed`dP!QݐH?�3o G^M` �/ ? oqeqp\01�00@h?h)h0m- /# 1-0/A-@/-/G\?/$G `? ? LްD�u/ @� `Ա`ՠHh(/ݍ�?2_qo ?:10 A@??} ?  qp?ްQ`_? mQ�Qz? zoQ`HHY!o� )4BQ^gnswz|}~�������X !++43�,< MlL\=-\acNJHEIKF_e , J *Ver S1.20*���h/ �^���/^������1�o S? /9�(�xC�x�x� xx x�� �Io_ h� �\?�ňĨʼnx;xC JJM?o �ж,-/Mx \?��Ғ( JJM?�Ĩʼnň_" o.�X:,�,0*/�:,,0@?:,, ]A?}/ A?:,,hnh8hHh_??r/�.�?/e.�\?o�:,,D??r�:,,ĩ:,,Ĩ-:,,D? /�:,, ]@m?=nm)�(_(xxx #!`o#@\?�ŌĬōon#:;/7���I=?�ĬōŌ _" oY:�0*:0`?: ]a?}/ a?:hoh9hIh/ ?@?r ?/e@\?o�:Џ D ?@?r�:ĭ:Ĭ-: D ? /�I=?�:0" ]`m?=nm-�,_`(8 HH�l?@I=?/ ]Pm?=nm+�*o-\�?L_]]T?=n+=*o ��� \?( JM?�& ?" �'ĪŋŊo%hh '%&hHo&'� \?�ŊĪŋo'��? ?rJJM?Ī� D? o ? /P?Q?oĪ�( D? o�,?<?\?�&�_`? a`�G_qh_hh_z(%(hhh hLho__耍\?�ŎĮŏo0 /Ex* qD�˯ˮ? /]n ߏ��ĮŏŎ_" o?D?�˯ˮ? 8p?8q??r. 耍\??o ]pm?=nm/�.o耍\?�ŎĮŏo" ?on O ""iD?/#��ĮŏŎ_" p?q??r. 耍\?opp� pp�� pp�pp�jpp��pp� jpp�jpp� jpp��׸pp�jpp�jpp�pp��pp��00pp�jppp�jppp�ppp�pp�3pp� pp���pp�ppp�jp%f#X#$d$"%!q%!!{#{#!E%%%�&��$ [ O wN"cN >#:Dr[S��nnv~n PV=FfwN#+#""t"��#Z!!A$"$#!$p$!!""#####$#K!"("A! !c!ARB.8;V}ZB81D!![ F�F�2F�2�2�2�2�P�TF8*TF8*� 2�� P P:,0�<�� �`F�` 2� � � � ���o�l�2-+(&$!$! �d�88?1)FM#88?1*F88?1)FM#M#88�P� 88 ?1 )F M# 88 ?1 *F *F0F� 88 ?1 )F M# 88 ?1 *F *F0F�F� 7�� T�F�P�`�``�``�``�``�``�``�``�``�``�]� c�ZZ� Z� 'c� �PP� � F� �A� P�(2<FPJFPZdZUPKIFDB@><72-+(&$!$! � <�<0F� F��� �F�<� 0<�0��F� 1� T� �Y� P��8#�8�#��8#�� 8( �8 ��*� x�*� x�*� x�*� x�*� x�*� x��F� &" $! "'"$& " "'"$& " "'"$& " ��O�L� K�F FF F�3T�0�3T�0� � F� � <0� P�� F � <� 2� 2� <�  F� �P� FF$$��     � 0�0 �� �r$$���  �! � r�$$�� � �! � 0��0���T�<$� <�|��T����(2<FPJFA<72-(#� �2�P�<�(��� T� �TF8*�TF8*�TF8*  � 20� (��2� ��2��2����88?1)FM#88?1*FF0#M� �T F88T * *0#�  �#�`�T�(2�&-���� F*� <& .5 <JO6$0� `� F??F*?811#��8� T� � �?��8� � 1�� *� � #� � � � � �l�88��KF�H�F�F�� T�P < (  �T��?�1�#�� � T�#� � *�� � *� Y��1� ��1�8�8�TF8*� * � ** 1 � 11 8 �08� * � ** 1 � 11 8 �08� 8� �48�0��8#�8�#��8#�� 8� 8� 8��M�Y�Y�Y�Y�Y�Y�Y�Y�Y� 1� T� �#� � � A��??�F� F� F� F� F� F� � ##*� � � � � #� � 1� � 8� � ?� �� >� � >� � S� ��F�Y �YYMF?8�*##�FF?8�??81�F$�**1##188??F� 8 �8 �8 �8� n�'n�$� d�d�� 8#� *8��@@6@Q@6@Q@l@MAhABBBBBBCElIElIlIOOOO \;\nnCuCupuux[xÂނTT007vv���jjj/j��&p j@ &� j�  j@jp�&pjj UP�2e2Ler��������1 �z$zB�C ��{4.�����������z?1��@!�zf{?�1����������$] =pBԒO/ 1ӖNԖ 0 ܿ0 :RӖ&1o02/A�4@!>"!?R% `P&-AB�5.$`>#U O_/TT~ҶB0MnNe# NB0/?/3# ?C1��������2#�>! QO"01L+N}1*?C-// /@#/OP A4,*[+k.",<"2�]z]ӣ;l",z,ԕ/P2�<0>/Y.Nz<NĒ*]�M0[]?-z]-?�N LM0zm�<?�>1MM@{]<>��������A1DANC,!A1DAN��������jDDUUUfffzC4C4CDCCzDCD3D3C3vUUDDDC33jTEDD4D33ZweuUeVTUZTUDUDEDDZCT34C$B$JUUueeeeeZ3434#C#CJVfUUdCD2:UR"ܬZZ̻ZZF˼JZjjjjZZjjjZۼZ#2EUffjDDUTVfffzC4C4CD4Dz44D43D33jwfeeeeTUjDUDD4C4Bf4TDC3DDDZEEETET4EZCD43D#C#JVTveVeVeZ33C33C#3VVTD2!:4S/ZZ̻˼Z˻ZܼFJZ̼jjjjZZjjjZZ"DDFVgkDDTUefff��������� ,OձOKO / 4!�� [OſM߰N��.2,l԰�Z#.., 1@N?1.!+>Kn%/1O�� ??°!�,0/O>-.,=@.%/ ��İ:`дO�E--ĠԵ2/?�N�# M,K? M 0* /1<:/O.l:LlO]a;�"ޠ,= -m[\?N] ��?OO:% /?ÐL0>� -.�ϐ%0�  CL00_>!Ґ !Pр)/�@M P>0,n/� $[�N.�;ҀK?2�pL/"3pD.0..�.p9~1p<NNm !1�p/?�@/�M!p�L �@ ` <N*[p]R!p0 |?NpNp�?`2�"p.`;j-!`<?`0` Jp` /`2n.Pq,`�-`�P"*`1Pk>�P.\N�P>>-L>@a @,\ @"L$@@N#�0,_[_0L=0OM0�l@.0!�� . ^! 10 1�! M.O@n �OP �?�0#�<�!�. ����./����� ��������������������������������������� z-]Ν1zB+D$!vnc̊/E.0 5-/"Q 0� 1.UB)22S/F! !�" �3./0͊U2%0%OߊcΊT5A#?̊�B�# 1&PBzdEgPUB42݊�?zE�14->/"/!#&"A51 " ?Q�5` A�Q>`$ GM3?%"/34"Bϊ/*". C?F/C7aA.ъ/�"�� P"e�FR�"WAE?� ﻊ. 30@d�!�$e%.""VA"z D-͊��켊z Sz1BDS3zAv5fU0#EB�z2ˊ.�zDCz435gS4$S!!j%CW-� Ί zBzT?z#!5EC2zECDCjd$2"!z�Uz˾ڭzj#3Rz�"#3D z#$C3Zgc4AC/z2$1z! zj�""z"#Cj5DVEUDz� $z@1j.ɫj/ܙZ!!j�"EfBj#C3FfCj# 3�Vj@W@ʾjjܫZ#/j�5UTj"!#Egej2"#Fj0V@۽j!j캾jj3ESz�4Cj!D2Dj/VAj!j!ۛjj#DDz!��DCj0�#U23j VRj#zj�j�"5Tz!���D3jB�4eB2j!fRjD.zjj4Uz!��TBjA 5v13j �WbjF/zj j4Ez"�DCj0FeB2z41jF>zj ˼j�#4Tz!�4Dj0Fu23z�41jU/z!j ʼj#$Tz"��ECj"Fv2#z�4AjV/z!j˻j�$Tz"��D3jCFv2#z�41jU>zk˻��������D��C eC "�S ��������z�0!-z#%zm@B$Dz"z@�$#""�#�"z!1݊�!T?z=BڜP�!F"B݊U/g,#33"D/DR̚C Da�g?&de #D2̚6@$2C##!ʚG_513#!�ܪB? B2"ݚwO$>A21˽ VO%?12!�͚U?$5Aڰ43"1B4F@1D/�A��ݚW?U1�"ݚe2u 1"!켪C!A02 B"/ܼ3" B1#122#˽B"!11ɮ#$Aʾ$2"ʾ3"3 $ ?$2Ъ#"#?##.24>$2 VCF,E# T "# CTS2C�3DU0"��$0ݚd"6c"�0f,16b1 ˬ0sٿ" G^40.30!�4"#1"D23 !B!쪾2 !� # !/۪#!"�""ۚUC E  432"ܚfBCDB C!� VC32 DB 41FBD25A݊WaʫEAD@51̊3VOݚE0EO#40C5.E.D#C �"34T $C͚DA3"5R4BݚU0D FA#U?ݚ$e.Ce?$eݚ%t$Ce.&dܚGc5A%TFcܚFbEAERVR̪4 3?DBg@͚f0e/U0f0͚d $TS!ۼu˿&T%CC!۽&cߚ5R6A�$B5SКEBEA416B�DBE032E1�D1C�D U D!C�3" 41v2 u3 3!�u!!S/" 242S2�""B!! !�#C# D!B1#B3D!zu"2#12 D!zT"3."#C zS!�42�#Dze#C.2�Dzt#0ڰd.B#C zf$1ٯT#.C$C" 2� 2$.24-C#2�1#�$.B4>C!3 1#03�$.B6>C"2 23?3�#D"3 Њ3$ ۿC"!#D"3 ъ131ڿ3"#/E"3 240ʿD�"$/#!4E?ʿ4/!�3/""C!E0ɠD"/$/3"ЊE"E?C#!3/3# "!""4/""" К"2""!D#"" ߚ#!#"#.4.3"" ""2#""4.3"" ""2##!"3.3""2"2 #.!4.32"њ"2"22"4.C2К3!2#!"4.4""К3""3#-34.32" 3!333"DD""#2"3""DD"1#2"3"""3.C"1К4"#3"24-D"1њ$""3"34-4""2"2C3 2DD!2њ3"2424D!"њ3""3#24.423!#3"#4-4""К4!#C23442!њ3"#4#2DC"1њ333 "-#4.4""3!33!.25-41"3!33#BDC""2"33#"D4""##"3""4.32!њ3"2C#2D-C"22224#25-4""#"33#3542"њ3"34 #34.D""њ3"33#3542"њ3"34 #34.4""3"3C3C5=C"23"#43E4"232#3#2"3.D!3њ3#23#2!4.D!23"3C3BD-D1"њ32"/3#2D42"Қ3"3C324.42!К4"3C$34.4"2#2#.4#-34-D"2���������h^1t S.F�!�� 22"CGk CL2Mn"<`2 #0E+m$ݨ@-QN�C"3"  ܴ$1 Ϩ_.n1и  T.#̨QS B,1Ϩ&-RNC"/=D,Q-e#. D?Ϩ!0T @"A$ # A/B 2>C^0/DV.PK!##!d^C+��?�21d3 L%r4`&@��!Pb 03ޘ> 6O<DZ�.AӨ  ; Bae0oV!.0ܘnC%M9$S%ܘB # RK//  !S4s#5T|1.N!?2#0ޘUR/D!N2._# " A^01*<ΘA%;@dO0��_G ?D̔.&LaB?2�-e?Cި 1$OB�T/.C5/a"4 O"��1.t&>D R@Cc#ET0#6Ϙ"?=A>$="  132&+CU,uE^"0"b aT.ӈPCsU 2"-0#!2!-!+A3 10Na O܈t4FD4@0/0 "Q?!D!"DBdoNM,"!,F!./"# $ !>"1�јSD?vb oT-@@2 TE>5/!0=QFE20?M,"R#O#/$eO-1"N$ 24  D/B/ 1# 4�#"�# /AҘA /!"@2 /=7AԘ-0- &< D N3�3� D,!�.Q Bވe1#"B�5= ܈ $O324!$>!0 #˘C11 <1#3 b2B>TT#@ �21R31"A߈�5.SR,^DS`$133!1� ̈e 3 0`333 .R12B A@2#��3@&.Nu A.R2 a0N33?.1005,/B%?! ݈-S? D?5ш@0�_ b%B#!%.�E+N#/2� cC##PЈ!1�xTlA1"$14 .x N`!2A4x7<"3 xPۯ3NC -x.1Rx6^bxOU 13x%P/xR/3?h0&S2BxO/x/. 0��x$4/h2,6-x 2?-"xB3x"#.F xA x?"!6xc1xO30x/e#x.=xOxR=1x2/x$?0!x62�x6x>"<Rx1/xCxe1x".C1x@ Sx?/�4xQ2xRxS ^x !Px!t !"x /xN!x�Mx"_x#�x$ x%- x Bx>xE 3x"x!$2h,bx!ChTDh?$=h c1h_?h %<RhrTh?1!hV?oh Rh"!rhOF�0PhCd;@h!A0 h.^Qh3 @hC�0 hE >Ch�52h &^h0 hQ00hF."hRhEh-. hn ���h!th-E/d%*hA!h$3�hP1h/EX6 'h0"h-C �2h $/h # BX !�hO.h3/h!4d03XE-!h 4 d!3h2h20X2_h2!!X@SXEbTNUX 4 2 h0X%AdX!-X5P!!TO$ X1"F!X.cX1.X 2 X#2X1CX 1QD"�>qX0$TE X/1BX 00Hd!XX?# /H,}3X"$.Dg"#X"$XC  D`"X3 X/.X"bX3?1H�`X��X$��H31OX!� 2H H!OCHSڰR H  #H ?SH#�3H$OH-A "HB1H>2BH�!0H�/,H AH@3D1!8WA�5 H!% 8# $P8PCH B 8D�R H2#88%,?.H1 ��8/dH#�A( 8&+�H 4"�HA��"8Q 8#48%@(*N8B�!82�(q@Q81(B(@";(nW(1>(c"(2A/(P> (.$1(�� " >3(�$ (.!1(20E @61#! 0!!$!�$ P0�!� 0A0�1@"�/��" ��? ���6 �-��O�2�� 1� 2/1���^ ���! �CB������5D"E�����2#C �� ����"D����!�����B��������2��������������"#DC#4DC������4�3#34C!������""""�#2���������!����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� N:J��"2P0䖰vRdPp#",0? ��-5? _ +,_�P �<ݯ@/R7ִ ..+V墴/M*OE+o __ MP!n C2ߤҼ Ӷ?�2<.jnN;- .?ձѲZ/- ./D/A n4QM͠ ޤ/ ...�� Ф -"  &¤ !"A AO�?4"/>?M;B23D$32=nZZ$E@Eϐ3/"*E 0RTBM"BO=@\T~2 ۿ]N1�A!͐M-n]D%fE;P0@ [\L !.,2`RNN=42_U""@a  0->A"N =C /A�0=ߔ].�1ѐ1/DB� -0---OO.&-DM23/��- 0<O>0M� ],Pl]m /"c`B $D0τn$23?!߄k6C$dF4WT%Ѐ/3]t1">>EcR=O  #EUDS/!?2B�ھ#�41 "tq@It@p $Tt`-1/"tѧOK# -/tL!.p�dtlNpSQڽdo[ @p )Bt/ "t <.+tC=p#C2tB�!=``" UTGt",�tp��`S#$PTd4[d Akd�/2d10d ."0d ,d=L`�PD"-+-`$-PA,K,TI6@QP P �0T%1Ed/TPO2P3 4?2TNB�\PP?P #13OP/P�DoPVT"D4@PPDq+4n*/D"@,D N/4N,<D+1.4> >B-0 5 Q!4@4� ?$`< A$- - /S  !�3 _nk@/ .� ���! @����������������������������������������������������������jaͯ jjEFUuCjSݯ jj55VTuDkb͠ �������� *  �,=L��/6Q ?@@>1�= &-^-, >�ܶ>//tA^�,"] .?=O�>� /n2a_1�1NMN!A/ S>λ=_ao1>Ŗ!</� �  ]-;,/>Ѧ;�2K��MJ+%C<3ݦ�<�Ñ MD� zjЮ . NҖ-; ϭ> //0�.�v,-M0<񲰆 , -$@vjʊN-;�� �,-�Ҋ01">>N"ÿ -  -�<�� ,��--_m @=�Ov:.L1¢<.[. -.^^A. ?��������&.?=".LO Y�!�2mi[-_!> %ݲ/n=pP n�^ LԶ_.**[=N!@Ԥ@@qn_¶..!>?+ݦ!om _J�OQ泦?1 nͦl=L>=2,2@0 @!-[ NO e'nʮڢ _��- ODF- @Ѣ01 2�/k_" á?!!]=S,i/ NԴ+00N.~!2.LB 2"1B@?Dd0г=}*$L �fUA-\^[#9%>@">/$ L$N- _ >�<!\[]$ʮΒ1O$. ?߮,UTBb/.]!!O!3�!,-.,?+! %/ ; .& oKaJ$. m�?�N;Q1 C^"$4#A-Tg6 >>P0#/k $  =-!= ,!*ߦ?k!/>ݦ>,#":L/.1NT0!----O/0@O�=P PN� @2�^1]]�/� �"0P1Ң Ж!_/>`BӒT0@�"..@"a!, ? 0m.3n CeNQ �1/ . 1=>�BSS/ , 2#LN20+>.#\ "M!$=>,A& '-M�,+C1Ԗ.M䖣�-02M� "#-#4! _LO K�" $!@0#ݺ㿆3 Q =/$0^0!A^M@+P1�EB/N,N/% _B #2!A/OAЂ0/4�˼0�Q҆:#/v AGĶ A1v]Wz<$v+|?>ON?#reBQ$-3v!@J-v!vP-aІ!/r M/v ;T�@"rO�2E0_/��rE!RvO,�v3 v> v"/.v/b0/FQrrͭv3v;"?f?[A�2f! =bϝ›vM�$b/@3fA=bt?f�0L�Mbb%b�Rv\sbRD-޾V O3@3f?f# f>"fM�f@ f!@/bC1$#"fMfA�>2V\< b3V>V=,Nf�RAU3RGT+0əV03CV! 0@V.  V"AVV>AfV1�/1RT��R$V! -4�F:U R�CܼR1�%UCRT� 2V#! V@AVBV"3F`4V A�FrFQ4F0rF GFP!"!V 1!F0t R�3#FrV4FR�2F@q #FBc Fa%V AV3Fb�CV A�V3Fr�#V A�F u FQ3V AV!2Fq3V AF1e Fa#VAF1eFa3V AFAe FQ�2V AF1eFa3V AFAeFa3W A���������,.,1"#"^2�s2"""2""xED4342#"�M�2��!0tqd3"�/xPpR�'$ 2"�$?"�!tBe$5o%Dd$BA# ChPB]C>x�>x-x޳xxd/d ` !hKO\dC4ARBE3dA$>F�h-0OBhA"dDQ dC!A3?hSF O=D�dBAQ$332X"]%?@?T#T#ݴ/D !D-BD00U4H"d$^H>bADQ3H? XXXH˽H8 ( 5#823$3283%2B$2383#3"C"@382!B"""!(CD#$R1$#7vCSC2AC1#"1B""%cU3UcC$$3"B$3"���̽����������������������������������4->߈5�߈=/2"2RAx#B3�x멻ax�!x"A4D"dxCB!Uc"x�1?݈�x413D$5tD22""x�x d1x2"C0!3Dx2TfD@=#hd">@9ܼxx�h!P@x#4U2T2Ux!"!4 xxx#0"2Cx4CCC#1h@!!hhڽɿhAx"231344x4""2��hh̻ hURhV@!%UUSh3EC32!#h4 h˽h�#h$34EEhdT53C#"!X" �= hݭhʽ�h�"3%Dx"3C""h1!hܻh�XACSDTh$433!2d"3hhX%Vh"#D2D3#Ch4!"!"Xά˙X˛ͼX� 2h!"33"433XUUceTT2X��hX!!X3$CTTXTE3Uc333HC32ͽX̽˺Xh!#C34XeWEE333#Hv!ܽXH̬X�33X4$EC4E45XU4"!X۬X̼X2"C3XCDDD33#2HVvVU#2XXH#D3X"DC3TCD3XC321�HܺͻXHX14C33XT4C3533"H#ۻX̻H!H3TEWgfFeHSSC4##""8#H˜H̺X�""34X3$3C323"HE12H̻˺HH#"3CHBDDDUEDeHCST2"�H˻H˻H�3243H3CDDCS338uRD22�8 ͻH̼˼8 5H2FDUUVEeHED4C"!�HHͼ(<!2C83#4D5FEE8vUVeVeUc8P1 ޼H8H!"2C334C87dteDD$"(5ͻ8̻8H�� "##BH3CC433#!8D1!�8ʻ˫˻8��(�!@e5EV82334CDED8cC3C! 8ۼ88�!"C3D8UFFFETDC(dd#18(ʩ( $8##3CBcBS8cD3S22 (8ͽ(��$(BDDcEcGF(DVFcED3A(1�8(."(#4DVTvef(f7GCT3B(� ((޼($"4D(TTTuUsUS(R2" �(ۺ˻((##43(3CBC$2""bC13�((�#46F(33CD3C33Vd3R뭼( �"6#1T2dFFFftdVCE1@0�̬(544$$SCbRCC$!Q@! �1$"CRED64CC3!1��1�A##4%"!22$!!�� 1R%$aE5T5$C3! ���  ���!"#$25RB3$����##D234"3"!43#3$3CTD4RB"�������!! ��ͼۻ����3DEEUUDD42"�����""!�������������������"�����2"!���ۻ���������""#3�2""�������������������������������������������������������������z120ߖB #@%ߚ�?ϊuBc#�@?/�"$4O4p/1�#�0/#@#z/UB102 _5, �=> #sU� 1]?ٚD='An�� =!\Ѫ0 P/ D"3$ Cm 3L Ϛ1%+*G �!B �"2��? 5 ,,/�L4�b00Ѷ���� 5+���/1q/� 3C2JQҺ/.�/Զ00, �2���J��N����@]1N�{>5�/\?4! V�,!����m5"벰 ϻ 2/\1��" #a,� 2�T��� R"!0?0-2/1!�2n�O��o a��C�R"�>PO- ��%.!��. ��,к?���1.N?�k �=D�Ϻ?#?3  B .��^ ��O �*��"�"<�,4ү"[ ]=4���C.��+R2*Ѷ�>c�� �>  "�/�@?_�6, S$��3A�R-!��L�0���l���1� -�/A 2� 3�!� �� �%��� N> P#% 1� #���������l;˴2.>�ߤL!#S�>YQ10!/1ӴO  !/!0SQ?10AC/<"S 0?%dN0Q�/-? ,ӰT#$ݾ ?,`1.o = 0 Q,$?:@"2!3�B� 2/3�2 3o, / 0Z!ԑ%O_PL&U$AE=E$#A @,.<-C 50!B/3/CCn%#/_-!O/A!" N B\O *[/_Z #0\-/,Q]2 ? .0ް/ ðT?ba./,Ԯմm@"$D/AB=�F ?>_L+!�?P@B<Q�>? 2^"ĥO ?S5C$/,L=20"a /Ӱ 0.MN>-A0@ д=MMM=N@ !�C5!ONQC@!/a0?><=.DD;.M0 B6O!1߰B@ .A/ \=35#+2C"4D?AmN@1�3 Q=а@$B1�C!#� ,1-1KVD_/M�]YJ!.??@>߰/[<-l0mQ&o"!3��/_=0?#"v35.,"Z[>0$#N<-- 3/O >-R! �- ĠR.< ,٠C@>@.! <&�EO0.-"Π_>3A !%4CP>-� -� " ? <�/ސ$ 2ഠ2//AEF.!-^RFA>.JM= $/ !#�@l9Pa#NsNT< ɠ"`R@1>%?5 1 L ! =!$"۔/L =`"31a$-#<^TίN߀/2;1CdBU11]/ .B!A 1/o-K2W$U Ӕ+ AS"!/>33No=K!0M -p  A��-� !2!<$ O+>31  QB"P�1�>Op�;ppppѐ1/p>CL4?%$p�.?pA:p%.Qt+L4p"p?. >4p%$4.p �+-�p`�? #!O`. $`4Ap 1 p�.p!B�"`@  `%�2d1=Tm#ud`�P 1:_bPt1rd+P0P0>_ PP,>>�T 1P�.?@@ E@Tq.N@."4,\aJ-4� /"Q00 ��4$+R.0?$ $. � $ 1B ?, �"�0� 0�������������������������������������!�A�f ̈q���"���"!�����hm$42#BX2ChX@P���hNm t<X HDH4MfE"e5X"A?1H� /H �H H>H1_ H_/SL1D 5*Vx`���DD���4 Z�xb����HB*[X�X� 4DC!!x7z���X2hXA43X336A3@&X. Xx�#CQ,""x2  XXhy] h?! !$N�=6���X?p2 ! 1! +�FfeDC2=��>�bM?��]KD1��x" �� R�h1@xO� C" Q?!*դ-AO�4?&������@>>OA&P/> 41ۻO2!� Na��#O�."!huh̼5�Om%%Etx�!�� N�hH ���>."F^5#$L!�1 !��] #x@"#b  ,Nє$�5`6R4є !#0C3,^�/-;P$�!!"#s3”!B@$ ߈ô 1  / A!DҔ/!OΘ!0��� �?` \|K>xS!�� t"#��DUD2""N0!@. E\M?2Ф/Դ  @����"/>0=��վ*J&ӈ2=!�""?"Δ@?DA !O!!0@宴/ _!/#n)�Ѽ-._^1;!?#�dZN>Ӕ�AR; </ ,.#!< ,[C%%2R; /2-�¢ݰ �!M=.KO��"[1P2O >de1" +1\>\1!$?A# �1/=5<!O Ј!x==, QDx/ -m_ @CD33S%5!x x�t!߻x1ݔ""1  ,do$Mބ, �>^5",">4 !O  N#� @x�\M0?/\ �@ @:t6a?-�!>xRo{*N xox�OK��̈́m_@0�0 >„^M>� S0Ĥ�  "!�;M;_<-Tń?LOPB  t?l5ftYrN&A1/P0. p.�1Ӏ ̄=t;t S`$x< ,t//#$x=> t"/M"d63 ުx. A �C, /tE0&ϻxL-<]t*% 30 M>/݄�Otc>D�>?>t�%Q?xYCt2Mt h:2>>tD3E?!Qx{>/hmM=t Ot #"xLOdOE1ed3l0d �h$4:dD$x[�xxM0#f-# !��t<ބ@"@tRU dvOd >Nx.?tO2te?Pd3�< dڮ¢d/520*xD;Odt /! d3M{+t*t-#>2dA=lt�-xE/t!<OtB"�d[-&d ]2="d�d=<$�T7bNdNdCTd/�ݳh>!?�Md4h?,?d1d^?!O?#Ld.@Tl!d,d hM>X# d =d d"0T"=2 T� TT�1�.X[{dB#! �T?. T;h>,?X@Sd ?�X^n1<.STA3X<-dX.+^h�/ dO TD""4_T<K9</HQ/,T 34$OaTQϰT]`TD3??X# >�T,-OT->!X/OT TL� TT�H>5X<\Z0 H$ ,֑DE#5OX=A-TDJE#bX!�?.D@! D D`?&H�N DC4$D 3@XT "H0;"D@!2T� �D =D H>�MH 40l,H�>OD? �D @#D223D<\D�0H�>,T<?D<k?.H-\1^D4:>0OP4 r<4м-VC8.#4 Ͱ8�4 D�0 #T_�DLmP@Ca .?@P"3#D0=4D24P4.?`8 44�44_0r4D�4QS/2 8*?> ^8?/4�P@0$=޲O4!$^@.$$S_%.aA$M0n�(="4�@ 4O.$E�$_�@$11>N(O�..M(<.-(/$.45/20 $E!#-M<> N�,_�><O�D@R � - � //`.? � ��>@Π��@ 1����!@O"�.��@^!1� ��004B1@20���P���/��������������������5TDD�T4"!��"3C4T�EDDD!�����������!"""""�""���������������������������������������������������������������������������������������������������������������� .<xS2$=� + �2,@5@@/B@Q�b>Dm@,$?"- .4$<˜=A##=ҨϘbE @4?5!"ߘ" R?F  Tb?=?͘s.AgB�Q!! "^ވ^=\"6E=�2!%��$  .� !�BO 5 3.! !2!6!V@5  1.>S�-!2R!�!""�-  =A-ˆ_NG+c3$0S�܈%]RΈ4>!A""#-!3Bߘ"$eWnT�3-P�C"-���Ef7l@A+ >Έ#PCNB� „T�;$2�-<xg!S?2 x`VA; �QC[$0 DA Q߈!W?T?@ @.+@ /" "U 2, 3  $  4-2>Q!Q .3-xU.4$>ވBO@�BO�x�t.ֈN>?E/D2A3C4"" 2$B-Ax2" <x./x&OO!1t@!x4 R�xL~ψ$. xT1@x!$ xT/xF?bx3 40 xV2xO x/߈D !�x$/# x!Ot!6<b�x"$.TxA/x1x� $x `xw /Ex0F >%x/"x"""x4 x@Ccx##1x 2$t%+S x!x^$"0?x%Cx #4x�x04?x_2.CxD2x#h G=x/2h<ESBx%S h@$.RxBhC3hA fS0h2"dSx1 x.x"x1xf x$?!x!�xx`E/x312hE.ݻAht 3!#/xB��"x2%@de_ x"h ?/hQC2!h�"C20hB0`h5?ʮ%h@/6x/"hf?BxSAhC�̺.h=!X#�5 %ah d3!XCEBX@h3.h?ux"Cx1""h#ܿh!��X&N"!hS/4hE1"�Xh�hA3h#2#! hWA6Tx"hQXE@h !�$Bh �%?h !X !h�" h"$ChDACh Ah��X"�.XCD/"! Xug3X&N3hCh��/Xs4 dX�"gBX5?#!�XFXڼ�X>#DHc$e$T/hBX# X2ܻAX�B �Xe 5D2X34?X " X!!H�#33X!�" VQX�5QX#0"XH01X�D3H/6RD?˾H't�H ۼ˪Hd H.EUB2 X!43!X3H3ښ!H/%B!8QEX"  �CHA�HA H Hv%!8fAe2 H28ʰ B8#H A8e30T8C20HB8-%8_.DV`8EcT n"Z82� (ܾ@8#S("vc&U8VO8"�8?(#@8C#g=8!B(1(/(23�(S WR1(1�$1%?(( ߝ4(C1" #D3(E>( E  !(E (21.$T "�(� (�! �EeA(1��, 40230�� / 0�/� �3"3#"�-3P�� .$����� C0���3"!"23������������"# ��!������������������������������������������������������:!":1Jn""J5 J̹&uDJ31 1J�0$JjC fP˼32Z##0�"zTj2j#0zWbj"4�j3!Ί51j"B# �j"3!z�5bj3!!��j�$ Qz"�Z�5SB?���A��Z=#Ue3?��a����j0�342��S!��j/�#E2�FR�j�52"zǚT�jC5�w �j�Df�렪4��j5wz!ڬ%Q��j$Vz!��ۚE/��jP�Dz" ܚ50�jO4{# ����.9`‡��������������222� 7 { |} { |} { |} { |} { |} ɪ { |} { |}{H} { |} { |} { |}{H |} {|}H${ y { }�d -ɒHH0H $�2 = = =H0 0 7 9 ; =?0  ?PdH $�2 = = =00 0 7 9 ; =?H  ?PdHsHHmHiH 0 d mH{H}H~HH $dZd }HH $dZd }H"����°�����������������Zjê�� <<2���2 )� Ɍ Ɏ ɐ ɑ ɒ Ɏɓɓɓ Y _ Y _ Y _i Y _ Y _ Y _ Y _n )A ɓ ɕ ɜɜɜɜ ɜɜɜɝɝ ɝɝ$A ɜ ɝ ɤɤɤɤ ɤɤɤɤɤ ɤɤ$A ɗ ɘ ɡɡɡɡ ɡɡɡɡɡ ɡɡ$� ɨɠɡ ɨT ɪɭ ɴ ɯɭ$� Y _ Y _ Y _������j����`������`��� j@������������/��������/����������������<��F ��� ,���������������������������������������������������������������������������������xid6(������ �Nintendo����0��j�3�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.lnk�����������������������������������������������������������������0000644�0001750�0001750�00000003226�13112005742�017500� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������L��������������F�� ���KjKj g,�'�-��������������������PO :i�+00�/C:\�������������������R�1�����B8�Windows�<���:B8*����������������������W�i�n�d�o�w�s����b�2��'�Y>+ �explorer.exe��F���@ O@ O*����������������������e�x�p�l�o�r�e�r�.�e�x�e������F������������-�������E�������������C:\Windows\explorer.exe���C�r�e�a�t�e�d� �b�y� �R�e�l�a�t�i�v�e�P�r�i�m�e� �.�.�\�.�.�\�.�.�\�.�.�\�W�i�n�d�o�w�s�\�e�x�p�l�o�r�e�r�.�e�x�e��d�a�t�a�\�b�i�n�\�q�u�o�d�l�i�b�e�t�.�e�x�e�!�%�S�y�s�t�e�m�R�o�o�t�%�\�s�y�s�t�e�m�3�2�\�S�H�E�L�L�3�2�.�d�l�l�����%windir%\explorer.exe�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%�w�i�n�d�i�r�%�\�e�x�p�l�o�r�e�r�.�e�x�e����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$��������� ��CBg (#������ �����1SPSXFL8C&mm����������.���S�-�1�-�5�-�2�1�-�3�0�9�8�6�8�7�4�2�-�1�7�2�0�0�3�6�6�1�3�-�2�5�3�1�4�5�6�4�2�4�-�1�0�0�1�����������`�����X�������xy-pc�����������n cqG#^AF�'n cqG#^AF�'������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/silence-44-s.tta���������������������������������������������������������0000644�0001750�0001750�00000235274�13112005742�020646� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3�����TDRC�����2004�TALB�����Quod Libet Test Data�TRCK�����02/10�TPE1��� ��piman�jzig�TIT2��� ��Silence�TCON��� ��Silence������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������TTA1���D��z�)RLZ��RZ��Z��'��` _��������������� �������������������������������������@� ��������������������������������������������������������������@����������������� ��� ��������P���������������@����������@���(@�� � ������� ��������P@�� �����@���������������� ���� ��(����������(��� �P�� ��������P(���A��@!������ ���� ��� (�HB%�%B ��D���@��A����������PPP�`�(`�����P@I�P�P������������P(�@�������T�C��@�!PX @a� �����@A����&���� d(0�0 ��L ������������� ��@&" �E�(EaPtP`L���LT� ���E��P[������2`����0�������`������e����e��$@Y ��ˀ ���d���0lr1���I�&a2����`������*�� e������e��TI��LR6 �e�0��������&P �� �e�Q[����0 `�*��������&������`��eT�`e���0 ������` ����e�2�*��0 ������P6 ���0 ������e����e�@��� eP6������LB52���������P�L�� `R\!� ��&�@�`���`����(��� �&�P�2����jL`�ʘ�e�e� &�����Ap�0 ��P ������0�������Pe����L�� ��� �����$�e�0 �� 0WRI��(1a�(���I �dP6L� �C�� ��eS �����I������IL�0 Pm�2lj T����@6�L��A�  ��@5�� 0 ���@1���&(���I��&P0PF5&6$ ���(T������0��`�0�!L`� @Y5�������ʀ2�j��d0$����P)��ee!L2j�`V �@0P$0�L��L�e�3(l@�T���&e��L��ʀ2�`(cB����(eP �����L� L2 ���&@5 ���PV@5�՘���@P��( �2p'!M `������ �����I` ʨ��jE e �( � $����P�! a�`�P6\6'` ���*� �e@���eTC����@�T � ����P�@A�0����`k*aj�P6 C�2���� (����`!@ �0 CH`@(������ �&0Y���� ��2�P���L`)�����j@Ym #C1��($ �������(������ ��� �<���& (S`rɐ00 ��`�00 f �e���PF2j%L5&����P2��a�$@x!R2TP������`” ������'���0 �������&af�0�LA�PV6 C`�d���2�ef&$S!L�! L2l&I������T d& 0$�������0�����A�� a3 C���( aC �� (ʀ0����A�� abʨ`@�! �������� ��(��AJ������ �����*V-� ����� ��������x&a`Ն0@��0�����T �0�0 .� �����a( OQca��! A`L��`j ���� �@\m$�&a��A���(������0!yõ2@9aTl���\��0! Pa&a�L��������@6Sa��IՆ0e�I0$ a�eCLj#a0 � 6\m&eCjL2d�Ae����Pa(=̜ ����- y���( @5�0�� �a ���d�$ a A23��P�$Px�2&'I�� R6L2@! ��0WIx�P)0�P)0�՘dL�.d!L��0$3�Ax6u{�0��Pa����` Pa��������` CH$ Cr$Lep9 ddM��2 d0��pf�A L`j6'S[ɐ &$3����x8<$O5&gAI�PF5D0�2<'3  �����@6!L������eh 0d g&a0 C�A2C0��I1WIfH0&a�۬$2Hf��0eaA2C2HfB$3\MƩ@sj.r3a'dj�*aN<C���PL jC yS! @fN23(Y �mI"0 @$3d\$p2(0jF L��&0 rmd&��@$@ٓ!��� �f0 ��%0a$ aL&a83�&a83d3�� 0uIf!y<3'pm&C9 s5!L2 A��P69<a&gV d&��!Ppx8 �� ��(0S0IL�ʆ9g����LIL�9IF9I@"0��(0Ix8L&@f������A L$L����&7N A'0a83$ g& <O���`t>@pfRa298$$��\md& !0 3C<Pm$$$ 灘D���2HL�&arF rQ&&~֖̜@X��A2\M !g&���0 3�����&ŕ!e &C�&arf093PTd̄ ���0 3I�La&g&Lhd$393��d&g&PIQF&a+o)�Wb P Ù A2 j2uy��L 2L`|m d!L�d&g& ���0'$Hfr2ə �Pa @!A�0 3��2 3/<ʮf2d&咙s�䩏;9AJ4��F2$MKy `reG'�&ə��ᓧ!L232(f9G������`lO MNq!$'&��Ro9m9J���L.{5GT$Dd&'�������$393�����2yΙ !a�ZkkC!TPcAjfڮ�$393���I3��������D$Նd����0LXL'CjCxIjcΜ#!�fCޤ<M"cEC�����`LL ����(0\0\a�dx>v &Pae�sِ32O29 �3`393�� 3932C���(0 (sِ!L2C��`LL�L_z83 �1W{ ��0sfG� ����ˆs'A��������PA!��2��030sfC(0�&dR3?*V'3.0�`LL�0�`LL�������"!�F@PF�j 3a&g&eLL��00L0m0��@V M 3 $arf������d@ ?LL������03sٜmɑhE$ j$<����&��rf�e$<2sL"�2�����e3?G- �B��*Vl8<HxfrFF29�PFC� 393`<<L"��0jgC >[�T0_#P  O"@�&Ϝ?ơ���$#E@593` y'�&HxȄarf@8g�@ ZAC��ˆs~03`.{nYoMjbO1Ih`1HxHIyGʔSo �) *P[$Rf����0ayQA֖I����� 5C03'09y2sddp ��eEϜ3 3j@����`LL��ly8y+ 2,19����&kLq@��*sIms>A0wX՟)y&�9<�e31VE�BʂǾ��0fRTQE���|HF$p W6��!DTE`6syjD��L2GWA`p3g 3� 3k38���PFa,�2rxC�`91G@�*:L9�PV9aʨogY&y �`99@�� -'93���(#gϸVU��a''�(#0a愙9}Th ����@9<0 3���ԍ99 G�sp>!-a@mYTa1hc@f�M*"�`9H9zpH1V*"�0 V{sO*B��cA3g#3j 0s&��� 3��ϸH|8 �jTj�PFg8g&��f|au#HF|1��`朧�����@F�@2b 3gN0)?xUi10 �j��������Lxʮ8͢ 2B͙�L9̉����(#�fy&����@9<dv&y�F X5B�@3(bD@3'`̙��@9<L9�&|`@dppŪ!UG�Q,f<Kb 38"ky5;0 ����*c T��0a?qU#�@5u)2(ja='Cc$ Fx��fy*�șt;<P9<�P|C̜z �P9<��������v&DI3���`2·*.#Rgl;Ҁ` *,�d�Pԍ*(0C|mO>8����33@KX5B�B& -@�'̜3HfN��0a?:NَZ5 ���$#23���&68P6uC"F08<3ϙ9mcT8�������(#�3 sSC9aΜ�����&|15B����H|ꪣ1h`A:8U#77Ta@�,C}C��!���0gfU" ���fy*���X>YF�7=h��,H9<33kGc!����������9)sN�PU#Z/wi@��d+VBD GcPa@0V"3u�����@9<!���V9a�90ảap9Yi9$/w` 91�0F¤vvT!��PD̜��<�@F:Xe *زKPĪ *����F?gOZ=0R9fq]�b�BQ#9j޲ !b0mLErV2"Ӟ5�cPa@�BUqs �TPul€` %WI��f> �&Z9$����$#O VcPSvcaĪ)��aŪ�� 9c@3Ta@�� kTPFGle5HAԤɁ"T{$X 3, @c€�sx�����0X��PX!��Tg�*xS3��$0`3\X5B���:P���*X砊�� |  _�Tg���$|?V`;Ö:U#cmIP'Ϝ�8jy@�"\�<35|jLD 膧p:Aj����:j�����@OcU������|Xkݡ[vV �Lnha1Ta@��������1j � c,g>F,EDYT@��������@��UJM380S?Q��0bPe\!0*Y]u����z:kWX51t !I� |j"V��P9@@|j�����q,ޭ5z˂00b���8Y\8$����H,du1!2Ta@����RiF nIa.0 ԈFQN91joX)ӌ}*�����@8ͨªBTxge!e#Vh\X+}v1"���0.�����@���ƢbU:Jƈ߆~ْ,V!eXC%Ee왾# U81.=eF)[0bmg k}<֊*`vb@eBT1�F!rh=fע,H�BjCFa@c up:F L+1@����s!pp:F@1ƥǸjDc�������U.F����`q:Uq@08jfb@@#V�2I7U�����s9 �HVy@̧F�PI~V����Lx3.v*E@#VO9��P*FŚ~e*D���e3?��*v-!n3ŀB>�T_݁W|U)SU����dE@F`RMKc������*XuUA2ƨ �. hqa( :B����@c4PW}��0Zq@e:x4U¡8b1i���0����,p�bExY �����G]1q3wiBWLt1+-U:VQjBj���aq@�H8!uXx��@c|spr1jDS.<\ZA����@2QXc]z !��d#s�q.�񔍺!X5B�`CF��� ������u*~jE ��V�����R8" u#X1b1ZXcTXu#V0b)FĪ#��0ƫ>UG�������d.��T/ĊUhĪ#���@2Q���`1 �`QGisAxueP+����"vz�0b1 #FD:B!XuW}ejĢbغB4"ZCVbĪ#��cXWP+4Zq@Eօj�`6u<$��ª#c�����(ZǏx@��`q������1*jq fU 놮8bF}YUZpuQ8 h *Vz"b`ݿ^ǃDH(вA0Z11Պ��Ʒ ?LЪ1` ���1��PQGh٨/)F\uDcvWQ8[w>������@F)T#P->���HVX1ԊVQ1�w?E�P,���UG#C8PD#uSp@��0�18̙[!C-:úl}AěfRa8 ���P[X8V �,C[Q8 ��c Ke�EUG������q�$cq@@G#z Bj]UǨ9]j��XZq@��1 ���$bQu����@Z������ uiv jq1 @Oٳkǵ����������R85pu���c���QWjPxG\#pB(.A٬Q/:@����@(:ЈƤP+���cq-;_Hň=h Z eYX�@(V!���Fak;ή I���rX+��j1 ��������dG]PQnp@0��TUG4���ԭ~UG�� 0U#d !�ưVa8 ��R7 1B�Pţ�cUG(v׊�c9 � ,����8"����ԭO0Ckq@���W!� ���5j#�p�c��TT/��������?> @P֏ǶQI)aX+�p#c+~UG���PW!���Pţ������d����8����@2.U±�:<&Y,���@ l"H W!�1�����8����Rt^Z)U^g򺆩‚P:.]W�LkEP���� uG���� uO^:B��DUG kŁa2 Z6֗~DafUa`+N!k  *R0 ��cX+ uſǰI ��P \u�����$82g]-z6~{wĪGȲA�����@88 ��v=õƈ=/cmg*e/A+f&$$W!����Z�d<B ���PcE6~џ ���XEϰp�,h����8Tz xMl1Z�����4;��@Qq#29�6RƸen=HT#d֊�2EZq@�������@iF= ߺQW��nb@o Z��a8 ���8,Zq@aҳ8D�b8W$����Y X8i8в֭B �WcUX1p������ jc\2Ep8 ����@8F]u*:B���QqiZӬVP !�,:k!��G-L��8p8Z8d!v]r<`D������(Qu:B�����u#  ƈ^T�ٱȴp�an]rV!XA֊ !^xĊb \u�����Hሗ~K#qb0rX+�,ZcUGr��������:.qq@�HQ�ԭK?��QqS&��`֊`�����:C8f?_r"�`1&aR �� =&���JW!DĮƀP4ƈW �� fZ+4BZGq[D >A�í  :a8 ���Haq@p6T;a8 �ūZ Bq#8p���@E]<Ł���]z<$��a-z1���>^.J ��0!:B���dG]l 1�1x@eX+���><ZQN.v ����+EAe���c!*pu�������Qq�qFD#d֊Egz|�����������P. Xq@���:.���5QXqK?eưV`,^8uUG�_*:$Ue[I/6K$�p*Xqe@t_0�����0`)99@cXk ����PS֯gkAE\ ʀ�@(\u� ޺c2,�ZcD#֊��qiVkʼn ���L6;UC,Zq@���?`D^,H������jq88Mz\u*\uu?TRZq1G8pA����KCF]:B@Y ��� W֊a8 �@~PX,cX+�Bq#dY-㡫��!  P4U9d k0Kc#��� zv4'$a%nY %����������1 e!���N}���Q۳p8 ����@88 XDZ��Rqaή]C^H�Z1ezc$�){ ��,Zq*<jm@T�l+;] 1bhX/A��������@?ho@P€d z- +0]!��m6_rBBARk4 ��Z,Zq@�� u<-k!dbʪ^l������:q@��R4;+����|z��Lk�Ԩ :B�B0�� ���l ���Q- - �DNJ�RDZQ8𪃲:zj����HNJ)ƈWİV�2]��TW+:N1 hT ���^u��QqUG��������5c!��5«@ŁW8#�@(|z���Xq@���@E]|�� Y}݅z|UUh( h���`֊���F]|�겻B� a_X8D (z=rY"���:158#�@=;��b!P<5h7aPX* %�0�����:#�*/�������"x %`�*�Z,Z`֊Zƈaw c`:N5Y㠊 {`Y#*h6SfW=U � ���� uG!*F |zŁWfܸ.:he �������H����d<zAuU�õ� z^۳Zƺ�������G�Pu=BcV<@�z� ^۳x-z�Ƭ+| $�0�1,-ZGpx@���@Eu=B��cV|H^յ����W]9,Ӡ@K�KCsVh�������@dLC b%Z7+P@o{CxOt���\r&�@I+4�, 2R(Kf^l m[5' Zdi Jf0%Yl  6H��`L&ӲC^a ,6� i��MK@���%LPPvԶpM,6�1x[` ¶ RRSrk ����8G������Rk<�ŁW=Bt]������(QaVhN޶$�$hL^$���� 64K@������ 0-m ��@P/= $��0eI�0R+'+AѮFԘ0���� fв t]꺢gj�����BcDt�����PQ��������HqKʵ %M  ư,P0`��@PQz��1 u<OQp`8@��ٯ%�(-1\1+������:>(1�U ŁW=B���� (<ǵŁQtV=>BCFs&Aka� V@���0eRHXa E=W�aZ@� (  @ AErQi@���KNtDaZaZ� ���=ӿ.I�` [e Chia��������iIi¥LA0v2à0�HdV:B���p͎kK`xK ail��1P%='U�����@EU����d<>r2���r06,opƕؘ֖p=ņ 2&����� 2ò Qh%i�jg}g �p-i8UA8Z,ed!%$$������� _:WRþ3(P% ��8Z\.qZ@��������P'MKaZJ`iZ@���ƴ,iB++.d�`L˒Ro`�����ư,i` .7,[dH-L ����@09 �����@Ppѐ.e „K��XiNVf ,a����L1ZZ0ۮXW ��������*/cLж.6�( -&r$$� $���� ( MI-L ��@Pp)SJCPvG]q���K@$ ZBI@̘6<������ 0-npeP� .eRN'XYka����� 2%Mi �r �(eI�cZ! <P� #vl.6���m�����Dƴ ���D)M���� lP°iyii2`DqV E&֊��` 5����Jԋe"eI�Жa +oh2ٍm;L&�����ƴ,i���„Kw [!f ���Aa¥LA�����il `1\)xVFޭ4㤵0Y`p) � $����å $�nvL��TL���� 2*Vm逢ƈZMxX3I$���QW=B���@HK�,LpT ITs0�⤵0��Ŵ,i����@IK� }6|6|d4f ���\iJmAՆul���,eISh/K` $@Fl6�X Kxp{-1.p [vL��l`ih4�YbC(4f �ˆm7: $ U @���  i]mKzM z_ڐ�Hhr������ІPJ�@2iyii�����cX4A��cX4A�� l0b r �p(_VA[vIr��0ee1 ��ư,i���hNM�������Pb �� (CaY�������(Ulր%LJ+:B0@|hXD 4f � .6lia�����cؖ4A�\biT,;ކv57m7p" ��@{M`P{��( �����cؖ4AA9&����T/ 6e$��00�(a܊@h- m&۪9Z@���@aؖ0(m � (L`M$���0mI�a( [ ������ mK 2˵Z"`bl!Q]d2і; 8YZ@'K uܰ|=KXKzl8lia��@X1I$*m f^mGl[e ��� D��a[+[ bؖ4�@(/ i&����X ے&���������J*[8CP(W9j� wr\֦d��a E 6I!=H�������ʆK9!(Lv  n6! ���`1may9nw@0[ZLD�0ae �wU_(LR�\l"!.6�������� 2�������J(ndpr8d76bF⬁D 4&.6�������ʆ[90mI����Q-MH 0^�������(lC&ʁ���������%$��Z&�` ے&((LiHfP(؜l- �@ n6��0F{KtLpMH9Z@�H`6f ����1lK ��������B8NC�cZ0Q3(4�����c4A�ak0M$��„Wnh:/- ��������@ն>P�`1lK� vb ������ n�1,ჼD��,VR ukhp�[9LTa0`i)QM$@B3(4��Ű-i�X ے&��&\dwж0� 4%l"�����Ű-i -Lp*7,[a�8l- ���Jp+ ����� Es[APex]������PpXha`ia� '(�Y7' Km ��Ű-a��A:L4lY+ ���% &I .6���@(iZ4 wm)�H�Ts0��������������@T M� S{ne"8�,rR[9 l-Ll0&�P-/vDL @F\l"�bږ4��Ŵ-ѹA6������@T e [9���i[B ʁ�������@I!p&����bؖt���8,�@([wN-F0Le5\h`Zh[@������t _^Ʃ&K"XL"��&DbɾX-K@�����ö`H������iۆN � �% ����� q؆  l(g߶�`[4C i,i�0r ���������@Ib 0ʂԺpY@&H .6ٲAi+@@ .6����Bce; Lp Cm0$P,K@����� pM ����pM �@NK:�(%djQEs-i���@(ရb,CUs-i�������Br8$DBUlX~{Zx����@Cyi�eI#L�� N M"2��������p[2���@([9������8lá`XH �ŰmY 6 ö���B0IAscӥ���������,muϠQٲ���������LP(�aۆ99† |ML$8X4��Mp`ۛ2:% 2! % �@Fd"�@(�/2�b[H�����`1l0%"2l{`8X4����t-<A�Aۆ'y i,)lYҠ4X4�Mpsstit& �����bڮmK9e{ &D�eIdit& �������iۆ B @�������ӧrvvcö@q�@(H�ö���J8E �����(\Yl[�A �J8;\~a7wJD�P0esܮsTU2�����J86- "dt0\cpit&79Lp�'˒2& �="D˒�������()C���PR8E ��B {`=2ತA= Am)ZyR������%B nda�@qƆmK��bڶ4An2!M% ��%p+d"��Ŵmi=6H n2��� plY ���%"PhL$@U4(v Fу{Ke .,d��H,K0[4��5H+-rö`L$�������%Cbږ4Mp&x%s79ٰ]Nk7H�BjN[$����B @��,mˎ鶤AhrLZD��BIYl�2& ����`I�ޕئE>- eIDPŲ0��(NeHa/ Mr)d &D�@FDmIazyɎeIIn2MC{+)0+G|Lla 8/0����:&u����`i)6M$���XLmJa/L &x%+Ҷņ4ؖa���֒[#Jc P���������@(7ۗ'ى������tWXTm0؋L$���*Vm&)9Leܰc-!�����*m �IWH0�(NFA܏Mvq0ۙ!ܦC0!) E$"���������xaf n4@@q,��%" d͍]mI8 " ��Ul/e"vb&"���8Z8 " E2CF�������� ӢJNHF�$]4� &xqQd8X%/A@"!,qodI���`/2L�@qU9,���]/-f_`m�����bld/2�����xBIx���}$t0E&� K4b- ��@(7hya0(NzI0VH���@qrY����`1]1ݖa������Axކ#L,e [n6d[Np*0^d"!I`H,̮Zrk$[D�������,6Mb, `a6@����@ͽ ����fcn���( E&���� (Aod[������B7vx[B0Ds a%k68ФA"��.0( nixD��������� 6:2 `�������Z8mӄblJ:ȋLQ2 $2��Pl0Y5Ǝ$%jv6"!I^d"����@(ZY` C($/2X8ȋL$��e0���nξ VXT{)\ai ������ذmtJPA -L"�Eia$/22 7l[Za/d[Aa-1-��������@(餗v:U Z1/9Y8ȋL$��������� gܗ LI���%&`[������ i/ vXQa  ��Y8ɋL$��b-Cx, P�vކ�����p٦A؇(� IkYfWh��@V� d%T]g"; Ha����������"^`4dvvA$l$��������re æ)�����0M�X m:48ɋLFy�����,ձryDq- �@FrM$�E&{������`1\i��@(78}DqrKAҭ E �Y8ȋL$����������� ��jt& �,6Mbe\4�������jM ���Iov]LRWYD0��������D5N4��������(CD$r. ,A 2 b�d /0������� MOD�d /0��X caH"�����Io8Y %m^iӲd/b"��� y'2 ©\ 7H�����ݒl ��� a5H��t:6l}$h �d /2�����e&����blA������%v%p7:W]lJ8ؖvc"([8#�����Y8ȋ:m&)���tH�2 A^`"��%&�����������ZtT)p e��� tľ\`J"m77\.าPZd ���J: &�*$/0��� o ::D6݀3Ă #���-"uLnE`;~ @��m������pڦI,6:/U��������f)-}F����M򎛖] ����mnd���Iv�ti*/0����� t^a�% n0 ��,2 b���M� tW$-2HK����r$Odd�����*L%;&ݱr&%+)} IL×)D �����*w����@qRdSE���nKvLn0��P;~>@AѭMU\a��� e ��'*M x H$�Y0dd����`aTQ&������Io8.2Lb�2Lb�����������(NGFcr[2LPaS y/  ]0]\".7D-` �����bxLK{Jo6����Pҩcp[I ���,6Lb�d`/0!^ʳBPZdaoidaFeZ�������AI'"? nvIѢ*%@U0,&2��]6|}Y@����Xna{9| dQE9���������@VvA����@�@T0r h8!V2|/`"� { �@qpYI� d�����@(Tr& { �^`"��%7 #.0 �����%=`"�m& '{*.0 H]K2c/)hoؘdV$3f6IdRB��� `[b "s����S{[��`1ܶaS\a0þa(pe88Ld��2Lɾ2 p^nɤA*FCѠn$_(Efb��8T$bibFϵi [@qrYarYarYI ���, &8,1e& '{ ����� pd.p4W^)c_QR8Gb�������X m���Jz(_(^P(`"����+ E2��BIF)MD@N��� &2��* p7�����, hi 4zh{GU$BÙFXn !d_XE&AFE0,$e�����)Ӄ}#G6a �����T23�f :n������A Д2��bm : d�dt7��G"9 .6I$ ��������� (‹Md���vT| i-'H(Ⱥde&1����pۆILq>7C3�p^[$��������������� al LI @qrY Z80L$N� �^@������/}E ��G$LqLD`스(Cy1D 1:������/و"A,U4vMl!m@@B v022������a 21222��@P ibӊ;$zE%XKF@�ƙW(1����EeR`Q 4goi6 !������%</0�������v6,Q\AAF�2:Ҿ, KD��hb;H�hb;H���X6A4XtY&*6J $������B  $�Jx(_`"� & 6M"��dt7����� (| M�@(ipfs"dt77wK3a���d4 5 X₎jd@8XtY&BF{`U29nA`����+CE[R.i }QlA!%h@��d�a���� t-L`4(.h`\�ɢL$���8YtY&Ee"�Pam$6M"��� P����bmнVq}IMY0m%3f9<xS$P;-���ࡶœ���@%D$dI~ NaWHpmA`�U2BF���d4 de���, NEe"@FdD�Ja՛(�����������A[2 V]`e8VͩDL�ѨYMȈ�����06 i 0`"jEB������@ٻ(qAwQ I̊$I�hb$#�������� ��@&�������xx7�(6U2A H�&ԜeD@q6MNm&m&.Б]bH"���dt/0 ������C&�����������Pr[mY i_YD��������B a~M| ò|bo @y!/@I!��d2*.Ht$ڐuD���������J @�20m$�������, .cY&[e"����dP};H{Q$ P �(Nn]6e�P;%:ʊ��@qABg:` ���@,MF$ `.������"x(@qXuY&�����b0t$8yUCi�'mD���� P�� 3|," ��rwNJ_*IB�����:_Q$bEB�����'.D�������@{fp�(N6]������������PY4Xr&1��� ��S'@(ɾ .im&���4I2\/Ib@v$8tY&���@Ez*_@ ��X /4���@(} ����������Zةi$�%< (^i��˵[v or-</p QܶiP����p(_hn-) �����vH6m$Bʗ0CR8}A  ����������`1l�@ v8x(_@���������% N8z=M{GF@�d Q0P `D������� $����XL/pj���@2RxoI tbv ���'.D���������@]> 6Q$�� @����@Aإ Jqje"�Meb@/4PlA&q,q+��Pl,���`T| ��v<2�����d2�b3b(�� FŮ4opqİH(S� d3I!��@</#m<B7,D�������2�24���2;̚ ��� �(6UѨ`R\���p;8 ����UeJSl,���tcO_ N 2��T ݽ8<i*WPK&£;a7HHf"'[s!]UE[IIPܖP~a3 �нetL{[I�δ_Y P.4��������()<7( VUlUŎi/H����������,-]e"�@L( XU٠Yףr~ro$3`pQW%I����(N۬~hnHF"I�������� (}����]w/Ad"@"ݥiAG񚅈�@ �������� (AqC9VU ��P,��0 * |ShmKw�������������������������������������`@�������� ����������������@�����@���������������������� �����������������D�@�����������@��R����� ��� ������� ������(@���H � ��� ��P��P@�P@����P@� �P @��P @��P @@��@A@����@A@@����� � ������ �������(@���(��"��� @�P2@( �����"@����� �� P������@EP����<$�����``�(�������@ ���&� (�����I(�L��`.P&`P@� (@�L0�TL��$� `&�� �)&��((��L� L�����L���\���& �B$���$PHQ�I@(�BT�(@Q���I����D���2���$��0I���������������$e�P�L���I��������`������(�&��$Tc��&�$��$�����e��@��L��@Y��P$ )*!@ L0�ʀ2�ePm����I`������I��&T�2P&2�`0���I��2`�2����ee�C��(���2����������&P `B�����0I�@YCj��e����`B���A�������0 �0 @@Y��P&�0 ���$L\ �P�����L�����\a&A��2��(+��&)���������2��(&��@�@��`������$Pm����(c���(c� e@��e�����e�����L� ������������P� ���Q����e��P��2$����������������eL�j���P$ �0 0)j��e�LP�������P��P����PV���0�`�j�0(���@@�20������!����jS7 e����e�e�����@�����s5&00@��ˆ ��`�`C@5 &�2*Q 0l@��LB��&�(C���$���02���2�&�I�d������@P�LR���$e��Ap�( �e�$e�PP�eL���e�������L�`��I����� ����@m�0�0 L2���L���`2����&`�j���$@���(�Le\F2 A�0L @!�$�L`e .0 C��I�����$ a������IfHsjC��@5&@���������P��2�22��!Ce�������� ��&a3 C��tld��I0@�ˆ0� ���P$LS L�” <!�0��La�� ��&�����A!<02���PF0����e��e0@����@R[jL�� @�@e�e@������PF3 LIfr$ L`O�”A1 ��P�����������L&�0�P 沙Dl  @sd2!LPF�l�`I2C�(+� &�& ː& $@P�2��P �& L0ʠ����P�L`Ȑ!0x&a���������&a&j0 3@���I.@ epe&�0! ��������e�e���ee��@0�( @����&aȐB�`�&a0 C��(@L6� ��� Vʊ `�Ɠ̐2���2! 0 I������02�Pa&a���0 C�'g&a�� @m\mH2dH9:m��I:6 ���eTcLL2e<9$ ����eʘd&a(-a1AƄ TI0 C�� �Ax30!��&n2@P@F2Ԇ0���(0�C2��PaA��ʨ�(+3aC�<'L���ef������`$aIp� ����Pa(0O\ !$ I�0�ȀIxrx������ ��2�!C2! ���A����&a� aq51!ruI ����&aL'0�0!< !3''gd̤2�C�tpj! a��eCjf $e$Sa�$�� ������C�If������ef` a�1aP pe#=H2Lt&a'[0d0@��=-?\l <$@��d��LL C2&gjsxr����j#@0 ��� 'Ϝ@y0�� W{o$L0��L! Pa�'a �0! �A8 Ʉ2Hpm0epf��(Pm8<&@d�@f�0l83$L&a�����L L �C9 ̜ L „!<A53�(0��(d&���Tb p9 ���L&������@Y� �A2 px8L��������2H2��-��`&xrxB!LS a���L&2 3A2��(dd\mg<9HAmrMdo0&�� v0b C�� �`Bm�������@$C v 3 �0A�\6I�`CO<Lj#0aAB!�P[&�L`L2 &a@e2���23���fns0 � L 2��0!3�&aL�(0��& �������eCI3' A0 ̄2d&��L�3��Ifrf����� ���Ն���2CdgN3�&>-h�~83I0a3� ���2C����lIfNmpmZ4Yѓ;} ��� ���2ld& �L`rfe 沙 Qm8pF9Yo3Hǜ@f̜D�(0\Ɯk'5@H�����Ajeo<&����Pa&��@m Lj6�e _$S8sĄ0a0�� �@Ն\ouc& ���\6� R$M & ���L83$<93WdA ����ee!�lL2a&�0ɄI�@0������j<uc30[2s�Pa&��PL ̤l83ϟzC  0���L`8R!eE3`Ùp90�� ����d0a3sI � � 93&g&��frMadI0(3�`d&�L<EzHI����d&gd&g&���$393$39:e�C�(2HfSo$Zs'g&Pa&<GJ$ ���P!3O208 �AY ������2HfB$3- �fy�0a&gm� A �����A3<G�P!LL��0<S��0Af'yr�&p$C&<$DS6u3sI21`LΨA��s'̵6L2s13&3&$39� ��&03��`R6C� rmde���-z�Pa&L`rf��PT+K`323�mW |#��B0�(0& 3g&������� H`rfRa&ɇ���������frfef��Pa&���Lə09h$Cl>30�Ljxe L09l9g&�L$m���L5HjAx R3 !���|<Gx2HH  3930sF7&y 2 LL2�l>BxY�� .{8<*9(�Hf39Ph��� 3\7 <L a&' pGR[.#ᙃD��� ٧Y<s0LW� 393(#!�e9DE4bHx 393- σM"�0a&g <&$ 3j$<�rf��Ly9!LФO>I�������(#!���vL���0m��� <� <ժZ3?s&(#am'm A�2j 9r5&y`LL�Y[2,<9������P٪c\C�*C[z" ΐXɁ�0 I.)(;d��Hx&L��ʸZM6"frX[<g���LL�2eg��@y�(#g�ə 0\?��� r<��6rx&�m|`��PFkK0L�PVL�!|x>պ#(��`LL�03Cə ��������frf39303�0sݞ ��!���Lə ��P6̫}<0g 9h@��$#���& v<bDfI?9I��0sA0aL"�0\ۓ�I DM&<yK660 � ���HF PaXkE�����/{ҍI�fΙՀ2rxH9<2rxaP;<8VaHŐ2@&̜ə 3 3hEh�� 3&v08Lɡ-׆,w0x2H4�����PF����(#Lə @9<�&<Cۜ;x0 �����`朧�&<<|V48< 3 3k38`Va=#�ad83��Lx8X!�$#?3gI��`Ǣ<D`.6c` *E �����C 6!ik=U��ƠY-;Ġ€@2b!L&-|pU11v)b@U$`&1s&�(#PF?ayΧ.BDM"DHז<8�~p@��HF 1Aoc! d\Q:�j!$6 $#dD��fy&����PF(#9OE9<�����0ϳc,q@�Bs���*y/����`1c��@qU#�1X�kzjYlB���YA֖z<��@œ'!3����&3s3�������2𳎑fRa@ɈÃ`23gNÏ9��a9O�dd,;gR`1hp!�eeϵ�BQ(933<z"����ʸn59 &!30sL���(#'A93H=Gΰq@Ơ! 47"��HFa"B;59�IPa9dD0fA3gp28uÏF8j��@:ƪ2'd 3'��0m>�*L>GlTa@�����d9穠lɧֈŠD"3�(#_dD�f}Id<Μ����0sγ���PF|5B��`\ӬT6 -UDZ,BC����T#":@ �am$͉�!0aE|g%̉����� 3'393&1�fyXR&������*y'A#ԨAq@�@2rxO<$�0F .l٨_ !*eRa@���$#|���*RWx����T!̙�%QnMBH^��`g"ed;z0 �����P sΣ >bƣQ̜���0sΑr� F5 zX�y?8 4)bD Vb����$#s+u 10 Jpu<bUʤ€���!ÃP̣p@�̈B�ɈQ?�ٺ#V��!Pw\������(#����PVP~~"FȚ`& I�!����&̜C�z`,VcB5C���`4 ��QUt%U#��ԨF���:b }* @m)g=%:WijThEZ#!���j5B0yj�X��̙sX#$Ȝ#!0snxJ�̜9��0y?8�EDrxxfQ *�F��`̜T� Z# !�� IT*;-@(#$3|Pu"��PFϜ9s!S#(3'am8Pw .fqC�cPa@:ACFBdI2s"�|F2���0s2G:{]c�ˆ ����TCf�?W<V ��@2`�$c �TxuSPP?YAj@ ��cHwV%D@�,�Ro秳G- �����U1q� #0 �����Tn|fQC#**L(~TCk #N L4��P9<0x#V 2Iz߲aa��aAl����1`X 5���ֿ? e�` U`bzV # X:pkU!��` U!c+ V5C���@kP #����@" XPa3ҷ#�;aJ :5*1Ta[6=ò~ R*,C-5CڐA֖ ]!��bĪ1� Uf p�(Fs���q?��������ԨUXC!X5BA4P�S#'lV땞u!�- F,ň�����Pc *x[�੣F@8y<8 �� u+>u:T4b�1c[vCq]1jЈU#ˆU#�����(b]�����Pc\):["`@E@jF�����UX@2�� u1b8Dz�����*XuU:j���������Tpqpc�dPCd b)FЮB2ղ3ˆU#�0agX ˆUj!lG\5B����.�������)"{<HiF 0hW!���H8 c5j �*jj4p@�������jVQ��P Qq`����Pc!�@2Qj �`#,kN80@]a @cVDDCaЮ ��f:Ɓ�Quu(hbxD1E�����q#Vpb�P ��Q+V!����@A-qpA������j:8XZq@@T!h;C) \q@��XZ8 �T:SB��HC#b��10c \AW}lgc-������������1.�RWXh`U p@�,!Tƫcm3C`D]c@Y�0zq` jLQ1b�XZq@��Hg**�����:Ʊ>5��1b������3Oc #V!���d � u�Q+vvKqT%m]J �� ���*n-:ے(X��Bj Y#~]2E���01t C����$c: �1�uDž1 ���� 㨋6>4N3^C¡e Sj%0 � \z@�������P RFڍi6֊#F,ňXf9lN4b��R?4bHU� ƀ`j���P���Pc!�(:` .t@@T 4 k�*TkDDZq@�����HwUPl7o����C54Zqb�Wcc\6H������@z뱮#������d^{�G]eGe��5tx`Ɔ(�������㈇4h Mj�������cu5ja,CxfX+z PjňUG4zBqh Zq@�B�B0Wu!����$cq�*Vz` ���PS~`tG Z1e9ԊP ,Vqh����Rxʎv8,F:H�XZqC:B����� u.ԈW!������� LuY 1 �@TV���jx����zmZq�aB� c>KA0zmB\vʮ "V4@����0;tphᨷJ!0hU �cW! dgۻG, P+�����U:B���z#�Eg+*FV(k;kjѳxغ!RV&H"�����TˆƈjG]�nQW1�1kP+�u=��czgV��4S8 ���*Xxcu W:1v1.!<l ;E'Yai � V �Jahw;ꊇ4p�����*j#Zq�P(֙~ +vEAl�F6X-Ā���Z<� Ap8�ŰB� 4(G��� ucXIHSq3)D hY_k��Zce cuY6`A�!ưV<PDZ3XEȀ1B^Ȁft 8 ֢c���!:q���XƱ#��Xce c@8H]]֊�NqcGٸ~G0�������x#8-Ha�����@Ia;#�eV֊زQs?���X *9a۟=^nFe)Ŭ: �������P:YB b`]Ua8 �u=afvQl�زT]BG$���ưJCW~E ������"cHx Z 㸾qmcv}1D�ڞm8jHHqm@��$�ai�� Z _mTeX+���� l}i<BW!���1#q1���Hgk�eXQW<W!�Q#JJZ+��Dk=2v-U�� k���gV����*⺮xbBTZ1JZGa8 㸾C`bW_6% �Em)OX8 �����-Zq�W[������$4ӯmD��ڥL���ra8 ����:; Z,3=A`%!��,ZqUq:B��������;+�����㨋�RqEUDZ";qE�2vPvW!F,:ׯ,2J,���� jDTIcQqcUG�,Zq@��:n~(4GK\����R4;GJNJ!�0U+\uDŁ(:hT̪hPQ F( VPk3\������5q=mwE@n,Qqઃ�������QWЧ׆!A���Aqઃ֊����vH)],J!�Ł1��@t6V<Ƶ#T8/:@�����Xq@ mcK� p�:BŁ1ۭaD �������� Z+(Pa a,������6* ����HqE�$8%(\u����iv+ҁeX+�B` ١W!�����H�P.W}e QqUG�����������㨋�HZfkWC�����(:.��P.>gtwb@0W `Ċ:B�������8"�������jU?#PJ 8h+:B������H> QqUG@(1٨ ����Ԩ:Bau [p l��� *2Gx=V ��� uvX8 ��Q%�q<͎G%'A)@�*A���X���8����x]_G;&d2E lJ"���P€ $�*a8bŁW=B��!���������d1ٮjUh k��1 cXٱ^PB5B���ŁW=B@^�`,^>N1 KJX"��C[vʂƠq~ɉ �&r�����@T8QDZYC �������Q/u,, ���j -pUtI',����[n0I���% �ZcV ����uB��5,ú2+�2+��!�P.|sC5Tc8n���:6H����X Unh �ҁZ TW$mH����KNd���`1,a��ò � t UcZD@h���q��C[Ae4S�  $���bhK �����p(S2+`���������Qb1,K8ZW<䑖 :fMR6[2Qĵ MQoŕ@�����0UKjc[&���� n.,Kx@��Zk=ȅW-+EH�%C2i $������Aǰ]Tn@0( [H��cXp]6 ���` m%=V�Cka�������Y e0LA������a(XUCNk\le �Łz�1-���{Էch�P8* �Aq$��p[m ix���� E֊ x)T k1e-"�8qR>KMBDh)i ˅`CZ.4) J��h!H���R�` m ֊PLw$ ڄ"le �-a -|[hIX D^hA)0%Y,Q4|�,6��( BR e2,6 i0(A[hPB��@(aVPeX=cB@ 6H����X X1WhΖev:&H������, ��(Q^5u}LI^v���jih!�@TxiW=BzPx#��BqU�>z����ƈoݣ^񠢇,z켓uF8Ί)@֦A �^6Űqj]qð.z����MӲȉ*0���� 0�XLMpY������J ��$qGl4RA/;H�X\C{������� (iX)��ch[z HC 2�( ae���0e d,lm6IL $�kT0��������i*J 6����$r0�cZ0lBW9x��׿ ����� ]v)��06MKH&K�pH 6 @BB H�����UXC�,Yk4�€L ^�"�H,6$Xl �����Dƴ 2�^A}VVլ$ rv8tZ*/@�HP^$���0eIT 2$MRi����� ( )������%+>v0@ư,.6�1�A!].�[ *S��$q9,K X����TpQ�p!�t0RF-- � .e ���\*S` ו�WaY9(4n]`���HphW*/´@1,K@`  ����Aј]cX0A@PpiTJJ� ���*j(c}|*O`Z@ `@aX0$l ��ò ò "�ư,i` ˒&�� ( )��� 2Z6=L¤4U[y %Ե ǥ&T���T]8} %l ��XiJ 0q R'Xa0�p &��@B\l ���h./aR \l QUl� TaT���������%v,lK@0eI*6.�A6����; Bm�0l0�����dsr9 .FoS{q� B 6Hl6������� ��pJS������@d [�cXZ8 \l  ( vFsr#h41[[Ҥ40(MIkaB "!�� �����/c[ ���������\[pJ*a.WXL ������@ KK [RL9 V m"%)/x0i- �8A6bd}З $ s �������PQ?Ɖu�����Y<遊妵- 0-K@���+=^4P)H�e Ӳ  T= e�@aZ0 tt@���LZ{yRk&@h����� (L)0eI���Ș4Aư,i�cڭrVRiC�t]���QW=B�H;li2H��1+K@����҆AҰ���bX4A�����2-}*e ����������jLS[,i���d��PR8) jS�ò �4tBLu9L&�J[ � K ��0R` ��cX4A���% 2��������"K`]zٻp-i��++8^#xM$@.6���0! hHyCY����� fh]4A_2/Ia^2"e �������x�c|L)�������(^(SYP@BFlBIk�������Ԩ���RC_e �bxKy:.6���(N�������PF}[@��h���^ZXZ0�,eIB .6 ˒2l6��,a���B .e �KOt���JZC X }Lm��heul @f&h͆P(. 'Us0���@koa鶡�����1,K@0R$�0a[m6�� (L %MPPpѐD�Ķ7; &���1,Kò ��@b > D�iѶ ƎU Nat+Od3ZcsUaKaZ@@aZ )bH�@1Z蘶0��)kR)@qe ������7K fKcsڲ'D��������Y4-ј,i�Zm/`ka2H`&Г�27- ���1[[An6�[5G[ ������ʆK9���JVۮ��˫]$%p-/vL�������@P‹>F-- ��1lK ��Ll{+ :oiebH��±#N�@7yM$��0lK@��شB?M$��$0͞hSʣj_,1��T r.e"�����bcvL��aM斿52%��@B,,"P�I!Mf ���I5%<nd;mh[@Hh $�� p���p;.- �����8Ʀp���0mI9lK ��„[9&\hҾ}I�HhM$�$4&���c QVXh��� 24����0cMӃl"������34`/@7H����AT.SZhD��0mIAaMf cܴmi���������2L� ( hh 0\^������ ZyĕmiD��iyS}[Eˁͱ*6@HhʃRR&���Rp)L%Ll"�P,K6:Mhe2"��8d� .6( F &˒�H������ 0VA���@b = oi2� .2���a[a&���„Wlh]]6ٲ OJH��a�cےaFOP˒2̖% ����„[9�������1ڇm /6���( ےf �ľ}U!êM"AU�D����������rIƦoA\lK@˒" ��0C(4E&�����@da� 7������D0LPP^&�v-}H�� (p�H�Hn2��AရL$�����fa�m$�AရA�Qo3r˖�P$/rȰۦ$9ؖ!QxH!M&r,K4'ے As걹������Aa­&D��ö ��@P>ЋL$��@P8r9 In2( vKνׂPr,K&Ki& ����%Lxс�,mJA d[ ��``ۗhbn2�(N%mI���m@����������T豂%JBS�����5u4a�S{HxK˒����{`J"�,f{[A X ض������@ICx" �7q,)êe1I�/rd &D���@(z A~QOmgX,KD�����Űm$P/2�����$/Cf�@F$#PTKD�b48M$�@F#rp˒����������Qa �öM&DŰm�a��J8C& �������(\.p������r>ȋLHeI\'yhRm䲤�eI�����m ����@IKxBF#D@q,i������B ����DKyLbض4���UE����m �ö  pЋC{CD������������rI�^t ��ư\"wiŋDlͬ����rE&�2/CVX4`Y@&ɈeI���������"p&�`1l0A����ja+�PA/:!pЋL$UKAh N6- PhL0��PlKD ߮.K&���&D���@N ���Xl_$W`⠪Z\]a⠪V-&)�������p(:E&�x�_ ]Tym!�`Yd= 2M&���2& dF2As7\M"d�U//ТU/id[J0Л$F��AA�hRDZ &xM˖���p˒Pvs"I"���xс��&ꕷ4������p؆ -" .v~IOh8���2:M&����-;ے2a/d9,i����#v!�r56]]mIi0Mvgے2a/ Iے2̶% 8X.H 8% "��mI�������rыA���@I7���J8M �@(79 P@����z*KR� r:؋L$����+V�����J8bo��� pқ$��n���B 'Ɂ����ji,2|Jom(nNbO& (\nd !D pJ[Vcö �ё" ��@(iE,qpkOk&KJa/dcrY1K;% L$�����%&�������PB �������I_$ey.iYmwa ��P1[ \A2 "�����������j$ �iF\i p&xyQ �������������T.|!`ɶ 0a7 MˁK A����&�e(e{L�@q-ـ](2�����`anrIzY` A$+q54 L4H���PIo0Aar���pنA�`"������jit:6w۞/@B"(tH�����,˜xL������X.4IX-O�;H�]E"�����p6F\Y \AhH&yDq-Cٶ fےe��������`1<ZDdt/|ɝx!&ĐH,D d2rEѭK{D ���� ��������D5N4I����6,Z0p٦r,p3X'5e0J�ݱ.a#@WI|!3 R$[U `"dt7 U4hpՍI kT(T]g$� f[ ^ 0 L$@F' ϴ : wd3 �Q&+]E"�8ؖa�.0mnv&�ɶ.0ٖa�����bl$J8 6 7;L_\@FSuI����������M/t4@pH������@(7u.0l"94v �&��P1[ -l[A��������D5N4bM�lR4 "�.! /0���Ფd/0������PIo8 o-6J$�@Fy�I^`"���X e ^`" Y]ކbPZd ���X mD���@(᡽L;mv1II֮D+=% "��J8;nZ^ l[A�������MJ8 &PI^(c7v)���������B 'M��,6M%a_6: L$������%m6%�% }/0��� ʕX=L[ d/p8aan4bM�����@FyǶ_d������̶4'Q(m%:;�������`aXtQ$8t]@F8ն,’n0[.'ux` 17  LD o����0\a�X m N{aI"!����Wa'7I;Eـơ(17th&@0&�������XLmD�Ax8do����0]apl0���`1ݭMA��XLp SD�8va{9|0_@B����@qZT ��������hr[4StUieF��@qUQ$�������Z8m$eh o0kbCh o0X8LQ D�0�%[_`"���������@TM� �Tnp7 d �����0\i�����( ��B '},Wbѷ5_= B�'2 "������PC)-<DnzJ7H��, PA(I`"! y):I| eXl%�%`-- "�d o8bO⤫AA`"���Uͻs%&eqrYA {`0, ��beK߶���A`"e��������%÷ ��PI`"��������Q-<l$!tH�PI_`k +,mi.w%=�к5-$MTE B�b o0).3dA`P_T 1 I�P,,٢"����T}l`dVR˸=a B����@���J: L$Te30 8N@LDwL��������tpBf2D�����,$'*KaZ8L$���@Nc;So 1 ����AF@ ddQeYA&almi�� y ��,2 skpd em7~$9+(&n%!����'S*vxY>��r4U-i���%ze`o' 8YTY$B ���������JJ�m; "�m�md/6H�%[3 7ȂXafSr\i���n4����`1ݶ ����o/Cj0}E������D�������� e.E bmA��m; "�XNcso˧H�������������B-<)D����`cm ����JzX^NE&poBI2H,8%i}sae`bJo4������pjvmJ/2��Y% 8, ����m; 6cP$vl&V !MTE(Nt۾@ ��Y8L$����k 7cտV%$PݾYL�����Y0eEE"����E:s%"�����������Qa�StOlI(N.-&���P҃D2 "����B7vzs@�Y8e$����T҃QF`t.(#Qa �(.4L��r ��&�n- &2:ٛ:/4��(jA,i� jm([D������ 0I�����PFkui"ɢ���� K�M ���PC��@(| �tۦA��� t]`J"����������ڿ-2� Ndw(3U¢e��p7@@qN ����$–h���� P�������@&���j<^. ������Q0I%=/6Jv"��]qܒa 5I�����̲KyѪ8](U�@ 2��P,,������$�����ONbV~PFŦ(j ;TKЋb0@j�$$������rmA������^x:7]^N H���N 2 brY2 "�@/P�Tvh),MH lLvUdQѠLpP]D"��P1- .&ϩbLW$����d;H�������,L/ r[V-Ku3Ր,r��������U7D����`qM\yYFe9:7u#(w.;hT�TP"�do`"�����C ���,wk֞}LL(4o������A&4nnj&���@ɦ U&* Tޤs5%!������P e\'&r~3Nf" ��������]J;|(_`"���X_H�@ɭm��+K a5v{h@br[A��@䶌זi���������@ ~(Ŧ6 "���*"C2x~uo- br[A��TLn4����Mm1O*s!�Qn`0nI�����@І*C0- UmE$��TҩZ:7B �����1����� ^2:&/4�����^pjo0p*o0���rd2�Cx ���Yii��*T`t/lNDdo $���������ZzjoLd������ ԾDPCy ap[fW{JfC��SزAivvVR[ I*.C"; 2 bTҡt{ hAcD �������eB-d$QrI6p`S$m0��rP`b����������vT`9l �vIa ��×L@��TCyg���bL�, ������� sG7w(���* ;���Av0����If22"860H�B:طY���@Ex(o0mbp[AJxn"1μtݕD ��T ^mi�*᡼0- ����X-݈FWWXNnK �@KDTCy�������BKO Ld�@-=7�����E[:���Tl1yH T n4����lb'D ���@"1Ld�����^0um)0$//0�&j�����boB< NP������*` ���XN/4‹Ld���������2&2��b\u�t*o0ܖi�*oAb �������������bho T�2 b�����e;Lb�����eHO M%T\0- bD"#"x(@F��@{6HTRvE(0PXn$!Fukae 1��@EP 5A@"sͿ�������P<o! 6U92eݖi2:-D'P-Mb�������{iM$HyҲB �� &2��оM 0��m9:7�@qp[I ����˅o'"0UL3����;7,L @r Meb����*xEHR,6 1��������4,"_.Cy�tpX= 9+ e1{YI,-<7������%=_'<{R Zxho`" MeJ�����C{*^iP,$��Te0Sb6$! $�,xho4 SaB+ D���S{e&1�B Fe/47dj""����� (S{Ú/4�ĂQ"�������������P` ����ծEl�����iyC`We������X޺A&e���m&[ʇI8XUYY�@Ly$b���8XUY�VM2U;ʅٞK\0���@en' %hi+X-ip_P������������0Ɲ]F@�ȂQ0[8ٮHЩt 0p/Q` ��*E4l`Q$5k! ���@e&1P1xYI ���`9|UFe!5&mFnO ��������r6Mb���,i"������, oU0���XvU���X(������� lwܦ������������������������������������������������������ ������������������������������������������� �� �������������������������H�����@��������P�@�P�@��@���������(@���������� ��������( ����( � ����������� �����@����(����@ ��������������@����@!��@@!@@AA����@��!������� R���(�PH�@�D���@��������� �������H�@@(���@E� @��$�� ��$`(�&&)` ��`���0�s P@a��&���� (��LB`(��$�(�������@������(�I������$@ ������I���d�((��$��$@�@A)(��@A���U��(����L��P�� ����`$� &��0��E�������� ( � a. ��@Q������ �� �eL��(c��( ��L��� � `!� ��`(�� �� � &I��\6 0`H�`$��@�L�����@��P���e�������0 L2��\�����f�����2���`&�� ��l@jT���������0�����������������(c2� �`��e�C��� ����1 �e�T��l.0�0 �2`������ʨV� �$�����e�C�$�L$C`r�P�$C���P $��s5N 2���$��ee@IA�� L�P�e�L ����2��S &������e�C��ʆ0�e�0����A5�&�I!���0!� �����C����ՠ��`@P0 O�C���� 0L��� �P @�T�`�0&I�������!��P ��I(������!L�Հ���@�Ԗj��f$�����(�(j� ����LA���0��$���T.d��@5���`�&(C ������`1 ��e I ����0 ������Tc��!��LB��Y0�����PT& @5���`@%L ����&��� T!@�2��( 21 C�`B�����e����@�����@Y�@`@@��������&�A ��(clSap��(���`P6L�`�������e�e��P6ɔ$ e�P[P$ a`���e@2������ �C�&��`��� $$� PI�2��������&�0� Wd&L��PPV �՘�P@YI`��(``��0@՘Y L.�@�0 �Ԩ�0'`�&)Ce��&a�xL�C�j���������Tc @���2��2���Ȑ2@�3I$ a@�e@Y5������eՆ�����&a�0I(������Q 2�d&$ a�&aH�����H0P\!$L�'aOZ� ����IeC��`:Lm!L�@��&aH�Ld�� �(��L2�2��!������B��Pj @WR �(`T՘d�����L�`((T ��0�e�e������� ��������� @&�aL �`p̩m�s5e&��0�����LI�0 CI���@m ɓF `�YTC  a�����0$�����L`TI�Lf0�����L ����6C2$�����0&a��������0ɐ a�21� 0 @ʀ�`0�P&KIP6�&A`��P��������P)3�Q!L@���P��e0�0e!Tc�������2��II����0 C�If��0V L2L2 e00 j �@ ��0 3P 0�L0���@!L\m&, ���0���2�(0������0W0ɐ @ddP6jL�2�C\�� <� 0 dAL&�Lp�����������2�P6 CU A�ʨa'ala0bf2j@f`0�Pa� R �����A��A&a������0'a��@��(0$ ` f��d���0\3Ղ! �0! e$e�� a���2JH�d�LRF���� �# $C.{Nf8A0 Cf������IP dQ T<  e0��0l8$ A ef���`0���0 C�d(M5� KjLʆ0�0 Cj !���`rِ uj3��@2kb$ L“3O�����P6��0 C���� Ս� A2��& gr����2HZ 23����@��A2I y(.0 L a C& A LII($ ��@C1@��\ə'@s2O$2HF ea L���(̈́ˆ!L2df���� &0 ������# 6fee�0!L ��0���pjd,�L``0E$3��&a6d!g(d&0&0l42Hf����L��`3� �j2IlHfBڞ$B* ��I.{0 !9L�j3Ld�A2 5Hf$f8L�2Hfpf�LpA2��&a8$ g&L<j<9 弶sF'� @m!nL0&����L`8eIlsC2b02L��IL�2ȵMj`BI L0��j#eL$Y-/�pəa@̓0g Ù $ gb<s0sVb09<rdb\b�ɇ��@mÓ0sf�A8LT9̨A2�(jL!y�����3y>Mb ���`n3 �@YY W=(��(\$ 0#$32 3_O?X4R e4 *"�����&09V$0C`@ A2I932pfa0WӜ3P|I�Pdre'����e@fș 0g0 lCle?GBE �P1r!@&L�(:y ���P#ၜ���0ə 2��b2&e3'arfL&C6Hf�L`H|3)Cf.O"�@$3��(\$ ��� a8yma̜gL(d&0і(Hms&&GՐeL���� 3je 0��h��@HXF>�9��\L����-LL(dF < � $<$0�����2Hm0���� L2Hf2əPo L�(d&LفkSK6'D0��0�&frfPL�2\''3՘���@\�!<�Ty0(b&'gp <Ԁdmf 5ȵM�����f}jé a&LI����� r��L23jf����gIB�L23�@Yy&�!3O���efB՞`c.1�T0$2+Km8yLb ������!<L y(H$����60����(02ə!ə ���ep̤ C�&<$@PLL���� �03*921Lp0 393����������@�AxJ����@1��0mPsID������������L9'0 "LL�����*9&032چ3s0���032Ho3 93�03��Ifۣ<�dB��ee]H( D�� ��(C�����'|͠ebp귌r}dL��0M-!�Lə LN"�0a&g&��������@YY��&hˇRF%93�`LL`�@kg~򟪀�0QD��-X'b� e����P28ć&&���� uE���`T\y֨��C��03� rf���L3!�Lə epxepx�epx�� g&�Lsf<Q;C�2*B���ȩ[(,XŁQC8Њ���j!�� FU<� NC�\|5*NYh d1px�!Ƀ�ᇡ#PE09��P�����frf.C ��������&<|Аڒ3<x3IC*Yj ܯ ���ʸ~ ��|U�PF 39#Mn%s rCźЊUD��� .-=Xu2"4�Px6"��(#_WTE@9X������dfrf�����(#vdeGDM"�LI0���&\g`&'`LL�`u{h2rX��`¬vfa&g2rxees$ e\c!F*t � EX#VBL"�� 2rx&eL�f΄9HL"�ᙃG8CtĥA6UcD!b&�a9yp�U@G#1Xƈ �0sȩ7 3���e<MDTX"���@2b� 3'<L>k1��j L�0s0<&̜90ả��&̜D�&̜"fN��ۃ# ?k=bcPae51P5BrsdD0 IA���1F:RW!���Lj8 2X+���@0 �PF\s@E&̜9�eOīC�����(8V�$F rU#4C %1X��(#9p0`F������2rxL9����(s[<" 9<5PsaΜ@9s"�0 c����*(Gd5F]Z#d * XGZcj"$3'���`.j@3'f| jO<5B|dD����2ag�fy~C,rZ\Z(�!b]���! #FFTQg T����fy*�����p*"930dmb@�̜!f3B�PFO5rx%93���&̜30s>+|<#H<ՠ�0yN��If 2rx$3sAޠ fWۻ��B,6 С5B1 JҲb:j�� uMd1'f 0 �9D ��`LBfes>q}PZ# !T8�@9<\FBPF�0a朧��$Sy> 9‘vҀ \�@Ö�2IŨ Y5B dўp �ˆA�O<p BUNd AG=F������PAtj d`1Ygu!¡Ck���Q!B�š ���T1Z6!�Q5BD!̉������2�� 3<������Pc<J̙LNnym@0vxLc8<ھvP�T9 ��� '?q �������� >g1gn@i@�����Tht0vUPAam3 #?g` * �8PJ1V1s# �����`9OڒC����.#_eɈB��Tft:{H` * d`@M]XF�ACq1*��R1*)U#����| d���j#FڸnW83j#��9 `ԛ^]ԊJ�1+{ĭX��.k ��@B����@cF20 ���������#,�@��59穀9|u eÃ�9$L-?*@ˠ��0sN!��s�������r v&yC�gU#d `<s"��0ᙏ"aD~u ���T6 `#G8$3'�����@m�d@m|�����f>cձuQ !2If1hp ���� 3T��@I~>c�@!/vUqY�� * �����@Uc0@�U#��@n:* - H1XjA ͟+U#� *,�QU!�0g1!���TP?,^��!D١W}B(aĪ1 )Uk;*�0bU? ����` XT�8j��!X5B1b)"̉��˟��@2bp)K�@M݊F!�Ѳ^3;dgѰX5>Ve"f<5Ơp1.$E1Ҳ3€�FݵPEYaP)B����� y׸jR&-;xU#������$Kq1Ts! ԘpWЈ[7pa@���R8 ab- �����*Xu��ԭ:TB@o64e8$�����Wja@��c�Ht!Q6k<Z$l $')B� :Ƹ1!�1€��j~*#�!qc\lԅ>5��iɲcq5B���� "u<$�0*Fa_a�ˆU#`lRz˂�@v ui iĭb@!X5B��0b��*xfV����Hx.]q1��1.s+�TQkǐ�0b!X5B��,!,ˢ}) ��:*C���PA뎣#!����dczF���\X1JG�!ĊU#oguрP �����qE�PQU93����ΨzUZ8j� zjgZtTQ pMP#V�B͡Z#�@#V!^x# �0Z1ܵxˎX$��P+aĪ2*9JgP#V����@B��&[#$u<D�ˆUL���fc`� V=ZJg+>!��cGll>VLL���PUG�� ���HFuկW!��VP#V!�!+~Uf/CD1ԊF:B���������@Oz|=XYd B�V:FaĪ#����$cuA@:B�����$c\DKg#  j,|UG�ˆUhĪ#0bF:B����1 �`QG@+nݤK�k=Ŭ!Zی" eXDT6aEgX+!۳ �����!8�j�1u��aĺ=RؚKua2[P+s14FĪ#���*X�cc Vj� T0ba8 ��d#��������PQKgG ^4B����PAkab#4f8a,V���Zw|` YG!d+�����*Xu/hW}k$�!XkT+&jb@�`bx:FaZG���!tW}dc����cq@aZG���"@Y^!�0b#C8 �Ƭjq!ec]Zq@��������H8"dVU0q`8p@�PV#b#�����@Ez::B�����$#:ȡ #uA՞a-{p@�,C-{p@����q��j|zvA*R^0c���Zu#���Hac< V��;{E3a���18 18 �5bĺ=]8u$�����������P��$#:-[ d mp@���0F<#uFi_4EP+X4S8 �������H8"�H8"���H]Ǡ�, !c!c:T ۳Xl1( Y4`Z�C8 _=;$���bZG���q+��eU[}W;) @e'@ AXU����@2Q/iZG@(Fu�DF}TPv4jC,CV ��aĵP@DZCdUigNd$D�PVYJbDz�( jŠ݊C��au{k5k���PQ+u��@Eq����q:B&N�����H8”]HgV��� z` =[ b*=]8YPSvb 4bbZ+4-*h k1����� .��*x��z��!\B��� uS1*B�0'xZ���gZF����*غ c@���Tpc=B��cxE,��k=B����$8ꂌ11+ o!m K9H@an(#X#z�Ъ-{Ԣ SvG�PuH5etw@ʮ3q3zC@`����!#����� z������_xQ zL`+n(��2-펺@cX+��������@2^ �HqX�pŵ>#1=Ut���������@��\8^k2Q(Akc\rV���!qG0egkD�Z-����i '\-sA KahESV0 C!��#oG]���0k=B�����dGXz|,DKHa0h2U����k ���� 2!< kr KH�����"c pV)lw!qG!qG֊ ׊Z ע������HYըǡk=Bm}i! A+9Ly͵}l)H$����0������$8E���P`\!�8xê٨?ZjFh`Y<l � m3ى*J a)G1n( ZF񺤩V � S^1C[qbZе>@)\ P [OBS�H(Q+Ҡ:@�Z�֊xhі( $�chٺ4����@8V<qc]�)\uHe*9Lye@��������VQ8CZ9H�����@W\gqx@0UI*=+@G\A�J5eZ+������dG,�HfGE�qc`Z��p����PQW=4;qDU$�8Z#���c8nl]z ]ABfU��0��T҅m@cֽ+⠻�ሷC_,%㤊�����@2#z3z;` ������zGax@��X�)8pZ�����\Xq@�B8kA[H���Zx@tc~MA+2 `eRM#M���� Cx[ͦA����` ^ &@azLZ%¥ $������1&ʖNb6 maRtP% ]Z!R(tABB:H����a]Q:>i%h�� (ڃȁqtYҁd)Ҡ,e ܲAZB $������&q\le ��bhK̡-��ᶋ�� 8+|xA�,zG}@���Ю�������n'-aB1.$��-a������Qa X bk=ƢgR(4誃@hUG lU ��1�8W:H���������$x  �*xh[H�����"���@E]!��B!Xw\HB8 a@ahKx�����@ź Cĺm9R � ڔ l( $$«0DaPZ$,A0jD 8e:z!0&�6���lYjbҲР4(p&b^_u�eucq&�� (x)V< ������Pz��€MA�������Z�kfk)lw+ԸQ=L K7p˥:pFP ȰriJI}$BB 2�( J ���jnxp[7G4XQQ�����`kSPc%O$B 2àl F@/ �������6!(P���@deZ M 02*`) �� (Lڱûf'X@���[H0`kS` m RzƣV��Bq!�1+欻Ǡ%C[hNˎA ULۄ5@���`1AWCkð�'@  ��(:_SN'�BF 2�������ʂC�X   q6 ,u= %1���`���Rq���$쏯1H-L �����@(qզ �������ԥǠ.q\��HeXo^cX@����������@q<`҂òLA����,W���jK>e G|Y :H\6q uŐ1_����@xNk$�DucZu���,qØ޲QN1YV4n6+ HJ"� [H���X,޻JlUri��� ( Dm ���A!c%��������@dLS @ NwWXx@00hk ��@P)T ���e9 �$aV���Aa֦�#?h+� $�aY%L��+ u��!\xG1\ 6ŁjF�v5kZx@�@bB�����#< ����ԩ_Ѡ4h���% �ò^��8Z���,u��ڲW�������� ?.C0= -0ipF� (LDch[z $���&0jS����*z����������ԛ-L����Ș0A * $�� [; e\d[H����U찴)% KH��0e �����i ����Pq '-YL[; Mm4g/a*p[@U0�(NZ�����Ű,a�����՘rS p) ��lm ,e +X] �bˎ_@@qr¶=L[&e Gm,z ThFCk ��(B8mciZh����R�����&sk K_]ɔl) �������&���D4 e.Lے usRaYŞ`I$%�%X@�����B 6��X zIk,e ����BI)Tm=PH ���ikhNFQeB����PT>ԊNRrMf�������Z:6��X,a@�iYdNB�X4cf۵2HI$���mK@��������j |?pWB��,V0@vB'K�`1-K ��� qLȲx]Lڶ �%X`,e ����^4PNBX]q@�8ZWQ4ઃ����1�����Ԩ-ugz-a���@81M%փ�� T<Z^0,-Zt( Hj��>WH���BG]q]Px��Qk}�S*ҶE"- @�������(lڔZ�����% [&lm"eI1v4)�-*Ĵ`mc4Z+@ `MKH��B&*4b)X@�����`1<Q4_.6PJ- İB)5��% !a+���������DGyA:Wx@�`Z#�@l��%<'��bX�X ������Ca{X ��&2���ð( ��� 0akSB #vQJ @P!et) ���AaF1kp, AZH2uAZ8ZA.e �P @P%L ���ڛ>L6 n!h0à5@�XaX@$4R2���1���P6lm ���_d��ư,1mK@` ˒&����StsER��` &Aa֦ ����i 9[[�@ �ò����ҝ]y1y)T�����X4!��jaZ!Q@�������(^|)�@ Q7ֵ0"^L5(z������������T6m ,eI���՘4A����%6=Х $0h- �c`) ��[t9ZZLX,�K9HJ >ѭ $��$4RPh rL������ 6òIiXa0`ilNZJZ�����U}0Pn5@��0&� jSp`��cXa 6�`L˒&��� v.-Yka ����zMm/vL�e ���i 56zKH@qR�2�������%MP(aUmT.`0V2�Dmt*ȊHZq`8W$������B_# CvP Tt$�x૛��� LC%M 1,K �@bכ|�`+9 Z � (LDqeel+ �� v@% 0R`+Ҡ0( �L")V&����&\ 9r9:f$4 viD����������Ș4A���@\����T6\cᲄ�����QiIaY�`1,KٶrxM$�BV&� .���aYdKabj �%<p) ��i - BB-4jCTaK���������� ni&OT�(f9mkaB+P`�Q-7; &�� yZ W4@���%M,eI��`1m �Yֶhr%d-=�������%M��nlZ.a�����D5TjS��%M��. ��@���m/4����,eI�ò �X ˒.eBph[H�����):*Akq��Xfka��Gڶi].6����%L�JxR|@��������(^!��|C@ʁ$xM$��Mm ���Ű,i����PRp) ���@Տ4֠ (Lؖd[5G[ Ҡ0����,eI����T/|C� (]C �Ll{+�M$b$ m&l"���@(a¥aY�A/H��P2|�b XI$$4%<-o� �P������QiI�Aa tle"������� 2t� 0[t,eIX ˒bX(RX68a!2qV|LR!2,Gm0\D@Ble"�����Aa]mj0�IԵ%$Jp e � Qv�;nX0Q2��������@dt������"0&\!�a[� (LC„jUlX0��������A��C&r,-L �0&�&\VhkaP-KC�[ ��öY-JH` ے ����¡\a[&��ư-d28[Z@�����[K`[H�qE>PP,i[ ��������"㰤 (L7,00wHE%D���diltdž//�@8YZ@hL$@Y2YғD 'ud 4V&¤4Y D@Fle"��XLے % %@�HhL$@B,0ٕ7-L ��2���%@ˆ.h,KzK;Lv) � _OMR�2r&KP(4 p!$��a��@(a­H������Dp�iPpkŴma�������J(t(2t0�4'_. �����AaM0%=m_������ rIM$���0n6���a�`,\ȩ ōU/m ����3hŴmimas-a����PZ#�����PQ/h ���������A/me `Y$a[H�ö�2���@PBijIL$��!qn g˅1ٖ0`Y¤4X0��� wYeK�H$Lj@ D1l[J4M$�������`1Ea[!UzB6�����㰥Sѡ\´@hKBv8iYfcm#$,K@�Hh]lD����cض!Q&Da>&wk]@ٲ �HhMH@a`-aBƆr..���@Bl"Q,Ka,aB\l .6�����~&��@*vNm5G&��������`ÖNEl"¥Ka,a���ư]M&*4&� \l)mK2��J+:̰M$������@ [9D���� 2gcvnm"��0f 7xƕeasڲ'xdadd.76������p i,i%+2��Z貤f �( &0f Im0ŦPh !&�������0) C(4kMNeI�� v>Ћ8[4���������rML-a,� .6!M%M ���0m&pp&�� eI = EEg˒&����1l01lWaD&pyK�����~<������Aရ4f @P8&��XY^y[=] BΛږ&����@P8VlKaröI��������r4&'y@abNSn27H����� j`0 t�� D8k@Զ4���0AHhP 4: p0YI^l"������[6`4+oj4dY�$4Fm/^,f˒&����� /6bڶ4 aZ  pno��eI�eB��qI.I^l"�� vD������cڶ����Y8l����@Tˎ] Ҁi   n65Hd1[4lY���ưmi�����rK9ö 0�`1,[axyK0P]iz :5'T�����'Ւ&0����B t0&2���@(�����ŴmW` �<E{�_Ҏ{o8Y4A0D ����b-&2Pmov��'˒&0����J8VTqV $0I`br)Ci&���B x ���@N[:Mp '˒&I :F%M`�8Y4��XLۖ&0�����B C(�T=6'Q�Mp ���@Qm%KVږ&0P,Kf `7����ö f`itf7�^K-A<[H _.1��˒&02f n6!Mv� M`@Fl &D�d4./nm"SjD@ d����%)$xM6|;(,[eI�Mp*%M`�������Z ��aZޖa����m8�,mP��@(ဗrar`��N=`6|3��P,KtmK���aۆ ��@(tN=w\�������%›~;�� (ˍ$˒&1�������ʎ SF% P@ öID`ah7;� Mpgے&1�����cض @=V~k(;|;|hzỳ��@BVf ܶ'�.l����1,h F rifh` ����\w8̄,LD ��PtU(9vM,̺*@H:M#Ka ���P,Kے&0��%ف ���`1\4�Nb8ٖ4�������zeAZՆ6L`P^lk R2�P`3\B{y%h$&8ٖ4)N%MŦwe ʅo ,hE0 K�ɶ , T@8ؖ4d /sR[X���Mr ��˒FmK�ے&0�PAn2An6����e`����������J*Tz, T@�/BBܪctm{1Ku��bկT@d4M0{6�������@(ဗr fh�B ؁hے&1����%|XN7@d��8vcvI ^iӲl] nf"# n6�������mM��������P$傗rhyw7lŒT4e(ed��������P$o!�eb�����+LtxyNb��������J8BB ف ����������@ 喞K9��p7%Lb��X m�/2A3haٶD䲤I �h;�˒&12HmeI�LOf2�����X -Mb���������~z3�P1-I0AI3ha����`1\ pYi��J8;,K+/-4���������ʨw%|��eIr:؋Md�������ʉ ��,v ov ��PAj6XՓN!v+Cu@ TlK`[D؁ hR Z���,˒&1�.K���B irIM"Um_pH>H������6LPhdۍ %4�PlK����B D�����@Tˎ]A]Lm��������ʨwy{aXhizyN`�mI�amA0 Yii ��@q-i�6abf���鲤A^ A^d"���2LdM7-!oQA^d"�2:ȋ;F%Mb��������������� a8��`1<-2Q{%%8ٖ4䪗dd/չ֞ś#[aIln$b�i)Q<&0 D��eI��tٲ@������N4Io6��XLm8BIy ��������PRMD����`1]����e(�J:͝C׶4N d�T0���b����o,j4D¡H,DB ���Ȃ$#SafUp V"3M$`�����(N. &{ �����tL3nl���tr)������Z8] `~le1�d\c/h6*diB$6p����������%SZђȃRm&j / /2ٶ 5"����D.Oy Rn ']e`�����d"����J:M2�@_ޢRUd �Y8kVXZ.1m���d /2ٶM;Fm�������%zL"{Jwaf),����� Le&8ضa�͞"3�.DF��������`UD"#���"M&2������NjOR�p dۆ Lqm��� 1i ;'oz㢮 `���������.P0lۆ ����������4PB 'D`1\.ácqm8t9F$�]M`�@&U],2# &mn*0ضa�p7��,M&2�Pڇ22�����`a\ AdB],2Pt]���;P�j38 &]8(St]4X8ț;F*&&b������XLrE-& Nd�@quQ04ٛdd�������`a\J:���������_ʳcvulܢ @qnm3��D8l���@(/2�����()E1۶app,a� y;GvnlLB � f"E`Gp $̂ a�����tZDY84Tȭ)HDX8ț8M&2�Pl0D@ɿ&Ʉ)N.��������AI'}��� t9� tD!Ѡ^Y$Fm&1Pl[v ڇ;YRl!+_)������J:5Z8444D�8ٮ 0! ��'6Lbd o0!Lm��,䥜N���(Nm=I���(f6Lb����NA`"4}[fA^&J.&=w݆U^[7��&&D4�bea`Wp &2������� t DF~ )5Il`,,Ҷ&C����%&2���vɎm& Ȓ&1��ۗ �Y8Ld�����,6;vuH�Xw%"/Bq-ZZ@$HDTcQ!!a��M!dܗ L Z8K9H �, Tqrن%tLl- bi(oeM#W`F�wŜ1���=&D�����l m9���@qmS$FU,6!!9 .0��(Nֆj-0v禗߂���������� (/r{vW`�������E2-.$ ���T[D H76Uܸf$a�����brٲcrۆI �{M\ vIe ɾ,o7g7b ۠ZOUM) H���������Mr&Q"RA^M�TL.0�P y)p i*o �nl/* "dV&"���ParYP@R `Č��������KӦ &b2� QvqM�P da+1 Pat XP@Ą���͕"3�Pabde��0jmRbr٦I ������v&IT #����@h$_`"* _@����bg$*&c6  Ld�@% d,gm���J8E|+O]oK[^@ ���P1l$�����vm������o_)̀Ne^@ \a E2P 'ۀ2vFc�Q(♞ 2d: ������v&brنIanm+2$1����@(ط/I ����`! L5Qd ���͕"3����I&JarI ������VswɨE sm+$WZwf#&("��ParaV|.$2ف ����������etY&�������tb�,ep��@MP 'wOlιk[!žYHDl@B �����"BP '{I '{�e&1���XV_Av\"pǥ2Lb������rn[xHRl!,dor �P~Hdo2 "MA 6xfi)F ̂˖6:'^ZJ���������V{ -/1ui)  'b����������@҃~ ?m`���P<Eeb�������o0dv ) ("�" d���kB/6 "BE ������.@cG7 (��)Q.sWl���v0 `b;)Nu�����������E|\٤NJf*ɄP,J,)ڮ ���������XZHN������x*�`9\C@�����^eE6(do0 SapI �Jxh/d�[:wjob@�������K"���BK @wE"3km-IL>$&j2P '{������������d���Q�0ISr ��������) ���@h|S{[!",}���������D=.��������Pd@&V^uI" `%0�*d_@��������X&P �d_`@�4- m2������BKT nK8i , b����Ndbpۦ Zxhw73����@%;p vI����4@2���t깣͛`&D$0��*}b�����*L^,����`iz 21�������()|9r154 5P^2Q 0tqj]0p$tdlEc�����}Qm]!C��*d_@bpۦ Z88��P d������������^tԹC TM����Gؗ1չ喒E+[H d����@-<8P d���*FV,xu !lXL C D����ij-/Yt<hRUl%= ��@M��������0X/|\D9��������⚭�g��������������������������������������������������@� ������� ����@� ������������������������������ ���������������������@������������$������������ ����(��� ��� ���� ����� �(������@��������� �P@����� �����P��P��@�����P !����@@�����������@A"���@���@ �������A���(��(��������������� P������������"BP��� �P�P!P�d@ *��*H H(�����H@������P��� ��L�„�X�&(@�(&����`�0T �(��&��  0IA���� &� (������������P�*&LB����(�&�����&P�I��`���&JQ���� �$�P�P�s5$�\m�&a�(��RL2���� �� �(�PV0 �e����e�Le��C�d�P!e�L��2��C�� 2����I� (I���� I*�elB����� ���������j#������L�$���0 ��0`����C� aL2�� I�`(!��e�e�P����ML$����m�����L����(`F����(If�������@�P$��Q ���2�l C��`e��������P������l2����L�I��@�����:���e��e�0d�&I� �����s52��&I�1!�C������0��!�Tj!<Wc0l��e�P 2I�����������0dH�P ��ȀI��!�� ��d�P �6�����I��I��!0 ���! ����C���020��QP�P�L�u����`R��$ 0���0�������P6'dL�@�� ���@�@���0 ���@Lj0T++c��jL��L a��j#�$<I�T���0 ��� j����e C�������(!e�`!�� 2����!Cd �0 �$������ ��`��������ʘ( ��`Հ2�ɀjȠ��PV �� ������L2���������T*�L(������L@A@�`ʨ6@� ��`@j aPV������$@ �����2�(2Y2���`2&��e��e��0W9  `���T �L������a2����2� �2A2����&�a�`2WZ `�2S ���aL���e������Հ0 ����������((���d��0LjL�(��`2�2Pj�P���L�� �����������(+��I(P��P[�� �&�a��`�����YQ�e�� ������(��e�C0������0 lrm�a�5������&���e0��ula0�@������� �L�Uj�(�!C ����`0�0 ��&Z �1l�Ls! �!<I$ �� aH&Ð ����0 C�d � aA�0� a�b��(@V����՘d! T{8lڐ* a.a2HT+� @!<!� ��&0j0�����$<9 A @$3����� `��Mj$CjL��� &a$ 0�����0�� 0 *a�����&a2�P0��0�ˆ0ePc2�01%�0 �e�`6O< $<9L.ņ0��eePp��� cl�e0a Ա�05'g&a�!e82CjL���0\6���\mC�� L5�0 C0 #`C`C�j0P,C�! 4��@ )00����Axrf�� 2�a! �C.C �����e���!����dpAd& �LkeCD�`Cjd� aɐ<''a�(0OO�@! e@jm0 C����&a��Ld.�C �j@�\1BmL2SA̤ ���C�� ���0sL��e0ls<t2�0��������2\m̄! A! �$ I����T0� a����Pa`j �0 g&a�` a a0���P � � a0[M6jL2 )#Wl0\6d''�C2eC2=���&a0�(0��0 OO��0\$CuZaa�`��L2�j A�L( ��ef��������IP �����$e$ÔA2SVn2e��2�d�j3L����` IIR$�@ < C��'gVZ- e�� 0!L���\6eIA2p� �������A2 0 PL(d&�L`p�����00���ʘ 1'39L,pmCmHfAmHf��@$3�� |ِ3O&F&A2���p���P1B$3�Nm@f��A2 �Lp����������L`8 0�ʘyr\ ��e<9L`CPO5HfB$S$3����� �PL���(+`�&0&eTc &Sd3S@$3aR6e8L��&0��fN �@m!SG<%O$2Y����� yÙ 0<O0pFdfAp�&0 apFr̜H&2lҊ#ck{@2HfLZ<L�`×MP0a�3�`ep���2H LL͜|F��&arf��Am 6I2��Pep6F`ԀL63P $31'j2s1HfPL�����`&g&��0LL��d&g&�L2���"I><3��\s���063��&ə �eTc!����2Cʘgrk<M"ed&'�՞9 0�d&mr @mM=8@2��0LL�����d&g&������1'ϓmr^`�2jp$3�������(d& � m<I&_$���������`3C`rA2s':6<WD��L`rfesʞ|p @b#g��@s<קlD�Lŀ3399"L��&093d% ��e &093���� ~$P<LN"��@ulr!���PL(|ə A2���ʨ$z;dԘ0ə A z$BH ����@2|fș xyμn( d1c7=8"��PL������ ��� _o3~#I!�e̗=5�鑰hr0H3jGR-XAк8R"1 feh 9arf„Q;7<+7<:&Pd&@$3d<s0jf���ef2a&!Cy&'Ag&g&Y̘������ 3|x2ar���&k{fB8g.L`LN"�ԖdHmf�����PA�PV3( 0932̐3��� 39[NfH�frfL23��93&SFY s0�(��0C7m'eŕMa&2�&n9Ι'��� 3Ifrf$h9����IfrfB�@63s23���`$3dyL"��eqO5 3<ЃO-zr1��0L���eԍI!YDZ*B�����`dYLeǜ0⧹!)AIa&'�28<28> |4B�� 70 HI4Rd@.I��� pS3�28<jpx*�2$�Q32cTE��Pg�����\6W`B�`����H<yPk($B$I@L|3������@ �&yLCfr�� ���&�&<jՔo̙)>ƨ( 0E����Lf9REIfr%RIe&'GʙsfNd K@@DA=9PF��euN\oGc9xqxLЖBFr�&g&C�����`<��*ə ������e&< 39$px"4ehL͆ A!B94 3@0B#"fNŐ�`gLUǨm@ir+��d��TP5FUe3:Bdd1'uky����@ g&Lf��M>CcĠY`E!b&�`Wg{7F("��jT"0ả2rx0 y"<KM:�0a@9<yD(#ޢ@jQ�PFg=*\ZAL@��ƨ, !I�����0a朙�e(#�C3L>k*"`2QK>�ə aC�PF�2rx���̣K���PAU������N`e�F~��������@m,"?qT��Po a��0gOULKDpc G���`,;G�ar<9<��S_#TjƠVPD�A2�z yr`y7��P̙#�`��������PF&<IgByΙ �sf.F�٨€""�sf<5ƪI @9<2rx�ԖdL�0sL2<$9[fp �q e!y&�q5&y&����3���m bPa��0a朙�3 sL��0sL� 32rx��Lv>T��������|�*U8”IƠ€�Q#cU#�� C9 ��0sS����� ���/{"����C0axҡ5B��c5*vͰx`��CoQ5ց""F�`F����C����l䇡cv+a]X`Ú6&R 0F���d`U����@S"�PA9@9<s1rX[rDO�cЖQk<j1`tvX11 C!�1kG-I��!FE���@2R˧ޞӳ1P!�����j#g��!C-96Ül,š,g= J "DHf���0sL��ʸڐ@D���L _ã}"B�� 1.l38y#���Lx XYbz\L����!�lN'>1 9<2rx*�j;pٲ48�2r7�������q5z"F�@R;0so҈֠���FϤ99L@9G����9nZ"bb#0�&̜)Df�������@fyj2oQ� �(#9?cQ5j��0szCU>Zi&1I9g~��*X h�0aǨ[KaY=x�����T95 ��� 3糊`<TvD�Uf<@ɇ ÜTMb<xC10B�gFr����ec,bY rD�(#gfr������� eL�jKœy�sm(�@UcM��$#(#g�����eo^1 �` *RD1��^:�� 1Bn< Fy1!��B<u4(!Dz#!�0Vҁ�L9 ��)kCF4Fx&]c!Ds!D��� 3* 33B���*6��0Ft* ɈB���)1K!�� &3s��~Rv3$ϣt�ˠ�ٸ(����+(0j �@F-h������FUc-@F#95d 1X!@ ����������*jk$#W��@O���fg]VZ#cP�c*P("j��!QزCg<Z#�!D1ny ����q re2p1İ3Vn����j?Oc(D팪 � !�TPX�j2r��zՕfR��'[Z8 aq�ˠ+�@ňk!X\k!����� uન[Qk T$# ~? T8T8����qh]ˆZcd~*���TjA$#?�5~DET8 �!&)'!��Bx2! >P39<4@ xj���T9mkz&!YxPU������������ ux�� ]T���� 1�H1v3, Q4 1 ��\q>LmCF@Ly�nm;0P:n£k}�������>u/|T�BfRY12eqH�زH𐂺EpQ:B���#!X8p��HHk,Yfn=Y2c\k ����@\�@ꈧ҅#���H1Ƶ��RGB�@Zjc?���� c��@ꈃ+ u/)bX ���Haˤ#"rЃO�g�L3)C:P:t!���b1�b1 Xk �������T8�UˆP#C��0;p��� ���PXC���8֭B: �!k<ngc-P ��d���T8�T4;B: �RtXǣ4b1$�xC���@+1B#C��X(�L@PG\_nЅ` e�����W@k]q\#b1������Hxk:C�U`Ł2FB qA+"@ !�1ͮ+UP )օ1B!Xk+"TB[aZ����PBv+B4!6wkC������ "�����1.U:��:1 XnЅ������:k�PC]h p@�ˆ!�aĺp@1S-c1�q`X1c ��P/]�C4S-����\z:C-Z?�Pb-������H",,4w񫝆 ���XZ,mX_i�p�ˠ#1CUͤ+>Ƶ L"j0 pCkC@#:��0Z8 XZxHq\G`�1:Buܺ � ��Ef_1k !�!�aY]40#ԮHt�ˆU1kC�@ ��:1����@2E�$c\Xǐ1�����VZDZl dx}I����A*Fĥ����\8(א�� xq! ��c�QǡJ@ٸ0V{���R1c2ղgX ���XUR ����ԨUq ��������RG|׸4S-eBTX,C-<kC���QCb�P`b[Wz!b-h pC-��늀0VHd bңc����� B"JFu ���q,=tˆcaD])9JgpCDa`=C���0Z1"ふ!DcC_ѭ@T G@#:kC0f*1L_.5B��� 1^j( jP X*FZ���u|H�06CKzE ������qFu X5:FcPD��Hx]8baZF1F]C�F@W{c�����T8���Խ5>u �F07k}J=Gʔ2H ����@#u$Z1ƪ�"Bm6֊Hw` p@@#u 0b] hYѪ������`գFD\Aw+J9�B1JX�������@@<>j@ĵP ��1h67k|H�` 6;2J+p����cfQ/QG���@6����P-%:Ƹ1�eJz{vڽ h@a ��� Ċk0=0ejW ������@5Fĵr+>k +0 ,h ��� 1q/|��aĵe*zlw^x@��4 [QF\1�����@d#]륏Z CYx@�0Ƶpu](+8@����ak!C-< öXz�8> �P&1)~?RHGX��!����q���$c����1Exz!*+J3)S-< ��` @ ���V=+9dC? X,5>V$6Kb]I����,0A���PRiͅHX�� *Ƹ1����H#vW�bԭ<b, 8V _x\K dj����ZcFX����Pָ1Zf*ĀFF\k*%5��@T1���@1ZW|mJe�e���jԪ:� Ύ*@FZIA���TX-0VUv/< C-<ju<p#��j+F\HUz \B(F\ax%P *0��(0AA1Zhĵaa,=@ňkǂW�BH G]#Dau���BXqo#G\u(i_�!1C-< �����&������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test-2.wma���������������������������������������������������������������0000644�0001750�0001750�00000055106�13112005742�017643� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������0&uf��bl���������3&uf��bl4������� �����t�e�s�t�����������ܫG� Seh�������݀cBl?[FZ������0ܤ@�������#����w<����+���������"��"��z�_.� Sej������ӫ� Se�<��FC|K)9>A\.��������s�k��� e�n�-�u�s���]&EG_eR�������ů[wHgDLz�����������4������D�e�v�i�c�e�C�o�n�f�o�r�m�a�n�c�e�T�e�m�p�l�a�t�e���M�2������ �����I�s�V�B�R����˥r2CiR[ZX�������������������������������0�������"�������N���������)54�I"������������t E˖^ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@�^P��������W�M�F�S�D�K�V�e�r�s�i�o�n������1�0�.�0�0�.�0�0�.�3�6�4�6����W�M�F�S�D�K�N�e�e�d�e�d������0�.�0�.�0�.�0�0�0�0���(�A�S�F�L�e�a�k�y�B�u�c�k�e�t�P�a�i�r�s����r���]�� ��0u��R ��ȯ��6��������m���*��0W���� ����# �b���@B�G���\�3��� �"���@KL���������W�M�/�P�i�c�t�u�r�e������i�m�a�g�e�/�j�p�e�g���t�h�u�m�b�n�a�i�l����JFIF��`�`���C�    $.' ",#(7),01444'9=82<.342�C  2!!22222222222222222222222222222222222222222222222222���"������������ ����}�!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������� ���w�!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz� ��?�+k3jFgh%$ݫq&n6j3Gq!Ͻq7>)5we;Yʇ.N;`NsZMtkQ=3MKn턀? lێ@ �I�s�V�B�R��������.�M�e�d�i�a�F�o�u�n�d�a�t�i�o�n�V�e�r�s�i�o�n����� �2�.�1�1�2���@Rц1�H�������ARц1�H����%�W�i�n�d�o�w�s� �M�e�d�i�a� �A�u�d�i�o� �9�.�1� �P�r�o�f�e�s�s�i�o�n�a�l���.�1�9�2� �k�b�p�s�,� �4�4� �k�H�z�,� �2� �c�h�a�n�n�e�l� �2�4� �b�i�t� �2�-�p�a�s�s� �V�B�R����bܷ� Sez�������@iM[�_\D+Pÿa�� ��������$�����������b�D����"�����������������""��u{F�`ɢ ���������z�6&uf��blF������݀cBl?[���������]��������"��+�����4�`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]��|�����"�� �����&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`h� �F�&��`HU�D�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������)54�IF������������������������������������������"���3�I8�������݀cBl?[��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.aiff����������������������������������������������������������������0000644�0001750�0001750�00000041504�13112005742�017622� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������FORM��C;AIFFCOMM������@�@ �������SSND��>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3 ��ID3����{TIT2��� ���test.aifTPE1������artistTALB������albumTCON������genreTCOP�����TLAN�����TPUB�����TXXX��� ���TRACKTOTAL��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/silence-44-s.ape���������������������������������������������������������0000644�0001750�0001750�00000224141�13112005742�020612� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MAC ��4���������,���'���������I C(|'|<�����z������D��|���RIFF$ �WAVEfmt �����D�����data� �YE����������������?��ڪJN9T�`T������nhO( �����Z�OC)3 ���������������������������������������������������jU 9D� y����������#< ZJ&�������������������������� �k , ng} vibMQK���������������������������N��k[+`娺 ���.6.������������������������O�nfB�8keFq5N^  &iޖu 𜮓; C��^�����������"|[I'E&A���X.混[ܼ�eV*8���I����0���6 }q֕"b!V���&�6"Nl�+JF#Fl--6FھQnhlCnR�8!tj Rs Z@Ќgjϑ#+ғ3~ Y� S#dZQ4/.�~}�����7{�Gw�������wmDLUZ귀M.u5*G�xBHn[.�m@�q$��^n$HudZ/z~`]<h`���9�����������J`�?%M]~q*ku T(>oއ`lF!ung mX^? ّ=|} ͖����.�BY� ����%j�5mh���ډ2��E5��ÎT"0QجpĻt�=}+! MJl�RP�^-7(P]έQRzvG\pQ��=U=h^$I^Yp���p}�2K]MkC~.d;*F�uT�Eۿ FvQ.z,z/9 2{M3nJ0gfhJ0"Ck)aN]L ϙ!u��]��;Q=LJw݉brH]%熼;pZ͂&Q?-$ŚlŚ(f%7,YcE0Cי1xMJ`E` T{����N��4>w.P�g����0�]|zYmmKXvck�~s(xnX3��فobƅɼx t�G^\'6B{gGcC LUxb@pXV^uNQETqQx`G$S7�ǙWspQ3"maؐҢ}}� ZFڷ;Ffؒ{f!Z> V#1mƺ"}����.C;0��������\� ,BF 8l��XOiw�7м2mB��Du $z�T<enI7T|2 DfN[B ۵{-wy+qDכd,&[ 4CK]bmgA RO��Z�� "H G�]r7BqMw#ovgW,iܮ|$GRWs} 619n<[K촾V_9VvNJΙ3DP]u?5 űv徥3@zqI&"~7yړ~,K:=& #.ӚrZ!6X2>\Zv¦ܷ|>j[ogĔ^˭u>~甴<]VE *6ESmLD5^,ulf̻ �m}Nek} ]Ի:KT O`0�ykeFxkAJX4Ϋ刯E0XЖʦ!̘J ��߂c�>jǶ*k&zK"LI-Af Pn2 \���k{-o PxVaWN8 A$j���hXʷs|7Mr<FwTE})[ǾsX5X;UjZ~O ?jajI �1LqAm+? Cu���5rxSI[~ ;:2TٷDƿРyl7Vh"Fp�8w)⦖Q}AF k9\Zw?DŽO%bwç k /۠>^IVu@hX o`cq6_ E񧇟c1dž���E\6��/zL5@"c\yޔS310P%{MbRu?>LHtj5l �A԰|egpkٛ(&zH $πw���q_PV4ołK҃ENJ".?R��wͻkX)�Dhy8d yq "4ҪL`F2z wGL0^aKM$>t3 XOh_{>0lCj3bV_<K/Nkm6G';'%73r��moѻݏDNDI(j$vWV=J h~ꦬdJ�m�I����`�v|ӭOdk9&zf]ٛ3%VD{a/We _2ia8OsRpD۾GLĠzgcN/x|~wB *=PLLk.*\zxCQ՜���� ����.6�LH/(1~k ��2#˿ >&cT\1/u!q1'\=َt\UDlW֮鷞Jh�p����� 7$�) �, f<rﱀ%��"�x�k X2E.r\(KJѣ+C7˅u�x"F��ݹs\b ]$�pXa���gn#zN ֮̀����0VxʶddeXC!Ak8~+WOSn_ސ< b4)VJbl0>t|&b� i�����%ȹLzx 8* ba Z2#$jhЯ\R&N@D/;������ǬûZd࿕#W:B";�U|)( Z +m&~L6 $Lx/u5腪ks<@KŸ�i:EFqT:T">4m+g"4+7cNk-;++!cP?k ?' 5+$c| Nc $q^�:k1ӠɺdչA0U+�Ȏfư%b��~yYNTSIE�xo?7;I�p͙\ ;2+>ZV^ׯ,ow?NKդsa1׻ٿ>A"M0Y4gFyV� x ��{�j6-mz@ 1?ᄀs@5Ddh?%P���ir�������� Ymp^�B_gLz2V˘&C"# v^ԥ�ym5Fxlq {89�@Jr@R=4&c\k Tϧ'z'|.mR��D؝1���%[ˢso ] /�ӃcВRf>%X}Y� 4l, Wt\>6si2IrPGWCK풟6i*! Ȳ1 joUqM;ȭg%X:+֯N{{uŌkһUdrɨvl5J9>D]ƉF]X^ t~jqpQjInkx43$QLr% .)[ƀE$-,Xv~!2J(RLy큑U]�2(ԐCYUry'`f ?*$/8--[b\*Te2bꠋ|1r6XQaqP~"]< yh� ƵG;&K%NULm jxsS^Z (&p$z vVH '*c3us[ j2*:Ո4� LN'�=VzqțhѬtB1#q~9'q.7 x"0[ jvŶXqo:$Oj@"Nlٴ%GElO<IJCE�s���lƤzR$<>22 >.Uߍ$j4?&ݮ&�ȊeLlGWE)Gh$U6t &F#mcmb,�</<]r/Ξ/5펐:5&uENg|]pfJ˾=4?a<:!lMT@/Ɇ'9U+tK:*Úv9wIluWAeّe<U2>S)tJgF4(� ���d|@ѽqb ?k;@ݼZz'k{+)_(O+s6$pn:)e9QTjʂ>}cA}znqG=,,GGmz!Sa@BlgPknpv=í\ɋ�xZ���# - qʖܨ:S* .Tl !6%�-5$ %DViÉ_y[|#�5ؕ 1rkn_GLeۺp$n^ˢ6֗-S!IXZP ,Ƭ�$a"A�RHIp/"I��ʗVKty[ԒN@sz-JVf�I N|lCALEILqqG=~ ` Y qo֢8gj?$/G,Ώ_ (�/O�xVf[V~��$t�������~<W>%y�Xn(1=>mϗgbe{);k׮pq6ˉ3dMWR<w Հ<75Ŕ  . m*Oמ=G)�P'xyQX+M sHܞU8!(bdyJ*szU%�箈sY8aV| {Cޡ31P 1t]QHpy"sNzsjC,6UPJV0n ո��(}�d jd�@L��H7S3CxBmX5=w~H�<a��B��ROe�8 n u'% xv# 0RE[Bou<Տ*�wn*/j|x4jѲϓ�J3_Fᖁ}( #_Ծi��w^pUvE{F&���ufɭYA(3 Nm)Vsm k禝s+Ƞ/WCa@3It 7pI[Ee|[|!��@CUn&%(*_d3,Lֿ7��# `=p1IV $*0xK8o�D$ ^\$SBٮG߄<pfT4]vrl9G}�eɃOF�/n�gظΙ�y,PyL\[ߪ &# B(ϕ!L^JP;=\7>w#y@D�# -=kGD71�8 f]�@waWYP`cX Xͩ}uULP)sɟKvEz \0c#]2'mWZx7H{x,:6yg҄<B{V.v< ;;v{柭n ,W5`qB�f-3.GF A 4T%n50T>)#m�cjLgS1^D]-,h0kL8>z ldq׋ m,�U GC;ڄp\UUK EXVdLdjmQscnGD̏|̗ΰ#!$a|a#n(bED|`|ڇwCc__@U4 * ;��~9۰w@|wؐvQk7tK!S??�t*(!uBo+"ahk2\ i@X^&QxG@�a= `Ǩ-!:T!ðL"vhBN:\fδSo#6HX%gZ '�ZAxE҉ 8*vW1OkvC!u&<(dn@|4Kw!EWb}d~EӱxW*-7yC_QP4xm&]]НpQeߤ3S~ޏԆȟNub[88iJUs#g\$>/J 78Ukz3"n./Θ,Ls^EP~ /&[pŞ SrIC֢x/5 zBAj ��m@�0ٷ=��?ElxGW/3U�WJj]H+؈ �('.�p!Q8��Pvd<>e2NUͯ)A�XM?LTj rr<Ầaǡ<cDl"B3,lMw̜ "õn[�(PXdKy-u*Gdn9%^Em" g6'fnɚa ڸR$@9�Tꕫ+/��1���<xu„R��r  �ǐL�f <�eID7`��LSܑ���gȄ Q1g<(8~!dhL O~xf/Z&2�aB%*+jKQ4u-H/͵\[s,Hf�Ig DIHuARD��|� Á�. Y a|d wWGVH%cLH�1"���0(9G��[<<Di2�.T[_)BҤ]/4d3P%���&2���4,#o&\.5T&]ƀ)@Q��w/Hf?B~Ù@4��h* YI���p�1g|2lDy�� ����tCJ��<G7GredTBb�q���7R充fɭ\s+uG&שi:Co܂_$!=0p ԏOWY`0:SIÂpo :!Zd^3 /WvA`i`Q/0{͘QXFQRj%M7'�ا!HF@X@'&>]C^9ݕ �& ;ŨbĽ3C!il;�؎[8g[`i F`߿Svgo ~Iwԏu k:}@ WD Y]8pgkcډLVҋy$c �&4lc$?gb@-Em�b3v#�[6Gjمe,YZC�`"xo8џ޾ 4<w(7Z:dUG3DXd vlҚ&�tWH=^Esxw]Ga4$D"g�0.?-<d,[gފ0pO0}&)��1_da��r̟2F�~\ڪ@) ��--UEt 35J]ҝ*27uثUEa\m5H!)u޽)Am\\�h_VĔޭ2~v7NqRl7Z>.y;ML1(yc<HK{k=B"ZpOWFnkWGt1<I�_:WS$B`FwrvE91/�ݦ-^hb׹P[S sKxlXW~LT]-(;(jnBrK;!СbO5n<d-'ͼEs% Jʻ[OGG�qN�+cRj Avu1۴PH˪ 3_ ~��tHIQ!>^dWZTZ<|9*[m9@ iO-δO5m j4G  N)8Cu~wF #%cw  ,,� qju8u|';WA\qѵ]o6fOC3:^fuD( 7B#yG-USG֦*YR/-f9>pg@P1?x؍\_dHɱӶ5%1#*u`ueNo$ϯ;O@k"M2j+tn.<sMbK Z3Jav /E:H~d}ds͠7(bguYtkQV� �洲7h!Aij/+ ~I+qzR2���N�8}xbx���9K`_N{L1Q���ti�'َW Tt״Xls //s% !=ҳn@Sۯ!("L!Zxj)s'� _`Nnm!(suh4Uf%B+s[Bo0(*!;/%>Wy#$yǾD6F'z&qסn?dOՑq?;cO-p R:6ٰ"k^tvF+(\Y'xwƀ&Vj@:MY-݈V(ᗜlT6|ZkNVxL�D*ÔECv&oQYC L�[h;g��J4 o���9bSpDE1,'8���p���c/0<tBh̀Ux[5yjŠ��T(}wZ]>~K}eb,NFFRg6i7 XљJGUG=l}�u<5־vC.}g�c(x{JO:�Hν㮥 y N IoBPnʻ#ɱD]eb&TZ/߻J#91v=k=}(6axX=5R~bT ^R<>dvbZ\B;.?MýZ\ xر$-(Ū%m@w0 AAw=,˙޴a\owY/ΈTs�#)Y S]yG,_Wp$d Wzn~[2b"rX;he=`ى{ٗ;"jB?>%wI#)3%0WH O)[:vyѝ]~镋-R\crQ++}qE_k6kM?*l^2kJf%_o>VlsE%R }~W 87}rfIw/>?HHTE [Nl_7 ZPn#c7x掎Ic8(ǕNjp)>*8,HrJ t=�vh5P�vף6ڗڕh_k�tw0tIotr|S����+,z8 �=�c��9��|U�;���?Ѻxja$P%T/���̢��VsU:F\mKR΁oϾWM?}0FzR^ 8Y/*SX*goCIA4bM2=XjN$�vѹYېN*!V\楇hB:Xt{jD]h?���>kݹU��6.*8' !4ӣ1~21G?Ioxm$"�\Tdܧ:1 �=!A9X3wD3pVJ7"ôӿS7C�#_[,)h@YGh\<PAڵ vBR%l Z>ze** 7�I �� ��������C�h7Y#Y��}5RlYK|�Sl�s��U��������6ST(H��� ����,j +XV1��qi"��dyYQ.de K!l ��ʑ}�w7`wҢsl %T/qzܺ4bѬY!{ݵAQPN6wgb^:Tr8J-;_Pʧ. nzF ./ғy,O{1`uP#3?`v{~CdQɶo5r֭X691N,V1@v*& <Pqtuݸ<;$Y'ad/'mI/V6q Mk|Bٿʵ�.qa)ʉ7k Gg;~dG[gmp+֍"2%‘+P[C$Z]㽒wπ,Ҡ7FG.$G9fڒ%:6e{|v ص|D)Ou"Y�L^bvLw!"�3#ZT :" a3h6�' x�xLj^AdO ,nui&@Mݾr/MUx" =NkRLj 8_9>6]aïzDŽa:}Wt.V'uZ}6e NKInZ!N{vdٝ\e��u)j4#(��hh'�$`KbNCy�lLkѶO՗2mVxDIH -�+wjvm%>^f+=HwǞ2E2#uiU/ nA[KK>\KER(�fSZr1Cj7 I: ASNڄ4'ۃ)A �$O9hM���=Tx pڕuoSjVPMj!1S.h+"Z8].~^dLz �x[�z`했CjC;k4:%YyC@O37LB53Bu+%zAMUB+X �& wVz Na ކ�Y^"a_śͮ̋ (r1�YǖqZkrLoַ,D#a J=b�)GzOjӖ"Uc$⼭Z;,lVZŰVD�Y'rR90w4!F_hoƭkN�\BQ1KTI Őt Hox;V?HݽlW+K:EFS|UwW@Fġ�冑���+-V$=ljf5{]/ ܣG�<eAW �4/ !Q^>fێ*S3/u^7߬ƙp߱M>\yC [$,9P MOmv캀';Ķ}N��R򊧑 k%TΔ@Y&-6;*W)Lecar.m9ӱ3 |}׮�^x�~*(/K!DQ,l: !0La  Gi9(=dc5Ȓ:bxTǺ6M}<Di,.Z<C[#i;53t"y XPu\gNE$�0��CZ M7y���MvW 7#ys,V֥uӯ&KbtfgJkdjf3qjMə~0" vr�V>!͖A R{ƀ 1Rt7-cYz.ᡁ0,A2pߣr /h+XҾ�V��Bfy�/4z5vR��|�_Y\Ez0 Y%;�V`�1i2pFK/y:q*)kk/9kSRF#^ �D3\tj��"T=�p1*�¾\:�͑s ���D �; H���nDD l[fhmbF��#eKXGr" aD����[J]>"Q��$= �L\!]dmPəQ���h!!8x3 aءG@ܻP` �$9Pe_]+Rzqe_XO`g[Q5@)铇gmQXuncBEcXO.9J�DgKz*` X QN!"K~+c87>?!wOS8>Lvf+5WD\("תP|syIz lp��j Ʃ%F](0V_W�6̥l=�skj` |ڔ,rC#h߼DQZ��[QA�rh8�Rsq�$z'7ȡlT<WbєAM0_|P.���w%K6͹n 9�< S%Z3# Mv,"o[y0RKf%B hpĊy[7K‡U25_g L^ YYPq?FǺlcVW6qxpP .�) CXaUd ,J^ ZT{-eKYəp]Km}\3w �%g_R� M\?T#]8]Ĩ(%[5h!*pDq+W(ĩrl�=&r2DV0%< |گ%ڃM!k݀."����a%��2t4�_b6bYP5ߨB4˴$[L��dac��f%֍wu'z?Kjs MDG\eרA5 CK-ɧ-ħ_a*> "~zڎƖ�fnKA=%II Zm VUtUPa-˨ Yڞ. wڎ-%.Rr26BR2FUO9;z9=CeFH!s7`Y�Z[`fg)+c/p넲wg-@m}%P嫘o֝GcblU^ (^?`źj;7.R IS^.dcȁ[yW`�#^-ե /AfB~}hHI$Mq [s?/m[%fQ'QqS#cǀ2ڕgr7J�JAP5o[Nq;a4^bpƯfRU1z s=/ǓD.Ƭ�o,!nRR,_j[4 x@m)H@mI em7GR=8d&?JSnO(><o_!t5 K # \�� ?}q:Cf �E4:&"ԙn tr&_i:- {' /1`^[5jv}$SϏp%ʀF^4D-`s h@2NƗ�5! w�&LuA|AL#v*xx^iWXF[(8#ڈ컉2p.$;'�Ye}.�Gtj?bfk@4N+s�%M���� yRnfX0NlX��6mK)6QyHJ;}H8uw f 4m�w=<̺J;<j}Rw!Tl. Cc^ԍ$b@ $#;+Ѝ$jFÕ @ߑ~��D$��̻㴫jsZ6pH4 NuU_9T^�oT>әƅSFrۜ_, 0 h:_FI vT? ?-U 88fy7axZ'%o�\yp9>އfUdmZFdwn,o (N4֥ RGg!G;QS;E\UҎ3&o o/sRyikKrkyc!MA\j7k,u�ė7{Fj*EÂ^2O?% iI+8�K�a]_|w$?؊C 7+)uuq=pHTYE  ZD3FW #.@hթ4S (n_m>.#;'�eBA9IW#3�,mT'=gO�מZ4qdk אMȭaܘ!u}ڢB.`@X!z8@*f~`ҥv: 9mjeBIz=)'JưfRۛM.cZ\䗮�)0l'lIL&!zQ:d\&u0t@ SfKn�;3Ye% zu@,7N], /VӾt<oGD4^IM Ң[ƥ+b|yC]lY-q(9Z]ՑƁl¼EPT?C<܉b^³_ƩWO$l�6523&Du{75GYFmnmTZcPc(往P/fVA|0Q(3~uy /Q\t8=Q(P)~�z��ʳ&zE49-�xW��������?+�� 6fSbJ=^D@Vm=r`5[�Հ`������@�^P3"L^1s��6 �衻g5cQsaV0,buLg� D���Kʄcn���AX Nh0xU04�.�� UUdLvrW PVEU3zaƌ(2q:O<P'[)L)Jn@=nZҎ/<8<��w(<@!xC]nd1)4�� t`j//ڢǎaMOՒ( @bgz8>^ThRR ��D^,X�3G<EO.<6 ߀UQjFƈNLRZ[SOܝ#x1qZYsGb`^ja�hq#UDx1C�oЦje5o�T;lAPf^=kgy.#d��<���=Q\UV)L7?9 L ޲dSVؗXj= qr )k{b5z8VR? @.uݫ-ϊ:l?(cFK|Uth|{WIA�9]32 M%\P[Hx]+K df q<9)u<c3%O�q/M-<suNml#VAtUK쏀rH@��JGAmך%|jQ+�A #j0Urvti 66b�]��Ղ~�lț ���bp P(h9ؾi߶EAK 7J؛EμX!4(ˆrC/ec84J z+�CyH^l9Y� oeM)(!Z\Q{}%Dc =y尘Sꊝj<̬`_4􏇞lG(M[Zp�k�Ǫl/e'%;_nR㔷 =|O���miC�%&0jA/j_{ *~rFe iۅ縣:D&m#]>W҉#;wR&4lj4v<B'BY1e|om8��Pn"y�0OBee^\ά=$Do従HEhdf⤭5ٳcgtؕ&萴<0o1/)W}7vjMħ{s\ b? vg ,F  rI/ĄD3sE?.F@Q2,s|*jυ (@} 0{I/IS2&AAW]_Do.=GP0[ 2o%Pޮ١}-RsV=PV\O +yp(j|68L5!|FU᧶RP pQ@s$1~70lxgo-UCZ 5]ثYU#F \ta9Dl,nA5z*%ۍ�`d\[.}kP[Y bmCWP/&tؑ@TS|d!B+N=?]T\Ө b %�Lこ+܉]6k^mSuiX!|ޯ]s*+ri�L-]:PrnȄ᧤!ftbs;r@7BhOкWi(E$f|t +\_�RgGxLPL-; NjzQ'.�}!| isdJδBZ.Y}N9#I^XĶl0/w$8d{<5έhVk%�xaɡTt�]ʪ'q!>v 4Z>3WXa{G �d ��<_\Cm}5+# 4l (hRu eDGD?1��6nxe 4vdʊ㓌s޸nҭ<T,{= ���"2; |sfs/<eȮꮧdZK;6~=WP�(vܓ��� �ovbtSI(bCnx%#MKnH䬫HY ԥ6oOl.9xf_iJ{X"=\+�r>h%wM:hTjTkʩR%w 0d'�]Yrb'_ڊG&KamNNfƦ ̄n4\|$$�Y= e{ V H5N$kN J_W~ #ž%?@([%F~"H^�ѹTX�4J��5�$5 B,Ž4WcE79BC]?#&bC_D׫BdJ]�WL0xK+dVW!� )�������DzMƍ �Mjs�p=iĤDYv"컖g'��� [ ����̞����������,=h`كM�ؔ�`E����'���mPצ]#p/7X?C�ux40=~AML��<{Pt+hj�hyŏ�ݼ˱ |��lo�I [d 8 @�= skpGx6coy<)܁h",ТV4.B< ��`��_ �`xŵaW@iJQ|�=W@xB$7B�,|UkC lT��< H8z8}�['"Z(s迕: . 7hX4<N1 �[Q,~V|'d6YQ!�-s˒WuS]Ձ)xGMNۑ&,=2܌H�]X]rC`r P"C^A(LV8>'TZv}=ѯ@JfE&.̈j\G�f3F`,iuּ��\?$�MU?i#5M3yK:;AU\JV>u͑7&bH%Qp$}߿@L19$EH e6ӌf뮎73>8=,1ڽ'6CzyK=Ӭk2 zTZzU@8v| B�O��QbX} ���菙�,>/��Z�HѤwMEi�?+ZC\ftjԞH# e4+g]INP2B�9BւvOgm�skzL6w$wq۴O'$4ݖ:\ Mab ;pC{OԒjΉ!tN  6ξ���(RwwbJ�cV�$rD=2]n/u̪PvT tH Lg [Y5�+X- D~-&)^u+ZFqM43=S#3Wa"8|Ξr0]KA)~Qjӡ"@GĖL,_˞VE~u|ՒgѣYߓ~ADKb7=7tOjQLyCZ /lTѪ(u lh $ (}aHHSE^a]o"[ëoWsȧPkWqX>,t s̓y@4ǽפlG---I1Y0269[�['v|`X3g^suj'@+`NB*8(xTSIY`0k,/s������oP.Txa9~%x*/VL> 5'uwW-K6)X|!-aE�#bNlVwl"LI`e2bGyf8G��X���0GwdAFƊhv?f,UsH<e@.'4Un85Md9Oe`m,jh3�J@Mt<*7t(Y~���e=b�&smR��8]����en;sAcRd4!Vi}uA!}2x:uG6o_1׶?,�'(dt2|xgiz8hW 5U;��Ҍ>Vv1Th �X$q1Ū Y>* c2gÍΏB%yҐ2sڪK$��`)Gh-oPAPV^(kt!^W%qUտL�#֢}<<�^}9<ݠR|-sk C+�;8M��=?#y$ c 2/zSq7 J�VH'Vׁ eQOul6ym@:LͿ6h8Fpi2v+<nJ-2K]dY<'!K `�t^'RCRpiOlKe��:v0 HDS]�^m  =ǒܐh QD�ɿ�Xp$)XMwr �L/ط-p���'�uB+�N]wfLv6}4`r;N!�N/p Q))7x|1N Z9QoE9; �S坩 o3NtP Q&-ظ3mXa_ll4ZQtU -cp%�\~�%:3U; $ 4z:�=^BB�@Y#M0k�԰z_ 4 & :'8��`v{kN�d�T6y1Hf�>f:2su �xo[xjb~J-��;Z�;3Hbo��8#H@pI;%y=\�=M"��71oz�+hr ܸMbch_��B1��-d��������2w�BŠՓoɢG ;���4:)'JU��t+v�b>|�����y0`h.dI6ۺZ�����������ك�ͅPT!��c�"E,H0B#/·�h����F��i�u_HrFQ~^l$����"�{c ��#!%��35y�x{(M�<��i? ��%z"��6=d��Q �@fBEO(<`/4mqw`wO$�wF�X<���`z_-F%~�?U1��2_|��yhBR�},D溴C *KU=!9kFc[xKd%V>4(3~ �j+u4҄nt]x{�~nuԬ&ŻS orp>0u|ʯ8\[<'o :?c=A*zB>[Y4jWrã4�@垖7z8"rdfذuF1@ oƝuNc�\l1~3&MI&vFFs<_d<OZ%Q+Q�R�e�䇜yx<t,0"(%]d'PbpG؀��I))K4Aycs/7p5��>p�8*|*kb1nϳM^/*3MT V/RxUY*0<i�-&J�[@A՝g�䰒TeA*�=Rh$t7����~)㷄 "4����B\tF �0fC����YӲ�r�PĈ=���xr1�Em 9H0ϢiJqGbj_(d�BR^z"��QBFر~^n]-�LA.4FH0�����pTO!R.[I[ẃF 8s B("eX:VFn,:BB�< T8&XH�>D @ r`̇E�H4A/{KYk)<��pq ��.ʓ� dטFU8��H%�Wm�0����(<��������PC��w8Uh����ରq�$#tI����xu����rF�>��Q,LBfW��`,4]# c7xg^l xMP^>^ҿCGto����vV ����Pn�DGVѨl\q ꉑU1FIEolq7O7n}"LHø.pP+ ���x��������&j ̍3"2ך leRdDkG+z@p;v7� TGZ��������uB8\<�rKJB3D�4 ���FΚ"T4[k C z0 �)FPB5&"8 % aMckt[j?Ӊ Ұ@3/���T��������h��0;7,�D6z2}  �/�m18k��l&����1wZѭ.�D ygϖ^�OfX �n����^Ydn�RľTdu]z\���KI'�v1rqY� jpN���c����pi?7ɪ)�Z{.����5C��e !T>H{H  rU�� 8��pqF-�%kbฬ�� ��������%'���������Rm���P�\ d�E�%:._{-p!8 b?~>C ���`j��Nra�|@N$g([h y5 Ce0KNsZ/o�}^ uS:0¹:{q{\j�ee*4~ )�jh5#'k@n_5h]7#[k�TVDk=( G<�(q(|G@�o2D3̾BaUĆ;ugsweKC5:q3k11{Izx[^|AT)/ |gWL@p6|%]KH9eQ.yf4�d�-wM�G�A' ��7.q'@Fȭ0]99a+i]H�e+8k*S�!Z%5`{#Kh~<oe �HY����y):<]nqc۱R9Q'|<;>By)hOsAŸݲ4wȧ>9��n��I�����+K6PC8 u^ gըUjtl.psútU 1:Sf)bD`C&dVkB ;[ّi� k Eap_{H+x CP5',TL,ш�diF�N)������\]$  Va!#8��-�r1:L ���tP#��#m��TΰZƩat\n.�5���5]Ʋ�6)~&PCX'קx��*.{`#OX~ߔ3%췽31Vta� B=ȧ~53FBDMW!2-.utVV�֠uG 7J, ^ (u hc5 T^hkmPr /Iٯuf`cڤXq͛c„ E}u拌ٙp~݈�TR-8@1Ov��U6NOUkۯ�^,K��vW&!7Tn3:�h/JI6_7]k&�NlW]<[ J6훰-Xz}c1*)9giuH-�%h?-Cva8FqK?�~|鯄~�<FҨ/t|ʋ��rY%��^2N�^c{s���!���l*W)a<ߑfJsH�7O4 ��85����z�Z@�*Gbƛ,W~aMN|\A�br8k/p^M�;�`�I@|SAwX���bev˔-Q/-N?EU0WҚV�PYИ0�V!S cr�wz����nAuqQ3H:d>"/%͋aXgJ"+ ~Y1X׀p% FA/MG7F(Jſf��B��)sTLUD8X2"bv1>L �ːk�KA~} ?b_0PM�e*����v :bUPTrY &Mx~rFX R &ն| 4�4~��OJ|��-m@�m9C2��A;>wv-,��a r�ra [f\|Joa3 UZ~#XE A{!I XVs;qFzUR/.OR7B�$` ƶo�48Tu,Q`*4*z2)$��2n qD,rUK՗3�&?nJIgXPG4NUm@ifHH,Y .eչ :�ʹ0(4T)TZH�|꨺�wL M��l۝5R[B2SgXr`C#z���!*6o��2i3m2"-= ��CjgKڮYY^p��`qs�ҫR�txnR>SePIuAߴg-:OQֿ!y� t��0Y0w&k2#|5�D聒a">l?=h�1M,��sٶy,+hGhd*76'wPM)2!R&QqnV<{\q<|���(j;�"H9)1Du�I��zIP�v7��������t {—>��tţ������p59ר]ȗ(�T>iF5=^���J�-]=c~ Mjh���\%�q~YyhWl8 p�>UcXfZw[NR���H�e5*�eM=-1��f����h&PCY۝�@`AD~3@5?NGz&ՄIfYWTjQ)<!ab?I��K,#P�O6-k sP'bZ݈��5~�[j-�6H������t6L6����GA�ZňEu���=Ak�lS�d�I����rF����Q��1������������C{��q;p&gO&^� }v����&:I���8u���� ��������$�ЏSa��$����g��9YBI��*�PY:��xGZ^%]Sv*o"��������4)��������<U\q oJǽSIͦY8&oKuH/^�a6^��!(0ӿi�T݁x庑�ZsӡbtϚ9ǵnLnylyf��9H����aN,Ns%9ZF-�RTƣ�"h2i 7\IqM(K߅tQh1.d34Z*A1sԛ7 $6t/)�㳣l1hz|4 p`N�e=�t?lm%"�M�NyF\�$d"b:H7mhJH#%Ζ!9tDl6v3+_`ecw- |f~z[C}+!cP.cf�5mrYKjM#H^hFUYN K2 />-chٺ7z)=b;^|1Ƒ�![`D'Lӂou5ݏ���,����3��H!�=1،%/Wc$^BX�X~kQ�2mrŠwy`'Y\΀"M`"<MO|�gֻ)c : ׆U/��P����+��'1,RSˇq�d$7퟇U1� �[CH&\Fi띖IYmzW e^)xηpS&5] .*�3(k/X8P�EG��Pn.��djtA+KtLxWO�F-��\|C\�����?cr5DG<x�eŠ99It�K9n���pC*�xTWm�q-L}p%fpF��ԩx1$` Gho��� ���B�"8_ LVv*L~c}C��43�;6Ne|��8]4cl9\rK]5dx~)[}|qp(�,:3#JUqZ�(Cr�+�R4\)r������byQ r���k7+&��c�N�H!�h���d hHh_KL/��LvpB"扞*$h&d �uO�}O����vHVU /9#H}fbni�fl���D,bmEo]H;%Ӯ2JdXV/' P)��w#u {:`zM-JP.Ci,C##�F^Y P2I����K/7]QǎLi6X*��Fn``c`_§z3��8elWU��jJ$l0 %% ���N4 Ŷ,ԡ"9\T��L_~2�E֞ÀDq�c��U=i ԡL)���p�����rG;<-0e4/j8t=l��~9uq歹oZb0/| t(Kw5 d|~ɞpSP��\taOdQٯJb����$%$Li��,( |ٺf40iX]Yȝ* \QEI�\K`w65܀�P99D۾F2 -%T2[ v+Ik9{ Y8|d6|4̴? ����pP-5 $0ޕRXg40[9y/Ve����zN�I% vxZO€bS�������M���ӝc%HSnXT;~��3ݦLXIC=����L]'0��4�"TSaMDwJBd��������PU#�Zp����������Č%~��G( ~X-ј0+0f{IG5~d+-^N OZ �z l�� ^9D=c�@BX޿ Tp%����������)>BS~@?dV>>iO9 ,U4Gx�:���VLHyވf/߃^<x.Pn4��!%����ɠK��;\5�\:]K@�|x ��+_�75{d�����������s$\jKIM<k�J=q.L:�NGwq*H=!`rp58酸I��)EmG"r�fLVXI�%3Y !ːsCd,J;O/<.׏]1Su<)tmBo�KJoo4W\1дo�e G(% TB9=bfMdGxr`H5!HAW�YII4 v*PVM-şbe�h`לS ɰfq:3y����z4 �������%����l��������������>5TlѐrNL�P���ۨAƸ���m%WoeRRyF$@՜r>>2S5jS�� �Zd*`"�x{fS.EV+ I4Y1fu ɭ� Q渽R�yz,kA d%)t@=l cgױEOj= 8'.ዟ޲(iR�0!B�)ݒ?Ԕ�86)<Y3�-Ks�Յ< $i_P.NX\@ޗ>Ow[QI`Ɍ' ÛJ;%I����qe[ E $/_J _\O7>$x_ߋ xC#UJ# 7ѰR73Fd�9i�eX5IZ6a*JۤzXK~$x%DVֹXjmzpjS l�I _mbg"h�W����-�9JK24~Ï)fNL A{*`̤ DrcO!BT�n*,5)2a VJYT 8����bB�d[.wIl_�=bMJfX) ~��&[8�M;U2b4�4$B"<5O���f9i0vu%e!���DZʧ8 Ԏ@��M/p7D ���q_�9EgNt/�Xž;!io!hQe<vCзS { �e(<9@sd*E� K]_1rI }%T��Ɍc����-w/Ow\�E ��_�- [ӣJ('r 8Xm+C=�p���l=�P.b<��Ӕ߂s.,WS fa@o��� 7OG -;@ ȀxD�,PQ���E·Ogۀ�㵈c>4p\ ch4 ��>!GJMgE !P\O`* e)}'! x:N勹<J̱+<^zJ `ny��Dl �/Z VagL)Gt mrAq+�cv�aM|g 5Uasb&)bL2f=bA qdDb!*C`cUl\_eq�ޝpoJ7#q&ne=!G(2|LڈaNC Enksˎ~M[JwC&0!c{=�s\�QD&=!a,7.NFd\V$ 0�/iY:, ˃D[I��2O?~&)Ǯ���4 &95��� W��kԸ׀i[bw&Q {3WL߮bw$zm<VdcfK,Җg< �`%Khx5l+C9Kp[/n�k=.=Ϲ_�M$&D[T�����$��\�Y%&~ GkL&e/%|c$l.�tռ RWp�.kCՉ3���0Z-hUp4|?�� ٩Uq=~�lĥ v� ���1'���,ޗ6>1T%P[ AU[I0|� ��d�̞[����tN�s\K�` U],�wZzzӭ:~g��#_)?,M�YSQ6 \ 83*BƤļ#����\Rf�ѼMNCz�������,�����������FJ^ n�n����p'����s'����������j ��Bd�O6�����* ����hn�e/��Pam-"KְIX[OD/�^-���P"Iv����H9o,)dD|u���8���`JtEV�j��(��rs���� ��dd�L���������2R_\ǻack_P|f.5( �G�_ٞկ?)��`_)��8i�x{ ��gqۏ0pjF�TB<�P���� ����D�����$���LY,L5�YkpAv׾IH>YAx6]�,\�2?G���פ�$E����'k 'dt1*K02B,vl'5QȲahJiPkhO0 03|}4~?zn*%�.5XqaKg�#2V] ��đ Kamp ң}ʀ�J0���) �Cb66��LH9ec�y ���m\\%!Ra$j{IY)C{*&j�"#Ur*BO 5)bxY<` Z+x(lqҡ��~8�2kR>n`Ŀ݆`v'%ĢZ]" {F��p)IΏl3H]%���hϝjn"E<V"g`2>A^<@|C8wpxաns2sQDP;>T\23@fR M"O-����?3=*G ��� �{42ťU\5;G"ɼ4G%JU@6'ݎ+&4@u�W�@����L�[wdחp ;�ϻdߥ2[Lu; ̈́FLq(�{āL fYQ6o^3f(,�Dky&(�DvpKp�����������ϲg%u8n��d%|܅ ��M1��������i�-m��ƴMևd x{3nUeӖͫx h:2?_ď"h�u>{~ ������/���d ����4��QW7cB@bH@VfȠ[ՁmcEY$7dh&R}ڤr*hKgg-'$d1���qDD pC-�=L=#/IўgJ:&507eb@.S 3k Yf��4P=];ȽP("XFoJ'ӤcçIM,x5Co�vuu+AkA]ЕXM$kp;`NgUw��'QInS u:_ヮn'[<BIʍVV1s\Y- &p TSs%Wfz w?=5-sg3宲=Oʘ5捝I v3kȖxT,FlKA>u6ĹEP��Z3I>C(p3UC+P/(}mGd+�5éd/EvV([EN.$bHDshDsSpj0Z 뵛)H6v8 8ީ]"aPHG= cW q9�$Fb(Ƽrh? O�w6o%6m��Z'j Cw>=���-qu:1m +� ۛ\�Re�Lm p+ND?"3r/dI6$ԩ}^qHp/D�plN!0u�Փ��{ �Z>t/3<: 3̔g*#hS- VD$dfw�6@V�`�I1AT&F�A+�0{yWO+*:'{|������}KCs<)pօIȖ=h0^Db�3�����J{)�)|{k0y-~^^qͪ|||n3kEtr4*g2B��Scķ+'ڡr))h3NhΘO %3@ �.[4\_nn]B�_ ڕt'x\=����O'�m(}ϞU *A-$9{Ѐv{mH) 2=�t���� ��ǥsY"5q*\Vf+UçF@L�-R0zsQAkA`2Kn�qEbR[��ʂDkMVǭ(M2 �:g�6U#��r!�Ԋ޻zw+児�lx1��U m-`",�D!?3y�4, ౹kF`kuvd��T������������͝���x�t�Uyڹ�2�0�@S����4*%v2������(�����������+?�h?QGak�';�S�������? �>opЄ$TޡNa��� ����HxD,SBE.P<��h"0 3�Ro���X;���`��~얢|zrٿ ���{ ������������:��31# }`1.D?$ RYW{c �X[R[..~��� 1���������������� pzg5���L8#Sv ت]��pO{ �'5R 3=\*�O6 �wluǾi_| 71jNbTD%��<m pB8h>A�A �m\+ 8& RfL:R)6K?eUI]hP2"nc֤~A-8/mZR��uR�\, &4`yT]d_?Uf&�@Ӆ'�#SH{ I6*{gKƴ-uJ |��_�{TX룞m1*S}�=Py`H M[;ks vJ)F@?ý,zҥXL`XNԖik4?>�k�bD6U��7a놔 JE=,ᴟPMAY"1%¾-_C4ԏW��Dӆ!(XV8 -b������/GR�Ț\쌿@<K; \=8& ~B.����LT^�xU}UD+CQ$:Syb~`8#VQyHӜXy� [3��] .��na[nNa #"2[ϿPcaK=\<xE}^^o 8ɜë*LβQjЎ՜%ڞ) �:@"~dޛ8 |sҏ��,'A1P H)E4?#3/ Ԯ|(R=@&f#<Hq�/�.ݝ}[田 K�H= ɪkF2x}M#D4齳di�s4VZт�qc7nn?.=�d��{2���ͶB'Pܿ�6٤ nJ#:n/0@C |��P����.��EsP���8 ̻6"I(xwq-~$_�P``rC$&!<N}'&L�%#>w &a!GȲMâ�tu݁H���u|9Ѐ^։>#"+-[lu�"kc?�(b]Fh f;S۳�W5D�t��p8¯v#|!���\ނY9L�ṯ"�h.{�+OR ������� 8��������Q� n9ޚX+TN[�iT_n��V(*0sW����������SGl�*P0aq<������R7d�{Wկ (²� fV7ǁC5G\Ù;LE8 Mtp"H#bܓZݸ%> -hpwz� z�746���{yj/,/Ml���p���vK|^[Ӱ9!�O^BR·(�⪯E(4X N;gYե({w h81EZn!ԯF\] �Qk9 PQs\+}(Vm{\H^\O1rrI`�ǮD&/?sI݂�ba  vy�xnk._!r�j- ���|K�l-oE-ؤc ��r<2'}pE_hh����y���K&ҕamX���(L�Wۙ3r ݦwc~�۪le\3f6]zX9"Hm�䯏!C2'7W7rBU,JI"֫ʦC%ԉ�g`ԲD}0� >�d�ܗ"~u,��~1O�R5ɗ�蜀͝�Z��6cX {��0‚6[-1�$BBD^j�"X'O,�Vm��r #Z� �w,^؄{�0DXF��,Ns@;���������:n ��HyDӿ!È\xiL,3y[�@ Э�$@Alr ��ҏ@ oc֦B47{�������=S4Kx/iogbdt u��bϷ|= ����$�ĉ:O`�����hgH+?6?��xB��������@`���<d����h���|3,̮6AjɔA�p����*�`c����;iFy+V�%P������D �wm@HV���Xu�(*A2|)az�Nˇc����$���?^1����E:2Y�Lqˎ|SQ`ACOG`h( (օmS�|�4�hzq���4eۜ8;#2d�6H��P=��' ɫcH�,rR<.>U#X 'V6` -cqPS�@n`� _* 9br68��yiw#�ʗKӱ: LqQ(mD`b-KDYŀZ_=��Gs�^Ԟ�+#xq�`Yrl%/oDe})'XdWcF (ExX l�|7y2Jnrc}0!$��%ۨe�0KE0|rlc^ ڸb6L3e\0�բ=<LG :M(fSr4dx@?K|!/ѳSVE^<0H}C\'L"Zo*L�:/B�\rY#zr.4e So\�`!Ȱ4y Tcc r:]�XdIwPaS7/SB;p;JCym0>q쇢�*]*ʽD�LIY %��PT?4ݞ_b?p)VїH lzw1���P%h��cO0ʪvl\1��-����|W���x.�V&a�59S:ZAANn"-=i+;'E,U*�)4؀mI|i*B炑�I[-@ � :ā%�rp ����<;`ɏ hۏJXT4/w_��0C �UE�������_ Rf����d����Y ��Rˌq]��q(�8ݨTY6_+&�)�� ��#,>�gQ� a#�hFt�|yV�DpI"α|a#!AYu[ Y*ӕ����� ak��T.@��C}~2hXbrrA#3Oy? ���d7bYc*Mr{;Rie`��8Ue|���&(a���������2%%ZH*�Z+?='h=<�� -ip.�� m%\�����yphX D��p 74f�s:+Fd>���By՚$1[&k>$q' $C(zMNj8?ރ[L6�$Ԣ������������cNd��tU/�Unb'�|@D���0= t�tN8�����()qcQg8�-.;� zؒq[���n Q[�N+ @k9r x:V,g׊,(cS�v&x���;�H�hMJoB�xT>��"r`nosL_g{ h"I(LI`�mRH��� ?tT|!J��TP��������0����8 ����T���P~(� �Ȇ�A٧%* YZ/+zD6py6t7 Hboe51���v����8=/6`����-�~΍�d; /�ޥ��fY<~yf*��5iʠOªrO2 ]GrT���i%KB,H|l f8�i90ixpa7f����DlY sɷ? ."g@n)/v{BUM a"wQ�9 ̠$==@VM:@2(_ Iю {.neU殱0 '?B͡Hy"BD 4Ux4�&Q)N6 u_(TX2W~پ~3T{|:v.rZ O!wKXl{p#;7 sw=ZtŃ�� _��� ��|���D� R-n4�!^_QNT7tRd�1x����X�(z�ƮPDc.L`pjx;8uk`<u\ʼnVpV秣W 3";mu6�UAt&n]NlQϰr ;fZ,*��\T�DWZ���,P'qt��Ƅz߅).���`���Ɗ�"KB]*O#B*���Pt!!</ `�Fy� ����$ QtfڅRWœA�Iqq��EΕ8��� O}8.g,i6g \s5 Nͤ*OBq1onPDۮh;2#9 ;*8\:NK桐�;AҀ@IC_:X\fx VN4pA$@=Jh�ƍ����.{�sv u`ۅ>kV D]oҀ1eJ�` m_qфsx]~4#7E � 8�o )Y@L`)wvPLu;JؠZϿ�|el7%'08Eg]Ij/̗30&j��H �� IS<^&v%M!ҥ"0+q��NF �h��/K�.7��,S$i &c Msku5�<`@\b1�r;DmO���hL��tg)d&cldE��jDiҌH16Ӥ8e߹_LS `����+3Ƭݠ!=:���.IQ V;^An&l}~EO<)kD=1mc`.% $?RђS^13Yӣ~Q'U���Z ��Dو:�l ;fE4ar!1xJ=H�� V97�K`�/rgbxL_N燀2]t/�CxGkk/^eJE΅lT[3!wc�o�_0܀@lQ"mQ;U�3,M[㡉-G٫ތPlyx�#���MJ!aݜH 䕰7#`"g/^P5%�,E倄flԐyrrFc+d1l],x<xQ�h2i%ϛCK̠T`K`H|ܽ(���xs}~w�.@ؚFQV�c�o�<����H~Z1�U�8e;ΡKVFPx1 zG+}.-Qۀ&N#X$���x:w�d}67+ .pC0\U٭Q"@gE������Ǣډ[l7�-�>���R92T{EPHt��cF>��:`U ����] B+Z9 D4Զ }/{Ȧ2:H8:iџP"h�W.k]xӦIbY$XX ?xR<l:DV����u��'*(4{NFz$z3[t{(kuׯًwE͵<UvGF)UbtG�RM7?ǎQ �`kQ(rMx :P{~U@闲�Tf����̞�b~8oiF%�\[Nz����/ ��b;J45�D�1�M+ ���ùT) yt �F/IhT5O׶wʔZ��ޚU$ji]O? ���Yq%�2ar /<t �������� ���Gt Ы9zx^�0|W ��)8��4��[vNP���"����c�DT�O\�iV�`}i ,�BPA}z�&|����p ��0>�ɹ!gn'WV�lJ�<���� �9�� \]�p������������Y:�� *Cñ��d�pqb���$�!K�#I����p��������c��D'3��$�������Lx� ��(d:S����� s�}7[2J��������C��������9 kɴSͭ2ȋq̗2�N6 hLn=� �������Y88eIF �N_gL1�Ptuiv g^Z��"ăf �xp����_��!><՟dxU����� GK���\��+6V"匥<o!rm %yhȕo@e;m\\yѸ)ޚTU�e&ģ tt1GKhBxSd#v\.ߟseuH!2@s%iLMYyC4/5eрK 9M;㠡:�uň G>+VUa7V#t4\~wwpzLeE8 M E#1ƅ(^@nh)Tԧ�)Jօ6!o~f���0v8i{ iO <Ja+`R+:eRnܾ\^ m,E)W �%_X+djXbs:H�HR���2'0p^سT/ ~9zeoPf>RQ*,Jbb0�P/bp$^D���r w'CsFHz} }�o.pCP%l������D!gB �� (��`^Nrz3TLh��H����8 �} l>&&$6ޢ< �QN}uPD '� 6\>'JXA ~(vU+WYmQj؆)Wz}j�R�a���$�qEMw8�:Fڅ;� W���E8Cd9#ǃK��K(y��<$��@xLmP�Z }mLTc^���� �^z),/��s���: Mt��� ��hπjM�� x73R3�u��������HԬUj�pS.vSeVt����kzBe7co�C;�eߐ�k8$�LR@Y`N�P0y 5}PA�n�Cx?P��KfXōWY`h{汀h���x0Ϣ���7*�n��E��\�,U/*���:5{/~Q,x? �<XB���-r@UpDl������n~hྌ 5O4�ZIYR#uv"�Kd s<fxik2N) ĘVz��PW̎�"%=���iCC)K�wH6z>��@kR��G| #h ww8CnE/:Q"4$8�. |oQ⫙(3<A*=AMwDpފd�_Lh| @���wqav8���Pr$&S/e�Omp]ۙ?"t#,l�o=2鞴/ݸ?_NJ;6~۝h�?x ��lc:NT ���:-,��< A` ���;��05 G͞��Y@9���bVeV�R4y`�,Wb7k5P8ݎi§JWc.Vh":JN �Y�қ��C`�� N;Ҩ|U w~drd6fO����NBC�j]%D;'? ����P#�������wggM�|"sNO (B0* Hg+\Ŝ<�Ϸv=B �30.ATӕ�' ����h�9*J�{{��_�������/85&wQի!Nl"f".dPA;y5>-zUVViIdEvb ��<���� �,Aq1Ud m-�������.�����ν�$&�b �im���8|ǭD<T����� �c\٘\?X���{)x �L!*����>߯+��:X�KP�PE;nkPn��)dkp g]�B3��&ZE)E'E��e$s�d봇VIo�B/���xy<.,MUs�pڎ�U]xvE`jƎx]�<5#b.7{�X1ۅN[�_7?MϢj7@l;^dGX7+e$_ q"$�F0 ĸ�|I?�QYPHU#�νP%�õ�[& [�p@���K7u{DrU�][g1UF9|ԝ� c,f"oܤ_GMWBN7Zt>gl9v/��Tr����S����\����C ���))��.]@^ �< ��&(oi ���}Nҫ itnW~(G4OƠF=Q"+E��� `�w,\|Th��%S�y�X$Wk^5u%b=�xqb*�!^s$+r�@^, ބP.E?/-}wS\YGدGW&u<<��LRm*.��^*oB��1IXJl@ �@8UX3u&'mPd{Drkر2>1<yne+C`ף�C}V} bo'=x!�� s��>agc�HHL��>NBdd`@ջZ0y؂qi< tx#.`+}ˉ4\:4ec�#iT<W@"A9^uw�di.�-km/S $*RMx�����]xt.�NmFgʽlܚ B1uުO]B񖟮�& ޣUtӝPb`ދcH^t\�)B���@��ZYB�4h ��[ AE�(sYBT;p�ԝE��W1ٷpe6@{?�VVZ[đ�Ň*��O_VNW��,&!L"%S���5m����0����"3� ��.'K�>fe]ԙB73q =^�5n��rSd8-NJ ~4LN����@b�T$��h7�c)w;g%Fz7v{)[p,p���9O��pW}7���+L%r+ [�6Pҍ�cr6'�45eP2}17,Ͷ`�,v ��Tw_iFHNH{�2em �pȶKY%a_&$�]83:[1 d9Hgݩh � ^}2V)쐅db:}c�}^;y>{xmU(Im�Ԉr(��  �.$53/ `���xZ f�, zd#>Zot}0 kkޚS���)+�_kUEU�&2�[mB{R9>@��U�%3=OTtZj!)t$đGcA>9ōoY헣22W_Q3!zzg@o~9pX $eX�! $%e.t󭣊Q`ϵP`ldFq!3hI&L,k7��-:F*-���<����S�Sf#��(Mn ov?o.,֘m&DӇ1 cr ps5=478,[X]5q152s3؍5-o�D& Mr��x�� lϞ>So0 oZM <�i.}N1n� 0����* |iB>�ַՍV%s$Ut!�)vے'Ȃ>ָ&�Z|՗6.mg}¬{k���<[4X@ =<[[btZIb��%l.����6��0\'{@����?/Dy5K •��;W�{ .n`|WJ#[ )SI h_HJzRK��ѦLmja|m���ܰ���������������EF O�x,a���F'�tYNS���|4"+C�����������ԚޚO��f { ����Y<T?lֳXq# R�k0pM>*>@� ��H��'�pj�#3��gF*3/$(" ������q��N31�9]���8p���������G[}����������3-6_rΌ~E0#} 耟x�v$ ����˴���\�BS3l@2K�ߵV�����������������2����Gd#Gş@O�w# B\H|gⒿxDWV蔘dx��4f"�� 6�}����r��^>���8pJ�;[�e_�`Ǹɭ&.�EiUI_j00sik&uϰqy4f$Dj0�;}`>h5ۘ,do`)k$$z wͶ������_:Z<PL��9_p.(DX>lJ~��B$����/<{4@xEaLza)Oʼn.@+4U-O@pg $��з���� ����%G��4Ct:9=dm-Y)_��uaHud��4526HX2Nm q}r#&[lD ?·grM$AVBI:6qxO\IpfeRd|E|z.׫q��Z_7L85Ҧ��y�B{ \!JG1yo7{ HL~ sP<ld S91Z��`bE�03��|p7=P)@]ԧs3K*9镛e!&\tcKTO0'��+&gNKKM 7nK۾�U,zoQm�pA���fj5,$_n�g@.U* ΄1#뎷����(4�������cQKQS}jh N�d hc��0CyQ &8ܽWSrG //d?_W�$-  h`ㆨ��������7��������]Km 'A܅FyaULud(�3aig�61W.x|Zn�d)PS^=g@̀|W��H/�uK�kBjㇼ ^NwF:#_{/�{9̬�lg+FlEjdX<����]4Q3 l=i[]l0JKKvB/S6A[U&y,`yR *Lo Uu`| jB_�?4/M^L��. f(z/~@*2SN 䔲αvF1ݨnڷe;OQqezhlU5^O,<ŌC~�<֙`: C@@`Tc$ x`׳p�M=CB^a:8mMI�l1\of EEjz |0]͔OrخXd$"wY0XS;$5y *VlC'*:@̦<��[-!]2Tא uR2 4,[B̴%oa-_cAK-}?ہ@9��7j.w5-g��Yc)T:<A5BB< /tD�]D,t̪\da<x._ `<�4zb8b���� }FZNj4����whgb TZ:Ridm2ؑ`prhq�o a%n:<�KAsnw��Zg^ vn,oS)|ӑU(������!ˣ`�0iBwKv^JQA}=R]?���������an�O (� d��^կۿAa�3TFUf}q^pun`"D}^\,9wQ r��{��dK1a><ho~U {8.li[��NxLf\~ZNӨm+O0% F�GD[vTt{Dk���� �3}TRm@ wldå��@_-� Hy�4������Yx�"/>%��7Vh0]�L5UoP 0y̦����^rX: @do4��Rs^|;qeXv1&d�����#JPˎМ𵹀W\۫6�>S���������m�# Y����� ؒ}^O�Ģ = iPP1̲8ga�FNإ}J@>`.<a�S�A ����Ē�������m+7�K$zڹ�2�!-2�?T!d�ԫN!@+0Z`,\ ����R���h���� ��z$[:ׁ�|ĥbe-o���� ��,t0��SF��ܔ����1�|F潦?l���4rp �|0N�\B!(Hn K4Σ����9$BH &�����ԯ ����\0�����������t}~svco:b[5ʳ?A/~2`c� �g)�'h<m� L,.7���������������kR�|s����L/9J �����8ݎ}@dQwB,"_8=ʄ/'`Z3w\�!"NyI9 r}x���7]5f?6)T5~:DL��+KIh�c%'IgnO/H `zhQbw��:f��FT؎nY;- ���`|ɭ�*4*�efiBq]D Ec:��<ÃھX}B$A}98aCp��|O��� B  Hei׳.m\ț9c�_%ipJY $?p@Y!OGIyQom|$Źn$g**r�)a:A�!n!��;iU&ܒj*.v ja.h6 �n�H ]��� ;�q4��'�0a����@A�$W���� �?P􈛌w `ZS'He&�JO�({�>]�XH[lIVsfc;@��ҷ*[HP(p(4xgC�ILqэkaxkK3D#: ęV~Ӎƚ|��xl �L]f<g`spJI|^<y@Ho2 =TD#Ԣq0!hǢ[/s���Hٺ[ &ޙ����UN& –8����y�*yg>'iS Yx)�Bsz/UudI ؀(��uS/-�JyMfWS[_da#cx_ZEe'+]]eNh7ҡ}? Gt)C���d}a;X ۈ ���f K8.SdP)53ūO��{`1CS��GAx-���pI>,DjCpac��)]=����kw+8`!ڋb=>_+�$Oʠ�f x.,�UST!u�HgoCa1x$Ӭ \WK@cU#�`ttC N�k%�HIJ-M^!\�}^���e"��ND�@zN4|Xr\ d,DXڮU#kL���=���|fr��������V �s۳~yDx+OH0�e���#a�6!``<Ā>v����y����:A\�$� 8:;œH@ß<����7��t:J a� Ѯ!$@oEIL /l M͝>�|_q2gxϵzZ|R��>ftL/3>E�BMwJԥ^mN�PUD���eLDSq�J#k,���� n(%KѤ<.j��ѾeC?G03M��>^jVTS1u:%�XBQdtIUZt���%`-QX7 M-E,+SIb۷/cDwobu]5nǿr=���(qa",A04`ҡ]A>�g [uw@%L{lS9B=>L�� P ##x�o^B�/W? "M`(G��!�|N]p6}5}y0su1_u��V����BɊ��1Ó{v�;� BJ<2 :pC+^kW|rMb(( h1I $ ��BR=A?n4]�70 x\3V/5b=vq-i $�a8e\��;�r<,L4(��  �]'�˜ƪ9<u@0\EcNXR6m�6(UM3��̇s�ʭv.Ѻ� p7X������������� |gS cGpwLr v�.�� ,zQB|�l ^T��pFW } ��8f ����Z��qQv 8KԢ2�x.%� &xZkpN討]��V�HQ���D���y|w&;\�����2���V}j�A=ʶ���@m�Û*YB* ���$����cm ����H��Mc��� EҼ=B�[X�����T�� 7��[F%���ꑶ L(>�cwh#h �P�فk����|f[9��R7 ���[=1�$rG xŰ'NI rP2I}j(7,��4ƼfX7L{@3���|3��p���ޕ3i���>='<{mϱ��gvPy+vIbk Dآk �8�Ch �KeNF^9��N����p@loJ{3W(3m8qD; `ք_|T G&@=xi:RL 0���`\��b%h9X D!3<rL/Dpj�Ujt΁I VoxjhdatŻ7tn5\A.B(�=h�ƺ *q"yw,M +bt#,شd¦cdW8n&]"4\H7I>U5 _9ƈ o7W�W>E3"h\�% ?�䵙e/6�4 ʼAbˈq�4�0_*WXq/J'~u/\6 e_OzyqQpjiJ<v0L�a& B /;9\d4D Iוֹ0�~:Q]2uh:.Ydfc7v^5 j/C-SBk��wĹ5��g8�.\;:_��lݾ&zm%e%FM�,,@���D��%�t8d�Qr�XJ HPBĶ?>L9x7#�t;�7UQh|@1��Ch?VP9pB�*�v�iCk &a`n~o*"��& +�>P���T����DXދG����t����2��(�>":P�/](h�D ʍ���~��Y��p@<��I 3�Dx1OA l404dyfooW MDI ZM�lA̚<`@"�;/+P#c�[y3J-Txf+-$BA1]E,�3\����dcjdDDd��tJ+ k4$H�3@(����������������O(����� i\Xz�%�tԥ��l�,G~[�T?�������,E0 (ck| [~Y��hV:t��(�-n|A coڙ�LD eܤanzL@n/m+#=��U"�\}�(=��������1����2UB ��Pj{1��c d+|2 ������#uusES$Ti0��`��� F\E@NE@B{j\=0!AiRz O(R+~Rj��L��MǺDrY4&�y_}na8�KW]lX&3W�P?L0_������dUZdD"@R������������$v\�������G~��8:ߪL T/-ԐϱM8;�=ywP�*Z���� t��� +�TWLW)(%[H6�4a<����~�RG� ,S܆pLߪf8�>P0ѭmT9Hڃ��D/n}˜liv7Wyg&D#bKGp'T}��Zl*EL50d$k_wn��4M���"A�\ ZPu�X4���}9pHٺWŽE�B HaTqh TC.`@2 Az3^[NEJy)ιA��X�){u���m��(TrBMԩyhĆ0 B΅&)ӎ^ndpbRM]5\5eC�zOn" &}#/G\H_2p'ƚ^;"s(DAxt18ʚ+��\<B8;U#+e0 W��us#��{P�H5��j7?16!;+"qgz9i:�,����w"��@e ��<n4]՝�<“fwwMo#���PsZF9xm)կijŭ`T-Jee7(xr!㋪@ӏH��A̡BU ɓm7j~� />��&%I���`J]��T�$Y��d8�[Y.1Z J5l#���AsF)"K%/Ys Ń!v���sU`(Odmk9Z<  #F����96`>2JT*:o7n�s��#���1Yw@80[AL3qCSQOF["Zȸ~g ˩*"YtC8H3[Z\^K()'<2 !$R샘_�V_eN`gL!fs` �1��-uLuth}|�4J��0���F` 0 lV \f|�0K5@�]�Eq>ra1g. B.jXu n^:Ε���|f�N9f- H lX[scN|F% rgGbc m tx- �h"���`��he$�l`; EZ~zb���W5�9~Ķt`Lvm�L:o ���F�%]&49dx"n,돎[B)3��8&PF=P9ˢ�Crm���\gYwøt*�k$/,QB�P<t91cJ׆jmIlr=RI$�~-kRz��ر����& �x @;i>}Eᬯ,a]K{G^I%AqژA�gxj{&/P 1 n������$Ԣ:"� 7�^ �D]_ ��|cX�b[X�jV1o����@ "������\3LG�@gV2_r:.afo0Ū ~=c G�xLܻ *���FŴv'WjtFfmE9\Icشj�Z-DaQ/~P==Kk}\qyYq7B񤍗&7,ʃt&Ef9ڻ8/Mp�ݼ$sĠBȞ�LI2׼w)N ~To2“j4$!E�\9���un4>� չ��R��ri��������p}-�qW t��84D\ԑhLDIIFXts.(AiѶ%�0U���-ٺt4Ϭ9ZB��ӝpt9U=$>`3;� )x~����1/��xO0<��P_�grir��l@=� @~/*W %-cyu,Hp__0t,ex ���-1$ǝ YR9�d;qT"X.wMwZZS|� � !Zڇ嘄J]a[)! Qa<.3zr0=[bMHwj^9+mq£r9DC1p$Eb �$ΤnDIߦNBVYZED ���� ���S5ojQN9A���(L ���D��U�yADHrv{g�k����qq IJ\Gg6Q,(O�!k4|>!o" VmO^{< ZtD[ W�8" _ 7v Lz&��@�udٝ��������F'��@R�ؕ��2*z���ٌ�`z����@N<T�,iOut�& ���@];����<,~�#P=�\׳�< ���� 0>��)���u;ࣜb${33o ��dX����o5 ����pqə'���������������38}�W|$��,BC�T��ݍV|��<����Ć �������� ���lKE��� ߶������>S�N? uv ��Tz\o���-O $ixd����L���� ������#<k)@0gBW.a]3h(q*M[~dU#����P����X��Q!�of&끀8c�&�c$v@X޸6#�d-;�@U{G(�;q'W����I��4\gBo{Yc�����\�����&uy?n"XK*L<3nN��$�gxcGbRӗʩP ;x{4�i9?-jdT.2?WeIGs (&6;dK7��In" 6Q^K<UmGXͧ:vBbp J|>0W1v$2P!?Аauoh6tCTG"U\,#8:u/##.x9Քq3tdݨM8Z~\5ra$b0>pj ymJḯé\v 1%Cl|c;.Vca_r0!L֡ {��LE���ۂp@?nùN l{,^۪֋&�9*_u [ , C,;W% ?����?K.[roku){-o(ph#HPDS\������hN 1!�� �< ;iv%G@/pL���&[�Ilueb1OdJ.me2Pt?2ޫ L�hP*Fv';j3 *pm5>(p�q �{�\ԯ+�= 8M@X$_�lL<<�gj q?p5<��D2;b� `�8ڂ!rKZ �����s<@��o@~ �&W����ly��15z;��iU�������,^�,kohJ!͠pJ ������hyQ#;�#K�B Ai� 'u1;D@5$zN\(���0T)wC.']v��XVm@fŏR�x;�=a`3O#�����=M�3KC!8�3���-q� ��Tf#�����Pj � sNXh�Q/ix���V"de���H�����l%HB"]m}f}WY^do愫F ��P>n48e_�ܻU 8Vu>_(; :P2"% R = ��,z��7b Ԓ������νZ! .%~6|��7,2�K!_vUU�w R�(]bp| d}K6-B3==)�814��ưPaF���PI{)A^5���(;�[531@6 <D4[\sKqe].K1KpFڼdr m]R"aE(Fۘ]D�%@nlj�DP|'���h��Hޮ7`�%q:����3g��U�g-րŨ,~I(F:y���d8 ��knwPQ G�'HlIOzZqh@G"&<�����3: �<SdRf�pH}YA=̀l ߂XS ���W��2�'<?y)��i����,����@ox��&:pcP�]da xv&.(@y�{'�KԨ&ݫxŪ?tL$��1�s���������P�"h˝<0 btVM܁Bu4u$*c<Hbv(EK�uJ ����XA���W;I>([^1�Ӿ*>��i��������p��������fc�n8 ~3���ޣX��8T��������X/��wy:����^:\6ia ���(>Y��h-<���`? ��ԕtL�7΄e��� !��W0igi!�H�q��e�����~n�Apcb]|�� VB��s=^hX2(@0 d4@ X0;j,|,��̓ՄY�GsȤ4_{5 \,@8�$)(1,6U%sytFx2Z_p����@oՌ2SlZRzCK,��]D_����E%p{V �#��=8�J}(�pGwa1=~� dǫ��W}HMj1 r:ą'NkX\E���%��.���� ����8��������1��#58 mUx v���W�D]��P_bbTzjd<OS7vnï:���_S��Pk",W#WD{{ Wgh,` lIp`+5#D<ۯ)6FS$wHD �|g]`;�Ƚ Facb?̴+KO>yQ#$rlͭy^T^'F$|<*?6րc��� ��<>Y_AB{BR`��}Sc}J��>U.�,3}O,�"H!:��Yw ihU2vI���V��Z2\-���>)`y4g|hosһ\u9:ߵ!pR\7p\f/ o>gk"> Q=�y# @]HY�7;dn41lb|^F[,6i������o^L/ca<��Zd.3Ȝ츝+a60LzNBcEYņ1sW|:0z1h2^(e6I5|lU83WϢ�� ���kW7W%�� dmx,H;">גj^2}('n7�8,6[/Kh ǧp]./���,ZK�p�Y �Thy {\��(3M;��i�����ZCB�������k{�hϠ�츣-f"*;*㥳҇A{7K='iQӹ.=]\ 6z ��y( ����� J3ugw�D >um_[SzASCNc\�Mu���[#h!�9ahP���ܣKqڴpw8;wOu_�h̘Gm4�}*ԤL*DcVK# �?�4NP.X��񡕷ߡSkYBĸ�@yb:PO0t;QOl � �C)xv_c0+W N:$�a��zR+ V60q���@MJ{41u`KM�*縝!�������btejok��,~�DA!Guo�C0$vg?zH679a!z���0Ɛ��7�j���{y䠮Wݫ/b,�� a������� љflV*�~̝441Î,i{ iA{{}f_(VȻ~3E:,H3uVO> a\20��H$ K z2"8bI28dLG@8WA7UD3L2]�IȀZ& @����&��<ZlJ�dJ{ nP O)uMt4he-3 K(9J.�s�<w(M5S~$x.6S!'HnS JPz+1Ww5vT t�Ik!); ogze1�LLMO(7o��^����?4�<#$X^Z0Q �Hܫݤq7�phJZ+Qc̏ohU? inxdxV8+F��x�)>lp-2.J||;\=���������c��<����a7Wʮc4-B��j�"R�ν�xYxdp<#N0`Pb�GITj�T"C �V/~ʟk0^u8�6[0:nE��������"�P:~뛫wm%��P^:��HW,������0��v��Pa'cKn�8)Tx�sOW̧yn1ٕNf`伊 H�x/t0U���Ӕ2F�5XRǁ�������QrFY0j:�S33���4u����f��c�4��������cv�%nDQYk>EZA� t�#sG��J?��pUg�7& ���O%a��Ff[˒��������������������d>D��Ͳ7a]%�T/Hh& y�i*K#Ut!,i��|厉����ȥ�8Q������_�����X�8 ��������=��/Czc(|hɮbcr)f4 H+O*(ּi���NBcEg̀#�>Dmz ZZ��; �X �X~*�`y=x $1Q0F'Ys}n\ �ȟr ��K9c�� Xpqھ;Tp]cU@ G40VxQEy-Z a^�O��L���}^�� <d1!�ń���H{vD�� YRh,w ^BY0�9!EϠLܒ1Kq?t]}I ZIEahkd=L 3SS��ܦ(e5��X�5Z�K ��?%E�n����x �M\xVpK0;o9]`-=L#^(]⢽f�|I����q%2��`T N)ǝhIHCV2)�&i[e~1퇜PfZs*M yR׀ehe;yqex׀i����Ȋ��#ʦ9wk[)-wΛ0���^����<E����t��o.;��3i~��l,ԓgX%p@?a zZLN/DNI7��lD%ɩ4�\'���� ���` ���� ��Z(|n%۟_Fcތ�����aCK۱ �vthZ%z,�Ɨ:P�p��DLB5�O<Y��o^a>kz%�BpX}ζ8څ6(Xy¤ �~A˴ ��lKT/�$kڭanM5ʙwFqkB f#hd9B766>�i>e. 5{`=B|L��8{J`Eh)AhM- ,LF ȦsOUT̸C-xa^i��Z?'2$Bn<ba*vY!q@gNMg2J��fIIرR��Wߨn$FX,RҘ6Rai<``Mbj\mAMO��0H +nY g=ݺBt (~�G?KX|u[F7î/ '�H12\󔍫ޘZ�Uz@o?)8#t8bd�X4ft4a!cQV;e@.Mx$!� jq޿P}.�lW?9q|:*31u(465@D! e#DFUl ����bȀ�����I9oftΔ0#I]̮1"N̦ �hy�&nxPWz3`msx$}76pBF#;�0}7mS�P�������f�EL}dkͤ2cg> n�K���������D ��x:#@ (D"+3Rt�&a`Y/ (��;r��sCQ��Di. CE7[wlo$:p ?D`N'vA`PC,OPP(��������7Ȝ –?i_l4`�RH}<PE˒;Bί j��� ���� �>cУ��KVL2&:(1� "f iQ G+41m'+*7} WL09C��� ��||%^p쵝6 {5KOO5L�,��������{Ki��}=���lr���Zn̙ �9mx@K���̓�,lNJ-E������������ g%!pܖF_;Z�wĈ�S�/]PO*Ɓ��\]j�~Ħ��������}[eIeT|_a*|fG@L 捰`<1$ T7ac���D����#g.e|t`��|J�9y$0_�H�l'���*z��H"~�zZQ�0�P���� }����z%����������l.v 02 PLd{n v(���ƕO`>W������������������MĊo:�N���EcNۄ-l��Ĕ\?D���bdzФ,]&��/T1oFIxwx#�Ĉ9{,n���<([ ��_3p ex�6 $@u op�3j=2 eKBP-<c@O~>S ���k/�K-83A\CY��� N�#H����T69¦FK{۱XHv�}Ag_ZWEC\ nGD߁ ,<< E-��C�ۭTv⻎MS^LH�����āM?7 �zӱgWQs%vnPD[r}*sv_,!ȶc+py5N  �Ur���1e\�^K��,cwHi9Pg6�,A70O'f+%肐(2>G�фs�ź����� �@aa��� LY=gɒnϲZd"Q:zjllնrwu�Y >LYV�\59p�$GtD�0I8rؐ ߲9bXZgg���1HT ���}+ ��Jq+H`D}ηV\zs){L8extOB{4!phW`F(~X_V qt%{so� S(Y$o@,Z"�` �~m[xU��������l�3[�[�E%:_׶o A*��`[Gg��Tq_1 !/puJd0NKRpb9IF�� H pr ���-�,�g���G]b5asp7~5A��� ID��phhKRLsDŽzit^ET]Y ǎG\)hhG\gx&H,;9lw(l};1}+;V�,ڵ2I��|E֝12>͕;1%݋p8 � .U^<*A|;(5gD*5Z$ ,c������� \0/��� 5a"VMA_m��� x[`sh�p����e���\g�������uN6$iZ�{+�2&n��/̈́niU��������P'j6���,9O�_ާ)C0���x����XJ _ ;fL^|s $ M "6␨y(�hAc舰@",mHy4 Ca��J:?\qdO,1P�d19Aɻo�8ɦ ���>�[EZ$N�7! ��ۺo����DO{i_`vaqJn r7���CGCe&(�uSF �>RO t= 7RH�*$N��{9#*g�bq��|0w�r�:wS<kup4<)d���L*]*(w|D qm qE` |_d�|,"��yD�Xw�ݨd=M6�Ld|e�d ԩ?6c$T{l"4Y: /:v~��(������șU���vF�D9���SgޟBZtL<&C<8 ifu ҢLf_�=>y4) ی2~��?qNI/*~BJ;Q)T>�:(G,+ <ҷW��LMdz���C Xc%8�������`oL��`րzҟ �|*K%,�5��V��iKƎ ��X'̠ �6(v<vpPa�� �MuYI}s��$��������<���a�`w$�A!e]�%�ۥa ��<&:Cr��= _#_��lȑ#��]����Y,tX ֣́fo3�8L7gNA���@�&���U���`Y^$~ܜbp F�8����u8g4{[_$�҉~O44Ud׻JxNq�A����@������wW�nt--8R!ᡶ<?ܒ1p��J���-��tB����!sW0FȕXc8�`C�� }����S}f��| \���� �4f%��q7 5e&��yd�����,ǃ,��0! 1���>8.�� n����@ �rlN��B �@v�LqI^b47/ncX>!edh �3G ��xH@ �bHOFPS5��rE������� LSxj{~O;ph$PadO#Lјm:6�x���"R@H%{~+���"A ABmJצ ~D 3Chv;<g&RtNR�pZE|iʁ ;VK.E%Gl<_<d ���L\�t[yW_u҅2gg4ju&0�g-i%-m�@dAjKa]{+u)Ǒ5 0(XόTRk͹T79=�چjYdӕ�Réo%�QmWaO��(8%RE}%;XI5gz�j~ȝ* 4|m���yPǩ{KBLY?WPW =#J-#ctw`8dpeu;�vI YLVa\H"~2, ǩVI oI'=k f�f�.7��bHt1Bh�\Ks�\ h�&y(wHuF x+Y�)ҥS_b&9MA��d<#L%��&�#"rʹMȒj*|B 5����G36J_1;�ڈqTǚt �ȐK[ �탗~[.��x+%ë�C|7,c�ַ~��֕��0!���� ����t���� ���/`!�� `�ȝ�hϝ9p��� m&N����@LhV�]��XaԈQ" �U]dַ,TL1dB LW( ^-0 �KgxۥٯX]S6w| /Zl$wX FPf ڪ48q ��@Vӝz>9b و&Ex?�īFm������������ ��"�(@��������W׶4o_(xTO,)��<?�g �8,u���;����# ��\f T!/��~H4v����XWE&Y1������~�uad�>G7:g�lp:Ы"1&�F $zcx������������qW]��8̮*]�Ul>-T}�Ģ���ӱ}$��l���?OL+cu�qil 3.!7Kf}�H/����{F�vƶ`z53-Yv~LBEl=.c?ٙxb8}=md��ֹ}��ʏHYg �פJ{`0΃#kɒ+�\} ��% e~$ ,���Њ �� c1GP& L ����������\3��8;�0K5���0Thk lx\Q6K`fh˜?f*[Al}9d,/���9O6���,���08��c5ep4Yay�����؉T0�`��x�(;Ïwē�<�lԛ�� @v]zc�xL$*<O0*ME2kJ!���q:D5ɡR��!ЎϺn���Z?k@T[Rr^Oz�PS���� : ?! 4d��) br�IBΨ(Þjt4I4تӹzr&O1� kE փ3DL���� ���xgՆc$~qkR{x�0�g˛/IS%@� !B�B?�3'�zUD=8K.[^-%l_0 %d dcBq<dDDWwS6΁#p(te;TklFq$Hd[n8m�xx��U�-f��vy�ÛiM ųC5T/?ͦQ,j2:_ �j�������_F��</t�`MU"J`"d68 rqcK;�`Xq+;<I8���5b-h}29GT Y!��l����L;^ {V+`��'��<XP��T.w'm����XV������˽._4(n׬l`F��� [puqΜ7��M|��瀥=�GEW"uzkR��S��p"�K,IjxLJ?C|U"����[����������x}��ywphLmi @X8,3*)YM8j?]"`?^[\=>(:!M#NDBYTj>:h`1ĤZ� t).3bI8A i~�8< wHS,O�#��@����\J$@^H#lN,�K����A@���|tɼmqH ^Y&h ^_ٍ,֟J-ŠwM0u)<zT<P`JI!ťExbw SnA٥0*4eFH�朹^3kȽ,j ���+�i)xxE7�9d U-niFC,ff�'L��T >$��)4K<kMZeeiS`CMyu#n/e��e 7\Q����7K7!%U�meQ�Xh7!j/`2*Z+ڙ�He3ML�ɺx1H٬.�+���ey&Ng]fPъ.U#hy  ΂ 30dzs/0= u 0RuOX ׭.�����HRf�b����U.�ao�~1FN��#=��(�:)���� ����ƥ4 �r[_f��1p٧X1tRl!ԛ�X���W���񤌾i<ך.М3y$tҡ;ԗYڡ kcsEGq)^-JEZV7 x[#9_Ȅ\tTVB?IO?Bv%�$HKxjD�P|'o�C)fw=fb W�'a��� 06͠qc2=v-�hk���l:(ny�J�� -L::B}A MB౶**5@e����L0dC^pj���2 Gmu *o &yfZ;!=2q[����*eKi3�hY$����2B:�y=w y I�1\���?_�=�| @~sr%KMux�t cYZ n#=x<OX6���`'~9g584+NC]ӬQ/Bܺ�-4�61>ǐ֓RM˨YW4� jdB33k|:ǘ4vr\ܞb:�H$K:$9XJi0ѻ` @yO�~x=f�$ȲK8����ps:3Ii{���V3����S���t�n�RiEM$W2ѱL�����|37�PkBX-\C��@958>ip0\;mӝq'-/-ϟ$!ΐTXn_|im xu $|�BU=���|F,�/-�p%=���Y�,iT���J7�8 `��Dd1SU4� ��0�' ���,%Aa�.&Zl,M��?�@u'�b����g���8w�(+ _I7ٟ܀p�S����\\����r��r������������ T��WYZ7~��L.f����0�1��Dh����'����������.V��9������Q,>v2�Fb��[n�@ ���QPxUPw, �,���� ���3c@8h\i>KJ_q!lQ'��{JY /1 �_f~ �Mo5RLm��XjGٌ �J­@dk!= 㣣O����8To�; `dTV]�����Iv��榇"M`3���������+ &,' Z])mUz>Akz��t ����U���OB]/qR����GG-nw? �~W,g/@���TSVZg*�aG>5# Lܑ~ � �{ 4 Y}J6B@ |_Y&,9X�0[3oQ/ W:VַFI.Ii:sZ~W崑%3v#}KǕb]VQ7}+���~(ma>0>OLj-.»8T;y? NV% hjI!j#k q2mZ;����8��8K3W_>ݻ<T8Ij:c�U[M�:>Yհռe㸶.tҖb{&'�C,���^Ymد;>H��y9յ%`�j������\3�0���0r/ͤCIqMx#4jŘ���r18mᐢOla ub%S^nk$670h6�OQv@?QU+;X>Hh�mäp�����$\ |_l7B0��"P�`:lQ-k~5LU_͑j��p�� wD,뗝sF֬8���?p[gG��XYi se9L����'�DS79��Ц9���Q����hġ#஛BDh[J�l{ԭ ~k`�M}/� )�%9I�|(hl?#� ��N^�P^W=Cx ��N|U6KGp1��p7,a�BQUqoz`]&9ۯ$S��cM��uxl���2K"S�M�\Fm���h}��N+VIp'!n[@t*�s��Q�m�B����"3�q"+sΡ8#8'#faXj ���Ld|] u$4-|^X'lwe�ֿ=WW)}8�� S+tiS���!W t:HD5QK.D%�UHA��� e��5acnn�(�ib<Qڥ��oa �p?|ť<ʭL�NBݪ<_qj _h�݃5����{/h<����kUȒ4p X ��< �� �0kNhcVJCd˧��ݯd07OoIY8w[$r X2t`ߑ|C% ��O8h:Y$U@��Pz<%���΀J�)��� FiP��tFsz?=K��VP���3*c5_J ԘCOg4N\Ky 8U$*F@ !sr��� p���a2�)(�FD(n[��K֎s��ڻ`�x���P2S74f*ɔ�����w)�����|ܒPIOpjGK/S0b~Zj��&Lx�sػ\quZC �s�T4$J�x���$G�������Jft7h >ؚ 㮀v?sϐ!Ҍ~evYV))կ%n@fz-\ʍ\�s)C{���JiNYTJ�hRU9A p��0w������������S<ў |s��$��P.`3��C���It)}p5ea3/8;����=�P$dt���l +�cZd���,m��~:��CpPnӭ����X�� ; *�\�lnxZ��$��������mDUQY��ܿ;P�Tص��'o^}1->�4ؙc5?s+x0p8u%U^iԞ%@.W]5\srN8ED]n.(;2,M@4]Ƒ. S`jӽ'4k!`=JE[3W�UhBR2cz����w�$T.�(α'$��� ���x0����Ԫ��NU@pdo'�|@#RHc875*]{h��8 ���7��������1����������������u<;;} @��vJ����g�;@�|/�=3(ڼP¶(\wZ_+3g`/@$R3� S4 _eb&|�'{1F+HQ)'Td�SHn3*vmKˍb̨Q& ESAbPwۓ-<eaJh?\Ke6m�jYI�y` `qi�`���M >M�no:~��|ahYx�c41� `ic&m�����}[Cv\%; H^ :gR{�����p$� Hț��.ب63ci&*P =KE/M,^ub8ۯ~aIvM!:4X%Gz]���Gv7m\eß}-ԧ\Jk7pҊ|���~�;DW��²(Mf>;AY晹clnAQ _+nc%9m"zto=Gb%'Ѐāu9Hoh�� 3 ���Fv��$8_* X)�^do%$;(EH 3% χk]|#1�� (����9_Gv-��l3h9 �= RۃA��$R��;����c����D"�����/YXiwEk!V{pN=mQ�]_9Wy{;r[}$P H�,|fQwG���?l�����.� - HEpܠZ3*�fhxi| RDYk"��Xs���$랏i�ʨ 0f lOSQRu*J 7_V`^Jo26Eh8=a(z}Qt*�QyT�Ҏ&8041J7u_'$ XVV׶<D� /M@P]�b� ߡ�KZF.,I߈$#OQ!�0s}(ŗwmKGD=�PQˎ%vt߆a*hdT�������APETAGEX��������������������������Year�2004�������Track�02/10�������Title�Silence�������Genre�Silence �������Artist�piman�jzig�������Album�Quod Libet Test DataAPETAGEX��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.m4a�����������������������������������������������������������������0000644�0001750�0001750�00000011764�13112005742�017403� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������ftypmp42����mp42isom��mdat��libfaac 1.24��B� 2�G!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#!�I�#��#moov���lmvhd����ELII�_���������������������������������������������@���������������������������������iods�����O��ttrak���\tkhd���ELII�����������������������������������������������������@�������������mdia��� mdhd����ELII��D�~�������!hdlr��������soun���������������minf���smhd�����������$dinf���dref���������� url �����stbl���gstsd����������Wmp4a���������������������D�����3esds����"���@���� �� b��� stts��������������������stsz����������������� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ���(stsc�������������,��������������� stco���������� ����I����� ctts���������������������� #udta�� meta�������!hdlr��������mdirappl�����������ilst���!too���data�������FAAC 1.24���#ART���data�������Test Artist���----���mean����com.apple.iTunes���name����iTunNORM���jdata������� 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000��covr���_data�������PNG  ��� IHDR���������Ԛs���IDATxc|�� Xo����IENDB`��/data��� �����JFIF��d�d���C�    "##! %*5-%'2( .?/279<<<$-BFA:F5;<9�C  9& &99999999999999999999999999999999999999999999999999���"�������������������������������������������������������������������� ��?���jfree��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/empty.flac���������������������������������������������������������������0000644�0001750�0001750�00000143330�13112005465�020003� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������fLaC���"���y�+ B�zbܷH2ĺJ�,������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Y�k?O?s???????9>?3y?̟>?O????ϟy??ϟ??'<3??O>I??Ny||??�C3'?????????????g|????s?|g?yg????|ϟ???'?'????9????sϟ>?'Oy?4uYl??93??>?ϟ?y3???O?y?????9?93???<<3O???<9ϓ???9?~O??g?~?ϞNO'�Cɟϓsϟ9?g'??|?ϙ?'?3|?'?????<????d????g???ϟ???>yϟ?g?9?<??~?9?I???ϟ?|??Ye?3??>|?gg??>|~s<?3s???''<~???O<??~Og????~yy?????g??O?9??g?ϙ?y???>y?|?�Cs|??N̟?3g???>sg?L??3O?3y???>3ϟ?'33?~||g???O?|g<??6Yb???s~y<??O?ϟ?ϟ?g?????ϟ ?s?s??<?g???|g$3?f?真?�Cy~Iϟ?'?'O<<?'&?O3>g~gg?ϟ?g>sϓ9?L><??g??<~?<?'3??g?XYw??gϟ?|?s??y??2g<s??|>g???????ɟ??s<g?<'?s|y>>|<??3g??ygys?s~~?????$s???y?g<???O3?y??3'??ϟ9?????9?O4Yp9???3s<'?????~<'?yy????g??ϟ????9?O?ɟ??>?9???3?? ?s|???93???????<O?fss??>?~g??'g???~g???3g?3??ϟ??s Yy???s?9ϟϟ9<?|???9??|>~Ϝ?yg?3???f3>??''???|?'????$??'>'?'9??9?9|y'|??|@O?<|??>3s??&~3???????<~r'??s~???'???s3ϟ??ϙ?9?|'?N<??Y~???O??'<?????O???9?????|''~?y???3>????s?????9??93<?|??ϒ?9?@?????3OI????O???&s????ϟy~'?<???<?O?~??<???<?|<3????gYS3y9?'?93??>?ϟ?y3???O?y????????<<3O???<9ϓ???9?~O??�Cg?<3'?9gy?s?~'?y??9y>?>O???3?9?y|'s?<9O?Ϟ|9?~?g?3???zY T?y??<>yIg9<3??>|?gg??>|~s<?3s???''<~?dϟy3?~Og????~yy?????g??O?9??g???~?3????|??'???O???>?'???f??'O>?>s3<?L??3O???s???ɟ???y<????y?9g??s<=Y ]&gO??|ys??g9?>~gO?~???<?<???y?ϟ?????3????9&9I93?g9>?|g<??y~Iϟ?'?'O<<?'&?O3>g~gg??ϟ?>sϓ9?L><??g??<~?<?'&Y Z???y??r??gϟ?|?s??y??2g<s????y??~?'??????ɟ??s<g?<'$9'?󟟟'|???>~?9~y?yO?g?'O<s's????O̓?$??9~?>???|||9??=Y O33y?99ϟy???3s<'?????~<'s???????g??ϟ????9?O?ɟ??>?9??'??'?y??y??9??39gsϟ'??|?ssO<3'??3???yϟd~?yϟ??3???~??O@1Y H?'?????>Ny?<N??~?Oys3?3ϟg???>s?>9?ssy|~???9?s'???~O9????'??|ϟ?|?II?D<<O?<|??>3s??&~3???9??<~r'??s~???'???s3ϟ??ϙ?9*YA???|'???3?sO?s???????9>??s????9<'??$?????ϟy??ϟ??'<3@?????~?|9>s~?9ϟϟs??????3?g?'?????9?????g>s|~|???~sO3kYF?g9?<???~g?<?'y??g?s>|y?>3?'g?OO??3??ϓs?>g?y???'??|<3????gyϟ?|'Oɟϓsϟ9?g'??|?ϙ?'?3|?'???ϟsO'gL?Oy????ϟ???>yϟ?g?9?<??~˛Y???>O??|y??<>yIg9<3??>|?gg??>|~s<?3s??ϟ?'??????dϟy3?~Og????~yy?????g??O?~?g?3??????s|??N̟?3g?'O>?>s3<9?s~??$3y???>3ϟ?'3Y'y3?~<gO??|ys??g9?>~gO?~???<?<??g?????ϟ?????3????9&9@|g9<'?3g???O?3O???'>?<?~?O??ϟgy9??>|?3ϓ?9??>L??93?<?ssY?$3?f?真?O<?y9ss<?<?????̙|?<??d?<????O?<?gOg~?>???'??s?�C~?<?'3??g?ϟN???????f????g?????$s???y?~?93>y?ϟ????$?<??y??Y'?s|y>??9?f~?????'~????'|?'3yy>??ϟ??><?3<'y<~>g?>3|>|?????|???|?fg???|?ssO<?y?g???ϟ|9?OOs??<?Y??ɟ??>?9???3????s?9ϟϟ9<?|???9??|>~?|ϟϟ~'?3??g?<~O???|?'????$??'???<<O?<|??>332g>????9??<~r'??s~???'???sY�?|?II???|'???3?sO?s???????'O??>?s????9<'??$?????ϟy?93ϟ??ϙ?9?|'?N<???????3OI????O???3?g?'|?yO9ϟy~'?<???<?O?~??<?VHY ?????9??93<?|??ϒ?9??瓞|3|?3'??3~ϟϟ?y3???O?y?????9?93???O?~>O?D|~|???~sO3?33O9>?s?9???r??s~rs?rs??'|?'?????<????d????g<>|?Y?9?~|<?g??3?<???'Oϟ????'??ϟL??|???|??~g>|?>s$??????3>I????s~~~~s?|9?~?g?3??????s|???>?'???f??'O>?>s3<9?s~??$3y???>i Y#'~yy?????g??O?9??g?ϙ?y???>y?|?9O|?????????>?'?<>?~?ϟ????'??O@3ϟ?'33?~||g???O?|g<??y~Iϟ?'?'O??3?y?|rg?|?ϟ?>sϓ9?L|Y$33??ɟy??????y??r??gϟ?|?s~s?9?>~y&>|?O??~|?y??~?'??????ɟ??<?ss|?O|9'?󟟟'|???>~?9~y?yO?g??~???O?<??s's????O̓?$??9~?>NY-?s<g?<'?s|y>??9?f~??y332?'????'|?'3yy>?y??3'??ϟ9?????9?ϟ???ϟ?'?ϟ?<O?393???????<O?fss???gs'???>pY*???ϟ?rg&|??Or<?Ϟ?39?g>>??Oys3?3ϟg???>s?>9?ssyOϟ|?????|ϟ??>O9?s?|??O????9??~<?3?????????9???̙ϟ<y~|???>O39???gg3Y?9???ϟ????39???9?????<?9???????9>?3y?̟>?Oϟs???'???s3ϟ??ϙ?9?|'?N<???????3Oϟs??????3?g?'|?yO9ϟy~'?<???<?O?:xY8???>????3?>s9O̜??'?3~gO?y9?'?9??3~ϟ???O?s?g?sLy?????<|@y?'??9??y?y9?????39??<g?<3'?9gy?sg'??>gO?3??9?y|'s?<9SY1??~>O?9?~|<?g??3?<???'Oϟ????'??9ϟ??ϟ|??~g>|?>s$??????3>I??�C>?9ɟϟ??y?yϟ'??>?~?3????|0|??N̟?3g???>sg?L??3O???s???Y6'??s??|ϟ<gy??|ys??ϟ?????~?????ɟ???y<????y?9g??s?ɜy|??'s??~Iϟ?'?'O<<?'&?O3>g~gg?ϟ?g3??>OY ?Oy????d3??ɟy??????y??r??gϟ????|3?~s?9?>~y&>|?O??~|?y??~?'???@?9??>L??93?<?ss|?O|9'?󟟟'|???>~?9~y?<~g???~???O?<??s's????O̓?$??9~TY!9???Oϟg'?~?9'?sg??9~g??9??s 9?f~?????'~?~y??????�C?>???|||9???'??'?y??y??9?|>|?????|???|?fg????????9>3'??3???yY"<?g??ϟ????9?O?ɟ??>?9???3????sϟ??'|sgg3|ϟϟ~'?3??g?<~O???|?�Bg??'g???~g???3g?3??ϟ??s???????????????ϟ?|ɟ??<?y?y#��jUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTUU*UUUtTUWҪUU]UUURUUU]UU]RꪪuҪWUUUUU]UUUUWUUUUUUwUUtUUjUUUUtUUrҪuUUUUUUURUUUT]UU\uUʾUWʪUUUUrꪪUU]U)URRUUUUU%UTUUUUUWUUUUU*.UUUUVUU]UjUUUU]U*UU*UW*uUU]URUW]UTUUUJUU]jU*U.ꪪUU]UUUUP��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/mutagen-bug.mp3����������������������������������������������������������0000644�0001750�0001750�00000003720�13112005742�020646� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3���� FOOB������aaaaaaaaaaaaaaaaaaaaaaa vvvvvvvvvvvvvvvvveeeeeerrrrrrrrrrrrrrrryyyyyyyyyyyyy loooooooooooooooooooooooooooooonnnnnnggggggggggggg ttttttttttttttttiiiiiiiiiiiiiittttttttttllllllllllllllleeeeeeeeeeeeeeeeeeeTPE1������aaaaaaaaaaaaaaaaaaaaaaa vvvvvvvvvvvvvvvvveeeeeerrrrrrrrrrrrrrrryyyyyyyyyyyyy loooooooooooooooooooooooooooooonnnnnnggggggggggggg artist name�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������d�u�=�@��"`�1 @�?˼N(|rrDO xKإ2Mw3ŕQv. sR܄$dyA�� 0�#����4�`��� ADYa ^O-c7 EbJ!SwukrA%5:=ʹjw0l%RPn@MD] uؕd oA`�� 0������=� ���[[6mes| !)V+ -.Xڤ4ϹR[" !mdj���0�����<� ���=|TVYrK>͎pu1D{-eRa7tfTb)JT*vdkB�@���0����=�`���PTdZOz SGm=F*=)2gK̘Y +ci7bpynd dA@�� `0������0�a����U^!62z)}H:]X7NqUlλcjk)h{ech辅*kTd(jA@�� 0������8 ��{T:TVuw0QlKJ4������������������������������������������������quodlibet-3.9.1/tests/data/sine-110hz.flac����������������������������������������������������������0000644�0001750�0001750�00000146652�13112005742�020454� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������fLaC���"���� @�X"ߌodZb�� ���reference libFLAC 1.3.0 20130526��� ���TRACKNUMBER=1 ���ALBUM=Tests���ARTIST=Quod Libet ���DATE=2014���TITLE=110Hz test track���COMMENTS= Nick Boultbee����e #Z'Z0kA|{.>zy=)zOdblMyx  @mN5%"%@͠l6Kp]=Jl{n[ǘ8< <px@(hA쉖}8 Brȫ3xšBإc0#T:HU4 Tc Hu NPaa!8vA3!qJq bC (cRG$*$xxCِDܲ 1K(|LJjnlQ{-n2n2<IA;c5 M[lLP=@\֒[R6D"ԟ#dd% `\`Y45Mi6o`Yi7 [)yFK٪%QW 1&y̱ # H:V1c8RADY:QaJ!(fcDaJ!aRAGÜXQX;Bv0E3$r BB*ń;x3U"3^QA`Dj{\J $0 !,&k`/%G{Om5dBtOR[Ka5%_0 8&tm6К%>kp|>vxzh,5VigV(3L-APF:YfFa2dxE8VS!9F0è:(:AŁa4Z xw`r@AaT"FIrqRDTUseKuR3L$Q9%SHz(%ǔj;mNx<<.MO-nAboY-i/D&oKzI/[Ѹ H4 ~gi��h`� 筴 4WWƩ{pI.Tiy0VA Pxab 4肵XRXRFx!`F*h!E`(ET*<:pŠq88*$*$2Ò )BVVcC ds^:Jt4B i[PBbT,XN, ,A7T]_4l |eм?ַ)kdf؛5N 6/MkM{z@55"h5A6k|L. [_bm}-NN? %F֯X$bJ.mM ٨e%lwܬ"E#,+(R N* $2ü"S) R20Q(!#Bü2QP"SУ* s’hWUKy?N  8&@с$7qP!�<$p5h ?D'\<^כri>.G=/{tl4>MjOVRJZO=6~ȴzLXp^/wҡ׸h`hj5=Pud`ws(2s$U `$1A!C DX$ XU B a(e A CA3Q`0 x1V+v%:Bu!tf$Rʔ"]&$Fkꯖ ,Pi4Y& į[h 0=M&^Rh5. y6?P5o-%"=A%g_'DIZZ^ԗP  N/ Bٶ7;? Xݩ ~v\&JYĊi]ZL9C!!c2B r+EQ\39(2A(; )p:QqT+B)PшAvbGX[Ď,<<PBN/i3+]`Xh<ӀiŨmX+[k>6GMr%$פ>I%<P Pm )y>.I)/k-= `5ľ M@ Ŧ @!Mm $Q[,a<ųTYe<x#9!"XW: 80,$bQ\1 #98 :K@$CA ( 3qH"8rB!HC1ańJ TDR5ш$u幤4HoSH-ĸ'-0Kp[ 6 a,~mN~v&|]:j&$y�J=p@Ⱥ>]Nɧ 8,.<J xQM 0R%RifIWbEI)hQ:xgc \@wP,'08dCBhR"Q`BA D xDGAŊܬ"I#`P߈~!lbXi5D 8iCqp7}e>Ԭ%-'_] Lj�~^ n~[KI%eԖZ\T _+[{dkߧL=CE q9k`iqe7hK!gUv9aFI!bw:TR0TdxTw#aD9'QDAD vC :$2;,#)L)`cg( TF@Aa3xWRDȞWN) i5VA j Q3+Ooվ}m�xYOPk|/Ͱ>R}<}}~V~~(_4`:.Mm"u=D)K.,HARȥLg,ȂDn4 FC%J,04 :<-P4=ԒƑ $SzCL$U֯DZ'4آJ[ Ri̢D^!$(kx,Q.%*^(H#Bؕ4~J' Iϧ $P@> /d72uܵz3R0XyN/ U-ߞB񆘔$NVN$E떭骊R]_k/2Ѥsf11KA#Q",4͗oVM)nrHYQ XLgx(RUVD\ƺ1bZ #cOKDD-3z-AAᏄE 9/zEqtM f|+l,hy jLn -9IRQc F g X4 eGz?<r^e5W2<NDUyGYLD[>Nlh1ͪ1HyIe4L8(.M1j5ѥ!c\xPHazISd4ζ4Ab#լJƜ<K7v4xʉ!- 4q*B$PV>O9y=6p@(OL[ :*E$<~pEq=!sT5qbuŹӏk&j"sb*I OyGF 1^ocLm$Irܛc_\Wc78yhj$RNp(40 hXőYMb\h@HVg؁ᇙElJ,S JRU%a'&u #QG$Hb٤<ﬨ(լhd$,ǕUy QsL<QgRQīQhK0ӞE7+8EKOc3uMbIZ,8,  $MMFjƊ<ʚCa 0(hQi E$DeŔ)yŐIźcQ<Rz&س uمBBk#\Xp<B>=/$߹QNfOv-n!MeTHҵjaCHjxSQyFm<DrٞSYWQBPȌxp$#uUpEJM+rQhNr&^N%6[=4,|T%/"oW0 Ё rя0  Zxժ$$ jcЀDzq⇎'E%\HA!Bٟ,M,IbH-Гܕem뮐GEGbYđqL[&zz81,d]F'D=AbaH {&IAG^)& #Y[Raμ 9lc4ƣl+"XX\ 1pD  !吜˅ZD ;F ,a짌 #e,q&}!/MF=M%$}ҍ8j+sYDsԔja T<`XP?<`ƫ$HG5O8 W-θzb4{{rPY)h. %DC FULW_v!&.n$Q$Nw44$ch@x89BKuKҖT<a(FD40UZ :ز 4`K40iQ=%)cܞl2}˩h#F 8462n2~^LVF )i$ (Y g_-f% !.Qqے-^OzQ0Y)銾RU{;z%K0.<(Y $a" 8Exh@XA8/n3S0ql.$PsLK ?Jܥ5EJ*,%5UZR)i0eM)=CEg˗k#X ($a%[Ɯ40kYW$aon^~rx&Y'~ↇ †;c+WByㇻ 8CEJp{kPLsJj.г vAb%h@H@Ik!Yy (EYMGN[lܜ{5fYaa{',B=ƑOyVl9vGOFK.HyW*z%^E,Q$$!EZN, S^u8sDVMTefr{*Jc7I!>cJ%u94J4QhℕcJ4 V<xPط0icT- 1{q …-8rzJ!(F\cqG5q%~w}CHK=g YfӉ;OfH<WӗUyA)8́0&{'-0ф<ҒdJ-DJ.Bk4a-!v/L%|b #EŐRQj[/H4SK08$  ÚP@$VsQrT]oNy͒Ac1 6sb3cB`&z + 80$0x%-W,,ǻmźsqead\>7zal묋q&-%ZA,B)3R!vclpҫ`J-% C0ISJ(ʞrK)$GE$vN3203.X,v*(&wl?fL䶲>80+9 !DI.Q#Sa>VӳI'R[YGmkTsh([LeےFj*BrvHQ*e&Ne'2R2e j8ʜJ%nEѲTٻF5ɣRttJnO;8E7#ӛL8Cq( 8r)>ӥڤ'eE2CXH2vFk_6ZȻ9,CɔϪoͺr:M$K4%)K2Ҷ܂q&398eҵg7k 43S'j#D'%!B8D)*RML+n1DV2%jg$Mg7DR]"(T̚LN9S}YZT휊DQtv}ʒv]*TVs*}:]-eE":\t}vvR{Lq>TSkc}ۢ)ʕ]>KIrdiVZjG5eLNDIMȤl2\H!̢t 暚Q'&e7nVKJV̩HMJ$kIXV $)MS*vIt>T"gHBgeN!Ȥr *#bL7iftHRk):twg37NNElRYHZmHQ)BMfoRvSi3jg# ))9Tfm%H;m1.D&HNۉ4؝+]j$k)&N%ڥHGMզ4K#+\'.RtG'vqO)>SnI6s8!B 9"ؤuoN Q0c9>TYNeeIHԋ\ʔB)EHEjNNVuhBSvgR%EԄTDYDqkf#}:fISqeL +H4}E$*V%i6d4bNEKmx )3V螴g1'o'bINsȊZid)cR;v;9e0s><X-DV9cIL(IFL3eID7kNE'5mے$D Q#QMlʄ)ԒfM%E6m䤗$q),I۵nG7#D|xB}Hq9)9ՕKIf[)BMk+B%KRvs;tY#8!FbQLqOo4TvRVnKvK2oISrXҳQ"TvoZ[(1ISrM!DRI$HO؋&;S)ݹe%LM6&$k2ԜFpE9+^m>mӘ$Ѕ1$bT|E$rytQ jo+;)jlͽ g1tbd:]ңȦ8iI9>O&E'Vr8'o.Qei"DR):TcR.H%vj+S96N+rvR(bM[FnNjBTZmM:Vs(!Dsq J3ۦE%#K؋ q+99;)9ԞBtHH6].*||˦EDT:L&tnΑ b˺ZԖ7OHRtS8 %bge'Nn4crFh%NE'n"DD%nNn6R$'nhNNG 1ILVNi$.nC+8 m)87dMRVrmvE$G%'hrr9,O(BHIj!c".v[bg#idgi%9*yST'5Kryj'JE>M<&]I{t5h&""I̩NEdS9 d&ԊJq:)JB21[$dԑ&V%J!dQ%ٴL.ZSJ+IͬFdmMSt:Vh]Y6OQHNC,EkoV]JʜѝzEݺBȩITDZxHIݓ̵(VIܨ&p&0"1$wA)(`BRQ#qar Qbð9!)v2JUJW3us$4y[E7Ng'PԵ宗AxmmMuo ?\씤V6 _omIW#[L%4/E}ɰMnoS4c|r=[h˪g= #]RF<B%ʒw)1QJRB AB q !8¨8B AL ¸0CuCANs XvÐR*!J!+0!\TSt3vшUDu璫K.K-WD{u-K@,~~Z/ \l5)'KRO-/=>zZdIKST'x'q73;cܙ.;U6viItt2ЯңʑZR(bFí+G!qwG! ;qP¸g Q))!qQbAL^+D[iPS!̤u3],e?/WS9y7ġ-8L%pjRټnk ޽/Il ӦM@$o'ZN{d\7Z[ZkJu-`?i۽=,\^jժK^ȲiާK)\Ú:PU9N1ΣaR 8 XÐc )0Sw QL1BQ!gWWUbH8aXb! w9\e0:b1ȃvrJT3UU|cHm]7ip[z}}z/+.\|-/ֽoޓSz_O.Dztnmk] A?ohSvm҇5uWFj/*2zz;V* *, .C9N* B83H00ds2BASHpb Q!98BbU \1RACs+1F$Bj;ݹ/M}XZiskߵmѳ)e"P.IJ_֒RkYvZIA4`^-~kool R/t[̋Ai۵a2].m('.'/{b&{sD"{LjK2d[HR + r;hE0(4)caQ9qF e@p 8DxU`CwaA1)HG) S!ԄY+Y]h^Lgg.}?4b?>mf \ԓEZ&LDe_ȸ-~>N'iKz^ˁ<&RM POMLDVkW!TU2J;sb38)q)gFrcVcA!00WuAH DXPD#sHp1bGC9C:c)]N[;HEd#Uvo&b7'<ؖmzpN-ڛ7 6Kdk씵+K{RJ|{ȹy6}dNhzɓ˕K l'>~&WڹͨDk=QHK%Qd)PAcB,!&ňRäV(DSf W )N)ca#w Ha(( B V(* ; -=ӞvEs5^BչsywBvyJ6e5GnɢekМ%.OfvY)i>\&VO'KWb`>͂ۃzZOpYBKAm>5ݢە/7|늼zFyK+{YԈ"X;J*) AS00)J)㸃,2*üc"N2+b*(bAT)D91GP9 a\)bREB"YJE,ĺ0RܕlU]N&qzޕͦ4ᶻo}i^]m֭N$k7ZLսkkRZZjlzil=V|52\-0Ly(7[ CfSͫZzL+4GKB!Ԥr\R1R9&*qJQ q;dYC 󎀈8A(BPp8 (9qHB´#:!3Rt B0)d;+c5{&ɨ%(Jb}xܴ'?\ }l=p~O\o_oZڿ>˓e.r/$ț%kZߥfֿ\WNrlz7`6a-_%n$QƘi[yֈiQyUNw3"f92J9LQPvGTS4ZFQ0B9F B!È@1+QQCAfH|ۥF-xCA%#QZa'%,Ų[ܱBF7xQSͥ<Yd -=G r#XM塬[>ec뒤]M5V~O5IF\[,P 4HL[Ź55j&bPHf&(\?cĜIRFp,(0p1H;( ^p&%B8Eb)Q;"Rv"Q8m C)5%4HbX0t%DBrdn!Tc.PDM+XK)ЅG38s}%Der9!QHVRNߧgE PC VY< Rl8AS.eeآ H;ba "RZaF|GiR!MT0QF&E9Ve6sqG4 :%)#db\"MoȅiL8B؊(pb#SVZ4N!A xpFv!DTnm39*+]Z$ "DE<Rc靖tSb^(vV}l bS,S?GKCDKf]Uj GgtKٰTNeQLj{"rUpƺ8I%$(1h溩4cԤEK+CLr]*%ם=*# 3i[NZFn!l"9%//9d}rX%VZJH)1CgI'eoE.TBCʞ̿ER/!)(B'EPp¤]ggg!H];}Nvvp@PB? 20ݻnNgl%+R!Ĺ99"F٫$i v1*Dq.B+(&'#Rj" 3p( \))9;n#R8$mq "s} V!Htp̤YvV|OH(/1b~0(8@3Ɏ0Su0O]nlW֡8 +g?_([/ԚF{IUnsLze=EQk0DT2S )L+Xk-o#ȸrHFƺU]iD"1 B<fk-ڨ$Ό䔷_GM1-Lj%G 3:mh+jv;)!Y+]YQR(F}!rzAb)O-e) P .ΘVtr;90pUqT91DAB+5&8ko0PaM lɶБdDpaN5ՒC(6LNMF(eA BqEJh3̔E&8lզ3A@N!Dpb )DB|MȤ‰™uekZߐ,Ζq78@g}cygARˊ^ˆX1vu 3"lL뼳]P't„֑QAƮpkRVIrLդjHEb8 PA; \e! # N5p6ęEQ7Xɨ`BsLG ADq )J;]F;nBXQHZA1bRz#^a,Gg#(™{!{= pW j%c(QȺK׵LV d8cVj4E 3䆡o1dzJ;LqKt{4pCLJZ:{Y~HJ0$%T!nb]w=oOZ)&Bs_]ޘG%1UhY sQgUq[D]+1LVrYVY還*9(PMaS*y%r:~gK76b0usBWP¡n)'"p`!>'%D(aB^3+lܑF2Vn"pA!M6'0 $$HNip7dԑ%73T1@ 42g5h q 0@Q!CQ?G1H0pAZb'+[>38Y>t]<\X^(Z.R:^`M!Sˈ8BϷiۥ s;nݻv8 B|C PcaAюх f 6:(bq-M$e e R1A'$(!#Srq.'"Tɱ (pDMF%SL1FvNjcALgQ/>H@eBCEG3;^]-UWꪪKBTJW+Uw;]>)Z)wR}k}rNS+ 3Cäk'.RhVHQ"`YҭE2 rإc1aTC)\#3 9JR 1!G)L#)Lb1Jr!b)JRsR0aadb1٢&h2K]t9N#:x|/^Z~UWUsԮ=^ZzKS\M׹x9p>=Uj[Y}fSG&Rdvĉ33ddb!ca D! A F7s1 S1C)aXW9b)b)Lc9B+0 F0a4!Dha!؄DfhБ! %G%LfXa~>-ZM2/ode?}/rZuz!-TU/uKߩk~_^>-{}{<.)"Sﴝ2]d3&l̘N"F:wr+s9c!r31b!LG9R9A!gS)G)G1\1\f9RW*Ȃ%PDP("B BDDdsSCN{{48]'woW?No++-+JR\֔SSEw)Uχx/꾽z'?~dsdapXY "AaaX"HW#f3Hb1!CDEs!! B16!A!!⸬r ;)!Bc1!\"D#!LLh73F1*dI%Ĺ,T"в*u*ΧSJS^W^O+m:|.׻ݴT//Kűm˔2b7nI #!+b6#!ơ4aA0D0`D c!NWG!r)b1NC)W)r1 B!h2B#!26ɱ+)]6RIe-媸.?WZZuUʥ~e鵧׫mޖNuiu?S|OU~UUV:\Y*tT&#i4M"bq8،؄ffc F!Af5s!H! b1LC!S1N)!b!Drq0C0 12cfa0Dcc"$Jԝ}x{紨[ {m~niJ~+"T+y{u<>*ǧa}Z\W{ZTVoLV"2Ăb"Ff1)̢1Uf1Cb)"S1B183)H#!c9G33G+bg#Hd%l6MM6Tr*v}e,[_-+?u_ܷUuJU+ԧz^W H-^+ΥQTWS{--zi~\cld=8j2J" (&"($jB؄c)!Xg3"Lsq R1R#c!NS)e!#1AWb 1Hb:1q1hf!QjH͛dQ̺y*.Y9Xֻ<-VAk~^^^uuU)UTuryJ)6e֝Z:N:oKUׯUXbϔ*wv䨜[&l10Q"D2a02 C!!jr!va!s3 1DaG9 v!L;HaBa0fcBhlD̙$$njBIEck==jמu~UWS^u>]Ҕ}+֝2Z]r\ J Ju:#󺻿??SizNjŲX$:rvLԜJhɍHFF$ "4aS)B!b19fSq9CqCacCCa!F4j !3! Smv*yrx ~Lu;}6N[}Wk׭eե?HpFyxx?wqn0RB8<UrYU3DY#H"T*1wzk-Ib{氒!ϯPL|5E?:M7rnvRZ~OJSd^u+`&[me)rL^.)l]H,9u=[Ez!FfR#HSSTTr!+; 0+CB3A aG)+B x g@:R ;DXw;%Y҇X"Y]ݕ؉Edu#U-wrKb^33w^&nŨ\Dp|o akNKh[[zWVr&I<m>ө_L'eL- a|{AfcuVbhek.f؅SVU1B! Sq3xs8b9qC83c1 b eF@dLr 0#:NR $: I3Ur";ѹWrs}M.6w3=OiP%i$r}P}p P6 2'[iJSh.SN&S\τa3 ( ܋rQGXjŜd2ʲ+bwF;!\Vњ"f"! 匣8:R01b8H2wA X1v;Te!B$Ċx$"Q(SL܌rѽ9}m].4%-G-PJp͵uM4 `/}] @` imzhK] ` |~d0JNv}1hK[ff,őiW[$KJ *Jc΢11bBav0+gGQg02(T2AJZ+39LRBHc$fLTtbXUM"!(Fr&k濚n>W N]-z \F{ m`5CP-)hP~(piv}.u4X_/6=Y5sqSb5G+VBHҵbD, U!)T1 rYFtE )Qd!R*LR T8GЍ3d(:L+,r(vr1Fu!,GYIFXI\kf63]7 NTMo͵Wi_? %r0vnu)] xJ aPŨO ;kz Q<- FԶ/rQ=,iƎ,KbE<刷[)]c)JKPF)LC)gRCP: qJS`3G#CX c$4bD[w)EX@Dzng"zUU]jM#y}qW<&)h{[1{\yeIPM<$ӂ\&+~a*ml p - \6_:51-OF'BQJKD(J!QԌDdxS3"YGx<!gcJCa*΢q9EabT*x)#4t P$)auFc;"Ȏ*t]JdURjDZ5KcHy_&_??M>mu;ҙ|L5>|l>婲Z~X/2^;L<j a7;_&#cgY3=Y Dd!.ZT"y;Y!dv;tCdb c8!Eaw9g92pw82 1NQQ"I 9"(c* )G'yR)ʦY^RHDUj$HK?IcT~mLRkobCa35ǧA(&Wkn`Z0am>O&npzn=0 ArJmnDmf a(O.`!ZjVkƐ̬!f4e3UrTeKV3"q(R$E1J*F;V*Q*EIWP: 0DE!;QPTF;Nr9Y9&Y݈̆Z-VѨܬjkitL}7e2~Oe'@ QLo6N Q^RunK׭e^?aja5Dc ajM777=K!ک,ǑJDj"dfhQVV3V9Uњ*C:cQXCDb* W$w2) G%IYIC3LIT{]ՙ*_OMD`۾R %-@ H)F\h!B �S5%܎EKNΞ"*JL9 -]"룢bY 1y:S-<V>r劎b)?)S 1ڦ(`p0PbęD8FH$'NvMNմƈ! 4hLDBfdFٓ3flщ) Pnb|1DPBvhnbRvJY(aB#s+TDqaEik:]sQg.~r) !Ps)(aQjuc\È8!~\CeGbQ>Tn**IRDm4m97N#TE7$ȍLQ̑T&X$N!1A 1nhj'fɚ((bF̑""M#TNt;NC\ EQ blcmV0hS (0CϽbjQXE9,En*:ZN#vq#vNf lɤ7R&F0jdDg "f2 r8GlHFȈDLؘNijȄjȄh#Y PQ9!SpIjDXGD1[s+;vc[)os{rT*>GY R-ϝ1۔V,YUT tWH8ÐR FBQ++LVY"vVtVtK 'QIȭ]S&!;Hb("&d2d$Lj Q!, Q+S&7j3\̈́Q8B8 Ã8@AII19Hg (BT(Elv%O*yuQd#8Gn[T>Ֆ쾮oR *;K<\*v9ױs8@x"i$5N")T$dP'fQ;4DE3FQ + ș nhȉ(1ƦbR2Crbq4 (NMDYQRrv3Bv'%Egd:y/ޡr<ˆ;.@g!Tr=!㐨TC˼tVtZ[QR˭i8e%ȭiMd8‚E'M!&m‚9#S%dhN2E426$%&CBDb65%T&ƬL8܉+2%6fQᕮdJbi4Yv+yaFyȭz9JbQ=CH/#b厅!T9*-+/=|) gʋ<R;-O'e) ץ,EoEm<3+2h&P†8eB(8G5"Q5BSq!FN 8N'%1(ĂVĆQ9(e2#d$&n Dq!)H'$sDQ.))jD'nkgO-;WE:;y]>eeGAHv|T.q#S | cb'av\V}]ҹnHwlvR'ғS(" 8 ؎#p8#\'C( D( C&$؈Ĭԉ+33V' Q82#BSQM 9bv (nn Q6̣]I)'I*;Tu-GR=e#|E|!ҔHw./Bg,aX|R:tŨS}#HT| 9~(n1ޑsBSdS)Nj8n!Fc9c)5ɛ&$77-~$)36DF%'Le&%6H+3I#3DrHѲrricgB9"gcBӥ1B1ROУ#t9Ä,bƮxZ xvyUU-cttvC\02k39ݵeri9lݫ"iFݶ"#RQ99 Q)hH6m g L 8ᜄLhMq( 9hno40 2)9'MIY̤h'3ڧEg#vw}K⣡f $LsJ-�~ r9 ϡ%2ggo/EOwg!̺Y) EHɢبMRtjݧ%Hb #ɴ"D"5mBsvIfLJ);cR(4bsV&Bq;FI19#S.hnҌP%Fpj"\ek7"*VRtkM*XEg3SBr+;UgO˾[gYcH]|9G̭+.˭ݗyYr쬨u.9:KH+Y]ȣGF6d6J6'Nh'Nȍ"&LՓ5%FqLRl١"f옑)%%Q+dq.hզ'ͣrD'qRdۤ51tTY&ڥR̲D\!L).g#w;:-Yuʊ!R #(tH,|]MfQe.Jf($[H!9'I3DVč&DZP#F4CLJeI352)&ЕBDjjhժ%jJN3aeDS)>nӲʙRr*~ EYQQf[}l,˯O[<b;[[˲t՝Ub8ÓVJG#INTrx,,ܝ*|)+IHeDS"7jJj2RFԔedJɲlJБZ""Fd&DLHI Iq!DhEISdLژ+XOI%eoȤYY$N"+t]>ee<KUJ“~_c[,\dQtTT]T)gk2YS."}72Ѯ!@B,#䱫h'$Мb(pEdM2#F "bBRFɛdȚ82dQS4dDp8855pI&+q$II)i$KMt2۲)+<,vs:,}nTV[œ gt טQ"9L(eHVZeJ˔10Y"H֓ItȤ*""DQ!tH)9!#VɍI"&L6Fѡ6DL2BrBq94LМ&)TDSFBs9$NgQg5FR\6#]bThVMtvR!Ir*zˬv}~)g{9AH>rTQuv]t֫8±SR?e䈩SڱF)/1L9ϒL'6(D2hHEdJFrd"Е6$ȉQJ"6Ia94HfSs\'Fq*RVmRs8ґStgӑL(„v֢Xq3Ϭ\B-CR|rQdgo2RYu7!Ls}>Y5G#ʕ7#446BtԎ3RrFEd!)*5[A*d2dDY(4M D̚""L̦䈕"C9D٥3iH*JҲiu"ֲ+tؤX`a GSeeE **[y=Hv0*B8KuT^X]RvY/#lKeMq (R):XE1LH77DRjBV؊3S(Ԝ6DЙfɛ#sRl&%lmA24DvզHIdMv+t"]SҤMlRܬe"S}T1i.TTYjbvHtK,I{>eEI}eI5]RDT,J*TqERrl%"Qsj!D#Fț52#R(7fQnk8"!!C96iRrfM 4hݢDѻFSTtє4e3tIuDr)?1IqkuӣsY*.T]>+>K,ϯGgQlBRNv)NtR:ZΛʹY+8 <$ Ԥy#0Z )$%?PICX\{T0=ĦH,Y)Sρt@/=pi 0 ?lռԼA:|& P%AvZOtK`\ VhmKeX/ .=8Z($ Y| Iq" 2tG[*JYJD3;Y@4"Ⱗ@ap) W,qX;`USPpr)aHC"B2¨Š$31aPIR Z*Yb1aDs4U+N4(hQ%rUsk,Pjs~2ݶtkhl@47˱BtL_NjVzS%|f O+{rOf]^Ю0G9UGW {|}>32wkyx' _Q))RV"JȁeAHOIi9%[!.)q+1n-12YjDb:j貧cr,^AM$\KZI9d-r!R!Xآs)!jzVK-"}Jɢ^]]YTQ/QEqj7xEBn89ڳ#euW~kȌ~ّ{?vݡ{?8/br~`ׁ;7bz/t^=x^x]_F㷳(/ư^;:a# W4A.ΕB+jfƁ!#33 (4v;H0+r QPdQNA)F9 c00D HvuTRP.BN:rNI40$8 ugUp{$ i$)n pZӤRjZƨ5tof"8X, _--5m7ϱMiF/jи.ಃ?e'\-i&([)ѽdiEQ (Ab+RТC3eV$tDp9EHU$fA˜+3`|@t $9!9hx1cHAPd1Xh0hVJDZLy (H]E&%j}.HH@Vz`k za�$`\d{&ț-'^ZIj^g٥Oи@5 IzKY-ktM&N<8[h__'e;l1n zpŪ<P\ĻCD,RΕ!*Dxc¥BxTUT,rBP+Q q0U9F9x!`@W4h9 T!H2i ы3)ʅRէ/$ͪa'kϝReso'l˂i;8[yv]7Vؿ'{(ݼ܌~Wʱ+ ό嘧ٷ%s[8&tEe7WPnIhRf>ܱ]XMJЂH]k&aTK1r<ΒT⚑O]d0Sb%)X[SHD lKsz$ҘreZS&:sޛbCk)rjEi[,U) S<9b:hneXF+tA Ub^n x3FVoЍ 6t*ϊ߫{"0o?G{T3v~n k%)ktdXxo׻ġ|kj'=yVdE!,FgyH挄4`(S G1 09B8 (b10A(va8BaP43*A;"r#E<IFxhqrHk iO$`5M]b8廭&'44P<x0 `ؙ=+7^| Oo| l@7 /5%p pMT pZV<.\7|aw(ˈYKD$`XEr!U$X+SJPeނk<]@IIq=35H13W%F4P)Òs !bW5)䚲I)laE{!4!.؊TQBUs;Wٵ++}Yg0K5H7y3k{+*B,tۋ9pg}W?E'{R1OW?o$;պw^=^jx7}lX0;<vg ʊyԙ Uu(AE&ȡ_KJhSK$-YH-E"C%2"iq-))g*kd\H!$Je"[zq$4גZD"%R{0\ӝTRe  CŅ"b o(Y7ۉq,nSk x-<M{x'P S|z{ҁ<ѮZFZ/6m%"^h>I- `.i-GA6EɭmKZtP{T@Z0z  8M/m}nԼMZ뎜̪VE+]%")H"Xć IhRC<S+(Ge !C$*3@# 8$ D9b FAX#LG#d` hAV)gy,F 1d84=ҔjXOmͦO%G[&KP-N RoNpIq8r*s stuvXw MIm@Ez)d sTynj\zmq&PYܚ]в;DBP? E!_PDB#l0_OjNxj'L{JK2y21% 2r4F "̗!PUJug R(Rš* 8h 5xBD2[;C IR9̢-ȇ$GH@Wk-bJJk/'CK(lZ'qjIM\mnHy3qDv<H - {J Px>l[oA5+Mm$t 8k>q(MX-IjQ7VG+7!HYHX"%Q B%iuX<Xw1e Cs,F&"H+,rأ1c%VRs5hHR2Ӗt)S†s<$_NBĘR<a&-.&c>&۳{Z'K&-TL$< S7̶/k^.o&xicSOB|[kKZJf}\ 1MzY9YԍeլC)D;H#3U"D&G3gq"^wH$Gb¡*+lTF(dVQbNY,C$VC*19hzXj7+ynKIBJ]V|Zs)Tر.4}5Mݻ|.epM ajh?ރH`xh%paơϝjrPa,MIO1OMTsD(_TN]"%eZntHu|agcV3%b8c(r$V<bTD<+9لX8B,C)֢,ř,r!%nv9%4gKd }v78T<ݳ[ LHHOX@J q3jOx}N|&v%6^%%CHlS&3Q9BTƐI\xW|v%-ߙ8ӖyDiWYYxl=̳T<a;1AvGyTT;+*"vqt;Т dxib)&Gv# vY)n1.{Qk?7Qk6y=S4<L~špq=aA.] )ݮį_AtoYص, <AmCL&  <` g,P1=SJ7[Ffe!dLXQ>*v)s,n`*9v2L;F"ňy QZP"u)EDf2,Wx<SNO3RHBHT<I#ܒ<畲`/'X4 [b ^_\bo& RIA}-|\7ZiL/ol4I,cb$jm5^6>(7?7E}-q- &*y9JD#i rLzUu"JUb)X;t B" b[,8Ф <EPƌ:v+t%h(f2<)* ᠢJh 'QHEXgC8})hǣa=kQn^.vRM.6ζy+œh~^Ƕ Q0^<K д,7x~}pқ8/<a]i!!*\ )9cL^2Șb#xĻ,y',T4Rjhb)Ws ;"EYcuH)TΥ)Hd9XE3"a Ic +TR*]T9,c5D1%,ȳ GL"[YUģjm 'OLLPJ- ]=D3 ݮǸkOEa/yN&RxcZPƱ]iGƐy6儱}O}vj& ,-jE4pPQ,"ݮ̥a2!"#\І$"J#E,D1Pva8B)"hń<uA;Δ2Í<d+:YNeZ3d,BLYަi "tBO" "$pǕ6U,"e_}<'j4PAߴ}\l>ɒs%ԴqO,7zl6] XJ[ <p4  LL-^M7jf1Eni818Mrw5ӈdʶG#E%SRHBU XHrt4H9* *c: D(f: H i #;yE&$BȕNu*D[$<pFvQ5BԵNG@h@XX`& qn&PݥmM~aO o?w RTSeQPMNM"KIHAF5pj1 dzZڴ/<&4J-[?ɌZ[n0"Uج!" B8°88B )@1(.(=j0M(,= 4I,`i'C ab% `G r8 qb08)*V) w+HB{*hW]OuI/-xl$/6E%?Qvj]ۻow~~JF'io,ni`lk^: NfoQu5j$V3;f)!S3QpCOyN5fA90C"b$A&QYFIY%XDJ4E(IFO< $N`y0 ŒqD-'4{jLr{XBKر"$A2R%nBv<_^)NU]:UU9?vjwQ'TݑIdntYmn_~v9_*YyGhxUkZ"WU)PS/HωLmN blC'9s[A)g$B1iӞs4q!idy<,#M($AieAAk1\Yo,B,CH0zE&C^b!=ccq\:[JC'SD_|_mg{JWo|h]} כ'Ŭ6!>6-&_-rNn}m__^bz_W+k;jeҴ̈́>[԰&zoT*1lu3G1bAXAHq)F˜PQ8g`19 #I0 ,ҍ( I9 4K8 9-qQQ$ qD AL9BA1()*+rt3XIYC8C{ne|هs.?$kMIk-Zܷj]?YETO,Wni[ڭԍhvʹ_r=&#=go[dzۭi^צ[K8ĜIK;2,t0+))( (;{1!ChI81CK 4E([<ҋ9œayX88C8„(QQ(S@bSDPb e:Trjby9۴nҝm-ˣeF`F \Q#t,ԜwvO쮺ywnT]O4H7ƬZy-gՉj%&zMJJɁ2ONv=o/3}GRYn3U"܎"Js!aE@ L1eKY Y0 YBXqO (Œ0yK4A&ag4<ak<yq$Q&4J$X!G0^I)'ŠŽ54D Bb DPCVn!Mgruo|xz/@uD`}0fkW~UgUEUTWO6r[W$ojS#Q__uSi~ZtSdIJrN2=ĢǪr4D vJG(BeYZS^K I$Q%Ae< qe 9Y"V-IfEAŘI Hc9y!K hJ \c1Z `$0A`$ aF! эILEKг8%Ϳ6 p_.ȿ{ZnZKMY^ȵid) DE4H̼5UM6z=_]ݪYbH\zF~v?B{/~?WqS9hi e-G IE$T)J$r+aPD)aE :0`0+9Ia&YYeQIYA!8bieiiEAf<In0dC*CW!Ec9AaVb1t jJ$j&58wW+}+o'F4_g.UQM{{uvE_6y+"eG^?ydNחn&KeMc%(辸cJJ#(KيFAXEEq@ S)0Ibs4H=4OiYX4yŐyFQYm ĬaLa(Q )qE8 SA&)RC!HB<7d2:niQ$%  C~}L/O;ܯt(TivM_*QEO%YbR-d77 -be5[ֵ-? 6ݦw~fo3Yv\g"!܆)LG('ҘK!Am=aIAh$h 1^yoI<c" 8 (‹0M($H9(KM%,X[%=i.i 5aFGiDG#JGoED('ߥSR /\fQuVӫ{_}e>Q;ooꪛ9?WdOkr?UUgE5w#Vwn1~Vmx5sKgWKۅ\UTWS$#� F�ʑf0"B00!'1(ô"PRC:40uP@tP G 4gSQHD cWq Z!CDQxbE2 INOB/!KU,Q\,ҋxp,@OP|> On _"ȸ0zl֖֒d&Ah=d^n!(pJ|iz| [Z_`Ke' p 0<8@Xx.0 s !(eҒD*(D2ʞ)c3βDbHp,F<;C<:( H+,;(RH)a`AGPE rq2(G 0 ,0(p(+b1OU9g{50Sؕ(ikXj?|j\[T2m˳տG 0d|Z^֛^:jk%=@5P%Bd/ZuL*>%%j q=7h,4By$ź3;, B1cwP*V xg$9@A`BAVq q8bQa`1B3( Щ w (K<"NC4:YeJhE4 U,]}+RuF^A$ހT~$+JI\ LП%-A:Ѩ}[M[Ozk]_ORI>h$/_-DkahlKHAdqeDb!5I*@yJr,@!c#F!1*9a0$!DbƁ@A FHœÐcwD,*b8 be $)nE) Ӊ9xǜ$`x`=Majo==kQqO 'f>My�7 jO|<C}jl4.&FJɡJῥWmO٪]ViX}[ 8IJ&سc8"JXCwse2#(PqQ!HQ*q rqA;4 a(b 3q`#(U,:"I,;e;y"Td2#,AĹ}L<A^^POzy= v?[j|$ޗ7I%-A4%iiRZV\ Zƨ G�Yr~ (@L=i~x|x߮ `h}C\iSQ ($a5Ub:,Q&dTI x83’⸄9)A(W X1FpW<aTQp$DB*<r2H(9ņ49!t:* 4bՙY(K[JkRTL`I|lֻ7Եk}ahԒ-.i4 P^t| ^P$[Za_zj ZFf 82ɤx!C7"䝤I8f)KtN;3 !"s10v AF; ,wA 3a(Hӆ<4+%)b 2HW9 4(X4" DhFUg$bi v]?5Z |7|%zMl-k5�ӀlD8H K6Ĥx@״]A87V-Y{T.I_k ZX,Zy1iDh"E$)"RJU0;1 :E#xTA :AX8dX!0$, J B q0 q)B0B ca\*hrôE)sb:$DcUR FUJbfol}I?PiA._xM˒Y0?mBL#'ZKy6>ؙd"Zۢ`/h/~Ij5 0ya8$0xݏf,BU1c<ee8Hb@4) (Q 9D#ss)B!F0*<BAC0S(g9Q TqT#bcZLK+)lF-W&6~`ԉ88=nM_Ő 06m R?D> ~ДlO"x.R$xk%C\m{H a1iS9~BH,碦‰v[R!8ǝHA9cXCB4Uє0TC gRxg(#ätXUfÌaDA E!G(Q !ZVIhVvId <)eI 5$qe[0H=IF ~q.%GQu|zoikpY6JZiZZInhұ&%#x6K>x.x``.|.z&й-7Z.L4u-\%cc妗7sq,pEбB X ࠐN+Jq*iJ! @84*2 Dw ÈP<fX0b)  s) c JdH.jٲ h0AJ!B°WAcB; caC!H"QZDɧNgʈ). _c-5WMW-׮kz]Ij|Z&_גޕjO/ڷ~WVjRez^_$uqzYl55&I C G3(s#b; EQE!1raE0a(C!9(!8B R) qqG9A3 Df#0LfQ2LͦwgBSL&ov_mazlzjV%/ZvחzKt?KzJ^֥֭-Kj@\/-u¡|YeK*Mb!t39E;w!V9C@1;QHa109 q;(QN!0Q 0AD cA !1cq @!Ca3 F`B0D! ɑhj5FPBkTK ypUTxuqJQ\)+S[˳z_7II)zKK^%%kԭo[t:;AiΡ`^RU:ת=_YqU'!Sd"A,FB&10301C 100d A5$V!”Bq0r c  AE(@(L!1E9 DS f1QR3fH:wtE3):t,<++ťԴSk|_^o_/oMJۧJ-d-i-KK|׿ץi[ֿK^[i2zm~ծ[IjS:V|+EѢ|hnNCV6Fd!0C1DaC3A!!)9E9 Sq(0QAaDC QE Aa139JQTDea hbBcfDS$۳RXWBŷǥW=J~Wk]_iK~}%m-/K|楫z%$'Kڷ+Y+o䭾oJ>dn?G _n~gkI̱RRfFL&#!\w:X*Hc!rSG883La8qH(  PC08RabQ!B2A a01Clb2FCi V찋nSߔ֦Ww_RZ[/-z]4z/^֒zZ+{u%)I~iokK=QUJ~W,tytbeT">Vu2Y v*b0Rr q v90QF!(8 1L(A910r88ANQ9D 11 bAG8Fc!B) bFfrYӐFtOϿ:ӡ|z.]ETU(r|OKkY:Od-$I+J&:z-/9Q\wE\^ׯmܧenܖىJf0!6aa A0381R)a!0 +ra9 R(b(C08B!AR9QgB23Jb;D[" ڲR!HQ2kz\WW+庿m۫oked:ץ%ik%zI[k.KZOI>ֵ'ޕ+m֝WwMu*u"߭1[TsTbj؉I$ Ɓ)WN!JQV9cAa !1P188Q098eA (c )E( s9NqaHrE*NqLblb2c4f)+}U˺SNrv}Դﵓ+i6p-Z7{e{^N'KI2]jWUwau G\Y{ eOuD&II ؜0&,w+ L,)Hg!ArcQJa ;qq1(; s(!)9 A 19G !\sBc!B f1l" lD63$C\di>qfl/;vo_/֧ׯJZ/׵߫kۯk׿RIy^ԽڲRյmz'/KS )KA`^W:ΥUz__|[;.Ct*MQj_!YU+f,sa0!)LSS0j +qE saDcA0C1D8˜ QQJp!9Qq gB(BG1J) u1#Ȝ#Q pJ!#%{CNd/:q-2\+!#PD%*hQ%"$"#"DI D,!DBDD`IH D"B,$E.S Ȅ[!"A!z!F"|DZrmIDw˾-ً8Ad63i<{e8Y%驤xp꘴ҬSiVR)BLQR\ ,HYR(B$DHD"4 D$LHp"RE BIbąHA QPD2Qf _"zKiLOdD4\̨qlĘhŏʳi Cj89y{0d:'ȍkpe0FY("VMP.!r #HD!2 E@AdHI "b "!@(!1 " D"QR$(()R XQN"O"^)蹡4Sq9Lh14mm!m7ܳZl3٥+1'i~FH-N#H4N adEȕY K'( a"1 XHJ DHDHPI! !!D DBBd!ABD RH"RFB,$BВQaBj & D,%Sե1F&Dk+pMi~dMFWiҟ[vqoHGdŦY4Lq/K K&$ &+ ( `!R!$BXDHR%B$ "H(iB'LB`V!1JhDiP)p%&d+.2N]dy|Odg_w5Qyftv=X2_Z8GIʨȹ#BS$'"XH aPFB#@Q "B" D!2 R @D QD RB A"I Ah)M" b(VXIKYi4K]b{-6NSv[v^GQ;?l[ֹ^hG/C"{ bd')-L\W "d F%HIBQ#! 2%P. EP "$@V !1 D,P\ M"PY$XI ". xDG$)zD،WV^N2-DcFn[<a!Fdu1a:CW<L#q)- 1Ri ddD$KD&DZBE IPLID$ TB,H) BE &B""DDp!0X%ID!0HPH""СdD(Y"Sd+YItSR̋|[&֡k 3Tl<8;S2so#9=#iOj9IFW&I2Y1+ *"C" . T 0$R A(D @VJ!"D$DPȐ"$ D( SIp)IIJD"$ &F+ě)d1qh@Dc$ &ŎCi|zYlɮ_TֺQ'HFC e6FDXHM P(XD"�$(Ha@bJ$Y@DL "a`YHBb0bZ)iL&K#""h_e5Zʽz87S1Y(36І<S>o!H:N}~˹Q؎гĦRLօd-bIDRb"$BB,0 ўȴL+X d~~l\/J\&]&&QdzPҚB$Qb Yۆxb$0,-1orLUYH9W%"r)\BYk=S1r%2RcrY=&8|c si/qZtXKZC!J4; Awu[YtGD4$(iBL5۝\=BkjMP{x`'~Z^^F5>%bړ^_a|gy/Ii/zؾCE>_B5~ `נM- [Jʌ:fh<Bε#QM,+Fq#”8EAH10S#`AN3P0f AGpba+3)1Aă #)rs xt39]LvS/!B\m'qP3ϗĵA5t5edV֦_r̉tНjV2x+&3ufǿѱ' N9D&mf~ț m%GR#OSl bqRZ ]렦\99,dVJ&>raM$CMQ \SqJ[J%b)s ic@1qJ)SC´x9sЅ^"䊶+D[jei #r1[Sw=,fSiݓL6@Z I2mgO%i6Gki%NzJ__a0>$cAitji@҂p|>ɼ|7RkMa-[4)1Qha#3iXEi2TwQTPTіw(s8 !L \r`8eHe Q(s<;2C xH9Ď*ìA\b1A c:,9DA)D,Β IQiiW1ۑ}>=I%뤵CGiϳFz߹<+c?hF ͸}~.謈Мtm#3wswWO^gWExQ:`]ì`a&? 4YSrz* & <WDBh&X!C80#4**Gs+!$b qL qCAp0B1pB!#1BB^)2<W K,3H,W2HCSE=YWf8 8H@H@|V-)9vm䊨;Y9X =0_ubwrU]Gp3Q>W3w?{W(6wH"4''/~`x '0Z'Oaj\]'%ϧ6`Ves!L^V Х!DaJV;$9!:rK$-ŌtQq5( \<dYsIŔRzIq 5R":"!֠XƵD%jz EK&Ϊur% %ۣeSgԭ%WpjZg_ȟA P7@l\6L GbT `M ~'2Fj M% ˙0LY XBG 4WT)T0 x,;  9aXH(Gd,sp!B@H!80fXb9*B30;LuHC\bZ6Y򋸻Ioь h/=cͮsfٿhͲNfxz:[F͛vQp~^^@' 7K6eg|e6n+}>@,8If 8[4FĔҦЎF2HIRS2qfGb>jsJYky̘Q&!zq8%F (ZQ) T^ Hd tTBc\氄 4V+؎e*bD% TLTo'd>(jX? [l]"^ jzI6?L՛a^_M[얟Ar[lKz[ȶoO\<`J-%=m%WQyXG҉).ď!bH]H_9M!6!&$80^\Jai51&=qn$KQ)0B"*\ż4HIE"c2JJ\Rz.W x23ʲ @h8xoTVyBFQeX[A,/-s-J%q5h:(+> I>'|lmtmZj MKϱ+idZ0ұpyp>M}jm]jfN`4``R|[)n9 1Vu]jCGgyK'k#LB9J# wC9a1gb Lqa8ApD"RSxq<1!9HW9 u&SsǂmTCD41MfYį=-PONpzn\?Qѫ#B>?_ùO^̏Z?DS2~KfL׻ ooԟtU" CnT/7<DDJ G O FPEt]osÄQi$ؐ )$mZ%]|TAH;Jv+{VVz+@~ߞjXRt Rߺ+\)]`X]VӣUʾzNlYiZu"K8ngɌƌFb؄3 B!BH 8'j@ F)03C1A ́@D@0A0Ѓ C"! 8Lr16FjQ$hMRE3G-,X:WrOXuS\W^/ʧ<݂_W[חu窷KggdvCR^ tks(ĤȈl4Fal! d1 C " cF20C02!@@ 1aCD1" b$2!H@ȁhA BDb'% Q80Cel$>B)0=׭ijí^E@E,sqߩxX)!Ga]ΰ}*XjYH(nm5'M%jMԛ47 ƂSahF#P3 C1 C `D1a10@1`F1L0h!8CJQ25ё$f.3.1LTV[R +_Wr8w*|~^U/U<֝Jz^WR茶9-N'w9nZB+&m q3QDlB!Cj 1b @EA % 40f 6 (b0@1AjPB@FB1 #@"ĄA#6Fvȕ jE%tA>)c=K^uSVx.):9Uì9k `Z~KzE¹aNN{:<+v/N-q-- س,Ή)%X(1&4##3Jf#2A df1 `#C fA 1A30a7& 3 F0fab CQ0HQ&$̍4"f(1?NB%R:-\T+aH<WחByhUw=RiJZ*ZUw|*szyQ,b[(GARr^̗F4mI2v PFGFn#1 ! LbA 0hC aa"(ac B0L!1Bb &1Іlhldfdن(PLL6&T?e>gV~ñ}APTr燪z\RRǂGWUuz/@|zX.pU_uVR2r)<"Lp7"R4CcrHfF11D&h A L AC`b 47(3aDc#1l&s223lhI3S2]vO&IӮaDn"PT9H.Qc~ǣES ZRxJZ-,)Jo=OGJǗ]tWSȭ:]i$epm Dƃ" &aL Lc0̂0d"+2Pn0"!ba0A J1L #B0N6Ё(s61!"Q,dMR[&Ȳ!dYǞ)QR *)k)PX.P@_ʮUp\W-J{r]ި_j-xX+aXv:>l>O|#7IZ6q1IaJdf&%2pAbc31CDB & ` C l 04l3F! )d2 PܘNCFL7E4L4#c:CxJq!rⰢ"A^V ^^uu,=;^W)KUyh^ޔjauNH<; u9j[ϻz>By2d'$475 Q!D43 1Af#3(ha1d 0d!a A" JB@60C1 !! H3AG8eFfR2T#IaK5'Gqm+ I1s� f �4GR)F8gXd1L9"w  f X!W)14f# Ub*Z"2#&./.%|Tz -Y7jE<&kIkRI)%?πbl| Yk/zMY.ĥ<@[Nmҷٰ-7EJh_T 8, $aꥹ[64 HB+!cL+$wђA!K chrC"1b(bBHV:$r :0Gx*ؠI`01*FHᄇ<0`Q+1E,( 8Z(h%OBVPL=ҝ5%iH}&EEi+i6ȟ7Df[V6adJ͐?Mo-Ѱ.[%5()7%*iL@- y4B Krb]Ivw :@RAaT+"E: 19D2H8#p !C@ CA fXs@`(1 W0E bDNegYhƝT @ 4kMd"-Eyܖ zMiOlkr[qfV\KNVZjZ}^X iy-i.F٤4-VFPnZM*/hJƞs8_Znb`ƐҍkXWF<JgJ;0Eab^$@ĄPøR:B 3KX(+CpDR*)CBPЍ ,R8DŽiv+4i$ ,cN4bkP- ؃D{ݥwI‱Ӈ섘>m-i/\2.o>jjMZEim'@%6\x<Pn-)&ޛ>`&S}.px 0Si*gG2]DV1O $X!)"hX0H<3P4"`#8u cc4+¨S2BR  9"# HFNhf*PcuD9!bѱq 0&\Z P 5BmwD  p{ti6h%AIi2L֒NE%NJ5eyz/ P7zJ' &L8oɕv/ j Ckal,S0UUPGZEc!Q*T;92 h$9x,8cc @B@@Q`WH0W@CV 3A  3t D+!XSRΜ).RBrݪL!(ˉ J(/klMզM~Űd/K`c�I5%$\ ZdcxG{xyr-%'I.%:m-]wzl= > S{rJ!:ƈYք"Hb* qTB^! RCRaH#8)`q19 pFœQ ( фh4 Y@sCE0!!#9b'Crʼq!E/UqYr _afN=~P{֥m"xm{Rlr&&ǠZ|L..P7^ZIz͠Y$=z'Vm djqe&lkݶ5x.pXP$(kYDzca‰1%kV!#DxwK )E@RB((Wa p$xH2 3sHT)Fc*BZ huT*Shb2S$#YURČXe!EI* z RЗA'TpA=EǷ6,ƮJn& zKjM-xJtMH ͳ^ּ PL|6/Mj}$q DAm%rAux,y k xa"sr)␁x:3)(8d9 ! `BA`E !2¬S, XeDUq*!SC$"9Zq!B -nN !HZ`ܸ|in (ߵ@߀&@4p|\m :%/7O[Ѵ>DKZJlDKlMJN?idz{XJYVJLf8ZF!sC )1,¼3:X!)Fp H#B0F$rp8FPøb+;#1)( H!!r K,u@ǃIxHu$RؤyIW< h\jwqqw{iM $ P>И$H ZI&Ei6G[.%klLn5-7p_zpOcx|dֵJj|/_+ PojH(a,x" )bu-O#CFb;W $ h8bBC+B(T 00ecHFR)K$3 !0B+$b P CSS(; xFi }=IR%v"m%7DLѻ%2SBVɳ&H)FͲ'MP23CSRSBQ9&2pҘj2m%"iMbQG$LEeh%K&%Js+[zk}'}ŝ<]bΎPXv; v#ȶ{PܺϦv]J]o1rTO.,v7ILs!I6̦&hG54)#MP2#$&jnh Ă8fjhM Y63rQ6L7rR(%ē2S8ݓ(V&ȩ&֙䙺Yf'ϣI󳲣R9ɗ?{-ܲ-jN%s<ŒCHr*)g"">vȤTdFE'̍6FM۳Sq MQ&dؐ VRSqhДա6%%3h ffQ"D"$ș+fT$HD4KaJr~Eվ,]e9G!ۧGg"QHaD|R{-]Щ[tYj,Y2ȬR˜tEBcHkmt]Ĩ&n4"$F6#L2"DL7$'6Y ͓fjJɛ$MVؙ2bm ID(8e77'M ۡ$fI4,nGnBȹD+9tYdbY>YHv)gy]1l˽Ys~Zu PScʟ]Eg'bS)$"rt)9E5jOTF)1"j'$h #$FFH!HDnj&HJ؝;"dg52"fП#iVFL7MdJ&j"+t[)VVr;++;9:L.s\tVt9 BStQYsJ.ɲM{vʚM5Ҥ'2i%R4Е)l"Ln!)$jnn%hBBSBRbDsFBa 72EՒM I ZMDsq"ĩIZmI̦8GjKR7GJT锟TwE#!R.v[IeVYoKo +,睝kQ"ٿ_#OYg#eg1FGlVĚ޵E"(FR( (BR5#q!.h!"hDi"$BFFcSq!CJ''f)6LH57Ԋ$#ɩG5mۛD&G$խڥo;TR:t*\ggeEJ|*-x~bsE7|wyK|E!Sݧe+|b(R;*%i6!ĄT#DɓllՑfɑ'#fՑ3"&q(l# rA93q(jnDr(8&䩒mtjD,IK#Ie0O}BTvl" |gGO/ֺO=O<m{$OY].S"vR+*IcrMv&I3IrDq '7jIFLIIMbVJ"IMFq9+42#CRq9)&#vbM hnjA;q)H.LҴi'NIe2ks.k*vo#&T]+,{-S³ϕegCF8@>Z~ة|tV\fr-G0vdEY[VnJJԊդ&5!2RrmIDL9JN%lJ̉ Z ݲ#hJFQ) Lmp(j[4%$ș5hѶ#Mm[$fv*r),ծVivYwoo\9ceEgBQEI=ⷎbXtR{BUS=JSG"!R]Y۴jFTQ$iYDS.F$mZ&ɓ5M FDԜeR�$BRVXcY[>\^_^`acE~Uϝ]@jS3 C8F$2Q 1FcM HPł aQ:L3Cbq*ANR* αC$!d2ȵ1#Y׊5niT{Bص-_&JXH  (qh.tJ}Ѱ_l&+lIro$WWm=pjsmz 6=ƪ`{$Ng,A"9%_1c I; ;8gH;D sRb"@!Q:FqNQ2qp XgA@HbB Hkh!F #0fAZU:Qa!F.8HcИԐ4 4AM?n?TzoT'\^EҖpt~<[ W> L @x }>jdI% a7k8ݖNG0YӄAa<cyXD[D ŐZU+šn"N"(qgEsc(dA3P9NrBPBg)bhBÚ,XF <3HE,f2PT^rT"P1 Bըؼ I (y&Ɛ5ŵPIG?i( "(y$!$p}yF6դ.IZ/Z-`_IEDZ& 8\i4\l?ˏ{ qdAL%SU3vpᆙxT"0(WHĕAWa9"U$Jǂ9 "3☣21 d,* 2DB#D@:´"+‰<)g" 4" SSÆ%dH8 ~ ( U<Aj\K% [^.asm7K/}WȜ/O 0.4ƒ#LFcM`im<4 CjpYPX4ۍz_6!hno RL(Hrƈ$W^d#g,s‰*)A)VЯ)W1!H:Gh!w(1t  HEQ&1qJsBBQH*1Da9%9 )aCFtHacP#,<@FEǡlmZii(=Y`>.to 0, Pv4@4IA4.>J|vdIvx$`- p[(4nOh pI <сeI۝c6&n$NsN,SY2Ra"'D4R3b! IbES(:@@CA^r 123CPsA Hft HaTRrZ2d h!c%J2,d`AxED$W,0 el$` 4@LlZ{4nYڃPߖ?]o]zM 4^o'Z6( p|C[ dap' 'iA% Ne 0/iAO 1}DST<FK1b&, ,D%ARG #d3,+NC9sd$9#NPX,9w Vr)EHŅ,T1JC c,BDR $({3yƄ RN$ 0D4AcZ%hOpI,> OdiрxP=ĉ( J.~ 0 <hKޖ-$885WDIM.-(jcX䰓Q!E$B]fb; K hqZRG)G)Lw!w(00TXbCW H a`B3APfsA9Q iNA)8:܈1"=L?'2ҞRQ}ZT!&%&F uqPޯSO+LD `zKy%)pj%-KjZ-*rxND^8ВNaZ$' m hYACx=j%ګ"eTPC I :Γ(:IAf :C P2qF@CC H@XrGQHR 0⨥qP"F$V"2 "3E4SHe98$̊i^^z?XYJlxP,poͥMh|u*<ɴM˃6ڻ>Ɂ4}\T&{#|&}+m -PJ[p$@xMݦsys7 +0ӒG)tFÉFH:TH4 a,9aH( R"DQqQ (9X XbE*,+Je4#̢9 sHBEi^w)&%֫!DYD<-Yjx= 5MFQ3@�<(li0ȷp^ٲ~vmO@ylo&_M'_+=BlhKp qj]j=D]^L!e<]K;E ,ɂ,de[haᄄi]HF;F<se Xr¼` 8)*XPzTmlkjihtgLfdcbZ�X0d$ P1pb.)5ɫvTGa+[YdIcuE#-.ϿBjT*{:cer?0 gb:>fs<BOQ)>լJݑ)C>pc#8DR[bVPMQ*&jȉ!)7#qnDlH"|F4I&&Dؑ( 4D#jJmvN!馩tK]gZΖxY>tZ)1y#YmŞع+~-;<HS Ύ+E׷~G$s,#;nE"]p4R'7q'"s)"Ѩ2BD'Ą G"8N5ABACH7 ɍM94fNͩ7ٹ.Fl57NH)MȻNGf!veQ'_<Qm#Gު,OSVT[g#qI܃lT*:N}Ct:^G'9kL䝬#97DVh8"'+L#`FP8ӆE7#BfN72Q)456D̛2!!A"Qn;%5mL8%DH)%%MZFg501ZtݼKSdE I/gg/g):IBH\ersȤ;[TR<oo}Yo#wQb,!ITaI9h&J"sTȜIM؅ `FQt'BD2R)HƬMn$dْ̈!cSvFHJM PkGS)RvTS$\NJ"ft+ye{#QBmHHA+:lt1tAYN,veeϺNGD(F)-nn֘zekMAƎ2 &Q;LhJ4%%fԌᝈ$6le2!)"b4'djDj&C#r$d2FJK!;r%7%jI[15KNe1LJD: T^e+[VaSGbsr= N3\²tCY>c+*\'!S8LnӘ"C>2FSrjjRnr'N$ČbQ!2fhɑ71")) "ClJnDT%&ۚ)"%"Dht+;Kc9F.aFxoϢܺ rm!\\F<e,!e>l}NeR#鎕Hc+G1r.Xb~EVXEh&Q5j"Vܖ69L6DHJj͚f57b$"s44&ȍ1!!2B"blEfJJI̐C(I J3+jOm̤&}4.]oXbdZT {Ugn}=gG)+V^"bvyu.\t˷gk91MEc*jҳRnNDQ3eBr'6DԉMni I!3&LHJ͘nQ"bL"1"4'aPB+*4F)MFr"RVVNOȤt|gK,*}*/)LZHYoYqLyU]܃TA-01iN.cvoY CԼ􊓦MIVE2k 3Stȍ3lnĤ !""Fla)3"54Q96FhjLٶ$&ͳDhM(†ZPQQ<MtgDf:};zC' k1ŤԢgV*^#}sT|yU Y_jgc(}g>+:^BtrxADvV]EejjEn&ZD%m єڙI 19cDh1lg 5Bq)lfd6FՉ""6̐NFP˄(P̢s(m[d5یx'S,#cti>TXʰ.y7֡Ծ� Xq"-rDBXI!`AR+q! #A : G`f*r@: BøCx)c9!Ea +hC,#HrU if-N|q 8,һT&Il=oדA{ZפMv&ȹ `(\>=m$ o\ I p{V?Jّ.,T{ L?J4Az٪YY2pAH)sa ,)#91s Q  0DAN1B1PA`RB88V r °R: 0D a\G9J$%I#̗C3*g*QS{{{sy(yB!4Gp_ JH '`؝x7V_"d'lԒ^76Gȴ@OLGغ`^@i@N pyA0-Bqiy۟ 8i Rk%r X hBԫu"{ hSDIPvHVV܀,AJ (h QF0 Q 2`:Kxea8 ÊAq:NvRè)u !hR]3k5U9Ġp.&wu7i/lt_K֓A<j>"�n(.M'Yk-&%ltl I+-d5mI6m}n%֟|r\IL3)]MnMUҖFGvCMGrc*9!R*‹@A!AQ`cAaJ)PDŒPaT $< G,b \*)B"Fq((Gs !t0 Fx`A S)yMhYD3b.0ǹ I\j'd>/Rl$i@ Kn=fH[2:nMY�8A8>OZk^׷FI@j(>N %p'uk .19<<FERs-YR @5G$ddqP)P9Ep< 4HBcA(SSPDa H DQ`ì"c!"E3ADvE f`PH(<)lZ:іꜾ5_Cy\}VI�сz_6x|I@% m6jMI/YHT5-4>Yi?M.Bp.zOV_--67/'./7epl&1iSrZܚsȾxV" 20#2L ;$qa:A`RBCQE(Thf2äQT hg8GB`(AKMBc"#9Ǝ⢎1&G;Jtr8XQg !��������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/silence-44-s.mp3���������������������������������������������������������0000644�0001750�0001750�00000040000�13112005742�020532� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3���� TIT2��� ���Silence�TPE1��� ���piman�jzig�TRCK������02/10�TALB������Quod Libet Test Data�TDRC������2004�TCON��� ���Silence�TIT1��� ���Silence�TLEN������3000�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������d�u�=�@��"`�1 @�?˼N(|rrDO xKإ2Mw3ŕQv. sR܄$dyA�� 0�#����4�`��� ADYa ^O-c7 EbJ!SwukrA%5:=ʹjw0l%RPn@MD] uؕd oA`�� 0������=� ���[[6mes| !)V+ -.Xڤ4ϹR[" !mdj���0�����<� ���=|TVYrK>͎pu1D{-eRa7tfTb)JT*vdkB�@���0����=�`���PTdZOz SGm=F*=)2gK̘Y +ci7bpynd dA@�� `0������0�a����U^!62z)}H:]X7NqUlλcjk)h{ech辅*kTd(jA@�� 0������8 ��{T:TVuw0QlKJ48'ދ}D9<!cW=vEFbJd/z��� 0�����9� ���\E7i*of81CQIxD1,Q,<_/m u,V)JȆݕZkU d6SB�@�� 0������7 ��o*ikP)U1u(1wR+TQԠt뻋<޻ j29N؄[Jd>lB�`��` ������5 ��� صĨ3`:4\ȴ"bY Ӟ"0-d/uҥmguΔB(tndEyA�� 0�#����4� HG*P̿b7xxrmCMMm*̺t A"(BT.?8EdK`�@�� ������: Hm~˩2 NPrYЪ1E叼XRZa饔ƠmV߲-C8غdQz��� @0���P@�8 ���In͠*Y#V$.9sgnF̛?ԺbR\Vko*U(VIi{dXXA@�� `0�����/� ���,`rј MvX*<>YLzJ1ץ/;  ]&up+C dbz��@��@��t���:� ���:D\=XYzSsWN}x^w]!F U̐FY׭$FЁte Q;1F!-UPYoLdgt�A� �����4 ���j6VӔ*{۟8^(rm&^HXRFKA"Դð"j#:* dmv��� 0������2�`��̯ar-Xʱ+84ΕT1XqǸQs醘–ݩKe+ ]S*cRduuA��@ �"����- ���|Au�Oހom61W�Ϩp9 Xѵ9}$KS<Ӹ啇Bd|`��@�� 0������5 iud5'2haµ2$!/&p4  vZc9frdf�@�� �����;`@��M93bRqό]͹(u2"*+bխǘ?C\(tsKըV6']9[h;s=PdqA��  �����.�`��B2ELv<FT!ϩ$%smNwzj ` L$`SqcbdoA�� �#���= ���0F?xņ^aW+5B.cHyV)Bބҩ4U sYz!㏋]ja{ֳ`6pd^A`�� ` �����9�`��pKPlw4i= [qUJ1*rv_\VjE."ذ쐆+ lґn`ddA@�� @ ��@�=�`��ƺ#kQqU)8YкQI4 wUk.M R 5;Y;Rdz���� 0�����; ��� EzQuVTqW9v ^ر}N~HX|\6JyyNg0Udu���� `@������+�!����E5Nb2@m 9HFG.9WlutBihU K֭3N2 1o - #{SdfA���`0����3 ���zǦ^Tk QMI(M@@εxs 4uk=DP~53FW`Tx[<dzA��� 0�����1`���ʣ#AMoc.ʪIKn5P45+8?emלYww1q@$T)q.d\B�`�� 0������;�`��MBp*Pɫ֊iN7*d^D| aҟ(F~h[zQHͭHiy"dǏsA�`��  �����7�`��Ezv*S{^[byU k C'-[VHVQO?UBQQW̉M (7fApbŲ1w Yd͏iA���0������7`���04B4U[d7&?%sْ6|G|1/k{&]i˥)Ghl6>6dgA���  #&��<� ���(krqt))G yN Jlz C)Ňʹ3*79xdrA���@������3 ��h(Uƚ,r ET7_۰}L)!!I;Ifw=p^S _do����0������-�a����mWIn qѭ =gy+0V̪'L9 (ֵHsoZkklh0,T>d��@���#�A���9`���Y̎\fmy$'@WHbFbVyၢڌqel) g jd�����c�B(���G�`@�z'8jF@, ZY&&BrVI킡g?]}vwo:-[<R`dyA��0#8�@�8`��dI*T ؒ@τ(!rP:tTPU[аu~&$>8VJd� ���A`�?� @1i2iy/9q]UB Lː8bF@SX2r˫w~xyd���� ������C�`���wlx:iL)_d(fcSIKi&=A׳mR_|(ed@����B<@?�`@��t ;L&jVy#<Njkߒn_h=V瘦LcZ$Cd}��� #&P)DD`@��R]sq%k֢9KݗE~ A<t֨A䅥/4ZzMK,z2dA���#8@�? ��˽{<l|?hu>3|2mbb6STÙ vm <e(d6>*Ld���� ���B\�@Hx('p( i^ZÝNF 9<o!d}T\e-BdA��` �"�`�A�`@��qA!ր(}y V4<Gt3yM{G׻k+:lg%M&dwA��� #8\�L� @v틨>5 ^A)xf.pnJk*X|ukh}&dj����  �#�P`H`@�?l5=F93/`tIi&4͇aQr__{Pd� � #8A`�4�`�,1{o:+ile.Yn B)VdV2R.y˸^X-sgʿQd�`��A��:`���krFRN;vuHe8C-6*IlxH<+lqL|貔p9rKd@�7#$ �E`@��;}LPF͇ cLcZFVS:Vޛ :4*&⬏m@d@`��� ��C`��.]P iUM2sT0q  i00+&ctdC4dYhQ" d@����B ���G�`��Feڻ̿UU |[,aRmj"l 2<7H[2w2Ċ<uJd@�@ #8���I� @��N*Ne<}^qG_Q./My};(Bs.&Rd~��@�� ��8��N �c]Zx)jm6Dle(At: w)SEt4\95h{uOAQ !dmA��� #8h��H� @ :IgނYY;* }ܶlIr.;Ww{F=/ =MCdA���  #$ ���I� @��eG&/j7 (ʚ_](y9 b(.hRS⡋ k>,FXjqPldA��� 0���T��J� @��&Tִw&igE2l]Hkuu%ԉ45Լx,Yd����` �"����F� @�NJ(ʞPmUF@*vJC7wl;x`v'.X"eg81d@�"8��D @���.o&Sdɭ"+]"'סyh ...lP)C>AXSjHtXd��A�#&B$���F�`@�!aκ^Y%ϵC([uB7kCb]Ej)Zy iA&=*+isOd~����� ���D����I� @��R<6N-/ۀ;,?'jYMʃBBŦ^OJViMdA�0���\�J� �qnat9B QzU .*4Ir9<uof~ub+<ɔC-);Od~A��@0����?`��HB\)KmUE m \XcU)RJbQ"\(<:>X(Y_ed���` �� @�E� s-^8ysK!qVd:@(BR)`7,s8Caf%&\M ҙd����@��c�B$���<`���R[O*Y+T9<�v)iWj+nyuk1朗k8;,kv}?9_ldA��� ���$���E r>Ol]ڹ~ *zXA׵.JE񖔧LBjԊm,L> G{zM37d}�@�� ��p`M�`�"o㯘wș6sz}ۈ Kf( SIsݼ`vlYA&P]UE.d���`#&��@ ��mF m|MmQ7R;A-EkDEڻ5[tjwShCbI8_BdA��� ���B @�D`@�s+;)3gӭD o\kxFaeE`PjtikFiJr hqqZUdA������P`J @\t-{onAŚ[Zzw])SL"0_:y?RƤpo%owxRid�� ���(@�@ ���;o-)dy2U zBfQ ԲH׹'Զ0,fG6R̙TTR7d@�� ��BD��H @��9 0vPW6ANufm( r-x5ZuY#nʽ̎b@dA�@�� `���8�L�`@��၃d�bD-|r$$XJP-Yȓ29>IT7bkȏ)J:ud�@��@��$���I� ��jA/._Z0XY\J5*ck qΕk73}MUߺǨQ X duA�� ���A@�H`@�=k!g\/d,fg19ԭ <H,!y!vp"v1bInMsw>׿td������"�B @�H @�/Mc2G~M Pj]4iu`pAPB]1/75A�R%Qހ<xUdpA�� @�p@L`� pv8b*ӲyÈ NCOϣRc;ooAԤ}8sg^Xj_dA��� �#�`�?�`@��#i2Vt2KڅYas$Aık9ʠ)g/0wG_5ta c6d�@#�B$`�F�`@�U!.=j]| w8[e)l^lIDpUUrӣ+Uѭ35e)r76<d���� "���E� @��yOm?۟wMwYP*w\Bv1BRPT pe\(ME{AZϩd*d}����@���B<���H@hO05ZT*koSu�(9E o˭&{aً9MOoȻed����� ���H��L @�޻?EP r/ hSc' :v)S6ruo ȊВP@FF]ιH@5d@�� ���(��F� ��6*1X)P `:cj 4yuB ,6dOPTmOMd����"B ���E RZ5Iy Ϥ ru 4"+B$vAJ'O -a]DlXmwaN89fLd�� ��A`�:� ���cѡqd:s+[7`N˿/g/MXg;! * ldP8Yd@h�"8��E�`�ަ8XAC�,"= ^f\ܙ܌BqN!wDS/spㅫ/!>ǰSmdxA��� ���<@�> @ߛȂg~ԗul~Vd?d|V*d4\2|W$ad����B8�I� v|ԑV5A\v ډ׋eTdJKO<VJ~䇿JdA��� ���8���E ���>MA¬G^̟^dcz1KH=xH ^%PY0.Th`<x#~ ʬ wd@�����B `�B� ���o#gio1?UsOG_K脓̊&X+_6)HuKF<> 6xadA���`0�����8� ��EpjDJ < kJ5#nSd)[G; aT1F_6><rǐWd@"�B���F ���8Der*8jCC;!n6XU2RRͦda+(ymJXd��@��� ���Ah���F`@��0˘wXՖ IЂR*Z֔t}jLTJP([ <7+!At ʡ4d� �"B,��J�`@��UKXZd#al%w>͸8{㥍WK2OP6A ), 5Kd���� 0���H��J @DYH,츹p -$=4`|v OuI$6J_zQ}_є_[dy�A���D`K� @QozV:ySԀ]N�Ǐ̋r9IiVMM}=Ġ23[ޔS?d��� ���4`�>`���:wyIM6M ($ P{A* y1h) 6)1yKRdA����b�T��C� @���l ClU;onTF;E=oRt[h8"1dyA��  ���T+�dG @���.|ݯخ"s>oQ%?w<)bU6R{,!<ar1dd}����`#@�B� ��;z{W,˽Xj6c; ^tK3``Jzd=tBd����"�B(`�G�`��ʐuo]%K;Ao5q<ػ zPH|.( @˄"hvCQ=PDj96鈅SJ 4da���  �c�h`E�`� �k�k.¨�jݖ2f̨m|$X󘁲u]u67KbЙ +d��#8B ��G`eOs눷 HRaxRG/cVAlaf w(5ک+d@������A`�6� ���]^gY y)9GrpD.K_r\au3y55=5d :d��� #&BD`�G` \7yFU_-8NF~kڴu[*nL^2ݫ8ddk�@��`0���T���E`@c=Xҁy.)"o9*Su(YH!5>,8{!:Uф"c|*"H.Qdw��@��@�� � J �W*D>ռU oCZѬسEiQ<c;Y̱U׶%�^jXՌd�����$���=� ��\3[^mB#*,Q8ni&.IcƲ>@y9\9B&ٛK{Nq]hd@��`�b�B���J`��GC:2RI`<sh 2,hᅡYk/Pv,1U:HMA])FdA���� "8p�L� @0qQ8f6pHbCTV_? myK O/-?H:4B1dz��  ��p� `N� ���sCI;( ?B$@O&5unk5KX~r>P|n+d��� `0#8�`R�IՏ3VU6jȵĝ p)]?Ic*1CMEqH$:V'J[rd���` #���3`���I4+%/ ^JS#I %R$B.1uH +h7=P^uW"d@�c�B����A ��x5kS'AV(ߗ]<~]fa X"Qt"2ˤLy7DjZd��� #&D��H`@ z CΤ"l~E}q֒^&qqg̵=2!Q؅ ݨ}\dK<dzA���`�����? ���YmW|t2[b#/|д;yN&ZƢUE7*yd@��#8B8`G`�RR8,0bW " @m7c F:=mK=iRWyv֛`ĩXb")dw���� 0��t�`N`�=2�(~Pw3iS:Qz (vmaFZ|V.5kC%RQ$ʪIdvA��� �#�`�J`�Rmqr>V*Ċ5 7 ikE,r+eg/8aeadwA��0���l��P`�Æ"*IŨx4,y:lNEwxʂ+I TXĐ48P9U9N�ᨹQ!zndA��� ��`�J�`@�2TcX޻}S?9Jf8&} ox}R.qkq[\Ķ:=Id����"A|���E�`��v] *]fpJ`fS: T4X*kEXǙ,2^J hMV&o.d@X�#$B(���A 1Wo\%F>9kXŬjPa0Je"�vr d5  SadA��� �����B`@��AI* " |L(<rMUp %9ڐ<y)B*UCR?ʊ0˕ `EId��� �#� @@F� @�Ih&+-צ+iVTHR�^5KH~/-O>͓ %c*d����` ���8��B�`@��� 5ٗybr_p~ vE&:ئcRyIs*/6DbQ4=>Ӏ'duA��� #8 ���I� ��,c$1* )NW*Pj*Kc 44۳P]ԕ 8eq d @  ���A���D @ƥvîqz+ 6:28 Et[̪[(ڑO>.l8CY$d@��#����F� @iԏ,RUe1ޞ4}|-#%{Ot<;|TVs !d���� ���$���D� ��@gAoJsYAj.8C U ,"]bFmx]ʏ2fw-uNrdd���� ��4@�9�`���{6kM_q^jtsϱ:0qi|gMMI)kTɢjX}AXQ5z;R8]Id�����c�BT��J`���1MM<ZܥaC(q�3DsɸIav06ƙ0oJ9ᵇކp$@'di����C�d��L ���&D?{jzmTװ{s6A*"=jMN-J(VI+mds����0@�h!BG`@�[ ͂jZ dNx= nKc_g09ׂDrK0SPdA��� ���A���:� @֊ G%\Q .pe䞖T>HM 6ܣfOwo @h=ad@�#�A`�G`@��`'`DISa1Kw{z ÚbId]^7gzo G m *d@��"P`H �WRAw%LAME3.93LAME3.93d��@��(��>�`��dA�����B ���C�`��dlA�`�� ���,`�C�`@�d@#�A���D`��d@�`�"8A@�9 �d���#�B����A�પd��i������ �����������4���TAGSilence�����������������������piman�������������������������Quod Libet Test Data����������2004�����������������������������quodlibet-3.9.1/tests/data/silence-44-s.ogg���������������������������������������������������������0000644�0001750�0001750�00000017136�13112005465�020627� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������>1n����@vorbis����D������ɯ������OggS����������>1n���*־Cvorbis���Xiph.Org libVorbis I 20030909���)���rating:quodlibet@lists.sacredchao.net=0.0���album=Quod Libet Test Data ���title=Silence ���artist=piman ���artist=jzig ���genre=Silence ���date=2004���tracknumber=02/10vorbis"BCV��� R!%BJc)RR)%cJhs9'A1.bkiRV!%S [hRT)cRJhs9FsB'c.b[Ic1&SJ(c1cPJ%tBG%t9c1"[ŞJ魅[JR*Td!|F[Jc1cdˁАU����@BCV� ��0EQАU�@��Eqq$G,BCV�@����(#9dIi'뺮n۶m۶ � ��4TD!����db@h*�� ��@$'IRa,&IRʣ<IƠRJ)RJ)RJa,GIRJb,FIRʣ<IƞRJ)RJ)Rʂ<iIנRJr4hɦRJDRJ)RJ)R|J)R՞\I)ROJ)RJ)RJ)RF ����F9D33MAR4{%Int9ݜr'��� B )B )B 1ĐCN9TPI%UTQeeYfeYfeYguYH!ZhXc椭9J餔RJ)t9!����! 2(B 1SNA%T@h*���@���(鈎舎舎xx(g院i*˶lۺ۾۶nqqqqqC ����B!B )S9J ������(8H$Yeiiy'zz(h{gzz隮꺮몮*k۶m۶m۶m۶m۶-!�� ��ɑIqɑ$ 4d� � ��EQq$ǒ,IDɴTdOtQu 4d��� ������C4DCtDKDQEQEQEQEQEQEQEQEQEQEQEQEQEQ<<<BCV���:#9b)")c9@h*�@�@��"9eYyy'(j@h*���@������XHx舒((((((((((((((���(GJA{xZ;bsgI˵tB(-טyǘsB bwJ9H5B��0H i i�������Hhh�������(������������������������������������������������������������������� y""�������h �������()������������������������������������������������������������������� i""�������h x �������(ij����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������p�� Y� ������������������������������������������������������������������������������ ��`� 2PhȊ� N�8��$i��8i��`i(�i���������������������������������������������������������������� ��`� 2PhJ� �,e4 i�x@����4%(4d%��`P˲,σi(B4Mi'43Ex&<L( DQU��8��ؠ)8@!+��Xy牢i*4DQM4Uy(i M<QETUׅy(iDQ4MTUuy(EQ4MTUue i꺮 DQ4MSU]W(i20ETUueY2@UUueY+ PUu]Ym�뺲,����*ф @!+(��S0&!$B&J RR(TJ !Rj)eJ) B)T��؁�؁PhJ� � D)cLBc9!T1眓P2sI)c9礔9sRJǜs9)s9眔RJsNJ)%A'9��T��`#A�R� cYig$iy(fYy'<OD4Uy(i*=Q4MSuU,zh0MQ4MUu]虦.d4Uu]n躲 \UU]W몪ڲ���VG8) ,4d%��@cR !BJ)R ��p��0 "���TRJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)QJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJRJ)RJ)RJRJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)�F8�>P Y ���(bb9)-X!sR-g1)XcΘsJI\J礴s9QJ)sΥbK))Xk9Zs9j9sls9[5�0� lXh,А�@H��aR1s:(d1 B1會B1B!R2sB!TJ眃B!PJsB!JIB!B)A!JIB!B B!PB%RR!B!RJJ%B!RJJRJ(!PJ*)PB!PJ*)RJ!B)TR !B(��� :ɨM�� �@xAI1"!娵b1c<$sRkhH1jS!ŤՎɔrTC)2dILXB#M����L�Q1��A U DD�hut1 t.  � p7x< @GQR����`��� \FGH������@"DDD3Waq�� �����@@@����� ���@@OggS�z�����>1n���OQ*-+++*,***+++,+++-+++*,***+++,+++-+++*,***+++,+++-+++*,***+++,+++-+++*,***+++,+'ؽۉ �20�=ܰ=����DD�����������˂�~lXӞ? n����@H���������e 2@B%=XӞ? ���� D���������THX0H,�=XӞ? n����@D���������@BE =ܰ=����DD���������@ e=ܰ=����@���������B2�=XӞ? n����@$$��������� E, ap%$�=ܰ=����H���������D `@P�=XӞ? ���� "��������� `b=ܰ=����@DD���������@"R@ =X^? 6���� I$���������H"0�=ܰ=����HD$���������B@ʠ=ܰ=����D"���������ʀ"�=ܰ=����$��������� AA�=ܰ=����D���������pU=XӞ? n����@D" ���������`@d@=ܰ~l����@""���������AeAPp~lXӞ? n����@H���������e 2@B%=XӞ? ���� D���������THX0H,�=XӞ? n����@D���������@BE =ܰ=����DD���������@ e=ܰ=����@���������B2�=XӞ? n����@$$��������� E, ap%$�=ܰ=����H���������D `@P�=XӞ? ���� "��������� `b=ܰ=����@DD���������@"R@ =X^? 6���� I$���������H"0�=ܰ=����HD$���������B@ʠ=ܰ=����D"���������ʀ"�=ܰ=����$��������� AA�=ܰ=����D���������pU=XӞ? n����@D" ���������`@d@=ܰ~l����@""���������AeAPp~lXӞ? n����@H���������e 2@B%=XӞ? ���� D���������THX0H,�=XӞ? n����@D���������@BE =ܰ=����DD���������@ e=ܰ=����@���������B2�=XӞ? n����@$$��������� E, ap%$�=ܰ=����H���������D `@P�=XӞ? ���� "��������� `b=ܰ=����@DD���������@"R@ =X^? 6���� I$���������H"0�=ܰ=����HD$���������B@ʠ=ܰ=����D"���������ʀ"�=ܰ=����$��������� AA�=ܰ=����D���������pU=XӞ? n����@D" ���������`@d@=ܰ~l����@""���������AeAPp~lXӞ? n����@H���������e 2@B%=XӞ? ���� D���������THX0H,�=XӞ? n����@D���������@BE =ܰ=����DD���������@ e=ܰ=����@���������B2�=XӞ? n����@$$��������� E, ap%$�=ܰ=����H���������D `@P�=XӞ? ���� "��������� `b=ܰ=����@DD���������@"R@ =X^? 6���� I$���������H"0�=ܰ=����HD$���������B@ʠ=ܰ=����D"���������ʀ"�=ܰ=����$��������� AA�=ܰ=����D���������pU=XӞ? n����@D" ���������`@d@=ܰ~l����@""���������AeAPp~lXӞ? n����@H���������e 2@B%=XӞ? ���� D���������THX0H,�=XӞ? n����@D���������@BE =ܰ=����DD���������@ e=ܰ=����@���������B2�=XӞ? n����@$$��������� E, ap%$�=ܰ=����H���������D `@P�=XӞ? ���� "��������� `b=ܰ=����@DD���������@"R@ =X^? 6���� I$���������H"0�=ܰ=����HD$���������B@ʠ=ܰ=����D"���������ʀ"�=ܰ=����$��������� AA�=ܰ=����D���������pU[ܰ[���������������@�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/silence-44-s.spx���������������������������������������������������������0000644�0001750�0001750�00000057556�13112005742�020675� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������'����ǑrPSpeex 1.1.12�����������������P���D��������������������������������OggS����������'���0���Encoded with Speex 1.1.12������album=Quod Libet Test Data ���artist=piman ���artist=jzig ���title=Silence ���date=2004 ���genre=Silence���tracknumber=02/10OggS��n������'���+-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]tN��mC�_mm/mmmmUՅ]]]]XUՅ]]]]\ֵtNkmE_mm�/mmomUՅ]]]]XUՅ]]]]\ֵtN��mW�_mm/mmܡm%UՅ]]]]XUՅ]]]]\ֵtNFS_mm�/mmwUՅ]]]]XUՅ]]]]\ֵtNq�m`3_?%/mm�mmUՅ]]]]XUՅ]]]]\ֵtNa�m}�_mmcmҵ0?omUՅ]]]]XUՅ]]]]\ֵtN<m�_mm/mmmUՅ]]]]XUՅ]]]]\ֵtN�mP_mm@/mmhUՅ]]]]XUՅ]]]]\ֵtN(խa_'@mmUՅ]]]]XUՅ]]]]\ֵtN�m}�_mmثtbmmUՅ]]]]XUՅ]]]]\ֵtN(mmB_jȯmmsmUՅ]]]]XUՅ]]]]\ֵtN@�ma_o/mm[AmUՅ]]]]XUՅ]]]]\ֵtN�mn�_mm/mmUՅ]]]]XUՅ]]]]\ֵtN_"mt"_jVm mmUՅ]]]]XUՅ]]]]\ֵtN,�mj�_mm/mmo5UՅ]]]]XUՅ]]]]\ֵtN�m^c_m@/mm(m[mUՅ]]]]XUՅ]]]]\ֵtN_Dg,_mUՅ]]]]XUՅ]]]]\ֵtNpm]_m/mg8տoUՅ]]]]XUՅ]]]]\ֵtNZ�md#_m/mm#mUՅ]]]]XUՅ]]]]\ֵtND+^�_mm+ m`mmUՅ]]]]XUՅ]]]]\ֵtN;�mk_mmٯmO#omUՅ]]]]XUՅ]]]]\ֵtN.�m~#_'mfmUՅ]]]]XUՅ]]]]\ֵtNPj�_mm�/mmrWڵ5UՅ]]]]XUՅ]]]]\ֵtN/ƀ_mm@/mm۠mmUՅ]]]]XUՅ]]]]\ֵtNt�mx�_mm/mmUՅ]]]]XUՅ]]]]\ֵtN1�mk_mm/mmѠmmUՅ]]]]XUՅ]]]]\ֵtN[�m@_[m/mmڎmUՅ]]]]XUՅ]]]]\ֵtNmFmR_mm/mmޔmUՅ]]]]XUՅ]]]]\ֵtN'�mW"_mm@/mmmUՅ]]]]XUՅ]]]]\ֵtNFm#_m/mmUՅ]]]]XUՅ]]]]\ֵtNC�mu_mm/mmXmmUՅ]]]]XUՅ]]]]\ֵtNm\�_mm@/mmmmUՅ]]]]XUՅ]]]]\ֵtNrp�_mm/mmmmUՅ]]]]XUՅ]]]]\ֵtNcmOʀ_mmm@mmUՅ]]]]XUՅ]]]]\ֵtN5�m_mmA/mРmmUՅ]]]]XUՅ]]]]\ֵtN8�mu_/mmLmmUՅ]]]]XUՅ]]]]\ֵtNz�mR_o@/mm�mmUՅ]]]]XUՅ]]]]\ֵtNPc�mU_�/mumUՅ]]]]XUՅ]]]]\ֵtN �j�_mmfm$OhUՅ]]]]XUՅ]]]]\ֵtNY�mV_m/mmߋoUՅ]]]]XUՅ]]]]\ֵtN�mp_mm˯mkmUՅ]]]]XUՅ]]]]\ֵtN(mU�_mm/mm�mmUՅ]]]]XUՅ]]]]\ֵtNq:kH�_mm/mmܠmmUՅ]]]]XUՅ]]]]\ֵtNp�mI_lm/mm mmUՅ]]]]XUՅ]]]]\ֵtNZ�mq_?m'/mmcomUՅ]]]]XUՅ]]]]\ֵOggS��������'���B-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]tNH�mi#_@/mm`mmUՅ]]]]XUՅ]]]]\ֵtNP^ԿZQS_mgpmUՅ]]]]XUՅ]]]]\ֵtN1�ma_ikAUՅ]]]]XUՅ]]]]\ֵtN_oڵ@/mm mmUՅ]]]]XUՅ]]]]\ֵtNH�mv_mm@/mmҞlmUՅ]]]]XUՅ]]]]\ֵtN��mc_oow�/mހmmUՅ]]]]XUՅ]]]]\ֵtNK�mr__mۅmmmmUՅ]]]]XUՅ]]]]\ֵtNk�mj_mm�/mmmmUՅ]]]]XUՅ]]]]\ֵtNp_mm�/mm`mmUՅ]]]]XUՅ]]]]\ֵtNbI#_m/ٱWmmUՅ]]]]XUՅ]]]]\ֵtN+.O�_mmu/m mmUՅ]]]]XUՅ]]]]\ֵtN7�ms_mm@/mmԎ%[mUՅ]]]]XUՅ]]]]\ֵtNԛ_mo@/mm`mmUՅ]]]]XUՅ]]]]\ֵtNfηz_mm/mmޠmmUՅ]]]]XUՅ]]]]\ֵtN{_[m/dm mmUՅ]]]]XUՅ]]]]\ֵtN_�mb�_mm mmkmUՅ]]]]XUՅ]]]]\ֵtNE�mT_mjҿmJmmUՅ]]]]XUՅ]]]]\ֵtNsFs_mm/_mUՅ]]]]XUՅ]]]]\ֵtN*ԿR_mm"mm×UՅ]]]]XUՅ]]]]\ֵtN�mp_z'YmӬ5oUՅ]]]]XUՅ]]]]\ֵtN=�mq�_mm/mm߀mmUՅ]]]]XUՅ]]]]\ֵtNwmE_mm/mӭmmUՅ]]]]XUՅ]]]]\ֵtN<Xֶo_mkmUՅ]]]]XUՅ]]]]\ֵtN0jx_oѬ[텝UՅ]]]]XUՅ]]]]\ֵtN>�mo_mom:mUՅ]]]]XUՅ]]]]\ֵtNP`Կm~_omoUՅ]]]]XUՅ]]]]\ֵtN�m[�_mm@/mmmmUՅ]]]]XUՅ]]]]\ֵtNfη]�_mm2/m|Ӄ'UՅ]]]]XUՅ]]]]\ֵtN'�mq_mm@/mm٠mmUՅ]]]]XUՅ]]]]\ֵtNmX+_m[m�/mm@mmUՅ]]]]XUՅ]]]]\ֵtNb�m~�_mm/mmҗ[mmUՅ]]]]XUՅ]]]]\ֵtN�m[�_mm/mm�mmUՅ]]]]XUՅ]]]]\ֵtN �mZ_F/mm`mmUՅ]]]]XUՅ]]]]\ֵtNT,v_@/mm܀mmUՅ]]]]XUՅ]]]]\ֵtNtFO_mmmmUՅ]]]]XUՅ]]]]\ֵtN8οmp_ummUՅ]]]]XUՅ]]]]\ֵtN&_mm/mmmmUՅ]]]]XUՅ]]]]\ֵtNmOO_mm@/mm�mmUՅ]]]]XUՅ]]]]\ֵtN3mՐ3_m/mm`mmUՅ]]]]XUՅ]]]]\ֵtNl�mJ_m[m/mmՏUՅ]]]]XUՅ]]]]\ֵtNQ�m}�_mm�/mm[mmUՅ]]]]XUՅ]]]]\ֵtN�mo_mm`mmUՅ]]]]XUՅ]]]]\ֵtNJTӶS_ml @/mڀmmUՅ]]]]XUՅ]]]]\ֵtN~�mw_mmMmmmUՅ]]]]XUՅ]]]]\ֵtN2UI�_mm/mm,[m[mUՅ]]]]XUՅ]]]]\ֵOggS��O�����'���r&:-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]tN mp#_mo/mm׳mmUՅ]]]]XUՅ]]]]\ֵtNB�mv�_mm/}WmmUՅ]]]]XUՅ]]]]\ֵtN'Կmp_m�/mm۠mmUՅ]]]]XUՅ]]]]\ֵtNpm~Vmm/mm@mmUՅ]]]]XUՅ]]]]\ֵtNP�mn�_mmCdmmmUՅ]]]]XUՅ]]]]\ֵtN7�mq�_mmomխmmUՅ]]]]XUՅ]]]]\ֵtN:Կ{�_mmѠmmUՅ]]]]XUՅ]]]]\ֵtNP\�moO_m3UՅ]]]]XUՅ]]]]\ֵtNvF؀_mm/kMmmUՅ]]]]XUՅ]]]]\ֵtN=Xm_mmݠmmUՅ]]]]XUՅ]]]]\ֵtN$�mi�_mm/mmѠomUՅ]]]]XUՅ]]]]\ֵtN/ _mmGm mmUՅ]]]]XUՅ]]]]\ֵtNv�mh�_mmomUՅ]]]]XUՅ]]]]\ֵtN*�mz_o/mmmmUՅ]]]]XUՅ]]]]\ֵtNh�mx?_m/mm mmUՅ]]]]XUՅ]]]]\ֵtNc�mJ_m[mg/ZmmUՅ]]]]XUՅ]]]]\ֵtNNmq_/UՅ]]]]XUՅ]]]]\ֵtNq�md_mm@/mm mmUՅ]]]]XUՅ]]]]\ֵtNukR_M�mmUՅ]]]]XUՅ]]]]\ֵtNk�ms_o/mm mmUՅ]]]]XUՅ]]]]\ֵtN{Կ_mm0/m[ mPmmUՅ]]]]XUՅ]]]]\ֵtN1�mn�_mm/mmї[mUՅ]]]]XUՅ]]]]\ֵtNFm[_/mlmUՅ]]]]XUՅ]]]]\ֵtN'�my_o@/mmPUՅ]]]]XUՅ]]]]\ֵtNrFKX_mm/mmm5UՅ]]]]XUՅ]]]]\ֵtN�mQ�_mmu/m;ͿmۅUՅ]]]]XUՅ]]]]\ֵtNԿmN�_mm/mmݠmmUՅ]]]]XUՅ]]]]\ֵtN �mE_lo�/mm׈mmUՅ]]]]XUՅ]]]]\ֵtNymi_?/ym֐oUUՅ]]]]XUՅ]]]]\ֵtNƿӚ�_mmٯNmUՅ]]]]XUՅ]]]]\ֵtN8 dg�_mmm٠mmUՅ]]]]XUՅ]]]]\ֵtNP9ԿO_mmj[mUՅ]]]]XUՅ]]]]\ֵtNyƿ|�_mm@/mm@mUՅ]]]]XUՅ]]]]\ֵtNNً_mm/mmڨo4mUՅ]]]]XUՅ]]]]\ֵtNfJE_mmkm۠mmUՅ]]]]XUՅ]]]]\ֵtNR�m~_2[mٯmkm@mmUՅ]]]]XUՅ]]]]\ֵtN@�mu�_mm/mm_mڵUՅ]]]]XUՅ]]]]\ֵtNu>ˀ_mm/mmmmUՅ]]]]XUՅ]]]]\ֵtN�m@_mmͯmdmmUՅ]]]]XUՅ]]]]\ֵtNC�mj"_m/mm mmUՅ]]]]XUՅ]]]]\ֵtNl�mzH_mmmmUՅ]]]]XUՅ]]]]\ֵtNG�m\#_m/mmmmUՅ]]]]XUՅ]]]]\ֵtN&οm�_mm�/mmmmUՅ]]]]XUՅ]]]]\ֵtN9mkN~_mmUՅ]]]]XUՅ]]]]\ֵtNs�mn_omڗ/RmmUՅ]]]]XUՅ]]]]\ֵOggS�������'���ț-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]tN=�mr_mmm+sUՅ]]]]XUՅ]]]]\ֵtN/�mm�_mm/mmmڵUՅ]]]]XUՅ]]]]\ֵtN�_mm/mmzmmUՅ]]]]XUՅ]]]]\ֵtN)�me*_ڴmM mmUՅ]]]]XUՅ]]]]\ֵtN#�mg_mm@/mm7mUՅ]]]]XUՅ]]]]\ֵtN2Կm_oڗm@/mm]UՅ]]]]XUՅ]]]]\ֵtNԿmQ_m)m`mmUՅ]]]]XUՅ]]]]\ֵtN=d_mm/mmo[mUՅ]]]]XUՅ]]]]\ֵtN"�mTc_mmQ@mmUՅ]]]]XUՅ]]]]\ֵtNb�mx_m_G/m`mmUՅ]]]]XUՅ]]]]\ֵtNJ�ms�_mmHmm!տUՅ]]]]XUՅ]]]]\ֵtN�m_�_mm/mmoڕUՅ]]]]XUՅ]]]]\ֵtNF][_m/mmvmUՅ]]]]XUՅ]]]]\ֵtNP�moj_m@/mmHUՅ]]]]XUՅ]]]]\ֵtNI o#_/mmCUՅ]]]]XUՅ]]]]\ֵtNzԿ^_/UՅ]]]]XUՅ]]]]\ֵtN�mX�_mm�/mmߠmmUՅ]]]]XUՅ]]]]\ֵtN.�mI_vm@/mm׿o7mUՅ]]]]XUՅ]]]]\ֵtN �Y�_mm@/mmޗ?UՅ]]]]XUՅ]]]]\ֵtNƿmH_mm}/mmmmUՅ]]]]XUՅ]]]]\ֵtN �mx,_oo:/mӠmmUՅ]]]]XUՅ]]]]\ֵtNC�mh_mmCZHmmUՅ]]]]XUՅ]]]]\ֵtN5ֶm_6m!/Ƿm͝UՅ]]]]XUՅ]]]]\ֵtN9�T�_mm@/mm mmUՅ]]]]XUՅ]]]]\ֵtNo�m@\%@/mm#oUՅ]]]]XUՅ]]]]\ֵtNj�mn�_mmׯmmѠmmUՅ]]]]XUՅ]]]]\ֵtN5�m}_mQm mmUՅ]]]]XUՅ]]]]\ֵtN`_mm/mm�mmUՅ]]]]XUՅ]]]]\ֵtNxI_mm!/momUՅ]]]]XUՅ]]]]\ֵtNW_mmٯmmmmUՅ]]]]XUՅ]]]]\ֵtNBԿO_o5@/mm֠mmUՅ]]]]XUՅ]]]]\ֵtNu6V�_mm@/mm'mUՅ]]]]XUՅ]]]]\ֵtN#㏀_mm�/mm�mmUՅ]]]]XUՅ]]]]\ֵtNi�mR_mm:@mmUՅ]]]]XUՅ]]]]\ֵtN:VB_mۯp WmUՅ]]]]XUՅ]]]]\ֵtN@ֿ_m�/mm,mUՅ]]]]XUՅ]]]]\ֵtN&6_Vm/mmܐUՅ]]]]XUՅ]]]]\ֵtNPX�m\_j呯hUՅ]]]]XUՅ]]]]\ֵtNdοV�_mm/mm`mmUՅ]]]]XUՅ]]]]\ֵtN_m H_/mm݀mmUՅ]]]]XUՅ]]]]\ֵtN|Os m|S_6m@/mmڗmmUՅ]]]]XUՅ]]]]\ֵtNP�ml_Q[mK`[mUՅ]]]]XUՅ]]]]\ֵtN�m\�_mm/mmmmUՅ]]]]XUՅ]]]]\ֵtNwmOʀ_mm/mm`mmUՅ]]]]XUՅ]]]]\ֵtNs�mE_mm@/mmmUՅ]]]]XUՅ]]]]\ֵOggS��0�����'���m,-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]tN�mh_mm/ҶmmUՅ]]]]XUՅ]]]]\ֵtN>�mz~_o@/mmUՅ]]]]XUՅ]]]]\ֵtND,_m/mlmmUՅ]]]]XUՅ]]]]\ֵtN%F#_/mmԀmmUՅ]]]]XUՅ]]]]\ֵtNS�mI_/mmmUՅ]]]]XUՅ]]]]\ֵtNL�m{_mmkm-@ mmUՅ]]]]XUՅ]]]]\ֵtN�ma_mm@/mmҗ[mmUՅ]]]]XUՅ]]]]\ֵtN,~܀_mm@/mmmmUՅ]]]]XUՅ]]]]\ֵtNcoƀ_mm/mmzomUՅ]]]]XUՅ]]]]\ֵtNm�ma_mm/mUՅ]]]]XUՅ]]]]\ֵtN8�mp�_mm/mmހmmUՅ]]]]XUՅ]]]]\ֵtN|mY#_mڵ1mmUՅ]]]]XUՅ]]]]\ֵtNgfZ_jbگmmUՅ]]]]XUՅ]]]]\ֵtN�m~,_/mmmmUՅ]]]]XUՅ]]]]\ֵtNgS_mo*ȯmmUՅ]]]]XUՅ]]]]\ֵtNE�mx�_mmQ/խa?mUՅ]]]]XUՅ]]]]\ֵtN'�mi�_mm/mmܗmmUՅ]]]]XUՅ]]]]\ֵtN�mO�_mm/mm@mmUՅ]]]]XUՅ]]]]\ֵtNmO,_om/ZUՅ]]]]XUՅ]]]]\ֵtNX�mu�_mmmHooUՅ]]]]XUՅ]]]]\ֵtNO_m`mmUՅ]]]]XUՅ]]]]\ֵtNgO[_joA+mmUՅ]]]]XUՅ]]]]\ֵtN(ԿmH_mm@/mmmmUՅ]]]]XUՅ]]]]\ֵtN �mT_멿m`mmUՅ]]]]XUՅ]]]]\ֵtNBm�_mm@/mmmmUՅ]]]]XUՅ]]]]\ֵtN}GVmm/mmڨmvmUՅ]]]]XUՅ]]]]\ֵtNj�mU_mmm`mmUՅ]]]]XUՅ]]]]\ֵtN"�mh_mm/mmW[omUՅ]]]]XUՅ]]]]\ֵtNFm �_mm/VmmUՅ]]]]XUՅ]]]]\ֵtNMX�_mm/mmmmUՅ]]]]XUՅ]]]]\ֵtNr�mu_mڵ/mmUՅ]]]]XUՅ]]]]\ֵtN)mx_mm/mmUՅ]]]]XUՅ]]]]\ֵtN�mb�_mm/Ӣm%UՅ]]]]XUՅ]]]]\ֵtNƿVƣ_/mmڀmmUՅ]]]]XUՅ]]]]\ֵtN|�mc_om/moUՅ]]]]XUՅ]]]]\ֵtNJm_mmѯmmmUՅ]]]]XUՅ]]]]\ֵtNCƿcE_mmζommUՅ]]]]XUՅ]]]]\ֵtN.�ms_m/mmڠmmUՅ]]]]XUՅ]]]]\ֵtNaܿ γ_oo5�/mmԀmmUՅ]]]]XUՅ]]]]\ֵtNI�m�_mm/mm?mmUՅ]]]]XUՅ]]]]\ֵtN<m՞_mm)m mڏmUՅ]]]]XUՅ]]]]\ֵtNNX`S_mڴٯ-ٿ@mmUՅ]]]]XUՅ]]]]\ֵtNW_mQp mmUՅ]]]]XUՅ]]]]\ֵtNdF_mmf/ ڵUՅ]]]]XUՅ]]]]\ֵtN~mb_n�/mm׀mmUՅ]]]]XUՅ]]]]\ֵOggS�z�����'���F]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]tNZ�mH_mMmk�mmUՅ]]]]XUՅ]]]]\ֵtNucG[m/m܀mmUՅ]]]]XUՅ]]]]\ֵtNP6NӶmK_mmqf[jVڵUՅ]]]]XUՅ]]]]\ֵtN�mf�_mm�/mm@mmUՅ]]]]XUՅ]]]]\ֵtNI�mw_mm�/mm`mmUՅ]]]]XUՅ]]]]\ֵtNR�m}�_mm@/mmԠmmUՅ]]]]XUՅ]]]]\ֵtN6?F_mm<mmݨmmUՅ]]]]XUՅ]]]]\ֵtN�mV_mm?/mJmmUՅ]]]]XUՅ]]]]\ֵtN.mmӄ_mmUՅ]]]]XUՅ]]]]\ֵtN �mR_om`mmUՅ]]]]XUՅ]]]]\ֵtNc�mk�_mmïmKmimUՅ]]]]XUՅ]]]]\ֵtN�mU_mm/mmo7UՅ]]]]XUՅ]]]]\ֵtN�mQ_mm/mm mmUՅ]]]]XUՅ]]]]\ֵtNz,_m@/mm@mmUՅ]]]]XUՅ]]]]\ֵtNU�mH_m[o/mm`mmUՅ]]]]XUՅ]]]]\ֵtNkF|�_mm/mmI}UՅ]]]]XUՅ]]]]\ֵtN%6m`_mm@/mm@mmUՅ]]]]XUՅ]]]]\ֵtNe6mk@_mmmRXoUՅ]]]]XUՅ]]]]\ֵtN,�ml_w[o&/@mmUՅ]]]]XUՅ]]]]\ֵtN-ԿmX�_mm/mmmUՅ]]]]XUՅ]]]]\ֵtNZ�mt?_m/mV@mmUՅ]]]]XUՅ]]]]\ֵtN(mh�_mm�/mmߨoڕmUՅ]]]]XUՅ]]]]\ֵtN 6M_mm�/mmܠmmUՅ]]]]XUՅ]]]]\ֵtN֚J�_mm/mm mmUՅ]]]]XUՅ]]]]\ֵtNk�mK_V糯m�mmUՅ]]]]XUՅ]]]]\ֵtNRa_mm/mmڗ]mUՅ]]]]XUՅ]]]]\ֵtN"mKj_`mmUՅ]]]]XUՅ]]]]\ֵtNBp_ůmm۫mmUՅ]]]]XUՅ]]]]\ֵtN[�mo_mm/mmmmUՅ]]]]XUՅ]]]]\ֵtNh�m@_mm@/mm`mmUՅ]]]]XUՅ]]]]\ֵ��������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.vgm�����������������������������������������������������������������0000644�0001750�0001750�00000005105�13112005742�017503� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Vgm A ��P��6�����M �����������<��� �� u����� �����������R(�R(R(R(R(R(R"�R'�R+R01S04R17S11R2RS21R4PS4TR50S5PR64S6PR8RS81R90S9RR:XS:RR<0S<QR=1S=0R>4S>0R@S@RA,SARBSBRDSDRESERFSFRHSHRI"SIRJSJRLSLRMSMRNSNRPRSPRQSQRRRSRRRTRSTRUSURRVSVRRXSSXRYSYSRZSZSR\SS\R]S]SR^S^SR`S`�Ra SaRb�SbRdSd�ReSeRf�SfRh�Sh�RiSi�Rj Sj�Rl�Sl�RmSm�Rn Sn�RpSp�RqSqRr�SrRtSt�RuSuRv�SvRx�Sx�Ry Sy�Rz�Sz�R|�S|�R}S}�R~�S~�RSRSRSRSR?SRSRSRSRSRSR/SRSR�S�R�S�R�S�R�S�R�S�R�S�R�S�R�S�R�S�R�S�R�S�R�S�R2S+RS2R*S+RSRSRS-R�R�R�R�R�R�R<SRS<R,S<RSRS@RSR(R(R(R(R(�R(R@S@RDSDRHSHRLSLRASARESERISIRMSMRBSBRFSFRJSJRNSNR+�R(�R(R(R(R(R(RR05R8rR4TR<FRPRXRTR\R`Rh RdRl Rp�Rx Rt�R| RRRRR@#RHRDRLRR(�R#R-R(OPPPPPP�PPPPPRtR15R9rR5TrR=FRQrRYRUrR]RaRi qReRm rRq�Ry rRu�R} RrRRrRRA#qRIRErRMRrR(rR"rRR(rRqR25R:rrR6TR>FrRRRZRVrR^RbrRj RfqRn Rr�Rz rRv�R~ rRRrRRRB#rRJRFqRNRrR(rR#rR/R(rS<qS01S8RrS4PS<0rSPRSXSrSTRS\SrS`Sh�qSdSl�SprSx�StrS|�SrSSrSS@qSHSDrSLSrR(rS#rS-R(tS<S11S9RrS5PS=0rSQRSYSrSURS]SrSaSi�qSeSm�rSqSy�rSuS}�SrSSrSSAqSIrSESMrSR(uS*SR(tS<S21rS:RS6PrS>0SRRSZSrSVRS^SqSbSj�rSfSn�rSrSz�rSvS~�rSSqSSrSBSJrSFSNrSR(tS#SrR(aR(�rR#rRR(rR(rR#R-qR(rR(rR#RrR(aR(�rR*rRR(rR(rR#RqR(rR(rR*RrR(rR(qS#rS-R(rR(rS*rSR(qR(rS#rSR(aR(�rR+rR-R(rR(rR*qRR(rR(rR+rR/R(rR(tS#SrR(R(uS+S-qR(R(uS*SrR(aR(uR(tR(a R(�rR*rRR(rR(rR$R<qR(rR(rR*RrR(rR(qS#SrR(rR(rS+S-rR(qR(rS*SrR(aR(uR(tR(a R(�rR+rRR(rR(rR*qRR(rR(rR+rRR(rR(tS*SrR(R(uS+SqR(R(uS+S-rR(aU PPqPaPPrPaPbPbPaPPaPbPPrPaPbPbPaPPaPbbPPrPaPbPbPrPPaPbPPrPaPbPbPaPPrPaPaPPqPaPbPbPaPPaPbPPrPaPbPbPaPPaPbPPrPaR(�rR(uR(rR(qR(rR(rPaPbPaPPaPbbPPrPaPbPbPuPPrPaPaPPrPaPbPbPaPPaPbPPrPaPbPbPaPPaPbPPrPaPbPbPaPPaPbPPrPaPbPbPaPPrPaPaPPrPaPbPbPrPPaPPrPaPbPbPaPPaPPrPaPbPbPaPPaPPrPaPbPbPafGd3 ������C�h�a�o�s� �E�m�e�r�a�l�d�����S�o�n�i�c� �t�h�e� �H�e�d�g�e�h�o�g���0000000000000��S�e�g�a� �M�e�g�a� �D�r�i�v�e���00000000��M�a�s�a�t�o� �N�a�k�a�m�u�r�a���-NQgckN��1�9�9�1���-�D�J�S�W�-������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/empty.xm�����������������������������������������������������������������0000644�0001750�0001750�00000030544�13112005465�017524� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Extended Module: test song�����������rst's SoundTracker ����������}����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������2��arrive.wav��������������(�����������������������������������������������������������������������������������������������������@����������������������������������������������� ���������������������������������������������������������������������������������.���������@�arrive.wav������������v�+�b]j,=CYG/ym%�U �&�pA.B< u4U�>�0B+�bENuA3�{2:'� 3�Y*Q?QG*�X4Y�kfXxv{AEu�7L2kj��i�y#d^GB])O���o� �IF1i?�V�5-"}2IK)�&�Id�hK\�toPU�NWD����[=@j_gn�lR�H@ ~ 4�?g)����n��LJv\WI�Q �L0��f�g |QSm$"Pc�yP:f ~6*  2nSi �3t4�D�V��R� I{lSbf�f�/�E�|���+i+)�RA��E�KY!A�)Kp+^��m.�1;v,Z+�j~��6E�@QN�/ s�"Y��-Vy7�dk~/<O$��� 3�&��"�B/XHvKkE!-�.�b:�, "dx$QME��y+\�p�D_]u�&\U |�o 28*?�� ��C�"6� �M� �)����@�96|��Nyc���PAKY:3,F�8myq8Ld/Z#Tp�]�Dv/��]�]_}�=a^s���((�%�J/Zb�[sK*&J"�AR �OI���;76�X&M9|�+��_h�*k3�}x1}�AB@i;n>��/�+:�lFo���y�Q;a[�rYy! ��`�N vZ��lM�,�?%rb1�L9vd�4�!�Y_PM5w �7/�nADb�<7'L�5Gv>tG l�~9b�������D�a?�e�t�n�_�]���m+c:�p7y*�R�%�8pU�O$u��(`W/4QN�+gCx*8g��;a* TdZJFMbZ��J ;C�U! A0<;* sB�oM{t�`�gHKLQ"t,x����q��;gKt�PY���h�g�T@�yK2"'�TZemD{^?y�O�_H3`@��/�u��rIH%&�*2*R!f|6�)ITaWNQ��|$ )Yz][oYXS*��<sqWA:Q3c�v��Q1�>��L��?)�vJ  &#6m0�0+ rAj7"�\�ya_������k��_s�R !c��"�L��hPA U�&<RL�7i���U<�w�#� #;'%@3��5e Ov1>`�K.F|g9"DJ- �Z986B �V�a���n�x#n�2@8�Z�y��M^�'�Ow 5���d�e��ucO|O�>ydA[q�b2�����~��p@moee)����Y�Wbg$c-.,`2, |f7;(wyH�U o*���l0�e�fFe���=I��T>JUsB�FcbN��\%@)~FD�#���9~(uK%I��Ce !%�FnN1EE? W*?�<  { �6S�l(s�ZN'Q<d = b�j#.%}VEZf�Vx2T'?:s|FS ]$�G ][�jd-zX3@U�� su0(AG lxb�ln-%_gK~G4�;]D5gY,�<Irw/:C���2�D�+s9v"G^�GXtD /WEBVA]�{�a�� q":�gg�p�m��@R�(k)iJ|1�� 3\z`h�@(>5p����c�[��]-�3Q{s�?��Hax?5.;*�K][z�M.b\Zx6L��#�]�s�&�}�nk�o�a�y��V�BM]rN5�����#i��!G# 3K"���]�|k����t'#Lto6W�K8a[%LlC 8u� m}<��Kk��97-�X�E�!��O��6N�W���F�P��[C$-Npco>��|Z_wx0kEar� �%�|��K�lV}7&-\yx:�z�6�9O�'�<[m|PI6b&�3sG8dU*>&t�cy�0�^~y�t1j$_�t�<e�?T]����� �����A3t�i7kj6gdB0(jM�BXhw�x�R:0lx��i mJ���Mmqs �k����9�e{tN(�������\�9p:8�p4m�WF�:K[�Of+`9Wm1_~ YC� V0d}�EGg�+3J&�o(4hY��.b�C]3��xJB-)Rw�me\{�w�W��3�C;9j"�<D]-dR��B@�\�MQ+X�A Z�D8y�Zi�1a/G�SMB4=W*r~79Rz�#fXhaL a�9s,.� f~cZ�t�Q�[<30��"���x)YM�� <I9��%�oU�%�faa�GfD�"��;i}~FE~w"$]�#.iMG7��z���7p�z�%�L+G����@Y+�u- hfb'�/�u6Xr�A^])O�2rb�^%1.A:����]�1�� ����X0xckm�+��u4Y�A�-��O5Z7�e;}/��VHGj>G3WC��0P'a`&7NK+D:1�y<U2_) ���X�f^!��{8��<��.bkdet:��eD��ZdJ }>�$5R�0��&7 �TM��'�e�W%-T`��rQxVJ�+(~!� �v(^1�v �J���k����U�iUEwbmU6��03#-��:��ym�XJV)��s�I#w= fzo,I�uZF*3* 2HP3`�.B-S;qG2V}sp_����dE�t>?@w�D[�1h2��~�)� �3�I�U�e�}���[�9n |b`{Np5�SZ)d�!�7��GB{hDT�Zjyb����k�)zwFJL�k���9]h\9�g��C��9\�CLv�A�[Ac:@kI�!AqufWMB(P������"<LX]S1���(>A��!? |�TC;OCxO�,Z[����gvA1�s� �S"?vo Q ttV<l����S� � �r�ZBv� �=8~��ZV�3jc�����K� Z 4\&NddP8*9rf�c#).5�X���S��\/,8o�?�j@�����<S:7)(�Z�m�]�2�~V��%uM��m�<�� ��~��[~)�d��A��mmX�uqhfHpw3@3?��?&�|�9�K��/d ���\�'�iWc~��P2}biL]+�G�&�PP-^D�&gn@�A��=�O� �Wt �C�U�K�/�5!hs$BPb\ �]�y�n�Z�U�x��'pCC�tVr�V���08�2J��1Z,�8$\L�-H[iiS+��9)B,v������ HN�=�8L0E(�r v'V ��Nk�;���q� /z}Cm�^�Lm���%�N�|������|�����������y�;�:;.>1�+�)(+^K�2w*�f��*��y! $�@xP"�"�]=<_v}TB�j�I�Z?e�>t5�?�?R�Z h`�L�"��.��i?D4q(| �K��)G{ #C��B�1�����6N=�j����Q�\#/lJ'�����sz)��S B����&>]�4��a&ZC;f�u,��Oc�~�*��I��V>r�?L8s �R���s�%�z[t,���-,'#�z�WmvnZ s�}-^����T��+��u&j��Js]s"����R�H}�%���p���m�"�?��� ��c�,�Ap/a��Q�%� ��$�a����Z�v;#o1ttHT��$/RFc�� Lc�-� �7�>��3[K�t�k�3�,&*�tlt�<5�;~o �O�3�7�N�t���Dz�3giP;wAN��!ThmpyvV+#v{#?2�2n%�w���;�i 2�v����i�!�� -R�� .[�������/��I��=I�)lOE\4���6�H<}�"K��lio�� ���!�Hw*�@�-���Q��cKWR !2��=�!�3�T�S��du9*B]�Km�/_2sh]�r�@�J���1|4�\%hSV;/2gp= go���{�<��G~c�x_�.���)4S<��&2<WJp~m ��=>?T*5, {p}m~�$T���/�H.���?g�K�z<>(�����]0Nd5�U�W�Y�r���@kd2��}����"���������T�%FJ@P <2'��� Jxo%�.�X=n}�ia�/�U,X?,�T�~���/c~iL8:Po{>�q�N%Q?$K[8H�LOr�P���.�QWqa*(2@�#����#�2�(���m��1UA��<��r��S+)�`�b��VH~r[XUV0Y���%% �\4o =�Y���� �/^=bD���_=�~�������OG*����� Qg=��,3 ���r�f�b�i�v������5|C�,�ldQ>7nD@7N��EX������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/test.mp2�����������������������������������������������������������������0000644�0001750�0001750�00000015620�13112005742�017413� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������h�ϥΧwm�c浰c[EZvlbt873mrֶN34>E~Vu,[i.V %`WFbɐsM ێ(ծޓvo~1<e~֜��$I3~x~8ߍ4ԕ eCYMۣt2$7\ 0M#[96Ge7XMy\Od֗Nx$GvM豭4v{Z ��H"7}~ӓHӾd[mmSX+Q5MiC &d)*pcRQkeqriiPҵ|ƕ"67KvG^؀־kZ>7oZkZtɕ>d jgs_-�I3~:}獕SU>AS R#Euc5i8PՃ)v&p!K-P1sT҉$zK$GܻYvs#cFpgⵌaaf n״g+^:si5t��57~8~ jD�%ܭJˇ@ _$$G|Sĵ86re(؝D( VnKjvZ\CkMk4kZmz䇗$ִI"3]ߞ7z+FikIh:{olr|٭WܷT3 gI-k]Te vrd- ~G4#T&Ff9Ѥ^7Cq!iaLvSZU��I�5v~8,xUmjnk`:ajڭu*Wń_4$N%oV*-é,N*ն.mbh,S)XiXw;N(Ui [pi$ml5Mb@���I3}}ے'%u(Ǽl6@o26ͥff͍_aƝ`#ZҌr[vئ"`|`\ʾ.t5uCc΢? hTtӃf65SudF孺Y#j6Ş�� I3}wwj4KZ6$^9 ̛u6ڋ+D 5cak0ݭZV-LUWqh}j%]ᣍelL9l=TX[aX"5G ZR|w۫bp#T�� ㎰. Mg!pZRұ׀;:jD*/A00|6΃uhMuˀSr&!r5%hDHSJԜ.Չl`A`޽:@d5`p-TG��$I3~7]:q fG`І8Uh0y#V5NmE4I]U"u,4vU!ik[6ucR-UhGN6lרRm7ڽ%&ۆLgص��I"3n8~7},k\3QȤ9eT1y[ rwB36{):C(X 3TF۶$#ZF  8<+2䵜>Ѷ qMjT^wv&�I3} 3M24LC+M[m6`㹮i8fRaشg Z־G!`5h4R Fͭ"y@x,˵<pѤA-Ypq ca"dCf'" [g$3mߍߝGy<:C%nQtڍ7&U lA\xo2grfmx[@BED|Sg%Ӻ;٢pD)W%jEt}X=gJs+MM`¹jN4k6f]4$H3~6TFVrbe\h7ѤޛX%x65lA  6E)/,5Ь4M#+~M+T5l֒ #REp$kojh n?3*MԕP��H"nyiB٦Ky+ev;+<ufօ1S',ke5bwPyʱ1N~"-l\\5+ij5P)NAkZ&Fc"M6f$30-hƶ3aCP oW(� I3mߎ9l#!:9 W.mӸHsMj6iE|Z`fK+�#dz4е6t4]#M.2!wńkyɞ $x"" t2֬H"n3~ߍ߭ȪZŝb gkkYȷNj<Qv*Bȁk4 冚37gi# +>&J,!F<r3TPIhmja 5hR5 -飘P��͸~8|xh^0[ |#X]y?s7vè|JY&5I앓LWSlkhRm/QIԃȥMzӿ<UC!\GQ鍢i5l3-0hIbYzmxǯ��I"3~9~7sY,mSMNkI9jaNk I�2 mHc 16F6wp2[vulEză@Z$*+qAxykZAIkjM[<UP�3y<}l?QsIm8ME <LcIF"d?&E,G"tnL6SZˌs=/}qԀ6;><kHv< ĭ*9i*wCA H"3}n7߮,Em ʂ MlWJk5M#ƞm*4He9%uUSrZEB^T0Rp I;ksI dDmlV CrhYQ}YzI3ߎ7‑~:tu6%V,#B `Tl;F>9k@8iH1U3~/[(2RY F]2ncz9Ş_krm[Tͧ |@�$I߭~7㊟mb6k1ZP{HU$*RAt3-3Zܐ'VDԄ skX,R !Vl,SJE܍൛Rs') U34T浣~59lV ���"3n㈝vf4 UN1D,Uk'15LkFlrK+ZB:|%sd8ꮼ0T] ”ES>3jvtqtobv9:f@\ b]]Ia`��Q3}ߎߍL^7a:GܡDkKOWf#n6nNzm\ز$x[ys *N\eT*NffO}S kDIIQ"|T%aGI"ߍߎ8܄ )yF�:Yk,Ģedqk[PV lcQݚӷ ξ fI Hwcf'&ki0 yxI>-XHv;@I"m~wrd71MڧD!,<m[XRsI3]<ыm%qZv B�+An Fޘ50KHaojT[.YuZ-jۧx[[h\dn3~:~7'd dY\&(%MHZ0ח8yԭU[K+!Q)4# M.]17tZ|˫)x3.)kWL`R@P\2|J$}m�$3nwu2lzW戮9F"O wI/ͭLx\/[̱d44@R$Q0<~Jyƴԏزo A],tF T��$3m}߈wjxE4ɴq_8m-, F}P9hݪ.>|>u6 e8n)-s-ZsU h³\&Զ427Q(jƨ޺͋4Dgk[A኏僚Ui8 ���J7~8۝;𷙅`OMPг))a9]LEEK/H xلRc@&U{mcWMdImE#tɵh$JkH *o,0{v��I3۝ێ7I-%Na )v$a.Ў YS�.kW$QlJuIIVOj䥗51RpF;SXt<F6C���I"j3}ߎ8r'F횖^+ ٬ht.en[dٖiH1ɖX̩TUVNUjkZR|cMp ʭ̚ k"46h'9QQ5JM}�3w㍷bgxBr5>ikw."on-K#HMlJIbN=#)* 2󋻃g*^T{"{Âēe1-S[MracOL9$hKòz�"i3n7~/K75С.7HR=KZFQ,JG m{+#v4$uRZL۾k-=8˧M<M ,"s)Q&Fr>e4_{w(�[WfI.387>0NeiMsS)"6›HYN+Dʈy/2W37!M:q*H76T!Dm`2 ֕-U5<J"AnyQ ^v<ژ5`!υj��$H3~8䃃6%~5k73j�97}jV*$j%evFdF+ m7ҺcBl ݽBeR6Cls"ֵw$q{ Ͷ~9ߎRiZe-u;c5ji"[bv%.df3v8؇qWx`8R#Vf]_ _@o{m-M kG)W6gQ*IhM.dD|���Iwn8BݴY֬Es V V W J>SF3b73mgcMlg'%z\'q[C!C&) a% OأqlBK9쐄.n<ѽm!@��3}ߍםلe6ʝ9M%cf}IèK$[-hK8AZ \VăS©њ%f p5i]-a>"<GVBA;fִlҴ$Q39ۊg釘Zne F&B1' i?b7,YO.6v|R)6_(n6reڐ[~5rel ᵮdCĎ2ZG5:mw ٤yw�$H3~9ێ30>kHǪcbTuiIZX䪲E[M6#'YJrۏ0/hӒ[xx}lƜ[H|7%iělkH 4glSB#)d&8 I3ߎw9~7I0n~nFs<": R)f=@詩Cpۂ*VB%NynsQiK%L-5aե $s0gf 5jbMIHX<]rP���"3}ߎ~xn 5"\Yjΐ?lV#\ՑNBZ6b{!6rN6X\%I,o8$9[[ll jȒ--BkDžDkxTRG4I3 J*QRs#FNSy#!¹kZj =*k:`D$ 5hMxm\8|Wƨo^Կ'fM4[S*9䪻l;la7w!k1]x1@>ō�I~88oBl.`˚VU׏4c,Kmp#[X+y.x4 ! e$4vYhAf)jw0h 1٬f0ś{Sg;qbMk/ՑSf:�םlWyMLxhPTԚKX>CWH2Y0Ajs5hR 8k&$j$"ID۱W6i䗌'M,ҽL6(=IݑiI^#6Me �� I37^9w[o�)*ms,Gm}l2L*[P.0aN MUvԍ/5B<fV瑰ᖡ nP>g=͙*^B 3'${~vy2]&Rܐ�����������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/data/silence-44-s.flac��������������������������������������������������������0000644�0001750�0001750�00000143330�13111762705�020762� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������fLaC���"���y�+ B�zbܷH2ĺJ�� ���reference libFLAC 1.1.0 20030126������album=Quod Libet Test Data ���artist=piman ���artist=jzig ���genre=Silence���tracknumber=02/10 ���date=2004 ���title=Silence��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Y�k?O?s???????9>?3y?̟>?O????ϟy??ϟ??'<3??O>I??Ny||??�C3'?????????????g|????s?|g?yg????|ϟ???'?'????9????sϟ>?'Oy?4uYl??93??>?ϟ?y3???O?y?????9?93???<<3O???<9ϓ???9?~O??g?~?ϞNO'�Cɟϓsϟ9?g'??|?ϙ?'?3|?'?????<????d????g???ϟ???>yϟ?g?9?<??~?9?I???ϟ?|??Ye?3??>|?gg??>|~s<?3s???''<~???O<??~Og????~yy?????g??O?9??g?ϙ?y???>y?|?�Cs|??N̟?3g???>sg?L??3O?3y???>3ϟ?'33?~||g???O?|g<??6Yb???s~y<??O?ϟ?ϟ?g?????ϟ ?s?s??<?g???|g$3?f?真?�Cy~Iϟ?'?'O<<?'&?O3>g~gg?ϟ?g>sϓ9?L><??g??<~?<?'3??g?XYw??gϟ?|?s??y??2g<s??|>g???????ɟ??s<g?<'?s|y>>|<??3g??ygys?s~~?????$s???y?g<???O3?y??3'??ϟ9?????9?O4Yp9???3s<'?????~<'?yy????g??ϟ????9?O?ɟ??>?9???3?? ?s|???93???????<O?fss??>?~g??'g???~g???3g?3??ϟ??s Yy???s?9ϟϟ9<?|???9??|>~Ϝ?yg?3???f3>??''???|?'????$??'>'?'9??9?9|y'|??|@O?<|??>3s??&~3???????<~r'??s~???'???s3ϟ??ϙ?9?|'?N<??Y~???O??'<?????O???9?????|''~?y???3>????s?????9??93<?|??ϒ?9?@?????3OI????O???&s????ϟy~'?<???<?O?~??<???<?|<3????gYS3y9?'?93??>?ϟ?y3???O?y????????<<3O???<9ϓ???9?~O??�Cg?<3'?9gy?s?~'?y??9y>?>O???3?9?y|'s?<9O?Ϟ|9?~?g?3???zY T?y??<>yIg9<3??>|?gg??>|~s<?3s???''<~?dϟy3?~Og????~yy?????g??O?9??g???~?3????|??'???O???>?'???f??'O>?>s3<?L??3O???s???ɟ???y<????y?9g??s<=Y ]&gO??|ys??g9?>~gO?~???<?<???y?ϟ?????3????9&9I93?g9>?|g<??y~Iϟ?'?'O<<?'&?O3>g~gg??ϟ?>sϓ9?L><??g??<~?<?'&Y Z???y??r??gϟ?|?s??y??2g<s????y??~?'??????ɟ??s<g?<'$9'?󟟟'|???>~?9~y?yO?g?'O<s's????O̓?$??9~?>???|||9??=Y O33y?99ϟy???3s<'?????~<'s???????g??ϟ????9?O?ɟ??>?9??'??'?y??y??9??39gsϟ'??|?ssO<3'??3???yϟd~?yϟ??3???~??O@1Y H?'?????>Ny?<N??~?Oys3?3ϟg???>s?>9?ssy|~???9?s'???~O9????'??|ϟ?|?II?D<<O?<|??>3s??&~3???9??<~r'??s~???'???s3ϟ??ϙ?9*YA???|'???3?sO?s???????9>??s????9<'??$?????ϟy??ϟ??'<3@?????~?|9>s~?9ϟϟs??????3?g?'?????9?????g>s|~|???~sO3kYF?g9?<???~g?<?'y??g?s>|y?>3?'g?OO??3??ϓs?>g?y???'??|<3????gyϟ?|'Oɟϓsϟ9?g'??|?ϙ?'?3|?'???ϟsO'gL?Oy????ϟ???>yϟ?g?9?<??~˛Y???>O??|y??<>yIg9<3??>|?gg??>|~s<?3s??ϟ?'??????dϟy3?~Og????~yy?????g??O?~?g?3??????s|??N̟?3g?'O>?>s3<9?s~??$3y???>3ϟ?'3Y'y3?~<gO??|ys??g9?>~gO?~???<?<??g?????ϟ?????3????9&9@|g9<'?3g???O?3O???'>?<?~?O??ϟgy9??>|?3ϓ?9??>L??93?<?ssY?$3?f?真?O<?y9ss<?<?????̙|?<??d?<????O?<?gOg~?>???'??s?�C~?<?'3??g?ϟN???????f????g?????$s???y?~?93>y?ϟ????$?<??y??Y'?s|y>??9?f~?????'~????'|?'3yy>??ϟ??><?3<'y<~>g?>3|>|?????|???|?fg???|?ssO<?y?g???ϟ|9?OOs??<?Y??ɟ??>?9???3????s?9ϟϟ9<?|???9??|>~?|ϟϟ~'?3??g?<~O???|?'????$??'???<<O?<|??>332g>????9??<~r'??s~???'???sY�?|?II???|'???3?sO?s???????'O??>?s????9<'??$?????ϟy?93ϟ??ϙ?9?|'?N<???????3OI????O???3?g?'|?yO9ϟy~'?<???<?O?~??<?VHY ?????9??93<?|??ϒ?9??瓞|3|?3'??3~ϟϟ?y3???O?y?????9?93???O?~>O?D|~|???~sO3?33O9>?s?9???r??s~rs?rs??'|?'?????<????d????g<>|?Y?9?~|<?g??3?<???'Oϟ????'??ϟL??|???|??~g>|?>s$??????3>I????s~~~~s?|9?~?g?3??????s|???>?'???f??'O>?>s3<9?s~??$3y???>i Y#'~yy?????g??O?9??g?ϙ?y???>y?|?9O|?????????>?'?<>?~?ϟ????'??O@3ϟ?'33?~||g???O?|g<??y~Iϟ?'?'O??3?y?|rg?|?ϟ?>sϓ9?L|Y$33??ɟy??????y??r??gϟ?|?s~s?9?>~y&>|?O??~|?y??~?'??????ɟ??<?ss|?O|9'?󟟟'|???>~?9~y?yO?g??~???O?<??s's????O̓?$??9~?>NY-?s<g?<'?s|y>??9?f~??y332?'????'|?'3yy>?y??3'??ϟ9?????9?ϟ???ϟ?'?ϟ?<O?393???????<O?fss???gs'???>pY*???ϟ?rg&|??Or<?Ϟ?39?g>>??Oys3?3ϟg???>s?>9?ssyOϟ|?????|ϟ??>O9?s?|??O????9??~<?3?????????9???̙ϟ<y~|???>O39???gg3Y?9???ϟ????39???9?????<?9???????9>?3y?̟>?Oϟs???'???s3ϟ??ϙ?9?|'?N<???????3Oϟs??????3?g?'|?yO9ϟy~'?<???<?O?:xY8???>????3?>s9O̜??'?3~gO?y9?'?9??3~ϟ???O?s?g?sLy?????<|@y?'??9??y?y9?????39??<g?<3'?9gy?sg'??>gO?3??9?y|'s?<9SY1??~>O?9?~|<?g??3?<???'Oϟ????'??9ϟ??ϟ|??~g>|?>s$??????3>I??�C>?9ɟϟ??y?yϟ'??>?~?3????|0|??N̟?3g???>sg?L??3O???s???Y6'??s??|ϟ<gy??|ys??ϟ?????~?????ɟ???y<????y?9g??s?ɜy|??'s??~Iϟ?'?'O<<?'&?O3>g~gg?ϟ?g3??>OY ?Oy????d3??ɟy??????y??r??gϟ????|3?~s?9?>~y&>|?O??~|?y??~?'???@?9??>L??93?<?ss|?O|9'?󟟟'|???>~?9~y?<~g???~???O?<??s's????O̓?$??9~TY!9???Oϟg'?~?9'?sg??9~g??9??s 9?f~?????'~?~y??????�C?>???|||9???'??'?y??y??9?|>|?????|???|?fg????????9>3'??3???yY"<?g??ϟ????9?O?ɟ??>?9???3????sϟ??'|sgg3|ϟϟ~'?3??g?<~O???|?�Bg??'g???~g???3g?3??ϟ??s???????????????ϟ?|ɟ??<?y?y#��jUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTUU*UUUtTUWҪUU]UUURUUU]UU]RꪪuҪWUUUUU]UUUUWUUUUUUwUUtUUjUUUUtUUrҪuUUUUUUURUUUT]UU\uUʾUWʪUUUUrꪪUU]U)URRUUUUU%UTUUUUUWUUUUU*.UUUUVUU]UjUUUU]U*UU*UW*uUU]URUW]UTUUUJUU]jU*U.ꪪUU]UUUUP��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/�����������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�016373� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_test_plugins.py���������������������������������������������������0000644�0001750�0001750�00000000742�13112005742�022531� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests.plugin import PluginTestCase class TTestPlugins(PluginTestCase): def test_pickle(self): plugin = self.plugins["pickle_test"].cls instance = plugin() instance.enabled() instance.disabled() ������������������������������quodlibet-3.9.1/tests/plugin/test_html.py�����������������������������������������������������������0000644�0001750�0001750�00000002302�13112005742�020747� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from senf import fsnative from tests.plugin import PluginTestCase from quodlibet import config from quodlibet.formats import AudioFile SONGS = [ AudioFile({ "title": "one", "artist": "piman", "~filename": fsnative(u"/dev/null"), }), AudioFile({ "title": u"\xf6\xe4\xfc", "~filename": fsnative(u"/dev/zero"), }), AudioFile({ "title": "three", "artist": "boris", "~filename": fsnative(u"/bin/ls"), }), ] for song in SONGS: song.sanitize() class THTMLExport(PluginTestCase): def setUp(self): config.init() self.mod = self.modules["Export to HTML"] self.to_html = self.mod.to_html def test_empty_export(self): text = self.to_html([]) self.failUnless("<html" in text) def test_export(self): text = self.to_html(SONGS) self.failUnless(u"\xf6\xe4\xfc" in text) def tearDown(self): config.quit() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_seekbar.py��������������������������������������������������������0000644�0001750�0001750�00000001201�13112005742�021414� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from tests.plugin import PluginTestCase from quodlibet.player.nullbe import NullPlayer from quodlibet.library import SongLibrary class TSeekBar(PluginTestCase): def setUp(self): self.mod = self.modules["SeekBar"] def tearDown(self): del self.mod def test_create(self): SeekBar = self.mod.SeekBar SeekBar(NullPlayer(), SongLibrary()).destroy() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_mediaserver.py����������������������������������������������������0000644�0001750�0001750�00000004133�13112005742�022315� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from gi.repository import Gtk try: import dbus except ImportError: dbus = None from tests import skipUnless from tests.plugin import PluginTestCase, init_fake_app, destroy_fake_app from quodlibet import config @skipUnless(dbus, "no python-dbus") class TMediaServer(PluginTestCase): def setUp(self): config.init() init_fake_app() self.plugin = self.plugins["mediaserver"].cls self.m = self.plugin() self.m.enabled() self._replies = [] self._args = { "reply_handler": self._reply, "error_handler": self._error } def tearDown(self): bus = dbus.SessionBus() self.failUnless( bus.name_has_owner("org.gnome.UPnP.MediaServer2.QuodLibet")) self.m.disabled() self.failIf( bus.name_has_owner("org.gnome.UPnP.MediaServer2.QuodLibet")) del self.m destroy_fake_app() config.quit() def _reply(self, *args): self._replies.append(args) def _error(self, *args): self.failIf(args) def _wait(self): while not self._replies: Gtk.main_iteration_do(False) return self._replies.pop(0) def _entry_props_iface(self): bus = dbus.SessionBus() obj = bus.get_object("org.gnome.UPnP.MediaServer2.QuodLibet", "/org/gnome/UPnP/MediaServer2/QuodLibet") return dbus.Interface( obj, dbus_interface="org.freedesktop.DBus.Properties") def test_entry_name(self): iface = self._entry_props_iface() iface.Get("org.gnome.UPnP.MediaObject2", "DisplayName", **self._args) self.failUnless("Quod Libet" in self._wait()[0]) def test_name_owner(self): bus = dbus.SessionBus() self.failUnless( bus.name_has_owner("org.gnome.UPnP.MediaServer2.QuodLibet")) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_style.py����������������������������������������������������������0000644�0001750�0001750�00000005031�13112005742�021145� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Anton Shestakov # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests.helper import ListWithUnused as L from tests.plugin import PluginTestCase from quodlibet.util.string.titlecase import human_title from quodlibet.compat import iteritems class TPluginStyle(PluginTestCase): def conclude(self, fails): def format_msg(f): return "%s: '%s' plugin (%s)" % (f[1], f[0].name, f[0].cls) if not fails: return grouped = {} for f in fails: grouped.setdefault(f[2], []).append(f) lines = [] for reason in grouped: lines.append('== ' + reason + ' ==') for f in grouped[reason]: plugin, string = f[:2] pclass = plugin.cls.__name__ ppath = plugin.cls.__module__.rpartition('.plugins.')[2] lines.append("%s.%s: %r" % (ppath, pclass, string)) self.fail("One or more plugins did not pass:\n" + '\n'.join(lines)) def test_plugin_name(self): REASON_ABSENT = "plugin should have PLUGIN_NAME" REASON_CASE = "PLUGIN_NAME should be in Title Case" ok_names = L( 'Last.fm Cover Source', 'Last.fm Sync', 'Send to iFP', 'This is a test') fails = [] for pid, plugin in iteritems(self.plugins): if not hasattr(plugin.cls, 'PLUGIN_NAME'): fails.append((plugin, None, REASON_ABSENT)) continue name = plugin.cls.PLUGIN_NAME if name != human_title(name): if name not in ok_names: fails.append((plugin, name, REASON_CASE)) ok_names.check_unused() self.conclude(fails) def test_plugin_desc(self): REASON_ABSENT = "plugin should have PLUGIN_DESC" REASON_DOT = "PLUGIN_DESC should be a full sentence and end with a '.'" skip_plugins = L('pickle_test') fails = [] for pid, plugin in iteritems(self.plugins): if pid in skip_plugins: continue if not hasattr(plugin.cls, 'PLUGIN_DESC'): fails.append((plugin, None, REASON_ABSENT)) continue desc = plugin.cls.PLUGIN_DESC if not desc.endswith('.'): fails.append((plugin, desc, REASON_DOT)) skip_plugins.check_unused() self.conclude(fails) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_mpdserver.py������������������������������������������������������0000644�0001750�0001750�00000010130�13112005742�022010� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import os import socket from senf import fsnative from gi.repository import Gtk from quodlibet.formats import AudioFile from quodlibet import app from quodlibet import config from tests.plugin import PluginTestCase, init_fake_app, destroy_fake_app from tests import skipIf @skipIf(os.name == "nt", "mpd server not supported under Windows") class TMPDServer(PluginTestCase): def setUp(self): self.mod = self.modules["mpd_server"] def test_parse_command(self): parse = self.mod.main.parse_command self.assertEqual(parse(b"foo bar"), ("foo", ["bar"])) self.assertEqual(parse(b"foo\tbar"), ("foo", ["bar"])) self.assertEqual(parse(b"foo\t bar"), ("foo", ["bar"])) self.assertEqual(parse(b"foo\t bar quux"), ("foo", ["bar", "quux"])) self.assertEqual( parse(b"foo\t bar \"q 2\" x"), ("foo", ["bar", "q 2", "x"])) self.assertEqual(parse(b"foo 'bar quux'"), ("foo", ["'bar", "quux'"])) self.assertEqual( parse(b"foo \xc3\xb6\xc3\xa4\xc3\xbc"), ("foo", [u"\xf6\xe4\xfc"])) def test_format_tags(self): format_tags = self.mod.main.format_tags def getline(key, value): song = AudioFile({"~filename": fsnative(u"/dev/null")}) song.sanitize() song[key] = value lines = format_tags(song).splitlines() if not lines: return "" if len(lines) == 1: return lines[0] # hackery since title defaults to the filename.. for l in lines: if not l.startswith("Title"): return l self.assertEqual(getline("artist", "foo"), "Artist: foo") self.assertEqual(getline("genre", "foo\nbar"), "Genre: foo, bar") self.assertEqual(getline("artistsort", "foo"), "ArtistSort: foo") self.assertEqual(getline("tracknumber", "2/3"), "Track: 2/3") self.assertEqual(getline("discnumber", "2/3"), "Disc: 2/3") self.assertEqual(getline("date", "2009-03-04"), "Date: 2009") @skipIf(os.name == "nt", "mpd server not supported under Windows") class TMPDCommands(PluginTestCase): def setUp(self): self.mod = self.modules["mpd_server"] config.init() init_fake_app() MPDServerPlugin = self.mod.MPDServerPlugin MPDConnection = self.mod.main.MPDConnection MPDService = self.mod.main.MPDService class Server(object): service = MPDService(app, MPDServerPlugin()) def _remove_connection(self, conn): pass server = Server() s, c = socket.socketpair() self.s = s c.setblocking(False) s.settimeout(1) self.conn = MPDConnection(server, c) self.conn.handle_init(server) while Gtk.events_pending(): Gtk.main_iteration_do(True) self.s.recv(9999) def _cmd(self, data): self.s.send(data) while Gtk.events_pending(): Gtk.main_iteration_do(True) if data.strip() != b"idle": return self.s.recv(99999) def tearDown(self): destroy_fake_app() config.quit() def test_currentsong_length(self): app.player.go_to(AudioFile({ "~filename": fsnative(), "~#length": 12.25, })) response = self._cmd(b"currentsong\n") assert b"Time: 12\n" in response def test_tagtypes(self): response = self._cmd(b"tagtypes\n") assert b"Time\n" not in response def test_commands(self): skip = ["close", "idle", "noidle"] cmds = [c for c in self.conn.list_commands() if c not in skip] for cmd in cmds: self._cmd(cmd.encode("ascii") + b"\n") def test_idle_close(self): for cmd in ["idle", "noidle", "close"]: self._cmd(cmd.encode("ascii") + b"\n") ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/__init__.py������������������������������������������������������������0000644�0001750�0001750�00000003061�13112005742�020506� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import quodlibet from quodlibet import util from quodlibet.util.modulescanner import ModuleScanner from quodlibet.plugins import list_plugins, Plugin, PluginImportException from quodlibet.compat import iteritems from tests import TestCase, init_fake_app, destroy_fake_app init_fake_app, destroy_fake_app # Nasty hack to allow importing of plugins... PLUGIN_DIRS = [] root = os.path.join(quodlibet.__path__[0], "ext") for entry in os.listdir(root): if entry.startswith("_"): continue path = os.path.join(root, entry) if not os.path.isdir(path): continue PLUGIN_DIRS.append(path) PLUGIN_DIRS.append(os.path.join(util.get_module_dir(), "test_plugins")) ms = ModuleScanner(PLUGIN_DIRS) ms.rescan() # make sure plugins only raise expected errors for name, err in ms.failures.items(): exc = err.exception assert issubclass(type(exc), (PluginImportException, ImportError)),\ "'%s' plugin shouldn't have raised a %s, but it did (%r)."\ % (name, type(exc).__name__, exc) plugins = {} modules = {} for name, module in iteritems(ms.modules): for plugin in list_plugins(module.module): plugins[plugin.PLUGIN_ID] = Plugin(plugin) modules[plugin.PLUGIN_ID] = module.module class PluginTestCase(TestCase): """Base class for all plugin tests""" plugins = plugins modules = modules �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_waveformseekbar.py������������������������������������������������0000644�0001750�0001750�00000001765�13115014111�023173� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. from tests.plugin import PluginTestCase from tests.helper import visible from quodlibet.player.nullbe import NullPlayer from quodlibet.formats import AudioFile class TWaveformSeekBar(PluginTestCase): def setUp(self): self.mod = self.modules["WaveformSeekBar"] def tearDown(self): del self.mod def test_main(self): WaveformScale = self.mod.WaveformScale player = NullPlayer() player.info = AudioFile({"~#length": 10}) scale = WaveformScale(player) scale.compute_redraw_interval() scale.compute_redraw_area() with visible(scale): scale.compute_redraw_interval() scale.compute_redraw_area() �����������quodlibet-3.9.1/tests/plugin/test_covers.py���������������������������������������������������������0000644�0001750�0001750�00000002021�13112005742�021302� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import fsnative from tests.plugin import PluginTestCase from quodlibet.formats import AudioFile class TCovers(PluginTestCase): def test_cover_path(self): song = AudioFile({"musicbrainz_albumid": u"foobar"}) song2 = AudioFile() # missing Soup if "lastfm-cover" in self.plugins: cls = self.plugins["lastfm-cover"].cls self.assertTrue(isinstance(cls(song).cover_path, fsnative)) self.assertTrue(isinstance(cls(song2).cover_path, fsnative)) # missing Soup if "musicbrainz-cover" in self.plugins: cls = self.plugins["musicbrainz-cover"].cls self.assertTrue(isinstance(cls(song).cover_path, fsnative)) self.assertTrue(isinstance(cls(song2).cover_path, fsnative)) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_trayicon.py�������������������������������������������������������0000644�0001750�0001750�00000007044�13112005742�021643� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013, 2016, 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import sys from gi.repository import Gtk, GdkPixbuf from quodlibet import app from quodlibet import config from quodlibet.formats import AudioFile from quodlibet.qltk import Icons from tests.plugin import PluginTestCase, init_fake_app, destroy_fake_app from tests import skipIf, TestCase @skipIf(sys.platform == "darwin", "segfaults..") class TTrayIcon(PluginTestCase): """ Basic tests for `TrayIcon` Currently just covers the standard code paths without any real testing. """ def setUp(self): config.init() init_fake_app() self.plugin = self.plugins["Tray Icon"].cls() def tearDown(self): destroy_fake_app() config.quit() del self.plugin def test_enable_disable(self): self.plugin.enabled() self.plugin.disabled() def test_popup_menu(self): self.plugin.enabled() try: self.plugin._tray.popup_menu() finally: self.plugin.disabled() def test_get_paused_pixbuf(self): get_paused_pixbuf = \ self.modules["Tray Icon"].systemtray.get_paused_pixbuf self.assertTrue(get_paused_pixbuf((1, 1), 0)) self.assertRaises(ValueError, get_paused_pixbuf, (0, 0), 0) self.assertRaises(ValueError, get_paused_pixbuf, (1, 1), -1) def test_new_with_paused_emblem(self): new_with_paused_emblem = \ self.modules["Tray Icon"].systemtray.new_with_paused_emblem # too small source pixbuf for w, h in [(150, 1), (1, 150), (1, 1)]: pb = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, w, h) success, new = new_with_paused_emblem(pb) self.assertFalse(success) self.assertTrue(new) # those should work for w, h in [(20, 20), (10, 10), (5, 5), (150, 5), (5, 150)]: pb = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, w, h) success, new = new_with_paused_emblem(pb) self.assertTrue(success) self.assertTrue(new) @skipIf(sys.platform == "darwin", "segfaults..") class TIndicatorMenu(TestCase): def setUp(self): config.init() init_fake_app() def tearDown(self): destroy_fake_app() config.quit() def test_icons(self): from quodlibet.ext.events.trayicon.menu import IndicatorMenu menu = IndicatorMenu(app) # Slightly lame way to assert here, # but it does the job and is not *too* brittle icons = [item.get_image().get_icon_name()[0] for item in menu.get_children() if isinstance(item, Gtk.ImageMenuItem)] self.failUnless(Icons.EDIT in icons) self.failUnless(Icons.FOLDER_DRAG_ACCEPT in icons) self.failUnless(Icons.MEDIA_PLAYBACK_START in icons) self.failUnless(Icons.MEDIA_SKIP_FORWARD in icons) self.failUnless(Icons.MEDIA_SKIP_BACKWARD in icons) self.failUnless(Icons.APPLICATION_EXIT in icons) self.failUnless(Icons.FAVORITE in icons) def test_playlist_menu_populates(self): from quodlibet.ext.events.trayicon.menu import IndicatorMenu menu = IndicatorMenu(app) song = AudioFile({'~filename': '/dev/null'}) menu._new_playlist_submenu_for(song) self.failUnless(menu._playlists_item.get_submenu()) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_custom_commands.py������������������������������������������������0000644�0001750�0001750�00000004424�13114760454�023217� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import app from quodlibet.formats._audio import AudioFile from quodlibet.qltk.data_editors import JSONBasedEditor from quodlibet.util.collection import Playlist from quodlibet.util.json_data import JSONObjectDict from quodlibet import config from tests import init_fake_app, destroy_fake_app from tests.plugin import PluginTestCase CustomCommands = Command = None class TCustomCommands(PluginTestCase): """Test CustomCommands plugin and associated classes""" def setUp(self): module = self.modules["CustomCommands"] globals().update(vars(module)) self.plugin = self.plugins["CustomCommands"].cls config.init() self.cmd_list = CustomCommands.DEFAULT_COMS self.commands = JSONObjectDict.from_list(self.cmd_list) init_fake_app() def tearDown(self): config.quit() destroy_fake_app() def test_JSONBasedEditor(self): ed = JSONBasedEditor(Command, self.commands, None, "title") ed.show_now() ed.destroy() def test_playlist_plugin(self): pl = Playlist("foo", library=app.library) pl.extend([AudioFile({"~filename": "/dev/null"})]) self.called_pl = None self.called_songs = None def proxy(songs, playlist=None): self.called_pl = playlist self.called_songs = songs plugin = self.plugin(playlists=[pl]) plugin._handle_songs = proxy # Test that as a Playlist plugin it delegates correctly plugin.plugin_playlist(pl) self.failUnless(self.called_songs) self.assertEqual(self.called_pl, pl) self.assertEqual(self.called_songs, pl.songs) def test_plugin_loads_json_once(self): plugin = self.plugin() self.failUnless(plugin._commands) # Hack the commands without the plugin noticing fake = {"songs": Command(name="bar")} self.plugin._commands = fake # Try again, to make sure it hasn't reloaded plugin = self.plugin() self.failUnlessEqual(plugin._commands, fake) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_brainz.py���������������������������������������������������������0000644�0001750�0001750�00000032350�13112005742�021276� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.formats import AudioFile from tests import skipUnless from . import PluginTestCase, modules brainz = modules.get("MusicBrainz lookup", None) TEST_SEARCH_RESULT = \ {'release-count': 1, 'release-list': [{'status': 'Official', 'artist-credit': [{'artist': {'sort-name': 'Necks, The', 'id': '51f8d454-f4a8-41e6-8bd7-a35921eeedd0', 'name': 'The Necks'}}], 'label-info-list': [{'catalog-number': 'FOM 0008', 'label': {'id': 'b887f682-e9e5-40d2-b4c7-cdbbcd2b3787', 'name': 'Fish of Milk'}}], 'title': 'Athenaeum, Homebush, Quay & Raab', 'country': 'AU', 'medium-count': 4, 'release-event-list': [{'date': '2002', 'area': {'sort-name': 'Australia', 'iso-3166-1-code-list': ['AU'], 'id': '106e0bec-b638-3b37-b731-f53d507dc00e', 'name': 'Australia'}}], 'medium-list': [{}, {'disc-list': [], 'format': 'CD', 'track-list': [], 'track-count': 1, 'disc-count': 1}, {'disc-list': [], 'format': 'CD', 'track-list': [], 'track-count': 1, 'disc-count': 1}, {'disc-list': [], 'format': 'CD', 'track-list': [], 'track-count': 1, 'disc-count': 1}, {'disc-list': [], 'format': 'CD', 'track-list': [], 'track-count': 1, 'disc-count': 1}], 'text-representation': {'language': 'eng', 'script': 'Latn'}, 'ext:score': '100', 'date': '2002', 'artist-credit-phrase': 'The Necks', 'release-group': {'secondary-type-list': ['Live'], 'type': 'Live', 'id': '88e47489-a3d0-3344-864d-4b09188ba9e0', 'primary-type': 'Album'}, 'id': '3663a8a9-1c67-41c2-82c8-6a241d1558f7', 'asin': 'B00007FKRD'}]} TEST_SEARCH_RESULT_2 = \ {'release-count': 1, 'release-list': [{'artist-credit': [{'artist': {'alias-list': [{'alias': u'\u30a2\u30d0', 'locale': 'ja', 'primary': 'primary', 'sort-name': u'\u30a2\u30d0', 'type': 'Artist name'}, {'alias': u'\u15c5\u15fa\u15f7\u15c5', 'sort-name': u'\u15c5\u15fa\u15f7\u15c5', 'type': 'Search hint'}, {'alias': 'Abba', 'sort-name': 'Abba'}, {'alias': u'Bj\xf6rn + Benny + Anna + Frieda', 'sort-name': u'Bj\xf6rn + Benny + Anna + Frieda'}], 'id': 'd87e52c5-bb8d-4da8-b941-9f4928627dc8', 'name': 'ABBA', 'sort-name': 'ABBA'}}], 'artist-credit-phrase': 'ABBA', 'barcode': '602537784608', 'country': 'XW', 'date': '2014-04-04', 'ext:score': '100', 'id': '9daa9d6e-7780-487f-9ef8-885755b73125', 'label-info-list': [{'label': {'id': '91edee57-cbb2-44f4-a6c7-a1a022aead78', 'name': 'Polar'}}], 'medium-count': 1, 'medium-list': [{}, {'disc-count': 0, 'disc-list': [], 'format': 'Digital Media', 'track-count': 19, 'track-list': []}], 'packaging': 'None', 'release-event-list': [{'area': {'id': '525d4e18-3d00-31b9-a58b-a146a916de8f', 'iso-3166-1-code-list': ['XW'], 'name': '[Worldwide]', 'sort-name': '[Worldwide]'}, 'date': '2014-04-04'}], 'release-group': {'id': 'b69d665a-3eee-39f3-b156-58b122232304', 'primary-type': 'Album', 'secondary-type-list': ['Compilation'], 'type': 'Compilation'}, 'status': 'Official', 'text-representation': {'language': 'eng', 'script': 'Latn'}, 'title': 'Gold: Greatest Hits'}]} TEST_DATA = \ {'status': 'Official', 'artist-credit': [{'artist': {'sort-name': 'Autechre', 'id': '410c9baf-5469-44f6-9852-826524b80c61', 'name': 'Autechre'}}, ' & ', {'artist': {'sort-name': 'Hafler Trio, The', 'id': '146c01d0-d3a2-44c3-acb5-9208bce75e14', 'name': 'The Hafler Trio'}}], 'label-info-list': [{'catalog-number': 'pgram002', 'label': {'sort-name': 'Phonometrography', 'id': 'a0759efa-f583-49ea-9a8d-d5bbce55541c', 'name': 'Phonometrography'}}], 'title': u'\xe6\xb3o & h\xb3\xe6', 'release-event-count': 1, 'medium-count': 2, 'cover-art-archive': {'count': '1', 'front': 'true', 'back': 'false', 'artwork': 'true'}, 'release-event-list': [{'date': '2003-12-04', 'area': {'sort-name': 'United Kingdom', 'iso-3166-1-code-list': ['GB'], 'id': '8a754a16-0027-3a29-b6d7-2b40ea0481ed', 'name': 'United Kingdom'}}], 'medium-list': [{'position': '1', 'title': u'\xe6\xb3o', 'track-list': [{'artist-credit': [{'artist': {'sort-name': 'Autechre', 'id': '410c9baf-5469-44f6-9852-826524b80c61', 'name': 'Autechre'}}, ' & ', {'artist': {'sort-name': 'Hafler Trio, The', 'id': '146c01d0-d3a2-44c3-acb5-9208bce75e14', 'name': 'The Hafler Trio'}}], 'number': '1', 'artist-credit-phrase': 'Autechre & The Hafler Trio', 'recording': {'artist-credit': [{'artist': {'sort-name': 'Autechre', 'id': '410c9baf-5469-44f6-9852-826524b80c61', 'name': 'Autechre'}}, ' & ', {'artist': {'sort-name': 'Hafler Trio, The', 'id': '146c01d0-d3a2-44c3-acb5-9208bce75e14', 'name': 'The Hafler Trio'}}], 'length': '974546', 'artist-credit-phrase': 'Autechre & The Hafler Trio', 'id': 'af87f070-238b-46c1-aa3e-f831ab91fa20', 'title': u'\xe6\xb3o'}, 'length': '974546', 'position': '1', 'id': '61af3e5a-14e0-350d-9826-a884c6e586b1', 'track_or_recording_length': '974546'}], 'track-count': 1, 'format': 'CD'}, {'position': '2', 'title': u'h\xb3\xe6', 'track-list': [{'artist-credit': [{'artist': {'sort-name': 'Autechre', 'id': '410c9baf-5469-44f6-9852-826524b80c61', 'name': 'Autechre'}}, ' & ', {'artist': {'sort-name': 'Hafler Trio, The', 'id': '146c01d0-d3a2-44c3-acb5-9208bce75e14', 'name': 'The Hafler Trio'}}], 'number': '1', 'artist-credit-phrase': 'Autechre & The Hafler Trio', 'recording': {'artist-credit': [{'artist': {'sort-name': 'Autechre', 'id': '410c9baf-5469-44f6-9852-826524b80c61', 'name': 'Autechre'}}, ' & ', {'artist': {'sort-name': 'Hafler Trio, The', 'id': '146c01d0-d3a2-44c3-acb5-9208bce75e14', 'name': 'The Hafler Trio'}}], 'length': '922546', 'artist-credit-phrase': 'Autechre & The Hafler Trio', 'id': '5aff6309-2e02-4a47-9233-32d7dcc9a960', 'title': u'h\xb3\xe6'}, 'length': '922546', 'position': '1', 'id': '5f2031a2-c67d-3bec-8ae5-8d22847ab0a5', 'track_or_recording_length': '922546'}], 'track-count': 1, 'format': 'CD'}], 'text-representation': {'language': 'eng', 'script': 'Latn'}, 'label-info-count': 1, 'country': 'GB', 'date': '2003-12-04', 'artist-credit-phrase': 'Autechre & The Hafler Trio', 'quality': 'normal', 'id': '59211ea4-ffd2-4ad9-9a4e-941d3148024a'} # This isn't a complete/original ngs result, it just contains the minimum # a pregap track and a normal track. # The original release used here does also contain a pregap. TEST_PREGAP = \ {'artist-credit': [], 'date': '2008-10-17', 'id': '87c070fc-90d5-39d1-b0ca-777236588378', 'medium-count': 1, 'medium-list': [{'format': 'CD', 'position': '1', 'pregap': {'artist-credit': [ {'artist': {'id': '90b18d97-718b-4a95-982d-b14019d084c0', 'name': 'Polarkreis 18', 'sort-name': 'Polarkreis 18'}}], 'artist-credit-phrase': 'Polarkreis 18', 'id': '2edd640f-2365-4440-b6e5-1f65dd72440b', 'length': '63000', 'number': '0', 'position': '0', 'recording': {'artist-credit': [ {'artist': {'id': '90b18d97-718b-4a95-982d-b14019d084c0', 'name': 'Polarkreis 18', 'sort-name': 'Polarkreis 18'}}], 'artist-credit-phrase': 'Polarkreis 18', 'id': 'e7f3e14b-7acf-47cc-bc26-d66269b821f4', 'length': '63000', 'title': 'Herbstlied'}, 'track_or_recording_length': '63000'}, 'track-count': 1, 'track-list': [{'artist-credit': [ {'artist': {'id': '90b18d97-718b-4a95-982d-b14019d084c0', 'name': 'Polarkreis 18', 'sort-name': 'Polarkreis 18'}}], 'artist-credit-phrase': 'Polarkreis 18', 'id': '03cdb09e-5a22-3e0d-88c9-da24793ccbab', 'length': '202106', 'number': '1', 'position': '1', 'recording': {'artist-credit': [ {'artist': {'id': '90b18d97-718b-4a95-982d-b14019d084c0', 'name': 'Polarkreis 18', 'sort-name': 'Polarkreis 18'}}], 'artist-credit-phrase': 'Polarkreis 18', 'id': 'b2bcb18f-ef9b-4e7e-ac4a-29234b3bac4e', 'length': '202106', 'title': 'Tourist'}, 'track_or_recording_length': '202106'}]}]} @skipUnless(brainz, "brainz plugin not loaded") class TBrainz(PluginTestCase): """Test CustomCommands plugin and associated classes""" def setUp(self): globals()["brainz"] = self.modules["MusicBrainz lookup"] def test_get_trackcount(self): get_trackcount = brainz.widgets.get_trackcount album = [ AudioFile({"tracknumber": "7"}), AudioFile({"tracknumber": "garbage"}), AudioFile({"tracknumber": "10/42"}), ] self.assertEqual(get_trackcount([]), 0) self.assertEqual(get_trackcount(album), 42) def test_get_artist(self): get_artist = brainz.widgets.get_artist self.assertEqual(get_artist([]), None) album = [ AudioFile({"artist": u"garbage"}), AudioFile({"albumartist": u"foo"}), ] self.assertEqual(get_artist(album), u"foo") album = [ AudioFile({"artist": u"garbage"}), AudioFile({"artist": u"bla"}), ] self.assertEqual(get_artist(album), None) album = [ AudioFile({"artist": u"bla"}), AudioFile({"artist": u"bla"}), ] self.assertEqual(get_artist(album), u"bla") def test_build_query(self): build_query = brainz.widgets.build_query album = [ AudioFile({"artist": u"garbage", "album": "blah"}), AudioFile({"albumartist": u"foo"}), ] self.assertEqual( build_query(album), '"blah" AND artist:"foo" AND tracks:2') def test_release(self): Release = brainz.mb.Release release = Release(TEST_DATA) self.assertEqual(release.id, "59211ea4-ffd2-4ad9-9a4e-941d3148024a") self.assertEqual(release.date, "2003-12-04") self.assertEqual(release.medium_format, "CD") self.assertEqual(release.country, "GB") self.assertEqual(release.disc_count, 2) self.assertEqual(release.track_count, 2) self.assertEqual(len(release.tracks), 2) self.assertEqual(release.title, u'\xe6\xb3o & h\xb3\xe6') self.assertTrue(release.is_single_artist) self.assertFalse(release.is_various_artists) self.assertTrue(release.artists) def test_release_tracks(self): Release = brainz.mb.Release release = Release(TEST_DATA) track = release.tracks[0] self.assertEqual(track.id, "61af3e5a-14e0-350d-9826-a884c6e586b1") self.assertEqual(len(track.artists), 2) self.assertEqual(track.title, u'\xe6\xb3o') self.assertEqual(track.tracknumber, "1") self.assertEqual(track.discnumber, "1") self.assertEqual(track.track_count, 1) self.assertEqual(track.disctitle, u"\xe6\xb3o") def test_labelid(self): Release = brainz.mb.Release release = Release(TEST_SEARCH_RESULT["release-list"][0]) self.assertEqual(release.labelid, u"FOM 0008") release = Release(TEST_SEARCH_RESULT_2["release-list"][0]) self.assertEqual(release.labelid, u"") def test_release_artist(self): Release = brainz.mb.Release release = Release(TEST_DATA) artist = release.artists[0] self.assertEqual(artist.id, "410c9baf-5469-44f6-9852-826524b80c61") self.assertEqual(artist.name, "Autechre") self.assertEqual(artist.sort_name, "Autechre") self.assertFalse(artist.is_various) def test_build_metadata(self): Release = brainz.mb.Release build_song_data = brainz.widgets.build_song_data apply_options = brainz.widgets.apply_options apply_to_song = brainz.widgets.apply_to_song release = Release(TEST_DATA) track = release.tracks[1] meta = build_song_data(release, track) self.assertEqual(meta["tracknumber"], "1/1") self.assertEqual(meta["discnumber"], "2/2") self.assertEqual(meta["labelid"], "pgram002") apply_options(meta, True, False, False, False, False) dummy = AudioFile() apply_to_song(meta, dummy) self.assertEqual(dummy("album"), u'\xe6\xb3o & h\xb3\xe6') self.assertEqual(dummy("date"), u'2003') self.assertEqual(dummy("title"), u'h\xb3\xe6') self.assertEqual(dummy("pgram002"), u'') def test_build_mbids_labelid(self): Release = brainz.mb.Release build_song_data = brainz.widgets.build_song_data apply_options = brainz.widgets.apply_options apply_to_song = brainz.widgets.apply_to_song release = Release(TEST_DATA) track = release.tracks[1] meta = build_song_data(release, track) apply_options(meta, True, False, False, True, True) dummy = AudioFile() apply_to_song(meta, dummy) self.assertEqual(dummy("musicbrainz_releasetrackid"), track.id) self.assertEqual(dummy("musicbrainz_albumid"), release.id) self.assertEqual( dummy.list("musicbrainz_artistid"), [u'410c9baf-5469-44f6-9852-826524b80c61', u'146c01d0-d3a2-44c3-acb5-9208bce75e14']) self.assertEqual(dummy("labelid"), u"pgram002") def test_pregap(self): Release = brainz.mb.Release release = Release(TEST_PREGAP) self.assertEqual(release.track_count, 2) self.assertEqual(len(release.tracks), 2) pregap = release.tracks[0] self.assertEqual(pregap.title, "Herbstlied") self.assertEqual(pregap.tracknumber, "0") self.assertEqual(pregap.track_count, 2) self.assertEqual(pregap.discnumber, "1") track = release.tracks[1] self.assertEqual(track.title, "Tourist") self.assertEqual(track.tracknumber, "1") self.assertEqual(track.track_count, 2) self.assertEqual(track.discnumber, "1") ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_plugins/����������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021113� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_plugins/pickle_test.py��������������������������������������������0000644�0001750�0001750�00000001351�13112005742�023775� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import shelve from tests import mkstemp from quodlibet.plugins.events import EventPlugin class PickleMe(object): pass class PickleTestPlugin(EventPlugin): PLUGIN_ID = "pickle_test" PLUGIN_NAME = "This is a test" def enabled(self): # https://github.com/quodlibet/quodlibet/issues/1093 fd, filename = mkstemp('.shelve') os.close(fd) os.unlink(filename) s = shelve.open(filename) s["foobar"] = PickleMe() s.close() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_songsmenu.py������������������������������������������������������0000644�0001750�0001750�00000005074�13112005742�022032� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter, Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from senf import fsnative from quodlibet.plugins.songsmenu import SongsMenuPlugin from tests.plugin import PluginTestCase from quodlibet import config from quodlibet.qltk.songsmenu import SongsMenuPluginHandler from quodlibet.formats import AudioFile from quodlibet.library import SongLibrary, SongLibrarian from quodlibet.compat import iteritems SONGS = [ AudioFile({ "title": "one", "artist": "piman", "~filename": fsnative(u"/dev/null"), }), AudioFile({ "title": "two", "artist": "mu", "~filename": fsnative(u"/dev/zero"), }), AudioFile({ "title": "three", "artist": "boris", "~filename": fsnative(u"/bin/ls"), }), ] SONGS.sort() for song in SONGS: song.sanitize() class TPluginsSongsMenu(PluginTestCase): def setUp(self): config.init() self.h = SongsMenuPluginHandler() library = SongLibrary() library.librarian = SongLibrarian() self.lib = library self.parent = Gtk.Window() def tearDown(self): self.lib.destroy() self.parent.destroy() config.quit() def test_init(self): for id_, plugin in iteritems(self.plugins): if self.h.plugin_handle(plugin): self.h.plugin_enable(plugin) self.h.handle(id_, None, None, []) self.h.plugin_disable(plugin) def test_handle_single(self): self.skipTest("Pops up windows and needs user input.. so disabled." "Still worth keeping whilst we don't have unit tests " "for all plugins.") # Ignored... for id_, plugin in iteritems(self.plugins): if self.h.plugin_handle(plugin): self.h.plugin_enable(plugin, None) self.h.handle(id_, self.lib, self.parent, SONGS) self.h.plugin_disable(plugin) def test_handles_albums(self): for id_, plugin in iteritems(self.plugins): if isinstance(plugin, SongsMenuPlugin): ha = plugin.handles_albums self.failIf(hasattr(plugin, "plugin_single_album") and not ha) self.failIf(hasattr(plugin, "plugin_plugin_album") and not ha) self.failIf(hasattr(plugin, "plugin_albums") and not ha) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_query.py����������������������������������������������������������0000644�0001750�0001750�00000011504�13112005742�021154� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Ryan Dellenbaugh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from tests.plugin import PluginTestCase from tests import mkstemp from quodlibet.plugins import Plugin from quodlibet.plugins.query import QueryPlugin, QueryPluginError from quodlibet.plugins.query import QUERY_HANDLER from quodlibet.formats import AudioFile class FakeQueryPlugin(QueryPlugin): PLUGIN_ID = 'fake_query_plugin' PLUGIN_NAME = 'fake_query' key = 'fake' def search(self, data, body): return True fake_plugin = Plugin(FakeQueryPlugin) class TQueryPlugins(PluginTestCase): def test_handler(self): self.failUnlessRaises(KeyError, QUERY_HANDLER.get_plugin, 'fake') QUERY_HANDLER.plugin_enable(fake_plugin) self.failUnless( isinstance(QUERY_HANDLER.get_plugin('fake'), FakeQueryPlugin)) QUERY_HANDLER.plugin_disable(fake_plugin) self.failUnlessRaises(KeyError, QUERY_HANDLER.get_plugin, 'fake') def test_conditional(self): if 'conditional_query' not in self.plugins: return plugin = self.plugins['conditional_query'].cls() self.failUnlessRaises(QueryPluginError, plugin.parse_body, None) self.failUnlessRaises(QueryPluginError, plugin.parse_body, '') self.failUnlessRaises(QueryPluginError, plugin.parse_body, 'single=query') self.failUnlessRaises(QueryPluginError, plugin.parse_body, 'a=first,b=second') self.failUnlessRaises(QueryPluginError, plugin.parse_body, 'invalid/query') self.failUnless(plugin.parse_body('a=first,b=second,c=third')) self.failUnless(plugin.parse_body('@(ext),#(numcmp > 0),!negation')) body = plugin.parse_body('artist=a, genre=rock, genre=classical') self.failUnless(plugin.search( AudioFile({'artist': u'a', 'genre': u'rock'}), body)) self.failIf(plugin.search( AudioFile({'artist': u'a', 'genre': u'classical'}), body)) self.failIf(plugin.search( AudioFile({'artist': u'b', 'genre': u'rock'}), body)) self.failUnless(plugin.search( AudioFile({'artist': u'b', 'genre': u'classical'}), body)) def test_savedsearch(self): if 'include_saved' not in self.plugins: return plugin = self.plugins['include_saved'].cls() self.failUnlessRaises(QueryPluginError, plugin.parse_body, None) try: fd, filename = mkstemp(text=True) file = os.fdopen(fd, 'w') file.write("artist=a\nQuery 1\ngenre=classical\nAnother query") file.close() self.failUnlessRaises(QueryPluginError, plugin.parse_body, 'missing query') self.failUnlessRaises(QueryPluginError, plugin.parse_body, 'artist=a') self.failUnless(plugin.parse_body(' quEry 1', query_path_=filename)) query1 = plugin.parse_body('Query 1', query_path_=filename) query2 = plugin.parse_body('another query', query_path_=filename) song = AudioFile({'artist': u'a', 'genre': u'dance'}) self.failUnless(plugin.search(song, query1)) self.failIf(plugin.search(song, query2)) finally: os.remove(filename) def test_python_expression(self): if 'python_query' not in self.plugins: return plugin = self.plugins['python_query'].cls() self.failUnlessRaises(QueryPluginError, plugin.parse_body, None) self.failUnlessRaises(QueryPluginError, plugin.parse_body, '') self.failUnlessRaises(QueryPluginError, plugin.parse_body, '\\') self.failUnlessRaises(QueryPluginError, plugin.parse_body, 'unclosed[') self.failUnlessRaises(QueryPluginError, plugin.parse_body, 'return s') self.failUnless(plugin.parse_body('3')) self.failUnless(plugin.parse_body('s')) body1 = plugin.parse_body("s('~#rating') > 0.5") body2 = plugin.parse_body( "s('genre').lower()[2:] in ('rock', 'pop')") body3 = plugin.parse_body("len(s('title')) < 6") song1 = AudioFile({'title': 'foobar', '~#rating': 0.8, 'genre': 'jazz'}) song2 = AudioFile({'title': 'baz', '~#rating': 0.4, 'genre': 'aapop'}) self.failUnless(plugin.search(song1, body1)) self.failIf(plugin.search(song1, body2)) self.failIf(plugin.search(song1, body3)) self.failIf(plugin.search(song2, body1)) self.failUnless(plugin.search(song2, body2)) self.failUnless(plugin.search(song2, body3)) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_duplicates_browser.py���������������������������������������������0000644�0001750�0001750�00000003727�13112005742�023717� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from quodlibet import app from quodlibet import config from quodlibet.formats import AudioFile from quodlibet.plugins import PM, get_config_option from quodlibet.util.songwrapper import SongWrapper from tests import init_fake_app, destroy_fake_app from tests.plugin import PluginTestCase class TDuplicates(PluginTestCase): @classmethod def setUpClass(cls): cls.mod = cls.modules["Duplicates"] cls.kind = cls.plugins["Duplicates"].cls cls.song = AudioFile({'~filename': '/dev/null', 'artist': 'foo BAR', 'title': 'no!'}) cls.song2 = AudioFile({'~filename': '/dev/null', 'artist': 'föo bár', 'title': 'no?...'}) @classmethod def tearDownClass(cls): del cls.mod del cls.kind def setUp(self): init_fake_app() self._turn_all_options_on() app.library.songs = [self.song, self.song2, self.song] self.plugin = self.kind([self.song], None) def _turn_all_options_on(self): for name in ['REMOVE_WHITESPACE', 'REMOVE_DIACRITICS', 'REMOVE_PUNCTUATION', 'CASE_INSENSITIVE']: # Get the actual values, don't hard-code here (kinda) cfg_name = getattr(self.mod.Duplicates, "_CFG_%s" % name) config.set(PM.CONFIG_SECTION, get_config_option(self.kind, cfg_name), True) # TODO: proper logic tests... def tearDown(self): self.plugin.destroy() del self.plugin destroy_fake_app() def test_starts_up(self): sws = [SongWrapper(s) for s in app.library.songs] self.plugin.plugin_songs(sws) �����������������������������������������quodlibet-3.9.1/tests/plugin/test_albumart.py�������������������������������������������������������0000644�0001750�0001750�00000002316�13112005742�021617� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from quodlibet.formats import AudioFile from quodlibet.qltk.cover import ALBUM_ART_PLUGIN_ID from tests.plugin import PluginTestCase from quodlibet import library, config from quodlibet import app A_SONG = AudioFile({'~filename': '/dev/null', 'artist': 'Mr Man', 'album': 'Bars of Foo'}) # Keep IDEs happy DownloadAlbumArt = AlbumArtWindow = CoverArea = None # TODO: Some real tests. class TAlbumArt(PluginTestCase): @classmethod def setUpClass(cls): app.library = library.init() config.init() @classmethod def tearDownClass(cls): config.quit() def setUp(self): globals().update(vars(self.modules[ALBUM_ART_PLUGIN_ID])) self.songs = [A_SONG] self.plugin = DownloadAlbumArt(self.songs, library) def testAlbumArtWindow(self): win = AlbumArtWindow(self.songs) win.destroy() def testCoverArea(self): win = CoverArea(None, self.songs[0]) win.destroy() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_mpris.py����������������������������������������������������������0000644�0001750�0001750�00000017004�13112005742�021142� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import time try: import dbus except ImportError: dbus = None from gi.repository import Gtk from senf import fsnative from tests import skipUnless from tests.plugin import PluginTestCase, init_fake_app, destroy_fake_app from quodlibet.formats import AudioFile from quodlibet import config from quodlibet import app from quodlibet.compat import iteritems A1 = AudioFile( {'album': u'greatness', 'title': 'excellent', 'artist': 'fooman\ngo', '~#lastplayed': 1234, '~#rating': 0.75, '~filename': fsnative(u'/foo a/b'), "~#length": 123, "albumartist": "aa\nbb", "bpm": "123.5", "tracknumber": "6/7"}) A1.sanitize() A2 = AudioFile( {'album': u'greatness2\ufffe', 'title': 'superlative', 'artist': u'fooman\ufffe', '~#lastplayed': 1234, '~#rating': 1.0, '~filename': fsnative(u'/foo')}) A2.sanitize() MAX_TIME = 3 @skipUnless(dbus, "no dbus") class TMPRIS(PluginTestCase): def setUp(self): self.plugin = self.plugins["mpris"].cls config.init() init_fake_app() app.window.songlist.set_songs([A1, A2]) app.player.go_to(None) self.m = self.plugin() self.m.enabled() self._replies = [] def tearDown(self): bus = dbus.SessionBus() self.failUnless( bus.name_has_owner("org.mpris.quodlibet")) self.m.disabled() self.failIf(bus.name_has_owner("org.mpris.quodlibet")) destroy_fake_app() config.quit() del self.m def test_name_owner(self): bus = dbus.SessionBus() self.failUnless(bus.name_has_owner("org.mpris.quodlibet")) def _main_iface(self): bus = dbus.SessionBus() obj = bus.get_object("org.mpris.quodlibet", "/org/mpris/MediaPlayer2") return dbus.Interface(obj, dbus_interface="org.mpris.MediaPlayer2") def _prop(self): bus = dbus.SessionBus() obj = bus.get_object("org.mpris.quodlibet", "/org/mpris/MediaPlayer2") return dbus.Interface(obj, dbus_interface="org.freedesktop.DBus.Properties") def _player_iface(self): bus = dbus.SessionBus() obj = bus.get_object("org.mpris.quodlibet", "/org/mpris/MediaPlayer2") return dbus.Interface(obj, dbus_interface="org.mpris.MediaPlayer2.Player") def _reply(self, *args): self._replies.append(args) def _error(self, *args): self.failIf(args) def _wait(self, msg=""): start = time.time() while not self._replies: Gtk.main_iteration_do(False) if time.time() - start > MAX_TIME: self.fail("Timed out waiting for replies (%s)" % msg) return self._replies.pop(0) def test_main(self): args = {"reply_handler": self._reply, "error_handler": self._error} piface = "org.mpris.MediaPlayer2" app.window.hide() self.failIf(app.window.get_visible()) self._main_iface().Raise(**args) self.failIf(self._wait()) self.failUnless(app.window.get_visible()) app.window.hide() props = { "CanQuit": dbus.Boolean(True), "CanRaise": dbus.Boolean(True), "CanSetFullscreen": dbus.Boolean(False), "HasTrackList": dbus.Boolean(False), "Identity": dbus.String("Quod Libet"), "DesktopEntry": dbus.String("quodlibet"), "SupportedUriSchemes": dbus.Array(), } for key, value in iteritems(props): self._prop().Get(piface, key, **args) resp = self._wait()[0] self.failUnlessEqual(resp, value) self.failUnless(isinstance(resp, type(value))) self._prop().Get(piface, "SupportedMimeTypes", **args) self.failUnless("audio/vorbis" in self._wait()[0]) def test_player(self): args = {"reply_handler": self._reply, "error_handler": self._error} piface = "org.mpris.MediaPlayer2.Player" props = { "PlaybackStatus": dbus.String("Stopped"), "LoopStatus": dbus.String("None"), "Rate": dbus.Double(1.0), "Shuffle": dbus.Boolean(False), "Volume": dbus.Double(1.0), "Position": dbus.Int64(0), "MinimumRate": dbus.Double(1.0), "MaximumRate": dbus.Double(1.0), "CanGoNext": dbus.Boolean(True), "CanGoPrevious": dbus.Boolean(True), "CanPlay": dbus.Boolean(True), "CanPause": dbus.Boolean(True), "CanSeek": dbus.Boolean(True), "CanControl": dbus.Boolean(True), } for key, value in iteritems(props): self._prop().Get(piface, key, **args) resp = self._wait(msg="for key '%s'" % key)[0] self.failUnlessEqual(resp, value) self.failUnless(isinstance(resp, type(value))) def test_metadata(self): args = {"reply_handler": self._reply, "error_handler": self._error} piface = "org.mpris.MediaPlayer2.Player" # No song case self._prop().Get(piface, "Metadata", **args) resp = self._wait()[0] self.failUnlessEqual(resp["mpris:trackid"], "/net/sacredchao/QuodLibet/NoTrack") self.failUnless(isinstance(resp["mpris:trackid"], dbus.ObjectPath)) # go to next song self._player_iface().Next(**args) self._wait() self._prop().Get(piface, "Metadata", **args) resp = self._wait()[0] self.failIfEqual(resp["mpris:trackid"], "/net/sacredchao/QuodLibet/NoTrack") # mpris stuff self.failIf(resp["mpris:trackid"].startswith("/org/mpris/")) self.failUnless(isinstance(resp["mpris:trackid"], dbus.ObjectPath)) self.failUnlessEqual(resp["mpris:length"], 123 * 10 ** 6) self.failUnless(isinstance(resp["mpris:length"], dbus.Int64)) # list text values self.failUnlessEqual(resp["xesam:artist"], ["fooman", "go"]) self.failUnlessEqual(resp["xesam:albumArtist"], ["aa", "bb"]) # single text values self.failUnlessEqual(resp["xesam:album"], "greatness") self.failUnlessEqual(resp["xesam:title"], "excellent") self.failUnlessEqual(resp["xesam:url"], "file:///foo%20a/b") # integers self.failUnlessEqual(resp["xesam:audioBPM"], 123) self.failUnless(isinstance(resp["xesam:audioBPM"], dbus.Int32)) self.failUnlessEqual(resp["xesam:trackNumber"], 6) self.failUnless(isinstance(resp["xesam:trackNumber"], dbus.Int32)) # rating self.failUnlessAlmostEqual(resp["xesam:userRating"], 0.75) self.failUnless(isinstance(resp["xesam:userRating"], dbus.Double)) # time from time import strptime from calendar import timegm seconds = timegm(strptime(resp["xesam:lastUsed"], "%Y-%m-%dT%H:%M:%S")) self.failUnlessEqual(seconds, 1234) # go to next song with invalid utf-8 self._player_iface().Next(**args) self._wait() self._prop().Get(piface, "Metadata", **args) resp = self._wait()[0] self.failUnlessEqual(resp["xesam:album"], u'greatness2\ufffd') self.failUnlessEqual(resp["xesam:artist"], [u'fooman\ufffd']) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_prefs.py����������������������������������������������������������0000644�0001750�0001750�00000001736�13112005742�021134� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from tests.plugin import PluginTestCase, init_fake_app, destroy_fake_app from quodlibet import config from quodlibet.compat import iteritems class TPrefs(PluginTestCase): def setUp(self): config.init() init_fake_app() def tearDown(self): destroy_fake_app() config.quit() def test_all(self): tested_any = False for id_, plugin in iteritems(self.plugins): plugin = plugin.cls if hasattr(plugin, "PLUGIN_INSTANCE"): plugin = plugin() if hasattr(plugin, "PluginPreferences"): tested_any = True plugin.PluginPreferences(Gtk.Window()) self.assertTrue(tested_any) ����������������������������������quodlibet-3.9.1/tests/plugin/test_replaygain.py�����������������������������������������������������0000644�0001750�0001750�00000010466�13112005742�022150� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from gi.repository import Gtk import re import time from quodlibet.ext.songsmenu.replaygain import UpdateMode from quodlibet.formats import MusicFile from quodlibet.formats import AudioFile from tests.plugin import PluginTestCase from tests import get_data_path class TReplayGain(PluginTestCase): # Give up analysis after some time, in case GStreamer dies. TIMEOUT = 20 @classmethod def setUpClass(cls): cls.mod = cls.modules["ReplayGain"] cls.kind = cls.plugins["ReplayGain"].cls @classmethod def tearDownClass(cls): del cls.mod del cls.kind def setUp(self): self.song = AudioFile({'artist': 'foo', 'album': 'the album'}) self.plugin = self.kind([self.song], None) def tearDown(self): self.plugin.destroy() del self.plugin del self.song def test_RGSong_properties(self): rgs = self.mod.RGSong(self.song) self.failIf(rgs.has_album_tags) self.failIf(rgs.has_track_tags) self.failIf(rgs.has_all_rg_tags) rgs.done = True rgs._write(-1.23, 0.99) self.failUnless(rgs.has_album_tags, msg="Didn't write album tags") self.failIf(rgs.has_track_tags) self.failIf(rgs.has_all_rg_tags) def test_RGSong_zero(self): rgs = self.mod.RGSong(self.song) rgs.done = True rgs._write(0.0, 0.0) self.failUnless(rgs.has_album_tags, msg="Failed with 0.0 album tags (%s)" % rgs) def test_RGAlbum_properties(self): rga = self.mod.RGAlbum([self.mod.RGSong(self.song)], UpdateMode.ALWAYS) self.failIf(rga.done) self.failUnlessEqual(rga.title, 'foo - the album') def test_delete_bs1770gain(self): tags = ["replaygain_reference_loudness", "replaygain_algorithm", "replaygain_album_range", "replaygain_track_range"] for tag in tags: self.song[tag] = u"foo" rgs = self.mod.RGSong(self.song) rgs.done = True rgs._write(0.0, 0.0) for tag in tags: self.assertFalse(self.song(tag)) def _analyse_song(self, song): mode = self.mod.UpdateMode.ALWAYS self.album = album = self.mod.RGAlbum.from_songs([song], mode) self.analysed = None def _run_main_loop(): def on_complete(pipeline, album): album.write() self.analysed = [album] pipeline = self.mod.ReplayGainPipeline() sig = pipeline.connect('done', on_complete) pipeline.start(album) start = time.time() while not self.analysed and \ abs(time.time() - start) < self.TIMEOUT: Gtk.main_iteration_do(False) pipeline.quit() pipeline.disconnect(sig) _run_main_loop() self.assertTrue(self.analysed, "Timed out") def test_analyze_sinewave(self): song = MusicFile(get_data_path("sine-110hz.flac")) self.failUnlessEqual(song("~#length"), 2) self.failIf(song("~replaygain_track_gain")) self._analyse_song(song) self.failUnlessAlmostEqual(song("~#replaygain_track_peak"), 1.0, msg="Track peak should be 1.0") track_gain = song("~#replaygain_track_gain") self.failUnless(track_gain, msg="No Track Gain added") self.failUnless(re.match(r'\-[0-9]\.[0-9]{1,2}', str(track_gain))) # For one-song album, track == album self.failUnlessEqual(track_gain, song('~#replaygain_album_gain')) def test_analyze_silence(self): song = MusicFile(get_data_path("silence-44-s.ogg")) self.failIf(song("~replaygain_track_gain")) self._analyse_song(song) self.failUnlessAlmostEqual(song("~#replaygain_track_peak"), 0.0, msg="Track peak should be 0.0") track_gain = song("~#replaygain_track_gain") self.failUnless(track_gain, msg="No Track Gain added") # For one-song album, track == album self.failUnlessEqual(track_gain, song('~#replaygain_album_gain')) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_fingerprint.py����������������������������������������������������0000644�0001750�0001750�00000014014�13112005742�022335� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import time from gi.repository import Gtk try: from gi.repository import Gst Gst except ImportError: Gst = None else: chromaprint = Gst.ElementFactory.find("chromaprint") vorbisdec = Gst.ElementFactory.find("vorbisdec") from tests.plugin import PluginTestCase from tests import skipUnless, get_data_path from quodlibet import config from quodlibet.formats import MusicFile @skipUnless(Gst and chromaprint and vorbisdec, "gstreamer plugins missing") class TFingerprint(PluginTestCase): TIMEOUT = 20.0 def setUp(self): config.init() self.mod = self.modules["AcoustidSearch"] def tearDown(self): config.quit() self.mod def test_analyze_silence(self): pipeline = self.mod.analyze.FingerPrintPipeline() song = MusicFile(get_data_path("silence-44-s.ogg")) done = [] def callback(self, *args): done.extend(args) pipeline.start(song, callback) t = time.time() while not done and time.time() - t < self.TIMEOUT: Gtk.main_iteration_do(False) self.assertTrue(done) s, result, error = done # silence doesn't produce a fingerprint self.assertTrue(error) self.assertFalse(result) self.assertTrue(song is s) def test_analyze_pool(self): pool = self.mod.analyze.FingerPrintPool() song = MusicFile(get_data_path("silence-44-s.ogg")) events = [] def handler(*args): events.append(args) pool.connect("fingerprint-started", handler, "start") pool.connect("fingerprint-done", handler, "done") pool.connect("fingerprint-error", handler, "error") pool.push(song) t = time.time() while len(events) < 2 and time.time() - t < self.TIMEOUT: Gtk.main_iteration_do(False) self.assertEqual(len(events), 2) self.assertEqual(events[0][-1], "start") self.assertEqual(events[1][-1], "error") @skipUnless(Gst and chromaprint, "gstreamer plugins missing") class TAcoustidLookup(PluginTestCase): def setUp(self): config.init() self.mod = self.modules["AcoustidSearch"] def tearDown(self): config.quit() def test_parse_response_1(self): parse = self.mod.acoustid.parse_acoustid_response release = parse(ACOUSTID_RESPONSE)[0] self.assertEqual(release.id, "14bb7304-b763-456b-a438-7bab619d41e3") self.assertEqual(release.sources, 1) self.assertEqual(release.all_sources, 7) tags = release.tags self.assertEqual(tags["title"], u'Merkw\xfcrdig/Unangenehm') self.assertEqual(tags["artist"], u'Kinderzimmer Productions') self.assertEqual(tags["date"], u'2002-01') self.assertEqual(tags["tracknumber"], u'7/15') self.assertEqual(tags["discnumber"], "") self.assertTrue("musicbrainz_albumid" in tags) def test_parse_response_2(self): parse = self.mod.acoustid.parse_acoustid_response release = parse(ACOUSTID_RESPONSE)[1] self.assertEqual(release.id, "ed90bff9-ab41-4669-8d44-13c78e678507") tags = release.tags self.assertEqual(tags["albumartist"], u"Kinderzimmer Productions") self.assertEqual(tags["album"], u'Wir sind da wo oben ist') self.assertTrue("musicbrainz_albumid" in tags) def test_parse_response_2_mb(self): parse = self.mod.acoustid.parse_acoustid_response release = parse(ACOUSTID_RESPONSE)[1] self.assertTrue("musicbrainz_albumid" in release.tags) self.assertEqual(release.sources, 6) self.assertEqual( release.tags["musicbrainz_trackid"], "bc970841-b7d9-415a-b7e2-645b1d263cc3") ACOUSTID_RESPONSE = { u'status': u'ok', u'results': [{u'recordings': [{u'releases': [{u'track_count': 15, u'title': u'Spex CD #15', u'country': u'DE', u'artists': [{u'id': u'89ad4ac3-39f7-470e-963a-56509c546377', u'name': u'Various \ Artists'}], u'date': {u'year': 2002, u'month': 1}, u'releaseevents': [{u'date': {u'year': 2002, u'month': 1}, u'country': u'DE'}], u'mediums': [{u'position': 1, u'tracks': [{u'position': 7, u'title': u'Merkw\xfcrdig/Unangenehm', u'id': u'7426320b-7646-3d06-bd5a-4762ecc0536b', u'artists': [{u'id': u'ad728059-6823-4f98-a283-0dac3fb79a91', u'name': u'Kinderzimmer Productions'}]}], u'track_count': 15, u'format': u'CD'}], u'medium_count': 1, u'id': u'14bb7304-b763-456b-a438-7bab619d41e3'}], u'title': u'Merkw\xfcrdig/Unangenehm', u'sources': 1, u'artists': [{u'id': u'ad728059-6823-4f98-a283-0dac3fb79a91', u'name': u'Kinderzimmer \ Productions'}], u'duration': 272, u'id': u'9104a525-40b2-40dc-83bf-c31c3d6d1861'}, {u'releases': [{u'track_count': 12, u'title': u'Wir sind da wo oben ist', u'country': u'DE', u'artists': [{u'id': u'ad728059-6823-4f98-a283-0dac3fb79a91', u'name': u'Kinderzimmer \ Productions'}], u'date': {u'year': 2002, u'day': 22, u'month': 2}, u'releaseevents': [{u'date': {u'year': 2002, u'day': 22, u'month': 2}, u'country': u'DE'}], u'mediums': [{u'position': 1, u'tracks': [{u'position': 11, u'title': u'Merkw\xfcrdig/unangenehm', u'id': u'2520fe8a-005b-3a18-a8e2-ba9bef6009fb', u'artists': [{u'joinphrase': u' feat. ', u'name': u'Kinderzimmer Productions', u'id': u'ad728059-6823-4f98-a283-0dac3fb79a91'}, {u'id': u'bf02bc50-251d-4a47-b5f9-ca462038ae8a', u'name': u'Tek Beton'}]}], u'track_count': 12, u'format': u'CD'}], u'medium_count': 1, u'id': u'ed90bff9-ab41-4669-8d44-13c78e678507'}], u'title': u'Merkw\xfcrdig/unangenehm', u'sources': 6, u'artists': [{u'joinphrase': u' \ feat. ', u'name': u'Kinderzimmer Productions', u'id': u'ad728059-6823-4f98-a283-0dac3fb79a91'}, {u'id': u'bf02bc50-251d-4a47-b5f9-ca462038ae8a', u'name': u'Tek Beton'}], u'duration': 272, u'id': u'bc970841-b7d9-415a-b7e2-645b1d263cc3'}], u'score': 1.0, u'id': u'f176baca-a4f7-4f39-906b-43136d9b3815'}]} ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/plugin/test_titlecase.py������������������������������������������������������0000644�0001750�0001750�00000002746�13112005742�021774� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter <reiter.christoph@gmail.com>, # 2012,2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from tests.plugin import PluginTestCase from quodlibet import config class TTitlecase(PluginTestCase): def setUp(self): globals().update(vars(self.modules["Title Case"])) config.init() self.plugin = self.plugins["Title Case"].cls def test_all_caps(self): self.plugin.config_set("allow_all_caps", True) p = self.plugin("", "") self.failUnlessEqual(p.activated("", "foo bar")[0][1], "Foo Bar") self.failUnlessEqual(p.activated("", "FOO BAR")[0][1], "FOO BAR") def test_no_all_caps(self): self.plugin.config_set("allow_all_caps", False) p = self.plugin("", "") self.failUnlessEqual(p.activated("", "foo bar")[0][1], "Foo Bar") self.failUnlessEqual(p.activated("", "FOO BAR")[0][1], "Foo Bar") def test_humanise(self): self.plugin.config_set("human_title_case", True) self.plugin.config_set("allow_all_caps", False) p = self.plugin("", "") self.failUnlessEqual(p.activated("", "foo bar")[0][1], "Foo Bar") self.failUnlessEqual(p.activated("", "FOO the bAR")[0][1], "Foo the Bar") def tearDown(self): config.quit() ��������������������������quodlibet-3.9.1/tests/plugin/test_rbimport.py�������������������������������������������������������0000644�0001750�0001750�00000004757�13112005742�021661� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import xml.sax from senf import fsn2uri from quodlibet.formats import AudioFile from tests.helper import temp_filename from quodlibet.library.libraries import SongFileLibrary from quodlibet.util.path import find_mount_point from . import PluginTestCase def get_example_xml(song_path, rating, lastplayed): song_uri = fsn2uri(song_path) mount_uri = fsn2uri(find_mount_point(song_path)) return (u"""\ <?xml version="1.0" standalone="yes"?> <rhythmdb version="1.9"> <entry type="song"> <title>Music Unknown 7 199 4799124 %s %s 1378717158 1339576187 1409855394 %d 1 191 %d 731881 audio/mpeg Unknown \ """ % (song_uri, mount_uri, lastplayed, rating)).encode("utf-8") class TRBImport(PluginTestCase): def setUp(self): self.mod = self.modules["rbimport"] def test(self): lib = SongFileLibrary() with temp_filename() as song_fn: song = AudioFile({"~filename": song_fn}) song.sanitize() lib.add([song]) with temp_filename() as xml_fn: with open(xml_fn, "wb") as h: x = get_example_xml(song("~filename"), 1, 1371802107) h.write(x) handler = self.mod.RBDBContentHandler(lib) xml.sax.parse(xml_fn, handler) self.assertEqual(song("~#rating"), 0.2) self.assertEqual(song("~#lastplayed"), 1371802107) self.assertEqual(song("~#playcount"), 1) with open(xml_fn, "wb") as h: x = get_example_xml(song("~filename"), 2, 1371802107 - 1) h.write(x) handler = self.mod.RBDBContentHandler(lib) xml.sax.parse(xml_fn, handler) self.assertEqual(song("~#rating"), 0.4) self.assertEqual(song("~#lastplayed"), 1371802107) quodlibet-3.9.1/tests/plugin/test_randomalbum.py0000644000175000017500000000677513112005742022326 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.util.collection import Album from quodlibet.formats import AudioFile from quodlibet import config from tests.plugin import PluginTestCase from quodlibet.util.dprint import print_d A1S1 = AudioFile( {'album': 'greatness', 'title': 'excellent', 'artist': 'fooman', '~#lastplayed': 1234, '~#rating': 0.75}) A1S2 = AudioFile( {'album': 'greatness', 'title': 'superlative', 'artist': 'fooman', '~#lastplayed': 1234, '~#rating': 1.0}) A1 = Album(A1S1) A1.songs = {A1S1, A1S2} A2S1 = AudioFile({'album': 'mediocrity', 'title': 'blah', 'artist': 'fooman', '~#lastplayed': 1234}) A2S2 = AudioFile({'album': 'mediocrity', 'title': 'meh', 'artist': 'fooman', '~#lastplayed': 1234}) A2 = Album(A2S1) A2.songs = {A2S1, A2S2} A3S1 = AudioFile( {'album': 'disappointment', 'title': 'shameful', 'artist': 'poorman', '~#lastplayed': 2345, '~#rating': 0.25}) A3S2 = AudioFile( {'album': 'disappointment', 'title': 'zero', 'artist': 'poorman', '~#lastplayed': 2345, '~#rating': 0.0}) A3S3 = AudioFile( {'album': 'disappointment', 'title': 'lame', 'artist': 'poorman', '~#lastplayed': 0, '~#rating': 0.25}) A3 = Album(A3S1) A3.songs = {A3S1, A3S2, A3S3} for song in [A1S1, A1S2, A2S1, A2S2, A3S1, A3S2, A3S3]: song["~#length"] = 100 class TRandomAlbum(PluginTestCase): """Some basic tests for the random album plugin algorithm""" WEIGHTS = {'rating': 0, 'added': 0, 'laststarted': 0, 'lastplayed': 0, 'length': 0, 'skipcount': 0, 'playcount': 0} def setUp(self): config.init() self.plugin = self.plugins["Random Album Playback"].cls() self.albums = [A1, A2, A3] def tearDown(self): config.quit() def get_winner(self, albums): print_d("Weights: %s " % self.plugin.weights) scores = self.plugin._score(albums) print_d("Scores: %s" % scores) return max(scores)[1] def test_score_rating(self): weights = self.plugin.weights = self.WEIGHTS.copy() weights['rating'] = 1 self.failUnlessEqual(A1, self.get_winner(self.albums)) def test_score_length(self): weights = self.plugin.weights = self.WEIGHTS.copy() weights['length'] = 1 self.failUnlessEqual(A3, self.get_winner(self.albums)) def test_score_lastplayed(self): weights = self.plugin.weights = self.WEIGHTS.copy() weights['lastplayed'] = 1 self.failUnlessEqual(A3, self.get_winner(self.albums)) def test_score_lastplayed_added(self): weights = self.plugin.weights = self.WEIGHTS.copy() weights['lastplayed'] = 1 # No data here weights['added'] = 1 self.failUnlessEqual(A3, self.get_winner(self.albums)) def test_score_mixed(self): print_d("Starting.") weights = self.plugin.weights = self.WEIGHTS.copy() weights['length'] = 1 weights['lastplayed'] = 2 weights['rating'] = 1 # A3 is #3 rating, #1 in lastplayed, #1 in length self.failUnlessEqual(A3, self.get_winner(self.albums)) weights['lastplayed'] = 1 weights['rating'] = 2 weights['length'] = 0.5 # A1 is #1 for Rating, #2 for lastplayed, #2 or 3 length self.failUnlessEqual(A1, self.get_winner(self.albums)) quodlibet-3.9.1/tests/test_util_i18n.py0000644000175000017500000000750213112005742020330 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import environ from tests import TestCase from .helper import preserve_environ, locale_numeric_conv from quodlibet.util.i18n import GlibTranslations, bcp47_to_language, \ set_i18n_envvars, fixup_i18n_envvars, osx_locale_id_to_lang, \ numeric_phrase, get_available_languages from quodlibet.compat import text_type class TGlibTranslations(TestCase): def setUp(self): self.t = GlibTranslations() def test_ugettext(self): t = self.t.ugettext("foo") self.assertEqual(t, "foo") self.assertTrue(isinstance(t, text_type)) def test_ungettext(self): t = self.t.ungettext("foo", "bar", 1) self.assertEqual(t, "foo") self.assertTrue(isinstance(t, text_type)) t = self.t.ungettext("foo", "bar", 2) self.assertEqual(t, "bar") self.assertTrue(isinstance(t, text_type)) def test_upgettext(self): t = self.t.upgettext("ctx", "foo") self.assertEqual(t, "foo") self.assertTrue(isinstance(t, text_type)) def test_unpgettext(self): t = self.t.unpgettext("ctx", "foo", "bar", 1) self.assertEqual(t, "foo") self.assertTrue(isinstance(t, text_type)) t = self.t.unpgettext("ctx", "foo", "bar", 2) self.assertEqual(t, "bar") self.assertTrue(isinstance(t, text_type)) class Tgettext(TestCase): def test_get_languages(self): assert isinstance(get_available_languages("quodlibet"), list) def test_bcp47(self): self.assertEqual(bcp47_to_language("zh-Hans"), "zh_CN") self.assertEqual(bcp47_to_language("pt-PT"), "pt_PT") self.assertEqual(bcp47_to_language("de"), "de") # ignore script self.assertEqual(bcp47_to_language("sr-Latn-CS"), "sr_CS") # unsupported, support something at least self.assertEqual(bcp47_to_language("zh-guoyu"), "zh") def test_set_envvars(self): with preserve_environ(): set_i18n_envvars() def test_osx_locale_id_to_lang(self): self.assertEqual(osx_locale_id_to_lang("de_DE"), "de_DE") self.assertEqual(osx_locale_id_to_lang("zh-Hans_TW"), "zh_TW") self.assertEqual(osx_locale_id_to_lang("zh-foo-bar_AT"), "zh_AT") def test_fixup_i18n_envvars(self): with preserve_environ(): environ["LANGUAGE"] = "en:de:en_FOO:nl" fixup_i18n_envvars() self.assertEqual(environ["LANGUAGE"], "en:C:de:en_FOO:C:nl") def test_numeric_phrase(self): actual = numeric_phrase("%d green bottle", "%d green bottles", 1) self.failUnlessEqual(actual, "1 green bottle") with locale_numeric_conv(): actual = numeric_phrase( "%d green bottle", "%d green bottles", 1234) self.failUnlessEqual(actual, "1,234 green bottles") def test_numeric_phrase_locales(self): with locale_numeric_conv(thousands_sep=" "): actual = numeric_phrase("%(bottles)d green bottle", "%(bottles)d green bottles", 1234, "bottles") self.failUnlessEqual(actual, "1 234 green bottles") def test_numeric_phrase_templated(self): actual = numeric_phrase("%(bottles)d green bottle", "%(bottles)d green bottles", 1, "bottles") self.failUnlessEqual(actual, "1 green bottle") with locale_numeric_conv(): actual = numeric_phrase("%(bottles)d green bottle", "%(bottles)d green bottles", 1234, "bottles") self.failUnlessEqual(actual, "1,234 green bottles") quodlibet-3.9.1/tests/test_qltk_quodlibetwindow.py0000644000175000017500000000162413112005742022766 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.quodlibetwindow import QuodLibetWindow, PlaybackErrorDialog from quodlibet import library from quodlibet import player from quodlibet import config class TQuodLibetWindow(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_window(self): lib = library.init() pl = player.init_player("nullbe", lib.librarian) window = QuodLibetWindow(lib, pl, headless=True) window.destroy() def test_playback_error_dialog(self): error = player.PlayerError(u'\xf6\xe4\xfc', u'\xf6\xe4\xfc') PlaybackErrorDialog(None, error) quodlibet-3.9.1/tests/test_formats__image.py0000644000175000017500000000550013112005742021464 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, get_data_path, mkstemp import os from quodlibet.formats import AudioFile, EmbeddedImage, APICType class TAPICType(TestCase): def test_basic(self): self.assertEqual(APICType.COVER_FRONT, 3) def test_sort_key(self): values = [ APICType.OTHER, APICType.COVER_FRONT, APICType.FILE_ICON, APICType.ARTIST, APICType.PUBLISHER_LOGOTYPE ] values.sort(key=APICType.sort_key, reverse=True) wanted = [ APICType.OTHER, APICType.FILE_ICON, APICType.PUBLISHER_LOGOTYPE, APICType.ARTIST, APICType.COVER_FRONT ] self.assertEqual(values, wanted) class TImageContainer(TestCase): def setUp(self): self.a = AudioFile() def test_default_get(self): self.assertFalse(self.a.get_primary_image()) def test_has_image(self): self.assertFalse(self.a.has_images) self.a["~picture"] = "y" self.assertTrue(self.a.has_images) self.a.has_images = False self.assertFalse(self.a.has_images) def test_default_can_change(self): self.assertFalse(self.a.can_change_images) class TEmbeddedImages(TestCase): def setUp(self): from gi.repository import GdkPixbuf h, self.filename = mkstemp() os.close(h) pb = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 150, 10) pb.savev(self.filename, "png", [], []) def tearDown(self): os.remove(self.filename) def test_repr(self): image = EmbeddedImage.from_path(self.filename) repr(image) def test_from_path(self): image = EmbeddedImage.from_path(self.filename) self.assertTrue(image) self.assertEqual(image.file.name, self.filename) self.assertEqual(image.mime_type, "image/png") self.assertEqual(image.width, 150) self.assertEqual(image.height, 10) self.assertEqual(image.color_depth, 8) def test_from_path_bogus(self): image = EmbeddedImage.from_path(self.filename + "nope") self.assertFalse(image) def test_not_an_image(self): path = get_data_path('test-2.wma') image = EmbeddedImage.from_path(path) self.assertFalse(image) def test_get_extensions(self): image = EmbeddedImage.from_path(self.filename) self.assertTrue("png" in image.extensions) def test_from_path_empty(self): h, empty = mkstemp() os.close(h) try: image = EmbeddedImage.from_path(empty) self.assertFalse(image) finally: os.remove(empty) quodlibet-3.9.1/tests/test_qltk_renamefiles.py0000644000175000017500000000615213112005742022041 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from tests import TestCase from senf import fsnative from quodlibet.qltk.renamefiles import StripDiacriticals, StripNonASCII, \ Lowercase, SpacesToUnderscores, StripWindowsIncompat from quodlibet.compat import text_type class TFilter(TestCase): def setUp(self): self.c = self.Kind() def tearDown(self): self.c.destroy() class TFilterMixin(object): def test_mix_empty(self): empty = fsnative(u"") v = self.c.filter(empty, u"") self.failUnlessEqual(v, u"") self.failUnless(isinstance(v, text_type)) def test_mix_safe(self): empty = fsnative(u"") safe = u"safe" self.failUnlessEqual(self.c.filter(empty, safe), safe) class TSpacesToUnderscores(TFilter, TFilterMixin): Kind = SpacesToUnderscores def test_conv(self): self.failUnlessEqual(self.c.filter("", "foo bar "), "foo_bar_") class TStripWindowsIncompat(TFilter, TFilterMixin): Kind = StripWindowsIncompat def test_conv(self): if os.name == "nt": self.failUnlessEqual( self.c.filter(u"", u'foo\\:*?;"<>|/'), u"foo\\_________") else: self.failUnlessEqual( self.c.filter("", 'foo\\:*?;"<>|/'), "foo_________/") def test_type(self): empty = fsnative(u"") self.assertTrue(isinstance(self.c.filter(empty, empty), fsnative)) def test_ends_with_dots_or_spaces(self): empty = fsnative(u"") v = self.c.filter(empty, fsnative(u'foo. . ')) self.failUnlessEqual(v, fsnative(u"foo. ._")) self.assertTrue(isinstance(v, fsnative)) if os.name == "nt": self.failUnlessEqual( self.c.filter(empty, u'foo. \\bar .'), u"foo._\\bar _") else: self.failUnlessEqual( self.c.filter(empty, u'foo. /bar .'), "foo._/bar _") class TStripDiacriticals(TFilter, TFilterMixin): Kind = StripDiacriticals def test_conv(self): empty = fsnative(u"") test = u"\u00c1 test" out = u"A test" v = self.c.filter(empty, test) self.failUnlessEqual(v, out) self.failUnless(isinstance(v, text_type)) class TStripNonASCII(TFilter, TFilterMixin): Kind = StripNonASCII def test_conv(self): empty = fsnative(u"") in_ = u"foo \u00c1 \u1234" out = u"foo _ _" v = self.c.filter(empty, in_) self.failUnlessEqual(v, out) self.failUnless(isinstance(v, text_type)) class TLowercase(TFilter, TFilterMixin): Kind = Lowercase def test_conv(self): empty = fsnative(u"") v = self.c.filter(empty, fsnative(u"foobar baz")) self.failUnlessEqual(v, fsnative(u"foobar baz")) self.failUnless(isinstance(v, fsnative)) v = self.c.filter(empty, fsnative(u"Foobar.BAZ")) self.failUnlessEqual(v, fsnative(u"foobar.baz")) self.failUnless(isinstance(v, fsnative)) quodlibet-3.9.1/tests/test_qltk_cover.py0000644000175000017500000000326713112005742020671 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk, GdkPixbuf, Gdk from tests import TestCase, mkstemp, init_fake_app, destroy_fake_app from quodlibet import config from quodlibet.formats import AudioFile from quodlibet.qltk.cover import (CoverImage, BigCenteredImage, ResizeImage, get_no_cover_pixbuf) class TCoverImage(TestCase): def setUp(self): config.init() init_fake_app() fd, self.fn = mkstemp() os.close(fd) pb = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 150, 10) pb.savev(self.fn, "png", [], []) def tearDown(self): destroy_fake_app() config.quit() os.remove(self.fn) def test_set_song(self): c = CoverImage() c.set_song(AudioFile({"~filename": "woo"})) event = Gdk.Event.new(Gdk.EventType.BUTTON_PRESS) event.type.button = 1 c.emit("button-press-event", event) c.destroy() def test_big_window(self): parent = Gtk.Window() w = BigCenteredImage("foobar", open(self.fn, "rb"), parent) w.destroy() def test_resize(self): w = ResizeImage(False) w.set_file(open(self.fn, "rb")) w.set_file(None) w.destroy() def test_no_cover(self): pb = get_no_cover_pixbuf(5, 10) self.assertEqual(pb.get_width(), 5) self.assertEqual(pb.get_height(), 5) pb = get_no_cover_pixbuf(10, 5) self.assertEqual(pb.get_width(), 5) self.assertEqual(pb.get_height(), 5) quodlibet-3.9.1/tests/test_library_librarians.py0000644000175000017500000001506113112005742022365 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from tests import TestCase from quodlibet.util import connect_obj from quodlibet.library import SongLibrarian from quodlibet.library.libraries import Library, SongFileLibrary from quodlibet.library.librarians import Librarian from tests.test_library_libraries import Fake, Frange, FakeSongFile, FSrange class TLibrarian(TestCase): Fake = Fake Frange = staticmethod(Frange) Librarian = Librarian Library = Library def setUp(self): self.librarian = self.Librarian() self.Library.librarian = self.librarian self.lib1 = self.Library("One") self.lib2 = self.Library("Two") self.added_1 = [] self.changed_1 = [] self.removed_1 = [] self.added_2 = [] self.changed_2 = [] self.removed_2 = [] self.added = [] self.changed = [] self.removed = [] connect_obj(self.lib1, 'added', list.extend, self.added_1) connect_obj(self.lib1, 'changed', list.extend, self.changed_1) connect_obj(self.lib1, 'removed', list.extend, self.removed_1) connect_obj(self.lib2, 'added', list.extend, self.added_2) connect_obj(self.lib2, 'changed', list.extend, self.changed_2) connect_obj(self.lib2, 'removed', list.extend, self.removed_2) connect_obj(self.librarian, 'added', list.extend, self.added) connect_obj(self.librarian, 'changed', list.extend, self.changed) connect_obj(self.librarian, 'removed', list.extend, self.removed) def test_libraries(self): self.failUnlessEqual(len(self.librarian.libraries), 2) self.failUnless(self.lib1 in self.librarian.libraries.values()) self.failUnless(self.lib2 in self.librarian.libraries.values()) def test_register_at_instantiation(self): try: lib = self.Library("Three") self.failUnlessEqual(len(self.librarian.libraries), 3) finally: lib.destroy() def test_register_later(self): try: lib = self.Library() self.failUnlessEqual(len(self.librarian.libraries), 2) self.librarian.register(lib, "Three") self.failUnlessEqual(len(self.librarian.libraries), 3) finally: lib.destroy() def test_register_exists(self): self.failUnlessRaises(ValueError, self.Library, "Two") def test_unregister(self): self.lib2.destroy() self.failUnlessEqual(len(self.librarian.libraries), 1) self.failUnless(self.lib1 in self.librarian.libraries.values()) self.failIf(self.lib2 in self.librarian.libraries.values()) self.lib1.destroy() self.failUnlessEqual(len(self.librarian.libraries), 0) def test_added(self): self.lib1.add(self.Frange(12)) self.lib2.add(self.Frange(12, 24)) self.failUnlessEqual(sorted(self.added), self.Frange(24)) def test_removed(self): self.lib1.add(self.Frange(12)) self.lib2.add(self.Frange(12, 24)) self.lib1.remove([self.Fake(9)]) self.lib2.remove([self.Fake(16)]) self.failUnlessEqual(self.removed, [self.Fake(9), self.Fake(16)]) def test_changed(self): self.lib1.add(self.Frange(12)) self.lib2.add(self.Frange(12, 24)) self.librarian.changed(self.Frange(6, 18)) while Gtk.events_pending(): Gtk.main_iteration() self.failUnlessEqual(sorted(self.changed), self.Frange(6, 18)) self.failUnlessEqual(self.changed_1, self.Frange(6, 12)) self.failUnlessEqual(self.changed_2, self.Frange(12, 18)) def test___getitem__(self): self.lib1.add(self.Frange(12)) self.lib2.add(self.Frange(12, 24)) self.failUnlessEqual(self.librarian[10], 10) new = self.Fake(100) new.key = 200 self.lib2.add([new]) self.failUnlessEqual(self.librarian[200], new) def test___getitem___not_present(self): self.lib1.add(self.Frange(12)) self.lib2.add(self.Frange(12, 24)) self.lib2.remove([self.Fake(16)]) self.failUnlessRaises(KeyError, self.librarian.__getitem__, 16) self.failUnlessRaises(KeyError, self.librarian.__getitem__, 99) def test___contains__(self): self.lib1.add(self.Frange(12)) self.lib2.add(self.Frange(12, 24)) new = self.Fake(100) new.key = 200 self.lib1.add([new]) for value in [1, 2, 15, 22, 200, new]: self.failUnless(value in self.librarian, "didn't find %d" % value) for value in [-1, 25, 50, 100]: self.failIf(value in self.librarian, "found %d" % value) def tearDown(self): self.Library.librarian = None self.lib1.destroy() self.lib2.destroy() self.librarian.destroy() class TSongLibrarian(TLibrarian): Fake = FakeSongFile Frange = staticmethod(FSrange) Library = SongFileLibrary Librarian = SongLibrarian def test_tag_values(self): self.lib1.add(self.Frange(0, 30, 2)) self.lib2.add(self.Frange(1, 30, 2)) del(self.added[:]) self.failUnlessEqual( sorted(self.librarian.tag_values(20)), list(range(20))) self.failUnlessEqual(sorted(self.librarian.tag_values(0)), []) self.failIf(self.changed or self.added or self.removed) def test_rename(self): new = self.Fake(10) new.key = 30 self.lib1.add([new]) self.lib2.add([new]) self.librarian.rename(new, 20) while Gtk.events_pending(): Gtk.main_iteration() self.failUnlessEqual(new.key, 20) self.failUnless(new in self.lib1) self.failUnless(new in self.lib2) self.failUnless(new.key in self.lib1) self.failUnless(new.key in self.lib2) self.failUnlessEqual(self.changed_1, [new]) self.failUnlessEqual(self.changed_2, [new]) self.failUnless(new in self.changed) def test_rename_changed(self): new = self.Fake(10) self.lib1.add([new]) changed = set() self.librarian.rename(new, 20, changed=changed) self.assertEqual(len(changed), 1) self.assertTrue(new in changed) def test_reload(self): new = self.Fake(10) self.lib1.add([new]) changed = set() removed = set() self.librarian.reload(new, changed=changed, removed=removed) self.assertTrue(new in changed) self.assertFalse(removed) quodlibet-3.9.1/tests/test_order.py0000644000175000017500000000342013112005742017622 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from collections import defaultdict from quodlibet.formats import AudioFile from quodlibet.order import OrderInOrder from quodlibet.order.reorder import OrderWeighted, OrderShuffle from quodlibet.order.repeat import OneSong from quodlibet.qltk.songmodel import PlaylistModel from tests import TestCase r0 = AudioFile({'~#rating': 0}) r1 = AudioFile({'~#rating': 0.33}) r2 = AudioFile({'~#rating': 0.66}) r3 = AudioFile({'~#rating': 1.0}) class TOrderWeighted(TestCase): def test_weighted(self): pl = PlaylistModel() pl.set([r3, r1, r2, r0]) order = OrderWeighted() scores = defaultdict(int) for i in range(500): order.reset(pl) cur = pl.current_iter for j in range(3, -1, -1): cur = order.next_explicit(pl, cur) scores[pl[cur][0]] += j self.failUnless(scores[r1] > scores[r0]) self.failUnless(scores[r2] > scores[r1]) self.failUnless(scores[r3] > scores[r2]) class TOrderShuffle(TestCase): def test_remaining(self): order = OrderShuffle() pl = PlaylistModel() pl.set([r3, r1, r2, r0]) cur = pl.current_iter for i in range(4, -1, -1): cur = order.next_explicit(pl, cur) self.failUnlessEqual(len(order.remaining(pl)), i) class TOrderOneSong(TestCase): def test_remaining(self): order = OneSong(OrderInOrder()) pl = PlaylistModel(OrderInOrder) pl.set([r0, r1]) for i in range(2): self.failUnlessEqual(order.next(pl, pl.current_iter), None) quodlibet-3.9.1/tests/test_util_config.py0000644000175000017500000002667213112005742021027 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from tests import TestCase, mkstemp from .helper import temp_filename from quodlibet.util.config import Config, Error, ConfigProxy from quodlibet.compat import PY2 class TConfig(TestCase): def test_set_default_only(self): conf = Config() self.assertRaises(Error, conf.set, "foo", "bar", 1) conf.defaults.add_section("foo") conf.set("foo", "bar", 1) def test_options(self): conf = Config() self.assertRaises(Error, conf.options, "foo") conf.defaults.add_section("foo") self.assertEqual(conf.options("foo"), []) conf.defaults.set("foo", "bar", 1) conf.defaults.set("foo", "blah", 1) conf.set("foo", "blah", 1) conf.set("foo", "quux", 1) self.assertEqual(conf.options("foo"), ['blah', 'quux', 'bar']) conf.defaults.clear() def test_options_no_default(self): conf = Config() conf.add_section("foo") self.assertEqual(conf.options("foo"), []) def test_has_section(self): conf = Config() self.assertFalse(conf.has_section("foo")) conf.defaults.add_section("foo") self.assertTrue(conf.has_section("foo")) conf.add_section("foo") conf.defaults.clear() self.assertTrue(conf.has_section("foo")) conf.clear() self.assertFalse(conf.has_section("foo")) def test_read_garbage_file(self): conf = Config() garbage = b"\xf1=\xab\xac" fd, filename = mkstemp() os.close(fd) with open(filename, "wb") as f: f.write(garbage) self.assertRaises(Error, conf.read, filename) os.remove(filename) def test_set(self): conf = Config() conf.add_section("foo") conf.set("foo", "bar", 1) self.failUnlessEqual(conf.get("foo", "bar"), "1") self.failUnlessEqual(conf.getint("foo", "bar"), 1) def test_setbytes(self): conf = Config() conf.add_section("foo") conf.setbytes("foo", "bar", b"\xff\xff") assert conf.getbytes("foo", "bar") == b"\xff\xff" def test_getbytes(self): conf = Config() assert conf.getbytes("foo", "bar", b"\xff") == b"\xff" def test_reset(self): conf = Config() conf.defaults.add_section("player") conf.defaults.set("player", "backend", "blah") conf.set("player", "backend", "foo") self.assertEqual(conf.get("player", "backend"), "foo") conf.reset("player", "backend") conf.defaults.set("player", "backend", "blah_new") self.assertEqual(conf.get("player", "backend"), "blah_new") def test_initial_after_set(self): conf = Config() conf.add_section("player") conf.set("player", "backend", "orig") conf.defaults.add_section("player") conf.defaults.set("player", "backend", "initial") self.assertEqual(conf.get("player", "backend"), "orig") self.assertEqual(conf.defaults.get("player", "backend"), "initial") conf.reset("player", "backend") self.assertEqual(conf.get("player", "backend"), "initial") def test_get_fallback_default(self): conf = Config() conf.defaults.add_section("get") self.assertRaises(Error, conf.get, "get", "bar") conf.defaults.set("get", "bar", 1) self.assertEqual(conf.get("get", "bar"), "1") conf.defaults.add_section("getboolean") self.assertRaises(Error, conf.getboolean, "getboolean", "bar") conf.defaults.set("getboolean", "bar", True) self.assertEqual(conf.getboolean("getboolean", "bar"), True) conf.defaults.add_section("getfloat") self.assertRaises(Error, conf.getfloat, "getfloat", "bar") conf.defaults.set("getfloat", "bar", 1.0) self.assertEqual(conf.getfloat("getfloat", "bar"), 1.0) conf.defaults.add_section("getint") self.assertRaises(Error, conf.getint, "getint", "bar") conf.defaults.set("getint", "bar", 42) self.assertEqual(conf.getint("getint", "bar"), 42) conf.defaults.add_section("getlist") self.assertRaises(Error, conf.getlist, "getlist", "bar") conf.defaults.setlist("getlist", "bar", [1, 2, 3]) self.assertEqual(conf.getlist("getlist", "bar"), ["1", "2", "3"]) def test_get(self): conf = Config() conf.add_section("foo") conf.set("foo", "int", "1") conf.set("foo", "float", "1.25") conf.set("foo", "str", "foobar") conf.set("foo", "bool", "True") self.failUnlessEqual(conf.getint("foo", "int"), 1) self.failUnlessEqual(conf.getfloat("foo", "float"), 1.25) self.failUnlessEqual(conf.get("foo", "str"), "foobar") self.failUnlessEqual(conf.getboolean("foo", "bool"), True) def test_get_invalid_data(self): conf = Config() conf.add_section("foo") conf.set("foo", "bla", "xx;,,;\n\n\naa") self.assertTrue(conf.getboolean("foo", "bla", True)) self.assertEqual(conf.getint("foo", "bla", 42), 42) self.assertEqual(conf.getfloat("foo", "bla", 1.5), 1.5) self.assertEqual(conf.getstringlist("foo", "bla", ["baz"]), ["baz"]) def test_getint_float(self): conf = Config() conf.add_section("foo") conf.set("foo", "float", "1.25") self.assertEqual(conf.getint("foo", "float"), 1) def test_get_default(self): conf = Config() conf.add_section("foo") self.failUnlessEqual(conf.getboolean("foo", "nothing", True), True) self.failUnlessEqual(conf.getint("foo", "nothing", 42), 42) self.failUnlessEqual(conf.getfloat("foo", "nothing", 42.42), 42.42) self.failUnlessEqual(conf.get("foo", "nothing", "foo"), "foo") def test_stringlist_simple(self): conf = Config() conf.add_section("foo") self.failIf(conf.get("foo", "bar", None)) vals = ["one", "two", "three"] conf.setstringlist("foo", "bar", vals) self.failUnlessEqual(conf.getstringlist("foo", "bar"), vals) def test_stringlist_mixed(self): conf = Config() conf.add_section("foo") self.failIf(conf.get("foo", "bar", None)) conf.setstringlist("foo", "bar", ["one", 2]) self.failUnlessEqual(conf.getstringlist("foo", "bar"), ["one", "2"]) def test_stringlist_quoting(self): conf = Config() conf.add_section("foo") self.failIf(conf.get("foo", "bar", None)) vals = ["foo's gold", "bar, \"best\" 'ever'", u"le goût d'œufs à Noël"] conf.setstringlist("foo", "bar", vals) self.failUnlessEqual(conf.getstringlist("foo", "bar"), vals) def test_stringlist_spaces(self): conf = Config() conf.add_section("foo") vals = [" ", " ", " \t ", " \n \n"] conf.setstringlist("foo", "bar", vals) self.failUnlessEqual(conf.getstringlist("foo", "bar"), vals) def test_stringlist_invalid_encoding(self): conf = Config() conf.add_section("foo") conf.setbytes("foo", "bar", b"\xff\xff\xff\xff\xff\xff") if PY2: self.assertRaises(Error, conf.getstringlist, "foo", "bar") def test_getlist(self): conf = Config() conf.add_section("foo") self.assertEqual(conf.getlist("foo", "bar", ["arg"]), ["arg"]) conf.set("foo", "bar", "abc,fo:o\\,bar") self.assertEqual(conf.getlist("foo", "bar"), ["abc", "fo:o,bar"]) self.assertEqual(conf.getlist("foo", "bar", sep=":"), ["abc,fo", "o\\,bar"]) conf.set("foo", "bar", "") self.assertEqual(conf.getlist("foo", "bar"), [""]) def test_setlist(self): conf = Config() conf.add_section("foo") conf.setlist("foo", "bar", [" a", ",", "c"]) self.assertEqual(conf.getlist("foo", "bar"), [" a", ",", "c"]) self.assertEqual(conf.get("foo", "bar"), " a,\\,,c") conf.setlist("foo", "bar", [" a", ",", "c"], sep=":") self.assertEqual(conf.get("foo", "bar"), " a:,:c") def test_versioning_disabled(self): # we don't pass a version, so versioning is disabled conf = Config() self.assertRaises(Error, conf.get_version) with temp_filename() as filename: conf.read(filename) self.assertRaises(Error, conf.register_upgrade_function, lambda: None) def test_versioning_upgrade_func(self): called = [] with temp_filename() as filename: conf = Config(version=0) def func(*args): called.append(args) conf.register_upgrade_function(func) self.assertRaises(Error, conf.get_version) conf.read(filename) self.assertEqual(conf.get_version(), -1) conf.register_upgrade_function(func) self.assertEqual([(conf, -1, 0), (conf, -1, 0)], called) def test_versioning(self): with temp_filename() as filename: conf = Config(version=41) conf.add_section("foo") conf.set("foo", "bar", "quux") conf.write(filename) self.assertRaises(Error, conf.get_version) # old was 41, we have 42, so upgrade def func(config, old, new): if old < 42: config.set("foo", "bar", "nope") conf = Config(version=42) conf.register_upgrade_function(func) conf.read(filename) self.assertEqual(conf.get_version(), 41) self.assertEqual(conf.get("foo", "bar"), "nope") # write doesn't change version conf.write(filename) self.assertEqual(conf.get_version(), 41) # but if we load again, it does conf.read(filename) self.assertEqual(conf.get_version(), 42) def test_upgrade_first_read(self): # don't run upgrade funcs if there is no config file yet with temp_filename() as filename: pass conf = Config(version=41) def func(*args): self.assertTrue(False) conf.register_upgrade_function(func) conf.read(filename) class TConfigProxy(TestCase): def setUp(self): conf = Config() conf.defaults.add_section("somesection") self.proxy = ConfigProxy(conf, "somesection") def test_getters_setters(self): self.proxy.set("foo", "bar") self.assertEqual(self.proxy.get("foo"), "bar") self.proxy.set("foo", 1.5) self.assertEqual(self.proxy.getfloat("foo"), 1.5) self.proxy.set("foo", 15) self.assertEqual(self.proxy.getint("foo"), 15) self.proxy.set("foo", False) self.assertEqual(self.proxy.getboolean("foo"), False) self.proxy.setbytes("foo", b"\xff") assert self.proxy.getbytes("foo") == b"\xff" def test_default(self): self.assertEqual(self.proxy.get("foo", "quux"), "quux") def test_get_initial(self): self.proxy.defaults.set("a", 3.0) self.assertEqual(self.proxy.defaults.get("a"), "3.0") def test_initial_and_reset(self): self.proxy.defaults.set("bla", "baz") self.assertEqual(self.proxy.get("bla"), "baz") self.proxy.set("bla", "nope") self.assertEqual(self.proxy.get("bla"), "nope") self.proxy.reset("bla") self.assertEqual(self.proxy.get("bla"), "baz") quodlibet-3.9.1/tests/test_qltk_entry.py0000644000175000017500000001046213112005742020707 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from .helper import visible from quodlibet.qltk.entry import ValidatingEntry, UndoEntry, Entry from quodlibet.query._query import Query from quodlibet.util import gdecode from quodlibet.compat import text_type import quodlibet.config class TEntry(TestCase): def test_set_max_width_chars(self): with visible(Entry()) as e: e.set_max_width_chars(4) nat1 = e.get_preferred_width()[1] e.set_max_width_chars(40) nat2 = e.get_preferred_width()[1] self.assertTrue(nat1 < nat2) class TValidatingEntry(TestCase): def setUp(self): quodlibet.config.init() self.entry = ValidatingEntry(Query.validator) def test_changed_simple(self): self.entry.set_text("valid") def test_changed_valid(self): self.entry.set_text("search = 'valid'") def test_changed_invalid(self): self.entry.set_text("=#invalid") def test_custom_validator(self): x = [] def valid(text): x.append(text) return text entry = ValidatingEntry(valid) entry.set_text("foo") self.assertEqual(x, [u"foo"]) self.assertTrue(isinstance(x[0], text_type)) def tearDown(self): self.entry.destroy() quodlibet.config.quit() class TUndoEntry(TestCase): def setUp(self): self.entry = UndoEntry() def __equal(self, value): entry_val = gdecode(self.entry.get_text()) self.failUnlessEqual(value, entry_val) def __insert(self, text, pos): self.entry.insert_text(text, position=pos) self.entry.set_position(pos + len(text)) def __delete_left(self, start, end): self.entry.set_position(start) self.entry.delete_text(start, end) self.entry.set_position(start) def __delete_right(self, start, end): self.entry.set_position(end) self.entry.delete_text(start, end) self.entry.set_position(start) def test_undo_reset(self): entry = self.entry self.__insert("foo", 0) self.__insert("bar", 0) entry.reset_undo() entry.undo() entry.undo() entry.undo() self.__equal("barfoo") def test_undo_norm(self): entry = self.entry self.__insert("foo", 0) entry.undo() self.__equal("") entry.redo() self.__equal("foo") def test_undo_space(self): entry = self.entry self.__insert("f", 0) self.__insert(" ", 1) self.__insert("o", 2) entry.undo() self.__equal("f ") entry.undo() self.__equal("") def test_undo_insert_end(self): entry = self.entry self.__insert("f", 0) self.__insert("o", 1) self.__insert("o", 2) entry.undo() self.__equal("") entry.redo() self.__equal("foo") def test_undo_insert_end_2(self): entry = self.entry self.__insert("f", 0) self.__insert("o", 1) self.__insert("o", 2) self.__insert("bar", 3) entry.undo() self.__equal("foo") entry.redo() self.__equal("foobar") def test_undo_insert_middle(self): entry = self.entry self.__insert("foo", 0) self.__insert("b", 1) self.__equal("fboo") entry.undo() self.__equal("foo") entry.undo() self.__equal("") def test_undo_delete(self): entry = self.entry self.__insert("foobar", 0) self.__delete_left(3, 4) self.__equal("fooar") self.__delete_right(1, 3) self.__equal("far") entry.undo() self.__equal("fooar") entry.undo() self.__equal("foobar") def test_undo_delete_space(self): entry = self.entry self.__insert("foob ar", 0) self.__delete_right(6, 7) self.__equal("foob a") self.__delete_right(5, 6) self.__delete_right(4, 5) self.__delete_right(3, 4) self.__delete_right(2, 3) entry.undo() self.__equal("foob") def tearDown(self): self.entry.destroy() quodlibet-3.9.1/tests/test_qltk_browser.py0000644000175000017500000000217013112005742021226 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.browser import LibraryBrowser from quodlibet.player.nullbe import NullPlayer import quodlibet.config class TLibraryBrowser(TestCase): def setUp(self): quodlibet.config.init() def test_ctr(self): from quodlibet.library import SongLibrary from quodlibet.browsers.albums import AlbumList win = LibraryBrowser(AlbumList, SongLibrary(), NullPlayer()) win.browser.emit("songs-selected", [], False) win.songlist.get_selection().emit("changed") win.destroy() def test_open(self): from quodlibet.browsers.search import SearchBar from quodlibet.library import SongLibrary widget = LibraryBrowser.open(SearchBar, SongLibrary(), NullPlayer()) self.assertTrue(widget) self.assertTrue(widget.get_visible()) widget.destroy() def tearDown(self): quodlibet.config.quit() quodlibet-3.9.1/tests/test_util_atomic.py0000644000175000017500000000466613112005742021035 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import stat import shutil from tests import TestCase, mkdtemp from quodlibet.util.atomic import atomic_save class Tatomic_save(TestCase): def setUp(self): self.dir = mkdtemp() def tearDown(self): shutil.rmtree(self.dir) def test_basic(self): filename = os.path.join(self.dir, "foo.txt") with open(filename, "wb") as fobj: fobj.write(b"nope") with atomic_save(filename, "wb") as fobj: fobj.write(b"foo") temp_name = fobj.name with open(filename, "rb") as fobj: self.assertEqual(fobj.read(), b"foo") self.assertFalse(os.path.exists(temp_name)) self.assertEqual(os.listdir(self.dir), [os.path.basename(filename)]) def test_non_exist(self): filename = os.path.join(self.dir, "foo.txt") with atomic_save(filename, "wb") as fobj: fobj.write(b"foo") temp_name = fobj.name with open(filename, "rb") as fobj: self.assertEqual(fobj.read(), b"foo") self.assertFalse(os.path.exists(temp_name)) self.assertEqual(os.listdir(self.dir), [os.path.basename(filename)]) def test_readonly(self): filename = os.path.join(self.dir, "foo.txt") with open(filename, "wb") as fobj: fobj.write(b"nope") dir_mode = os.stat(self.dir).st_mode file_mode = os.stat(filename).st_mode # setting directory permissions doesn't work under Windows, so make # the file read only, so the rename fails. On the other hand marking # the file read only doesn't make rename fail on unix, so make the # directory read only as well. os.chmod(filename, stat.S_IREAD) os.chmod(self.dir, stat.S_IREAD) try: with self.assertRaises(OSError): with atomic_save(filename, "wb") as fobj: fobj.write(b"foo") finally: # restore permissions os.chmod(self.dir, dir_mode) os.chmod(filename, file_mode) with open(filename, "rb") as fobj: self.assertEqual(fobj.read(), b"nope") self.assertEqual(os.listdir(self.dir), [os.path.basename(filename)]) quodlibet-3.9.1/tests/test_formats_mp4.py0000644000175000017500000001236113112005742020746 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import mutagen from quodlibet.compat import cBytesIO from tests import TestCase, get_data_path from quodlibet.formats.mp4 import MP4File from quodlibet.formats._image import EmbeddedImage import mutagen.mp4 from .helper import get_temp_copy class TMP4File(TestCase): def setUp(self): self.f = get_temp_copy(get_data_path('test.m4a')) self.song = MP4File(self.f) def tearDown(self): os.unlink(self.f) def _assert_tag_supported(self, tag, value="SomeTestValue"): self.song[tag] = value self.song.write() self.song.reload() self.assertEqual(self.song(tag), value) def test_format(self): self.assertEqual(self.song("~format"), "MPEG-4") def test_codec(self): self.assertEqual(self.song("~codec"), "AAC LC") def test_encoding(self): self.assertEqual(self.song("~encoding"), "FAAC 1.24") def test_mb_release_track_id(self): tag = mutagen.mp4.MP4(self.f) tag["----:com.apple.iTunes:MusicBrainz Release Track Id"] = [b"foo"] tag.save() song = MP4File(self.f) self.assertEqual(song("musicbrainz_releasetrackid"), u"foo") song["musicbrainz_releasetrackid"] = u"bla" song.write() tag = mutagen.mp4.MP4(self.f) self.assertEqual( tag["----:com.apple.iTunes:MusicBrainz Release Track Id"], [b"bla"]) def test_basic(self): self._assert_tag_supported("title") self._assert_tag_supported("artist") self._assert_tag_supported("albumartist") self._assert_tag_supported("album") self._assert_tag_supported("genre") self._assert_tag_supported("date") def test_basic_numeric(self): self._assert_tag_supported("tracknumber", "12") self._assert_tag_supported("discnumber", "1") self._assert_tag_supported("bpm", "132") def test_less_common_tags(self): self._assert_tag_supported("discsubtitle") self._assert_tag_supported("mood") self._assert_tag_supported("conductor") def test_replaygain_tags(self): self._assert_tag_supported('replaygain_album_gain', '-5.67 dB') self._assert_tag_supported('replaygain_album_peak', '1.0') self._assert_tag_supported('replaygain_track_gain', '-5.67 dB') self._assert_tag_supported('replaygain_track_peak', '1.0') self._assert_tag_supported('replaygain_reference_loudness', '89 dB') def test_length(self): self.assertAlmostEqual(self.song("~#length"), 3.7079, 3) def test_bitrate(self): self.assertEqual(self.song("~#bitrate"), 2) def test_channels(self): assert self.song("~#channels") == 2 def test_bpm_rounds(self): self.song["bpm"] = "98.76" self.song.write() self.song.reload() self.assertEqual(self.song("bpm"), "99") self.assertEqual(self.song("~#bpm"), 99) def test_empty_disk_trkn(self): for key in ["trkn", "disk"]: tag = mutagen.mp4.MP4(self.f) tag[key] = [] tag.save() tag = mutagen.mp4.MP4(self.f) assert tag[key] == [] self.song.reload() def test_write(self): self.song.write() def test_can_change(self): self.assertTrue(self.song.can_change("title")) self.assertFalse(self.song.can_change("foobar")) self.assertTrue("albumartist" in self.song.can_change()) def test_invalid(self): path = get_data_path('empty.xm') self.assertTrue(os.path.exists(path)) self.assertRaises(Exception, MP4File, path) def test_get_image(self): image = self.song.get_primary_image() self.assertTrue(image) self.assertEqual(image.mime_type, "image/png") def test_get_images(self): images = self.song.get_images() self.assertTrue(images and len(images) == 2) def test_get_image_non(self): tag = mutagen.mp4.MP4(self.f) tag.pop("covr", None) tag.save() self.song.reload() self.assertFalse(self.song.get_primary_image()) def test_clear_images(self): self.assertTrue(self.song.valid()) self.assertTrue(self.song.has_images) self.song.clear_images() self.assertFalse(self.song.has_images) self.assertFalse(self.song.get_primary_image()) tag = mutagen.mp4.MP4(self.f) self.assertFalse("covr" in tag) def test_set_image(self): self.assertTrue(self.song.has_images) fileobj = cBytesIO(b"foo") image = EmbeddedImage(fileobj, "image/jpeg", 10, 10, 8) self.song.set_image(image) image = self.song.get_primary_image() self.assertTrue(image) self.assertEqual(image.read(), b"foo") self.assertTrue(self.song.has_images) def test_can_change_images(self): self.assertTrue(self.song.can_change_images) def test_can_multiple_values(self): self.assertEqual(self.song.can_multiple_values(), []) self.assertFalse(self.song.can_multiple_values("artist")) quodlibet-3.9.1/tests/test_qltk_unity.py0000644000175000017500000000057013112005742020715 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk import unity class TUnityQuickList(TestCase): def test_init(self): unity.init("quodlibet.desktop", None) quodlibet-3.9.1/tests/test_formats_all.py0000644000175000017500000000461113112005742021015 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from tests import TestCase, get_data_path from quodlibet.formats import MusicFile, AudioFileError, EmbeddedImage from .helper import get_temp_copy FILES = [ get_data_path("empty.ogg"), get_data_path("empty.flac"), get_data_path("silence-44-s.mp3"), get_data_path("silence-44-s.mpc"), get_data_path("test.wma"), get_data_path("coverart.wv"), get_data_path("test.m4a"), get_data_path("empty.opus"), get_data_path("silence-44-s.tta"), get_data_path("empty.aac"), get_data_path("test.mid"), get_data_path("test.wav"), get_data_path("silence-44-s.ape"), get_data_path("test.vgm"), get_data_path("silence-44-s.spx"), get_data_path("test.spc"), ] class TAudioFileAllBase(object): FILE = None def setUp(self): self.filename = get_temp_copy(self.FILE) self.song = MusicFile(self.filename) def tearDown(self): try: os.remove(self.filename) except OSError: pass def test_clear_images_noent(self): os.remove(self.filename) self.assertRaises(AudioFileError, self.song.clear_images) def test_set_image_noent(self): os.remove(self.filename) image = EmbeddedImage(None, "image/png") self.assertRaises(AudioFileError, self.song.set_image, image) def test_get_primary_image_noent(self): os.remove(self.filename) self.assertTrue(self.song.get_primary_image() is None) def test_get_images_noent(self): os.remove(self.filename) self.assertEqual(self.song.get_images(), []) def test_write_noent(self): os.remove(self.filename) try: self.song.write() except AudioFileError: pass def test_load_noent(self): os.remove(self.filename) self.assertRaises(AudioFileError, type(self.song), self.filename) @classmethod def create_tests(cls): for i, file_ in enumerate(FILES): new_type = type(cls.__name__ + str(i), (cls, TestCase), {"FILE": file_}) assert new_type.__name__ not in globals() globals()[new_type.__name__] = new_type TAudioFileAllBase.create_tests() quodlibet-3.9.1/tests/test_qltk_session.py0000644000175000017500000000061513112005742021230 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk import session class TSession(TestCase): def test_session(self): session.init("quodlibet") quodlibet-3.9.1/tests/__init__.py0000644000175000017500000001724613112005742017222 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import unittest import tempfile import shutil import atexit import subprocess import locale from quodlibet.compat import PY3 try: import pytest except ImportError: module = "python3-pytest" if PY3 else "python-pytest" raise SystemExit("pytest missing: sudo apt-get install %s" % module) try: import xvfbwrapper except ImportError: xvfbwrapper = None import faulthandler from senf import fsnative, path2fsn, environ import quodlibet from quodlibet.util.path import xdg_get_cache_home from quodlibet import util from unittest import TestCase as OrigTestCase class TestCase(OrigTestCase): # silence deprec warnings about useless renames failUnless = OrigTestCase.assertTrue failIf = OrigTestCase.assertFalse failUnlessEqual = OrigTestCase.assertEqual failUnlessRaises = OrigTestCase.assertRaises failUnlessAlmostEqual = OrigTestCase.assertAlmostEqual failIfEqual = OrigTestCase.assertNotEqual failIfAlmostEqual = OrigTestCase.assertNotAlmostEqual skip = unittest.skip skipUnless = unittest.skipUnless skipIf = unittest.skipIf def is_ci(): """Guesses if this is being run in (Travis, maybe other) CI. See https://docs.travis-ci.com/user/environment-variables """ return os.environ.get('CI', "").lower() == 'true' _DATA_DIR = os.path.join(util.get_module_dir(), "data") assert isinstance(_DATA_DIR, fsnative) _TEMP_DIR = None def get_data_path(filename): return os.path.join(_DATA_DIR, path2fsn(filename)) def _wrap_tempfile(func): def wrap(*args, **kwargs): if kwargs.get("dir") is None and _TEMP_DIR is not None: assert isinstance(_TEMP_DIR, fsnative) kwargs["dir"] = _TEMP_DIR return func(*args, **kwargs) return wrap NamedTemporaryFile = _wrap_tempfile(tempfile.NamedTemporaryFile) def mkdtemp(*args, **kwargs): path = _wrap_tempfile(tempfile.mkdtemp)(*args, **kwargs) assert isinstance(path, fsnative) return path def mkstemp(*args, **kwargs): fd, filename = _wrap_tempfile(tempfile.mkstemp)(*args, **kwargs) assert isinstance(filename, fsnative) return (fd, filename) def init_fake_app(): from quodlibet import app from quodlibet import browsers from quodlibet.player.nullbe import NullPlayer from quodlibet.library.libraries import SongFileLibrary from quodlibet.library.librarians import SongLibrarian from quodlibet.qltk.quodlibetwindow import QuodLibetWindow, PlayerOptions from quodlibet.util.cover import CoverManager browsers.init() app.name = "Quod Libet" app.id = "quodlibet" app.player = NullPlayer() app.library = SongFileLibrary() app.library.librarian = SongLibrarian() app.cover_manager = CoverManager() app.window = QuodLibetWindow(app.library, app.player, headless=True) app.player_options = PlayerOptions(app.window) def destroy_fake_app(): from quodlibet import app app.window.destroy() app.library.destroy() app.library.librarian.destroy() app.player.destroy() app.window = app.library = app.player = app.name = app.id = None app.cover_manager = None def dbus_launch_user(): """Returns a dict with env vars, or an empty dict""" try: out = subprocess.check_output([ "dbus-daemon", "--session", "--fork", "--print-address=1", "--print-pid=1"]) except (subprocess.CalledProcessError, OSError): return {} else: if PY3: out = out.decode("utf-8") addr, pid = out.splitlines() return {"DBUS_SESSION_BUS_PID": pid, "DBUS_SESSION_BUS_ADDRESS": addr} def dbus_kill_user(info): """Kills the dbus daemon used for testing""" if not info: return try: subprocess.check_call( ["kill", "-9", info["DBUS_SESSION_BUS_PID"]]) except (subprocess.CalledProcessError, OSError): pass _BUS_INFO = None _VDISPLAY = None def init_test_environ(): """This needs to be called before any test can be run. Before exiting the process call exit_test_environ() to clean up any resources created. """ global _TEMP_DIR, _BUS_INFO, _VDISPLAY, _faulthandler_fobj # create a user dir in /tmp and set env vars _TEMP_DIR = tempfile.mkdtemp(prefix=fsnative(u"QL-TEST-")) # needed for dbus/dconf runtime_dir = tempfile.mkdtemp(prefix=fsnative(u"RUNTIME-"), dir=_TEMP_DIR) os.chmod(runtime_dir, 0o700) environ["XDG_RUNTIME_DIR"] = runtime_dir # force the old cache dir so that GStreamer can re-use the GstRegistry # cache file environ["XDG_CACHE_HOME"] = xdg_get_cache_home() # GStreamer will update the cache if the environment has changed # (in Gst.init()). Since it takes 0.5s here and doesn't add much, # disable it. If the registry cache is missing it will be created # despite this setting. environ["GST_REGISTRY_UPDATE"] = fsnative(u"no") # set HOME and remove all XDG vars that default to it if not set home_dir = tempfile.mkdtemp(prefix=fsnative(u"HOME-"), dir=_TEMP_DIR) environ["HOME"] = home_dir # set to new default environ.pop("XDG_DATA_HOME", None) if xvfbwrapper is not None: _VDISPLAY = xvfbwrapper.Xvfb() _VDISPLAY.start() _BUS_INFO = None if os.name != "nt" and "DBUS_SESSION_BUS_ADDRESS" in environ: _BUS_INFO = dbus_launch_user() environ.update(_BUS_INFO) quodlibet.init(no_translations=True, no_excepthook=True) quodlibet.app.name = "QL Tests" # to get around pytest silencing _faulthandler_fobj = os.fdopen(os.dup(sys.__stderr__.fileno()), "w") faulthandler.enable(_faulthandler_fobj) # try to make things the same in case a different locale is active. # LANG for gettext, setlocale for number formatting etc. # Note: setlocale has to be called after Gtk.init() try: if os.name != "nt": environ["LANG"] = locale.setlocale(locale.LC_ALL, "en_US.UTF-8") else: environ["LANG"] = "en_US.utf8" locale.setlocale(locale.LC_ALL, "english") except locale.Error: pass def exit_test_environ(): """Call after init_test_environ() and all tests are finished""" global _TEMP_DIR, _BUS_INFO, _VDISPLAY try: shutil.rmtree(_TEMP_DIR) except EnvironmentError: pass dbus_kill_user(_BUS_INFO) if _VDISPLAY is not None: _VDISPLAY.stop() _VDISPLAY = None # we have to do this on import so the tests work with other test runners # like py.test which don't know about out setup code and just import init_test_environ() atexit.register(exit_test_environ) def unit(run=[], suite=None, strict=False, exitfirst=False, network=True, quality=False): """Returns 0 if everything passed""" # make glib warnings fatal if strict: from gi.repository import GLib GLib.log_set_always_fatal( GLib.LogLevelFlags.LEVEL_CRITICAL | GLib.LogLevelFlags.LEVEL_ERROR | GLib.LogLevelFlags.LEVEL_WARNING) args = [] if run: args.append("-k") args.append(" or ".join(run)) skip_markers = [] if not quality: skip_markers.append("quality") if not network: skip_markers.append("network") if skip_markers: args.append("-m") args.append(" and ".join(["not %s" % m for m in skip_markers])) if exitfirst: args.append("-x") if suite is None: args.append("tests") else: args.append(os.path.join("tests", suite)) return pytest.main(args=args) quodlibet-3.9.1/tests/test_util_modulescanner.py0000644000175000017500000001377113112005742022415 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import imp import sys import shutil import py_compile from quodlibet.util.modulescanner import ModuleScanner from quodlibet.util.importhelper import get_importables, load_dir_modules from tests import TestCase, mkdtemp def py_compile_legacy(file_): # so we get the same result on py2/3 py_compile.compile(file_, cfile=file_ + "c") class TModuleScanner(TestCase): def setUp(self): self.d = mkdtemp("ql-mod") sys.modules["qlfake"] = imp.new_module("qlfake") def tearDown(self): del sys.modules["qlfake"] shutil.rmtree(self.d) def _create_mod(self, name, package=None): if package is not None: base = os.path.join(self.d, package) else: base = self.d return open(os.path.join(base, name), "wb") def _create_pkg(self, name): base = os.path.join(self.d, name) os.mkdir(base) return open(os.path.join(base, "__init__.py"), "wb") def test_importables(self): self.failUnlessEqual(list(get_importables(self.d)), []) h = self._create_mod("foo.py") h.close() self.failUnlessEqual(list(get_importables(self.d))[0], ("foo", h.name, [h.name])) def test_importables_ignore_init(self): h = self._create_mod("foo7.py") h.close() self._create_mod("__init__.py").close() self.failUnlessEqual(list(get_importables(self.d))[0], ("foo7", h.name, [h.name])) def test_importables_package(self): h = self._create_pkg("foobar") self.failUnlessEqual(list(get_importables(self.d))[0], ("foobar", os.path.dirname(h.name), [h.name])) h.close() def test_importables_package_deps(self): h = self._create_pkg("foobar3") h2 = self._create_mod("sub.py", "foobar3") name, path, deps = list(get_importables(self.d))[0] self.failUnlessEqual(name, "foobar3") self.failUnlessEqual(path, os.path.dirname(h.name)) self.failUnlessEqual(set(deps), {h.name, h2.name}) h2.close() h.close() def test_load_dir_modules(self): h = self._create_mod("x.py") h.write(b"test=42\n") h.close() mods = load_dir_modules(self.d, "qlfake") self.failUnlessEqual(len(mods), 1) self.failUnlessEqual(mods[0].test, 42) def test_load_dir_modules_compiled_ignore(self): h = self._create_mod("x1.py") h.write(b"test=24\n") h.close() py_compile_legacy(h.name) os.unlink(h.name) assert os.listdir(self.d) == ["x1.pyc"] mods = load_dir_modules(self.d, "qlfake") self.failUnlessEqual(len(mods), 0) def test_load_dir_modules_compiled(self): h = self._create_mod("x1.py") h.write(b"test=99\n") h.close() py_compile_legacy(h.name) os.unlink(h.name) assert os.listdir(self.d) == ["x1.pyc"] mods = load_dir_modules(self.d, "qlfake", load_compiled=True) self.failUnlessEqual(len(mods), 1) self.failUnlessEqual(mods[0].test, 99) def test_load_dir_modules_both(self): h = self._create_mod("x1.py") h.write(b"test=99\n") h.close() py_compile_legacy(h.name) self.failUnlessEqual(set(os.listdir(self.d)), {"x1.pyc", "x1.py"}) mods = load_dir_modules(self.d, "qlfake", load_compiled=True) self.failUnlessEqual(len(mods), 1) self.failUnlessEqual(mods[0].test, 99) def test_load_dir_modules_packages(self): h = self._create_pkg("somepkg2") h2 = self._create_mod("sub.py", "somepkg2") h2.write(b"test=456\n") h2.close() h.write(b"from .sub import *\nmain=654\n") h.close() mods = load_dir_modules(self.d, "qlfake") self.failUnlessEqual(len(mods), 1) self.failUnlessEqual(mods[0].test, 456) def test_scanner_add(self): self._create_mod("q1.py").close() self._create_mod("q2.py").close() s = ModuleScanner([self.d]) self.failIf(s.modules) removed, added = s.rescan() self.failIf(removed) self.failUnlessEqual(set(added), {"q1", "q2"}) self.failUnlessEqual(len(s.modules), 2) self.failUnlessEqual(len(s.failures), 0) def test_unimportable_package(self): self._create_pkg("_foobar").close() s = ModuleScanner([self.d]) self.failIf(s.modules) removed, added = s.rescan() self.failIf(added) self.failIf(removed) def test_scanner_remove(self): h = self._create_mod("q3.py") h.close() s = ModuleScanner([self.d]) s.rescan() os.remove(h.name) try: os.remove(h.name + "c") except OSError: pass removed, added = s.rescan() self.failIf(added) self.failUnlessEqual(removed, ["q3"]) self.failUnlessEqual(len(s.modules), 0) self.failUnlessEqual(len(s.failures), 0) def test_scanner_error(self): h = self._create_mod("q4.py") h.write(b"1syntaxerror\n") h.close() s = ModuleScanner([self.d]) removed, added = s.rescan() self.failIf(added) self.failIf(removed) self.failUnlessEqual(len(s.failures), 1) self.failUnless("q4" in s.failures) def test_scanner_add_package(self): h = self._create_pkg("somepkg") h2 = self._create_mod("sub.py", "somepkg") h2.write(b"test=123\n") h2.close() h.write(b"from .sub import *\nmain=321\n") h.close() s = ModuleScanner([self.d]) removed, added = s.rescan() self.failUnlessEqual(added, ["somepkg"]) self.failUnlessEqual(s.modules["somepkg"].module.main, 321) self.failUnlessEqual(s.modules["somepkg"].module.test, 123) quodlibet-3.9.1/tests/test_qltk___init__.py0000644000175000017500000001022213112005742021277 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from gi.repository import Gtk, Gdk from senf import fsnative, fsn2bytes from quodlibet.formats import AudioFile from quodlibet import qltk from quodlibet.qltk.pluginwin import PluginWindow from quodlibet import util from quodlibet.plugins import PluginManager from tests.gtk_helpers import MockSelData class TQltk(TestCase): def test_none(self): self.failUnless(qltk.get_top_parent(None) is None) def test_get_fg_highlight_color(self): widget = Gtk.Button() color = qltk.get_fg_highlight_color(widget) assert color is not None assert isinstance(color, Gdk.RGBA) def test_gtp(self): w = Gtk.Window() l = Gtk.Label() self.failUnlessEqual(qltk.get_top_parent(w), w) self.failUnlessEqual(qltk.get_top_parent(l), None) w.destroy() l.destroy() def test_gtp_packed(self): w = Gtk.Window() l = Gtk.Label() w.add(l) self.failUnlessEqual(qltk.get_top_parent(w), w) self.failUnlessEqual(qltk.get_top_parent(l), w) w.destroy() l.destroy() def test_is_accel(self): e = Gdk.Event.new(Gdk.EventType.KEY_RELEASE) self.failIf(qltk.is_accel(e, "a")) e = Gdk.Event.new(Gdk.EventType.KEY_PRESS) e.keyval = Gdk.KEY_Return e.state = Gdk.ModifierType.CONTROL_MASK self.failUnless(qltk.is_accel(e, "Return")) e = Gdk.Event.new(Gdk.EventType.KEY_PRESS) e.keyval = Gdk.KEY_Return e.state = Gdk.ModifierType.CONTROL_MASK self.failUnless(qltk.is_accel(e, "a", "Return")) self.failUnless(qltk.is_accel(e, "Return", "b")) self.failIf(qltk.is_accel(e, "a", "b")) def test_is_accel_invalid(self): e = Gdk.Event.new(Gdk.EventType.KEY_PRESS) with self.assertRaises(ValueError): qltk.is_accel(e, "NOPE") def test_is_accel_primary(self): e = Gdk.Event.new(Gdk.EventType.KEY_PRESS) e.keyval = Gdk.KEY_Return e.state = Gdk.ModifierType.CONTROL_MASK if not util.is_osx(): self.assertTrue(qltk.is_accel(e, "Return")) def test_popup_menu_under_widget(self): w = Gtk.Window() l = Gtk.Label() w.add(l) m = Gtk.Menu() m.attach_to_widget(l, None) w.show_all() qltk.popup_menu_under_widget(m, l, 1, 0) w.destroy() m.destroy() def test_redraw_all(self): qltk.redraw_all_toplevels() def test_get_menu_item_top_parent(self): item = Gtk.MenuItem() menu = Gtk.Menu() menu.append(item) window = Gtk.Window() menu.attach_to_widget(window, None) self.assertEqual(qltk.get_menu_item_top_parent(item), window) def test_get_menu_item_top_parent_sub(self): item = Gtk.MenuItem() menu = Gtk.Menu() menu.append(item) window = Gtk.Window() menu.attach_to_widget(window, None) sub = Gtk.Menu() sub_item = Gtk.MenuItem() sub.append(sub_item) item.set_submenu(sub) self.assertEqual(qltk.get_menu_item_top_parent(sub_item), window) def test_get_menu_item_top_parent_unattached(self): item = Gtk.MenuItem() menu = Gtk.Menu() menu.append(item) self.assertTrue(qltk.get_menu_item_top_parent(item) is None) def test_show_uri_with_existing_window(self): PluginManager.instance = PluginManager() # Force an instance PluginWindow() qltk.show_uri("foo", "quodlibet:///prefs/plugins/Squeezebox Output") # TODO: proper assertions, etc class Tselection_data(TestCase): def test_selection_set_songs(self): song = AudioFile() song["~filename"] = fsnative(u"foo") sel = MockSelData() qltk.selection_set_songs(sel, [song]) assert sel.data == fsn2bytes(fsnative(u"foo"), "utf-8") assert qltk.selection_get_filenames(sel) == [fsnative(u"foo")] quodlibet-3.9.1/tests/test_util_picklehelper.py0000644000175000017500000000372613112005742022224 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.compat import cBytesIO from quodlibet.util.picklehelper import pickle_load, pickle_loads, \ pickle_dumps, pickle_dump, PicklingError, UnpicklingError class A(dict): pass class B(dict): pass class Tpickle_load(TestCase): def test_pickle_load(self): data = {b"foo": u"bar", u"quux": b"baz"} for protocol in [0, 1, 2]: assert pickle_loads(pickle_dumps(data)) == data assert pickle_load(cBytesIO(pickle_dumps(data))) == data def test_invalid(self): with self.assertRaises(UnpicklingError): pickle_loads(b"") with self.assertRaises(UnpicklingError): pickle_load(cBytesIO(b"")) def test_switch_class(self): def lookup_func(base, module, name): if name == "A": return B return base(module, name) value = pickle_loads(pickle_dumps(A()), lookup_func) assert isinstance(value, B) def test_pickle_dumps(self): v = [u"foo", b"bar", 42] for protocol in [0, 1, 2]: assert pickle_loads(pickle_dumps(v)) == v def test_pickle_dumps_fail(self): class A(object): def __getstate__(self): raise Exception with self.assertRaises(PicklingError): pickle_dumps(A()) def test_pickle_dump(self): f = cBytesIO() pickle_dump(42, f) assert pickle_loads(f.getvalue()) == 42 def test_protocols(self): pickle_dumps(42, 0) pickle_dumps(42, 1) pickle_dumps(42, 2) with self.assertRaises(ValueError): pickle_dumps(42, -1) with self.assertRaises(ValueError): pickle_dumps(42, 3) quodlibet-3.9.1/tests/test_browsers_iradio.py0000644000175000017500000000635213112005742021713 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.library import SongLibrary from quodlibet.formats import AudioFile from quodlibet.browsers.iradio import InternetRadio, IRFile, QuestionBar import quodlibet.config quodlibet.config.RATINGS = quodlibet.config.HardCodedRatingsPrefs() class TQuestionBar(TestCase): def test_main(self): b = QuestionBar() self.assertFalse(b.get_visible()) class TInternetRadio(TestCase): def setUp(self): quodlibet.config.init() self.bar = InternetRadio(SongLibrary()) def test_can_filter(self): self.assertTrue(self.bar.can_filter("foo")) self.assertTrue(self.bar.can_filter_text()) def test_status_bar_text(self): self.assertEqual(self.bar.status_text(1), "1 station") self.assertEqual(self.bar.status_text(101, 123), "101 stations") def tearDown(self): self.bar.destroy() quodlibet.config.quit() class TIRFile(TestCase): def setUp(self): self.s = IRFile("http://foo.bar") def test_website(self): self.s["website"] = "abc" self.assertEqual(self.s.get("artist"), "abc") self.assertEqual(self.s("artist"), "abc") self.assertEqual(self.s.list("artist"), ["abc"]) def test_organisation(self): self.s["organization"] = "foo" self.assertEqual(self.s("title"), "foo") self.assertEqual(self.s.get("title"), "foo") def test_title_split_stream(self): self.assertFalse(self.s("artist")) self.s["title"] = "artist - title" self.s.multisong = False self.assertEqual(self.s("title"), "title") self.assertEqual(self.s.get("title"), "title") self.assertEqual(self.s("artist"), "artist") self.assertEqual(self.s.get("artist"), "artist") def test_title_split(self): self.assertTrue(self.s.multisong) self.s["title"] = "artist - title" self.assertEqual(self.s("title"), self.s["title"]) def test_format(self): self.assertEqual(self.s("~format"), self.s.format) self.s["audio-codec"] = "SomeCodec" self.assertTrue("SomeCodec" in self.s("~format")) self.assertTrue(self.s.format in self.s("~format")) def test_people(self): self.s["title"] = "artist - title" self.s.multisong = False self.assertEqual(self.s("~people"), "artist") self.assertEqual(self.s("~~people~foo"), "artist") def testcan_write(self): self.failUnless(self.s.can_change("title")) self.s.streamsong = True self.failIf(self.s.can_change("title")) def test_dump_to_file(self): self.s["title"] = "artist - title" self.s.multisong = False dump = self.s.to_dump() new = AudioFile() new.from_dump(dump) self.assertEqual(new["title"], "title") self.assertEqual(new["artist"], "artist") del self.s["title"] dump = self.s.to_dump() new = AudioFile() new.from_dump(dump) self.assertTrue("title" not in new) self.assertTrue("artist" not in new) quodlibet-3.9.1/tests/test_formats_wav.py0000644000175000017500000000244513112005742021045 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from tests import TestCase, get_data_path from quodlibet.formats.wav import WAVEFile from quodlibet.compat import text_type class TWAVEFile(TestCase): def setUp(self): self.song = WAVEFile(get_data_path('test.wav')) def test_title_tag(self): self.assertEqual(self.song["title"], "test") self.assertTrue(isinstance(self.song["title"], text_type)) def test_length(self): self.failUnlessAlmostEqual(self.song("~#length"), 0.227, 2) def test_channels(self): assert self.song("~#channels") == 1 def test_write(self): self.song.write() def test_can_change(self): self.failUnless(self.song.can_change("artist")) def test_invalid(self): path = get_data_path('empty.xm') self.failUnless(os.path.exists(path)) self.failUnlessRaises(Exception, WAVEFile, path) def test_format_codec(self): self.assertEqual(self.song("~format"), "WAVE") self.assertEqual(self.song("~codec"), "WAVE") self.assertEqual(self.song("~encoding"), "") quodlibet-3.9.1/tests/test_util_thumbnails.py0000644000175000017500000000727513112005742021726 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.util.path import mtime from tests import TestCase, NamedTemporaryFile, get_data_path from gi.repository import GdkPixbuf from senf import fsn2uri, fsnative import os try: import hashlib as hash except ImportError: import md5 as hash from quodlibet.util import thumbnails class TThumb(TestCase): def setUp(s): s.wide = GdkPixbuf.Pixbuf.new( GdkPixbuf.Colorspace.RGB, True, 8, 150, 10) s.high = GdkPixbuf.Pixbuf.new( GdkPixbuf.Colorspace.RGB, True, 8, 10, 100) s.small = GdkPixbuf.Pixbuf.new( GdkPixbuf.Colorspace.RGB, True, 8, 10, 20) s.filename = get_data_path("test.png") def tearDown(self): p1 = thumbnails.get_cache_info(self.filename, (10, 10))[0] p2 = thumbnails.get_cache_info(self.filename, (1000, 1000))[0] for path in [p1, p2]: try: os.remove(path) except OSError: pass def test_get_thumbnail_folder(self): path = thumbnails.get_thumbnail_folder() self.assertTrue(isinstance(path, fsnative)) def test_thumb_from_file(self): with open(self.filename, "rb") as h: thumb = thumbnails.get_thumbnail_from_file(h, (50, 60)) self.assertTrue(thumb) def test_thumb_from_file_temp(self): fn = NamedTemporaryFile() with open(self.filename, "rb") as h: fn.write(h.read()) fn.flush() fn.seek(0, 0) thumb = thumbnails.get_thumbnail_from_file(fn, (50, 60)) self.assertTrue(thumb) fn.close() def test_thumb_from_file_temp_partial(self): fn = NamedTemporaryFile() with open(self.filename, "rb") as h: fn.write(h.read(10)) fn.flush() fn.seek(0, 0) thumb = thumbnails.get_thumbnail_from_file(fn, (50, 60)) self.assertTrue(thumb is None) fn.close() def test_get_cache_info(self): p, s = thumbnails.get_cache_info(self.filename, (20, 20)) self.assertEqual(s, 128) self.assertTrue((os.sep + "normal" + os.sep) in p) p, s = thumbnails.get_cache_info(self.filename, (20, 300)) self.assertEqual(s, 256) self.assertTrue((os.sep + "large" + os.sep) in p) def test_recreate_broken_cache_file(self): thumb = thumbnails.get_thumbnail(self.filename, (50, 60)) self.assertTrue(thumb) path, size = thumbnails.get_cache_info(self.filename, (50, 60)) open(path, "wb").close() thumb = thumbnails.get_thumbnail(self.filename, (50, 60)) self.assertTrue(thumb) def test_thumb(s): thumb = thumbnails.get_thumbnail(s.filename, (50, 60)) #check for right scaling s.failUnless(thumb) s.failUnlessEqual((thumb.get_width(), thumb.get_height()), (50, 25)) #test the thumbnail filename uri = fsn2uri(s.filename) name = hash.md5(uri.encode("ascii")).hexdigest() + ".png" path = thumbnails.get_thumbnail_folder() path = os.path.join(path, "normal", name) s.failUnless(os.path.isfile(path)) #check for metadata thumb_pb = GdkPixbuf.Pixbuf.new_from_file(path) meta_mtime = thumb_pb.get_option("tEXt::Thumb::MTime") meta_uri = thumb_pb.get_option("tEXt::Thumb::URI") s.failUnlessEqual(int(meta_mtime), int(mtime(s.filename))) s.failUnlessEqual(meta_uri, uri) #check rights if os.name != "nt": s.failUnlessEqual(os.stat(path).st_mode, 33152) quodlibet-3.9.1/tests/test_po.py0000644000175000017500000002520513115500547017140 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, skipUnless from tests.helper import ListWithUnused as L import os import re import glob try: import polib except ImportError: polib = None import quodlibet from quodlibet.util.path import iscommand from quodlibet.util.string.titlecase import human_title from gdist import gettextutil PODIR = os.path.join(os.path.dirname(quodlibet.__path__[0]), "po") PODIR_WRITEABLE = os.access(PODIR, os.W_OK) class MissingTranslationsException(Exception): def __init__(self, missing): msg = ("No reference in POTFILES.in to: " + ", ".join(missing)) super(MissingTranslationsException, self).__init__(msg) class TPOTFILESIN(TestCase): def test_missing(self): try: gettextutil.check_version() except gettextutil.GettextError: return results = gettextutil.get_missing(PODIR, "quodlibet") if results: raise MissingTranslationsException(results) @skipUnless(polib, "polib not found") @skipUnless(PODIR_WRITEABLE, "intltool-update requires a writeable po dir :(") class TPot(TestCase): @classmethod def setUpClass(cls): gettextutil.check_version() pot_path = gettextutil.update_pot(PODIR, "quodlibet") cls.pot = polib.pofile(pot_path) def conclude(self, fails, reason): if fails: def format_occurrences(e): return ', '.join('%s:%s' % o for o in e.occurrences) messages = [ "'%s' (%s)" % (e.msgid, format_occurrences(e)) for e in fails ] self.fail( "One or more messages did not pass (%s):\n" % reason + '\n'.join(messages)) def test_multiple_format_placeholders(self): fails = [] reg = re.compile(r"((? 1: fails.append(entry) self.conclude(fails, "uses multiple non-named format placeholders") def test_label_capitals(self): """ Check that various input labels (strings ending with a ':') are written with proper capitalization. Examples: Dough amount: - ok Salt: - ok Channel eggs through the Internet: - ok All Caps: - title case can't be used for labels Caveats: The test doesn't yet know which words are usually capitalized, so: Send to Kitchen: - will erroneously pass the test """ fails = [] ok_labels = L('Local _IP:', 'Songs with MBIDs:') for entry in self.pot: if not entry.msgid.endswith(':'): continue if ' ' not in entry.msgid.strip(): continue if entry.msgid == human_title(entry.msgid): if entry.msgid not in ok_labels: fails.append(entry) ok_labels.check_unused() self.conclude(fails, "title case used for a label") def test_whitespace(self): """ Check that there are no more than 1 space character ' ' in a row. Examples: "Quod Libet" - ok "Quod Libet" - extra whitespace "Traceback:\n " - ok Caveats: linebreaks and presumably other special characters in the messages are stored as literals, so when matching them with regular expressions, don't forget to use double backslash. """ fails = [] regex = re.compile(r'[^\\n] {2,}') for entry in self.pot: if regex.findall(entry.msgid): fails.append(entry) self.conclude(fails, "extra whitespace") def test_punctuation(self): """ Check that punctuation marks are used properly. Examples: Hello! - ok Hello ! - extra whitespace HH:MM:SS - ok example.com - ok Open .tags file - ok Hello,world - missing whitespace """ fails = [] regex = re.compile(r'\s[.,:;!?](?![a-z])|' r'[a-z](?.*", entry.msgid): fails.append(entry) self.conclude(fails, "contains markup, remove it!") def test_terms_letter_case(self): """ Check that some words are always written with a specific combination of lower and upper case letters. Examples: MusicBrainz - ok musicbrainz - lower case letters musicbrainz_track_id - ok musicbrainz.org - ok """ terms = ( 'AcoustID', 'D-Bus', 'Ex Falso', 'GNOME', 'GStreamer', 'Internet', 'iPod', 'Last.fm', 'MusicBrainz', 'Python', 'Quod Libet', 'Replay Gain', 'ReplayGain', 'Squeezebox', 'Wikipedia') ok_suffixes = ('_', '.org') fails = [] for entry in self.pot: for term in terms: if term.lower() not in entry.msgid.lower(): continue i = entry.msgid.lower().find(term.lower()) if entry.msgid[i + len(term):].startswith(ok_suffixes): continue if term not in entry.msgid: fails.append(entry) self.conclude(fails, "incorrect letter case for a term") def test_terms_spelling(self): """ Check if some words are misspelled. Some of the words are already checked in test_terms_letter_case, but some misspellings include not only letter case. Examples: Last.fm - ok LastFM - common misspelling """ incorrect_terms = ('Acoustid.org', 'ExFalso', 'LastFM', 'QuodLibet') fails = [] for entry in self.pot: for term in incorrect_terms: if term in entry.msgid: fails.append(entry) self.conclude(fails, "incorrect spelling for a term") def test_leading_and_trailing_spaces(self): fails = [] for entry in self.pot: if entry.msgid.strip() != entry.msgid: fails.append(entry) self.conclude(fails, "leading or trailing spaces") class POMixin(object): def test_pos(self): if not iscommand("msgfmt"): return po_path = os.path.join(PODIR, "%s.po" % self.lang) self.failIf(os.system( "msgfmt -c -o /dev/null %s > /dev/null" % po_path)) try: os.unlink("messages.mo") except OSError: pass def test_gtranslator_blows_goats(self): for line in open(os.path.join(PODIR, "%s.po" % self.lang), "rb"): if line.strip().startswith(b"#"): continue self.failIf(b"\xc2\xb7" in line, "Broken GTranslator copy/paste in %s:\n%r" % ( self.lang, line)) def test_gtk_stock_items(self): for line in open(os.path.join(PODIR, "%s.po" % self.lang), "rb"): if line.strip().startswith(b'msgstr "gtk-'): parts = line.strip().split() value = parts[1].strip('"')[4:] self.failIf(value and value not in [ b'media-next', b'media-previous', b'media-play', b'media-pause'], "Invalid stock translation in %s\n%s" % ( self.lang, line)) def conclude(self, fails, reason): if fails: def format_occurrences(e): occurences = [(self.lang + ".po", e.linenum)] occurences += e.occurrences return ', '.join('%s:%s' % o for o in occurences) messages = [ '"%s" - "%s" (%s)' % (e.msgid, e.msgstr, format_occurrences(e)) for e in fails ] self.fail( "One or more messages did not pass (%s).\n%s" % ( reason, "\n".join(messages))) def test_original_punctuation_present(self): if polib is None: return LANGUAGES_TO_CHECK = ('ru', 'de') if self.lang not in LANGUAGES_TO_CHECK: return fails = [] # In some languages, for example Chinese and Japanese, it's usual to # put accelerators separately, on the end of the string in parentheses, # so the test needs to strip that part before checking the endings. par = re.compile(r' ?\(_\w\)$') for entry in polib.pofile(os.path.join(PODIR, "%s.po" % self.lang)): if not entry.msgstr or entry.obsolete or 'fuzzy' in entry.flags: continue # Possible endings for the strings. Make sure to put longer # endings before shorter ones, for example: '...', '.' # otherwise this pair: 'a...', 'b..' will pass the test. ends = [(':', u':'), u'…', '...', ('.', u'。'), ' '] # First find the appropriate ending of msgid for end in ends: if entry.msgid.endswith(end): break else: continue # ... then check that msgstr ends with it as as well if not entry.msgstr.endswith(end): matches = par.findall(entry.msgstr) if matches and entry.msgstr[:-len(matches[0])].endswith(end): pass else: fails.append(entry) self.conclude(fails, "ending punctuation missing") for fn in glob.glob(os.path.join(PODIR, "*.po")): lang = os.path.basename(fn)[:-3] testcase = type('PO.' + lang, (TestCase, POMixin), {}) testcase.lang = lang globals()['PO.' + lang] = testcase quodlibet-3.9.1/tests/test_qltk_ccb.py0000644000175000017500000000472013112005742020275 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from tests import TestCase from quodlibet import config from quodlibet.qltk.ccb import ConfigCheckButton, ConfigCheckMenuItem class TConfigCheckButton(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_toggle(self): config.set("memory", "bar", "on") c = ConfigCheckButton("dummy", "memory", "bar") c.set_active(True) self.failUnless(config.getboolean("memory", "bar") and c.get_active()) c.set_active(False) while Gtk.events_pending(): Gtk.main_iteration() self.failIf(config.getboolean("memory", "bar") or c.get_active()) def test_populate(self): # Assert that active state works config.set("memory", "bar", "on") c = ConfigCheckButton("dummy", "memory", "bar", populate=True) while Gtk.events_pending(): Gtk.main_iteration() self.failUnless(c.get_active()) # ...and inactive config.set("memory", "bar", "off") c = ConfigCheckButton("dummy", "memory", "bar", populate=True) while Gtk.events_pending(): Gtk.main_iteration() self.failIf(c.get_active()) class TConfigCheckMenuItem(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_toggle(self): config.set("memory", "bar", "on") c = ConfigCheckMenuItem("dummy", "memory", "bar") c.set_active(True) self.failUnless(config.getboolean("memory", "bar") and c.get_active()) c.set_active(False) while Gtk.events_pending(): Gtk.main_iteration() self.failIf(config.getboolean("memory", "bar") or c.get_active()) def test_populate(self): # Assert that active state works config.set("memory", "bar", "on") c = ConfigCheckMenuItem("dummy", "memory", "bar", populate=True) while Gtk.events_pending(): Gtk.main_iteration() self.failUnless(c.get_active()) # ...and inactive config.set("memory", "bar", "off") c = ConfigCheckMenuItem("dummy", "memory", "bar", populate=True) while Gtk.events_pending(): Gtk.main_iteration() self.failIf(c.get_active()) quodlibet-3.9.1/tests/test_qltk_chooser.py0000644000175000017500000000441613112005742021212 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. from gi.repository import Gtk from senf import fsnative, getcwd from quodlibet.qltk.chooser import choose_files, get_current_dir, \ set_current_dir, choose_folders, create_chooser_filter, \ choose_target_file, choose_target_folder, with_response from quodlibet.qltk import gtk_version from . import TestCase, skipIf @skipIf(gtk_version < (3, 16, 0), "crashy on older gtk+") class Tchooser(TestCase): def test_choose_files(self): w = Gtk.Window() with with_response(Gtk.ResponseType.CANCEL): assert choose_files(w, u"title", u"action") == [] def test_choose_folders(self): w = Gtk.Window() with with_response(Gtk.ResponseType.CANCEL): assert choose_folders(w, u"title", u"action") == [] def test_choose_filter(self): cf = create_chooser_filter(u"filter", ["*.txt"]) assert isinstance(cf, Gtk.FileFilter) assert cf.get_name() == u"filter" w = Gtk.Window() with with_response(Gtk.ResponseType.CANCEL): assert choose_files(w, u"title", u"action", cf) == [] def test_choose_target_file(self): w = Gtk.Window() with with_response(Gtk.ResponseType.CANCEL): assert choose_target_file(w, u"title", u"action") is None with with_response(Gtk.ResponseType.CANCEL): assert choose_target_file( w, u"title", u"action", u"example") is None def test_choose_target_folder(self): w = Gtk.Window() with with_response(Gtk.ResponseType.CANCEL): assert choose_target_folder(w, u"title", u"action") is None with with_response(Gtk.ResponseType.CANCEL): assert choose_target_folder( w, u"title", u"action", u"example") is None def test_get_current_dir(self): path = get_current_dir() assert isinstance(path, fsnative) def test_set_current_dir(self): set_current_dir(fsnative(u".")) assert get_current_dir() == getcwd() quodlibet-3.9.1/tests/test_qltk_models.py0000644000175000017500000003225313112005742021033 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from gi.repository import Gtk from quodlibet.qltk.models import ObjectStore, ObjectModelFilter from quodlibet.qltk.models import ObjectModelSort, ObjectTreeStore from quodlibet.compat import cmp, xrange class _TObjectStoreMixin(object): Store = None def test_append(self): m = self.Store() for i in range(10): m.append(row=[i]) self.failUnlessEqual([r[0] for r in m], list(range(10))) def test_column_count(self): m = self.Store() self.failUnlessEqual(m.get_n_columns(), 1) def test_insert(self): m = self.Store() for i in reversed(range(10)): m.insert(0, row=[i]) self.failUnlessEqual([r[0] for r in m], list(range(10))) def test_prepend(self): m = self.Store() for i in reversed(range(10)): m.prepend(row=[i]) self.failUnlessEqual([r[0] for r in m], list(range(10))) def test_insert_before(self): m = self.Store() iter_ = m.append(row=[1]) new_iter = m.insert_before(iter_, [2]) self.failUnlessEqual(m.get_value(new_iter, 0), 2) self.failUnlessEqual([2, 1], [r[0] for r in m]) def test_insert_before_noiter(self): m = self.Store() m.append(row=[1]) m.insert_before(None, [2]) self.failUnlessEqual([r[0] for r in m], [1, 2]) def test_insert_after(self): m = self.Store() iter_ = m.append(row=[1]) new_iter = m.insert_after(iter_, [2]) self.failUnlessEqual(m.get_value(new_iter, 0), 2) self.failUnlessEqual([1, 2], [r[0] for r in m]) def test_insert_after_noiter(self): m = self.Store() m.append(row=[1]) m.insert_after(None, [2]) self.failUnlessEqual([r[0] for r in m], [2, 1]) def test_allow_nonatomic(self): m = self.Store() m.ATOMIC = False self.failUnless(m.insert(0)) self.failUnless(m.prepend()) self.failUnless(m.append()) self.failUnless(m.insert_before(None)) self.failUnless(m.insert_after(None)) class TOrigObjectStore(TestCase, _TObjectStoreMixin): Store = lambda *x: Gtk.ListStore(object) class TObjectStore(TestCase, _TObjectStoreMixin): Store = ObjectStore def test_validate(self): self.failUnlessRaises(ValueError, ObjectStore, int) ObjectStore() ObjectStore(object) self.failUnlessRaises(ValueError, ObjectStore, object, object) def test_iter_path_changed(self): m = ObjectStore() def handler(model, path, iter_, result): result[0] += 1 result = [0] m.connect("row-changed", handler, result) m.append([object()]) iter_ = m.get_iter_first() m.iter_changed(iter_) self.assertEqual(result[0], 1) m.path_changed(m.get_path(iter_)) self.assertEqual(result[0], 2) def test_append_many(self): m = ObjectStore() m.append_many(range(10)) self.failUnlessEqual([r[0] for r in m], list(range(10))) def test_append_many_set(self): m = ObjectStore() m.append_many(set()) m.append_many(set(range(10))) self.failUnlessEqual({r[0] for r in m}, set(range(10))) def test_iter_append_many(self): m = ObjectStore() iters = list(m.iter_append_many(range(10))) self.failUnlessEqual([r[0] for r in m], list(range(10))) values = [m.get_value(i) for i in iters] self.failUnlessEqual(values, list(range(10))) def test_iter_append_many_iterable_int(self): m = ObjectStore() for x in m.iter_append_many((i for i in xrange(10))): pass self.failUnlessEqual([r[0] for r in m], list(range(10))) def test_iter_append_many_iterable_object(self): objects = [object() for i in xrange(10)] m = ObjectStore() for x in m.iter_append_many((i for i in objects)): pass self.failUnlessEqual([r[0] for r in m], objects) def test_iter_append_many_empty(self): m = ObjectStore() for x in m.iter_append_many([]): pass for x in m.iter_append_many(iter([])): pass def test_insert_many(self): m = ObjectStore() m.append(row=[42]) m.append(row=[24]) m.insert_many(1, range(10)) self.failUnlessEqual([r[0] for r in m], [42] + list(range(10)) + [24]) def test_insert_many_append(self): m = ObjectStore() m.insert_many(-1, range(10)) self.failUnlessEqual([r[0] for r in m], list(range(10))) m = ObjectStore() m.insert_many(99, range(10)) self.failUnlessEqual([r[0] for r in m], list(range(10))) def test_itervalues(self): m = ObjectStore() m.insert_many(0, range(10)) self.failUnlessEqual(list(range(10)), list(m.itervalues())) def test_itervalues_empty(self): m = ObjectStore() self.assertEqual(list(m.itervalues()), []) def test_iterrows(self): m = ObjectStore() m.insert_many(0, range(10)) for iter_, value in m.iterrows(): self.failUnlessEqual(m.get_value(iter_), value) def test_iterrows_empty(self): m = ObjectStore() self.assertEqual(list(m.iterrows()), []) def test_is_empty(self): m = ObjectStore() self.assertTrue(m.is_empty()) iter_ = m.append(row=[1]) self.assertFalse(m.is_empty()) m.remove(iter_) self.assertTrue(m.is_empty()) def test_nonatomic(self): m = ObjectStore() self.assertRaises(AssertionError, m.append) self.assertRaises(AssertionError, m.insert, 0) self.assertRaises(AssertionError, m.prepend) self.assertRaises(AssertionError, m.insert_before, None) self.assertRaises(AssertionError, m.insert_after, None) def test_signal_count(self): m = ObjectStore() def handler(model, path, iter_, result): result[0] += 1 inserted = [0] m.connect("row-inserted", handler, inserted) changed = [0] m.connect("row-changed", handler, changed) m.append([1]) m.prepend([8]) m.insert(0, [1]) m.insert_before(None, [1]) m.insert_after(None, [1]) m.insert_many(0, [1, 2, 3]) m.append_many([1, 2, 3]) list(m.iter_append_many([1, 2, 3])) list(m.iter_append_many(xrange(3))) self.assertEqual(changed[0], 0) self.assertEqual(inserted[0], len(m)) def test__sort_on_value(self): m = ObjectStore() iterBob = m.append(row=["bob"]) iterAlice = m.append(row=["alice"]) m.append(row=["charlie"]) result = ObjectStore._sort_on_value(m, iterAlice, iterBob, None) self.assertEqual(result, cmp("alice", "bob")) class _TObjectTreeStoreMixin(object): Store = None def test_column_count(self): m = self.Store() self.failUnlessEqual(m.get_n_columns(), 1) def test_append_int(self): m = self.Store() m.append(None, row=[1]) m.append(None, row=[2]) self.failUnlessEqual([r[0] for r in m], [1, 2]) def test_append_obj(self): m = self.Store() obj = object() obj2 = object() m.append(None, row=[obj]) m.append(None, row=[obj2]) self.failUnlessEqual([r[0] for r in m], [obj, obj2]) def test_insert_after(self): m = self.Store() iter_ = m.append(None, row=[1]) new_iter = m.insert_after(None, iter_, [2]) self.failUnlessEqual(m.get_value(new_iter, 0), 2) self.failUnlessEqual([1, 2], [r[0] for r in m]) def test_insert_after_noroot(self): m = self.Store() iter_ = m.append(None, row=[1]) iter2_ = m.append(iter_, row=[2]) new_iter = m.insert_after(iter_, iter2_, [3]) self.failUnlessEqual(m.get_value(new_iter, 0), 3) self.failUnlessEqual([1], [r[0] for r in m]) self.failUnlessEqual([2, 3], list(r[0] for r in m[0].iterchildren())) def test_insert_after_noiter(self): m = self.Store() m.append(None, row=[1]) m.insert_after(None, None, [2]) self.failUnlessEqual([r[0] for r in m], [2, 1]) def test_insert_before(self): m = self.Store() iter_ = m.append(None, row=[1]) new_iter = m.insert_before(None, iter_, [2]) self.failUnlessEqual(m.get_value(new_iter, 0), 2) self.failUnlessEqual([2, 1], [r[0] for r in m]) def test_insert_before_noroot(self): m = self.Store() iter_ = m.append(None, row=[1]) iter2_ = m.append(iter_, row=[2]) new_iter = m.insert_before(iter_, iter2_, [3]) self.failUnlessEqual(m.get_value(new_iter, 0), 3) self.failUnlessEqual([1], [r[0] for r in m]) self.failUnlessEqual([3, 2], list(r[0] for r in m[0].iterchildren())) def test_insert_before_noiter(self): m = self.Store() m.append(None, row=[1]) m.insert_before(None, None, [2]) self.failUnlessEqual([r[0] for r in m], [1, 2]) def test_allow_nonatomic(self): m = self.Store() m.ATOMIC = False self.failUnless(m.insert(None, 0)) self.failUnless(m.prepend(None)) self.failUnless(m.append(None)) self.failUnless(m.insert_before(None, None)) self.failUnless(m.insert_after(None, None)) class TOrigTreeStore(TestCase, _TObjectTreeStoreMixin): Store = lambda *x: Gtk.TreeStore(object) class TObjectTreeStore(TestCase, _TObjectTreeStoreMixin): Store = ObjectTreeStore def test_validate(self): self.failUnlessRaises(ValueError, ObjectTreeStore, int) ObjectTreeStore() ObjectTreeStore(object) self.failUnlessRaises(ValueError, ObjectTreeStore, object, object) def test_iter_path_changed(self): m = ObjectTreeStore() def handler(model, path, iter_, result): result[0] += 1 result = [0] m.connect("row-changed", handler, result) m.append(None, [object()]) iter_ = m.get_iter_first() m.iter_changed(iter_) self.assertEqual(result[0], 1) m.path_changed(m.get_path(iter_)) self.assertEqual(result[0], 2) def test_itervalues(self): m = ObjectTreeStore() obj = object() obj2 = object() it = m.append(None, row=[obj]) m.append(it, row=[obj2]) self.assertEqual(list(m.itervalues(None)), [obj]) self.assertEqual(list(m.itervalues(it)), [obj2]) def test_iterrows(self): m = ObjectTreeStore() obj = object() obj2 = object() it = m.append(None, row=[obj]) m.append(it, row=[obj2]) self.assertEqual(list(m.iterrows(None))[0][1], obj) self.assertEqual(list(m.iterrows(it))[0][1], obj2) def test_nonatomic(self): m = ObjectTreeStore() self.assertRaises(AssertionError, m.append, None) self.assertRaises(AssertionError, m.insert, None, 0) self.assertRaises(AssertionError, m.prepend, None) self.assertRaises(AssertionError, m.insert_before, None, None) self.assertRaises(AssertionError, m.insert_after, None, None) def test_signal_count(self): m = ObjectTreeStore() def handler(model, path, iter_, result): result[0] += 1 inserted = [0] m.connect("row-inserted", handler, inserted) changed = [0] m.connect("row-changed", handler, changed) m.append(None, [1]) m.insert(None, 0, [1]) m.prepend(None, [1]) m.insert_before(None, None, [1]) m.insert_after(None, None, [1]) self.assertEqual(changed[0], 0) self.assertEqual(inserted[0], len(m)) class TObjectModelFilter(TestCase): def test_iter_values(self): m = ObjectStore() f = ObjectModelFilter(child_model=m) m.insert_many(0, range(10)) self.failUnlessEqual(list(range(10)), list(f.itervalues())) def test_filter(self): m = ObjectStore() f = ObjectModelFilter(child_model=m) m.insert_many(0, range(10)) def filter_func(model, iter_, data): if model.get_value(iter_) % 2 == 0: return True return False f.set_visible_func(filter_func) f.refilter() self.failUnlessEqual(list(range(0, 10, 2)), list(f.itervalues())) class TObjectModelSort(TestCase): def test_iter_values(self): m = ObjectStore() f = ObjectModelSort(model=m) m.insert_many(0, range(10)) self.failUnlessEqual(list(range(10)), list(f.itervalues())) def test_sort(self): m = ObjectStore() f = ObjectModelSort(model=m) m.insert_many(0, range(10)) def sort_func(model, iter_a, iter_b, data): a = model.get_value(iter_a, 0) b = model.get_value(iter_b, 0) return -cmp(a, b) f.set_default_sort_func(sort_func) self.failUnlessEqual(sorted(range(10), reverse=True), list(f.itervalues())) quodlibet-3.9.1/tests/test_qltk_downloader.py0000644000175000017500000000105713112005742021704 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.downloader import DownloadWindow import quodlibet.config class TDownloadWindow(TestCase): def setUp(self): quodlibet.config.init() self.win = DownloadWindow() def test_ctr(self): pass def tearDown(self): self.win.destroy() quodlibet.config.quit() quodlibet-3.9.1/tests/test_qltk_songlist.py0000644000175000017500000002123713112005742021412 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from senf import fsnative from tests import TestCase from quodlibet.library import SongLibrary from quodlibet.qltk.songlist import SongList, set_columns, get_columns, \ header_tag_split, get_sort_tag from quodlibet.formats import AudioFile from quodlibet import config class TSongList(TestCase): HEADERS = ["acolumn", "~#lastplayed", "~foo~bar", "~#rating", "~#length", "~dirname", "~#track"] def setUp(self): config.init() self.songlist = SongList(SongLibrary()) self.orders_changed = 0 def orders_changed_cb(*args): self.orders_changed += 1 self.songlist.connect("orders-changed", orders_changed_cb) def test_set_all_column_headers(self): SongList.set_all_column_headers(self.HEADERS) headers = [col.header_name for col in self.songlist.get_columns()] self.failUnlessEqual(headers, self.HEADERS) def test_set_column_headers(self): self.songlist.set_column_headers(self.HEADERS) headers = [col.header_name for col in self.songlist.get_columns()] self.failUnlessEqual(headers, self.HEADERS) def test_drop(self): self.songlist.enable_drop() self.songlist.disable_drop() def test_sort_by(self): self.songlist.set_column_headers(["one", "two", "three"]) for key, order in [("one", True), ("two", False), ("three", False)]: self.songlist.set_sort_orders([(key, order)]) self.failUnlessEqual( self.songlist.get_sort_orders(), [(key, order)]) self.songlist.toggle_column_sort(self.songlist.get_columns()[-1]) self.failUnlessEqual( self.songlist.get_sort_orders(), [("three", True)]) def test_sort_orders(self): s = self.songlist s.set_column_headers(["foo", "quux", "bar"]) values = [("foo", True), ("bar", False)] s.set_sort_orders(values) self.assertEqual(s.get_sort_orders(), values) s.toggle_column_sort(s.get_columns()[1], replace=False) self.assertEqual(s.get_sort_orders(), values + [("quux", False)]) s.toggle_column_sort(s.get_columns()[1], replace=True) self.assertEqual(s.get_sort_orders(), [("quux", False)]) def test_toggle_sort(self): s = self.songlist s.set_column_headers(["foo"]) self.assertEqual(self.orders_changed, 1) s.toggle_column_sort(s.get_columns()[0], replace=True) self.assertEqual(self.orders_changed, 2) self.assertEqual(s.get_sort_orders(), [("foo", False)]) s.toggle_column_sort(s.get_columns()[0], replace=True) self.assertEqual(self.orders_changed, 3) self.assertEqual(s.get_sort_orders(), [("foo", True)]) def test_clear_sort(self): s = self.songlist s.set_column_headers(["foo"]) s.toggle_column_sort(s.get_columns()[0], replace=True) self.assertTrue(s.get_sort_orders()) s.clear_sort() self.assertFalse(s.get_sort_orders()) def test_not_sortable(self): s = self.songlist s.sortable = False s.set_column_headers(["foo"]) s.toggle_column_sort(s.get_columns()[0]) self.assertEqual(self.orders_changed, 0) self.assertFalse(s.get_sort_orders()) def test_find_default_sort_column(self): s = self.songlist self.assertTrue(s.find_default_sort_column() is None) s.set_column_headers(["~#track"]) self.assertTrue(s.find_default_sort_column()) def test_inline_search_state(self): self.assertEqual(self.songlist.get_search_column(), 0) self.assertTrue(self.songlist.get_enable_search()) def test_set_songs(self): self.songlist.set_songs([], sorted=True) self.songlist.set_songs([], sorted=False) self.songlist.set_songs([], scroll_select=True) self.songlist.set_songs([], scroll_select=False) self.songlist.set_songs([], scroll=True) self.songlist.set_songs([], scroll=False) def test_set_songs_restore_select(self): song = AudioFile({"~filename": "/dev/null"}) self.songlist.add_songs([song]) sel = self.songlist.get_selection() sel.select_path(Gtk.TreePath.new_first()) self.songlist.set_songs([song], scroll_select=True) self.assertEqual(self.songlist.get_selected_songs(), [song]) song2 = AudioFile({"~filename": "/dev/null"}) self.songlist.set_songs([song2], scroll_select=True) self.assertEqual(self.songlist.get_selected_songs(), []) def test_set_songs_no_restore_select(self): song = AudioFile({"~filename": "/dev/null"}) self.songlist.add_songs([song]) model = self.songlist.get_model() model.go_to(song) self.assertIs(model.current, song) # only restore if there was a selected one self.songlist.set_songs([song], scroll_select=True) self.assertEqual(self.songlist.get_selected_songs(), []) def test_get_selected_songs(self): song = AudioFile({"~filename": "/dev/null"}) self.songlist.add_songs([song]) sel = self.songlist.get_selection() sel.select_path(Gtk.TreePath.new_first()) self.assertEqual(self.songlist.get_selected_songs(), [song]) self.assertEqual(self.songlist.get_first_selected_song(), song) sel.unselect_all() self.assertEqual(self.songlist.get_selected_songs(), []) self.assertIs(self.songlist.get_first_selected_song(), None) def test_add_songs(self): song = AudioFile({"~filename": "/dev/null"}) # unsorted self.songlist.add_songs([song]) self.songlist.add_songs([song]) # sorted self.songlist.set_column_headers(["foo"]) self.songlist.toggle_column_sort(self.songlist.get_columns()[0]) self.songlist.add_songs([]) self.songlist.add_songs([song]) self.songlist.add_songs([song]) self.assertEqual(self.songlist.get_songs(), [song] * 4) def test_header_menu(self): from quodlibet import browsers from quodlibet.library import SongLibrary, SongLibrarian song = AudioFile({"~filename": fsnative(u"/dev/null")}) song.sanitize() self.songlist.set_songs([song]) library = SongLibrary() library.librarian = SongLibrarian() browser = browsers.get("SearchBar")(library) self.songlist.set_column_headers(["foo"]) self.assertFalse(self.songlist.Menu("foo", browser, library)) sel = self.songlist.get_selection() sel.select_all() self.assertTrue(self.songlist.Menu("foo", browser, library)) def test_get_columns_migrates(self): self.failIf(config.get("settings", "headers", None)) self.failIf(config.get("settings", "columns", None)) headers = "~album ~#replaygain_track_gain foobar" config.set("settings", "headers", headers) columns = get_columns() self.failUnlessEqual(columns, ["~album", "~#replaygain_track_gain", "foobar"]) self.failIf(config.get("settings", "headers", None)) def test_get_set_columns(self): self.failIf(config.get("settings", "headers", None)) self.failIf(config.get("settings", "columns", None)) columns = ["first", "won't", "two words", "4"] set_columns(columns) self.failUnlessEqual(columns, get_columns()) columns += ["~~another~one"] set_columns(columns) self.failUnlessEqual(columns, get_columns()) self.failIf(config.get("settings", "headers", None)) def test_header_tag_split(self): self.assertEqual(header_tag_split("foo"), ["foo"]) self.assertEqual(header_tag_split("~foo~bar"), ["foo", "bar"]) self.assertEqual(header_tag_split(""), ["foo"]) self.assertEqual(header_tag_split("<~foo~bar>"), ["foo", "bar"]) self.assertEqual(header_tag_split("pattern <~foo~bar>"), ["foo", "bar"]) def test_get_sort_tag(self): self.assertEqual(get_sort_tag("~#track"), "") self.assertEqual(get_sort_tag("artist"), "artistsort") self.assertEqual(get_sort_tag("date"), "date") self.assertEqual(get_sort_tag("~artist~date"), "~artistsort~date") self.assertEqual(get_sort_tag("~date~artist"), "~date~artistsort") self.assertEqual(get_sort_tag("composer"), "composersort") def tearDown(self): self.songlist.destroy() config.quit() quodlibet-3.9.1/tests/test_qltk_wlw.py0000644000175000017500000000364213112005742020361 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from .helper import locale_numeric_conv from gi.repository import Gtk from quodlibet.qltk.wlw import WaitLoadWindow class TWaitLoadWindow(TestCase): class DummyConnector(Gtk.Window): count = 0 def connect(self, *args): self.count += 1 def disconnect(self, *args): self.count -= 1 class Eater: def set_cursor(*args): pass window = Eater() def setUp(self): self.parent = self.DummyConnector() self.wlw = WaitLoadWindow(self.parent, 5, "a test") def test_none(self): wlw = WaitLoadWindow(None, 5, "a test") wlw.step() wlw.destroy() def test_plurals(self): with locale_numeric_conv(): wlw = WaitLoadWindow(None, 1234, "At %(current)d of %(total)d") self.failUnlessEqual(wlw._label.get_text(), "At 0 of 1,234") while wlw.current < 1000: wlw.step() self.failUnlessEqual(wlw._label.get_text(), "At 1,000 of 1,234") def test_connect(self): self.failUnlessEqual(2, self.parent.count) self.wlw.destroy() self.failUnlessEqual(0, self.parent.count) def test_start(self): self.failUnlessEqual(0, self.wlw.current) self.failUnlessEqual(5, self.wlw.count) def test_step(self): self.failIf(self.wlw.step()) self.failUnlessEqual(1, self.wlw.current) self.failIf(self.wlw.step()) self.failIf(self.wlw.step()) self.failUnlessEqual(3, self.wlw.current) def test_destroy(self): self.wlw.destroy() self.failUnlessEqual(0, self.parent.count) def tearDown(self): self.wlw.destroy() quodlibet-3.9.1/tests/test_windows.py0000644000175000017500000000372613112005742020212 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from tests import TestCase, get_data_path, skipUnless from quodlibet.util.path import normalize_path from quodlibet.util import is_wine from quodlibet.util import windows from quodlibet.compat import text_type @skipUnless(os.name == "nt", "Wrong platform") class TWindows(TestCase): def test_dir_funcs(self): d = windows.get_personal_dir() self.assertTrue(d is None or isinstance(d, text_type)) d = windows.get_appdate_dir() self.assertTrue(d is None or isinstance(d, text_type)) d = windows.get_desktop_dir() self.assertTrue(d is None or isinstance(d, text_type)) d = windows.get_music_dir() self.assertTrue(d is None or isinstance(d, text_type)) d = windows.get_profile_dir() self.assertTrue(d is None or isinstance(d, text_type)) d = windows.get_links_dir() self.assertTrue(d is None or isinstance(d, text_type)) def test_get_link_target(self): path = get_data_path("test.lnk") d = windows.get_link_target(path) self.assertTrue(isinstance(d, text_type)) self.assertEqual( normalize_path(d), normalize_path(u"C:\Windows\explorer.exe")) def test_get_link_target_unicode(self): path = get_data_path("test2.lnk") d = windows.get_link_target(path) self.assertTrue(isinstance(d, text_type)) if is_wine(): # wine doesn't support unicode paths here.. self.assertEqual(os.path.basename(d), u"\xe1??.txt") else: self.assertEqual(os.path.basename(d), u"\xe1\U00016826.txt") def test_get_link_target_non_exist(self): with self.assertRaises(WindowsError): windows.get_link_target(u"nopenope.lnk") quodlibet-3.9.1/tests/test_qltk_pluginwin.py0000644000175000017500000000466013112005742021565 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from tests.helper import realized from quodlibet import plugins from quodlibet import config from quodlibet.plugins import Plugin from quodlibet.plugins.cover import CoverSourcePlugin from quodlibet.qltk.models import ObjectStore from quodlibet.qltk.pluginwin import PluginWindow, PluginErrorWindow, \ PluginListView, PluginEnabledFilterCombo, PluginPreferencesContainer, \ EnabledType, PluginTypeFilterCombo class FakePlugin(object): PLUGIN_ID = "fo emulate arithmetic mean config.set("settings", "bayesian_rating_factor", 0.0) s.failUnlessEqual(album("~#rating:bav"), album("~#rating:avg")) def test_bayesian_multiple_ratings(s): # separated from above to avoid caching c, r1, r2 = 5, 1.0, 0.5 songs = [Fakesong({"~#rating": r1}), Fakesong({"~#rating": r2})] album = Album(songs[0]) album.songs = set(songs) config.set("settings", "bayesian_rating_factor", float(c)) s.failUnlessEqual( config.getfloat("settings", "bayesian_rating_factor"), float(c)) expected = avg(c * [config.RATINGS.default] + [r1, r2]) s.failUnlessEqual(album("~#rating:bav"), expected) s.failUnlessEqual(album("~#rating"), expected) def test_bayesian_average(s): bav = bayesian_average l = [1, 2, 3, 4] a = avg(l) # c=0 => this becomes a mean regardless of m s.failUnlessEqual(a, bav(l, 0, 0)) s.failUnlessEqual(a, bav(l, 0, 999)) # c=1, m = a (i.e. just adding another mean score) => no effect s.failUnlessEqual(a, bav(l, 1, a)) # Harder ones s.failUnlessEqual(20.0 / 9, bav(l, 5, 2)) expected = 40.0 / 14 s.failUnlessEqual(expected, bav(l, 10, 3)) # Also check another iterable s.failUnlessEqual(expected, bav(tuple(l), 10, 3)) def test_defaults(s): failUnlessEq = s.failUnlessEqual song = Fakesong({}) album = Album(song) failUnlessEq(album("foo", "x"), "x") album.songs.add(song) failUnlessEq(album("~#length", "x"), song("~#length", "x")) failUnlessEq(album("~#bitrate", "x"), song("~#bitrate", "x")) failUnlessEq(album("~#rating", "x"), song("~#rating", "x")) failUnlessEq(album("~#playcount", "x"), song("~#playcount", "x")) failUnlessEq(album("~#mtime", "x"), song("~#mtime", "x")) failUnlessEq(album("~#year", "x"), song("~#year", "x")) failUnlessEq(album("~#foo", "x"), song("~#foo", "x")) failUnlessEq(album("foo", "x"), song("foo", "x")) failUnlessEq(album("~foo", "x"), song("~foo", "x")) failUnlessEq(album("~people", "x"), song("~people", "x")) failUnlessEq(album("~peoplesort", "x"), song("~peoplesort", "x")) failUnlessEq(album("~performer", "x"), song("~performer", "x")) failUnlessEq(album("~performersort", "x"), song("~performersort", "x")) failUnlessEq(album("~rating", "x"), song("~rating", "x")) for p in PEOPLE: failUnlessEq(album(p, "x"), song(p, "x")) for p in NUMERIC_ZERO_DEFAULT: failUnlessEq(album(p, "x"), song(p, "x")) def test_methods(s): songs = [ Fakesong({"b": "bb4\nbb1\nbb1", "c": "cc1\ncc3\ncc3"}), Fakesong({"b": "bb1\nbb1\nbb4", "c": "cc3\ncc1\ncc3"}) ] album = Album(songs[0]) album.songs = set(songs) s.failUnlessEqual(album.list("c"), ["cc3", "cc1"]) s.failUnlessEqual(album.list("~c~b"), ["cc3", "cc1", "bb1", "bb4"]) s.failUnlessEqual(album.comma("c"), "cc3, cc1") s.failUnlessEqual(album.comma("~c~b"), "cc3, cc1 - bb1, bb4") def tearDown(self): config.quit() class MockPlaylistResource(object): def __init__(self, pl): self.pl = pl def __enter__(self): return self.pl def __exit__(self, *exc_info): self.pl.delete() class TPlaylist(TestCase): TWO_SONGS = [ Fakesong({"~#length": 5, "discnumber": "1", "date": "2038"}), Fakesong({"~#length": 7, "dummy": "d\ne", "discnumber": "2"}) ] class FakeLib(object): def __init__(self): self.reset() def emit(self, name, songs): self.emitted[name].extend(songs) def masked(self, songs): return False def reset(self): self.emitted = defaultdict(list) @property def changed(self): return self.emitted.get('changed', []) FAKE_LIB = FakeLib() def setUp(self): self.FAKE_LIB.reset() def pl(self, name, lib=None): return Playlist(name, lib) def wrap(self, name, lib=FAKE_LIB): return MockPlaylistResource(self.pl(name, lib)) def test_equality(s): pl = s.pl("playlist") pl2 = s.pl("playlist") pl3 = s.pl("playlist") s.failUnlessEqual(pl, pl2) # Debatable s.failUnlessEqual(pl, pl3) pl4 = s.pl("foobar") s.failIfEqual(pl, pl4) pl.delete() pl2.delete() pl3.delete() pl4.delete() def test_index(s): with s.wrap("playlist") as pl: songs = s.TWO_SONGS pl.extend(songs) # Just a sanity check... s.failUnlessEqual(1, songs.index(songs[1])) # And now the happy paths.. s.failUnlessEqual(0, pl.index(songs[0])) s.failUnlessEqual(1, pl.index(songs[1])) # ValueError is what we want here try: pl.index(Fakesong({})) s.fail() except ValueError: pass def test_name_tag(s): with s.wrap("a playlist") as pl: s.failUnlessEqual(pl("~name"), "a playlist") s.failUnlessEqual(pl.get("~name"), "a playlist") def test_internal_tags(s): with s.wrap("playlist") as pl: pl.extend(s.TWO_SONGS) s.failIfEqual(pl.comma("~long-length"), "") s.failIfEqual(pl.comma("~tracks"), "") s.failIfEqual(pl.comma("~discs"), "") s.failUnlessEqual(pl.comma("~foo"), "") s.failUnlessEqual(pl.comma(""), "") s.failUnlessEqual(pl.comma("~"), "") s.failUnlessEqual(pl.get("~#"), "") def test_numeric_ops(s): songs = NUMERIC_SONGS with s.wrap("playlist") as pl: pl.extend(songs) s.failUnlessEqual(pl.get("~#length"), 12) s.failUnlessEqual(pl.get("~#length:sum"), 12) s.failUnlessEqual(pl.get("~#length:max"), 7) s.failUnlessEqual(pl.get("~#length:min"), 1) s.failUnlessEqual(pl.get("~#length:avg"), 4) s.failUnlessEqual(pl.get("~#length:foo"), 0) s.failUnlessEqual(pl.get("~#rating:avg"), avg([0.1, 0.3, 0.5])) s.failUnlessEqual(pl.get("~#filesize"), 303) s.failUnlessEqual(pl.get("~#added"), 7) s.failUnlessEqual(pl.get("~#lastplayed"), 88) s.failUnlessEqual(pl.get("~#bitrate"), 200) s.failUnlessEqual(pl.get("~#year"), 33) s.failUnlessEqual(pl.get("~#rating"), 0.3) s.failUnlessEqual(pl.get("~#originalyear"), 2002) def test_updating_aggregates_extend(s): with s.wrap("playlist") as pl: pl.extend(NUMERIC_SONGS) old_length = pl.get("~#length") old_size = pl.get("~#filesize") # Double the playlist pl.extend(NUMERIC_SONGS) new_length = pl.get("~#length") new_size = pl.get("~#filesize") s.failUnless(new_length > old_length, msg="Ooops, %d <= %d" % (new_length, old_length)) s.failUnless(new_size > old_size, msg="Ooops, %d <= %d" % (new_size, old_size)) def test_updating_aggregates_append(s): with s.wrap("playlist") as pl: pl.extend(NUMERIC_SONGS) old_rating = pl.get("~#rating") pl.append(AMAZING_SONG) new_rating = pl.get("~#filesize") s.failUnless(new_rating > old_rating) def test_updating_aggregates_clear(s): with s.wrap("playlist") as pl: pl.extend(NUMERIC_SONGS) s.failUnless(pl.get("~#length")) pl.clear() s.failIf(pl.get("~#length")) def test_updating_aggregates_remove_songs(s): with s.wrap("playlist") as pl: pl.extend(NUMERIC_SONGS) s.failUnless(pl.get("~#length")) pl.remove_songs(NUMERIC_SONGS) s.failIf(pl.get("~#length")) def test_listlike(s): with s.wrap("playlist") as pl: pl.extend(NUMERIC_SONGS) s.failUnlessEqual(NUMERIC_SONGS[0], pl[0]) s.failUnlessEqual(NUMERIC_SONGS[1:2], pl[1:2]) s.failUnless(NUMERIC_SONGS[1] in pl) def test_extend_signals(s): with s.wrap("playlist") as pl: pl.extend(NUMERIC_SONGS) s.failUnlessEqual(s.FAKE_LIB.changed, NUMERIC_SONGS) def test_append_signals(s): with s.wrap("playlist") as pl: song = NUMERIC_SONGS[0] pl.append(song) s.failUnlessEqual(s.FAKE_LIB.changed, [song]) def test_clear_signals(s): with s.wrap("playlist") as pl: pl.extend(NUMERIC_SONGS) pl.clear() s.failUnlessEqual(s.FAKE_LIB.changed, NUMERIC_SONGS * 2) def test_make(self): with self.wrap("Does not exist") as pl: self.failUnlessEqual(0, len(pl)) self.failUnlessEqual(pl.name, "Does not exist") def test_rename_working(self): with self.wrap("Foobar") as pl: assert pl.name == "Foobar" pl.rename("Foo Quuxly") assert pl.name == "Foo Quuxly" # Rename should not fire signals self.failIf(self.FAKE_LIB.changed) def test_rename_nothing(self): with self.wrap("Foobar") as pl: self.failUnlessRaises(ValueError, pl.rename, "") def test_no_op_rename(self): with self.wrap("playlist") as pl: pl.rename("playlist") self.failUnlessEqual(pl.name, "playlist") def test_playlists_featuring(s): with s.wrap("playlist") as pl: pl.extend(NUMERIC_SONGS) playlists = Playlist.playlists_featuring(NUMERIC_SONGS[0]) s.failUnlessEqual(set(playlists), {pl}) # Now add a second one, check that instance tracking works with s.wrap("playlist2") as pl2: pl2.append(NUMERIC_SONGS[0]) playlists = Playlist.playlists_featuring(NUMERIC_SONGS[0]) s.failUnlessEqual(set(playlists), {pl, pl2}) def test_playlists_tag(self): # Arguably belongs in _audio songs = NUMERIC_SONGS pl_name = "playlist 123!" with self.wrap(pl_name) as pl: pl.extend(songs) for song in songs: self.assertEquals(pl_name, song("~playlists")) def test_duplicates_single_item(self): with self.wrap("playlist") as pl: pl.append(self.TWO_SONGS[0]) self.failIf(pl.has_duplicates) pl.append(self.TWO_SONGS[0]) self.failUnless(pl.has_duplicates) def test_duplicates(self): with self.wrap("playlist") as pl: pl.extend(self.TWO_SONGS) pl.extend(self.TWO_SONGS) self.failUnlessEqual(len(pl), 4) self.failUnless(pl.has_duplicates, ("Playlist has un-detected duplicates: %s " % "\n".join([str(s) for s in pl._list]))) def test_remove_leaving_duplicates(self): with self.wrap("playlist") as pl: pl.extend(self.TWO_SONGS) [first, second] = self.TWO_SONGS pl.extend(NUMERIC_SONGS + self.TWO_SONGS) self.failUnlessEqual(len(self.FAKE_LIB.changed), 7) self.FAKE_LIB.reset() pl.remove_songs(self.TWO_SONGS, leave_dupes=True) self.failUnless(first in pl) self.failUnless(second in pl) self.failIf(len(self.FAKE_LIB.changed)) def test_remove_fully(self): with self.wrap("playlist") as pl: pl.extend(self.TWO_SONGS * 2) self.FAKE_LIB.reset() pl.remove_songs(self.TWO_SONGS, leave_dupes=False) self.failIf(len(pl)) self.failUnlessEqual(self.FAKE_LIB.changed, self.TWO_SONGS) class TFileBackedPlaylist(TPlaylist): def setUp(self): super(TFileBackedPlaylist, self).setUp() self.temp = mkdtemp() self.temp2 = mkdtemp() def tearDown(self): shutil.rmtree(self.temp) shutil.rmtree(self.temp2) def pl(self, name, lib=None): return FileBackedPlaylist(self.temp, name, lib) def test_from_songs(self): pl = FileBackedPlaylist.from_songs(self.temp, NUMERIC_SONGS) self.failUnlessEqual(pl.songs, NUMERIC_SONGS) pl.delete() def test_read(self): with self.wrap("playlist") as pl: pl.extend(NUMERIC_SONGS) pl.write() lib = FileLibrary("foobar") lib.add(NUMERIC_SONGS) pl = self.pl("playlist", lib) self.assertEqual(len(pl), len(NUMERIC_SONGS)) def test_write(self): with self.wrap("playlist") as pl: pl.extend(NUMERIC_SONGS) pl.extend([fsnative(u"xf0xf0")]) pl.write() with open(pl.filename, "rb") as h: self.assertEqual(len(h.read().splitlines()), len(NUMERIC_SONGS) + 1) def test_make_dup(self): p1 = FileBackedPlaylist.new(self.temp, "Does not exist") p2 = FileBackedPlaylist.new(self.temp, "Does not exist") self.failUnlessEqual(p1.name, "Does not exist") self.failUnless(p2.name.startswith("Does not exist")) self.failIfEqual(p1.name, p2.name) p1.delete() p2.delete() def test_rename_removes(self): with self.wrap("foo") as pl: pl.rename("bar") self.failUnless(os.path.exists(os.path.join(self.temp, 'bar'))) self.failIf(os.path.exists(os.path.join(self.temp, 'foo'))) def test_rename_fails_if_file_exists(self): with self.wrap("foo") as foo: with self.wrap("bar") as bar: try: foo.rename("bar") self.fail("Should have raised, %s exists" % bar.filename) except ValueError: pass def test_masked_handling(self): if os.name == "nt": # FIXME: masking isn't properly implemented on Windows return # playlists can contain songs and paths for masked handling.. lib = FileLibrary("foobar") with self.wrap("playlist", lib) as pl: song = Fakesong({"date": "2038", "~filename": fsnative(u"/fake")}) song.sanitize() lib.add([song]) # mask and update lib.mask("/") pl.append(song) pl.remove_songs([song]) self.failUnless("/fake" in pl) pl.extend(self.TWO_SONGS) # check if collections can handle the mix self.failUnlessEqual(pl("date"), "2038") # unmask and update lib.unmask("/") pl.add_songs(["/fake"], lib) self.failUnless(song in pl) lib.destroy() quodlibet-3.9.1/tests/test_qltk_info.py0000644000175000017500000000225613112005742020503 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from quodlibet import app from tests import TestCase, destroy_fake_app, init_fake_app from senf import mkstemp from quodlibet.player.nullbe import NullPlayer from quodlibet.qltk.info import SongInfo from quodlibet.library import SongLibrary SOME_PATTERN = "foo\n[big][/big] - <artist>" class FakePatternEdit(object): @property def text(self): return SOME_PATTERN class TSongInfo(TestCase): def setUp(self): init_fake_app() fd, self.filename = mkstemp() os.close(fd) self.info = SongInfo(SongLibrary(), NullPlayer(), self.filename) def test_save(self): fake_edit = FakePatternEdit() self.info._on_set_pattern(None, fake_edit, app.player) with open(self.filename, "r") as f: contents = f.read() self.failUnlessEqual(contents, SOME_PATTERN + "\n") def tearDown(self): destroy_fake_app() self.info.destroy() os.unlink(self.filename) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_browsers_collection.py���������������������������������������������������0000644�0001750�0001750�00000007152�13112005742�022576� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet import config from quodlibet.browsers.collection import CollectionBrowser from quodlibet.browsers.collection.models import UnknownNode, \ CollectionTreeStore, build_tree, MultiNode from quodlibet.browsers.collection.prefs import save_headers, get_headers, \ PatternEditor from quodlibet.formats import AudioFile from quodlibet.library import SongLibrary from quodlibet.compat import listvalues SONGS = [ AudioFile({"album": "one", "artist": "piman", "~filename": "/dev/null"}), AudioFile({"album": "two", "artist": "mu\nboris", "~filename": "/dev/zero"}), AudioFile({"album": "three", "artist": "boris", "~filename": "/bin/ls"}), AudioFile({"album": "three", "artist": "boris", "~filename": "/bin/ls2"}), AudioFile({"album": "four", "~filename": "/bin/ls3"}), ] SONGS.sort() class TCollectionPreferences(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_headers(self): value = [("foobar", 0), ("~people", 1)] save_headers(value) self.failUnlessEqual(get_headers(), value) def test_pref_dialog(self): d = PatternEditor() d.destroy() class TCollectionAlbums(TestCase): def setUp(self): l = SongLibrary() l.add(SONGS) l.albums.load() self.albums = l.albums def tearDown(self): del self.albums def test_build_tree(self): tags = [("~people", 0)] tree = build_tree(tags, self.albums) self.failUnless("mu" in tree) self.failUnless("boris" in tree) self.failUnless("piman" in tree) self.failUnless(UnknownNode in tree) self.failUnlessEqual(len(tree), 4) def test_build_tree_merge(self): tags = [("~people", 1)] tree = build_tree(tags, self.albums) self.failUnless(MultiNode in tree) self.failUnless(UnknownNode in tree) self.failUnless("boris" in tree) self.failUnless("piman" in tree) self.failUnlessEqual(len(tree), 4) def test_model(self): model = CollectionTreeStore() model.set_albums([("~people", 0)], self.albums) self.failUnlessEqual(len(model), 4) model.change_albums(self.albums) self.failUnlessEqual(len(model), 4) model.remove_albums(self.albums) self.failUnlessEqual(len(model), 0) def test_utils(self): model = CollectionTreeStore() model.set_albums([("~people", 0)], self.albums) a = listvalues(self.albums) a.sort(key=lambda x: x.key) path = model.get_path_for_album(a[0]) albums = model.get_albums_for_path(path) self.failUnless(a[0] in albums) albums = model.get_albums_for_iter(model.get_iter(path)) self.failUnless(a[0] in albums) x = model.get_album(model.get_iter_first()) self.failIf(x) x = model.get_album(model.get_iter(path)) self.failUnlessEqual(x, a[0]) for r in model: self.failUnless(model.get_markup(model.tags, r.iter)) x = list(model.iter_albums(None)) self.assertEqual(set(x), set(a)) class TCollectionBrowser(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_init(self): library = SongLibrary() x = CollectionBrowser(library) x.destroy() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_operon.py����������������������������������������������������������������0000644�0001750�0001750�00000056434�13112005742�020026� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys from senf import fsnative, path2fsn from tests import TestCase, get_data_path, mkstemp from .helper import capture_output, get_temp_copy from quodlibet import config from quodlibet import util from quodlibet.formats import MusicFile from quodlibet.operon.main import main as operon_main from quodlibet.compat import listkeys def call(args): args = [path2fsn(a) for a in args] with capture_output() as (out, err): try: return_code = operon_main([path2fsn("operon.py")] + args) except SystemExit as e: return_code = e.code return (return_code, out.getvalue(), err.getvalue()) class TOperonBase(TestCase): def setUp(self): config.init() self.f = get_temp_copy(get_data_path('silence-44-s.ogg')) self.f2 = get_temp_copy(get_data_path('silence-44-s.mp3')) self.s = MusicFile(self.f) self.s2 = MusicFile(self.f2) fd, self.f3 = mkstemp(".mp3") os.write(fd, b"garbage") os.close(fd) def tearDown(self): os.unlink(self.f) os.unlink(self.f2) os.unlink(self.f3) config.quit() def check_true(self, args, so, se, **kwargs): """Assert success status code""" return self._check(args, True, so, se, **kwargs) def check_false(self, args, so, se, **kwargs): """Assert error status code""" return self._check(args, False, so, se, **kwargs) def _check(self, args, success, so, se): s, o, e = call(args) self.failUnlessEqual(s == 0, success, msg=repr((s, o, e))) self.failUnlessEqual(bool(o), so, msg=repr(o)) self.failUnlessEqual(bool(e), se, msg=repr(e)) return o, e class TOperonMain(TOperonBase): # [--version] [--help] [--verbose] <command> [<args>] def test_main(self): self.check_false([], False, True) self.check_true(["help"], True, False) self.check_false(["help", "foobar"], False, True) # TODO: "image-extract", "rename", "fill", "fill-tracknumber", "edit" # "load" for sub in ["help", "copy", "set", "clear", "remove", "add", "list", "print", "info", "tags"]: self.check_true(["help", sub], True, False) self.check_true(["help", "-h"], True, False) self.check_true(["help", "--help"], True, False) self.check_false(["help", "--foobar"], False, True) self.check_true(["--verbose", "help", "help"], True, False) self.check_true(["-v", "help", "help"], True, False) self.check_false(["--foobar", "help", "help"], False, True) self.check_true(["--version"], True, False) class TOperonAdd(TOperonBase): # add <tag> <value> <file> [<files>] def test_add_misc(self): self.check_false(["add"], False, True) self.check_false(["add", "tag"], False, True) self.check_false(["add", "tag", "value"], False, True) self.check_true(["add", "tag", "value", self.f], False, False) self.check_true(["add", "tag", "value", self.f, self.f], False, False) def test_add_check(self): keys = listkeys(self.s) self.check_true(["add", "foo", "bar", self.f], False, False) self.s.reload() self.failUnlessEqual(self.s["foo"], "bar") self.failUnlessEqual(len(keys) + 1, len(self.s.keys())) self.check_true(["-v", "add", "foo", "bar2", self.f], False, True) self.s.reload() self.failUnlessEqual(set(self.s.list("foo")), {"bar", "bar2"}) def test_add_backlisted(self): self.check_false(["add", "playcount", "bar", self.f], False, True) def test_permissions(self): try: os.chmod(self.f, 0o000) self.check_false(["add", "foo", "bar", self.f, self.f], False, True) os.chmod(self.f, 0o444) self.check_false(["add", "foo", "bar", self.f, self.f], False, True) finally: os.chmod(self.f, 0o666) class TOperonPrint(TOperonBase): # [-p <pattern>] <file> [<files>] def test_print(self): self.check_false(["print"], False, True) o, e = self.check_true(["print", self.f], True, False) self.failUnlessEqual(o.splitlines()[0], "piman, jzig - Quod Libet Test Data - 02/10 - Silence") o, e = self.check_true(["print", "-p", "<title>", self.f], True, False) self.failUnlessEqual(o.splitlines()[0], "Silence") o, e = self.check_true(["print", "-p", "<title>", self.f, self.f], True, False) self.failUnlessEqual(o.splitlines(), ["Silence", "Silence"]) def test_print_invalid(self): # passing a song which can't be loaded results in fail self.check_false(["print", self.f3], False, True) # in case some fail and some don't, print the error messages for # the failed ones, the patterns for the working ones and return # an error status o, e = self.check_false(["print", self.f3, self.f2], True, True) self.assertTrue("Quod Libet Test Data" in o) def test_permissions(self): # doesn't prevent reading under wine.. if os.name == "nt": return os.chmod(self.f, 0o000) self.check_false(["print", "-p", "<title>", self.f], False, True) class TOperonRemove(TOperonBase): # [--dry-run] <tag> [-e <pattern> | <value>] <file> [<files>] def test_error(self): self.check_false(["remove"], False, True) self.check_false(["remove", "tag", "value"], False, True) def test_remove(self): self.s["test"] = "foo\nbar\nfoo" self.s.write() self.check_true(["remove", "tag", "value", self.f], False, False) self.check_true(["remove", "test", "foo", self.f], False, False) self.s.reload() self.failUnlessEqual(self.s["test"], "bar") self.check_true(["-v", "remove", "test", "xxx", self.f, self.f], False, True) self.s.reload() self.failUnlessEqual(self.s["test"], "bar") def test_dry_run(self): self.s["test"] = "foo\nbar\nfoo" self.s.write() self.check_true(["remove", "--dry-run", "test", "foo", self.f], False, True) self.s.reload() self.failUnlessEqual(len(self.s.list("test")), 3) def test_pattern(self): self.s["test"] = "fao\nbar\nfoo" self.s.write() self.check_true(["remove", "test", "-e", "f[ao]o", self.f], False, False) self.s.reload() self.failUnlessEqual(self.s.list("test"), ["bar"]) self.check_true(["-v", "remove", "test", "-e", ".*", self.f], False, True) self.s.reload() self.failIf(self.s.list("test")) class TOperonClear(TOperonBase): # [--dry-run] [-a | -e <pattern> | <tag>] <file> [<files>] def test_misc(self): self.check_false(["clear"], False, True) self.check_false(["clear", self.f], False, True) self.check_true(["clear", "-a", self.f], False, False) self.check_false(["-v", "clear", "-e", self.f], False, True) self.check_true(["-v", "clear", "-e", "xx", self.f], False, True) self.check_true(["clear", "-e", "xx", self.f], False, False) self.check_false(["clear", "-e", "x", "-a", self.f], False, True) def _test_all(self): self.check(["clear", "-a", self.f], True, output=False) self.s.reload() self.failIf(self.s.realkeys()) self.check(["clear", "-a", self.f, self.f], True, output=False) def _test_all_dry_run(self): old_len = len(self.s.realkeys()) self.failUnless(old_len) self.check(["clear", "-a", "--dry-run", self.f], True) self.s.reload() self.failUnlessEqual(len(self.s.realkeys()), old_len) def _test_pattern(self): old_len = len(self.s.realkeys()) self.check(["clear", "-e", "a.*", self.f], True, output=False) self.s.reload() self.failUnlessEqual(len(self.s.realkeys()), old_len - 2) def _test_simple(self): old_len = len(self.s.realkeys()) self.check(["clear", "a.*", self.f], True, output=False) self.s.reload() self.failUnlessEqual(len(self.s.realkeys()), old_len) self.check(["clear", "--dry-run", "artist", self.f], True) self.s.reload() self.failUnlessEqual(len(self.s.realkeys()), old_len) self.check(["clear", "artist", self.f], True, output=False) self.s.reload() self.failUnlessEqual(len(self.s.realkeys()), old_len - 1) class TOperonSet(TOperonBase): # [--dry-run] <tag> <value> <file> [<files>] def test_misc(self): self.check_false(["set"], False, True) self.check_true(["set", "-h"], True, False) self.check_false(["set", "tag", "value"], False, True) self.check_true(["set", "tag", "value", self.f], False, False) self.check_true(["set", "tag", "value", self.f, self.f], False, False) self.check_true(["set", "--dry-run", "tag", "value", self.f], False, False) def test_simple(self): self.check_true(["set", "foo", "bar", self.f], False, False) self.s.reload() self.failUnlessEqual(self.s["foo"], "bar") self.check_true(["set", "--dry-run", "foo", "x", self.f], False, False) self.s.reload() self.failUnlessEqual(self.s["foo"], "bar") def test_replace(self): self.failIfEqual(self.s["artist"], "foobar") self.check_true(["set", "artist", "foobar", self.f], False, False) self.s.reload() self.failUnlessEqual(self.s["artist"], "foobar") class TOperonCopy(TOperonBase): # [--dry-run] [--ignore-errors] <source> <dest> def test_misc(self): self.check_false(["copy"], False, True) self.check_true(["copy", "-h"], True, False) self.check_false(["copy", "foo"], False, True) self.check_true(["copy", self.f, self.f2], False, False) self.check_true(["-v", "copy", self.f, self.f2], False, True) def test_simple(self): for key in self.s2.realkeys(): del self.s2[key] self.s2.write() self.s2.reload() self.failIf(self.s2.realkeys()) self.check_true(["copy", self.f, self.f2], False, False) self.s2.reload() self.failUnless(self.s2.realkeys()) def test_not_changable(self): self.s2["rating"] = "foo" self.s2.write() self.check_false(["copy", self.f2, self.f], False, True) self.check_true(["copy", "--ignore-errors", self.f2, self.f], False, False) def test_add(self): self.failUnlessEqual(len(self.s2.list("genre")), 1) self.check_true(["copy", self.f, self.f2], False, False) self.s2.reload() self.failUnlessEqual(len(self.s2.list("genre")), 2) def test_dry_run(self): for key in self.s2.realkeys(): del self.s2[key] self.s2.write() self.s2.reload() self.check_true(["copy", "--dry-run", self.f, self.f2], False, True) self.s2.reload() self.failIf(self.s2.realkeys()) class TOperonEdit(TOperonBase): # [--dry-run] <file> def test_misc(self): self.check_false(["edit"], False, True) self.check_true(["edit", "-h"], True, False) self.check_false(["edit", "foo", "bar"], False, True) def test_nonexist_editor(self): editor = fsnative(u"/this/path/does/not/exist/hopefully") util.environ["VISUAL"] = editor e = self.check_false(["edit", self.f], False, True)[1] self.assertTrue(editor in e) def test_no_edit(self): if os.name == "nt": return os.environ["VISUAL"] = "touch -t 197001010101" realitems = lambda s: [(k, s[k]) for k in s.realkeys()] old_items = realitems(self.s) self.check_true(["edit", self.f], False, False) self.s.reload() self.assertEqual(sorted(old_items), sorted(realitems(self.s))) def test_mtime(self): if os.name == "nt": return os.environ["VISUAL"] = "true" self.check_false(["edit", self.f], False, True) os.environ["VISUAL"] = "false" self.check_false(["edit", self.f], False, True) def test_dry_run(self): if os.name == "nt" or sys.platform == "darwin": return realitems = lambda s: [(k, s[k]) for k in s.realkeys()] os.environ["VISUAL"] = "truncate -s 0" old_items = realitems(self.s) os.utime(self.f, (42, 42)) e = self.check_true(["edit", "--dry-run", self.f], False, True)[1] # log all removals for key in self.s.realkeys(): self.assertTrue(key in e) # nothing should have changed self.s.reload() self.assertEqual(sorted(old_items), sorted(realitems(self.s))) def test_remove_all(self): if os.name == "nt" or sys.platform == "darwin": return os.environ["VISUAL"] = "truncate -s 0" os.utime(self.f, (42, 42)) self.check_true(["edit", self.f], False, False) # all should be gone self.s.reload() self.assertFalse(self.s.realkeys()) class TOperonInfo(TOperonBase): # [-t] [-c <c1>,<c2>...] <file> def test_misc(self): self.check_false(["info"], False, True) self.check_true(["info", self.f], True, False) self.check_false(["info", self.f, self.f2], False, True) self.check_true(["info", "-h"], True, False) def test_normal(self): self.check_true(["info", "-cdesc", self.f], True, False) self.check_true(["info", "-cvalue", self.f], True, False) self.check_true(["info", "-cdesc,value", self.f], True, False) self.check_true(["info", "-cvalue, desc", self.f], True, False) self.check_false(["info", "-cfoo", self.f], False, True) def test_terse(self): self.check_true(["info", "-t", self.f], True, False) self.check_true(["info", "-t", "-cdesc", self.f], True, False) self.check_true(["info", "-t", "-cvalue", self.f], True, False) self.check_true(["info", "-t", "-cdesc,value", self.f], True, False) self.check_true(["info", "-t", "-cvalue, desc", self.f], True, False) self.check_false(["info", "-t", "-cfoo", self.f], False, True) class TOperonList(TOperonBase): # [-t] [-c <c1>,<c2>...] <file> def test_misc(self): self.check_true(["list", "-h"], True, False) self.check_false(["list"], False, True) self.check_true(["list", self.f], True, False) self.check_false(["list", self.f, self.f2], False, True) def test_normal(self): self.check_true(["list", "-cdesc", self.f], True, False) self.check_true(["list", "-cvalue,tag", self.f], True, False) self.check_true(["list", "-cdesc,value", self.f], True, False) self.check_true(["list", "-cvalue, desc", self.f], True, False) self.check_false(["list", "-cfoo", self.f], False, True) def test_terse(self): self.check_true(["list", "-t", self.f], True, False) self.check_true(["list", "-t", "-cdesc", self.f], True, False) self.check_true(["list", "-t", "-cvalue,tag", self.f], True, False) self.check_true(["list", "-t", "-cdesc,value", self.f], True, False) self.check_true(["list", "-t", "-cvalue, desc", self.f], True, False) self.check_false(["list", "-t", "-cfoo", self.f], False, True) def test_terse_escape(self): self.s["foobar"] = "a:bc\\:" self.s.write() d = self.check_true(["list", "-t", "-cvalue", self.f], True, False)[0] lines = d.splitlines() self.assertTrue("a\\:bc\\\\\\:" in lines) class TOperonTags(TOperonBase): # [-t] [-c <c1>,<c2>...] def test_misc(self): self.check_true(["tags", "-h"], True, False) self.check_false(["tags", self.f], False, True) self.check_false(["tags", self.f, self.f2], False, True) def test_normal(self): self.check_true(["tags", "-cdesc"], True, False) self.check_true(["tags", "-ctag"], True, False) self.check_true(["tags", "-ctag, desc"], True, False) self.check_false(["tags", "-cfoo"], False, True) def test_terse(self): self.check_true(["tags", "-t"], True, False) self.check_true(["tags", "-t", "-cdesc"], True, False) self.check_true(["tags", "-t", "-cdesc,tag"], True, False) self.check_true(["tags", "-t", "-ctag, desc"], True, False) self.check_false(["tags", "-t", "-cfoo"], False, True) def test_output(self): o, e = self.check_true(["tags"], True, False) assert not e assert "tracknumber" in o assert "replaygain_album_gain" not in o o, e = self.check_true(["tags", "-a"], True, False) assert not e assert "tracknumber" in o assert "replaygain_album_gain" in o class TOperonImageExtract(TOperonBase): # [--dry-run] [--primary] [-d <destination>] <file> [<files>] def setUp(self): super(TOperonImageExtract, self).setUp() self.fcover = get_temp_copy(get_data_path('test-2.wma')) self.cover = MusicFile(self.fcover) def tearDown(self): os.unlink(self.fcover) super(TOperonImageExtract, self).tearDown() def test_misc(self): self.check_true(["image-extract", "-h"], True, False) self.check_true(["image-extract", self.f], False, False) self.check_true(["image-extract", self.f, self.f2], False, False) self.check_false(["image-extract"], False, True) def test_extract_all(self): target_dir = os.path.dirname(self.fcover) self.check_true(["image-extract", "-d", target_dir, self.fcover], False, False) self.assertEqual(len(self.cover.get_images()), 1) image = self.cover.get_primary_image() name = os.path.splitext(os.path.basename(self.fcover))[0] expected = "%s-00.%s" % (name, image.extensions[0]) expected_path = os.path.join(target_dir, expected) self.assertTrue(os.path.exists(expected_path)) with open(expected_path, "rb") as h: self.assertEqual(h.read(), image.read()) def test_extract_primary(self): target_dir = os.path.dirname(self.fcover) self.check_true( ["image-extract", "-d", target_dir, "--primary", self.fcover], False, False) self.assertEqual(len(self.cover.get_images()), 1) image = self.cover.get_primary_image() name = os.path.splitext(os.path.basename(self.fcover))[0] expected = "%s.%s" % (name, image.extensions[0]) expected_path = os.path.join(target_dir, expected) self.assertTrue(os.path.exists(expected_path)) with open(expected_path, "rb") as h: self.assertEqual(h.read(), image.read()) class TOperonImageSet(TOperonBase): # <image-file> <file> [<files>] def setUp(self): super(TOperonImageSet, self).setUp() from gi.repository import GdkPixbuf h, self.filename = mkstemp(".png") os.close(h) wide = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 150, 10) wide.savev(self.filename, "png", [], []) self.fcover = get_temp_copy(get_data_path('test-2.wma')) self.cover = MusicFile(self.fcover) self.fcover2 = get_temp_copy(get_data_path('test-2.wma')) self.cover2 = MusicFile(self.fcover2) def tearDown(self): os.unlink(self.fcover) os.unlink(self.filename) super(TOperonImageSet, self).tearDown() def test_misc(self): self.check_true(["image-set", "-h"], True, False) self.check_false(["image-set", self.fcover], False, True) self.check_false(["image-set"], False, True) self.check_false(["image-set", self.filename], False, True) def test_not_supported(self): path = get_data_path('test.mid') out, err = self.check_false( ["image-set", self.filename, path], False, True) self.assertTrue("supported" in err) def test_set(self): self.check_true(["image-set", self.filename, self.fcover], False, False) self.check_true(["-v", "image-set", self.filename, self.fcover], False, True) self.cover.reload() images = self.cover.get_images() self.assertEqual(len(images), 1) with open(self.filename, "rb") as h: self.assertEqual(h.read(), images[0].read()) def test_set_two(self): self.check_true( ["image-set", self.filename, self.fcover, self.fcover2], False, False) with open(self.filename, "rb") as h: image_data = h.read() for audio in [self.cover, self.cover2]: audio.reload() image = audio.get_images()[0] self.assertEqual(image.read(), image_data) class TOperonImageClear(TOperonBase): # <image-file> <file> [<files>] def setUp(self): super(TOperonImageClear, self).setUp() self.fcover = get_temp_copy(get_data_path('test-2.wma')) self.cover = MusicFile(self.fcover) def tearDown(self): os.unlink(self.fcover) super(TOperonImageClear, self).tearDown() def test_misc(self): self.check_true(["image-clear", "-h"], True, False) self.check_true(["image-clear", self.fcover], False, False) self.check_false(["image-clear"], False, True) def test_not_supported(self): path = get_data_path('test.mid') out, err = self.check_false(["image-clear", path], False, True) self.assertTrue("supported" in err) def test_clear(self): images = self.cover.get_images() self.assertEqual(len(images), 1) self.check_true(["image-clear", self.fcover], False, False) self.cover.reload() images = self.cover.get_images() self.assertEqual(len(images), 0) class TOperonFill(TOperonBase): # [--dry-run] <pattern> <file> [<files>] def test_misc(self): self.check_true(["fill", "-h"], True, False) self.check_false(["fill", self.f], False, True) self.check_true(["fill", "foo", self.f2], False, False) self.check_true(["fill", "foo", self.f, self.f2], False, False) def test_apply(self): basename = self.s("~basename") self.check_true(["fill", "<title>", self.f], False, False) self.s.reload() self.assertEqual(self.s("title"), os.path.splitext(basename)[0]) def test_apply_no_match(self): old_title = self.s("title") self.check_true( ["fill", "<tracknumber>. <title>", self.f], False, False) self.s.reload() self.assertEqual(self.s("title"), old_title) def test_preview(self): o, e = self.check_true( ["fill", "--dry-run", "<title>", self.f], True, False) self.assertTrue("title" in o) self.assertTrue(self.s("~basename") in o) def test_preview_no_match(self): o, e = self.check_true( ["fill", "--dry-run", "<tracknumber>. <title>", self.f], True, False) self.assertTrue("title" in o) self.assertTrue(self.s("~basename") in o) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_plugins_playlist.py������������������������������������������������������0000644�0001750�0001750�00000015577�13114757733�022151� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """TODO: Share better with, i.e. test MenuItemPlugin directly""" import os import shutil from gi.repository import Gtk from quodlibet.browsers import Browser from quodlibet.library import SongLibrary from quodlibet.plugins.playlist import PlaylistPlugin, PlaylistPluginHandler from quodlibet.util.collection import Playlist from tests import TestCase, mkstemp, mkdtemp from quodlibet.plugins import PluginManager, Plugin from tests.helper import capture_output MAX_PLAYLISTS = 50 TEST_PLAYLIST = Playlist("foo") def generate_playlists(n): return [Playlist("Playlist %d" % x) for x in range(n)] class TPlaylistPlugins(TestCase): class MockBrowser(Browser): def __init__(self): super(TPlaylistPlugins.MockBrowser, self).__init__() self.activated = False def activate(self): self.activated = True def get_toplevel(self): return self def is_toplevel(self): return True def _confirmer(self, *args): self.confirmed = True def setUp(self): self.tempdir = mkdtemp() self.pm = PluginManager(folders=[self.tempdir]) self.confirmed = False self.mock_browser = self.MockBrowser() self.handler = PlaylistPluginHandler(self._confirmer) self.pm.register_handler(self.handler) self.pm.rescan() self.assertEquals(self.pm.plugins, []) self.library = SongLibrary('foo') def tearDown(self): self.library.destroy() self.pm.quit() shutil.rmtree(self.tempdir) def create_plugin(self, id='', name='', desc='', icon='', funcs=None, mod=False): fd, fn = mkstemp(suffix='.py', text=True, dir=self.tempdir) file = os.fdopen(fd, 'w') if mod: indent = '' else: file.write( "from quodlibet.plugins.playlist import PlaylistPlugin\n") file.write("class %s(PlaylistPlugin):\n" % name) indent = ' ' file.write("%spass\n" % indent) if name: file.write("%sPLUGIN_ID = %r\n" % (indent, name)) if name: file.write("%sPLUGIN_NAME = %r\n" % (indent, name)) if desc: file.write("%sPLUGIN_DESC = %r\n" % (indent, desc)) if icon: file.write("%sPLUGIN_ICON = %r\n" % (indent, icon)) for f in (funcs or []): if f in ["__init__"]: file.write("%sdef %s(self, *args): super(%s, self).__init__(" "*args); raise Exception(\"as expected.\")\n" % (indent, f, name)) else: file.write("%sdef %s(*args): return args\n" % (indent, f)) file.flush() file.close() def test_empty_has_no_plugins(self): self.pm.rescan() self.assertEquals(self.pm.plugins, []) def test_name_and_desc_plus_func_is_one(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_playlist']) self.pm.rescan() self.assertEquals(len(self.pm.plugins), 1) def test_additional_functions_still_only_one(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_playlist', 'plugin_playlists']) self.pm.rescan() self.assertEquals(len(self.pm.plugins), 1) def test_two_plugins_are_two(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_playlist']) self.create_plugin(name='Name2', desc='Desc2', funcs=['plugin_albums']) self.pm.rescan() self.assertEquals(len(self.pm.plugins), 2) def test_disables_plugin(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_playlist']) self.pm.rescan() self.failIf(self.pm.enabled(self.pm.plugins[0])) def test_enabledisable_plugin(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_playlist']) self.pm.rescan() plug = self.pm.plugins[0] self.pm.enable(plug, True) self.failUnless(self.pm.enabled(plug)) self.pm.enable(plug, False) self.failIf(self.pm.enabled(plug)) def test_ignores_broken_plugin(self): self.create_plugin(name="Broken", desc="Desc", funcs=["__init__", "plugin_playlist"]) self.pm.rescan() plug = self.pm.plugins[0] self.pm.enable(plug, True) menu = Gtk.Menu() with capture_output(): self.handler.populate_menu(menu, None, self.mock_browser, [TEST_PLAYLIST]) self.failUnlessEqual(len(menu.get_children()), 0, msg="Shouldn't have enabled a broken plugin") def test_populate_menu(self): plugin = Plugin(FakePlaylistPlugin) self.handler.plugin_enable(plugin) menu = Gtk.Menu() self.handler.populate_menu(menu, None, self.mock_browser, [TEST_PLAYLIST]) # Don't forget the separator num = len(menu.get_children()) - 1 self.failUnlessEqual(num, 1, msg="Need 1 plugin not %d" % num) def test_handling_playlists_without_confirmation(self): plugin = Plugin(FakePlaylistPlugin) self.handler.plugin_enable(plugin) playlists = generate_playlists(MAX_PLAYLISTS) self.handler.handle(plugin.id, self.library, self.mock_browser, playlists) self.failUnless("Didn't execute plugin", FakePlaylistPlugin.total > 0) self.failIf(self.confirmed, ("Wasn't expecting a confirmation for %d" " invocations" % len(playlists))) def test_handling_lots_of_songs_with_confirmation(self): plugin = Plugin(FakePlaylistPlugin) self.handler.plugin_enable(plugin) playlists = generate_playlists(MAX_PLAYLISTS + 1) self.handler.handle(plugin.id, self.library, self.mock_browser, playlists) self.failUnless(self.confirmed, ("Should have confirmed %d invocations (Max=%d)." % (len(playlists), MAX_PLAYLISTS))) class FakePlaylistPlugin(PlaylistPlugin): PLUGIN_NAME = "Fake Playlist Plugin" PLUGIN_ID = "PlaylistMunger" MAX_INVOCATIONS = MAX_PLAYLISTS total = 0 def __init__(self, playlists, library): super(FakePlaylistPlugin, self).__init__(playlists, library) self.total = 0 def plugin_playlist(self, _): self.total += 1 if self.total > self.MAX_INVOCATIONS: raise ValueError("Shouldn't have called me on this many songs" " (%d > %d)" % (self.total, self.MAX_INVOCATIONS)) ���������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_paned.py������������������������������������������������������������0000644�0001750�0001750�00000013324�13112005742�020635� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet.qltk.paned import RVPaned, RHPaned, ConfigRVPaned, \ MultiRVPaned, MultiRHPaned, ConfigMultiRVPaned, ConfigMultiRHPaned from quodlibet import config from . import TestCase from .helper import visible class TRPaned(object): Kind = None def test_ctr(self): self.Kind().destroy() def test_pre_alloc(self): p = self.Kind() p.set_relative(0.25) self.failUnlessEqual(p.get_relative(), 0.25) self.assertRaises(ValueError, p.set_relative, 2.0) self.assertRaises(ValueError, p.set_relative, -2.0) def test_visible_no_setup(self): p = self.Kind() with visible(p): pass def test_visible_pre_setup_children(self): p = self.Kind() p.pack1(Gtk.Button()) p.pack2(Gtk.Button()) p.set_relative(0.75) self.failUnlessAlmostEqual(p.get_relative(), 0.75) with visible(p, width=200, height=200) as p: self.failUnlessAlmostEqual(p.get_relative(), 0.75, 2) def test_visible_pre_setup_empty(self): p = self.Kind() p.set_relative(0.75) self.failUnlessEqual(p.get_relative(), 0.75) with visible(p) as p: self.failUnlessAlmostEqual(p.get_relative(), 0.75, 2) def test_min_size_child(self): p = self.Kind() p.set_size_request(200, 200) p.pack1(Gtk.Label(), True, False) b2 = Gtk.Button() b2.set_size_request(50, 50) p.pack2(b2, True, False) p.set_relative(0.5) with visible(p) as p: self.assertEqual(p.get_position(), 100) class RHPaned(TestCase, TRPaned): Kind = RHPaned class RVPaned(TestCase, TRPaned): Kind = RVPaned class TConfigRPaned(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_basic(self): self.failUnless(config.get("memory", "foobar", None) is None) p = ConfigRVPaned("memory", "foobar", 0.75) p.pack1(Gtk.Button()) p.pack2(Gtk.Button()) with visible(p, width=200, height=200) as p: self.failUnlessAlmostEqual(p.get_relative(), 0.75, 2) p.props.position = 20 self.failUnlessAlmostEqual(p.get_relative(), 0.10, 2) config_value = config.getfloat("memory", "foobar") self.failUnlessAlmostEqual(config_value, 0.10, 2) class TMultiRPaned(object): Kind = None def test_set_widgets(self): """Test if widgets are properly set and in the correct order.""" p = self.Kind() # 0 widgets p.set_widgets([]) paned = p.get_paned() self.assertIsNotNone(paned) self.assertIsNone(paned.get_child1()) self.assertIsNone(paned.get_child2()) # 1 widget sw = Gtk.ScrolledWindow() p.set_widgets([sw]) paned = p.get_paned() children = [paned.get_child1(), paned.get_child2()] self.assertIn(sw, children) # 2 widgets sws = [Gtk.ScrolledWindow() for _ in range(2)] p.set_widgets(sws) paned = p.get_paned() self.assertIs(sws[0], paned.get_child1()) self.assertIs(sws[1], paned.get_child2()) # 3 wigets sws = [Gtk.ScrolledWindow() for _ in range(3)] p.set_widgets(sws) root_paned = p.get_paned() self.assertIs(sws[0], root_paned.get_child1()) sub_paned = root_paned.get_child2() self.assertIs(sws[1], sub_paned.get_child1()) self.assertIs(sws[2], sub_paned.get_child2()) def test_make_pane_widths_equal(self): p = self.Kind() sws = [Gtk.ScrolledWindow() for _ in range(4)] p.set_widgets(sws) p.make_pane_widths_equal() paneds = p._get_paneds() self.failUnlessAlmostEqual(paneds[0].get_relative(), 1.0 / 4.0) self.failUnlessAlmostEqual(paneds[1].get_relative(), 1.0 / 3.0) self.failUnlessAlmostEqual(paneds[2].get_relative(), 1.0 / 2.0) def test_change_orientation(self): p = self.Kind() p.set_widgets([Gtk.ScrolledWindow()]) opposite = Gtk.Orientation.HORIZONTAL horizontal_opposite = True if p.get_paned().props.orientation is Gtk.Orientation.HORIZONTAL: opposite = Gtk.Orientation.VERTICAL horizontal_opposite = False p.change_orientation(horizontal=horizontal_opposite) for paned in p._get_paneds(): self.assertIs(paned.props.orientation, opposite) def test_destroy(self): self.Kind().destroy() class TMultiRHPaned(TestCase, TMultiRPaned): Kind = MultiRHPaned class TMultiRVPaned(TestCase, TMultiRPaned): Kind = MultiRVPaned class TConfigMultiRPaned(object): def setUp(self): config.init() def tearDown(self): config.quit() def test_basic(self): self.assertTrue(config.get("memory", "pane_widths", None) is None) p = self.Kind("memory", "pane_widths") sws = [Gtk.ScrolledWindow() for _ in range(3)] p.set_widgets(sws) paneds = p._get_paneds() paneds[0].set_relative(0.4) paneds[1].set_relative(0.6) p.save_widths() widths = config.getstringlist("memory", "pane_widths") self.assertAlmostEqual(float(widths[0]), 0.4) self.assertAlmostEqual(float(widths[1]), 0.6) config.remove_option("memory", "pane_widths") class TConfigMultiRHPaned(TestCase, TConfigMultiRPaned): Kind = ConfigMultiRHPaned class TConfigMultiRVPaned(TestCase, TConfigMultiRPaned): Kind = ConfigMultiRVPaned ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_exfalso.py����������������������������������������������������������0000644�0001750�0001750�00000001210�13112005742�021176� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.exfalsowindow import ExFalsoWindow from quodlibet.library import SongLibrary import quodlibet.config class TExFalsoWindow(TestCase): def setUp(self): quodlibet.config.init() self.ef = ExFalsoWindow(SongLibrary()) def test_nothing(self): self.failUnless(self.ef.get_child()) def tearDown(self): self.ef.destroy() quodlibet.config.quit() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_wma.py�����������������������������������������������������������0000644�0001750�0001750�00000015200�13112005742�021025� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from mutagen import asf from tests import TestCase, get_data_path from quodlibet.formats.wma import WMAFile, unpack_image, pack_image from quodlibet.formats._image import APICType, EmbeddedImage from quodlibet.compat import cBytesIO from .helper import get_temp_copy class TWMAFile(TestCase): def setUp(self): self.f = get_temp_copy(get_data_path('test.wma')) self.song = WMAFile(self.f) self.f2 = get_temp_copy(get_data_path('test-2.wma')) self.song2 = WMAFile(self.f2) self.f3 = get_temp_copy(get_data_path('test.asf')) self.song3 = WMAFile(self.f3) def tearDown(self): os.unlink(self.f) os.unlink(self.f2) os.unlink(self.f3) def test_basic(self): self.song["title"] = u"SomeTestValue" self.song.write() self.song.reload() self.assertEqual(self.song("title"), u"SomeTestValue") def test_multi(self): self.song["genre"] = u"Rock\nPop" self.song.write() self.song.reload() # XXX: mutagen doesn't preserve order.. fix it! self.assertEqual(set(self.song.list("genre")), {u"Rock", u"Pop"}) def test_length(self): self.assertAlmostEqual(self.song("~#length"), 3.7120, 3) self.assertAlmostEqual(self.song2("~#length"), 3.684, 3) self.assertAlmostEqual(self.song3("~#length"), 11.38, 2) def test_channels(self): assert self.song("~#channels") == 2 assert self.song2("~#channels") == 2 assert self.song3("~#channels") == 1 def test_bitrate(self): self.assertEqual(self.song("~#bitrate"), 64) self.assertEqual(self.song2("~#bitrate"), 38) self.assertEqual(self.song3("~#bitrate"), 5) def test_write(self): self.song.write() self.song2.write() self.song3.write() def test_can_change(self): self.assertTrue(self.song.can_change("title")) self.assertFalse(self.song.can_change("foobar")) self.assertTrue("albumartist" in self.song.can_change()) def test_format(self): self.assertEqual(self.song("~format"), "ASF") self.assertEqual(self.song2("~format"), "ASF") self.assertEqual(self.song3("~format"), "ASF") def test_codec(self): self.assertEqual(self.song("~codec"), u"Windows Media Audio 9 Standard") self.assertEqual(self.song2("~codec"), u"Windows Media Audio 9 Professional") self.assertEqual(self.song3("~codec"), u"Intel G.723") def test_encoding(self): self.assertEqual( self.song("~encoding"), u"Windows Media Audio 9.1\n64 kbps, 48 kHz, stereo 2-pass CBR") self.assertEqual( self.song2("~encoding"), (u"Windows Media Audio 9.1 Professional\n192 kbps, 44 kHz, " "2 channel 24 bit 2-pass VBR")) self.assertEqual(self.song3("~encoding"), u"Microsoft G.723.1\n8 kHz Mono, 5333 Bit/s") def test_mb_release_track_id(self): tag = asf.ASF(self.f) tag["MusicBrainz/Release Track Id"] = [u"foo"] tag.save() song = WMAFile(self.f) self.assertEqual(song("musicbrainz_releasetrackid"), u"foo") song["musicbrainz_releasetrackid"] = u"bla" song.write() tag = asf.ASF(self.f) self.assertEqual(tag["MusicBrainz/Release Track Id"], [u"bla"]) def test_invalid(self): path = get_data_path('empty.xm') self.assertTrue(os.path.exists(path)) self.assertRaises(Exception, WMAFile, path) def test_get_images(self): tag = asf.ASF(self.f2) tag["WM/Picture"] = [tag["WM/Picture"][0], tag["WM/Picture"][0]] tag.save() self.song2.reload() images = self.song2.get_images() self.assertTrue(images and len(images) == 2) def test_get_image(self): self.assertFalse(self.song.get_primary_image()) image = self.song2.get_primary_image() self.assertTrue(image) self.assertEqual(image.mime_type, "image/jpeg") self.assertTrue(image.read()) def test_get_image_invalid_data(self): tag = asf.ASF(self.f) tag["WM/Picture"] = [asf.ASFValue(b"nope", asf.BYTEARRAY)] tag.save() self.assertFalse(self.song.has_images) self.song.reload() self.assertTrue(self.song.has_images) image = self.song.get_primary_image() self.assertFalse(image) def test_unpack_image_min(self): data = b"\x03" + b"\x00" * 4 + b"\x00" * 4 mime, desc, data, type_ = unpack_image(data) self.assertEqual(mime, u"") self.assertEqual(desc, u"") self.assertEqual(data, b"") self.assertEqual(type_, 3) def test_unpack_image_invalid(self): self.assertRaises(ValueError, unpack_image, b"") self.assertRaises(ValueError, unpack_image, b"\x00" * 6) self.assertRaises(ValueError, unpack_image, b"\x00" * 8) self.assertRaises(ValueError, unpack_image, b"\x00" * 100) def test_pack_image(self): d = pack_image( u"image/jpeg", u"Description", b"foo", APICType.COVER_FRONT) mime, desc, data, type_ = unpack_image(d) self.assertEqual(mime, u"image/jpeg") self.assertEqual(desc, u"Description") self.assertEqual(data, b"foo") self.assertEqual(type_, APICType.COVER_FRONT) def test_clear_images(self): # cover case image = self.song2.get_primary_image() self.assertTrue(image) self.song2.clear_images() self.assertFalse(self.song2.has_images) self.song2.reload() image = self.song2.get_primary_image() self.assertFalse(image) # no cover case self.song.clear_images() def test_set_image(self): fileobj = cBytesIO(b"foo") image = EmbeddedImage(fileobj, "image/jpeg", 10, 10, 8) self.assertFalse(self.song.has_images) self.song.set_image(image) self.assertTrue(self.song.has_images) image = self.song.get_primary_image() self.assertEqual(image.mime_type, "image/jpeg") self.assertEqual(image.read(), b"foo") def test_can_change_images(self): self.assertTrue(self.song.can_change_images) def test_can_multiple_values(self): self.assertTrue("artist" in self.song.can_multiple_values()) self.assertTrue(self.song.can_multiple_values("genre")) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_msg.py��������������������������������������������������������������0000644�0001750�0001750�00000001704�13112005742�020333� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.msg import WarningMessage, ErrorMessage, \ CancelRevertSave, ConfirmFileReplace class TWarningMessage(TestCase): def test_ctr(self): WarningMessage(None, "title", "description").destroy() class TErrorMessage(TestCase): def test_ctr(self): ErrorMessage(None, "title", "description").destroy() class TCancelRevertSave(TestCase): def setUp(self): self.win = CancelRevertSave(None) def test_ctr(self): pass def tearDown(self): self.win.destroy() class TFileReplace(TestCase): def setUp(self): self.win = ConfirmFileReplace(None, "") def test_ctr(self): pass def tearDown(self): self.win.destroy() ������������������������������������������������������������quodlibet-3.9.1/tests/test_plugins___init__.py������������������������������������������������������0000644�0001750�0001750�00000012365�13112005742�022017� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, mkstemp import os from quodlibet import config from quodlibet.formats import AudioFile from quodlibet.util.songwrapper import SongWrapper, ListWrapper from quodlibet.plugins import PluginConfig class TSongWrapper(TestCase): psong = AudioFile({ "~filename": "does not/exist", "title": "more songs", "discnumber": "2/2", "tracknumber": "1", "artist": "Foo\nI have two artists", "album": "Bar", "~bookmark": "2:10 A bookmark"}) pwrap = SongWrapper(psong) def setUp(self): fd, self.filename = mkstemp() os.close(fd) config.init() self.wrap = SongWrapper(AudioFile( {"title": "woo", "~filename": self.filename})) def tearDown(self): os.unlink(self.filename) config.quit() def test_slots(self): def breakme(): self.wrap.woo = 1 self.failUnlessRaises(AttributeError, breakme) def test_cmp(self): songs = [SongWrapper(AudioFile({"tracknumber": str(i)})) for i in range(10)] songs.reverse() songs.sort() self.failUnlessEqual([s("~#track") for s in songs], list(range(10))) def test_needs_write_yes(self): self.failIf(self.wrap._needs_write) self.wrap["woo"] = "bar" self.failUnless(self.wrap._needs_write) def test_needs_write_no(self): self.failIf(self.wrap._needs_write) self.wrap["~woo"] = "bar" self.failIf(self.wrap._needs_write) def test_pop(self): self.failIf(self.wrap._needs_write) self.wrap.pop("artist", None) self.failUnless(self.wrap._needs_write) def test_getitem(self): self.failUnlessEqual(self.wrap["title"], "woo") def test_get(self): self.failUnlessEqual(self.wrap.get("title"), "woo") self.failUnlessEqual(self.wrap.get("dne"), None) self.failUnlessEqual(self.wrap.get("dne", "huh"), "huh") def test_delitem(self): self.failUnless("title" in self.wrap) del(self.wrap["title"]) self.failIf("title" in self.wrap) self.failUnless(self.wrap._needs_write) def test_realkeys(self): self.failUnlessEqual(self.pwrap.realkeys(), self.psong.realkeys()) def test_can_change(self): for key in ["~foo", "title", "whee", "a test", "foo=bar", ""]: self.failUnlessEqual( self.pwrap.can_change(key), self.psong.can_change(key)) def test_comma(self): for key in ["title", "artist", "album", "notexist", "~length"]: self.failUnlessEqual(self.pwrap.comma(key), self.psong.comma(key)) def test_list(self): for key in ["title", "artist", "album", "notexist", "~length"]: self.failUnlessEqual(self.pwrap.list(key), self.psong.list(key)) def test_dicty(self): self.failUnlessEqual(self.pwrap.keys(), self.psong.keys()) self.failUnlessEqual( list(self.pwrap.values()), list(self.psong.values())) self.failUnlessEqual(self.pwrap.items(), self.psong.items()) def test_mtime(self): self.wrap._song.sanitize() self.failUnless(self.wrap.valid()) self.wrap["~#mtime"] = os.path.getmtime(self.filename) - 2 self.wrap._updated = False self.failIf(self.wrap.valid()) def test_setitem(self): self.failIf(self.wrap._was_updated()) self.wrap["title"] = "bar" self.failUnless(self.wrap._was_updated()) self.failUnlessEqual(self.wrap["title"], "bar") def test_not_really_updated(self): self.failIf(self.wrap._was_updated()) self.wrap["title"] = "woo" self.failIf(self.wrap._was_updated()) self.wrap["title"] = "quux" self.failUnless(self.wrap._was_updated()) def test_new_tag(self): self.failIf(self.wrap._was_updated()) self.wrap["version"] = "bar" self.failUnless(self.wrap._was_updated()) def test_bookmark(self): self.failUnlessEqual(self.psong.bookmarks, self.pwrap.bookmarks) self.pwrap.bookmarks = [(43, "another mark")] self.failUnlessEqual(self.psong["~bookmark"], "0:43 another mark") self.failUnlessEqual(self.psong.bookmarks, self.pwrap.bookmarks) class TListWrapper(TestCase): def test_empty(self): wrapped = ListWrapper([]) self.failUnlessEqual(wrapped, []) def test_empty_song(self): wrapped = ListWrapper([{}]) self.failUnless(len(wrapped) == 1) self.failIf(isinstance(wrapped[0], dict)) def test_none(self): wrapped = ListWrapper([None, None]) self.failUnless(len(wrapped) == 2) self.failUnlessEqual(wrapped, [None, None]) class TPluginConfig(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_mapping(self): c = PluginConfig("some") c.set("foo", "bar") self.assertEqual(config.get("plugins", "some_foo"), "bar") def test_defaults(self): c = PluginConfig("some") c.defaults.set("hm", "mh") self.assertEqual(c.get("hm"), "mh") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_mmkeys.py����������������������������������������������������������������0000644�0001750�0001750�00000001460�13112005742�020016� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, init_fake_app, destroy_fake_app from quodlibet import app from quodlibet.mmkeys import MMKeysHandler, iter_backends class TMmKeys(TestCase): def setUp(self): init_fake_app() def tearDown(self): destroy_fake_app() def test_handler(self): handler = MMKeysHandler(app) handler.quit() def test_backends(self): for backend in iter_backends(): backend.is_active() instance = backend("Foo", lambda action: None) instance.grab() instance.cancel() instance.cancel() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_config.py����������������������������������������������������������������0000644�0001750�0001750�00000005322�13112005742�017757� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from quodlibet.config import RatingsPrefs from tests import TestCase, mkstemp from quodlibet import config from quodlibet.compat import PY2 class Tconfig(TestCase): def setUp(self): config.init() def test_init_garbage_file(self): config.quit() garbage = b"\xf1=\xab\xac" fd, filename = mkstemp() os.close(fd) with open(filename, "wb") as f: f.write(garbage) config.init(filename) self.assertTrue(config.options("player")) invalid_filename = filename + ".not-valid" self.assertTrue(os.path.exists(invalid_filename)) with open(invalid_filename, "rb") as f: self.assertEqual(f.read(), garbage) os.remove(filename) os.remove(invalid_filename) def tearDown(self): config.quit() class TRatingsPrefs(TestCase): initial_number = int(config.INITIAL["settings"]["ratings"]) def setUp(self): config.init() self.prefs = RatingsPrefs() def test_getters(self): # A little pointless, and brittle, but still. self.failUnlessEqual(self.prefs.number, self.initial_number) self.failUnlessEqual(self.prefs.precision, 1.0 / self.initial_number) symbol_full = config.INITIAL["settings"]["rating_symbol_full"] if PY2: symbol_full = symbol_full.decode("utf-8") self.failUnlessEqual(self.prefs.full_symbol, symbol_full) symbol_blank = config.INITIAL["settings"]["rating_symbol_blank"] if PY2: symbol_blank = symbol_blank.decode("utf-8") self.failUnlessEqual(self.prefs.blank_symbol, symbol_blank) def test_caching(self): self.failUnlessEqual(self.prefs.number, self.initial_number) self.prefs.number = 10 self.prefs.default = 0.1 # Read it back, and it's fine self.failUnlessEqual(self.prefs.number, 10) self.failUnlessEqual(self.prefs.default, 0.1) # .. but modify behind the scenes (unsupported)... config.reset("settings", "ratings") config.reset("settings", "default_rating") # ...and caching will return the old one self.failUnlessEqual(self.prefs.number, 10) self.failUnlessEqual(self.prefs.default, 0.1) def test_all(self): self.prefs.number = 5 # Remember zero is a possible rating too self.failUnlessEqual(len(self.prefs.all), 6) self.failUnlessEqual(self.prefs.all, [0, 0.2, 0.4, 0.6, 0.8, 1.0]) def tearDown(self): config.quit() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_cli.py�������������������������������������������������������������������0000644�0001750�0001750�00000001425�13112005742�017261� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from .helper import capture_output from quodlibet import cli from tests import TestCase class Tcli(TestCase): def test_process_no_arguments_works(self): with capture_output() as (out, err): cli.process_arguments(["myprog"]) self.assertFalse(out.getvalue()) self.assertFalse(err.getvalue()) def test_process_arguments_errors_on_invalid_opt(self): with self.assertRaises(SystemExit): with capture_output(): cli.process_arguments(["myprog", "--wrong-thing"]) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_plugins_songsmenu.py�����������������������������������������������������0000644�0001750�0001750�00000016072�13112005742�022275� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import shutil from quodlibet.library import SongLibrary from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.plugins.songshelpers import any_song, each_song from tests import TestCase, mkstemp, mkdtemp import os from quodlibet.formats import AudioFile from quodlibet.plugins import PluginManager, Plugin from quodlibet.qltk.songsmenu import SongsMenuPluginHandler from tests.helper import capture_output from tests.test_library_libraries import FakeSong class TSongsMenuPlugins(TestCase): def _confirmer(self, *args): self.confirmed = True def setUp(self): self.tempdir = mkdtemp() self.pm = PluginManager(folders=[self.tempdir]) self.confirmed = False self.handler = SongsMenuPluginHandler(self._confirmer, self._confirmer) self.pm.register_handler(self.handler) self.pm.rescan() self.assertEquals(self.pm.plugins, []) self.library = SongLibrary('foo') def tearDown(self): self.library.destroy() self.pm.quit() shutil.rmtree(self.tempdir) def create_plugin(self, id='', name='', desc='', icon='', funcs=None, mod=False): fd, fn = mkstemp(suffix='.py', text=True, dir=self.tempdir) file = os.fdopen(fd, 'w') if mod: indent = '' else: file.write( "from quodlibet.plugins.songsmenu import SongsMenuPlugin\n") file.write("class %s(SongsMenuPlugin):\n" % name) indent = ' ' file.write("%spass\n" % indent) if name: file.write("%sPLUGIN_ID = %r\n" % (indent, name)) if name: file.write("%sPLUGIN_NAME = %r\n" % (indent, name)) if desc: file.write("%sPLUGIN_DESC = %r\n" % (indent, desc)) if icon: file.write("%sPLUGIN_ICON = %r\n" % (indent, icon)) for f in (funcs or []): if f in ["__init__"]: file.write("%sdef %s(self, *args): super(%s, self).__init__(" "*args); raise Exception(\"as expected\")\n" % (indent, f, name)) else: file.write("%sdef %s(*args): return args\n" % (indent, f)) file.flush() file.close() def test_empty_has_no_plugins(self): self.pm.rescan() self.assertEquals(self.pm.plugins, []) def test_name_and_desc_plus_func_is_one(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_song']) self.pm.rescan() self.assertEquals(len(self.pm.plugins), 1) def test_additional_functions_still_only_one(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_song', 'plugin_songs']) self.pm.rescan() self.assertEquals(len(self.pm.plugins), 1) def test_two_plugins_are_two(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_song']) self.create_plugin(name='Name2', desc='Desc2', funcs=['plugin_albums']) self.pm.rescan() self.assertEquals(len(self.pm.plugins), 2) def test_disables_plugin(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_song']) self.pm.rescan() self.failIf(self.pm.enabled(self.pm.plugins[0])) def test_enabledisable_plugin(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_song']) self.pm.rescan() plug = self.pm.plugins[0] self.pm.enable(plug, True) self.failUnless(self.pm.enabled(plug)) self.pm.enable(plug, False) self.failIf(self.pm.enabled(plug)) def test_ignores_broken_plugin(self): self.create_plugin(name="Broken", desc="Desc", funcs=["__init__", "plugin_song"]) self.pm.rescan() plug = self.pm.plugins[0] self.pm.enable(plug, True) with capture_output(): menu = self.handler.Menu(None, [AudioFile()]) self.failIf(menu and menu.get_children()) def test_Menu(self): self.create_plugin(name='Name', desc='Desc', funcs=['plugin_song']) self.handler.Menu(None, [AudioFile()]) def test_handling_songs_without_confirmation(self): plugin = Plugin(FakeSongsMenuPlugin) self.handler.plugin_enable(plugin) MAX = FakeSongsMenuPlugin.MAX_INVOCATIONS songs = [AudioFile({'~filename': "/tmp/%s" % x, 'artist': 'foo'}) for x in range(MAX)] self.handler.handle(plugin.id, self.library, None, songs) self.failIf(self.confirmed, ("Wasn't expecting a confirmation for %d" " invocations" % len(songs))) def test_handling_lots_of_songs_with_confirmation(self): plugin = Plugin(FakeSongsMenuPlugin) self.handler.plugin_enable(plugin) MAX = FakeSongsMenuPlugin.MAX_INVOCATIONS songs = [AudioFile({'~filename': "/tmp/%s" % x, 'artist': 'foo'}) for x in range(MAX + 1)] self.handler.handle(plugin.id, self.library, None, songs) self.failUnless(self.confirmed, ("Should have confirmed %d invocations (Max=%d)." % (len(songs), MAX))) def even(i): return i % 2 == 0 def never(_): return False class Tsongsmenu(TestCase): songs = [FakeSong(1), FakeSong(2)] def test_any_song(self): FakeSongsMenuPlugin.plugin_handles = any_song(even) p = FakeSongsMenuPlugin(self.songs, None) self.failUnless(p.plugin_handles(self.songs)) self.failIf(p.plugin_handles(self.songs[:1])) def test_any_song_multiple(self): FakeSongsMenuPlugin.plugin_handles = any_song(even, never) p = FakeSongsMenuPlugin(self.songs, None) self.failIf(p.plugin_handles(self.songs)) self.failIf(p.plugin_handles(self.songs[:1])) def test_each_song(self): FakeSongsMenuPlugin.plugin_handles = each_song(even) p = FakeSongsMenuPlugin(self.songs, None) self.failIf(p.plugin_handles(self.songs)) self.failUnless(p.plugin_handles(self.songs[1:])) def test_each_song_multiple(self): FakeSongsMenuPlugin.plugin_handles = each_song(even, never) p = FakeSongsMenuPlugin(self.songs, None) self.failIf(p.plugin_handles(self.songs)) self.failIf(p.plugin_handles(self.songs[:1])) class FakeSongsMenuPlugin(SongsMenuPlugin): PLUGIN_NAME = "Fake Songs Menu Plugin" PLUGIN_ID = "SongsMunger" MAX_INVOCATIONS = 50 def __init__(self, songs, library): super(FakeSongsMenuPlugin, self).__init__(songs, library) self.total = 0 def plugin_song(self, song): self.total += 1 if self.total > self.MAX_INVOCATIONS: raise ValueError("Shouldn't have called me on this many songs" " (%d > %d)" % (self.total, self.MAX_INVOCATIONS)) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_playlist_menu.py���������������������������������������������������������0000644�0001750�0001750�00000004300�13114753634�021406� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import quodlibet from quodlibet import qltk from quodlibet.browsers.playlists.menu import PlaylistMenu from quodlibet.browsers.playlists.util import PLAYLISTS from quodlibet.formats import AudioFile from quodlibet.library import SongLibrarian from quodlibet.library.libraries import FileLibrary from tests.helper import dummy_path from tests import TestCase, _TEMP_DIR FIXED_NAME = "_foobar" class StubbedPlaylistMenu(PlaylistMenu): def _get_new_name(self, parent, title): return FIXED_NAME class TPlaylistMenu(TestCase): SONG = AudioFile({ "title": "two", "artist": "mu", "~filename": dummy_path(u"/dev/zero")}) SONGS = [ AudioFile({ "title": "one", "artist": "piman", "~filename": dummy_path(u"/dev/null")}), SONG, ] def setUp(self): # Testing locally is VERY dangerous without this... self.assertTrue(_TEMP_DIR in PLAYLISTS or os.name == "nt", msg="Failing, don't want to delete %s" % PLAYLISTS) try: os.mkdir(PLAYLISTS) except EnvironmentError: pass quodlibet.config.init() self.lib = FileLibrary() self.lib.librarian = SongLibrarian() for af in self.SONGS: af.sanitize() self.lib.add(self.SONGS) self.added = [] def tearDown(self): self.lib.destroy() self.lib.librarian.destroy() quodlibet.config.quit() def _on_new(self, _, playlist): self.added.append(playlist) def test__on_new_playlist_activate(self): main = qltk.MenuItem('Menu') menu = StubbedPlaylistMenu(self.SONGS, []) menu.connect('new', self._on_new) main.set_submenu(menu) menu._on_new_playlist_activate(main, self.SONGS) self.failUnless(self.added, msg="No playlists signalled") self.failUnlessEqual(self.added[0].songs, self.SONGS) self.added[0].delete() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_copool.py�����������������������������������������������������������0000644�0001750�0001750�00000010247�13112005742�021044� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from gi.repository import Gtk from quodlibet.util import copool class Tcopool(TestCase): def setUp(self): while Gtk.events_pending(): Gtk.main_iteration() self.buffer = None self.go = True def tearDown(self): copool.remove_all() def __set_buffer(self): while self.go: self.buffer = True yield None def test_add_remove(self): copool.add(self.__set_buffer) Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.assertEquals(self.buffer, True) copool.remove(self.__set_buffer) self.buffer = None Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.assertEquals(self.buffer, None) def test_add_remove_with_funcid(self): copool.add(self.__set_buffer, funcid="test") Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.assertEquals(self.buffer, True) copool.remove("test") self.buffer = None Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.assertEquals(self.buffer, None) def test_pause_resume(self): copool.add(self.__set_buffer) Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) copool.pause(self.__set_buffer) self.buffer = None Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.assertEquals(self.buffer, None) copool.resume(self.__set_buffer) Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.assertEquals(self.buffer, True) copool.remove(self.__set_buffer) self.buffer = None Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) def test_pause_resume_with_funcid(self): copool.add(self.__set_buffer, funcid="test") Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) copool.pause("test") self.buffer = None Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.assertEquals(self.buffer, None) copool.resume("test") copool.resume("test") Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.assertEquals(self.buffer, True) copool.remove("test") self.buffer = None Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) def test_pause_restart_pause(self): copool.add(self.__set_buffer, funcid="test") Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.failUnless(self.buffer) copool.pause("test") self.buffer = None Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.failIf(self.buffer) copool.add(self.__set_buffer, funcid="test") Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.failUnless(self.buffer) copool.pause("test") self.buffer = None Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.failIf(self.buffer) def test_pause_all(self): copool.add(self.__set_buffer, funcid="test") Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.failUnless(self.buffer) copool.pause_all() self.buffer = None Gtk.main_iteration_do(False) Gtk.main_iteration_do(False) self.failIf(self.buffer) def test_step(self): copool.add(self.__set_buffer, funcid="test") copool.pause("test") self.assertTrue(copool.step("test")) self.go = False self.assertFalse(copool.step("test")) self.assertRaises(ValueError, copool.step, "test") def test_timeout(self): copool.add(self.__set_buffer, funcid="test", timeout=100) copool.pause("test") copool.resume("test") copool.remove("test") self.assertRaises(ValueError, copool.step, "test") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_trash.py������������������������������������������������������������0000644�0001750�0001750�00000004177�13112005742�020677� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Tests for quodlibet.util.trash.""" import os import sys from quodlibet import config from quodlibet.util import is_linux from quodlibet.util.trash import use_trash, trash from tests import TestCase, mkstemp, skipUnless class Ttrash(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_use_trash_is_false_on_non_posix(self): old_os_name = os.name try: os.name = 'not posix' self.assertFalse(use_trash()) finally: os.name = old_os_name def test_use_trash_is_false_on_darwin(self): old_os_name = os.name old_sys_platform = sys.platform try: os.name = 'posix' sys.platform = 'darwin' self.assertFalse(use_trash()) finally: os.name = old_os_name sys.platform = old_sys_platform def test_use_trash_is_true_by_default_on_posix(self): old_os_name = os.name old_sys_platform = sys.platform try: os.name = 'posix' sys.platform = 'linux' self.assertTrue(use_trash()) finally: os.name = old_os_name sys.platform = old_sys_platform def test_use_trash_is_false_when_bypassed(self): old_os_name = os.name old_sys_platform = sys.platform try: config.set('settings', 'bypass_trash', "true") os.name = 'posix' sys.platform = 'linux' self.assertFalse(use_trash()) finally: os.name = old_os_name sys.platform = old_sys_platform @skipUnless(is_linux(), reason="Trash only supported for Linux") def test_trash_removes_file(self): filename = mkstemp()[1] with open(filename, "w") as f: f.write("\n") self.failUnless(os.path.exists(filename)) trash(filename) self.failIf(os.path.exists(filename)) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_songlistcolumns.py��������������������������������������������������0000644�0001750�0001750�00000005047�13112005742�023014� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from .helper import visible from gi.repository import Gtk from senf import devnull from quodlibet.qltk.songlistcolumns import create_songlist_column from quodlibet.qltk.songmodel import PlaylistModel from quodlibet.formats import AudioFile import quodlibet.config class TSongListColumns(TestCase): def setUp(self): quodlibet.config.init() def tearDown(self): quodlibet.config.quit() def _render_column(self, column, **kwargs): view = Gtk.TreeView() model = PlaylistModel() view.set_model(model) song = AudioFile({"~filename": devnull, "~#rating": 0.6666}) song.update(kwargs) model.append(row=[song]) view.append_column(column) if column.get_resizable(): column.set_expand(True) with visible(view): view.columns_autosize() text = column.get_cells()[0].get_property("text") self.assertIsNot(text, None) return text def test_date(self): column = create_songlist_column("~#added") self._render_column(column) # column reuse triggers warning somwhow column = create_songlist_column("~#added") self._render_column(column, **{"~#added": 100}) def test_length(self): column = create_songlist_column("~length") self._render_column(column) def test_filesize(self): column = create_songlist_column("~#filesize") self._render_column(column) def test_rating(self): column = create_songlist_column("~rating") text = self._render_column(column) self.assertNotEqual(text, "0.67") column = create_songlist_column("~#rating") text = self._render_column(column) self.assertEqual(text, "0.67") def test_bitrate(self): column = create_songlist_column("~#bitrate") self._render_column(column) def test_basename(self): column = create_songlist_column("~basename") self._render_column(column) def test_pattern(self): column = create_songlist_column("<artist>-<album>") self._render_column(column) def test_artist(self): column = create_songlist_column("artist") self._render_column(column) def test_people(self): column = create_songlist_column("~people") self._render_column(column) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_xiph.py����������������������������������������������������������0000644�0001750�0001750�00000046517�13112005742�021230� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.config import RATINGS from tests import get_data_path, skipUnless, mkstemp, TestCase import os import sys import base64 from quodlibet import config, const, formats from quodlibet.formats.xiph import OggFile, FLACFile, OggOpusFile, OggOpus from quodlibet.formats._image import EmbeddedImage, APICType from quodlibet.compat import long, cBytesIO, iteritems from mutagen.flac import FLAC, Picture from mutagen.id3 import ID3, TIT2, ID3NoHeaderError from mutagen.oggvorbis import OggVorbis from .helper import get_temp_copy def _get_jpeg(size=5): from gi.repository import GdkPixbuf pb = GdkPixbuf.Pixbuf.new( GdkPixbuf.Colorspace.RGB, False, 8, size, size) fd, fn = mkstemp() pb.savev(fn, "jpeg", [], []) with os.fdopen(fd, "rb") as h: data = h.read() os.unlink(fn) return data class TXiphPickle(TestCase): # make sure the classes are available at the old paths # so unpickling old libraries works. def test_modules_flac(self): self.failUnless("formats.flac" in sys.modules) mod = sys.modules["formats.flac"] self.failUnless(mod.FLACFile is FLACFile) def test_modules_vorbis(self): self.failUnless("formats.oggvorbis" in sys.modules) mod = sys.modules["formats.oggvorbis"] self.failUnless(mod.OggFile is OggFile) class TVCFile(TestCase): # Mixin to test Vorbis writing features def setUp(self): config.init() config.set("editing", "save_email", "") config.set("editing", "save_to_songs", "1") class TVCFileMixin(object): def test_rating(self): self.song["~#rating"] = 0.2 self.song.write() song = type(self.song)(self.filename) self.failUnlessEqual(song["~#rating"], 0.2) def test_channels(self): assert self.song("~#channels") == 2 def test_deletes_rating(self): config.set("editing", "save_email", "foo@bar.org") self.song["~#rating"] = 0.2 self.song.write() self.song["~#rating"] = RATINGS.default self.song.write() song = type(self.song)(self.filename) config.set("editing", "save_email", const.EMAIL) self.failUnlessEqual(song("~#rating"), RATINGS.default) def test_new_email_rating(self): config.set("editing", "save_email", "foo@bar.org") self.song["~#rating"] = 0.2 self.song.write() song = type(self.song)(self.filename) config.set("editing", "save_email", const.EMAIL) self.failUnlessEqual(song["~#rating"], 0.2) def test_default_email_rating(self): self.song["~#rating"] = 0.2 self.song.write() song = type(self.song)(self.filename) config.set("editing", "save_email", "foo@bar.org") config.set("editing", "save_email", const.EMAIL) self.failUnlessEqual(song["~#rating"], 0.2) def test_different_email_rating(self): config.set("editing", "save_email", "foo@bar.org") self.song["~#rating"] = 0.2 self.song.write() config.set("editing", "save_email", const.EMAIL) song = type(self.song)(self.filename) self.failUnlessEqual(song("~#rating"), RATINGS.default) song.write() config.set("editing", "save_email", "foo@bar.org") song = type(self.song)(self.filename) config.set("editing", "save_email", const.EMAIL) self.failUnlessEqual(song["~#rating"], 0.2) def test_huge_playcount(self): count = long(1000000000000000) self.song["~#playcount"] = count self.song.write() song = type(self.song)(self.filename) self.failUnlessEqual(song["~#playcount"], count) def test_parameter(self): for bad in ["rating", "playcount", "rating:foo", "playcount:bar"]: self.failIf(self.song.can_change(bad)) def test_parameter_ci(self): for bad in ["ratinG", "plaYcount", "raTing:foo", "playCount:bar"]: self.failIf(self.song.can_change(bad)) def test_case_insensitive(self): self.song["foo"] = "1" self.song["FOO"] = "1" self.song.write() self.song.reload() self.failUnlessEqual(self.song.list("foo"), ["1", "1"]) def test_case_insensitive_total(self): self.song["TRacKNUMBER"] = "1/10" self.song.write() self.song.reload() self.failUnlessEqual(self.song["tracknumber"], "1/10") def test_dont_save(self): config.set("editing", "save_to_songs", "false") self.song["~#rating"] = 1.0 self.song.write() song = type(self.song)(self.filename) config.set("editing", "save_to_songs", "true") self.failUnlessEqual(song("~#rating"), RATINGS.default) def test_can_change(self): self.failUnless(self.song.can_change()) class TTotalTagsBase(TestCase): """Test conversation between the tracknumber/totaltracks/tracktotal format and the tracknumber="x/y" format. """ MAIN = None FALLBACK = None SINGLE = None def setUp(self): config.init() self.filename = get_temp_copy(get_data_path('empty.ogg')) def tearDown(self): os.unlink(self.filename) config.quit() class TTotalTagsMixin(object): def __load_tags(self, tags, expected): m = OggVorbis(self.filename) for key, value in iteritems(tags): m.tags[key] = value m.save() song = OggFile(self.filename) for key, value in iteritems(expected): self.failUnlessEqual(song(key), value) if self.MAIN not in expected: self.failIf(self.MAIN in song) if self.SINGLE not in expected: self.failIf(self.SINGLE in song) if self.FALLBACK not in expected: self.failIf(self.FALLBACK in song) def test_load_old_single(self): self.__load_tags( {self.SINGLE: "1/42"}, {self.SINGLE: "1/42"}) def test_load_main(self): self.__load_tags( {self.SINGLE: "3", self.MAIN: "10"}, {self.SINGLE: "3/10"}) def test_load_fallback(self): self.__load_tags( {self.SINGLE: "3", self.FALLBACK: "10"}, {self.SINGLE: "3/10"}) def test_load_all(self): self.__load_tags( {self.SINGLE: "3", self.FALLBACK: "10", self.MAIN: "5"}, {self.SINGLE: "3/5", self.FALLBACK: "10"}) def test_load_main_no_single(self): self.__load_tags( {self.MAIN: "5"}, {self.SINGLE: "/5"}) def test_load_fallback_no_single(self): self.__load_tags( {self.FALLBACK: "6"}, {self.SINGLE: "/6"}) def test_load_both_no_single(self): self.__load_tags( {self.FALLBACK: "6", self.MAIN: "5"}, {self.FALLBACK: "6", self.SINGLE: "/5"}) def __save_tags(self, tags, expected): #return song = OggFile(self.filename) for key, value in iteritems(tags): song[key] = value song.write() m = OggVorbis(self.filename) # test if all values ended up where we wanted for key, value in iteritems(expected): self.failUnless(key in m.tags) self.failUnlessEqual(m.tags[key], [value]) # test if not specified are not there if self.MAIN not in expected: self.failIf(self.MAIN in m.tags) if self.FALLBACK not in expected: self.failIf(self.FALLBACK in m.tags) if self.SINGLE not in expected: self.failIf(self.SINGLE in m.tags) def test_save_single(self): self.__save_tags( {self.SINGLE: "1/2"}, {self.SINGLE: "1", self.MAIN: "2"}) def test_save_main(self): self.__save_tags( {self.MAIN: "3"}, {self.MAIN: "3"}) def test_save_fallback(self): self.__save_tags( {self.FALLBACK: "3"}, {self.MAIN: "3"}) def test_save_single_and_main(self): # not clear what to do here... self.__save_tags( {self.SINGLE: "1/2", self.MAIN: "3"}, {self.SINGLE: "1", self.MAIN: "3"}) def test_save_single_and_fallback(self): self.__save_tags( {self.SINGLE: "1/2", self.FALLBACK: "3"}, {self.SINGLE: "1", self.MAIN: "2", self.FALLBACK: "3"}) def test_save_all(self): # not clear what to do here... self.__save_tags( {self.SINGLE: "1/2", self.MAIN: "4", self.FALLBACK: "3"}, {self.SINGLE: "1", self.MAIN: "4", self.FALLBACK: "3"}) class TTrackTotal(TTotalTagsBase, TTotalTagsMixin): MAIN = "tracktotal" FALLBACK = "totaltracks" SINGLE = "tracknumber" class TDiscTotal(TTotalTagsBase, TTotalTagsMixin): MAIN = "disctotal" FALLBACK = "totaldiscs" SINGLE = "discnumber" class TFLACFile(TVCFile, TVCFileMixin): def setUp(self): TVCFile.setUp(self) self.filename = get_temp_copy(get_data_path('empty.flac')) self.song = FLACFile(self.filename) def test_format_codec(self): self.assertEqual(self.song("~format"), "FLAC") self.assertEqual(self.song("~codec"), "FLAC") self.assertEqual(self.song("~encoding"), "") def test_mime(self): self.failUnless(self.song.mimes) def test_save_empty(self): self.song.write() flac = FLAC(self.filename) self.failIf(flac.tags) self.failIf(flac.tags is None) def test_strip_id3(self): self.song["title"] = "Test" self.song.write() id3 = ID3() id3.add(TIT2(encoding=2, text=u"Test but differently")) id3.save(filename=self.filename) song2 = formats.MusicFile(self.filename) self.failUnlessEqual(type(self.song), type(song2)) self.failUnlessEqual(self.song["title"], song2["title"]) song2.write() self.assertRaises(ID3NoHeaderError, ID3, self.filename) def tearDown(self): os.unlink(self.filename) config.quit() class TVCCover(TestCase): def setUp(self): config.init() def tearDown(self): os.unlink(self.filename) config.quit() class TVCCoverMixin(object): def test_can_change_images(self): song = self.QLType(self.filename) self.assertTrue(song.can_change_images) def test_no_cover(self): song = self.QLType(self.filename) self.failIf(song("~picture")) self.failIf(song.get_primary_image()) def test_get_images(self): # coverart + coverartmime data = _get_jpeg() song = self.MutagenType(self.filename) song["coverart"] = base64.b64encode(data).decode("ascii") song["coverartmime"] = u"image/jpeg" song.save() song = self.QLType(self.filename) self.assertEqual(len(song.get_images()), 1) self.assertEqual(song.get_images()[0].mime_type, "image/jpeg") # metadata_block_picture pic = Picture() pic.data = _get_jpeg() pic.type = APICType.COVER_FRONT b64pic_cover = base64.b64encode(pic.write()).decode("ascii") song = self.MutagenType(self.filename) song["metadata_block_picture"] = [b64pic_cover] song.save() song = self.QLType(self.filename) self.assertEqual(len(song.get_images()), 2) self.assertEqual(song.get_images()[0].type, APICType.COVER_FRONT) def test_handle_old_coverart(self): data = _get_jpeg() song = self.MutagenType(self.filename) song["coverart"] = base64.b64encode(data).decode("ascii") song["coverartmime"] = "image/jpeg" song.save() song = self.QLType(self.filename) self.failUnlessEqual(song("~picture"), "y") self.failIf(song("coverart")) self.failIf(song("coverartmime")) song.write() self.assertEqual(song.get_primary_image().mime_type, "image/jpeg") fn = song.get_primary_image().file cov_data = fn.read() self.failUnlessEqual(data, cov_data) song = self.MutagenType(self.filename) self.failUnlessEqual(base64.b64decode(song["coverart"][0]), data) self.failUnlessEqual(song["coverartmime"][0], "image/jpeg") def test_handle_invalid_coverart(self): crap = u".-a,a.f,afa-,.-" song = self.MutagenType(self.filename) song["coverart"] = crap song.save() song = self.QLType(self.filename) self.failUnlessEqual(song("~picture"), "y") self.failIf(song("coverart")) self.failIf(song.get_primary_image()) self.failIf(song("~picture")) song.write() song = self.MutagenType(self.filename) self.failUnlessEqual(song["coverart"][0], crap) def test_handle_picture_block(self): pic = Picture() pic.data = _get_jpeg() pic.type = APICType.COVER_FRONT b64pic_cover = base64.b64encode(pic.write()).decode("ascii") pic2 = Picture() pic2.data = _get_jpeg(size=6) pic2.type = APICType.COVER_BACK b64pic_other = base64.b64encode(pic2.write()).decode("ascii") song = self.MutagenType(self.filename) song["metadata_block_picture"] = [b64pic_other, b64pic_cover] song.save() song = self.QLType(self.filename) self.failUnlessEqual(song("~picture"), "y") fn = song.get_primary_image().file self.failUnlessEqual(pic.data, fn.read()) song.write() song = self.MutagenType(self.filename) self.failUnless(b64pic_other in song["metadata_block_picture"]) self.failUnless(b64pic_cover in song["metadata_block_picture"]) song["metadata_block_picture"] = [b64pic_other] song.save() song = self.QLType(self.filename) fn = song.get_primary_image().file self.failUnlessEqual(pic2.data, fn.read()) def test_handle_invalid_picture_block(self): crap = ".-a,a.f,afa-,.-" song = self.MutagenType(self.filename) song["metadata_block_picture"] = crap song.save() song = self.QLType(self.filename) self.failUnlessEqual(song("~picture"), "y") self.failIf(song("metadata_block_picture")) self.failIf(song.get_primary_image()) self.failIf(song("~picture")) song.write() song = self.MutagenType(self.filename) self.failUnlessEqual(song["metadata_block_picture"][0], crap) def test_handle_invalid_flac_picture(self): crap = b".-a,a.f,afa-,.-" song = self.MutagenType(self.filename) song["metadata_block_picture"] = base64.b64encode(crap).decode("ascii") song.save() song = self.QLType(self.filename) self.failIf(song.get_primary_image()) self.failIf(song.get_images()) def test_set_image(self): data = _get_jpeg() song = self.MutagenType(self.filename) song["coverart"] = base64.b64encode(data).decode("ascii") song["coverartmime"] = "image/jpeg" song.save() fileobj = cBytesIO(b"foo") image = EmbeddedImage(fileobj, "image/jpeg", 10, 10, 8) song = self.QLType(self.filename) self.assertTrue(song.has_images) self.assertTrue(song.get_primary_image()) self.assertTrue(song.has_images) song.set_image(image) self.assertTrue(song.has_images) self.assertEqual(song.get_primary_image().width, 10) song = self.MutagenType(self.filename) self.assertTrue("coverart" not in song) self.assertTrue("coverartmime" not in song) class TVCCoverOgg(TVCCover, TVCCoverMixin): def setUp(self): TVCCover.setUp(self) self.filename = get_temp_copy(get_data_path('empty.ogg')) self.MutagenType = OggVorbis self.QLType = OggFile class TVCCoverFlac(TVCCover, TVCCoverMixin): def setUp(self): TVCCover.setUp(self) self.filename = get_temp_copy(get_data_path('empty.flac')) self.MutagenType = FLAC self.QLType = FLACFile class TFlacPicture(TestCase): def setUp(self): config.init() self.filename = get_temp_copy(get_data_path('empty.flac')) def test_get_images(self): pic = Picture() pic.data = _get_jpeg() pic.type = APICType.COVER_FRONT b64pic_cover = base64.b64encode(pic.write()).decode("ascii") # metadata_block_picture song = FLAC(self.filename) song["metadata_block_picture"] = [b64pic_cover] song.save() song = FLACFile(self.filename) self.assertEqual(len(song.get_images()), 1) self.assertEqual(song.get_images()[0].type, APICType.COVER_FRONT) # flac Picture song = FLAC(self.filename) pic = Picture() pic.data = _get_jpeg() pic.type = APICType.COVER_BACK song.add_picture(pic) song.save() song = FLACFile(self.filename) self.assertEqual(len(song.get_images()), 2) self.assertEqual(song.get_images()[-1].type, APICType.COVER_BACK) def test_get_image(self): data = b"abc" song = FLAC(self.filename) pic = Picture() pic.data = data song.add_picture(pic) song.save() song = FLACFile(self.filename) self.failUnless(song("~picture")) fn = song.get_primary_image().file self.failUnlessEqual(fn.read(), pic.data) def test_clear_images(self): data = b"abc" song = FLAC(self.filename) pic = Picture() pic.data = data song.add_picture(pic) song.save() song = FLACFile(self.filename) self.assertTrue(song.get_primary_image()) song.clear_images() song.clear_images() song = FLACFile(self.filename) self.assertFalse(song.get_primary_image()) def test_set_image(self): fileobj = cBytesIO(b"foo") image = EmbeddedImage(fileobj, "image/jpeg", 10, 10, 8) song = FLACFile(self.filename) self.assertFalse(song.get_primary_image()) song.set_image(image) self.assertEqual(song.get_primary_image().width, 10) def tearDown(self): os.unlink(self.filename) config.quit() class TOggFile(TVCFile, TVCFileMixin): def setUp(self): TVCFile.setUp(self) self.filename = get_temp_copy(get_data_path('empty.ogg')) self.song = OggFile(self.filename) def tearDown(self): os.unlink(self.filename) config.quit() def test_format_codec(self): self.assertEqual(self.song("~format"), "Ogg Vorbis") self.assertEqual(self.song("~codec"), "Ogg Vorbis") self.assertEqual(self.song("~encoding"), "") @skipUnless(OggOpus, "Ogg Opus mutagen support missing") class TOggOpusFile(TVCFile, TVCFileMixin): def setUp(self): TVCFile.setUp(self) self.filename = get_temp_copy(get_data_path('empty.opus')) self.song = OggOpusFile(self.filename) def test_length(self): self.assertAlmostEqual(self.song("~#length"), 3.6847, 3) self.failUnless("opusenc" in self.song("encoder")) def test_channels(self): assert self.song("~#channels") == 2 def test_format_codec(self): self.assertEqual(self.song("~format"), "Ogg Opus") self.assertEqual(self.song("~codec"), "Ogg Opus") self.assertEqual(self.song("~encoding"), "libopus 0.9.14") def tearDown(self): os.unlink(self.filename) config.quit() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_https.py�����������������������������������������������������������������0000644�0001750�0001750�00000004505�13112005742�017656� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. import pytest from gi.repository import Gio, Soup, GLib from tests import TestCase, skipIf from quodlibet.util import is_linux, get_ca_file from quodlibet.compat import urlopen, build_opener @pytest.mark.network @skipIf(is_linux(), "not on linux") class Thttps(TestCase): """For Windows/OSX to check if we can create a TLS connection using both openssl and whatever backend soup/gio uses. """ GOOD = ["https://sha256.badssl.com/"] BAD = [ "https://expired.badssl.com/", "https://wrong.host.badssl.com/", "https://self-signed.badssl.com/", ] def test_urllib(self): for url in self.GOOD: urlopen(url, cafile=get_ca_file()).close() for url in self.BAD: with self.assertRaises(Exception): urlopen(url, cafile=get_ca_file()).close() def test_urllib_default(self): for url in self.GOOD: urlopen(url).close() for url in self.BAD: with self.assertRaises(Exception): urlopen(url).close() def test_urllib_build_opener(self): for url in self.GOOD: build_opener().open(url).close() for url in self.BAD: with self.assertRaises(Exception): build_opener().open(url).close() def test_gio(self): for url in self.GOOD: client = Gio.SocketClient.new() client.set_tls(True) client.connect_to_uri(url, 443, None).close() for url in self.BAD: with self.assertRaises(GLib.GError): client = Gio.SocketClient.new() client.set_tls(True) client.connect_to_uri(url, 443, None).close() def test_soup(self): for url in self.GOOD: session = Soup.Session.new() request = session.request_http("get", url) request.send(None).close() for url in self.BAD: with self.assertRaises(GLib.GError): session = Soup.Session.new() request = session.request_http("get", url) request.send(None).close() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/gtk_helpers.py����������������������������������������������������������������0000644�0001750�0001750�00000000775�13112005742�017771� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation class MockSelData(object): # Gtk.SelectionData is missing a constructor def set(self, type, format, data): self.type = type self.format = format self.data = data def get_data_type(self): return self.type def get_data(self): return self.data ���quodlibet-3.9.1/tests/test_formats_mpc.py�����������������������������������������������������������0000644�0001750�0001750�00000003022�13112005742�021017� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from tests import TestCase, get_data_path from quodlibet.formats.mpc import MPCFile class TMPCFile(TestCase): def setUp(self): self.song = MPCFile(get_data_path('silence-44-s.mpc')) self.song2 = MPCFile(get_data_path('silence-44-s.sv8.mpc')) def test_length(self): self.assertAlmostEqual(self.song("~#length"), 0.065306, 3) self.assertAlmostEqual(self.song2("~#length"), 3.684716, 3) def test_channels(self): assert self.song("~#channels") == 2 assert self.song2("~#channels") == 2 def test_bitrate(self): self.failUnlessEqual(self.song("~#bitrate"), 239) self.failUnlessEqual(self.song2("~#bitrate"), 1) def test_invalid(self): path = get_data_path('empty.xm') self.failUnless(os.path.exists(path)) self.failUnlessRaises(Exception, MPCFile, path) def test_format(self): self.assertEqual(self.song("~format"), "Musepack") self.assertEqual(self.song2("~format"), "Musepack") def test_codec(self): self.assertEqual(self.song("~codec"), "Musepack SV7") self.assertEqual(self.song2("~codec"), "Musepack SV8") def test_encoding(self): self.assertEqual(self.song("~encoding"), "") self.assertEqual(self.song2("~encoding"), "") ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/helper.py���������������������������������������������������������������������0000644�0001750�0001750�00000020536�13112005742�016736� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # 2015 Anton Shestakov # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import contextlib import sys import shutil import locale import errno from gi.repository import Gtk, Gdk from senf import fsnative, environ from quodlibet.qltk import find_widgets, get_primary_accel_mod from quodlibet.util.path import normalize_path from quodlibet.compat import StringIO def dummy_path(path): path = fsnative(path) if os.name == "nt": return normalize_path(u"z:\\" + path.replace(u"/", u"\\")) return path @contextlib.contextmanager def locale_numeric_conv( decimal_point=".", grouping=[3, 3, 0], thousands_sep=","): """Temporarely change number formatting conventions. By default this uses en_US conventions. """ # XXX: locale internals override = locale._override_localeconv old = override.copy() try: override["decimal_point"] = decimal_point override["grouping"] = grouping override["thousands_sep"] = thousands_sep yield finally: override.clear() override.update(old) def _send_key_click_event(widget, **kwargs): """Returns True if the event was handled""" assert widget.get_realized() assert widget.get_visible() ev = Gdk.Event() ev.any.window = widget.get_window() for key, value in kwargs.items(): assert hasattr(ev.key, key) setattr(ev.key, key, value) ev.any.type = Gdk.EventType.KEY_PRESS handled = widget.event(ev) ev.any.type = Gdk.EventType.KEY_RELEASE handled |= widget.event(ev) return handled def send_key_click(widget, accel, recursive=False): """Send a key press and release event to a widget or to all widgets in the hierarchy if recursive is True. The widget has to be visible for this to work, so this is needed: with visible(widget): send_key_click(widget, "<ctrl>a") Returns how often the event was handled. """ key, mods = Gtk.accelerator_parse(accel) assert key is not None assert mods is not None assert isinstance(widget, Gtk.Widget) handled = _send_key_click_event(widget, state=mods, keyval=key) if recursive: if isinstance(widget, Gtk.Container): for child in widget.get_children(): handled += send_key_click(child, accel, recursive) return handled def _send_button_click_event(widget, **kwargs): """Returns True if the event was handled""" assert widget.get_realized() assert widget.get_visible() ev = Gdk.Event() window = widget.get_window() ev.any.window = window ev.button.x = window.get_width() / 2.0 ev.button.y = window.get_height() / 2.0 for key, value in kwargs.items(): assert hasattr(ev.button, key) setattr(ev.button, key, value) ev.any.type = Gdk.EventType.BUTTON_PRESS handled = widget.event(ev) ev.any.type = Gdk.EventType.BUTTON_RELEASE handled |= widget.event(ev) return handled def send_button_click(widget, button, primary=False, shift=False, recursive=False): """See send_key_click_event""" state = Gdk.ModifierType(0) if primary: state |= get_primary_accel_mod() if shift: state |= Gdk.ModifierType.SHIFT_MASK assert isinstance(widget, Gtk.Widget) handled = _send_button_click_event(widget, button=button, state=state) if recursive: if isinstance(widget, Gtk.Container): for child in widget.get_children(): handled += send_button_click( child, button, primary, shift, recursive) return handled @contextlib.contextmanager def realized(widget): """Makes sure the widget is realized. view = Gtk.TreeView() with realized(view): do_something(view) """ own_window = False toplevel = widget.get_toplevel() if not isinstance(toplevel, Gtk.Window): window = Gtk.Window(type=Gtk.WindowType.POPUP) window.add(widget) own_window = True else: window = toplevel # realize all widgets without showing them for sub in find_widgets(window, Gtk.Widget): sub.realize() widget.realize() while Gtk.events_pending(): Gtk.main_iteration() assert widget.get_realized() assert window.get_realized() yield widget if own_window: window.remove(widget) window.destroy() while Gtk.events_pending(): Gtk.main_iteration() @contextlib.contextmanager def visible(widget, width=None, height=None): """Makes sure the widget is visible. view = Gtk.TreeView() with visible(view): do_something(view) """ own_window = False toplevel = widget.get_toplevel() if not isinstance(toplevel, Gtk.Window): window = Gtk.Window(type=Gtk.WindowType.POPUP) window.add(widget) own_window = True else: window = toplevel if width is not None and height is not None: window.resize(width, height) window.show_all() while Gtk.events_pending(): Gtk.main_iteration() assert widget.get_visible() assert window.get_visible() yield widget while Gtk.events_pending(): Gtk.main_iteration() window.hide() if own_window: window.remove(widget) window.destroy() while Gtk.events_pending(): Gtk.main_iteration() @contextlib.contextmanager def preserve_environ(): old = environ.copy() yield # don't touch existing values as os.environ is broken for empty # keys on Windows: http://bugs.python.org/issue20658 for key, value in list(environ.items()): if key not in old: del environ[key] for key, value in old.items(): if key not in environ or environ[key] != value: environ[key] = value @contextlib.contextmanager def capture_output(): """ with capture_output() as (stdout, stderr): some_action() print stdout.getvalue(), stderr.getvalue() """ err = StringIO() out = StringIO() old_err = sys.stderr old_out = sys.stdout sys.stderr = err sys.stdout = out try: yield (out, err) finally: sys.stderr = old_err sys.stdout = old_out @contextlib.contextmanager def temp_filename(*args, **kwargs): """Creates an empty file and removes it when done. with temp_filename() as filename: with open(filename, 'w') as h: h.write("foo") do_stuff(filename) """ from tests import mkstemp fd, filename = mkstemp(*args, **kwargs) os.close(fd) yield filename try: os.remove(filename) except OSError as e: if e.errno != errno.ENOENT: raise def get_temp_copy(path): """Returns a copy of the file with the same extension""" from tests import mkstemp ext = os.path.splitext(path)[-1] fd, filename = mkstemp(suffix=ext) os.close(fd) shutil.copy(path, filename) return filename class ListWithUnused(object): """ This class stores a set of elements and provides the interface to check if it contains an arbitrary element, and then to know if some of the elements stored were never accessed. Some tests use this class to store whitelisted/blacklisted things that are deemed acceptable, but would trigger those tests if they weren't made special cases (e.g. UI messages that conform to a particular writing style, but can't be tested automatically). Since such whitelists reside in tests and not in the code that produces those special cases, it's easy to change (fix) the code and then forget to remove the special case from tests, leaving it there to never be used again. This class then provides a way to see if such particular element doesn't actually need to be in the whitelist anymore. """ def __init__(self, *args): self.store = set(args) self.unused = set(args) def __contains__(self, item): self.unused.discard(item) return item in self.store def check_unused(self): if self.unused: from quodlibet import print_w print_w('ListWithUnused has unused items: %s' % self.unused) ������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_commands.py��������������������������������������������������������������0000644�0001750�0001750�00000005652�13112005742�020321� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import fsnative from quodlibet.formats import AudioFile from tests import TestCase, init_fake_app, destroy_fake_app from .helper import capture_output from gi.repository import Gtk from quodlibet import config from quodlibet import app from quodlibet.compat import text_type from quodlibet.commands import registry class TCommands(TestCase): def setUp(self): config.init() init_fake_app() def tearDown(self): destroy_fake_app() config.quit() def __send(self, command): command = fsnative(text_type(command)) return registry.handle_line(app, command) def test_query(self): self.__send(u"query foo") self.assertEqual(self.__send("print-query-text"), u"foo\n") def test_player(self): self.__send("previous") self.__send("force-previous") self.__send("next") self.__send("pause") self.__send("play-pause") self.__send("play") self.__send("stop") self.__send("volume +1000") self.__send("volume 40") self.__send("volume -10") self.__send("seek -10") self.__send("seek +10") self.__send("seek 0") def test_misc(self): with capture_output(): self.__send("play-file /dev/null") self.__send("dump-playlist") self.__send("dump-queue") self.__send("enqueue /dev/null") self.__send("enqueue-files /dev/null") self.__send("filter album=test") self.__send("query '/foobar/'") self.__send("focus") self.__send("hide-window") self.__send("dump-browsers") self.__send("open-browser SearchBar") from quodlibet.qltk.browser import LibraryBrowser for window in Gtk.Window.list_toplevels(): if isinstance(window, LibraryBrowser): window.destroy() self.__send("properties") self.__send("queue 1") self.__send("quit") self.__send("random album") self.__send("refresh") self.__send("repeat 0") self.__send("set-browser 1") self.__send("set-rating 0.5") self.__send("show-window") self.__send("song-list 1") self.__send("stop-after 1") self.__send("status") self.__send("toggle-window") self.__send("unqueue /dev/null") def test_enqueue_files(self): songs = [AudioFile({"~filename": fn, "title": fn}) for fn in ["one", "two, please", "slash\\.mp3", "four"]] app.library.add(songs) self.assertFalse(app.window.playlist.q.get()) self.__send("enqueue-files " "one,two\\, please,slash\\\\.mp3,four") self.assertEquals(app.window.playlist.q.get(), songs) ��������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk__editutils.py�������������������������������������������������������0000644�0001750�0001750�00000003426�13112005742�021715� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.formats import DUMMY_SONG from quodlibet.qltk._editutils import FilterCheckButton, \ OverwriteWarning, WriteFailedError, FilterPluginBox, EditingPluginHandler class FCB(FilterCheckButton): _section = _key = _label = "foo" class FCB2(FCB): _order = 1.0 class FCB3(FCB): _order = 1.2 class FCB4(FCB): _order = 1.3 class FCB5(FCB): _order = 1.3 class FCB1(FCB): _order = 1.4 class TFilterCheckButton(TestCase): def setUp(self): self.fcb1 = FCB1() self.fcb2 = FCB2() self.fcb3 = FCB3() self.fcb4 = FCB4() self.fcb5 = FCB5() def test_filter(self): self.failUnlessRaises(NotImplementedError, self.fcb1.filter, "", "") def test_filter_list(self): self.failUnlessRaises( NotImplementedError, self.fcb1.filter_list, [""], [""]) def test_cmp(self): l = [self.fcb1, self.fcb2, self.fcb3, self.fcb4, self.fcb5] l.sort() self.failUnlessEqual( l, [self.fcb2, self.fcb3, self.fcb4, self.fcb5, self.fcb1]) def tearDown(self): for cb in [self.fcb1, self.fcb2, self.fcb3, self.fcb4, self.fcb5]: cb.destroy() class TEditDialogs(TestCase): def test_overwrite(self): OverwriteWarning(None, DUMMY_SONG).destroy() def test_write_failed(self): WriteFailedError(None, DUMMY_SONG).destroy() class TFilterPluginBox(TestCase): def test_main(self): handler = EditingPluginHandler() x = FilterPluginBox(handler) self.assertEqual(x.filters, []) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_util.py�������������������������������������������������������������0000644�0001750�0001750�00000001266�13112005742�020525� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from gi.repository import Gtk from tests import TestCase from .helper import realized from quodlibet.qltk.util import position_window_beside_widget class Tposition_window_beside_widget(TestCase): def test_main(self): button = Gtk.Button() window = Gtk.Window() with realized(button): position_window_beside_widget(window, button, True) position_window_beside_widget(window, button, False) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_seekbutton.py�������������������������������������������������������0000644�0001750�0001750�00000002237�13112005742�021732� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from tests import TestCase from quodlibet.qltk.seekbutton import HSlider, SeekButton, TimeLabel from quodlibet.library import SongLibrary from quodlibet.player.nullbe import NullPlayer class TSlider(TestCase): def test_basics(self): s = HSlider() s.set_slider_disabled(True) s.set_slider_disabled(False) s.set_slider_length(100) s.set_slider_widget(Gtk.Button()) s.destroy() class TTimeLabel(TestCase): def test_time_label(self): l = TimeLabel() l.set_time(42) time_text = l.get_text() l.set_disabled(True) disabled_text = l.get_text() self.assertNotEqual(time_text, disabled_text) l.set_disabled(False) self.assertEqual(l.get_text(), time_text) class TSeekButton(TestCase): def test_seekbutton(self): w = SeekButton(NullPlayer(), SongLibrary()) w.destroy() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_query.py�����������������������������������������������������������������0000644�0001750�0001750�00000053671�13112005742�017671� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- encoding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import time from senf import fsnative from quodlibet import config from quodlibet.compat import xrange from quodlibet.formats import AudioFile from quodlibet.query import Query, QueryType from quodlibet.query import _match as match from tests import TestCase, skip class TQuery_is_valid(TestCase): def test_re(self): self.failUnless(Query.is_valid('t = /an re/')) self.failUnless(Query.is_valid('t = /an re/c')) self.failUnless(Query.is_valid('t = /an\\/re/')) self.failIf(Query.is_valid('t = /an/re/')) self.failUnless(Query.is_valid('t = /aaa/lsic')) self.failIf(Query.is_valid('t = /aaa/icslx')) def test_str(self): self.failUnless(Query.is_valid('t = "a str"')) self.failUnless(Query.is_valid('t = "a str"c')) self.failUnless(Query.is_valid('t = "a\\"str"')) # there's no equivalent failure for strings since 'str"' would be # read as a set of modifiers def test_tag(self): self.failUnless(Query.is_valid('t = tag')) self.failUnless(Query.is_valid('t = !tag')) self.failUnless(Query.is_valid('t = |(tag, bar)')) self.failUnless(Query.is_valid('t = a"tag"')) self.failIf(Query.is_valid('t = a, tag')) self.failUnless(Query.is_valid('tag with spaces = tag')) def test_empty(self): self.failUnless(Query.is_valid('')) self.failUnless(Query.is_parsable('')) self.failUnless(Query('')) def test_emptylist(self): self.failIf(Query.is_valid("a = &()")) self.failIf(Query.is_valid("a = |()")) self.failIf(Query.is_valid("|()")) self.failIf(Query.is_valid("&()")) def test_nonsense(self): self.failIf(Query.is_valid('a string')) self.failIf(Query.is_valid('t = #(a > b)')) self.failIf(Query.is_valid("=a= = /b/")) self.failIf(Query.is_valid("a = &(/b//")) self.failIf(Query.is_valid("(a = &(/b//)")) def test_trailing(self): self.failIf(Query.is_valid('t = /an re/)')) self.failIf(Query.is_valid('|(a, b = /a/, c, d = /q/) woo')) def test_not(self): self.failUnless(Query.is_valid('t = !/a/')) self.failUnless(Query.is_valid('t = !!/a/')) self.failUnless(Query.is_valid('!t = "a"')) self.failUnless(Query.is_valid('!!t = "a"')) self.failUnless(Query.is_valid('t = !|(/a/, !"b")')) self.failUnless(Query.is_valid('t = !!|(/a/, !"b")')) self.failUnless(Query.is_valid('!|(t = /a/)')) def test_taglist(self): self.failUnless(Query.is_valid('a, b = /a/')) self.failUnless(Query.is_valid('a, b, c = |(/a/)')) self.failUnless(Query.is_valid('|(a, b = /a/, c, d = /q/)')) self.failIf(Query.is_valid('a = /a/, b')) def test_andor(self): self.failUnless(Query.is_valid('a = |(/a/, /b/)')) self.failUnless(Query.is_valid('a = |(/b/)')) self.failUnless(Query.is_valid('|(a = /b/, c = /d/)')) self.failUnless(Query.is_valid('a = &(/a/, /b/)')) self.failUnless(Query.is_valid('a = &(/b/)')) self.failUnless(Query.is_valid('&(a = /b/, c = /d/)')) def test_numcmp(self): self.failUnless(Query.is_valid("#(t < 3)")) self.failUnless(Query.is_valid("#(t <= 3)")) self.failUnless(Query.is_valid("#(t > 3)")) self.failUnless(Query.is_valid("#(t >= 3)")) self.failUnless(Query.is_valid("#(t = 3)")) self.failUnless(Query.is_valid("#(t != 3)")) self.failIf(Query.is_valid("#(t !> 3)")) self.failIf(Query.is_valid("#(t >> 3)")) def test_numcmp_func(self): self.assertTrue(Query.is_valid("#(t:min < 3)")) self.assertTrue( Query.is_valid("&(#(playcount:min = 0), #(added < 1 month ago))")) def test_trinary(self): self.failUnless(Query.is_valid("#(2 < t < 3)")) self.failUnless(Query.is_valid("#(2 >= t > 3)")) # useless, but valid self.failUnless(Query.is_valid("#(5 > t = 2)")) def test_list(self): self.failUnless(Query.is_valid("#(t < 3, t > 9)")) self.failUnless(Query.is_valid("t = &(/a/, /b/)")) self.failUnless(Query.is_valid("s, t = |(/a/, /b/)")) self.failUnless(Query.is_valid("|(t = /a/, s = /b/)")) def test_nesting(self): self.failUnless(Query.is_valid("|(s, t = &(/a/, /b/),!#(2 > q > 3))")) def test_extension(self): self.failUnless(Query.is_valid("@(name)")) self.failUnless(Query.is_valid("@(name: extension body)")) self.failUnless(Query.is_valid("@(name: body (with (nested) parens))")) self.failUnless(Query.is_valid(r"@(name: body \\ with \) escapes)")) self.failIf(Query.is_valid("@()")) self.failIf(Query.is_valid(r"@(invalid %name!\\)")) self.failIf(Query.is_valid("@(name: mismatched ( parenthesis)")) self.failIf(Query.is_valid(r"@(\()")) self.failIf(Query.is_valid("@(name:unclosed body")) self.failIf(Query.is_valid("@ )")) def test_numexpr(self): self.failUnless(Query.is_valid("#(t < 3*4)")) self.failUnless(Query.is_valid("#(t * (1+r) < 7)")) self.failUnless(Query.is_valid("#(0 = t)")) self.failUnless(Query.is_valid("#(t < r < 9)")) self.failUnless(Query.is_valid("#((t-9)*r < -(6*2) = g*g-1)")) self.failUnless(Query.is_valid("#(t + 1 + 2 + -4 * 9 > g*(r/4 + 6))")) self.failUnless(Query.is_valid("#(date < 2010-4)")) self.failUnless(Query.is_valid("#(date < 2010 - 4)")) self.failUnless(Query.is_valid("#(date > 0000)")) self.failUnless(Query.is_valid("#(date > 00004)")) self.failUnless(Query.is_valid("#(t > 3 minutes)")) self.failUnless(Query.is_valid("#(added > today)")) self.failUnless(Query.is_valid("#(length < 5:00)")) self.failUnless(Query.is_valid("#(filesize > 5M)")) self.failUnless(Query.is_valid("#(added < 7 days ago)")) self.failIf(Query.is_valid("#(3*4)")) self.failIf(Query.is_valid("#(t = 3 + )")) self.failIf(Query.is_valid("#(t = -)")) self.failIf(Query.is_valid("#(-4 <)")) self.failIf(Query.is_valid("#(t < ()")) self.failIf(Query.is_valid("#((t +) - 1 > 8)")) self.failIf(Query.is_valid("#(t += 8)")) class TQuery(TestCase): def setUp(self): config.init() self.s1 = AudioFile( {"album": u"I Hate: Tests", "artist": u"piman", "title": u"Quuxly", "version": u"cake mix", "~filename": fsnative(u"/dir1/foobar.ogg"), "~#length": 224, "~#skipcount": 13, "~#playcount": 24, "date": u"2007-05-24"}) self.s2 = AudioFile( {"album": u"Foo the Bar", "artist": u"mu", "title": u"Rockin' Out", "~filename": fsnative(u"/dir2/something.mp3"), "tracknumber": u"12/15"}) self.s3 = AudioFile({ "artist": u"piman\nmu", "~filename": fsnative(u"/test/\xf6\xe4\xfc/fo\xfc.ogg"), "~mountpoint": fsnative(u"/bla/\xf6\xe4\xfc/fo\xfc"), }) self.s4 = AudioFile({"title": u"Ångström", "utf8": u"Ångström"}) self.s5 = AudioFile({"title": u"oh&blahhh", "artist": u"!ohno"}) def tearDown(self): config.quit() def test_basic_tag(self): assert Query("album=foo").search(self.s2) assert not Query("album=.").search(self.s2) assert Query("album=/./").search(self.s2) def test_inequality(self): self.failUnless(Query("album!=foo").search(self.s1)) self.failIf(Query("album!=foo").search(self.s2)) @skip("Enable for basic benchmarking of Query") def test_inequality_performance(self): t = time.time() for i in xrange(500): # Native assert is a bit lighter... assert Query("album!=foo the bar").search(self.s1) assert Query("album=foo the bar").search(self.s2) assert Query("foo the bar").search(self.s2) assert not Query("foo the bar").search(self.s1) us = (time.time() - t) * 1000000 / ((i + 1) * 4) print("Blended Query searches average %.0f μs" % us) @skip("Enable for basic benchmarking of Query") def test_inequality_equalish_performance(self): t0 = time.time() repeats = 2000 for i in xrange(repeats): assert Query("album!=foo the bar").search(self.s1) ineq_time = (time.time() - t0) t1 = time.time() for i in xrange(repeats): assert Query("album=!foo the bar").search(self.s1) not_val_time = (time.time() - t1) self.assertAlmostEqual(ineq_time, not_val_time, places=1) def test_repr(self): query = Query("foo = bar", []) self.assertEqual( repr(query).replace("u'", "'"), "<Query string='foo = bar' type=QueryType.VALID star=[]>") query = Query("bar", ["foo"]) self.assertEqual( repr(query).replace("u'", "'"), "<Query string='&(/bar/d)' type=QueryType.TEXT star=['foo']>") def test_2007_07_27_synth_search(self): song = AudioFile({"~filename": fsnative(u"foo/64K/bar.ogg")}) query = Query("~dirname = !64K") self.failIf(query.search(song), "%r, %r" % (query, song)) def test_empty(self): self.failIf(Query("foobar = /./").search(self.s1)) def test_gte(self): self.failUnless(Query("#(track >= 11)").search(self.s2)) def test_re(self): for s in ["album = /i hate/", "artist = /pi*/", "title = /x.y/"]: self.failUnless(Query(s).search(self.s1)) self.failIf(Query(s).search(self.s2)) f = Query("artist = /mu|piman/").search self.failUnless(f(self.s1)) self.failUnless(f(self.s2)) def test_re_escape(self): af = AudioFile({"foo": "\""}) assert Query('foo="\\""').search(af) af = AudioFile({"foo": "/"}) assert Query('foo=/\\//').search(af) def test_not(self): for s in ["album = !hate", "artist = !pi"]: self.failIf(Query(s).search(self.s1)) self.failUnless(Query(s).search(self.s2)) def test_abbrs(self): for s in ["b = /i hate/", "a = /pi*/", "t = /x.y/"]: self.failUnless(Query(s).search(self.s1)) self.failIf(Query(s).search(self.s2)) def test_str(self): for k in self.s2.keys(): v = self.s2[k] self.failUnless(Query('%s = "%s"' % (k, v)).search(self.s2)) self.failIf(Query('%s = !"%s"' % (k, v)).search(self.s2)) def test_numcmp(self): self.failIf(Query("#(track = 0)").search(self.s1)) self.failIf(Query("#(notatag = 0)").search(self.s1)) self.failUnless(Query("#(track = 12)").search(self.s2)) def test_trinary(self): self.failUnless(Query("#(11 < track < 13)").search(self.s2)) self.failUnless(Query("#(11 < track <= 12)").search(self.s2)) self.failUnless(Query("#(12 <= track <= 12)").search(self.s2)) self.failUnless(Query("#(12 <= track < 13)").search(self.s2)) self.failUnless(Query("#(13 > track > 11)").search(self.s2)) self.failUnless(Query("#(20 > track < 20)").search(self.s2)) def test_not_2(self): for s in ["album = !/i hate/", "artist = !/pi*/", "title = !/x.y/"]: self.failUnless(Query(s).search(self.s2)) self.failIf(Query(s).search(self.s1)) def test_case(self): self.failUnless(Query("album = /i hate/").search(self.s1)) self.failUnless(Query("album = /I Hate/").search(self.s1)) self.failUnless(Query("album = /i Hate/").search(self.s1)) self.failUnless(Query("album = /i Hate/i").search(self.s1)) self.failUnless(Query(u"title = /ångström/").search(self.s4)) self.failIf(Query("album = /i hate/c").search(self.s1)) self.failIf(Query(u"title = /ångström/c").search(self.s4)) def test_re_and(self): self.failUnless(Query("album = &(/ate/,/est/)").search(self.s1)) self.failIf(Query("album = &(/ate/, /ets/)").search(self.s1)) self.failIf(Query("album = &(/tate/, /ets/)").search(self.s1)) def test_re_or(self): self.failUnless(Query("album = |(/ate/,/est/)").search(self.s1)) self.failUnless(Query("album = |(/ate/,/ets/)").search(self.s1)) self.failIf(Query("album = |(/tate/, /ets/)").search(self.s1)) def test_newlines(self): self.failUnless(Query("a = /\n/").search(self.s3)) self.failUnless(Query("a = /\\n/").search(self.s3)) self.failIf(Query("a = /\n/").search(self.s2)) self.failIf(Query("a = /\\n/").search(self.s2)) def test_exp_and(self): self.failUnless(Query("&(album = ate, artist = man)").search(self.s1)) self.failIf(Query("&(album = ate, artist = nam)").search(self.s1)) self.failIf(Query("&(album = tea, artist = nam)").search(self.s1)) def test_exp_or(self): self.failUnless(Query("|(album = ate, artist = man)").search(self.s1)) self.failUnless(Query("|(album = ate, artist = nam)").search(self.s1)) self.failIf(Query("&(album = tea, artist = nam)").search(self.s1)) def test_dumb_search(self): self.failUnless(Query("ate man").search(self.s1)) self.failUnless(Query("Ate man").search(self.s1)) self.failIf(Query("woo man").search(self.s1)) self.failIf(Query("not crazy").search(self.s1)) def test_dumb_search_value(self): self.failUnless(Query("|(ate, foobar)").search(self.s1)) self.failUnless(Query("!!|(ate, foobar)").search(self.s1)) self.failUnless(Query("&(ate, te)").search(self.s1)) self.failIf(Query("|(foo, bar)").search(self.s1)) self.failIf(Query("&(ate, foobar)").search(self.s1)) self.failIf(Query("! !&(ate, foobar)").search(self.s1)) self.failIf(Query("&blah").search(self.s1)) self.failUnless(Query("&blah oh").search(self.s5)) self.failUnless(Query("!oh no").search(self.s5)) self.failIf(Query("|blah").search(self.s1)) # https://github.com/quodlibet/quodlibet/issues/1056 self.failUnless(Query("&(ate, piman)").search(self.s1)) def test_dumb_search_value_negate(self): self.failUnless(Query("!xyz").search(self.s1)) self.failUnless(Query("!!!xyz").search(self.s1)) self.failUnless(Query(" !!!&(xyz, zyx)").search(self.s1)) self.failIf(Query("!man").search(self.s1)) self.failUnless(Query("&(tests,piman)").search(self.s1)) self.failUnless(Query("&(tests,!nope)").search(self.s1)) self.failIf(Query("&(tests,!!nope)").search(self.s1)) self.failIf(Query("&(tests,!piman)").search(self.s1)) self.failUnless(Query("&(tests,|(foo,&(pi,!nope)))").search(self.s1)) def test_dumb_search_regexp(self): self.failUnless(Query("/(x|H)ate/").search(self.s1)) self.failUnless(Query("'PiMan'").search(self.s1)) self.failIf(Query("'PiMan'c").search(self.s1)) self.failUnless(Query("!'PiMan'c").search(self.s1)) self.failIf(Query("!/(x|H)ate/").search(self.s1)) def test_unslashed_search(self): self.failUnless(Query("artist=piman").search(self.s1)) self.failUnless(Query(u"title=ång").search(self.s4)) self.failIf(Query("artist=mu").search(self.s1)) self.failIf(Query(u"title=äng").search(self.s4)) def test_synth_search(self): self.failUnless(Query("~dirname=/dir1/").search(self.s1)) self.failUnless(Query("~dirname=/dir2/").search(self.s2)) self.failIf(Query("~dirname=/dirty/").search(self.s1)) self.failIf(Query("~dirname=/dirty/").search(self.s2)) def test_search_almostequal(self): a, b = AudioFile({"~#rating": 0.771}), AudioFile({"~#rating": 0.769}) self.failUnless(Query("#(rating = 0.77)").search(a)) self.failUnless(Query("#(rating = 0.77)").search(b)) def test_and_or_neg_operator(self): union = Query("|(foo=bar,bar=foo)") inter = Query("&(foo=bar,bar=foo)") neg = Query("!foo=bar") numcmp = Query("#(bar = 0)") tag = Query("foo=bar") tests = [inter | tag, tag | tag, neg | neg, tag | inter, neg | union, union | union, inter | inter, numcmp | numcmp, numcmp | union] self.failIf( list(filter(lambda x: not isinstance(x, match.Union), tests))) tests = [inter & tag, tag & tag, neg & neg, tag & inter, neg & union, union & union, inter & inter, numcmp & numcmp, numcmp & inter] self.failIf( list(filter(lambda x: not isinstance(x, match.Inter), tests))) self.assertTrue(isinstance(-neg, match.Tag)) true = Query("") self.assertTrue(isinstance(true | inter, match.True_)) self.assertTrue(isinstance(inter | true, match.True_)) self.assertTrue(isinstance(true & inter, match.Inter)) self.assertTrue(isinstance(inter & true, match.Inter)) self.assertTrue(isinstance(true & true, match.True_)) self.assertTrue(isinstance(true | true, match.True_)) self.assertTrue(isinstance(-true, match.Neg)) def test_filter(self): q = Query("artist=piman") self.assertEqual(q.filter([self.s1, self.s2]), [self.s1]) self.assertEqual(q.filter(iter([self.s1, self.s2])), [self.s1]) q = Query("") self.assertEqual(q.filter([self.s1, self.s2]), [self.s1, self.s2]) self.assertEqual( q.filter(iter([self.s1, self.s2])), [self.s1, self.s2]) def test_match_all(self): self.failUnless(Query.match_all("")) self.failUnless(Query.match_all(" ")) self.failIf(Query.match_all("foo")) def test_utf8(self): # also handle undecoded values self.assertTrue(Query(u"utf8=Ångström").search(self.s4)) def test_fs_utf8(self): self.failUnless(Query(u"~filename=foü.ogg").search(self.s3)) self.failUnless(Query(u"~filename=öä").search(self.s3)) self.failUnless(Query(u"~dirname=öäü").search(self.s3)) self.failUnless(Query(u"~basename=ü.ogg").search(self.s3)) def test_filename_utf8_fallback(self): self.failUnless(Query(u"filename=foü.ogg").search(self.s3)) self.failUnless(Query(u"filename=öä").search(self.s3)) def test_mountpoint_utf8_fallback(self): self.failUnless(Query(u"mountpoint=foü").search(self.s3)) self.failUnless(Query(u"mountpoint=öä").search(self.s3)) def test_mountpoint_no_value(self): af = AudioFile({"~filename": fsnative(u"foo")}) assert not Query(u"~mountpoint=bla").search(af) def test_star_numeric(self): self.assertRaises(ValueError, Query, u"foobar", star=["~#mtime"]) def test_match_diacriticals_explcit(self): assert Query(u'title=angstrom').search(self.s4) self.failIf(Query(u'title="Ångstrom"').search(self.s4)) self.failUnless(Query(u'title="Ångstrom"d').search(self.s4)) self.failUnless(Query(u'title=Ångström').search(self.s4)) self.failUnless(Query(u'title="Ångström"').search(self.s4)) self.failUnless(Query(u'title=/Ångström/').search(self.s4)) self.failUnless(Query(u'title="Ångstrom"d').search(self.s4)) self.failUnless(Query(u'title=/Angstrom/d').search(self.s4)) self.failUnless(Query(u'""d').search(self.s4)) def test_match_diacriticals_dumb(self): self.assertTrue(Query(u'Angstrom').search(self.s4)) self.assertTrue(Query(u'Ångström').search(self.s4)) self.assertTrue(Query(u'Ångstrom').search(self.s4)) self.assertFalse(Query(u'Ängström').search(self.s4)) def test_match_diacriticals_invalid_or_unsupported(self): # these fall back to test dumb searches: # invalid regex Query(u'/Sigur [r-zos/d') # group refs unsupported for diacritic matching Query(u'/(<)?(\w+@\w+(?:\.\w+)+)(?(1)>)/d') def test_numexpr(self): self.failUnless(Query("#(length = 224)").search(self.s1)) self.failUnless(Query("#(length = 3:44)").search(self.s1)) self.failUnless(Query("#(length = 3 minutes + 44 seconds)") .search(self.s1)) self.failUnless(Query("#(playcount > skipcount)").search(self.s1)) self.failUnless(Query("#(playcount < 2 * skipcount)").search(self.s1)) self.failUnless(Query("#(length > 3 minutes)").search(self.s1)) self.failUnless(Query("#(3:00 < length < 4:00)").search(self.s1)) self.failUnless(Query("#(40 seconds < length/5 < 1 minute)") .search(self.s1)) self.failUnless(Query("#(2+3 * 5 = 17)").search(self.s1)) self.failUnless(Query("#(playcount / 0 > 0)").search(self.s1)) self.failIf(Query("#(track + 1 != 13)").search(self.s2)) def test_numexpr_date(self): self.failUnless(Query("#(length < 2005-07-19)").search(self.s1)) self.failUnless(Query("#(date > 2005-07-19)").search(self.s1)) self.failUnless(Query("#(2005-11-24 < 2005-07-19)").search(self.s1)) self.failUnless(Query("#(date = (2007-05-19) + 5 days)") .search(self.s1)) self.failUnless(Query("#(date - 5 days = 2007-05-19)").search(self.s1)) self.failUnless(Query("#(2010-02-18 > date)").search(self.s1)) self.failUnless(Query("#(2010 > date)").search(self.s1)) self.failUnless(Query("#(date > 4)").search(self.s1)) self.failUnless(Query("#(date > 0004)").search(self.s1)) self.failUnless(Query("#(date > 0000)").search(self.s1)) class TQuery_get_type(TestCase): def test_red(self): for p in ["a = /w", "|(sa#"]: self.failUnlessEqual(QueryType.INVALID, Query.get_type(p)) def test_black(self): for p in ["a test", "more test hooray"]: self.failUnlessEqual(QueryType.TEXT, Query.get_type(p)) def test_green(self): for p in ["a = /b/", "&(a = b, c = d)", "/abc/", "!x", "!&(abc, def)"]: self.failUnlessEqual(QueryType.VALID, Query.get_type(p)) �����������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_maskedbox.py��������������������������������������������������������0000644�0001750�0001750�00000001064�13112005742�021521� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet import config from quodlibet.qltk.maskedbox import MaskedBox from quodlibet.library import SongFileLibrary class TMaskedBox(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test(self): lib = SongFileLibrary() MaskedBox(lib).destroy() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_metadata.py��������������������������������������������������������������0000644�0001750�0001750�00000007642�13112005742�020301� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import mkstemp, TestCase, get_data_path import os from quodlibet import formats from quodlibet import config from shutil import copyfileobj class TestMetaDataBase(TestCase): base = get_data_path("silence-44-s") def setUp(self): """Copy the base silent file to a temp name/location and load it""" config.init() fd, self.filename = mkstemp(suffix=self.ext, text=False) dst = os.fdopen(fd, 'wb') src = open(self.base + self.ext, 'rb') copyfileobj(src, dst) dst.close() self.song = formats.MusicFile(self.filename) def tearDown(self): """Delete the temp file""" os.remove(self.filename) del self.filename del self.song config.quit() class _TestMetaDataMixin(object): def test_base_data(self): self.failUnlessEqual(self.song['artist'], 'piman\njzig') self.failUnlessEqual(self.song['album'], 'Quod Libet Test Data') self.failUnlessEqual(self.song['title'], 'Silence') def test_mutability(self): self.failIf(self.song.can_change('=foo')) self.failIf(self.song.can_change('foo~bar')) self.failUnless(self.song.can_change('artist')) self.failUnless(self.song.can_change('title')) self.failUnless(self.song.can_change('tracknumber')) self.failUnless(self.song.can_change('somebadtag')) self.failUnless(self.song.can_change('some%punctuated:tag.')) def _test_tag(self, tag, values, remove=True): self.failUnless(self.song.can_change(tag)) for value in values: self.song[tag] = value self.song.write() written = formats.MusicFile(self.filename) self.failUnlessEqual(written[tag], value) if remove: del self.song[tag] self.song.write() deleted = formats.MusicFile(self.filename) self.failIf(tag in deleted) def test_artist(self): # a normalish tag self._test_tag('artist', [u'me', u'you\nme', u'\u6d5c\u5d0e\u3042\u3086\u307f']) def test_date(self): # unusual special handling for mp3s self._test_tag('date', [u'2004', u'2005', u'2005-06-12'], False) def test_genre(self): # unusual special handling for mp3s self._test_tag('genre', [u'Pop', u'Rock\nClassical', u'Big Bird', u'\u30a2\u30cb\u30e1\u30b5\u30f3\u30c8\u30e9']) def test_odd_performer(self): values = [u"A Person", u"Another"] self._test_tag("performer:vocals", values) self._test_tag("performer:guitar", values) def test_wackjob(self): # undefined tag self._test_tag('wackjob', [u'Jelly\nDanish', u'Muppet', u'\u30cf\u30f3\u30d0\u30fc\u30ac\u30fc']) tags = ['album', 'arranger', 'artist', 'author', 'comment', 'composer', 'conductor', 'copyright', 'discnumber', 'encodedby', 'genre', 'isrc', 'language', 'license', 'lyricist', 'organization', 'performer', 'title', 'tracknumber', 'version', 'xyzzy_undefined_tag', 'musicbrainz_trackid', 'releasecountry'] for ext in formats.loaders.keys(): if os.path.exists(TestMetaDataBase.base + ext): extra_tests = {} for tag in tags: if tag in ['artist', 'date', 'genre']: continue def _test_tag(self, tag=tag): self._test_tag(tag, [u'a']) extra_tests['test_tag_' + tag] = _test_tag def _test_tags(self, tag=tag): self._test_tag(tag, [u'b\nc']) extra_tests['test_tags_' + tag] = _test_tags name = 'MetaData' + ext testcase = type( name, (TestMetaDataBase, _TestMetaDataMixin), extra_tests) testcase.ext = ext globals()[name] = testcase ����������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_soundcloudLibrary.py�����������������������������������������������������0000644�0001750�0001750�00000010477�13112005742�022225� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import config from quodlibet.browsers.soundcloud.api import SoundcloudApiClient from quodlibet.browsers.soundcloud.library import SoundcloudLibrary from quodlibet.compat import listvalues from tests import TestCase PERMALINK = "https://soundcloud.com/" "kerstineden/banging-techno-sets-098-kerstin-eden-02-2015" AVATAR_URL = u'https://i1.sndcdn.com/avatars-000127864033-q70sz6-large.jpg' TRACK = { u'reposts_count': 134, u'attachments_uri': u'https://api.soundcloud.com/tracks/193910405/attachments', u'video_url': None, u'track_type': None, u'release_month': 3, u'original_format': u'mp3', u'uri': u'https://api.soundcloud.com/tracks/193910405', u'label_name': None, u'duration': 3944440, u'id': 193910405, u'streamable': True, u'user_id': 313827, u'user_favorite': True, u'title': u'Banging Techno Sets :: 098 Kerstin Eden // 03-2015', u'favoritings_count': 882, u'commentable': True, u'comment_count': 39, u'download_url': u'https://api.soundcloud.com/tracks/193910405/download', u'label_id': None, u'downloadable': True, u'last_modified': u'2015/03/02 22:32:30 +0000', u'waveform_url': u'https://w1.sndcdn.com/Ugov31icy2XG_m.png', u'sharing': u'public', u'description': u'Banging Techno sets :: 098 ' u'>> Kerstin Eden // Timao \n' u'fnoob techno - http://www.fnoobtechno.com/radio', u'release_day': 2, u'purchase_url': None, u'permalink': u'banging-techno-sets-098-kerstin-eden-02-2015', u'purchase_title': None, u'stream_url': u'https://api.soundcloud.com/tracks/193910405/stream', u'key_signature': u'', u'user': {u'username': u'Kerstin Eden', u'kind': u'user', u'uri': u'https://api.soundcloud.com/users/313827', u'permalink': u'kerstineden', u'avatar_url': AVATAR_URL, u'last_modified': u'2016/02/25 14:21:56 +0000', u'permalink_url': u'http://soundcloud.com/kerstineden', u'id': 313827}, u'genre': u'banging techno', u'isrc': None, u'download_count': 2062, u'permalink_url': PERMALINK, u'kind': u'track', u'playback_count': 23656, u'license': u'all-rights-reserved', u'artwork_url': u'https://i1.sndcdn.com/artworks-000108682375-q4j7y6-large.jpg', u'embeddable_by': u'all', u'bpm': None, u'state': u'finished', u'original_content_size': 157768013, u'release_year': 2015, u'user_playback_count': 4, u'release': u'', u'tag_list': u'"kerstin eden" eden nimmersatt abstract frankfurt Techno', u'created_at': u'2015/03/02 22:31:30 +0000'} class TSoundcloudLibrary(TestCase): class FakeClient(SoundcloudApiClient): def get_tracks(self, query): self._on_track_data(None, [TRACK], None) def __init__(self, token=None): super(TSoundcloudLibrary.FakeClient, self).__init__(token) def authenticate_user(self): pass def setUp(self): SoundcloudLibrary.librarian = None self.lib = SoundcloudLibrary(self.FakeClient()) def tearDown(self): self.lib.destroy() @classmethod def setUpClass(cls): config.RATINGS = config.HardCodedRatingsPrefs() def test_parse(self): lib = self.lib lib.query_with_refresh("dummy search") songs = listvalues(lib._contents) self.failUnlessEqual(len(songs), 1) s = songs[0] self.failUnlessEqual(s("artist"), "Kerstin Eden") self.failUnlessEqual(s("date"), "2015-03-02") self.failUnlessEqual(s("~#download_count"), 2062) self.failUnlessEqual(s("~#playback_count"), 23656) self.failUnlessEqual(s("~#favoritings_count"), 882) self.failUnlessEqual(s("~#rating"), 1.0) self.failUnlessEqual(s("~#playcount"), 4) assert int(s("~#bitrate")) == 319 def test_artwork_url(self): lib = SoundcloudLibrary(self.FakeClient()) lib.query_with_refresh("") s = listvalues(lib._contents)[0] self.failUnlessEqual( s("artwork_url"), "https://i1.sndcdn.com/artworks-000108682375-q4j7y6-t500x500.jpg") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util.py������������������������������������������������������������������0000644�0001750�0001750�00000113562�13115500547�017503� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import uuid import tempfile import os import sys import threading import traceback import time import logging from senf import getcwd, fsnative, fsn2bytes, bytes2fsn, mkdtemp from quodlibet import _ from quodlibet.compat import text_type, PY2 from quodlibet.config import HardCodedRatingsPrefs, DurationFormat from quodlibet import config from quodlibet import util from quodlibet.util.dprint import print_exc, format_exception, extract_tb, \ PrintHandler from quodlibet.util import format_time_long as f_t_l, format_time_preferred, \ format_time_display, format_time_seconds from quodlibet.util import re_escape from quodlibet.util.library import set_scan_dirs, get_scan_dirs from quodlibet.util.path import fsn2glib, glib2fsn, \ parse_xdg_user_dirs, xdg_get_system_data_dirs, escape_filename, \ strip_win32_incompat_from_path, xdg_get_cache_home, environ, \ xdg_get_data_home, unexpand, expanduser, xdg_get_user_dirs, \ xdg_get_config_home, get_temp_cover_file, mkdir, mtime from quodlibet.util.string import decode, encode, split_escape, join_escape from quodlibet.util.string.splitters import split_people, split_title, \ split_album from . import TestCase, skipIf from .helper import capture_output, locale_numeric_conv is_win = os.name == "nt" class Tmkdir(TestCase): def test_exists(self): mkdir(".") def test_notdirectory(self): self.failUnlessRaises(OSError, mkdir, __file__) def test_manydeep(self): self.failUnless(not os.path.isdir("nonext")) t = mkdtemp() path = os.path.join(t, "nonext", "test", "test2", "test3") mkdir(path) try: self.failUnless(os.path.isdir(path)) finally: os.rmdir(path) path = os.path.dirname(path) os.rmdir(path) path = os.path.dirname(path) os.rmdir(path) path = os.path.dirname(path) os.rmdir(path) os.rmdir(t) class Tgetcwd(TestCase): def test_Tgetcwd(self): self.assertTrue(isinstance(getcwd(), fsnative)) class Tmtime(TestCase): def test_equal(self): self.failUnlessEqual(mtime("."), os.path.getmtime(".")) def test_bad(self): self.failIf(os.path.exists("/dev/doesnotexist")) self.failUnlessEqual(mtime("/dev/doesnotexist"), 0) class Tget_locale_encoding(TestCase): def test_main(self): assert isinstance(util.get_locale_encoding(), str) class Tformat_locale(TestCase): def test_format_int_locale(self): assert isinstance(util.format_int_locale(1024), text_type) def test_format_float_locale(self): assert isinstance(util.format_float_locale(1024.1024), text_type) def test_format_time_seconds(self): assert isinstance(util.format_time_seconds(1024), text_type) with locale_numeric_conv(): assert format_time_seconds(1024) == "1,024 seconds" assert format_time_seconds(1) == "1 second" class Tunexpand(TestCase): d = expanduser("~") u = unexpand(d) def test_base(self): path = unexpand(self.d) if is_win: self.failUnlessEqual(path, "%USERPROFILE%") else: self.failUnlessEqual(path, "~") def test_base_trailing(self): path = unexpand(self.d + os.path.sep) self.failUnlessEqual(path, self.u + os.path.sep) def test_noprefix(self): path = unexpand(self.d + "foobar" + os.path.sep) self.failUnlessEqual(path, self.d + "foobar" + os.path.sep) def test_subfile(self): path = unexpand(os.path.join(self.d, "la", "la")) self.failUnlessEqual(path, os.path.join(self.u, "la", "la")) class Tformat_rating(TestCase): def setUp(self): self.r = config.RATINGS = HardCodedRatingsPrefs() def test_empty(self): self.failUnlessEqual(util.format_rating(0, blank=False), "") def test_full(self): self.failUnlessEqual( len(util.format_rating(1, blank=False)), int(1 / self.r.precision)) def test_rating_length(self): config.RATINGS.number = 4 for i in range(0, int(1 / self.r.precision + 1)): self.failUnlessEqual( i, len(util.format_rating(i * self.r.precision, blank=False))) def test_bogus(self): max_length = int(1 / self.r.precision) self.failUnlessEqual(len(util.format_rating(2 ** 32 - 1, blank=False)), max_length) self.failUnlessEqual(len(util.format_rating(-4.2, blank=False)), 0) def test_blank_lengths(self): """Check that there are no unsuspected edge-cases for various rating precisions""" for self.r.number in [1, 5, 4, 3, 2]: steps = self.r.number self.failUnlessEqual(len(util.format_rating(1)), steps) self.failUnlessEqual(len(util.format_rating(0)), steps) self.failUnlessEqual(len(util.format_rating(0.5)), steps) self.failUnlessEqual(len(util.format_rating(1 / 3.0)), steps) def test_blank_values(self): self.r.number = 5 self.r.blank_symbol = "0" self.r.full_symbol = "1" # Easy ones first self.failUnlessEqual(util.format_rating(0.0), "00000") self.failUnlessEqual(util.format_rating(0.2), "10000") self.failUnlessEqual(util.format_rating(0.8), "11110") self.failUnlessEqual(util.format_rating(1.0), "11111") # A bit arbitrary, but standard behaviour self.failUnlessEqual(util.format_rating(0.51), "11100") # Test rounding down... self.failUnlessEqual(util.format_rating(0.6), "11100") # Test rounding up... self.failUnlessEqual(util.format_rating(0.91), "11111") # You never know... self.failUnlessEqual(util.format_rating(3.0), "11111") self.failUnlessEqual(util.format_rating(-0.5), "00000") class Tpango(TestCase): def test_escape_empty(self): self.failUnlessEqual(util.escape(""), "") def test_roundtrip(self): for s in ["foo&", "<&>", "&", "&", "<&testing&>amp;"]: esc = util.escape(s) self.failIfEqual(s, esc) self.failUnlessEqual(s, util.unescape(esc)) def test_unescape_empty(self): self.failUnlessEqual(util.unescape(""), "") def test_format(self): self.assertEqual(util.bold("foo"), "<b>foo</b>") self.assertEqual(util.italic("foo"), "<i>foo</i>") self.assertEqual(util.monospace("foo"), "<tt>foo</tt>") class Tre_esc(TestCase): def test_empty(self): self.failUnlessEqual(re_escape(b""), b"") self.assertTrue(isinstance(re_escape(b""), bytes)) def test_empty_unicode(self): self.failUnlessEqual(re_escape(u""), u"") self.assertTrue(isinstance(re_escape(u""), text_type)) def test_safe(self): self.failUnlessEqual(re_escape("fo o"), "fo o") def test_unsafe(self): self.failUnlessEqual(re_escape("!bar"), r"\!bar") def test_many_unsafe(self): self.failUnlessEqual( re_escape("*quux#argh?woo"), r"\*quux\#argh\?woo") class Tdecode(TestCase): def test_empty(self): self.failUnlessEqual(decode(b""), "") def test_safe(self): self.failUnlessEqual(decode(b"foo!"), "foo!") def test_invalid(self): self.failUnlessEqual( decode(b"fo\xde"), u'fo\ufffd [Invalid Encoding]') class Tencode(TestCase): def test_empty(self): self.failUnlessEqual(encode(""), b"") def test_unicode(self): self.failUnlessEqual(encode(u"abcde"), b"abcde") class Tcapitalize(TestCase): def test_empty(self): self.failUnlessEqual(util.capitalize(""), "") def test_firstword(self): self.failUnlessEqual(util.capitalize("aa b"), "Aa b") def test_preserve(self): self.failUnlessEqual(util.capitalize("aa B"), "Aa B") def test_nonalphabet(self): self.failUnlessEqual(util.capitalize("!aa B"), "!aa B") class Thuman_sort(TestCase): def smaller(self, x, y): return util.human_sort_key(x) < util.human_sort_key(y) def equal(self, x, y): return util.human_sort_key(x) == util.human_sort_key(y) def test_human(self): self.failUnlessEqual(self.smaller(u"2", u"15"), True) self.failUnlessEqual(self.smaller(u" 2", u"15 "), True) self.failUnlessEqual(self.smaller(u"a2 g", u"a 2z"), True) self.failUnlessEqual(self.smaller(u"a2zz", u"a2.1z"), True) self.failUnlessEqual(self.smaller(u"42o", u"42\xf6"), True) self.failUnlessEqual(self.smaller(u"42\xf6", u"42p"), True) self.failUnlessEqual(self.smaller(u"bbb", u"zzz3"), True) self.assertTrue(self.equal(" foo", "foo")) self.assertTrue(self.equal(" ", "")) self.assertTrue(self.smaller("", ".")) self.assertTrue(self.smaller("a", "b")) self.assertTrue(self.smaller("A", "b")) def test_false(self): # album browser needs that to sort albums without artist/title # to the bottom self.failIf(util.human_sort_key("")) def test_white(self): self.failUnlessEqual( util.human_sort_key(u" 3foo bar6 42.8"), util.human_sort_key(u"3 foo bar6 42.8 ")) self.failUnlessEqual(64.0 in util.human_sort_key(u"64. 8"), True) class Tformat_time(TestCase): def test_seconds(self): self.failUnlessEqual(util.format_time(0), "0:00") self.failUnlessEqual(util.format_time(59), "0:59") def test_minutes(self): self.failUnlessEqual(util.format_time(60), "1:00") self.failUnlessEqual(util.format_time(60 * 59 + 59), "59:59") def test_hourss(self): self.failUnlessEqual(util.format_time(60 * 60), "1:00:00") self.failUnlessEqual( util.format_time(60 * 60 + 60 * 59 + 59), "1:59:59") def test_negative(self): self.failUnlessEqual(util.format_time(-124), "-2:04") class Tparse_time(TestCase): def test_invalid(self): self.failUnlessEqual(util.parse_time("not a time"), 0) def test_except(self): self.failUnlessRaises(ValueError, util.parse_time, "not a time", None) def test_empty(self): self.failUnlessEqual(util.parse_time(""), 0) def test_roundtrip(self): # The values are the ones tested for Tformat_time, so we know they # will be formatted correctly. They're also representative of # all the major patterns. for i in [0, 59, 60, 60 * 59 + 59, 60 * 60, 60 * 60 + 60 * 59 + 59]: self.failUnlessEqual(util.parse_time(util.format_time(i)), i) def test_negative(self): self.failUnlessEqual(util.parse_time("-2:04"), -124) class Tparse_date(TestCase): def test_invalid(self): self.assertRaises(ValueError, util.parse_date, "not a date") self.assertRaises(ValueError, util.parse_date, "0") self.assertRaises(ValueError, util.parse_date, "2000-13") self.assertRaises(ValueError, util.parse_date, "2000-01-32") self.assertRaises(ValueError, util.parse_date, "2000-01-0") self.assertRaises(ValueError, util.parse_date, "2000-0-01") def test_valid(self): ref = time.mktime(time.strptime("2004", "%Y")) self.assertEqual(util.parse_date("2004"), ref) self.assertEqual(util.parse_date("2004-01-01"), ref) self.assertEqual(util.parse_date("2004-1-1"), ref) self.assertTrue( util.parse_date("2004-01-01") < util.parse_date("2004-01-02")) class Tdate_key(TestCase): def test_compare(self): date_key = util.date_key self.assertTrue(date_key("2004") == date_key("2004-01-01")) self.assertTrue(date_key("2004") == date_key("2004-01")) self.assertTrue(date_key("2004") < date_key("2004-01-02")) self.assertTrue(date_key("2099-02-02") < date_key("2099-03-30")) self.assertTrue(date_key("2004-01-foo") == date_key("2004-01")) def test_validate(self): validate = util.validate_query_date for valid in ["2004", "2005-01", "3000-3-4"]: self.assertTrue(validate(valid)) for invalid in ["", "-", "3000-", "9-0", "8-1-0", "1-13-1", "1-1-32", "1-1-1-1-1", "a", "1-a", "1-1-a"]: self.assertFalse(validate(invalid)) class Tformat_size(TestCase): def t_dict(self, d): for key, value in d.items(): formatted = util.format_size(key) self.failUnlessEqual(formatted, value) assert isinstance(formatted, text_type) def test_bytes(self): self.t_dict({0: "0 B", 1: "1 B", 1023: "1023 B"}) def test_kbytes(self): self.t_dict({ 1024: "1.00 KB", 1536: "1.50 KB", 10240: "10 KB", 15360: "15 KB" }) def test_mbytes(self): self.t_dict({ 1024 * 1024: "1.00 MB", 1024 * 1536: "1.50 MB", 1024 * 10240: "10.0 MB", 1024 * 15360: "15.0 MB", 123456 * 1024: "121 MB", 765432 * 1024: "747 MB"}) def test_gbytes(self): self.t_dict({ 1024 * 1024 * 1024: "1.0 GB", 1024 * 1024 * 1536: "1.5 GB", 1024 * 1024 * 10240: "10.0 GB", 1024 * 1024 * 15360: "15.0 GB" }) class Tsplit_title(TestCase): def test_trailing(self): self.failUnlessEqual(split_title("foo ~"), ("foo ~", [])) def test_prefixed(self): self.failUnlessEqual(split_title("~foo "), ("~foo ", [])) def test_prefix_and_trailing(self): self.failUnlessEqual(split_title("~foo ~"), ("~foo ~", [])) def test_prefix_and_version(self): self.failUnlessEqual(split_title("~foo ~bar~"), ("~foo", ["bar"])) def test_simple(self): self.failUnlessEqual(split_title("foo (baz)"), ("foo", ["baz"])) def test_two_versions(self): self.failUnlessEqual( split_title("foo [b, c]"), ("foo", ["b", "c"])) def test_custom_splitter(self): self.failUnlessEqual( split_title("foo [b c]", " "), ("foo", ["b", "c"])) class Tsplit_album(TestCase): def test_album_looks_like_disc(self): self.failUnlessEqual( split_album("disk 2"), ("disk 2", None)) def test_basic_disc(self): self.failUnlessEqual( split_album("foo disc 1/2"), ("foo", "1/2")) def test_looks_like_disc_but_isnt(self): self.failUnlessEqual( split_album("disc foo disc"), ("disc foo disc", None)) def test_disc_album_and_disc(self): self.failUnlessEqual( split_album("disc foo disc 1"), ("disc foo", "1")) def test_weird_disc(self): self.failUnlessEqual( split_album("foo ~disk 3~"), ("foo", "3")) def test_weird_not_disc(self): self.failUnlessEqual( split_album("foo ~crazy 3~"), ("foo ~crazy 3~", None)) class Tsplit_people(TestCase): def test_parened_person(self): self.failUnlessEqual(split_people("foo (bar)"), ("foo", ["bar"])) def test_with_person(self): self.failUnlessEqual( split_people("foo (With bar)"), ("foo", ["bar"])) def test_with_with_person(self): self.failUnlessEqual( split_people("foo (with with bar)"), ("foo", ["with bar"])) def test_featuring_two_people(self): self.failUnlessEqual( split_people("foo featuring bar, qx"), ("foo", ["bar", "qx"])) def test_featuring_person_bracketed(self): self.failUnlessEqual( split_people("foo (Ft. bar)"), ("foo", ["bar"])) self.failUnlessEqual( split_people("foo(feat barman)"), ("foo", ["barman"])) def test_originally_by(self): self.failUnlessEqual( split_people("title (originally by artist)"), ("title", ["artist"])) self.failUnlessEqual( split_people("title [originally by artist & artist2]"), ("title", ["artist", "artist2"])) def test_cover(self): self.failUnlessEqual( split_people("Pyscho Killer [Talking Heads Cover]"), ("Pyscho Killer", ["Talking Heads"])) class Ttag(TestCase): def test_empty(self): self.failUnlessEqual(util.tag(""), "Invalid tag") def test_basic(self): self.failUnlessEqual(util.tag("title"), "Title") def test_basic_nocap(self): self.failUnlessEqual(util.tag("title", False), "title") def test_internal(self): self.failUnlessEqual(util.tag("~year"), "Year") def test_numeric(self): self.failUnlessEqual(util.tag("~#year"), "Year") def test_two(self): self.failUnlessEqual(util.tag("title~version"), "Title / Version") def test_two_nocap(self): self.failUnlessEqual( util.tag("title~version", False), "title / version") def test_precap_handling(self): self.failUnlessEqual(util.tag("labelid"), "Label ID") self.failUnlessEqual(util.tag("labelid", False), "label ID") class Ttagsplit(TestCase): def test_single_tag(self): self.failUnlessEqual(util.tagsplit("foo"), ["foo"]) def test_synth_tag(self): self.failUnlessEqual(util.tagsplit("~foo"), ["~foo"]) def test_two_tags(self): self.failUnlessEqual(util.tagsplit("foo~bar"), ["foo", "bar"]) def test_two_prefix(self): self.failUnlessEqual(util.tagsplit("~foo~bar"), ["foo", "bar"]) def test_synth(self): self.failUnlessEqual(util.tagsplit("~foo~~bar"), ["foo", "~bar"]) def test_numeric(self): self.failUnlessEqual(util.tagsplit("~#bar"), ["~#bar"]) def test_two_numeric(self): self.failUnlessEqual(util.tagsplit("~#foo~~#bar"), ["~#foo", "~#bar"]) def test_two_synth_start(self): self.failUnlessEqual( util.tagsplit("~~people~album"), ["~people", "album"]) class Tpattern(TestCase): def test_empty(self): self.failUnlessEqual(util.pattern(""), "") def test_basic(self): self.failUnlessEqual(util.pattern("<title>"), "Title") def test_basic_nocap(self): self.failUnlessEqual(util.pattern("<title>", False), "title") def test_internal(self): self.failUnlessEqual(util.pattern("<~plays>"), "Plays") def test_tied(self): self.failUnlessEqual(util.pattern("<~title~album>"), "Title - Album") def test_unknown(self): self.failUnlessEqual(util.pattern("<foobarbaz>"), "Foobarbaz") def test_condition(self): self.failUnlessEqual(util.pattern("<~year|<~year> - <album>|<album>>"), "Year - Album") def test_escape(self): self.failUnlessEqual(util.pattern("\<i\><&>\</i\>", esc=True), "<i>&</i>") def test_invalid(self): self.failUnlessEqual(util.pattern("<date"), "") util.pattern("<d\\") def test_complex_condition(self): self.assertEqual(util.pattern("<#(bitrate \> 150)|HQ|LQ>"), "LQ") def test_escape_condition(self): self.assertEqual( util.pattern(r"<~filename=/\/adsad\/sadads/|BLA|BLU>"), "BLU") class Tformat_time_long(TestCase): def test_second(s): s.assertEquals(f_t_l(1).split(", ")[0], _("1 second")) def test_seconds(s): s.assertEquals(f_t_l(2).split(", ")[0], _("%d seconds") % 2) def test_notminutes(s): s.assertEquals(f_t_l(59).split(", ")[0], _("%d seconds") % 59) def test_minute(s): s.assertEquals(f_t_l(60), _("1 minute")) def test_minutes(s): s.assertEquals(f_t_l(120).split(", ")[0], _("%d minutes") % 2) def test_nothours(s): s.assertEquals(f_t_l(3599).split(", ")[0], _("%d minutes") % 59) def test_hour(s): s.assertEquals(f_t_l(3600), _("1 hour")) def test_hours(s): s.assertEquals(f_t_l(7200), _("%d hours") % 2) def test_notdays(s): s.assertEquals(f_t_l(86399).split(", ")[0], _("%d hours") % 23) def test_seconds_dropped(s): s.assertEquals(len(f_t_l(3601).split(", ")), 2) def test_day(s): s.assertEquals(f_t_l(86400), _("1 day")) def test_days(s): s.assertEquals(f_t_l(172800).split(", ")[0], _("%d days") % 2) def test_notyears(s): s.assertEquals(f_t_l(31535999).split(", ")[0], _("%d days") % 364) def test_year(s): s.assertEquals(f_t_l(31536000), _("1 year")) def test_years(s): s.assertEquals(f_t_l(63072000).split(", ")[0], _("%d years") % 2) def test_drop_zero(s): s.assertEquals(f_t_l(3601), ", ".join([_("1 hour"), _("1 second")])) def test_limit_zero(s): s.assertEquals(f_t_l(1, limit=0), _("1 second")) def test_limit(s): s.assertEquals(len(f_t_l(2 ** 31).split(", ")), 2) class TFormatTimePreferred(TestCase): def test_default_setting_is_standard(s): s.assertEquals(config.DURATION.format, DurationFormat.STANDARD) def test_raw_config_is_standard(s): s.assertEquals(config.get('display', 'duration_format'), DurationFormat.STANDARD) def test_acts_like_long(s): s._fuzz_loop(format_time_preferred, f_t_l) def _fuzz_loop(s, f, f2): x = 1 while x < 100000000: s.assertEquals(f(x), f2(x)) x = x * 3 / 2 + 1 def test_acts_like_display(s): def fmt_numeric(x): return format_time_preferred(x, DurationFormat.NUMERIC) s._fuzz_loop(fmt_numeric, format_time_display) def test_seconds(s): def fmt_seconds(x): return format_time_preferred(x, DurationFormat.SECONDS) s._fuzz_loop(fmt_seconds, format_time_seconds) class Tspawn(TestCase): def test_simple(self): if is_win: return self.failUnless(util.spawn(["ls", "."], stdout=True)) def test_invalid(self): from gi.repository import GLib self.failUnlessRaises(GLib.GError, util.spawn, ["not a command"]) def test_get_output(self): if is_win: return fileobj = util.spawn(["echo", "'$1'", '"$2"', ">3"], stdout=True) self.failUnlessEqual(fileobj.read().split(), ["'$1'", '"$2"', ">3"]) class Txdg_dirs(TestCase): def test_system_data_dirs_posix(self): if is_win: return os.environ["XDG_DATA_DIRS"] = "/xyz" self.failUnlessEqual(xdg_get_system_data_dirs()[0], "/xyz") del os.environ["XDG_DATA_DIRS"] dirs = xdg_get_system_data_dirs() self.failUnlessEqual(dirs[0], "/usr/local/share/") self.failUnlessEqual(dirs[1], "/usr/share/") def test_data_home(self): if is_win: return os.environ["XDG_DATA_HOME"] = "/xyz" self.failUnlessEqual(xdg_get_data_home(), "/xyz") del os.environ["XDG_DATA_HOME"] should = os.path.join(os.path.expanduser("~"), ".local", "share") self.failUnlessEqual(xdg_get_data_home(), should) def test_get_user_dirs(self): xdg_get_user_dirs() def test_parse_xdg_user_dirs(self): data = b'# foo\nBLA="$HOME/blah"\n' vars_ = parse_xdg_user_dirs(data) self.assertTrue(b"BLA" in vars_) expected = os.path.join(environ.get("HOME", ""), "blah") self.assertEqual(vars_[b"BLA"], expected) vars_ = parse_xdg_user_dirs(b'BLA="$HOME/"') self.assertTrue(b"BLA" in vars_) self.assertEqual(vars_[b"BLA"], environ.get("HOME", "")) # some invalid self.assertFalse(parse_xdg_user_dirs(b"foo")) self.assertFalse(parse_xdg_user_dirs(b"foo=foo bar")) self.assertFalse(parse_xdg_user_dirs(b"foo='foo")) def test_on_windows(self): self.assertTrue(xdg_get_system_data_dirs()) self.assertTrue(xdg_get_cache_home()) self.assertTrue(xdg_get_data_home()) self.assertTrue(xdg_get_config_home()) class Tlibrary(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_basic(self): self.failIf(get_scan_dirs()) if os.name == "nt": set_scan_dirs([u"C:\\foo", u"D:\\bar", u""]) self.failUnlessEqual(get_scan_dirs(), [u"C:\\foo", u"D:\\bar"]) else: set_scan_dirs(["foo", "bar", ""]) self.failUnlessEqual(get_scan_dirs(), ["foo", "bar"]) class TNormalizePath(TestCase): def test_default(self): from quodlibet.util.path import normalize_path as norm name = norm(tempfile.mkdtemp()) try: self.failUnlessEqual(norm(name), name) self.failUnlessEqual(norm(os.path.join(name, "foo", "..")), name) finally: os.rmdir(name) def test_canonicalise(self): from quodlibet.util.path import normalize_path as norm f, path = tempfile.mkstemp() path = os.path.realpath(path) # on osx tmp is a symlink os.close(f) path = norm(path) link_dir = mkdtemp() link = None if not is_win: link = os.path.join(link_dir, str(uuid.uuid4())) os.symlink(path, link) try: self.failUnlessEqual(norm(path, canonicalise=True), path) self.failUnlessEqual(norm(os.path.join(path, "foo", ".."), True), path) if link: self.failUnlessEqual(norm(link, True), path) # A symlink shouldn't be resolved unless asked for self.failIfEqual(norm(link, False), path) # And the other behaviour should also work unnormalised_path = os.path.join(link, "foo", "..") self.failUnlessEqual(norm(unnormalised_path, True), path) finally: if link: os.remove(link) os.remove(path) os.rmdir(link_dir) class Tescape_filename(TestCase): def test_str(self): result = escape_filename("\x00\x01") self.assertEqual(result, "%00%01") self.assertTrue(isinstance(result, fsnative)) def test_unicode(self): result = escape_filename(u'abc\xe4') self.assertEqual(result, "abc%C3%A4") self.assertTrue(isinstance(result, fsnative)) @skipIf(is_win, "not on Windows") class Tload_library(TestCase): def test_libc(self): lib, name = util.load_library(["c"]) self.assertEqual(name, "c") lib2, name = util.load_library(["c"]) self.assertTrue(lib is lib2) lib3, name = util.load_library(["c"], shared=False) self.assertTrue(lib2 is not lib3) def test_glib(self): if sys.platform == "darwin": fn = "libglib-2.0.0.dylib" else: fn = "libglib-2.0.so.0" lib, name = util.load_library([fn]) self.assertEqual(name, fn) self.assertTrue(lib) class Tstrip_win32_incompat_from_path(TestCase): def test_types(self): v = strip_win32_incompat_from_path(fsnative(u"")) self.assertTrue(isinstance(v, fsnative)) v = strip_win32_incompat_from_path(fsnative(u"foo")) self.assertTrue(isinstance(v, fsnative)) v = strip_win32_incompat_from_path(u"") self.assertTrue(isinstance(v, text_type)) v = strip_win32_incompat_from_path(u"foo") self.assertTrue(isinstance(v, text_type)) def test_basic(self): if is_win: v = strip_win32_incompat_from_path(u"C:\\foo\\<>/a") self.assertEqual(v, u"C:\\foo\\___a") else: v = strip_win32_incompat_from_path("/foo/<>a") self.assertEqual(v, "/foo/__a") class TPathHandling(TestCase): def test_main(self): v = fsnative(u"foo") self.assertTrue(isinstance(v, fsnative)) v2 = glib2fsn(fsn2glib(v)) self.assertTrue(isinstance(v2, fsnative)) self.assertEqual(v, v2) v3 = bytes2fsn(fsn2bytes(v, "utf-8"), "utf-8") self.assertTrue(isinstance(v3, fsnative)) self.assertEqual(v, v3) class Tget_temp_cover_file(TestCase): def test_main(self): fobj = get_temp_cover_file(b"foobar") try: self.assertTrue(isinstance(fobj.name, fsnative)) finally: fobj.close() class Tsplit_escape(TestCase): def test_split_escape(self): # from mutagen inout = [ (("", ":"), [""]), ((":", ":"), ["", ""]), ((":", ":", 0), [":"]), ((":b:c:", ":", 0), [":b:c:"]), ((":b:c:", ":", 1), ["", "b:c:"]), ((":b:c:", ":", 2), ["", "b", "c:"]), ((":b:c:", ":", 3), ["", "b", "c", ""]), (("a\\:b:c", ":"), ["a:b", "c"]), (("a\\\\:b:c", ":"), ["a\\", "b", "c"]), (("a\\\\\\:b:c\\:", ":"), ["a\\:b", "c:"]), (("\\", ":"), [""]), (("\\\\", ":"), ["\\"]), (("\\\\a\\b", ":"), ["\\a\\b"]), ] for inargs, out in inout: self.assertEqual(split_escape(*inargs), out) def test_types(self): parts = split_escape(b"\xff:\xff", b":") self.assertEqual(parts, [b"\xff", b"\xff"]) self.assertTrue(isinstance(parts[0], bytes)) parts = split_escape(u"a:b", u":") self.assertEqual(parts, [u"a", u"b"]) self.assertTrue(all(isinstance(p, text_type) for p in parts)) parts = split_escape(u"", u":") self.assertEqual(parts, [u""]) self.assertTrue(all(isinstance(p, text_type) for p in parts)) parts = split_escape(u":", u":") self.assertEqual(parts, [u"", u""]) self.assertTrue(all(isinstance(p, text_type) for p in parts)) def test_join_escape_types(self): self.assertEqual(join_escape([], b":"), b"") self.assertTrue(isinstance(join_escape([], b":"), bytes)) self.assertTrue(isinstance(join_escape([], u":"), text_type)) self.assertEqual(join_escape([b"\xff", b"\xff"], b":"), b"\xff:\xff") self.assertEqual(join_escape([u'\xe4', u'\xe4'], ":"), u'\xe4:\xe4') def test_join_escape(self): self.assertEqual(join_escape([b":"], b":"), b"\\:") self.assertEqual(join_escape([b"\\:", b":"], b":"), b"\\\\\\::\\:") def test_roundtrip(self): values = [b"\\:", b":"] joined = join_escape(values, b":") self.assertEqual(split_escape(joined, b":"), values) class TMainRunner(TestCase): def test_abort_before_call(self): runner = util.MainRunner() def worker(): self.assertRaises( util.MainRunnerAbortedError, runner.call, lambda: None) thread = threading.Thread(target=worker) runner.abort() thread.start() thread.join() def test_timeout(self): runner = util.MainRunner() def worker(): self.assertRaises( util.MainRunnerTimeoutError, runner.call, lambda: None, timeout=0.00001) for i in range(3): thread = threading.Thread(target=worker) thread.start() thread.join() runner.abort() def test_call_exception(self): from gi.repository import GLib runner = util.MainRunner() loop = GLib.MainLoop() def func(): raise KeyError def worker(): try: self.assertRaises(util.MainRunnerError, runner.call, func) finally: loop.quit() thread = threading.Thread(target=worker) thread.start() loop.run() runner.abort() thread.join() def test_from_main_loop(self): from gi.repository import GLib runner = util.MainRunner() loop = GLib.MainLoop() def in_main_loop(): try: self.assertRaises( util.MainRunnerError, runner.call, lambda: None, foo=0) self.assertEqual( runner.call(lambda i: i + 1, 42, priority=0), 43) self.assertEqual(runner.call(lambda i: i - 1, 42), 41) finally: loop.quit() GLib.idle_add(in_main_loop) loop.run() def test_ok(self): from gi.repository import GLib runner = util.MainRunner() loop = GLib.MainLoop() def func(i): self.assertTrue(util.is_main_thread()) return i + 1 def worker(): try: self.assertEqual(runner.call(func, 42), 43) finally: loop.quit() thread = threading.Thread(target=worker) thread.start() loop.run() thread.join() runner.abort() def test_multi_abort(self): runner = util.MainRunner() runner.abort() runner.abort() def worker(): self.assertRaises(util.MainRunnerError, runner.call, lambda: None) thread = threading.Thread(target=worker) thread.start() thread.join() class Tconnect_destroy(TestCase): def test_main(self): from gi.repository import Gtk b = Gtk.Button() class A(Gtk.Button): def foo(self): pass a = A() ref = sys.getrefcount(a) util.connect_destroy(b, "clicked", a.foo) self.assertEqual(sys.getrefcount(a), ref + 1) a.destroy() self.assertEqual(sys.getrefcount(a), ref) class Tcached_property(TestCase): def test_main(self): class A(object): @util.cached_property def foo(self): return object() a = A() first = a.foo self.assertTrue(first is a.foo) del a.__dict__["foo"] self.assertFalse(first is a.foo) def test_dunder(self): def define_class(): class A(object): @util.cached_property def __foo_(self): return object() self.assertRaises(AssertionError, define_class) @util.enum class Foo(str): FOO = "blah" BAR = "not foo" BAZ = "baz!" class Tenum(TestCase): def test_main(self): @util.enum class IntFoo(int): FOO = 0 BAR = 1 self.assertTrue(issubclass(IntFoo, int)) self.assertTrue(isinstance(IntFoo.BAR, IntFoo)) self.assertTrue(isinstance(IntFoo.FOO, IntFoo)) self.assertEqual(IntFoo.FOO, 0) self.assertEqual(IntFoo.BAR, 1) def test_str(self): self.assertTrue(issubclass(Foo, str)) self.assertTrue(isinstance(Foo.BAR, Foo)) self.assertEqual(Foo.FOO, "blah") self.assertEqual(repr(Foo.BAR), "Foo.BAR") def test_values(self): self.assertEqual(Foo.values, {Foo.FOO, Foo.BAR, Foo.BAZ}) def test_value_of(self): self.assertEqual(Foo.value_of("blah"), Foo.FOO) self.assertEqual(Foo.value_of("baz!"), Foo.BAZ) def test_value_of_raises_for_unknown(self): self.assertRaises(ValueError, Foo.value_of, "??") def test_value_of_uses_default(self): self.assertEquals(Foo.value_of("??", "default"), "default") class Tlist_unique(TestCase): def test_main(self): self.assertEqual(util.list_unique([]), []) self.assertEqual(util.list_unique(iter([])), []) self.assertEqual(util.list_unique([1, 2, 3]), [1, 2, 3]) self.assertEqual(util.list_unique([1, 2, 1, 4]), [1, 2, 4]) self.assertEqual(util.list_unique([1, 1, 1, 2]), [1, 2]) class Treraise(TestCase): def test_reraise(self): try: try: raise ValueError("foo") except Exception as e: util.reraise(TypeError, e) except Exception as e: self.assertTrue(isinstance(e, TypeError)) self.assertTrue("ValueError" in traceback.format_exc()) else: self.assertTrue(False) class Tenviron(TestCase): def test_main(self): for v in util.environ.values(): if os.name == "nt": self.assertTrue(isinstance(v, text_type)) else: self.assertTrue(isinstance(v, str)) class Tgdecode(TestCase): def test_main(self): if PY2: self.assertTrue(isinstance(util.gdecode(b"foo"), text_type)) else: self.assertTrue(isinstance(util.gdecode(u"foo"), text_type)) class Tget_module_dir(TestCase): def test_self(self): path = util.get_module_dir() self.assertTrue(isinstance(path, fsnative)) self.assertTrue(os.path.exists(path)) def test_other(self): path = util.get_module_dir(util) self.assertTrue(isinstance(path, fsnative)) self.assertTrue(os.path.exists(path)) class Tget_ca_file(TestCase): def test_main(self): path = util.get_ca_file() if path is not None: self.assertTrue(isinstance(path, fsnative)) self.assertTrue(os.path.exists(path)) class Tprint_exc(TestCase): def test_main(self): try: 1 / 0 except: with capture_output(): print_exc() def test_pass_exc_info(self): try: 1 / 0 except: with capture_output(): print_exc(exc_info=sys.exc_info(), context="foo") class TPrintHandler(TestCase): def test_main(self): handler = PrintHandler() for level in range(0, 70, 10): record = logging.LogRecord( "foo", level, "a.py", 45, "bar", None, None) with capture_output(): handler.handle(record) class Tformat_exception(TestCase): def test_main(self): try: 1 / 0 except: result = format_exception(*sys.exc_info()) self.assertTrue(isinstance(result, list)) self.assertTrue(all([isinstance(l, text_type) for l in result])) class Textract_tb(TestCase): def test_main(self): try: 1 / 0 except: result = extract_tb(sys.exc_info()[2]) self.assertTrue(isinstance(result, list)) for fn, l, fu, text in result: self.assertTrue(isinstance(fn, fsnative)) self.assertTrue(isinstance(l, int)) self.assertTrue(isinstance(fu, text_type)) self.assertTrue(isinstance(text, text_type)) ����������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_x.py����������������������������������������������������������������0000644�0001750�0001750�00000003473�13112005742�020021� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet.qltk import x from quodlibet.qltk import Icons from . import TestCase class Notebook(TestCase): def test_widget_str(self): n = x.Notebook() c = Gtk.VBox() n.append_page(c, "A Test") self.failUnlessEqual("A Test", n.get_tab_label(c).get_text()) n.destroy() def test_widget_label(self): l = Gtk.Label(label="A Test") n = x.Notebook() c = Gtk.VBox() n.append_page(c, l) self.failUnless(l is n.get_tab_label(c)) c.destroy() def test_widget_error(self): n = x.Notebook() w = Gtk.VBox() self.failUnlessRaises(TypeError, n.append_page, w) w.destroy() n.destroy() class Frame(TestCase): def test_label(self): self.failUnlessEqual( x.Frame("foo").get_label_widget().get_text(), "foo") class MenuItem(TestCase): def test_ctr(self): self.failUnless(x.MenuItem("foo", Icons.EDIT_FIND)) class Button(TestCase): def test_ctr(self): self.failUnless(x.Button("foo", Icons.EDIT_FIND)) class TAlign(TestCase): def test_ctr(self): button = Gtk.Button() a = x.Align(button, left=2, right=4, top=5, bottom=-2, border=2) self.assertEqual(a.get_margin_top(), 7) self.assertEqual(a.get_margin_bottom(), 0) self.assertEqual(a.get_margin_left(), 4) self.assertEqual(a.get_margin_right(), 6) self.failUnless(a.get_child() is button) a.destroy() class TScrolledWindow(TestCase): def test_ctr(self): w = x.ScrolledWindow() w.destroy() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_tagsfrompath.py�����������������������������������������������������0000644�0001750�0001750�00000002173�13112005742�022245� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.tagsfrompath import (TitleCase, SplitTag, UnderscoresToSpaces) import quodlibet.config class FilterTestCase(TestCase): def setUp(self): quodlibet.config.init() self.c = self.Kind() def tearDown(self): self.c.destroy() quodlibet.config.quit() class TTitleCase(FilterTestCase): Kind = TitleCase def test_simple(self): self.failUnlessEqual(self.c.filter("title", "foo bar"), "Foo Bar") def test_apostrophe(self): self.failUnlessEqual(self.c.filter("title", "IT's"), "IT's") class TSplitTag(FilterTestCase): Kind = SplitTag def test_simple(self): self.failUnlessEqual(self.c.filter("title", "foo & bar"), "foo\nbar") class TUnderscoresToSpaces(FilterTestCase): Kind = UnderscoresToSpaces def test_simple(self): self.failUnlessEqual(self.c.filter("titke", "foo_bar"), "foo bar") �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_browsers_search.py�������������������������������������������������������0000644�0001750�0001750�00000007637�13112005742�021720� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from gi.repository import Gtk from senf import fsnative import quodlibet.browsers.search import quodlibet.config from quodlibet.browsers.search import SearchBar from quodlibet.formats import AudioFile from quodlibet.library import SongLibrary, SongLibrarian # Don't sort yet, album_key makes it complicated... SONGS = [AudioFile({ "title": "one", "artist": "piman", "~filename": fsnative(u"/dev/null")}), AudioFile({ "title": "two", "artist": "mu", "~#length": 234, "~filename": fsnative(u"/dev/zero")}), AudioFile({ "title": "three", "artist": "boris", "~filename": fsnative(u"/bin/ls")}), AudioFile({ "title": "four", "artist": "random", "album": "don't stop", "labelid": "65432-1", "~filename": fsnative(u"/dev/random")}), AudioFile({ "title": "five", "artist": "shell", "album": "don't stop", "labelid": "12345-6", "~filename": fsnative(u"/dev/sh")})] class TSearchBar(TestCase): Bar = SearchBar def setUp(self): quodlibet.config.init() quodlibet.browsers.search.library = SongLibrary() quodlibet.browsers.search.library.librarian = SongLibrarian() for af in SONGS: af.sanitize() quodlibet.browsers.search.library.add(SONGS) self.bar = self.Bar(quodlibet.browsers.search.library) self.bar.connect('songs-selected', self._expected) def _expected(self, bar, songs, sort): songs.sort() if self.expected: self.failUnlessEqual(self.expected, songs) self.expected = None def _do(self): while Gtk.events_pending(): Gtk.main_iteration() self.failUnless(self.expected is None) def test_can_filter(self): for key in ["foo", "title", "fake~key", "~woobar", "~#huh"]: self.failUnless(self.bar.can_filter(key)) def test_empty_is_all(self): self.bar.filter_text("") self.expected = list(sorted(SONGS)) self._do() def test_active_filter(self): self.assertTrue(self.bar.active_filter(SONGS[0])) self.bar.filter_text("this does not match any song") self.expected = [] self.assertFalse(self.bar.active_filter(SONGS[0])) def test_filter(self): self.expected = [SONGS[1]] self.bar.filter("title", ["two"]) def test_filter_again(self): self.expected = sorted(SONGS[3:5]) self.bar.filter("album", ["don't stop"]) def test_filter_notvalue(self): self.expected = sorted(SONGS[0:2]) self.bar.filter("artist", ["notvalue", "mu", "piman"]) def test_filter_none(self): self.expected = [] self.bar.filter("title", ["not a value"]) def test_filter_album_by_labelid(self): self.expected = [SONGS[3]] self.bar.filter("labelid", [("65432-1")]) def test_filter_numeric(self): self.expected = list(sorted(SONGS)) self.bar.filter("~#length", [0]) def test_saverestore(self): self.bar.filter_text("title = %s" % SONGS[0]["title"]) self.expected = [SONGS[0]] self._do() self.bar.save() self.bar.filter_text("") self.expected = list(sorted(SONGS)) self._do() self.bar.restore() self.bar.activate() self.expected = [SONGS[0]] self._do() def tearDown(self): self.bar.destroy() quodlibet.browsers.search.library.destroy() quodlibet.config.quit() �������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_mp3.py�����������������������������������������������������������0000644�0001750�0001750�00000003342�13112005742�020744� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, get_data_path from quodlibet.formats.mp3 import MP3File class TMP3File(TestCase): def setUp(self): self.song = MP3File(get_data_path('silence-44-s.mp3')) self.song2 = MP3File(get_data_path('test.mp2')) self.song3 = MP3File(get_data_path('lame.mp3')) def test_channels(self): assert self.song("~#channels") == 2 assert self.song2("~#channels") == 1 assert self.song3("~#channels") == 2 def test_length(self): self.assertAlmostEqual(self.song("~#length"), 3.0, 1) self.assertAlmostEqual(self.song2("~#length"), 1.764, 3) self.assertAlmostEqual(self.song3("~#length"), 0.0616, 3) def test_bitrate(self): self.failUnlessEqual(self.song("~#bitrate"), 32) self.failUnlessEqual(self.song2("~#bitrate"), 32) self.failUnlessEqual(self.song3("~#bitrate"), 270) def test_format(self): self.assertEqual(self.song("~format"), "MP3") self.assertEqual(self.song2("~format"), "MP2") self.assertEqual(self.song3("~format"), "MP3") def test_codec(self): self.assertEqual(self.song("~codec"), "MP3") self.assertEqual(self.song2("~codec"), "MP2") self.assertEqual(self.song3("~codec"), "MP3") def test_encoding(self): self.assertEqual(self.song("~encoding"), "") self.assertEqual(self.song2("~encoding"), "") assert self.song3("~encoding") in [ "LAME 3.99.1+\nVBR", "LAME 3.99.1+\nVBR\n-V 2"] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_browsers_playlists.py����������������������������������������������������0000644�0001750�0001750�00000023502�13114760311�022466� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gdk, Gtk from senf import fsnative, fsn2uri, fsn2bytes from quodlibet import app from quodlibet import qltk from quodlibet.browsers.playlists.prefs import DEFAULT_PATTERN_TEXT from quodlibet.browsers.playlists.util import PLAYLISTS, parse_m3u, parse_pls from quodlibet.qltk.songlist import DND_QL from quodlibet.util.collection import FileBackedPlaylist from tests import TestCase, get_data_path, mkstemp, mkdtemp, _TEMP_DIR, \ init_fake_app, destroy_fake_app from tests.gtk_helpers import MockSelData from .helper import dummy_path import os import shutil from quodlibet.browsers.playlists import PlaylistsBrowser from quodlibet.library import SongFileLibrary import quodlibet.config from quodlibet.formats import AudioFile from quodlibet.util.path import mkdir from quodlibet.library.librarians import SongLibrarian from quodlibet.library.libraries import FileLibrary from tests.test_browsers_search import SONGS, TSearchBar class TParsePlaylist(TestCase): def setUp(self): quodlibet.config.init() def tearDown(self): quodlibet.config.quit() class TParsePlaylistMixin(object): def test_parse_empty(self): h, name = mkstemp() os.close(h) open(name, "w").close() pl = self.Parse(name) os.unlink(name) self.failUnlessEqual(0, len(pl)) pl.delete() def test_parse_onesong(self): h, name = mkstemp() os.close(h) with open(name, "wb") as f: target = self.prefix target += fsn2bytes(get_data_path("silence-44-s.ogg"), "utf-8") f.write(target) list = self.Parse(name) os.unlink(name) self.failUnlessEqual(len(list), 1) self.failUnlessEqual(list[0]("title"), "Silence") list.delete() def test_parse_onesong_uri(self): h, name = mkstemp() os.close(h) target = get_data_path("silence-44-s.ogg") target = fsn2uri(target).encode("ascii") target = self.prefix + target with open(name, "wb") as f: f.write(target) list = self.Parse(name) os.unlink(name) self.failUnlessEqual(len(list), 1) self.failUnlessEqual(list[0]("title"), "Silence") list.delete() class TParseM3U(TParsePlaylist, TParsePlaylistMixin): Parse = staticmethod(parse_m3u) prefix = b"" class TParsePLS(TParsePlaylist, TParsePlaylistMixin): Parse = staticmethod(parse_pls) prefix = b"File1=" class TPlaylistIntegration(TestCase): DUPLICATES = 1 SONG = AudioFile({ "title": "two", "artist": "mu", "~filename": dummy_path(u"/dev/zero")}) SONGS = [ AudioFile({ "title": "one", "artist": "piman", "~filename": dummy_path(u"/dev/null")}), SONG, AudioFile({ "title": "three", "artist": "boris", "~filename": dummy_path(u"/bin/ls")}), AudioFile({ "title": "four", "artist": "random", "album": "don't stop", "labelid": "65432-1", "~filename": dummy_path(u"/dev/random")}), SONG, ] def setUp(self): quodlibet.config.init() self.lib = quodlibet.browsers.search.library = FileLibrary() quodlibet.browsers.search.library.librarian = SongLibrarian() for af in self.SONGS: af.sanitize() self.lib.add(self.SONGS) self._dir = mkdtemp() self.pl = FileBackedPlaylist.new(self._dir, "Foobar", self.lib) self.pl.extend(self.SONGS) def tearDown(self): self.pl.delete() self.lib.destroy() self.lib.librarian.destroy() quodlibet.config.quit() shutil.rmtree(self._dir) def test_remove_song(self): # Check: library should have one song fewer (the duplicate) self.failUnlessEqual(len(self.lib), len(self.SONGS) - self.DUPLICATES) self.failUnlessEqual(len(self.pl), len(self.SONGS)) # Remove an unduplicated song self.pl.remove_songs([self.SONGS[0]]) self.failUnlessEqual(len(self.pl), len(self.SONGS) - 1) def test_remove_duplicated_song(self): self.failUnlessEqual(self.SONGS[1], self.SONGS[4]) self.pl.remove_songs([self.SONGS[1]]) self.failUnlessEqual(len(self.pl), len(self.SONGS) - 2) def test_remove_multi_duplicated_song(self): self.pl.extend([self.SONG, self.SONG]) self.failUnlessEqual(len(self.pl), 7) self.pl.remove_songs([self.SONG], False) self.failUnlessEqual(len(self.pl), 7 - 2 - 2) def test_remove_duplicated_song_leave_dupes(self): self.pl.remove_songs([self.SONGS[1]], True) self.failUnlessEqual(len(self.pl), len(self.SONGS) - 1) def test_remove_no_lib(self): pl = FileBackedPlaylist.new(self._dir, "Foobar") pl.extend(self.SONGS) self.assertTrue(len(pl)) pl.remove_songs(self.SONGS, False) self.assertFalse(len(pl)) class TPlaylistsBrowser(TSearchBar): Bar = PlaylistsBrowser ANOTHER_SONG = AudioFile({ "title": "lonely", "artist": "new artist", "~filename": dummy_path(u"/dev/urandom")}) def setUp(self): # Testing locally is VERY dangerous without this... self.assertTrue(_TEMP_DIR in PLAYLISTS or os.name == "nt", msg="Failing, don't want to delete %s" % PLAYLISTS) try: shutil.rmtree(PLAYLISTS) except OSError: pass mkdir(PLAYLISTS) init_fake_app() self.lib = quodlibet.browsers.playlists.library = SongFileLibrary() self.lib.librarian = SongLibrarian() all_songs = SONGS + [self.ANOTHER_SONG] for af in all_songs: af.sanitize() self.lib.add(all_songs) self.big = pl = FileBackedPlaylist.new(PLAYLISTS, "Big", self.lib) pl.extend(SONGS) pl.write() self.small = pl = FileBackedPlaylist.new(PLAYLISTS, "Small", self.lib) pl.extend([self.ANOTHER_SONG]) pl.write() PlaylistsBrowser.init(self.lib) self.bar = PlaylistsBrowser(self.lib) self.bar.connect('songs-selected', self._expected) self.bar._select_playlist(self.bar.playlists()[0]) self.expected = None def tearDown(self): self.bar.destroy() self.lib.destroy() shutil.rmtree(PLAYLISTS) PlaylistsBrowser.deinit(self.lib) destroy_fake_app() def test_saverestore(self): # Flush previous signals, etc. Hmm. self.expected = None self._do() self.expected = [SONGS[0]] self.bar.filter_text("title = %s" % SONGS[0]["title"]) self.bar._select_playlist(self.bar.playlists()[0]) self.expected = [SONGS[0]] self._do() self.bar.save() self.bar.filter_text("") self.expected = list(sorted(SONGS)) self._do() self.bar.restore() self.bar.activate() self.expected = [SONGS[0]] self._do() def test_active_filter_playlists(self): self.bar._select_playlist(self.bar.playlists()[1]) # Second playlist should not have any of `SONGS` self.assertFalse(self.bar.active_filter(SONGS[0])) # But it should have `ANOTHER_SONG` self.assertTrue(self.bar.active_filter(self.ANOTHER_SONG), msg="Couldn't find song from second playlist") # ... and setting a reasonable filter on that song should match still self.bar.filter_text("lonely") self.assertTrue(self.bar.active_filter(self.ANOTHER_SONG), msg="Couldn't find song from second playlist with " "filter of 'lonely'") # ...unless it doesn't match that song self.bar.filter_text("piman") self.assertFalse(self.bar.active_filter(self.ANOTHER_SONG), msg="Shouldn't have matched 'piman' on second list") def test_rename(self): self.assertEquals(self.bar.playlists()[1], self.small) self.bar._rename(0, "zBig") self.assertEquals(self.bar.playlists()[0], self.small) self.assertEquals(self.bar.playlists()[1].name, "zBig") def test_default_display_pattern(self): pattern_text = self.bar.display_pattern_text self.failUnlessEqual(pattern_text, DEFAULT_PATTERN_TEXT) self.failUnless("<~name>" in pattern_text) def test_drag_data_get(self): b = self.bar song = AudioFile() song["~filename"] = fsnative(u"foo") sel = MockSelData() qltk.selection_set_songs(sel, [song]) b._drag_data_get(None, None, sel, DND_QL, None) def test_deletion(self): def a_delete_event(): ev = Gdk.Event() ev.type = Gdk.EventType.KEY_PRESS ev.keyval, accel_mod = Gtk.accelerator_parse("Delete") ev.state = Gtk.accelerator_get_default_mod_mask() & accel_mod return ev b = self.bar self._fake_browser_pack(b) event = a_delete_event() # This is selected in setUp() first_pl = b.playlists()[0] app.window.songlist.set_songs(first_pl) app.window.songlist.select_by_func(lambda x: True, scroll=False, one=True) original_length = len(first_pl) ret = b.key_pressed(event) self.failUnless(ret, msg="Didn't simulate a delete keypress") self.failUnlessEqual(len(first_pl), original_length - 1) @staticmethod def _fake_browser_pack(b): app.window.get_child().pack_start(b, True, True, 0) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_filesel.py����������������������������������������������������������0000644�0001750�0001750�00000010461�13112005742�021170� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, mkdtemp import os import sys sys.modules['dircache'] = os # cheat the dircache effects from senf import fsnative from quodlibet.qltk.filesel import DirectoryTree, FileSelector, get_drives, \ MainDirectoryTree, MainFileSelector, get_gtk_bookmarks, parse_gtk_bookmarks from quodlibet.util.path import get_home_dir import quodlibet.config from quodlibet.util import is_windows class Tget_gtk_bookmarks(TestCase): def test_main(self): paths = get_gtk_bookmarks() assert all(isinstance(p, fsnative) for p in paths) def test_parse(self): if is_windows(): return data = (b'file:///foo/bar\nfile:///home/user\n' b'file:///home/user/Downloads Downloads\n') paths = parse_gtk_bookmarks(data) assert all(isinstance(p, fsnative) for p in paths) class TDirectoryTree(TestCase): if os.name == "nt": ROOTS = [get_home_dir(), u"C:\\"] else: ROOTS = [get_home_dir(), "/"] def setUp(self): quodlibet.config.init() def tearDown(self): quodlibet.config.quit() def test_initial(self): paths = ["/", get_home_dir(), "/usr/bin"] if os.name == "nt": paths = [u"C:\\", get_home_dir()] for path in paths: dirlist = DirectoryTree(path, folders=self.ROOTS) model, rows = dirlist.get_selection().get_selected_rows() selected = [model[row][0] for row in rows] dirlist.destroy() self.failUnlessEqual([path], selected) def test_bad_initial(self): invalid = os.path.join("bin", "file", "does", "not", "exist") for path in self.ROOTS: newpath = os.path.join(path, invalid) dirlist = DirectoryTree(newpath, folders=self.ROOTS) selected = dirlist.get_selected_paths() dirlist.destroy() # select the last valid parent directory self.assertEqual(len(selected), 1) self.assertTrue(selected[0].startswith(path)) def test_bad_go_to(self): newpath = fsnative(u"/woooooo/bar/fun/broken") dirlist = DirectoryTree(fsnative(u"/"), folders=self.ROOTS) dirlist.go_to(newpath) dirlist.destroy() def test_main(self): folders = ["/"] if os.name == "nt": folders = [u"C:\\"] main = MainDirectoryTree(folders=folders) self.assertTrue(len(main.get_model())) main = MainDirectoryTree() self.assertTrue(len(main.get_model())) def test_get_drives(self): for path in get_drives(): self.assertTrue(isinstance(path, fsnative)) class TFileSelector(TestCase): def setUp(self): quodlibet.config.init() self.ROOTS = [mkdtemp(), mkdtemp()] self.INITIAL = self.ROOTS[0] self.PATHS = [ os.path.join(self.ROOTS[0], "a"), os.path.join(self.ROOTS[0], "b"), ] for path in self.PATHS: open(path, "wb").close() self.fs = FileSelector( initial=self.INITIAL, filter=(lambda s: s in self.PATHS), folders=self.ROOTS) self.fs.connect('changed', self._changed) self.files = None self.fs.rescan() def tearDown(self): self.fs.destroy() quodlibet.config.quit() for file_ in self.PATHS: os.unlink(file_) for dir_ in self.ROOTS: os.rmdir(dir_) def _changed(self, fs, selection): self.selection = selection self.files = fs.get_selected_paths() self.files.sort() def test_select(self): expected = self.PATHS expected.sort() self.selection.select_all() self.assertEqual(self.files, expected) def test_select_rescan(self): expected = self.PATHS expected.sort() self.selection.select_all() self.assertEqual(self.files, expected) files_prev = self.fs.get_selected_paths() self.fs.rescan() self.assertEqual(self.files, expected) self.assertEqual(self.files, files_prev) def test_main(self): MainFileSelector() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_cover.py������������������������������������������������������������0000644�0001750�0001750�00000013042�13112005742�020663� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. import glob import os import shutil from senf import fsnative, bytes2fsn from quodlibet.formats import AudioFile from quodlibet.util.cover.manager import CoverManager from quodlibet.util.path import normalize_path, path_equal from quodlibet.compat import text_type from tests import TestCase, mkdtemp bar_2_1 = AudioFile({ "~filename": fsnative(u"does not/exist"), "title": "more songs", "discnumber": "2/2", "tracknumber": "1", "artist": "Foo\nI have two artists", "album": "Bar", "lyricist": "Foo", "composer": "Foo", "performer": "I have two artists", }) class TCoverManager(TestCase): def setUp(self): self.manager = CoverManager() self.dir = mkdtemp() self.song = AudioFile({ "~filename": os.path.join(self.dir, "asong.ogg"), "album": u"Quuxly", }) # Safety check self.failIf(glob.glob(os.path.join(self.dir + "*.jpg"))) files = [self.full_path("12345.jpg"), self.full_path("nothing.jpg")] for f in files: open(f, "w").close() def tearDown(self): shutil.rmtree(self.dir) def _find_cover(self, song): return self.manager.get_cover(song) def full_path(self, path): return os.path.join(self.dir, path) def test_dir_not_exist(self): self.failIf(self._find_cover(bar_2_1)) def test_nothing(self): self.failIf(self._find_cover(self.song)) def test_labelid(self): self.song["labelid"] = "12345" assert path_equal(os.path.abspath(self._find_cover(self.song).name), self.full_path("12345.jpg")) del(self.song["labelid"]) def test_regular(self): for fn in ["cover.png", "folder.jpg", "frontcover.jpg", "front_folder_cover.gif", "jacket_cover.front.folder.jpeg"]: f = self.add_file(fn) assert path_equal( os.path.abspath(self._find_cover(self.song).name), f) self.test_labelid() # labelid must work with other files present def test_file_encoding(self): if os.name == "nt": return f = self.add_file(bytes2fsn(b"\xff\xff\xff\xff - cover.jpg", None)) self.assertTrue(isinstance(self.song("album"), text_type)) h = self._find_cover(self.song) self.assertEqual(h.name, normalize_path(f)) def test_intelligent(self): song = self.song song["artist"] = "Q-Man" song["title"] = "First Q falls hardest" fns = ["Quuxly - back.jpg", "Quuxly.jpg", "q-man - quxxly.jpg", "folder.jpeg", "Q-man - Quuxly (FRONT).jpg"] for fn in fns: f = self.add_file(fn) cover = self._find_cover(song) if cover: actual = os.path.abspath(cover.name) assert path_equal(actual, f) else: # Here, no cover is better than the back... assert path_equal(f, self.full_path("Quuxly - back.jpg")) def test_embedded_special_cover_words(self): """Tests that words incidentally containing embedded "special" words album keywords (e.g. cover, disc, back) don't trigger See Issue 818""" song = AudioFile({ "~filename": fsnative(os.path.join(self.dir, u"asong.ogg")), "album": "foobar", "title": "Ode to Baz", "artist": "Q-Man", }) data = [('back.jpg', False), ('discovery.jpg', False), ("Pharell - frontin'.jpg", False), ('nickelback - Curb.jpg', False), ('foobar.jpg', True), ('folder.jpg', True), # Though this order is debatable ('Q-Man - foobar.jpg', True), ('Q-man - foobar (cover).jpg', True)] for fn, should_find in data: f = self.add_file(fn) cover = self._find_cover(song) if cover: actual = os.path.abspath(cover.name) assert path_equal( actual, f, "\"%s\" should trump \"%s\"" % (f, actual)) else: self.failIf(should_find, msg="Couldn't find %s for %s" % (f, song("~filename"))) def add_file(self, fn): f = self.full_path(fn) open(f, "wb").close() return f def test_multiple_people(self): song = AudioFile({ "~filename": os.path.join(self.dir, "asong.ogg"), "album": "foobar", "title": "Ode to Baz", "performer": "The Performer", "artist": "The Composer\nThe Conductor", "composer": "The Composer", }) for fn in ["foobar.jpg", "The Performer - foobar.jpg", "The Composer - The Performer - foobar.jpg", "The Composer - The Conductor, The Performer - foobar.jpg"]: f = self.add_file(fn) cover = self._find_cover(song) self.failUnless(cover) actual = os.path.abspath(cover.name) cover.close() assert path_equal( actual, f, "\"%s\" should trump \"%s\"" % (f, actual)) def test_get_thumbnail(self): self.assertTrue(self.manager.get_pixbuf(self.song, 10, 10) is None) self.assertTrue( self.manager.get_pixbuf_many([self.song], 10, 10) is None) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_logging.py����������������������������������������������������������0000644�0001750�0001750�00000003412�13112005742�021173� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.util.logging import Logs class TLogging(TestCase): def test_logging(self): l = Logs() self.assertEqual(l.get_content(), []) l.log("foo") l.log("bar") self.assertEqual(l.get_content(), ["foo", "bar"]) l.log("quux") self.assertEqual(l.get_content(), ["foo", "bar", "quux"]) def test_binary(self): l = Logs() l.log(b"\xff") self.assertEqual(l.get_content(), [u"\ufffd"]) def test_max_logs(self): l = Logs(2) l.log("foo") l.log("bar") self.assertEqual(l.get_content(), ["foo", "bar"]) l.log("quux") self.assertEqual(l.get_content(), ["bar", "quux"]) def test_limit(self): l = Logs() l.log("foo") l.log("bar") self.assertEqual(l.get_content(limit=1), ["bar"]) self.assertEqual(l.get_content(limit=2), ["foo", "bar"]) def test_clear(self): l = Logs(2) l.log("foo") l.log("bar") l.clear() self.assertEqual(l.get_content(), []) l.clear() self.assertEqual(l.get_content(), []) def test_cat(self): l = Logs() l.log("foo") l.log("bar", "cat5") l.log("quux", "cat5") self.assertEqual(l.get_content(), ["foo", "bar", "quux"]) self.assertEqual(l.get_content("cat5"), ["bar", "quux"]) self.assertEqual(l.get_content("cat5", limit=2), ["bar", "quux"]) self.assertEqual(l.get_content("cat5", limit=1), ["quux"]) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_source.py����������������������������������������������������������������0000644�0001750�0001750�00000013270�13112005742�020013� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014, 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import re import pprint from gi.repository import Gtk from tests import TestCase def iter_py_paths(): """Iterates over all Python source files that are part of Quod Libet""" import quodlibet root = os.path.dirname(quodlibet.__path__[0]) skip = [ os.path.join(root, "docs"), os.path.join(root, "quodlibet", "optpackages"), ] for dirpath, dirnames, filenames in os.walk(root): if any((dirpath.startswith(s + os.sep) or s == dirpath) for s in skip): continue for filename in filenames: if filename.endswith('.py'): yield os.path.join(dirpath, filename) class TSourceEncoding(TestCase): """Enforce utf-8 source encoding everywhere. Plus give helpful message for fixing it. """ def test_main(self): for path in iter_py_paths(): with open(path, "rb") as h: match = None for i, line in enumerate(h): # https://www.python.org/dev/peps/pep-0263/ match = match or re.search(b"coding[:=]\s*([-\w.]+)", line) if i >= 2: break if match: match = match.group(1) self.assertEqual(match, b"utf-8", msg="%s has no utf-8 source encoding set\n" "Insert:\n# -*- coding: utf-8 -*-" % path) class TLicense(TestCase): ALLOWED = [""" This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation """, """ This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation """, """ This software and accompanying documentation, if any, may be freely used, distributed, and/or modified, in any form and for any purpose, as long as this notice is preserved. There is no warranty, either express or implied, for this software """, """ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. """, """ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """, ] def test_main(self): allowed = [] for license in self.ALLOWED: allowed.append("".join(license.split())) found = set() missing = [] for path in iter_py_paths(): header = b"" with open(path, "rb") as h: for line in h: line = line.strip() if not line.startswith(b"#"): break header += line.lstrip(b"# ") + b"\n" norm = b"".join(header.split()) norm = norm.decode("utf-8") for license_ in allowed: if license_ in norm: found.add(license_) break else: missing.append(path) self.assertFalse(missing, msg="Missing license: %r" % missing) assert len(allowed) == len(found) class TStockIcons(TestCase): def test_main(self): # gtk setting keys start like stock icons, so white list them white = [x.replace("_", "-") for x in dir(Gtk.Settings.get_default().props) if x.startswith("gtk_")] # older gtk doesn't have those, but we still have them in the source white.append("gtk-dialogs-use-header") white.append("gtk-primary-button-warps-slider") # some more.. white.append("gtk-tooltip") white.append("gtk-") white.append("gtk-update-icon-cache-") res = map(re.compile, [ "(Gtk\\.STOCK_[_A-Z]*)", "[\"\'](gtk-[\\-a-z]*)", ]) errors = {} for path in iter_py_paths(): with open(path, "rb") as h: if path.endswith(("icons.py", "test_source.py")): continue data = h.read().decode("utf-8") for r in res: match = r.search(data) if match: group = match.group(1) if group not in white: errors.setdefault(group, []).append(path) self.assertFalse(errors, msg=pprint.pformat(errors)) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_mod.py�����������������������������������������������������������0000644�0001750�0001750�00000001515�13112005742�021024� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, skipUnless, get_data_path from quodlibet.formats.mod import ModFile, extensions @skipUnless(extensions, "ModPlug missing") class TModFile(TestCase): def setUp(self): self.song = ModFile(get_data_path('empty.xm')) def test_length(self): self.failUnlessEqual(0, self.song("~#length", 0)) def test_title(self): self.failUnlessEqual("test song", self.song["title"]) def test_format_codec(self): self.assertEqual(self.song("~format"), "MOD/XM/IT") self.assertEqual(self.song("~codec"), "MOD/XM/IT") self.assertEqual(self.song("~encoding"), "") �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_songsmenu.py��������������������������������������������������������0000644�0001750�0001750�00000011576�13112005742�021573� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import fsnative from tests import TestCase from quodlibet.formats import AudioFile from quodlibet.library import SongLibrary from quodlibet.qltk.songsmenu import SongsMenu from quodlibet import config from quodlibet.compat import text_type import quodlibet.player class TSongsMenu(TestCase): def setUp(self): config.init() self.library = SongLibrary() backend = quodlibet.player.init_backend("nullbe") self.device = backend.init(self.library) self.songs = [AudioFile({"title": x}) for x in ["song1", "song2", "song3"]] for song in self.songs: song.sanitize(fsnative(text_type(song["title"]))) def test_empty(self): self.menu = SongsMenu(self.library, self.songs, plugins=False, playlists=False, queue=False, devices=False, remove=False, delete=False, edit=False, ratings=False) self.failUnlessEqual(0, len(self.menu)) def test_simple(self): self.menu = SongsMenu(self.library, self.songs, plugins=False) def test_playlists(self): self.menu = SongsMenu( self.library, self.songs, plugins=False, playlists=True, queue=False, devices=False, remove=False, delete=False, edit=False, ratings=False) self.failUnlessEqual(1, len(self.menu)) self.failUnless(self.menu.get_children()[0].props.sensitive) self.songs[0].can_add = False self.menu = SongsMenu( self.library, self.songs, plugins=False, playlists=True, queue=False, devices=False, remove=False, delete=False, edit=False, ratings=False) self.failUnlessEqual(1, len(self.menu)) self.failIf(self.menu.get_children()[0].props.sensitive) def test_queue(self): self.menu = SongsMenu( self.library, self.songs, plugins=False, playlists=False, queue=True, devices=False, remove=False, delete=False, edit=False, ratings=False) self.failUnlessEqual(1, len(self.menu)) self.failUnless(self.menu.get_children()[0].props.sensitive) self.songs[0].can_add = False self.menu = SongsMenu( self.library, self.songs, plugins=False, playlists=False, queue=True, devices=False, remove=False, delete=False, edit=False, ratings=False) self.failUnlessEqual(1, len(self.menu)) self.failIf(self.menu.get_children()[0].props.sensitive) def test_devices(self): self.menu = SongsMenu( self.library, self.songs, plugins=False, playlists=False, queue=False, devices=True, remove=False, delete=False, edit=False, ratings=False) from quodlibet import browsers from quodlibet.browsers.media import MediaDevices if MediaDevices in browsers.browsers and len(MediaDevices.devices()): self.failUnlessEqual(1, len(self.menu)) else: self.failUnlessEqual(0, len(self.menu)) def test_remove(self): self.menu = SongsMenu( self.library, self.songs, plugins=False, playlists=False, queue=False, devices=False, remove=True, delete=False, edit=False, ratings=False) self.failUnlessEqual(1, len(self.menu)) self.failIf(self.menu.get_children()[0].props.sensitive) def test_remove_sensitive(self): self.library.add(self.songs) self.menu = SongsMenu( self.library, self.songs, plugins=False, playlists=False, queue=False, devices=False, remove=True, delete=False, edit=False, ratings=False) self.failUnlessEqual(1, len(self.menu)) self.failUnless(self.menu.get_children()[0].props.sensitive) def test_delete(self): self.menu = SongsMenu( self.library, self.songs, plugins=False, playlists=False, queue=False, devices=False, remove=False, delete=True, edit=False, ratings=False) self.failUnlessEqual(1, len(self.menu)) self.failUnless(self.menu.get_children()[0].props.sensitive) self.songs[0].is_file = False self.menu = SongsMenu( self.library, self.songs, plugins=False, playlists=False, queue=False, devices=False, remove=False, delete=True, edit=False, ratings=False) self.failUnlessEqual(1, len(self.menu)) self.failIf(self.menu.get_children()[0].props.sensitive) def tearDown(self): self.device.destroy() self.library.destroy() try: self.menu.destroy() except AttributeError: pass else: del(self.menu) config.quit() ����������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_plugins_cover.py���������������������������������������������������������0000644�0001750�0001750�00000023536�13112005742�021400� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import io import os import shutil from gi.repository import Gtk from gi.repository import GdkPixbuf from tests import TestCase, mkdtemp, mkstemp, get_data_path from quodlibet import config from quodlibet.plugins import Plugin from quodlibet.formats.mp3 import MP3File from quodlibet.formats import AudioFile, EmbeddedImage from quodlibet.plugins.cover import CoverSourcePlugin from quodlibet.util.cover.manager import CoverPluginHandler, CoverManager from quodlibet.util.path import path_equal from .helper import get_temp_copy DUMMY_COVER = io.StringIO() class DummyCoverSource1(CoverSourcePlugin): @staticmethod def priority(): return 0.95 @property def cover(self): DummyCoverSource1.cover_call = True return None class DummyCoverSource2(CoverSourcePlugin): @staticmethod def priority(): return 0.5 @property def cover(self): DummyCoverSource2.cover_call = True return DUMMY_COVER def fetch_cover(self): DummyCoverSource2.fetch_call = True return self.emit('fetch-success', self.cover) class DummyCoverSource3(CoverSourcePlugin): @staticmethod def priority(): return 0.3 @property def cover(self): DummyCoverSource3.cover_call = True return None def fetch_cover(self): DummyCoverSource3.fetch_call = True return self.emit('fetch-success', DUMMY_COVER) dummy_sources = [Plugin(s) for s in [DummyCoverSource1, DummyCoverSource2, DummyCoverSource3] ] class TCoverManager(TestCase): built_in_count = 2 def setUp(self): self.manager = CoverManager() def test_has_builtin_covers(self): self.assertEqual(len(list(self.manager.sources)), self.built_in_count) manager = CoverPluginHandler(use_built_in=False) self.assertEqual(len(list(manager.sources)), 0) def test_only_enabled(self): for source in dummy_sources: self.manager.plugin_handler.plugin_handle(source) self.assertEqual(len(list(self.manager.sources)), self.built_in_count) for source in dummy_sources: self.manager.plugin_handler.plugin_enable(source) self.assertEqual(len(list(self.manager.sources)), self.built_in_count + len(dummy_sources)) for k, source in enumerate(dummy_sources): self.manager.plugin_handler.plugin_disable(source) self.assertEqual(len(list(self.manager.sources)), self.built_in_count + len(dummy_sources) - k - 1) def test_sources_sorted(self): for source in dummy_sources: self.manager.plugin_handler.plugin_handle(source) self.manager.plugin_handler.plugin_enable(source) priorities = [p.priority() for p in self.manager.sources] self.assertSequenceEqual(priorities, sorted(priorities, reverse=True)) # Test that sources are sorted even after removing some of the sources for source in dummy_sources: self.manager.plugin_handler.plugin_disable(source) ps = [p.priority() for p in self.manager.sources] self.assertSequenceEqual(ps, sorted(ps, reverse=True)) def test_acquire_cover_sync(self): song = AudioFile({"~filename": "/dev/null"}) manager = CoverManager(use_built_in=False) handler = manager.plugin_handler for source in dummy_sources: handler.plugin_handle(source) handler.plugin_enable(dummy_sources[0]) self.assertIs(manager.acquire_cover_sync(song), None) handler.plugin_enable(dummy_sources[1]) self.assertIs(manager.acquire_cover_sync(song), DUMMY_COVER) handler.plugin_enable(dummy_sources[2]) self.assertIs(manager.acquire_cover_sync(song), DUMMY_COVER) handler.plugin_disable(dummy_sources[1]) self.assertIs(manager.acquire_cover_sync(song), None) def test_acquire_cover(self): manager = CoverManager(use_built_in=False) handler = manager.plugin_handler for source in dummy_sources: handler.plugin_handle(source) handler.plugin_enable(dummy_sources[0]) found = [] result = [] def done(_found, _result): found.append(_found) result.append(_result) manager.acquire_cover(done, None, None) self.runLoop() self.assertFalse(found[0]) handler.plugin_enable(dummy_sources[1]) manager.acquire_cover(done, None, None) self.runLoop() self.assertTrue(found[1]) self.assertIs(result[1], DUMMY_COVER) handler.plugin_disable(dummy_sources[1]) handler.plugin_enable(dummy_sources[2]) manager.acquire_cover(done, None, None) self.runLoop() self.assertTrue(found[2]) self.assertIs(result[2], DUMMY_COVER) def test_acquire_cover_calls(self): # * fetch_cover shouldn't get called if source provides the cover # synchronously # * First cover source should fail providing the cover both # synchronously and asynchronously and only then the next source # should be used manager = CoverManager(use_built_in=False) handler = manager.plugin_handler found = [] result = [] for source in dummy_sources: handler.plugin_handle(source) handler.plugin_enable(source) source.cls.cover_call = False source.cls.fetch_call = False def done(_found, _result): found.append(_found) result.append(_result) manager.acquire_cover(done, None, None) self.runLoop() self.assertTrue(found[0]) self.assertIs(result[0], DUMMY_COVER) self.assertTrue(dummy_sources[0].cls.cover_call) self.assertTrue(dummy_sources[1].cls.cover_call) self.assertFalse(dummy_sources[2].cls.cover_call) self.assertFalse(dummy_sources[0].cls.fetch_call) self.assertFalse(dummy_sources[1].cls.fetch_call) self.assertFalse(dummy_sources[2].cls.fetch_call) for source in dummy_sources: source.cls.cover_call = False source.cls.fetch_call = False handler.plugin_disable(dummy_sources[1]) manager.acquire_cover(done, None, None) self.runLoop() self.assertTrue(found[1]) self.assertIs(result[1], DUMMY_COVER) self.assertTrue(dummy_sources[0].cls.cover_call) self.assertFalse(dummy_sources[1].cls.cover_call) self.assertTrue(dummy_sources[2].cls.cover_call) self.assertFalse(dummy_sources[0].cls.fetch_call) self.assertFalse(dummy_sources[1].cls.fetch_call) self.assertTrue(dummy_sources[2].cls.fetch_call) def runLoop(self): while Gtk.events_pending(): Gtk.main_iteration() def tearDown(self): pass class TCoverManagerBuiltin(TestCase): def setUp(self): config.init() self.main = mkdtemp() self.dir1 = mkdtemp(dir=self.main) self.dir2 = mkdtemp(dir=self.main) h, self.cover1 = mkstemp(".png", dir=self.main) os.close(h) pb = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 10, 10) pb.savev(self.cover1, "png", [], []) h, self.cover2 = mkstemp(".png", dir=self.main) os.close(h) pb = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 20, 20) pb.savev(self.cover2, "png", [], []) self.file1 = get_temp_copy(get_data_path('silence-44-s.mp3')) self.file2 = get_temp_copy(get_data_path('silence-44-s.mp3')) self.manager = CoverManager() def tearDown(self): shutil.rmtree(self.main) config.quit() def test_connect_cover_changed(self): called_with = [] def sig_handler(*args): called_with.extend(args) obj = object() self.manager.connect("cover-changed", sig_handler) self.manager.cover_changed([obj]) self.assertEqual(called_with, [self.manager, [obj]]) def test_get_primary_image(self): self.assertFalse(MP3File(self.file1).has_images) self.assertFalse(MP3File(self.file1).has_images) def test_manager(self): self.assertEqual(len(list(self.manager.sources)), 2) def test_main(self): # embedd one cover, move one to the other dir MP3File(self.file1).set_image(EmbeddedImage.from_path(self.cover1)) os.unlink(self.cover1) dest = os.path.join(self.dir2, "cover.png") shutil.move(self.cover2, dest) self.cover2 = dest # move one audio file in each dir shutil.move(self.file1, self.dir1) self.file1 = os.path.join(self.dir1, os.path.basename(self.file1)) shutil.move(self.file2, self.dir2) self.file2 = os.path.join(self.dir2, os.path.basename(self.file2)) song1 = MP3File(self.file1) song2 = MP3File(self.file2) def is_embedded(fileobj): return not path_equal(fileobj.name, self.cover2, True) # each should find a cover self.assertTrue(is_embedded(self.manager.get_cover(song1))) self.assertTrue(not is_embedded(self.manager.get_cover(song2))) # both settings should search both songs before giving up config.set("albumart", "prefer_embedded", True) self.assertTrue( is_embedded(self.manager.get_cover_many([song1, song2]))) self.assertTrue( is_embedded(self.manager.get_cover_many([song2, song1]))) config.set("albumart", "prefer_embedded", False) self.assertTrue( not is_embedded(self.manager.get_cover_many([song1, song2]))) self.assertTrue( not is_embedded(self.manager.get_cover_many([song2, song1]))) ������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_icons.py�����������������������������������������������������������������0000644�0001750�0001750�00000001132�13112005742�017620� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from tests import TestCase import quodlibet class TIconTheme(TestCase): def test_icon_theme(self): theme = Gtk.IconTheme.get_default() theme.append_search_path(quodlibet.get_image_dir()) for i in ["quodlibet", "exfalso", "quodlibet-missing-cover"]: self.failUnless(theme.has_icon(i)) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_apev2.py���������������������������������������������������������0000644�0001750�0001750�00000014547�13112005742�021273� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, get_data_path import os import mutagen from mutagen.apev2 import BINARY, APEValue from quodlibet.compat import cBytesIO from quodlibet.formats.monkeysaudio import MonkeysAudioFile from quodlibet.formats.mpc import MPCFile from quodlibet.formats.wavpack import WavpackFile from quodlibet.formats._image import APICType, EmbeddedImage from .helper import get_temp_copy class TAPEv2FileMixin(object): def test_can_change(self): self.failUnlessEqual(self.s.can_change(), True) self.failUnlessEqual(self.s.can_change("~"), False) self.failUnlessEqual(self.s.can_change("a"), False) self.failUnlessEqual(self.s.can_change("OggS"), True) self.failUnlessEqual(self.s.can_change("\xc3\xa4\xc3\xb6"), False) self.failUnlessEqual(self.s.can_change("sUbtitle"), False) self.failUnlessEqual(self.s.can_change("indeX"), False) self.failUnlessEqual(self.s.can_change("yEar"), False) def test_trans_keys(self): self.s["date"] = "2010" self.s.write() m = mutagen.apev2.APEv2(self.f) self.failUnlessEqual(m["Year"], "2010") m["yEar"] = "2011" m.save() self.s.reload() self.failUnlessEqual(self.s["date"], "2011") def test_ignore(self): for tag in ["inDex", "index"]: m = mutagen.apev2.APEv2(self.f) m[tag] = "foobar" m.save() self.s.reload() self.failUnlessEqual(self.s.get(tag), None) m = mutagen.apev2.APEv2(self.f) self.failUnlessEqual(m[tag], "foobar") def test_multi_case(self): self.s["AA"] = "B" self.s["aa"] = "C" self.s["BB"] = "D" self.s["Aa"] = "E" self.s.write() self.s.reload() self.failUnlessEqual(set(self.s["aa"].split()), {"C", "B", "E"}) def test_binary_ignore(self): m = mutagen.apev2.APEv2(self.f) m["foo"] = APEValue(b"bar", BINARY) m.save() self.s.reload() self.failUnlessEqual(self.s.get("foo"), None) self.s.write() m = mutagen.apev2.APEv2(self.f) self.failUnlessEqual("foo" in m, True) def test_titlecase(self): self.s["isRc"] = "1234" self.s["fOoBaR"] = "5678" self.s.write() self.s.reload() self.failUnlessEqual("isrc" in self.s, True) self.failUnlessEqual("foobar" in self.s, True) m = mutagen.apev2.APEv2(self.f) self.failUnlessEqual("ISRC" in m, True) self.failUnlessEqual("Foobar" in m, True) def test_disc_mapping(self): m = mutagen.apev2.APEv2(self.f) m["disc"] = "99/102" m.save() self.s.reload() self.failUnlessEqual(self.s("~#disc"), 99) self.failUnlessEqual(self.s("discnumber"), "99/102") self.s["discnumber"] = "77/88" self.s.write() m = mutagen.apev2.APEv2(self.f) self.failUnlessEqual(m["disc"], "77/88") def test_track_mapping(self): m = mutagen.apev2.APEv2(self.f) m["track"] = "99/102" m.save() self.s.reload() self.failUnlessEqual(self.s("~#track"), 99) self.failUnlessEqual(self.s("tracknumber"), "99/102") self.s["tracknumber"] = "77/88" self.s.write() m = mutagen.apev2.APEv2(self.f) self.failUnlessEqual(m["track"], "77/88") class TMPCFileAPEv2(TestCase, TAPEv2FileMixin): def setUp(self): self.f = get_temp_copy(get_data_path('silence-44-s.mpc')) self.s = MPCFile(self.f) def tearDown(self): os.unlink(self.f) class TMAFile(TestCase, TAPEv2FileMixin): def setUp(self): self.f = get_temp_copy(get_data_path('silence-44-s.ape')) self.s = MonkeysAudioFile(self.f) def tearDown(self): os.unlink(self.f) def test_format_codec(self): self.assertEqual(self.s("~format"), "Monkey's Audio") self.assertEqual(self.s("~codec"), "Monkey's Audio") self.assertEqual(self.s("~encoding"), "") def test_channels(self): assert self.s("~#channels") == 2 class TWavpackFileAPEv2(TestCase, TAPEv2FileMixin): def setUp(self): self.f = get_temp_copy(get_data_path('silence-44-s.wv')) self.s = WavpackFile(self.f) def tearDown(self): os.unlink(self.f) def test_format_codec(self): self.assertEqual(self.s("~format"), "WavPack") self.assertEqual(self.s("~codec"), "WavPack") self.assertEqual(self.s("~encoding"), "") class TWvCoverArt(TestCase): def setUp(self): self.f = get_temp_copy(get_data_path('coverart.wv')) self.s = WavpackFile(self.f) def tearDown(self): os.unlink(self.f) def test_get_primary_image(self): cover = self.s.get_primary_image() self.assertTrue(cover) self.assertEqual(cover.type, APICType.COVER_FRONT) def test_get_images(self): covers = self.s.get_images() self.assertEqual(len(covers), 2) types = [c.type for c in covers] self.assertEqual(types, [APICType.COVER_FRONT, APICType.COVER_BACK]) def test_can_change_images(self): self.assertTrue(self.s.can_change_images) def test_clear_images(self): # cover case image = self.s.get_primary_image() self.assertTrue(image) self.s.clear_images() self.assertFalse(self.s.has_images) self.s.reload() image = self.s.get_primary_image() self.assertFalse(image) # no cover case self.s.clear_images() def test_set_image(self): fileobj = cBytesIO(b"foo") image = EmbeddedImage(fileobj, "image/jpeg", 10, 10, 8) self.s.set_image(image) self.assertTrue(self.s.has_images) images = self.s.get_images() self.assertEqual(len(images), 1) self.assertEqual(images[0].mime_type, "image/") self.assertEqual(images[0].read(), b"foo") def test_set_image_no_tag(self): m = mutagen.apev2.APEv2(self.f) m.delete() fileobj = cBytesIO(b"foo") image = EmbeddedImage(fileobj, "image/jpeg", 10, 10, 8) self.s.set_image(image) images = self.s.get_images() self.assertEqual(len(images), 1) ���������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_window.py�����������������������������������������������������������0000644�0001750�0001750�00000004442�13112005742�021056� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.window import Window, on_first_map, Dialog from quodlibet.util import InstanceTracker from .helper import realized class TWindows(TestCase): def test_on_first_map(self): w = Window() calls = [] def foo(*args): calls.append(args) on_first_map(w, foo, 1) w.show() self.assertEqual(calls, [(1,)]) on_first_map(w, foo, 2) self.assertEqual(calls, [(1,), (2,)]) w.destroy() def test_ctr(self): Window().destroy() def test_instance_tracking(self): class SomeWindow(Window, InstanceTracker): def __init__(self): super(SomeWindow, self).__init__() self._register_instance() self.assertFalse(SomeWindow.windows) other = Window() a = SomeWindow() self.assertTrue(a in SomeWindow.windows) self.assertTrue(a in SomeWindow.instances()) a.destroy() self.assertFalse(SomeWindow.instances()) self.assertTrue(SomeWindow.windows) other.destroy() self.assertFalse(SomeWindow.windows) def test_show_maybe(self): Window.prevent_inital_show(True) w = Window() w.show_maybe() self.assertFalse(w.get_visible()) Window.prevent_inital_show(False) w.show_maybe() self.assertTrue(w.get_visible()) w.destroy() def test_use_header_bar(self): w = Window(title="foo") w.use_header_bar() self.assertEqual(w.get_title(), "foo") w.destroy() w = Window() w.use_header_bar() self.assertEqual(w.get_title(), None) w.destroy() def test_toggle_fullscreen(self): w = Window(title="foo") w.toggle_fullscreen() with realized(w): w.toggle_fullscreen() w.toggle_fullscreen() w.destroy() class TDialog(TestCase): def test_add_icon_button(self): d = Dialog() w = d.add_icon_button("foo", "bar", 100) self.assertEqual(d.get_widget_for_response(100), w) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_getstring.py��������������������������������������������������������0000644�0001750�0001750�00000002660�13112005742�021555� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Gdk from tests import TestCase, skipIf from quodlibet.qltk.getstring import GetStringDialog from quodlibet.qltk import is_wayland class _ClipboadTestClass(GetStringDialog): _OK = True def _verify_clipboard(self, text): if self._OK: return text @skipIf(is_wayland(), "blocks under wayland for some reason") class TGetStringDialog(TestCase): def setUp(self): parent = Gtk.Window() self.gsd1 = GetStringDialog(parent, "title", "enter a string") self.gsd2 = _ClipboadTestClass(parent, "title", "enter a string") def test_getstring(self): ret = self.gsd1.run(text="foobar", test=True) self.failUnlessEqual(ret, "foobar") def test_tooltip(self): foo = GetStringDialog(Gtk.Window(), "title", "", tooltip="foo bar") self.failUnlessEqual(foo._val.get_tooltip_text(), "foo bar") def test_clipboard(self): clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) clipboard.set_text("42", -1) ret = self.gsd2.run(text="24", clipboard=True, test=True) self.failUnlessEqual(ret, "42") clipboard.clear() def tearDown(self): self.gsd1.destroy() self.gsd2.destroy() ��������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_pattern.py���������������������������������������������������������������0000644�0001750�0001750�00000060213�13112005742�020167� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from senf import fsnative from tests import TestCase from quodlibet.formats import AudioFile from quodlibet.pattern import (FileFromPattern, XMLFromPattern, Pattern, XMLFromMarkupPattern, ArbitraryExtensionFileFromPattern) class _TPattern(TestCase): def setUp(self): s1 = {'tracknumber': u'5/6', 'artist': u'Artist', 'title': u'Title5', '~filename': '/path/to/a.mp3', 'xmltest': u"<&>"} s2 = {'tracknumber': u'6', 'artist': u'Artist', 'title': u'Title6', '~filename': '/path/to/b.ogg', 'discnumber': u'2', 'unislash': u"foo\uff0fbar"} s3 = {'title': u'test/subdir', 'genre': u'/\n/', '~filename': '/one/more/a.flac', 'version': u'Instrumental'} s4 = {'performer': u'a\nb', 'artist': u'foo\nbar'} s5 = {'tracknumber': u'7/1234', 'artist': u'Artist', 'title': u'Title7', '~filename': '/path/to/e.mp3'} s6 = {'artist': u'Foo', 'albumartist': u'foo.bar', 'album': u'Best Of', '~filename': '/path/to/f.mp3', 'title': u'The.Final.Word'} s7 = {'artist': u'un élève français', '~filename': '/path/to/g.mp3', 'albumartist': u'Lee "Scratch" Perry', 'album': u"The 'only' way!", 'comment': u'Trouble|Strife'} s8 = {'tracknumber': u'7/8', 'artist': u'Artist1\n\nArtist3', 'artistsort': u'SortA1\nSortA2', 'album': u'Album5', 'albumsort': u'SortAlbum5', '~filename': '/path/to/g.mp3', 'xmltest': u"<&>"} if os.name == "nt": s1["~filename"] = u"C:\\path\\to\\a.mp3" s2["~filename"] = u"C:\\path\\to\\b.ogg" s3["~filename"] = u"C:\\one\\more\\a.flac" s4["~filename"] = u"C:\\path\\to\\a.mp3" s5["~filename"] = u"C:\\path\\to\\a.mp3" s6["~filename"] = u"C:\\path\\to\\f.mp3" s7["~filename"] = u"C:\\path\\to\\g.mp3" s8["~filename"] = u"C:\\path\\to\\h.mp3" self.a = AudioFile(s1) self.b = AudioFile(s2) self.c = AudioFile(s3) self.d = AudioFile(s4) self.e = AudioFile(s5) self.f = AudioFile(s6) self.g = AudioFile(s7) self.h = AudioFile(s8) class TPattern(_TPattern): from quodlibet.formats import AudioFile AudioFile def test_numeric(self): pat = Pattern("<~#rating>") self.assertEqual(pat.format(self.a), "0.50") def test_space(self): pat = Pattern("a ") self.assertEqual(pat.format(self.a), "a ") pat = Pattern(" a") self.assertEqual(pat.format(self.a), " a") pat = Pattern("a\n\n") self.assertEqual(pat.format(self.a), "a\n\n") def test_escape(self): pat = Pattern("a \\<foo\\|bla\\>") self.assertEqual(pat.format(self.a), "a <foo|bla>") pat = Pattern(r"a\\<foo>") self.assertEqual(pat.format(self.a), "a\\") def test_query_like_tag(self): pat = Pattern("<t=v>") self.assertEqual(pat.format(AudioFile({"t=v": "foo"})), "foo") def test_conditional_number_dot_title(s): pat = Pattern('<tracknumber|<tracknumber>. ><title>') s.assertEquals(pat.format(s.a), '5/6. Title5') s.assertEquals(pat.format(s.b), '6. Title6') s.assertEquals(pat.format(s.c), 'test/subdir') def test_conditional_other_number_dot_title(s): pat = Pattern('<tracknumber|<tracknumber>|00>. <title>') s.assertEquals(pat.format(s.a), '5/6. Title5') s.assertEquals(pat.format(s.b), '6. Title6') s.assertEquals(pat.format(s.c), '00. test/subdir') def test_conditional_other_other(s): # FIXME: was <tracknumber|a|b|c>.. but we can't put <>| in the format # string since it would break the XML pattern formatter. s.assertEqual(Pattern('<tracknumber|a|b|c>').format(s.a), "") def test_conditional_genre(s): pat = Pattern('<genre|<genre>|music>') s.assertEquals(pat.format(s.a), 'music') s.assertEquals(pat.format(s.b), 'music') s.assertEquals(pat.format(s.c), '/, /') def test_conditional_unknown(s): pat = Pattern('<album|foo|bar>') s.assertEquals(pat.format(s.a), 'bar') def test_conditional_equals(s): pat = Pattern('<artist=Artist|matched|not matched>') s.assertEquals(pat.format(s.a), 'matched') pat = Pattern('<artist=Artistic|matched|not matched>') s.assertEquals(pat.format(s.a), 'not matched') def test_conditional_equals_unicode(s): pat = Pattern(u'<artist=Artist|matched|not matched>') s.assertEquals(pat.format(s.g), 'not matched') pat = Pattern(u'<artist=un élève français|matched|not matched>') s.assertEquals(pat.format(s.g), 'matched') def test_duplicate_query(self): pat = Pattern('<u=yes|<u=yes|x|y>|<u=yes|q|z>>') self.assertEqual(pat.format(AudioFile({"u": u"yes"})), "x") self.assertEqual(pat.format(AudioFile({"u": u"no"})), "z") def test_tag_query_escaping(s): pat = Pattern('<albumartist=Lee "Scratch" Perry|matched|not matched>') s.assertEquals(pat.format(s.g), 'matched') def test_tag_query_escaped_pipe(s): pat = Pattern(r'<albumartist=/Lee\|Bob/|matched|not matched>') s.assertEquals(pat.format(s.g), 'matched') pat = Pattern(r'<albumartist=\||matched|not matched>') s.assertEquals(pat.format(s.g), 'not matched') pat = Pattern(r'<comment=/Trouble\|Strife/|matched|not matched>') s.assertEquals(pat.format(s.g), 'matched') def test_tag_query_quoting(s): pat = Pattern('<album=The only way|matched|not matched>') s.assertEquals(pat.format(s.g), 'not matched') pat = Pattern("<album=\"The 'only' way!\"|matched|not matched>") s.assertEquals(pat.format(s.g), 'matched') def test_tag_query_regex(s): pat = Pattern("<album=/'only'/|matched|not matched>") s.assertEquals(pat.format(s.g), 'matched') pat = Pattern("<album=/The .+ way/|matched|not matched>") s.assertEquals(pat.format(s.g), 'matched') pat = Pattern("</The .+ way/|matched|not matched>") s.assertEquals(pat.format(s.g), 'not matched') def test_tag_internal(self): if os.name != "nt": pat = Pattern("<~filename='/path/to/a.mp3'|matched|not matched>") self.assertEquals(pat.format(self.a), 'matched') pat = Pattern( "<~filename=/\\/path\\/to\\/a.mp3/|matched|not matched>") self.assertEquals(pat.format(self.a), 'matched') else: pat = Pattern( r"<~filename='C:\\\path\\\to\\\a.mp3'|matched|not matched>") self.assertEquals(pat.format(self.a), 'matched') def test_tag_query_disallowed_free_text(s): pat = Pattern("<The only way|matched|not matched>") s.assertEquals(pat.format(s.g), 'not matched') def test_query_scope(self): pat = Pattern("<foo|<artist=Foo|x|y>|<artist=Foo|z|q>>") self.assertEqual(pat.format(self.f), "z") def test_query_numeric(self): pat = Pattern("<#(foo=42)|42|other>") self.assertEqual(pat.format(AudioFile()), "other") self.assertEqual(pat.format(AudioFile({"foo": "42"})), "42") def test_conditional_notfile(s): pat = Pattern('<tracknumber|<tracknumber>|00>') s.assertEquals(pat.format(s.a), '5/6') s.assertEquals(pat.format(s.b), '6') s.assertEquals(pat.format(s.c), '00') def test_conditional_subdir(s): pat = Pattern('/a<genre|/<genre>>/<title>') s.assertEquals(pat.format(s.a), '/a/Title5') s.assertEquals(pat.format(s.b), '/a/Title6') s.assertEquals(pat.format(s.c), '/a//, //test/subdir') def test_number_dot_title(s): pat = Pattern('<tracknumber>. <title>') s.assertEquals(pat.format(s.a), '5/6. Title5') s.assertEquals(pat.format(s.b), '6. Title6') s.assertEquals(pat.format(s.c), '. test/subdir') def test_recnumber_dot_title(s): pat = Pattern('\<<tracknumber>\>. <title>') s.assertEquals(pat.format(s.a), '<5/6>. Title5') s.assertEquals(pat.format(s.b), '<6>. Title6') s.assertEquals(pat.format(s.c), '<>. test/subdir') def test_generated(s): pat = Pattern('<~basename>') s.assertEquals(pat.format(s.a), os.path.basename(s.a["~filename"])) def test_generated_and_not_generated(s): pat = Pattern('<~basename> <title>') res = pat.format(s.a) s.assertEquals( res, os.path.basename(s.a["~filename"]) + " " + s.a["title"]) def test_number_dot_title_dot(s): pat = Pattern('<tracknumber>. <title>.') s.assertEquals(pat.format(s.a), '5/6. Title5.') s.assertEquals(pat.format(s.b), '6. Title6.') s.assertEquals(pat.format(s.c), '. test/subdir.') def test_number_dot_genre(s): pat = Pattern('<tracknumber>. <genre>') s.assertEquals(pat.format(s.a), '5/6. ') s.assertEquals(pat.format(s.b), '6. ') s.assertEquals(pat.format(s.c), '. /, /') def test_unicode_with_int(s): song = AudioFile({"tracknumber": "5/6", "title": b"\xe3\x81\x99\xe3\x81\xbf\xe3\x82\x8c".decode('utf-8')}) pat = Pattern('<~#track>. <title>') s.assertEquals(pat.format(song), b"5. \xe3\x81\x99\xe3\x81\xbf\xe3\x82\x8c".decode('utf-8')) class _TFileFromPattern(_TPattern): def _create(self, string): return FileFromPattern(string) def test_escape_slash(s): fpat = s._create('<~filename>') s.assertTrue(fpat.format(s.a).endswith("_path_to_a.mp3")) pat = Pattern('<~filename>') if os.name != "nt": s.assertTrue(pat.format(s.a).startswith("/path/to/a")) else: s.assertTrue(pat.format(s.a).startswith("C:\\path\\to\\a")) if os.name != "nt": wpat = s._create(r'\\<artist>\\ "<title>') s.assertTrue( wpat.format(s.a).startswith(r'\Artist\ "Title5')) else: # FIXME.. pass def test_directory_rooting(s): if os.name == "nt": s.assertRaises(ValueError, FileFromPattern, 'a\\<b>') s.assertRaises(ValueError, FileFromPattern, '<a>\\<b>') s._create('C:\\<a>\\<b>') else: s.assertRaises(ValueError, FileFromPattern, 'a/<b>') s.assertRaises(ValueError, FileFromPattern, '<a>/<b>') s._create('/<a>/<b>') def test_backslash_conversion_win32(s): if os.name == 'nt': pat = s._create(r'Z:\<artist>\<title>') s.assertTrue(pat.format(s.a).startswith('Z:\Artist\Title5')) def test_raw_slash_preservation(s): if os.name == "nt": pat = s._create('C:\\a\\b\\<genre>') s.assertTrue(pat.format(s.a).startswith('C:\\a\\b\\')) s.assertTrue(pat.format(s.b).startswith('C:\\a\\b\\')) s.assertTrue(pat.format(s.c).startswith('C:\\a\\b\\_, _')) else: pat = s._create('/a/b/<genre>') s.assertTrue(pat.format(s.a).startswith('/a/b/')) s.assertTrue(pat.format(s.b).startswith('/a/b/')) s.assertTrue(pat.format(s.c).startswith('/a/b/_, _')) def test_specialcase_anti_ext(s): p1 = s._create('<~filename>') p2 = s._create('<~dirname>_<~basename>') s.assertEquals(p1.format(s.a), p2.format(s.a)) s.assertTrue(p1.format(s.a).endswith('_path_to_a.mp3')) s.assertEquals(p1.format(s.b), p2.format(s.b)) s.assertTrue(p1.format(s.b).endswith('_path_to_b.ogg')) s.assertEquals(p1.format(s.c), p2.format(s.c)) s.assertTrue(p1.format(s.c).endswith('_one_more_a.flac')) def test_long_filename(s): if os.name == "nt": a = AudioFile({"title": "x" * 300, "~filename": u"C:\\f.mp3"}) path = s._create(u'C:\\foobar\\ä<title>\\<title>').format(a) assert isinstance(path, fsnative) s.failUnlessEqual(len(path), 3 + 6 + 1 + 255 + 1 + 255) path = s._create(u'äüö<title><title>').format(a) assert isinstance(path, fsnative) s.failUnlessEqual(len(path), 255) else: a = AudioFile({"title": "x" * 300, "~filename": "/f.mp3"}) path = s._create(u'/foobar/ä<title>/<title>').format(a) assert isinstance(path, fsnative) s.failUnlessEqual(len(path), 1 + 6 + 1 + 255 + 1 + 255) path = s._create(u'äüö<title><title>').format(a) assert isinstance(path, fsnative) s.failUnlessEqual(len(path), 255) class TFileFromPattern(_TFileFromPattern): def _create(self, string): return FileFromPattern(string) def test_type(self): pat = self._create('') self.assertTrue(isinstance(pat.format(self.a), fsnative)) pat = self._create('<title>') self.assertTrue(isinstance(pat.format(self.a), fsnative)) def test_number_dot_title_dot(s): pat = s._create('<tracknumber>. <title>.') s.assertEquals(pat.format(s.a), '05. Title5..mp3') s.assertEquals(pat.format(s.b), '06. Title6..ogg') s.assertEquals(pat.format(s.c), '. test_subdir..flac') def test_tracknumber_decimals(s): pat = s._create('<tracknumber>. <title>') s.assertEquals(pat.format(s.a), '05. Title5.mp3') s.assertEquals(pat.format(s.e), '0007. Title7.mp3') def test_ext_case_preservation(s): x = AudioFile({'~filename': fsnative(u'/tmp/Xx.Flac'), 'title': 'Xx'}) # If pattern has a particular ext, preserve case of ext p1 = s._create('<~basename>') s.assertEquals(p1.format(x), 'Xx.Flac') p2 = s._create('<title>.FLAC') s.assertEquals(p2.format(x), 'Xx.FLAC') # If pattern doesn't have a particular ext, lowercase ext p3 = s._create('<title>') s.assertEquals(p3.format(x), 'Xx.flac') class TArbitraryExtensionFileFromPattern(_TFileFromPattern): def _create(self, string): return ArbitraryExtensionFileFromPattern(string) def test_number_dot_title_dot(s): pat = s._create('<tracknumber>. <title>.') if os.name == 'nt': # Can't have Windows names ending with dot s.assertEquals(pat.format(s.a), '05. Title5_') s.assertEquals(pat.format(s.b), '06. Title6_') s.assertEquals(pat.format(s.c), '. test_subdir_') else: s.assertEquals(pat.format(s.a), '05. Title5.') s.assertEquals(pat.format(s.b), '06. Title6.') s.assertEquals(pat.format(s.c), '. test_subdir.') def test_tracknumber_decimals(s): pat = s._create('<tracknumber>. <title>') s.assertEquals(pat.format(s.a), '05. Title5') s.assertEquals(pat.format(s.e), '0007. Title7') def test_constant_albumart_example(s): pat = s._create("folder.jpg") s.assertEquals(pat.format(s.a), 'folder.jpg') def test_extra_dots(s): pat = s._create("<artist~album>.png") s.assertEquals(pat.format(s.f), 'Foo - Best Of.png') pat = s._create("<albumartist~title>.png") s.assertEquals(pat.format(s.f), 'foo.bar - The.Final.Word.png') class TXMLFromPattern(_TPattern): def test_markup_passthrough(s): pat = XMLFromPattern(r'\<b\><<title>>\</b\>') s.assertEquals(pat.format(s.a), '<b><Title5></b>') s.assertEquals(pat.format(s.b), '<b><Title6></b>') s.assertEquals(pat.format(s.c), '<b><test/subdir></b>') def test_escape(s): pat = XMLFromPattern(r'\<b\><<xmltest>>\</b\>') s.assertEquals(pat.format(s.a), '<b><<&>></b>') def test_cond_markup(s): pat = XMLFromPattern(r'<title|\<b\><title> woo\</b\>>') s.assertEquals(pat.format(s.a), '<b>Title5 woo</b>') class TXMLFromMarkupPattern(_TPattern): def _test_markup(self, text): from gi.repository import Pango Pango.parse_markup(text, -1, "\x00") def test_convenience(s): pat = XMLFromMarkupPattern(r'[b]foo[/b]') s.assertEquals(pat.format(s.a), '<b>foo</b>') s._test_markup(pat.format(s.a)) pat = XMLFromMarkupPattern('[small ]foo[/small \t]') s.assertEquals(pat.format(s.a), '<small >foo</small \t>') s._test_markup(pat.format(s.a)) def test_link(s): pat = XMLFromMarkupPattern(r'[a href=""]foo[/a]') s.assertEquals(pat.format(s.a), '<a href="">foo</a>') def test_convenience_invalid(s): pat = XMLFromMarkupPattern(r'[b foo="1"]') s.assertEquals(pat.format(s.a), '[b foo="1"]') s._test_markup(pat.format(s.a)) def test_span(s): pat = XMLFromMarkupPattern(r'[span]foo[/span]') s.assertEquals(pat.format(s.a), '<span>foo</span>') s._test_markup(pat.format(s.a)) pat = XMLFromMarkupPattern(r'[span weight="bold"]foo[/span]') s.assertEquals(pat.format(s.a), '<span weight="bold">foo</span>') s._test_markup(pat.format(s.a)) def test_escape(s): pat = XMLFromMarkupPattern(r'\[b]') s.assertEquals(pat.format(s.a), '[b]') s._test_markup(pat.format(s.a)) pat = XMLFromMarkupPattern(r'\\\\[b]\\\\[/b]') s.assertEquals(pat.format(s.a), r'\\<b>\\</b>') s._test_markup(pat.format(s.a)) class TRealTags(TestCase): def test_empty(self): self.failUnlessEqual(Pattern("").tags, []) def test_both(self): pat = "<foo|<~bar~fuu> - <fa>|<bar>>" self.failUnlessEqual(Pattern(pat).tags, ["bar", "fuu", "fa"]) pat = "<foo|<~bar~fuu> - <fa>|<quux>>" self.failUnlessEqual(Pattern(pat).tags, ["bar", "fuu", "fa", "quux"]) class TPatternFormatList(_TPattern): def test_numeric(self): pat = Pattern("<~#rating>") self.assertEqual(pat.format_list(self.a), {("0.50", "0.50")}) def test_empty(self): pat = Pattern("<nopenope>") self.assertEqual(pat.format_list(self.a), {("", "")}) def test_same(s): pat = Pattern('<~basename> <title>') s.failUnlessEqual(pat.format_list(s.a), {(pat.format(s.a), pat.format(s.a))}) pat = Pattern('/a<genre|/<genre>>/<title>') s.failUnlessEqual(pat.format_list(s.a), {(pat.format(s.a), pat.format(s.a))}) def test_same2(s): fpat = FileFromPattern('<~filename>') pat = Pattern('<~filename>') s.assertEquals(fpat.format_list(s.a), {(fpat.format(s.a), fpat.format(s.a))}) s.assertEquals(pat.format_list(s.a), {(pat.format(s.a), pat.format(s.a))}) def test_tied(s): pat = Pattern('<genre>') s.failUnlessEqual(pat.format_list(s.c), {('/', '/')}) pat = Pattern('<performer>') s.failUnlessEqual(pat.format_list(s.d), {('a', 'a'), ('b', 'b')}) pat = Pattern('<performer><performer>') s.failUnlessEqual(set(pat.format_list(s.d)), {('aa', 'aa'), ('ab', 'ab'), ('ba', 'ba'), ('bb', 'bb')}) pat = Pattern('<~performer~artist>') s.failUnlessEqual(pat.format_list(s.d), {('a', 'a'), ('b', 'b'), ('bar', 'bar'), ('foo', 'foo')}) pat = Pattern('<performer~artist>') s.failUnlessEqual(pat.format_list(s.d), {('a', 'a'), ('b', 'b'), ('bar', 'bar'), ('foo', 'foo')}) pat = Pattern('<artist|<artist>.|<performer>>') s.failUnlessEqual(pat.format_list(s.d), {('foo.', 'foo.'), ('bar.', 'bar.')}) pat = Pattern('<artist|<artist|<artist>.|<performer>>>') s.failUnlessEqual(pat.format_list(s.d), {('foo.', 'foo.'), ('bar.', 'bar.')}) def test_sort(s): pat = Pattern('<album>') s.failUnlessEqual(pat.format_list(s.f), {(u'Best Of', u'Best Of')}) pat = Pattern('<album>') s.failUnlessEqual(pat.format_list(s.h), {(u'Album5', u'SortAlbum5')}) pat = Pattern('<artist>') s.failUnlessEqual(pat.format_list(s.h), {(u'Artist1', u'SortA1'), (u'', u'SortA2'), (u'Artist3', u'Artist3')}) pat = Pattern('<artist> x') s.failUnlessEqual(pat.format_list(s.h), {(u'Artist1 x', u'SortA1 x'), (u' x', u'SortA2 x'), (u'Artist3 x', u'Artist3 x')}) def test_sort_tied(s): pat = Pattern('<~artist~album>') s.failUnlessEqual(pat.format_list(s.h), {(u'Artist1', u'SortA1'), (u'', u'SortA2'), (u'Artist3', u'Artist3'), (u'Album5', u'SortAlbum5')}) pat = Pattern('<~album~artist>') s.failUnlessEqual(pat.format_list(s.h), {(u'Artist1', u'SortA1'), (u'', u'SortA2'), (u'Artist3', u'Artist3'), (u'Album5', u'SortAlbum5')}) pat = Pattern('<~artist~artist>') s.failUnlessEqual(pat.format_list(s.h), {(u'Artist1', u'SortA1'), (u'', u'SortA2'), (u'Artist3', u'Artist3')}) def test_sort_combine(s): pat = Pattern('<album> <artist>') s.failUnlessEqual(pat.format_list(s.h), {(u'Album5 Artist1', u'SortAlbum5 SortA1'), (u'Album5 ', u'SortAlbum5 SortA2'), (u'Album5 Artist3', u'SortAlbum5 Artist3')}) pat = Pattern('x <artist> <album>') s.failUnlessEqual(pat.format_list(s.h), {(u'x Artist1 Album5', u'x SortA1 SortAlbum5'), (u'x Album5', u'x SortA2 SortAlbum5'), (u'x Artist3 Album5', u'x Artist3 SortAlbum5')}) pat = Pattern(' <artist> <album> xx') s.failUnlessEqual(pat.format_list(s.h), {(u' Artist1 Album5 xx', u' SortA1 SortAlbum5 xx'), (u' Album5 xx', u' SortA2 SortAlbum5 xx'), (u' Artist3 Album5 xx', u' Artist3 SortAlbum5 xx')}) pat = Pattern('<album> <tracknumber> <artist>') s.failUnlessEqual(pat.format_list(s.h), {(u'Album5 7/8 Artist1', u'SortAlbum5 7/8 SortA1'), (u'Album5 7/8 ', u'SortAlbum5 7/8 SortA2'), (u'Album5 7/8 Artist3', u'SortAlbum5 7/8 Artist3')}) pat = Pattern('<tracknumber> <album> <artist>') s.failUnlessEqual(pat.format_list(s.h), {(u'7/8 Album5 Artist1', u'7/8 SortAlbum5 SortA1'), (u'7/8 Album5 ', u'7/8 SortAlbum5 SortA2'), (u'7/8 Album5 Artist3', u'7/8 SortAlbum5 Artist3')}) def test_sort_multiply(s): pat = Pattern('<artist> <artist>') s.failUnlessEqual(pat.format_list(s.h), {(u'Artist1 Artist1', u'SortA1 SortA1'), (u' Artist1', u'SortA2 SortA1'), (u'Artist3 Artist1', u'Artist3 SortA1'), (u'Artist1 ', u'SortA1 SortA2'), (u' ', u'SortA2 SortA2'), (u'Artist3 ', u'Artist3 SortA2'), (u'Artist1 Artist3', u'SortA1 Artist3'), (u' Artist3', u'SortA2 Artist3'), (u'Artist3 Artist3', u'Artist3 Artist3')}) def test_missing_value(self): pat = Pattern('<genre> - <artist>') self.assertEqual(pat.format_list(self.a), {(" - Artist", " - Artist")}) pat = Pattern('') self.assertEqual(pat.format_list(self.a), {("", "")}) def test_string(s): pat = Pattern('display') s.assertEqual(pat.format_list(s.a), {("display", "display")}) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_player.py����������������������������������������������������������������0000644�0001750�0001750�00000023444�13112005742�020013� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import fsnative from tests import TestCase, skipUnless from quodlibet import player from quodlibet import library from quodlibet import config from quodlibet.util import connect_obj from quodlibet.player.nullbe import NullPlayer from quodlibet.formats import AudioFile from quodlibet.qltk.songmodel import PlaylistModel from quodlibet.qltk.controls import Volume FILES = [ AudioFile({"~filename": fsnative(u"/foo/bar1"), "title": "1"}), AudioFile({"~filename": fsnative(u"/foo/bar2"), "title": "2"}), AudioFile({"~filename": fsnative(u"/foo/bar3"), "title": "3"}), ] for file_ in FILES: file_.sanitize() UNKNOWN_FILE = FILES.pop(-1) class TPlayer(TestCase): NAME = None def setUp(self): config.init() config.set("player", "gst_pipeline", "fakesink") config.set("settings", "xine_driver", "none") module = player.init_backend(self.NAME) lib = library.init() self.player = module.init(lib.librarian) source = PlaylistModel() source.set(FILES) self.events = [] def start_end_handler(player, song, *args): self.events.append((args[-1], song)) self.player.connect("song-started", start_end_handler, "started") self.player.connect("song-ended", start_end_handler, "ended") self.player.setup(source, None, 0) self.signals = [] def handler(type_, *args): self.signals.append(type_) connect_obj(self.player, "unpaused", handler, "unpaused") connect_obj(self.player, "paused", handler, "paused") def _check_events(self): # make sure song-started and song-ended match up stack = [] old = self.events[:] for type_, song in self.events: if type_ == "started": stack.append(song) elif type_ == "ended": self.assertTrue(stack.pop(-1) is song, msg=old) self.assertFalse(stack, msg=old) def tearDown(self): self.player.destroy() self._check_events() del self.events del self.signals config.quit() class TPlayerMixin(object): def test_song_start(self): self.assertFalse(self.player.song) self.assertFalse(self.player.info) def test_paused(self): self.assertTrue(self.player.paused) self.player.paused = False self.assertFalse(self.player.paused) self.assertTrue(self.signals, ["unpaused"]) def test_volume(self): self.assertEqual(self.player.volume, 1.0) self.player.volume = 1000 self.assertEqual(self.player.volume, 1.0) self.player.volume = -1000 self.assertEqual(self.player.volume, 0.0) self.player.volume = 0.5 self.assertEqual(self.player.volume, 0.5) def test_remove(self): self.player.remove(None) self.player.go_to(FILES[0]) self.assertEqual(self.player.song, FILES[0]) self.player.remove(FILES[0]) self.assertEqual(self.player.song, FILES[1]) self.player.remove(None) self.assertEqual(self.player.song, FILES[1]) def test_next(self): self.assertFalse(self.player.song) self.player.next() self.assertEqual(self.player.song, FILES[0]) self.player.next() self.assertEqual(self.player.song, FILES[1]) self.player.next() self.assertFalse(self.player.song) def test_previous(self): self.player.next() self.player.next() self.assertEqual(self.player.song, FILES[1]) self.player.previous() self.assertEqual(self.player.song, FILES[0]) def test_goto(self): self.assertTrue(self.player.paused) self.player.go_to(FILES[1]) self.assertEqual(self.player.song, FILES[1]) self.assertTrue(self.player.paused) self.player.go_to(FILES[0], explicit=True) self.assertEqual(self.player.song, FILES[0]) def test_goto_unknown(self): self.assertTrue(self.player.paused) self.player.go_to(UNKNOWN_FILE, True) self.assertIs(self.player.song, UNKNOWN_FILE) self.assertTrue(self.player.paused) self.player.go_to(None) self.assertIs(self.player.song, None) def test_reset(self): self.player.go_to(None) self.player.reset() self.assertEqual(self.player.song, FILES[0]) self.player.next() self.player.reset() self.assertEqual(self.player.song, FILES[0]) def test_equalizer(self): self.player.eq_bands self.player.eq_values self.player.eq_values = [1, 2, 3, 4] self.player.next() def test_unpause_while_no_song(self): self.assertTrue(self.player.paused) self.player.go_to(None) self.player.paused = False self.player.next() self.assertTrue(self.signals, ["unpaused"]) self.player.go_to(None) self.assertTrue(self.signals, ["unpaused", "paused"]) def test_replaygain(self): self.player.replaygain_profiles[0] = "track" self.player.next() config.set("player", "replaygain", True) self.assertEqual(self.player.calc_replaygain_volume(1.0), 1.0) config.set("player", "fallback_gain", -5.0) self.assertAlmostEqual( self.player.calc_replaygain_volume(1.0), 0.562, 3) config.set("player", "pre_amp_gain", 10.0) self.assertEqual(self.player.calc_replaygain_volume(1.0), 1.0) def test_seekable(self): self.assertFalse(self.player.seekable) self.player.next() self.assertTrue(self.player.seekable) calls = [] def on_change(*args): calls.append(args) self.player.connect("notify::seekable", on_change) self.player.go_to(None) self.assertTrue(calls) self.assertFalse(self.player.seekable) def test_mute(self): self.assertFalse(self.player.mute) self.player.next() self.assertFalse(self.player.mute) # backend don't have to support it, but shouldn't fail on set/get self.player.mute = not self.player.mute def test_preserve_volume(self): self.player.next() self.player.volume = 0.5 self.player.next() self.assertEqual(self.player.volume, 0.5) class TNullPlayer(TPlayer, TPlayerMixin): NAME = "nullbe" def test_previous_seek(self): self.player.next() self.player.next() self.assertEqual(self.player.song, FILES[1]) self.player.seek(10000) self.assertEqual(self.player.get_position(), 10000) self.player.previous() self.assertEqual(self.player.get_position(), 0) self.assertEqual(self.player.song, FILES[1]) def test_previous_force(self): self.player.next() self.player.next() self.assertEqual(self.player.song, FILES[1]) self.player.seek(10000) self.assertEqual(self.player.get_position(), 10000) self.player.previous(force=True) self.assertEqual(self.player.get_position(), 0) self.assertEqual(self.player.song, FILES[0]) def test_previous_skip(self): self.player.next() self.player.next() self.assertEqual(self.player.song, FILES[1]) self.player.seek(10) self.assertEqual(self.player.get_position(), 10) self.player.previous() self.assertEqual(self.player.get_position(), 0) self.assertEqual(self.player.song, FILES[0]) def test_stop(self): self.player.next() self.player.seek(10000) self.assertEqual(self.player.get_position(), 10000) self.player.stop() self.assertEqual(self.player.get_position(), 0) def test_can_play_uri_null(self): self.assertTrue(self.player.can_play_uri("")) self.assertTrue(self.player.can_play_uri("file://")) self.assertTrue(self.player.can_play_uri("fake://")) has_xine = True try: player.init_backend("xinebe") except player.PlayerError: has_xine = False @skipUnless(has_xine, "couldn't load/test xinebe") class TXinePlayer(TPlayer, TPlayerMixin): NAME = "xinebe" def test_can_play_uri_xine(self): self.assertFalse(self.player.can_play_uri("")) self.assertTrue(self.player.can_play_uri("file://")) self.assertFalse(self.player.can_play_uri("fake://")) has_gstbe = True try: player.init_backend("gstbe") except player.PlayerError: has_gstbe = False @skipUnless(has_gstbe, "couldn't load/test gstbe") class TGstPlayer(TPlayer, TPlayerMixin): NAME = "gstbe" def test_can_play_uri_gst(self): self.assertFalse(self.player.can_play_uri("")) self.assertTrue(self.player.can_play_uri("file://")) self.assertFalse(self.player.can_play_uri("fake://")) class TVolume(TestCase): def setUp(self): self.p = NullPlayer() self.v = Volume(self.p) def test_setget(self): for i in [0.0, 1.2, 0.24, 1.0, 0.9]: self.v.set_value(i) self.failUnlessAlmostEqual(self.p.volume, self.v.get_value() ** 3) def test_add(self): self.v.set_value(0.5) self.v += 0.1 self.failUnlessAlmostEqual(self.p.volume, 0.6 ** 3) def test_sub(self): self.v.set_value(0.5) self.v -= 0.1 self.failUnlessAlmostEqual(self.p.volume, 0.4 ** 3) def test_add_boundry(self): self.v.set_value(0.95) self.v += 0.1 self.failUnlessAlmostEqual(self.p.volume, 1.0) def test_sub_boundry(self): self.v.set_value(0.05) self.v -= 0.1 self.failUnlessAlmostEqual(self.p.volume, 0.0) def tearDown(self): self.p.destroy() self.v.destroy() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats___init__.py������������������������������������������������������0000644�0001750�0001750�00000016526�13112005742�022014� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys from senf import fsnative from tests import TestCase, get_data_path from .helper import capture_output from quodlibet import formats from quodlibet.formats import AudioFile, load_audio_files, dump_audio_files, \ SerializationError from quodlibet.compat import PY3, long from quodlibet.util.picklehelper import pickle_dumps from quodlibet import config class TFormats(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_presence(self): self.failUnless(formats.aac) self.failUnless(formats.aiff) self.failUnless(formats.midi) self.failUnless(formats.mod) self.failUnless(formats.monkeysaudio) self.failUnless(formats.mp3) self.failUnless(formats.mp4) self.failUnless(formats.mpc) self.failUnless(formats.spc) self.failUnless(formats.trueaudio) self.failUnless(formats.vgm) self.failUnless(formats.wav) self.failUnless(formats.wavpack) self.failUnless(formats.wma) self.failUnless(formats.xiph) def test_loaders(self): self.failUnless(formats.loaders[".mp3"] is formats.mp3.MP3File) def test_migration(self): self.failUnless(formats.mp3 is sys.modules["quodlibet.formats.mp3"]) self.failUnless(formats.mp3 is sys.modules["quodlibet/formats/mp3"]) self.failUnless(formats.mp3 is sys.modules["formats.mp3"]) self.failUnless(formats.xiph is sys.modules["formats.flac"]) self.failUnless(formats.xiph is sys.modules["formats.oggvorbis"]) def test_filter(self): self.assertTrue(formats.filter("foo.mp3")) self.assertFalse(formats.filter("foo.doc")) self.assertFalse(formats.filter("foomp3")) def test_music_file(self): path = get_data_path('silence-44-s.mp3') self.assertTrue(formats.MusicFile(path)) # non existing with capture_output() as (stdout, stderr): song = formats.MusicFile(get_data_path("nope.mp3")) self.assertFalse(song) self.assertTrue(stderr.getvalue()) # unknown extension with capture_output() as (stdout, stderr): song = formats.MusicFile(get_data_path("nope.xxx")) self.assertFalse(song) self.assertFalse(stderr.getvalue()) class TPickle(TestCase): def setUp(self): types = formats.types instances = [] for t in types: i = AudioFile.__new__(t) # we want to pickle/unpickle everything, since historically # these things ended up in the file dict.__init__( i, {b"foo": u"bar", u"quux": b"baz", "a": "b", u"b": 42, "c": 0.25}) instances.append(i) self.instances = instances def test_load_audio_files(self): for protocol in [0, 1, 2]: data = pickle_dumps(self.instances, protocol) items = load_audio_files(data) assert len(items) == len(formats.types) assert all(isinstance(i, AudioFile) for i in items) def test_sanitized_py3(self): i = AudioFile.__new__(list(formats.types)[0]) # this is something that old py2 versions could pickle dict.__init__(i, { b"bytes": b"bytes", u"unicode": u"unicode", b"~filename": b"somefile", u"~mountpoint": u"somemount", u"int": 42, b"float": 1.25, }) data = pickle_dumps([i], 1) items = load_audio_files(data, process=True) i = items[0] if not PY3: return assert i["bytes"] == "bytes" assert i["unicode"] == "unicode" assert isinstance(i["~filename"], fsnative) assert isinstance(i["~mountpoint"], fsnative) assert i["int"] == 42 assert i["float"] == 1.25 def test_sanitize_py2_normal(self): if PY3: return af = AudioFile({ b"foo": u"bar", u"öäü": u"bla", "~#num": 1, "~#num2": long(2), "~#num3": 1.25, "~filename": fsnative(u"filename"), "~mountpoint": fsnative(u"mount"), "~somethingdifferent": u"hello", }) data = dump_audio_files([af]) new = load_audio_files(data) assert dict(new[0]) == dict(af) def test_sanitize_py2_fixup(self): if PY3: return old = dict.__new__(AudioFile) dict.__init__(old, { b"foo": b"bar", u"öäü": b"bla", "~#num": u"1", "~#num2": u"1.25", "~#num3": u"bla", "~filename": u"text", "~mountpoint": b"bytes", "~somethingdifferent": b"hello", }) fixed = { b"foo": u"bar", u"öäü": u"bla", "~#num": 1, "~#num2": 1.25, "~#num3": 0, "~filename": fsnative(u"text"), "~mountpoint": fsnative(u"bytes"), "~somethingdifferent": u"hello", } data = dump_audio_files([old]) new = load_audio_files(data) assert dict(new[0]) == fixed for v1, v2 in zip(sorted(new[0].values()), sorted(fixed.values())): assert type(v1) is type(v2) def test_dump_audio_files(self): data = dump_audio_files(self.instances, process=False) items = load_audio_files(data, process=False) assert len(items) == len(self.instances) for a, b in zip(items, self.instances): a = dict(a) b = dict(b) for key in a: assert b[key] == a[key] for key in b: assert b[key] == a[key] def test_save_ascii_keys_as_bytes_on_py3(self): i = AudioFile.__new__(list(formats.types)[0]) dict.__setitem__(i, u"foo", u"bar") data = dump_audio_files([i], process=True) if PY3: items = load_audio_files(data, process=False) assert isinstance(list(items[0].keys())[0], bytes) def test_dump_empty(self): data = dump_audio_files([]) assert load_audio_files(data) == [] def test_load_audio_files_missing_class(self): for protocol in [0, 1, 2]: data = pickle_dumps(self.instances, protocol) items = load_audio_files(data) self.assertEqual(len(items), len(formats.types)) assert all(isinstance(i, AudioFile) for i in items) broken = data.replace(b"SPCFile", b"FooFile") items = load_audio_files(broken) self.assertEqual(len(items), len(formats.types) - 1) assert all(isinstance(i, AudioFile) for i in items) broken = data.replace(b"formats.spc", b"formats.foo") items = load_audio_files(broken) self.assertEqual(len(items), len(formats.types) - 1) assert all(isinstance(i, AudioFile) for i in items) def test_unpickle_random_class(self): for protocol in [0, 1, 2]: data = pickle_dumps([42], protocol) with self.assertRaises(SerializationError): load_audio_files(data) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_browsers_paned.py��������������������������������������������������������0000644�0001750�0001750�00000041701�13112005742�021530� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from .helper import realized from gi.repository import Gtk from senf import fsnative from quodlibet import config from quodlibet.browsers.paned import PanedBrowser from quodlibet.browsers.paned.util import PaneConfig from quodlibet.browsers.paned.util import get_headers from quodlibet.browsers.paned.models import AllEntry, UnknownEntry, SongsEntry from quodlibet.browsers.paned.models import PaneModel from quodlibet.browsers.paned.prefs import PatternEditor, Preferences from quodlibet.browsers.paned.prefs import PreferencesButton from quodlibet.browsers.paned.pane import Pane from quodlibet.formats import AudioFile from quodlibet.util.collection import Collection from quodlibet.library import SongLibrary, SongLibrarian SONGS = [ AudioFile({ "title": "three", "artist": "boris", "genre": "Rock", "~filename": fsnative(u"/bin/ls"), "foo": "bar"}), AudioFile({ "title": "two", "artist": "mu", "genre": "Rock", "~filename": fsnative(u"/dev/zero"), "foo": "bar"}), AudioFile({ "title": "four", "artist": "piman", "genre": "J-Pop", "~filename": fsnative(u"/dev/null"), "foo": "bar\nquux"}), AudioFile({ "title": "one", "artist": "piman", "genre": "J-Pop", "~filename": fsnative(u"/bin/foo"), "foo": "bar\nnope"}), AudioFile({ "title": "xxx", "~filename": fsnative(u"/bin/bar"), "foo": "bar"}), ] UNKNOWN_ARTIST = AudioFile(dict(SONGS[0])) del UNKNOWN_ARTIST["artist"] ALBUM = Collection() ALBUM.songs = SONGS class TPanedBrowser(TestCase): Bar = PanedBrowser def setUp(self): config.init() config.set("browsers", "panes", "artist") library = SongLibrary() library.librarian = SongLibrarian() PanedBrowser.init(library) for af in SONGS: af.sanitize() library.add(SONGS) self.bar = self.Bar(library) self.last = None self.emit_count = 0 def selected_cb(browser, songs, *args): self.last = list(songs) self.emit_count += 1 self.bar.connect("songs-selected", selected_cb) def _wait(self): while Gtk.events_pending(): Gtk.main_iteration() def test_get_set_headers(self): config.set("browsers", "panes", "~people album") self.assertEqual(get_headers(), ["~people", "album"]) def test_pack(self): to_pack = Gtk.Button() container = self.bar.pack(to_pack) self.bar.unpack(container, to_pack) def test_can_filter(self): for key in ["foo", "title", "fake~key", "~woobar", "~#huh"]: self.failIf(self.bar.can_filter_tag(key)) self.failUnless(self.bar.can_filter("artist")) self.failUnless(self.bar.can_filter_text()) def test_filter_text(self): self.bar.finalize(False) self.bar.filter_text("artist=nope") self._wait() self.failUnlessEqual(set(self.last), set()) self.bar.filter_text("artist=!boris") self._wait() self.failUnlessEqual(set(self.last), set(SONGS[1:])) def test_filter_value(self): self.bar.finalize(False) expected = [SONGS[0]] self.bar.filter("artist", ["boris"]) self._wait() self.failUnlessEqual(self.last, expected) def test_filter_notvalue(self): self.bar.finalize(False) expected = SONGS[1:4] self.bar.filter("artist", ["notvalue", "mu", "piman"]) self._wait() self.failUnlessEqual(set(self.last), set(expected)) def test_restore(self): config.set("browsers", "query_text", "foo") self.bar.restore() self.failUnlessEqual(self.bar._get_text(), "foo") self.bar.finalize(True) self._wait() self.failUnlessEqual(self.emit_count, 0) def test_numeric_config_search(self): config.set("browsers", "panes", "~#track") self.bar.refresh_panes() self.bar.filter_text("foobar") def test_restore_entry_text(self): self.bar.filter_text("foobar") self.bar.save() self.bar._set_text("nope") self.bar.restore() self.failUnlessEqual(self.bar._get_text(), "foobar") self._wait() self.failUnlessEqual(self.emit_count, 1) def test_restore_selection(self): self.bar.finalize(False) self.bar.filter("artist", [u"piman"]) self.bar.save() self.bar.unfilter() self.bar.restore() self.bar.activate() self._wait() for song in self.last: self.assertTrue(u"piman" in song.list("artist")) def test_set_all_panes(self): self.bar.finalize(False) self.bar.set_all_panes() def test_restore_pane_width(self): config.set("browsers", "panes", "artist\talbum") self.bar.set_all_panes() paned = self.bar.multi_paned.get_paned() paned.set_relative(0.8) self.bar.set_all_panes() self.failUnlessAlmostEqual(paned.get_relative(), 0.8) def test_make_pane_widths_equal(self): config.set("browsers", "panes", "artist\talbum\t~year\t~#track") self.bar.set_all_panes() self.bar.make_pane_widths_equal() paneds = self.bar.multi_paned._get_paneds() self.failUnlessAlmostEqual(paneds[0].get_relative(), 1.0 / 4.0) self.failUnlessAlmostEqual(paneds[1].get_relative(), 1.0 / 3.0) self.failUnlessAlmostEqual(paneds[2].get_relative(), 1.0 / 2.0) def test_wide_mode(self): self.bar.set_all_wide_mode(True) self.bar.set_all_wide_mode(False) def tearDown(self): self.bar.destroy() config.quit() class TPaneConfig(TestCase): def test_tag(self): p = PaneConfig("title") self.failUnlessEqual(p.title, "Title") self.failUnlessEqual(p.tags, {"title"}) self.failUnlessEqual(p.format(SONGS[0]), [("three", "three")]) self.failUnless(str(len(ALBUM.songs)) in p.format_display(ALBUM)) self.failIf(p.has_markup) def test_numeric(self): p = PaneConfig("~#lastplayed") self.failUnlessEqual(p.title, "Last Played") self.failUnlessEqual(p.tags, {"~#lastplayed"}) self.failUnlessEqual(p.format(SONGS[0]), [("0", "0")]) self.failIf(p.has_markup) def test_tied(self): p = PaneConfig("~title~artist") self.failUnlessEqual(p.title, "Title / Artist") self.failUnlessEqual(p.tags, {"title", "artist"}) self.failUnlessEqual(p.format(SONGS[0]), [("three", "three"), ("boris", "boris")]) self.failIf(p.has_markup) def test_pattern(self): p = PaneConfig("<foo>") self.failUnlessEqual(p.title, "Foo") self.failUnlessEqual(p.tags, {"foo"}) self.failUnless(p.has_markup) def test_condition(self): p = PaneConfig("<foo|a <bar>|quux>") self.failUnlessEqual(p.title, "a Bar") self.failUnlessEqual(p.tags, {"bar"}) self.failUnless(p.has_markup) def test_group(self): p = PaneConfig("a\:b:<title>") self.failUnlessEqual(p.title, "A:B") self.failUnlessEqual(set(p.format_display(ALBUM).split(", ")), {"one", "two", "three", "four", "xxx"}) p = PaneConfig("foo:~#lastplayed") self.failUnlessEqual(p.format_display(ALBUM), "0") p = PaneConfig("foo:title") self.failUnlessEqual(set(p.format_display(ALBUM).split(", ")), {"one", "two", "three", "four", "xxx"}) class TPaneEntry(TestCase): def test_all_have(self): sel = SongsEntry("foo", "foo", SONGS) self.assertFalse(sel.all_have("artist", "one")) self.assertFalse(sel.all_have("~#mtime", 4)) self.assertTrue(sel.all_have("foo", "bar")) def test_all(self): entry = AllEntry() conf = PaneConfig("title:artist") self.assertFalse(entry.get_count_text(conf)) entry.get_text(conf) self.assertEqual(list(entry.songs), []) self.assertFalse(entry.contains_text("")) repr(entry) def test_unknown(self): entry = UnknownEntry(SONGS) conf = PaneConfig("title:artist") self.assertEqual(entry.songs, set(SONGS)) self.assertEqual(entry.key, "") self.assertFalse(entry.contains_text("")) self.assertTrue(SONGS[0]("artist") in entry.get_count_text(conf)) entry.get_text(conf) repr(entry) def test_songs(self): entry = SongsEntry("key", "key", SONGS) self.assertEqual(entry.key, "key") conf = PaneConfig("title:artist") self.assertTrue("boris" in entry.get_count_text(conf)) self.assertEqual(entry.get_text(conf), (False, "key")) self.assertTrue(entry.contains_text("key")) repr(entry) def test_songs_markup(self): entry = SongsEntry("key", "key", SONGS) conf = PaneConfig("<title>") self.assertEqual(entry.get_text(conf), (True, "key")) class TPane(TestCase): def setUp(self): config.init() lib = SongLibrary() self.pane = Pane(lib, "artist") def tearDown(self): self.pane.destroy() del self.pane config.quit() def test_init(self): repr(self.pane) self.assertEqual(self.pane.tags, {"artist"}) def test_add_remove_and_show(self): with realized(self.pane): self.pane.add(SONGS) with realized(self.pane): self.pane.remove(SONGS) self.assertFalse(self.pane.list("arist")) def test_matches(self): self.assertTrue(self.pane.matches(SONGS[0])) self.pane.fill(SONGS) selection = self.pane.get_selection() selection.unselect_all() selection.select_path(Gtk.TreePath(3)) self.assertFalse(self.pane.matches(SONGS[1])) def test_fill(self): self.pane.fill(SONGS) def test_fill_selection(self): self.pane.fill(SONGS) model, paths = self.pane.get_selection().get_selected_rows() self.assertEqual(len(paths), 1) self.assertEqual(paths[0], Gtk.TreePath((0,))) def test_set_selected(self): self.pane.fill(SONGS) self.pane.set_selected([]) self.assertEqual(self.pane.get_selected(), {None}) self.pane.set_selected([], force_any=False) self.assertEqual(self.pane.get_selected(), set()) keys = self.pane.list("artist") self.pane.set_selected(keys) self.assertEqual(self.pane.get_selected(), keys) def test_restore_string(self): self.pane.fill(SONGS) keys = self.pane.list("artist") self.pane.set_selected(keys) to_restore = self.pane.get_restore_string() self.pane.remove(SONGS) self.pane.parse_restore_string(to_restore) self.pane.fill(SONGS) self.assertEqual(self.pane.get_selected(), keys) class TMultiPane(TestCase): def setUp(self): config.init() lib = SongLibrary() self.p2 = Pane(lib, "artist", self) self.p1 = Pane(lib, "genre", self.p2) self.last = None self.count = 0 def fill(self, songs): # this class is the final pane self.last = songs self.count += 1 def test_inhibit(self): self.p2.inhibit() self.p1.fill(SONGS) self.p2.uninhibit() self.assertEqual(self.count, 0) def test_pipe_through(self): self.p1.fill(SONGS) self.assertEqual(self.last, set(SONGS)) self.assertEqual(self.count, 1) def test_filter_first(self): VALUE = "J-Pop" self.p1.fill(SONGS) keys = self.p1.list("genre") self.assertTrue(VALUE in keys) self.p1.set_selected([VALUE], force_any=False) self.assertTrue(self.last) for song in self.last: self.assertEqual(song("genre"), VALUE) self.assertEqual(self.count, 2) def tearDown(self): self.p1.destroy() self.p2.destroy() del self.p1 del self.p2 config.quit() class TPaneModel(TestCase): def _verify_model(self, model): if len(model) == 1: self.assertFalse(isinstance(model[0][0], AllEntry)) elif len(model) > 1: self.assertTrue(isinstance(model[0][0], AllEntry)) for row in list(model)[1:-1]: self.assertTrue(isinstance(row[0], SongsEntry)) self.assertTrue( isinstance(model[-1][0], (SongsEntry, UnknownEntry))) def test_add_songs(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs(SONGS) self.assertTrue(isinstance(m[0][0], AllEntry)) self.assertTrue(isinstance(m[-1][0], UnknownEntry)) self.assertEqual(len(m), len(SONGS) + 1 - 1) m.add_songs([]) self._verify_model(m) m2 = PaneModel(conf) for song in SONGS: m2.add_songs([song]) self._verify_model(m) self.assertEqual(len(m), len(m2)) for e1, e2 in zip(m.itervalues(), m2.itervalues()): self.assertEqual(e1.key, e2.key) m3 = PaneModel(conf) for song in reversed(SONGS): m3.add_songs([song]) self._verify_model(m) self.assertEqual(len(m), len(m3)) for e1, e2 in zip(m.itervalues(), m3.itervalues()): self.assertEqual(e1.key, e2.key) def test_add_unknown_first(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs([UNKNOWN_ARTIST]) self._verify_model(m) m.add_songs(SONGS) self._verify_model(m) def test_add_songs_double(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs(SONGS) self._verify_model(m) m.add_songs(SONGS) self._verify_model(m) self.assertEqual(len(m), len(SONGS) + 1 - 1) def test_get_songs(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs(SONGS) # get none self.assertEqual(m.get_songs([]), set()) # get all self.assertEqual(len(m.get_songs([0])), len(SONGS)) self.assertEqual(len(m.get_songs([0, 1])), len(SONGS)) # get one self.assertEqual(m.get_songs([1]), {SONGS[0]}) def test_get_keys_by_tag(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs(SONGS) self.assertEqual(m.get_keys_by_tag("title", ["three"]), ["boris"]) self.assertEqual(m.get_keys_by_tag("nope", ["foo", ""]), [""]) self.assertEqual( m.get_keys_by_tag("artist", ["piman", "foo"]), ["piman"]) def test_list(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs(SONGS) self.assertEqual(m.list("artist"), {"boris", "mu", "piman", ""}) conf = PaneConfig("<artist><foo>") m = PaneModel(conf) m.add_songs(SONGS) self.assertEqual(m.list("artist"), {"boris", "mu", "piman"}) self.assertEqual(set(m.list("foo")), {'nope', 'bar', 'quux'}) def test_get_keys(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs(SONGS) self.assertFalse(m.get_keys([])) self.assertEqual(m.get_keys([0, 1]), {None, "boris"}) def test_remove_songs_keep_rows(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs(SONGS) length = len(m) m.remove_songs(SONGS, False) self._verify_model(m) self.assertEqual(length, len(m)) self.assertFalse(m.get_songs([r.path for r in m])) def test_remove_songs_remove_rows(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs(SONGS) length = len(m) m.remove_songs(SONGS, True) self._verify_model(m) self.assertNotEqual(length, len(m)) self.assertEqual(len(m), 0) def test_remove_steps(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs(SONGS) for song in SONGS: m.remove_songs([song], True) self._verify_model(m) def test_matches(self): conf = PaneConfig("artist") m = PaneModel(conf) m.add_songs(SONGS) self.assertFalse(m.matches([], SONGS[0])) self.assertTrue(m.matches([0], SONGS[0])) self.assertTrue(m.matches([1], SONGS[0])) self.assertFalse(m.matches([2], SONGS[0])) m.add_songs([UNKNOWN_ARTIST]) self._verify_model(m) self.assertTrue(m.matches([len(m) - 1], UNKNOWN_ARTIST)) class TPanedPreferences(TestCase): def setUp(self): config.init() def tearDown(self): config.quit() def test_editor(self): x = PatternEditor() x.headers = x.headers x.destroy() x.destroy() def test_button(self): PreferencesButton(None).destroy() def test_dialog(self): Preferences(None).destroy() ���������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_about.py������������������������������������������������������������0000644�0001750�0001750�00000001027�13112005742�020655� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import app from quodlibet.qltk.about import AboutDialog from tests import TestCase, init_fake_app, destroy_fake_app class TAboutDialog(TestCase): def setUp(self): init_fake_app() def tearDown(self): destroy_fake_app() def test_ctr(self): AboutDialog(None, app).destroy() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_browsers_audiofeeds.py���������������������������������������������������0000644�0001750�0001750�00000002306�13112005742�022547� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from gi.repository import Gtk from quodlibet.browsers.audiofeeds import AudioFeeds, AddFeedDialog from quodlibet.library import SongLibrary import quodlibet.config TEST_URL = u"https://a@b:foo.example.com?bar=baz&quxx#anchor" class TAudioFeeds(TestCase): def setUp(self): quodlibet.config.init() self.library = SongLibrary() self.bar = AudioFeeds(self.library) def test_can_filter(self): for key in ["foo", "title", "fake~key", "~woobar", "~#huh"]: self.failIf(self.bar.can_filter(key)) def tearDown(self): self.bar.destroy() self.library.destroy() quodlibet.config.quit() class TAddFeedDialog(TestCase): def setUp(self): quodlibet.config.init() def test_add_feed_takes_uri(self): parent = Gtk.Window() ret = AddFeedDialog(parent).run(text=TEST_URL, test=True) self.failUnlessEqual(ret.uri, TEST_URL) def tearDown(self): quodlibet.config.quit() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_dprint.py�����������������������������������������������������������0000644�0001750�0001750�00000001243�13112005742�021045� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from .helper import capture_output from quodlibet.util.dprint import print_e class Tdprint(TestCase): def test_basics(self): with capture_output() as (stdout, stderr): print_e(u"foo") assert u"foo" in stderr.getvalue() def test_any_object(self): with capture_output() as (stdout, stderr): print_e(42) assert u"42" in stderr.getvalue() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_desktop_files.py���������������������������������������������������������0000644�0001750�0001750�00000003330�13112005742�021342� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import subprocess from tests import TestCase, mkstemp from quodlibet import util QLDATA_DIR = os.path.join(os.path.dirname(util.get_module_dir()), "data") class _TDesktopFileMixin(object): PATH = None def test_filename(self): self.assertTrue(self.PATH.endswith(".desktop.in")) def test_validate(self): with open(self.PATH, "rb") as template: desktop_data = template.read() # copy to a temp file and strip "_ from translatable entries fd, name = mkstemp(suffix=".desktop") os.close(fd) with open(name, "wb") as temp: new_lines = [] for l in desktop_data.splitlines(): if l.startswith(b"_"): l = l[1:] new_lines.append(l) temp.write(b"\n".join(new_lines)) # pass to desktop-file-validate try: output = subprocess.check_output( ["desktop-file-validate", name], stderr=subprocess.STDOUT) except OSError: # desktop-file-validate not available return except subprocess.CalledProcessError as e: output = e.output finally: os.remove(name) if output: raise Exception(output) class TQLDesktopFile(TestCase, _TDesktopFileMixin): PATH = os.path.join(QLDATA_DIR, "quodlibet.desktop.in") class TEFDesktopFile(TestCase, _TDesktopFileMixin): PATH = os.path.join(QLDATA_DIR, "exfalso.desktop.in") ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_playorder.py��������������������������������������������������������0000644�0001750�0001750�00000006777�13112005742�021565� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import quodlibet.config import quodlibet.plugins from quodlibet.qltk import Icons from quodlibet.qltk.playorder import OrderShuffle, OrderWeighted, \ ToggledPlayOrderMenu, Orders, Order, OrderInOrder from quodlibet.qltk.playorder import PlayOrderWidget from tests import TestCase class TPlayOrderWidget(TestCase): def setUp(self): quodlibet.config.init() self.order = None self.volume = 0 self.replaygain_profiles = [None, None, None] self.reset_replaygain = lambda: None self.po = PlayOrderWidget(self, self) def tearDown(self): self.po.destroy() # quodlibet.plugins.quit() quodlibet.config.quit() def test_initial(self): self.failIf(self.po.repeated) self.failIf(self.po.shuffled) self.failUnless(isinstance(self.po.order, OrderInOrder)) self.failUnless(self.replaygain_profiles[2], ["album", "track"]) def test_replay_gain(self): self.po.shuffled = True self.po.shuffler = OrderWeighted self.failUnlessEqual(self.replaygain_profiles[2], ["track"]) self.po.shuffled = False self.failUnlessEqual(self.replaygain_profiles[2], ["album", "track"]) def test_get_name(self): orders = [OrderShuffle, OrderWeighted] for order in orders: self.po.shuffler = order self.failUnlessEqual(self.po.shuffler, order) def test_shuffle(self): self.failIf(self.po.repeated) self.po.shuffled = True self.assertTrue(self.po.shuffled) self.assertEqual(self.po.shuffler, OrderShuffle) self.failUnless(isinstance(self.order, OrderShuffle)) def test_shuffle_defaults_to_inorder(self): self.po.shuffler = OrderWeighted self.po.shuffled = False self.failUnlessEqual(type(self.po.order), OrderInOrder) self.po.shuffled = True self.assertEqual(self.po.shuffler, OrderWeighted) self.failUnlessEqual(type(self.po.order), OrderWeighted) class FakeOrder(Order): name = "fake" class TToggledPlayOrderMenu(TestCase): def setUp(self): self.orders = Orders([OrderShuffle, OrderWeighted, FakeOrder]) self.tpom = ToggledPlayOrderMenu(Icons.AUDIO_X_GENERIC, orders=self.orders, current_order=OrderShuffle, enabled=True) def tearDown(self): self.tpom.destroy() def test_enabled_initially(self): self.failUnless(self.tpom.enabled) def test_setting_enabled(self): self.tpom.enabled = False self.failIf(self.tpom.enabled) self.tpom.enabled = True self.failUnless(self.tpom.enabled) def test_initial(self): self.failUnlessEqual(self.tpom.current, OrderShuffle) def test_unknown_name(self): self.assertRaises(ValueError, self.tpom.set_active_by_name, "foobar") def test_set_by_name(self): self.tpom.set_active_by_name("fake") self.failUnlessEqual(self.tpom.current.name, "fake") def test_get_name(self): for order in self.orders: self.tpom.current = order self.failUnlessEqual(self.tpom.current, order) def test_set_orders(self): self.tpom.set_orders([]) self.failIf(self.tpom.current) �quodlibet-3.9.1/tests/test_formats__id3.py����������������������������������������������������������0000644�0001750�0001750�00000057702�13113466317�021106� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, get_data_path import os from quodlibet import const from quodlibet.formats._image import EmbeddedImage from quodlibet.formats.mp3 import MP3File from quodlibet.formats.aiff import AIFFFile from quodlibet.compat import cBytesIO import mutagen from .helper import get_temp_copy class TID3ImagesBase(TestCase): KIND = None PATH = None def setUp(self): self.filename = get_temp_copy(self.PATH) def tearDown(self): os.remove(self.filename) class TID3ImagesMixin(object): def test_can_change_images(self): self.failUnless(self.KIND(self.filename).can_change_images) def test_get_primary_image(self): self.failIf(self.KIND(self.filename).has_images) f = mutagen.File(self.filename) apic = mutagen.id3.APIC(encoding=3, mime="image/jpeg", type=4, desc="foo", data=b"bar") f.tags.add(apic) f.save() song = self.KIND(self.filename) self.failUnless(song.has_images) image = song.get_primary_image() self.assertEqual(image.mime_type, "image/jpeg") fn = image.file self.failUnlessEqual(fn.read(), b"bar") apic = mutagen.id3.APIC(encoding=3, mime="image/jpeg", type=3, desc="xx", data=b"bar2") f.tags.add(apic) f.save() song = self.KIND(self.filename) self.failUnless(song.has_images) image = song.get_primary_image() self.failUnlessEqual(image.read(), b"bar2") # get_images() images = song.get_images() self.assertTrue(images and len(images) == 2) self.assertEqual(images[0].type, 3) self.assertEqual(images[1].type, 4) def test_clear_images(self): f = mutagen.File(self.filename) apic = mutagen.id3.APIC(encoding=3, mime="image/jpeg", type=4, desc="foo", data=b"bar") f.tags.add(apic) f.save() song = self.KIND(self.filename) self.failUnless(song.has_images) song.clear_images() song = self.KIND(self.filename) self.assertFalse(song.has_images) def test_set_image(self): fileobj = cBytesIO(b"foo") image = EmbeddedImage(fileobj, "image/jpeg", 10, 10, 8) song = self.KIND(self.filename) self.failIf(song.has_images) song.set_image(image) self.assertTrue(song.has_images) song = self.KIND(self.filename) self.assertTrue(song.has_images) self.assertEqual(song.get_primary_image().mime_type, "image/jpeg") def test_set_image_no_tag(self): f = mutagen.File(self.filename) f.delete() song = self.KIND(self.filename) fileobj = cBytesIO(b"foo") image = EmbeddedImage(fileobj, "image/jpeg", 10, 10, 8) song.set_image(image) song = self.KIND(self.filename) self.assertTrue(song.has_images) class TID3ImagesMP3(TID3ImagesBase, TID3ImagesMixin): KIND = MP3File PATH = get_data_path('silence-44-s.mp3') class TID3ImagesAIFF(TID3ImagesBase, TID3ImagesMixin): KIND = AIFFFile PATH = get_data_path('test.aiff') class TID3FileBase(TestCase): KIND = None PATH = None def setUp(self): self.filename = get_temp_copy(self.PATH) def tearDown(self): os.unlink(self.filename) class TID3FileMixin(object): def test_optional_POPM_count(self): # https://github.com/quodlibet/quodlibet/issues/364 f = mutagen.File(self.filename) f.tags.add(mutagen.id3.POPM(const.EMAIL, 42)) try: f.save() except TypeError: # https://github.com/quodlibet/quodlibet/issues/33 pass else: self.KIND(self.filename) def test_TXXX_DATE(self): # https://github.com/quodlibet/quodlibet/issues/220 f = mutagen.File(self.filename) f.tags.add(mutagen.id3.TXXX(encoding=3, desc=u'DATE', text=u'2010-01-13')) f.tags.add(mutagen.id3.TDRC(encoding=3, text=u'2010-01-14')) f.save() self.assertEquals(self.KIND(self.filename)['date'], '2010-01-14') f.tags.delall('TDRC') f.save() self.assertEquals(self.KIND(self.filename)['date'], '2010-01-13') f.delete() self.KIND(self.filename) def test_USLT(self): """Tests reading and writing of lyrics in USLT""" f = mutagen.File(self.filename) f.tags.add(mutagen.id3.USLT(encoding=3, desc=u'', lang='\x00\x00\x00', text=u'lyrics')) f.tags.add(mutagen.id3.USLT(encoding=3, desc=u'desc', lang='\x00\x00\x00', text=u'lyrics with non-empty desc')) f.tags.add(mutagen.id3.USLT(encoding=3, desc=u'', lang='xyz', text=u'lyrics with non-empty lang')) f.save() f = self.KIND(self.filename) self.failUnlessEqual(f['lyrics'], u'lyrics') f['lyrics'] = u'modified lyrics' f.write() f = mutagen.File(self.filename) self.failUnlessEqual(f.tags[u'USLT::\x00\x00\x00'], u'modified lyrics') self.failUnlessEqual(f.tags[u'USLT:desc:\x00\x00\x00'], u'lyrics with non-empty desc') self.failUnlessEqual(f.tags[u'USLT::xyz'], u'lyrics with non-empty lang') f = self.KIND(self.filename) self.failUnlessEqual(f['lyrics'], u'modified lyrics') del f['lyrics'] f.write() f = mutagen.File(self.filename) self.failIf('USLT' in f.tags, 'There should be no USLT tag when lyrics were deleted') self.failUnlessEqual(f.tags[u'USLT:desc:\x00\x00\x00'], u'lyrics with non-empty desc') self.failUnlessEqual(f.tags[u'USLT::xyz'], u'lyrics with non-empty lang') f = self.KIND(self.filename) self.failIf('lyrics' in f, 'There should be no lyrics key when there is no USLT') def test_lang_read(self): """Tests reading of language from TXXX""" # https://github.com/quodlibet/quodlibet/issues/439 f = mutagen.File(self.filename) try: lang = u'free-text' f.tags.add( mutagen.id3.TXXX(encoding=3, desc=u'QuodLibet::language', text=lang)) f.save() self.assertEquals(self.KIND(self.filename)['language'], lang) finally: f.delete() def test_lang_read_TLAN(self): """Tests reading language from TLAN""" f = mutagen.File(self.filename) lang = u'eng' try: f.tags.add(mutagen.id3.TLAN(encoding=3, text=lang)) f.save() self.assertEquals(self.KIND(self.filename)['language'], lang) finally: f.delete() def test_lang_read_multiple_TLAN(self): """Tests reading multiple language from TLAN""" f = mutagen.File(self.filename) # Include an invalid one; current behaviour is to load anyway lang = u'eng\0der\0fra\0fooooo' exp = u'eng\nder\nfra\nfooooo' try: f.tags.add(mutagen.id3.TLAN(encoding=3, text=lang)) f.save() self.assertEquals(self.KIND(self.filename)['language'], exp) finally: f.delete() def test_write_lang_freetext(self): """Tests that if you don't use an ISO 639-2 code, TXXX gets populated """ af = self.KIND(self.filename) for val in ["free-text", "foo", "de", "en"]: af["language"] = val # Just checking... self.failUnlessEqual(af("language"), val) af.write() tags = mutagen.File(self.filename).tags self.failUnlessEqual(tags[u'TXXX:QuodLibet::language'], val) self.failIf("TLAN" in tags) def test_write_lang_iso(self): """Tests that if you use an ISO 639-2 code, TLAN gets populated""" for iso_lang in ['eng', 'ger', 'zho']: af = self.KIND(self.filename) af["language"] = iso_lang self.failUnlessEqual(af("language"), iso_lang) af.write() tags = mutagen.File(self.filename).tags self.failIf(u'TXXX:QuodLibet::language' in tags, "Should have used TLAN tag for '%s'" % iso_lang) self.failUnlessEqual(tags[u'TLAN'], iso_lang) af.clear() def test_write_multiple_lang_iso(self): """Tests using multiple ISO 639-2 codes""" iso_langs = ['eng', 'ger', 'zho'] iso_langs_str = "\n".join(iso_langs) af = self.KIND(self.filename) af["language"] = iso_langs_str self.failUnlessEqual(af("language"), iso_langs_str) af.write() tags = mutagen.File(self.filename).tags self.failIf(u'TXXX:QuodLibet::language' in tags, "Should have used TLAN for %s" % iso_langs) self.failUnlessEqual(tags[u'TLAN'], iso_langs, msg="Wrong tags: %s" % tags) af.clear() def test_tlen(self): f = mutagen.File(self.filename) f.tags.add(mutagen.id3.TLEN(encoding=0, text=['20000'])) f.save() self.failUnlessEqual(self.KIND(self.filename)("~#length"), 20) # ignore <= 0 [issue 222] f = mutagen.File(self.filename) f.tags.add(mutagen.id3.TLEN(encoding=0, text=['0'])) f.save() self.failUnless(self.KIND(self.filename)("~#length") > 0) # inval f.tags.add(mutagen.id3.TLEN(encoding=0, text=['x'])) f.save() self.failUnless(self.KIND(self.filename)("~#length") > 0) def test_load_tcon(self): # check if the mutagen preprocessing is used f = mutagen.File(self.filename) f.tags.add(mutagen.id3.TCON(encoding=3, text=["4", "5"])) f.save() genres = set(self.KIND(self.filename).list("genre")) self.failUnlessEqual(genres, {"Funk", "Disco"}) def test_mb_track_id(self): f = mutagen.File(self.filename) f.tags.add(mutagen.id3.UFID(owner="http://musicbrainz.org", data=b"x")) f.save() song = self.KIND(self.filename) self.failUnlessEqual(song("musicbrainz_trackid"), "x") song["musicbrainz_trackid"] = "y" song.write() f = mutagen.File(self.filename) self.failUnlessEqual(f.tags["UFID:http://musicbrainz.org"].data, b"y") del song["musicbrainz_trackid"] song.write() f = mutagen.File(self.filename) self.failIf(f.tags.get("UFID:http://musicbrainz.org")) def test_mb_release_track_id(self): f = mutagen.File(self.filename) f.tags.add( mutagen.id3.TXXX(encoding=3, desc=u"MusicBrainz Release Track Id", text=["bla"])) f.save() song = self.KIND(self.filename) self.assertEqual(song["musicbrainz_releasetrackid"], u"bla") song["musicbrainz_releasetrackid"] = u"foo" song.write() f = mutagen.File(self.filename) frames = f.tags.getall("TXXX:MusicBrainz Release Track Id") self.assertTrue(frames) self.assertEqual(frames[0].text, [u"foo"]) def test_load_comment(self): # comm with empty descriptions => comment f = mutagen.File(self.filename) f.tags.add(mutagen.id3.COMM(encoding=3, lang="aar", desc="", text=["foo", "bar"])) f.save() comments = set(self.KIND(self.filename).list("comment")) self.failUnlessEqual(comments, {"bar", "foo"}) def test_foobar2k_replaygain(self): # foobar2k saved gain there f = mutagen.File(self.filename) f.tags.add(mutagen.id3.TXXX(encoding=3, desc="replaygain_track_gain", text=["-6 db"])) f.save() song = self.KIND(self.filename) self.failIfAlmostEqual(song.replay_gain(["track"]), 1.0, 1) # check if all keys are str for k in self.KIND(self.filename).keys(): self.failUnless(isinstance(k, str)) # remove value, save, reload and check if still gone del song["replaygain_track_gain"] song.write() song.reload() self.failUnlessAlmostEqual(song.replay_gain(["track"]), 1.0, 1) def test_foobar2k_replaygain_read_new(self): # Others don't like RVA2, so we have to read/write foobar style # https://github.com/quodlibet/quodlibet/issues/1027 f = mutagen.File(self.filename) # use RVA2 in case it's the only one f.tags.add(mutagen.id3.RVA2(desc="track", channel=1, gain=-9, peak=1.0)) f.save() song = self.KIND(self.filename) self.failUnlessAlmostEqual(song.replay_gain(["track"]), 0.35, 1) f.tags.add(mutagen.id3.TXXX(encoding=3, desc="replaygain_track_gain", text=["-6 db"])) f.tags.add(mutagen.id3.TXXX(encoding=3, desc="replaygain_track_peak", text=["0.9"])) f.tags.add(mutagen.id3.TXXX(encoding=3, desc="replaygain_album_gain", text=["3 db"])) f.tags.add(mutagen.id3.TXXX(encoding=3, desc="replaygain_album_peak", text=["0.8"])) f.save() song = self.KIND(self.filename) self.failUnlessEqual(song("replaygain_track_gain"), "-6 db") self.failUnlessEqual(song("replaygain_track_peak"), "0.9") self.failUnlessEqual(song("replaygain_album_gain"), "3 db") self.failUnlessEqual(song("replaygain_album_peak"), "0.8") def test_foobar2k_replaygain_write_new(self): # Others don't like RVA2, so we have to read/write foobar style # https://github.com/quodlibet/quodlibet/issues/1027 song = self.KIND(self.filename) song["replaygain_track_gain"] = "-6 db" song["replaygain_track_peak"] = "0.9" song["replaygain_album_gain"] = "3 db" song["replaygain_album_peak"] = "0.8" song.write() f = mutagen.File(self.filename) for k in ["track_peak", "track_gain", "album_peak", "album_gain"]: self.failUnless(f["TXXX:replaygain_" + k]) def test_foobar2k_rg_caseinsensitive(self): f = mutagen.File(self.filename) f.tags.add(mutagen.id3.TXXX(encoding=3, desc="REPLAYGAIN_TRACK_GAIN", text=["-6 db"])) f.save() song = self.KIND(self.filename) self.failUnlessEqual(song("replaygain_track_gain"), "-6 db") song.write() f = mutagen.File(self.filename) frames = f.tags.getall("TXXX:replaygain_track_gain") self.assertTrue(frames) self.assertEqual(frames[0].desc, "replaygain_track_gain") del song["replaygain_track_gain"] song.write() f = mutagen.File(self.filename) self.assertFalse(f.tags.getall("TXXX:replaygain_track_gain")) def test_quodlibet_txxx_inval(self): # This shouldn't happen in our namespace, but check anyway since # we might open the whole TXXX namespace sometime f = mutagen.File(self.filename) f.tags.add(mutagen.id3.TXXX(encoding=3, desc="QuodLibet::valid", text=["quux"])) f.tags.add(mutagen.id3.TXXX(encoding=3, desc="QuodLibet::foo=", text=["quux", "bar"])) f.tags.add(mutagen.id3.COMM(encoding=3, desc=u"QuodLibet::öäü", text=["quux", "bar"], lang="aar")) f.tags.add(mutagen.id3.COMM(encoding=3, desc=u"", text=["a"], lang="aar")) f.tags.add(mutagen.id3.COMM(encoding=3, desc=u"", text=["b"], lang="foo")) f.save() # check if all keys are valid for k in self.KIND(self.filename).keys(): self.failUnless(isinstance(k, str)) song = self.KIND(self.filename) self.failIf("foo=" in song) self.failIf(u"öäü" in song) self.failUnlessEqual(set(song.list("comment")), {"a", "b"}) self.failUnlessEqual(song("valid"), "quux") del song["valid"] song.write() f = mutagen.File(self.filename) self.failUnless(f.tags.getall("TXXX:QuodLibet::foo=")) self.failIf(f.tags.getall("TXXX:QuodLibet::valid")) self.failUnlessEqual(len(f.tags.getall("COMM")), 2) self.failUnlessEqual(len(f.tags.getall("COMM:")), 1) def test_old_comm_to_txxx(self): f = mutagen.File(self.filename) f.tags.add(mutagen.id3.COMM(encoding=3, desc=u"QuodLibet::foo", text=["a"], lang="aar")) f.save() song = self.KIND(self.filename) self.failUnlessEqual(song("foo"), "a") song.write() f = mutagen.File(self.filename) self.failUnlessEqual(f["TXXX:QuodLibet::foo"].text, ["a"]) def test_txxx_others(self): f = mutagen.File(self.filename) t1 = mutagen.id3.TXXX(encoding=3, desc="FooBar::invalid", text="quux") t2 = mutagen.id3.TXXX(encoding=3, desc="FooBar::öäü", text="bar") f.tags.add(t1) f.tags.add(t2) f.save() song = self.KIND(self.filename) self.failIf("invalid" in song) self.failIf(u"öäü" in song) song.write() f = mutagen.File(self.filename) self.failUnless(f[t1.HashKey]) self.failUnless(f[t2.HashKey]) def test_woar(self): f = mutagen.File(self.filename) t1 = mutagen.id3.WOAR(url="http://this.is.a.test") f.tags.add(t1) f.save() song = self.KIND(self.filename) self.failUnlessEqual(song("website"), t1.url) song["website"] = "http://another.test\nhttp://omg.another.one" song.write() f = mutagen.File(self.filename) self.failUnlessEqual(len(f.tags.getall("WOAR")), 2) def test_unhandled(self): f = mutagen.File(self.filename) t1 = mutagen.id3.AENC(owner="x", preview_start=1, preview_length=3) f.tags.add(t1) f.save() self.KIND(self.filename) def test_encoding(self): song = self.KIND(self.filename) song["foo"] = u"öäü" song["bar"] = u"abc" song["comment"] = u"öäü" song["artist"] = u"xyz" song["album"] = u"öäü" song["tracknumber"] = u"ö" song["discnumber"] = u"9" song.write() f = mutagen.File(self.filename) self.failUnlessEqual(f.tags["TXXX:QuodLibet::foo"].encoding, 1) self.failUnlessEqual(f.tags["TXXX:QuodLibet::bar"].encoding, 3) self.failUnlessEqual(f.tags["TPE1"].encoding, 3) self.failUnlessEqual(f.tags["TALB"].encoding, 1) self.failUnlessEqual(f.tags["TPE1"].encoding, 3) # FIXME: we shouldn't write invalid TRCK... self.failUnlessEqual(f.tags["TRCK"].encoding, 1) self.failUnlessEqual(f.tags["TPOS"].encoding, 3) def test_tcon(self): f = mutagen.File(self.filename) f.tags.add(mutagen.id3.TMCL(encoding=3, people=[["foo", "bar"]])) f.save() song = self.KIND(self.filename) self.failUnless("performer:foo" in song) self.failUnlessEqual(song("performer:foo"), "bar") def test_nonascii_unsup_tcon(self): people = [["a=", "a"], ["b~", "b"], [u"äöü", "u"], ["quux", "x"]] f = mutagen.File(self.filename) f.tags.add(mutagen.id3.TMCL(encoding=3, people=people)) f.save() # we only support one of them self.failUnlessEqual( len(self.KIND(self.filename).list("~performer")), 1) # but after writing they should still be there song = self.KIND(self.filename) song.write() f = mutagen.File(self.filename) self.failUnlessEqual(len(f.tags["TMCL"].people), 4) self.failUnlessEqual(f.tags["TMCL"].people, people) # also change something.. song["performer:quux"] = "foo" song.write() f = mutagen.File(self.filename) self.failUnlessEqual(dict(f.tags["TMCL"].people)["quux"], "foo") def test_rva_large(self): song = self.KIND(self.filename) song["replaygain_track_peak"] = "3" song["replaygain_track_gain"] = "100" song.write() song["replaygain_track_peak"] = "-1" song["replaygain_track_gain"] = "-100" song.write() def test_rva(self): f = mutagen.File(self.filename) f.tags.add(mutagen.id3.RVA2(desc="track", channel=1, gain=-3, peak=1.0)) f.tags.add(mutagen.id3.RVA2(desc="album", channel=1, gain=-6, peak=1.0)) f.save() song = self.KIND(self.filename) self.failUnlessAlmostEqual(song.replay_gain(["track"]), 0.7, 1) self.failUnlessAlmostEqual(song.replay_gain(["album"]), 0.5, 1) song.write() f = mutagen.File(self.filename) self.failUnlessEqual(len(f.tags.getall("RVA2")), 2) def test_rva_unknown(self): f = mutagen.File(self.filename) f.tags.add(mutagen.id3.RVA2(desc="track", channel=2, gain=-6, peak=1.0)) f.tags.add(mutagen.id3.RVA2(desc="foo", channel=1, gain=-3, peak=1.0)) f.save() # we use foo as track if nothing else is there song = self.KIND(self.filename) self.failUnlessAlmostEqual(song.replay_gain(["track"]), 0.7, 1) song.write() # and we write that over track.. f = mutagen.File(self.filename) self.failUnlessAlmostEqual(f.tags["RVA2:track"].gain, -3.0, 1) # now that one is there, ignore foo f = mutagen.File(self.filename) f.tags.add(mutagen.id3.RVA2(desc="foo", channel=1, gain=0, peak=1.0)) f.save() song = self.KIND(self.filename) self.failUnlessAlmostEqual(song.replay_gain(["track"]), 0.7, 1) def test_rva_inval(self): song = self.KIND(self.filename) song["replaygain_track_peak"] = u"0.1afasf" song["replaygain_track_gain"] = u"0.1afasf" song.write() def test_without_id3_tag(self): f = mutagen.File(self.filename) f.delete() f.save() song = self.KIND(self.filename) song.get_primary_image() song.write() def test_distrust_latin1(self): x = u"Å" # abuse mutagen a bit, and get some utf-8 in with the wrong encoding f = mutagen.File(self.filename) f.tags.add(mutagen.id3.TPE1( encoding=0, text=x.encode("utf-8").decode("latin-1"))) f.save() # back to utf-8 song = self.KIND(self.filename) self.failUnlessEqual(song("artist"), x) song.write() # because it's not ascii, saved as utf-16 f = mutagen.File(self.filename) self.failUnlessEqual(f.tags["TPE1"].encoding, 1) # and now latin-1 that is not decodable using utf-8/16 x = u"äöü".encode("ibm1026").decode("latin-1") f.tags.add(mutagen.id3.TPE1(encoding=0, text=x)) f.save() self.failUnlessEqual(self.KIND(self.filename)("artist"), x) def test_handled_txxx_encoding(self): song = self.KIND(self.filename) song['albumartistsort'] = u'Dvo\u0159\xe1k, Anton\xedn' song["replaygain_track_peak"] = u'Dvo\u0159\xe1k, Anton\xedn' song.write() def test_albumartistsort(self): song = self.KIND(self.filename) song['albumartistsort'] = u"foo" song.write() song = self.KIND(self.filename) self.assertEqual(song['albumartistsort'], u"foo") class TID3FileMP3(TID3FileBase, TID3FileMixin): KIND = MP3File PATH = get_data_path('silence-44-s.mp3') class TID3FileAIFF(TID3FileBase, TID3FileMixin): KIND = AIFFFile PATH = get_data_path('test.aiff') ��������������������������������������������������������������quodlibet-3.9.1/tests/test_util_tagsfrompath.py�����������������������������������������������������0000644�0001750�0001750�00000014605�13112005742�022252� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase import os from senf import fsnative from quodlibet.util.tagsfrompath import TagsFromPattern from quodlibet.compat import iteritems class TTagsFromPattern(TestCase): def setUp(self): if os.name == "nt": self.f1 = u'C:\\path\\Artist\\Album\\01 - Title.mp3' self.f2 = u'C:\\path\\Artist - Album\\01. Title.mp3' self.f3 = u'C:\\path\\01 - Artist - Title.mp3' self.b1 = u'C:\\path\\01 - Title' self.b2 = u'C:\\path\\01 - Artist - Title' else: self.f1 = '/path/Artist/Album/01 - Title.mp3' self.f2 = '/path/Artist - Album/01. Title.mp3' self.f3 = '/path/01 - Artist - Title.mp3' self.b1 = '/path/01 - Title' self.b2 = '/path/01 - Artist - Title' self.nomatch = {} def test_songtypes(self): from quodlibet import formats pat = TagsFromPattern('<tracknumber>. <title>') tracktitle = {'tracknumber': '01', 'title': 'Title'} for ext, kind in iteritems(formats.loaders): f = formats._audio.AudioFile() if not isinstance(kind, type): continue f.__class__ = kind if os.name == "nt": f["~filename"] = u'C:\\path\\Artist - Album\\01. Title' + ext else: f["~filename"] = '/path/Artist - Album/01. Title' + ext self.assertEquals(pat.match(f), tracktitle, ext) def test_skip(self): if os.name == "nt": pat = TagsFromPattern('<path>\\<~>\\<~>\\<tracknumber> - <title>') else: pat = TagsFromPattern('<path>/<~>/<~>/<tracknumber> - <title>') self.failUnlessEqual(len(pat.headers), 3) song = pat.match({"~filename": self.f1}) self.failUnlessEqual(song.get("path"), "path") self.failUnlessEqual(song.get("title"), "Title") self.failIf(song.get("album")) self.failIf(song.get("artist")) def test_dict(self): tracktitle = {'tracknumber': '01', 'title': 'Title'} pat = TagsFromPattern('<tracknumber> - <title>') self.assertEquals(pat.match({"~filename": self.f1}), tracktitle) def test_nongreedy(self): pat = TagsFromPattern('<artist> - <title>') dic = pat.match_path( fsnative(u"Prefuse 73 - The End of Biters - International.ogg")) self.assertEquals(dic["artist"], "Prefuse 73") self.assertEquals(dic["title"], "The End of Biters - International") def test_empty(self): pat = TagsFromPattern('') self.assertEquals(pat.match_path(self.f1), self.nomatch) self.assertEquals(pat.match_path(self.f2), self.nomatch) self.assertEquals(pat.match_path(self.f3), self.nomatch) self.assertEquals(pat.match_path(self.b1), self.nomatch) self.assertEquals(pat.match_path(self.b2), self.nomatch) def test_tracktitle(self): tracktitle = {'tracknumber': '01', 'title': 'Title'} btracktitle = {'tracknumber': '01', 'title': 'Artist - Title'} pat = TagsFromPattern('<tracknumber> - <title>') self.assertEquals(pat.match_path(self.f1), tracktitle) self.assertEquals(pat.match_path(self.f2), self.nomatch) self.assertEquals(pat.match_path(self.f3), btracktitle) self.assertEquals(pat.match_path(self.b1), self.nomatch) self.assertEquals(pat.match_path(self.b2), self.nomatch) def test_path(self): albumtracktitle = {'tracknumber': '01', 'title': 'Title', 'album': 'Album'} balbumtracktitle = {'tracknumber': '01', 'title': 'Artist - Title', 'album': 'path'} if os.name == "nt": pat = TagsFromPattern('<album>\\<tracknumber> - <title>') else: pat = TagsFromPattern('<album>/<tracknumber> - <title>') self.assertEquals(pat.match_path(self.f1), albumtracktitle) self.assertEquals(pat.match_path(self.f2), self.nomatch) self.assertEquals(pat.match_path(self.f3), balbumtracktitle) self.assertEquals(pat.match_path(self.b1), self.nomatch) self.assertEquals(pat.match_path(self.b2), self.nomatch) def test_all(self): all = {'tracknumber': '01', 'title': 'Title', 'album': 'Album', 'artist': 'Artist'} if os.name == "nt": pat = TagsFromPattern('<artist>\\<album>\\<tracknumber> - <title>') else: pat = TagsFromPattern('<artist>/<album>/<tracknumber> - <title>') self.assertEquals(pat.match_path(self.f1), all) self.assertEquals(pat.match_path(self.f2), self.nomatch) self.assertEquals(pat.match_path(self.f3), self.nomatch) self.assertEquals(pat.match_path(self.b1), self.nomatch) self.assertEquals(pat.match_path(self.b2), self.nomatch) def test_post(self): btracktitle = {'tracknumber': '01', 'title': 'Titl'} vbtracktitle = {'tracknumber': '01', 'title': 'Artist - Titl'} pat = TagsFromPattern('<tracknumber> - <title>e') self.assertEquals(pat.match_path(self.f1), btracktitle) self.assertEquals(pat.match_path(self.f2), self.nomatch) self.assertEquals(pat.match_path(self.f3), vbtracktitle) self.assertEquals(pat.match_path(self.b1), btracktitle) self.assertEquals(pat.match_path(self.b2), vbtracktitle) def test_nofakes(self): pat = TagsFromPattern('<~#track> - <title>') self.assertEquals(pat.match_path(self.f1), self.nomatch) self.assertEquals(pat.match_path(self.f2), self.nomatch) self.assertEquals(pat.match_path(self.f3), self.nomatch) self.assertEquals(pat.match_path(self.b1), self.nomatch) self.assertEquals(pat.match_path(self.b2), self.nomatch) def test_disctrack(self): pat = TagsFromPattern('<discnumber><tracknumber>. <title>') self.assertEquals(pat.match_path(fsnative(u'101. T1.ogg')), dict(discnumber='1', tracknumber='01', title='T1')) self.assertEquals(pat.match_path(fsnative(u'1318. T18.ogg')), dict(discnumber='13', tracknumber='18', title='T18')) self.assertEquals(pat.match_path(fsnative(u'24. T4.ogg')), dict(discnumber='2', tracknumber='4', title='T4')) ���������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_properties.py�������������������������������������������������������0000644�0001750�0001750�00000003600�13112005742�021736� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from gi.repository import Gtk from senf import fsnative from quodlibet.formats import AudioFile from quodlibet.qltk.properties import SongProperties from quodlibet.library import SongLibrary from quodlibet import config class DummyPlugins(object): def rescan(self): pass def find_subclasses(self, *args): return [] def TagsFromPathPlugins(self): return [] def RenamePlugins(self): return [] def EditTagsPlugins(self): return [] class TSongProperties(TestCase): af1 = AudioFile({"title": "woo"}) af1.sanitize(fsnative(u"invalid")) af2 = AudioFile({"title": "bar", "album": "quux"}) af2.sanitize(fsnative(u"alsoinvalid")) def setUp(self): SongProperties.plugins = DummyPlugins() config.init() self.library = SongLibrary() def test_onesong(self): self.window = SongProperties(self.library, [self.af1]) def test_twosong(self): self.window = SongProperties(self.library, [self.af2, self.af1]) def test_changed(self): self.test_twosong() self.window.hide() self.library.emit('changed', [self.af2]) while Gtk.events_pending(): Gtk.main_iteration() def test_removed(self): self.test_twosong() self.window.hide() self.library.emit('removed', [self.af2]) while Gtk.events_pending(): Gtk.main_iteration() def tearDown(self): try: self.window.destroy() except AttributeError: pass else: del(self.window) self.library.destroy() del(SongProperties.plugins) config.quit() ��������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_environment.py������������������������������������������������������0000644�0001750�0001750�00000002077�13112005742�022117� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.util import is_unity, is_windows, is_osx, is_py2exe, \ is_py2exe_console, is_py2exe_window class TUtilEnvironment(TestCase): def test_all(self): self.assertTrue(isinstance(is_unity(), bool)) self.assertTrue(isinstance(is_windows(), bool)) self.assertTrue(isinstance(is_osx(), bool)) self.assertTrue(isinstance(is_py2exe(), bool)) self.assertTrue(isinstance(is_py2exe_console(), bool)) self.assertTrue(isinstance(is_py2exe_window(), bool)) def test_constrains(self): if is_py2exe(): self.assertEqual(is_py2exe_console(), not is_py2exe_window()) self.assertTrue(is_windows()) if is_windows(): self.assertFalse(is_osx()) if is_osx(): self.assertFalse(is_windows()) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_thread.py�����������������������������������������������������������0000644�0001750�0001750�00000003156�13112005742�021021� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import threading from tests import TestCase from gi.repository import Gtk from quodlibet.util.thread import call_async, call_async_background, \ Cancellable, terminate_all class Tcall_async(TestCase): def test_main(self): cancel = Cancellable() data = [] def func(): data.append(threading.current_thread().name) def callback(result): data.append(threading.current_thread().name) call_async(func, cancel, callback) Gtk.main_iteration() while Gtk.events_pending(): Gtk.main_iteration() call_async_background(func, cancel, callback) Gtk.main_iteration() while Gtk.events_pending(): Gtk.main_iteration() main_name = threading.current_thread().name self.assertEqual(len(data), 4) self.assertNotEqual(data[0], main_name) self.assertEqual(data[1], main_name) self.assertNotEqual(data[2], main_name) self.assertEqual(data[3], main_name) def test_cancel(self): def func(): assert 0 def callback(result): assert 0 cancel = Cancellable() cancel.cancel() call_async(func, cancel, callback) Gtk.main_iteration() while Gtk.events_pending(): Gtk.main_iteration() def test_terminate_all(self): terminate_all() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_massagers.py��������������������������������������������������������0000644�0001750�0001750�00000011450�13112005742�021533� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.util.massagers import Massager, validate, is_valid, \ error_message, get_options, ValidationError from quodlibet.compat import text_type class TMassagers(TestCase): def validate(self, key, values): massager = Massager.for_tag(key) for val in values: self.assertTrue(massager.is_valid(val)) self.assertTrue( isinstance(massager.validate(text_type(val)), text_type)) def invalidate(self, key, values): for val in values: self.failIf(Massager.for_tag(key).is_valid(val)) def equivs(self, key, equivs): massager = Massager.for_tag(key) for value, normed in equivs.items(): self.assertEqual(normed, massager.validate(value)) self.assertTrue( isinstance(massager.validate(text_type(value)), text_type)) def test_validate_helper(self): self.assertEqual(validate("foo", "bar"), "bar") self.assertRaises(ValidationError, validate, "date", "bar") self.assertEqual(validate("date", "2000"), "2000") def test_is_valid_helper(self): self.assertTrue(is_valid("foo", "bar")) self.assertFalse(is_valid("date", "bar")) self.assertTrue(is_valid("date", "2000")) def test_error_message_helper(self): self.assertFalse(error_message("foo", "bar")) self.assertTrue(error_message("date", "2000")) def test_get_options_helper(self): self.assertFalse(get_options("foo")) self.assertTrue(get_options("language")) def test_date_valid(self): self.validate("date", ["2002-10-12", "2000", "1200-10", "0000-00-00", "1999/09/12"]) def test_date_invalid(self): self.invalidate("date", ["200", "date-or-no", "", "2000-00-00-00"]) def test_date_equivs(self): self.equivs("date", {"2000": "2000", "1999-99-99": "1999-99-99", "1999/12/09": "1999-12-09"}) def test_gain_valid(self): gains = ["+2.12 dB", "99. dB", "-1.11 dB", "-0.99 dB", "0 dB"] self.validate('replaygain_track_gain', gains) self.validate('replaygain_album_gain', gains) def test_gain_invalid(self): gains = ["hooray", "", "dB dB"] self.invalidate('replaygain_track_gain', gains) self.invalidate('replaygain_album_gain', gains) def test_gain_equivs(self): equivs = {"12.1 dB": "+12.1 dB", "-1.00 dB": "-1.00 dB", "0": "+0. dB"} self.equivs("replaygain_track_gain", equivs) self.equivs("replaygain_album_gain", equivs) def test_peak_valid(self): peaks = ["0.54", "0.999", "0", "1.234", "1.99"] self.validate('replaygain_track_peak', peaks) self.validate('replaygain_album_peak', peaks) def test_peak_invalid(self): peaks = ["", "100 dB", "woooo", "12.12.12", "-18", "2.23"] self.invalidate('replaygain_track_peak', peaks) self.invalidate('replaygain_album_peak', peaks) def test_mbid_valid(self): self.validate("musicbrainz_trackid", ["cafebabe-ffff-eeee-0101-deadbeafffff", "Fef1F0f4-dead-a5da-d0D0-86753099ffff"]) def test_mbid_invalid(self): self.invalidate("musicbrainz_trackid", ["", "cafebab!-ffff-eeee-0101-deadbeaf", "Fef1F0f4-dead-a5da-d0D0-8675309z"]) def test_mbid_equivs(self): self.equivs("musicbrainz_trackid", {"cafebabe-ffff-eeee-0101-deadbeafffff": "cafebabe-ffff-eeee-0101-deadbeafffff", "Fef1F0f4-dead-a5da-d0D0-86753099ffff": "fef1f0f4-dead-a5da-d0d0-86753099ffff" }) def test_albumstatus(self): self.validate("musicbrainz_albumstatus", ["official", "promotional", "bootleg"]) self.invalidate("musicbrainz_albumstatus", ["", "unofficial", "\x99"]) def test_language_valid(self): self.validate("language", ["eng", "zho", "lol", "fre", "ger", "zza"]) self.validate("language", ["deu", "fra", "msa"]) # self.invalidate("language", ["xxx", "ROFL", "", "es", "ENG"]) # Issue 439: Actually, allow free-text. self.validate("language", ["", "German", "Chinese", "Foobarlanguage"]) mas = Massager.for_tag("language") # Check completion help too for code in ["eng", "fra", "fre", "deu", "zho"]: self.failUnless(code in mas.options, "'%s' should be in languages options" % code) self.failIf("" in mas.options) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_midi.py����������������������������������������������������������0000644�0001750�0001750�00000002356�13112005742�021173� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase, get_data_path from quodlibet.formats.midi import MidiFile class TMidiFile(TestCase): def setUp(self): self.song = MidiFile(get_data_path('test.mid')) def test_length(self): self.failUnlessAlmostEqual(87, self.song("~#length", 0), 0) def test_reload(self): self.song["title"] = "foobar" self.song.reload() self.failUnlessEqual(self.song("title"), "foobar") def test_write(self): self.song.write() def test_can_change(self): self.failUnlessEqual(self.song.can_change(), ["title"]) self.failUnless(self.song.can_change("title")) self.failIf(self.song.can_change("album")) def test_invalid(self): path = get_data_path('empty.xm') self.failUnlessRaises(Exception, MidiFile, path) def test_format_codec(self): self.assertEqual(self.song("~format"), "MIDI") self.assertEqual(self.song("~codec"), "MIDI") self.assertEqual(self.song("~encoding"), "") ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_notif.py������������������������������������������������������������0000644�0001750�0001750�00000003050�13112005742�020660� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet import _ from quodlibet.qltk.notif import Task, TaskController class FakeStatusBar(object): def __init__(self): self.count = 0 def update(self): self.count += 1 class TTaskController(TestCase): def setUp(self): self.c = TaskController() self.f = FakeStatusBar() self.c.parent = self.f def test_reparent(self): def set_parent(p): self.c.parent = p set_parent(None) set_parent(FakeStatusBar()) self.assertRaises(ValueError, set_parent, FakeStatusBar()) def test_multiple_tasks(self): self.assertEquals(self.c.active_tasks, []) self.assertNotEqual(self.c.source, "") t1 = Task("src", "desc", controller=self.c) self.assertEquals(self.c.source, "src") self.assertEquals(self.c.active_tasks, [t1]) t1.update(0.5) self.assertEquals(self.c.frac, 0.5) t2 = Task("src2", "desc2", controller=self.c) self.assertEquals(self.c.source, _("Active tasks")) self.assertEquals(self.c.frac, 0.25) Task("src3", "desc3", controller=self.c, known_length=False) self.assertAlmostEqual(self.c.frac, 0.5 / 3) t1.finish() t2.finish() self.assertEquals(self.c.desc, "desc3") self.assertEquals(self.c.frac, None) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_util_string.py�����������������������������������������������������������0000644�0001750�0001750�00000002734�13112005742�021061� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.util.string.splitters import split_value from quodlibet.util.string import isascii class Tsplit_value(TestCase): def test_single(self): self.failUnlessEqual(split_value("a b"), ["a b"]) def test_double(self): self.failUnlessEqual(split_value("a, b"), ["a", "b"]) def test_custom_splitter(self): self.failUnlessEqual(split_value("a b", [" "]), ["a", "b"]) def test_two_splitters(self): self.failUnlessEqual( split_value("a, b and c", [",", "and"]), ["a", "b and c"]) def test_no_splitters(self): self.failUnlessEqual(split_value("a b", []), ["a b"]) def test_wordboundry(self): self.failUnlessEqual( split_value("Andromeda and the Band", ["and"]), ["Andromeda", "the Band"]) def test_unicode_wordboundry(self): val = b'\xe3\x81\x82&\xe3\x81\x84'.decode('utf-8') self.failUnlessEqual(split_value(val), val.split("&")) class Tisascii(TestCase): def test_main(self): self.assertTrue(isascii("")) self.assertTrue(isascii(u"")) self.assertTrue(isascii("abc")) self.assertTrue(isascii(u"abc")) self.assertFalse(isascii("\xffbc")) self.assertFalse(isascii(u"übc")) ������������������������������������quodlibet-3.9.1/tests/test_browsers_filesystem.py���������������������������������������������������0000644�0001750�0001750�00000001410�13112005742�022616� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.browsers.filesystem import FileSystem from quodlibet.library import SongLibrary import quodlibet.config class TFileSystem(TestCase): def setUp(self): quodlibet.config.init() self.bar = FileSystem(SongLibrary()) def test_can_filter(self): for key in ["foo", "title", "fake~key", "~woobar", "~#huh"]: self.failIf(self.bar.can_filter(key)) self.failUnless(self.bar.can_filter("~dirname")) def tearDown(self): self.bar.destroy() quodlibet.config.quit() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_const.py�����������������������������������������������������������������0000644�0001750�0001750�00000002051�13112005742�017634� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import subprocess from tests import TestCase from quodlibet import const class Tconst(TestCase): def test_branch_name(self): devnull = open(os.devnull, 'w') try: subprocess.check_call(["git", "status"], stdout=devnull) except (OSError, subprocess.CalledProcessError): # no active hg repo, skip return p = subprocess.Popen( ["git", "rev-parse", "--abbrev-ref", "HEAD"], stdout=subprocess.PIPE) branch = p.communicate()[0].strip() self.failIf(p.returncode) # only check for stable/dev branches, no feature branches if branch == b"master" or branch.startswith(b"quodlibet"): branch = branch.decode("utf-8") self.failUnlessEqual(branch, const.BRANCH_NAME) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_scanbox.py����������������������������������������������������������0000644�0001750�0001750�00000000545�13112005742�021204� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.qltk.scanbox import ScanBox from . import TestCase class TScanBox(TestCase): def test_main(self): ScanBox().destroy() �����������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_qltk_textedit.py���������������������������������������������������������0000644�0001750�0001750�00000003520�13112005742�021375� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from tests import TestCase from quodlibet.qltk.textedit import TextEditBox, TextEdit, \ validate_markup_pattern class TTextEditBox(TestCase): def setUp(self): self.box = TextEditBox() def test_empty(self): self.failUnlessEqual(self.box.text, "") def test_set(self): self.box.text = "bazquux" self.failUnlessEqual(self.box.text, "bazquux") def test_clicked(self): self.box.apply.clicked() def tearDown(self): self.box.destroy() class TTextEdit(TTextEditBox): def setUp(self): self.box = TextEdit(None) class TTextEditBox2(TestCase): def setUp(self): self.foobar = TextEditBox("foobar") def test_revert(self): self.foobar.revert.clicked() self.failUnless(self.foobar.text, "foobar") def tearDown(self): self.foobar.destroy() class TTextEdit2(TTextEditBox2): def setUp(self): self.foobar = TextEdit(None, "foobar") class Tvalidate_markup_pattern(TestCase): def test_valid(self): for t in [u"", u"<foo>", u"\<b\><foo>bar\</b\>", u"[b]"]: validate_markup_pattern(t, False, False) for t in [u"[b][/b]"]: validate_markup_pattern(t, True, False) for t in [u"[a href=''][/a]", u"\<a href=''\>\</a\>"]: validate_markup_pattern(t, True, True) def test_invalid(self): for t in [u"\<", u"\<a href=''\>\</a\>"]: self.assertRaises( ValueError, validate_markup_pattern, t, False, False) for t in [u"[b]"]: self.assertRaises( ValueError, validate_markup_pattern, t, True, False) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/tests/test_formats_spc.py�����������������������������������������������������������0000644�0001750�0001750�00000002461�13112005742�021033� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from tests import TestCase, get_data_path from quodlibet.formats.spc import SPCFile class TSPCFile(TestCase): def setUp(self): self.song = SPCFile(get_data_path('test.spc')) def test_tags(self): tags = { "title": "Game Select", "artist": "Koji Kondo", "album": "Super Mario All-Stars", "dumper": "Datschge", } for k, v in tags.items(): self.failUnlessEqual(self.song[k], v) def test_length(self): self.failUnlessEqual(self.song("~#length"), 25) def test_write(self): self.song.write() def test_can_change(self): self.failUnless(self.song.can_change("title")) def test_invalid(self): path = get_data_path('empty.xm') self.failUnless(os.path.exists(path)) self.failUnlessRaises(Exception, SPCFile, path) def test_format_codec(self): self.assertEqual(self.song("~format"), "SPC700") self.assertEqual(self.song("~codec"), "SPC700") self.assertEqual(self.song("~encoding"), "") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/setup.py����������������������������������������������������������������������������0000755�0001750�0001750�00000006643�13112005742�015463� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright 2010-2015 Christoph Reiter # 2015 Nick Boultbee # 2010 Steven Robertson # 2007-2008 Joe Wreschnig # # This software and accompanying documentation, if any, may be freely # used, distributed, and/or modified, in any form and for any purpose, # as long as this notice is preserved. There is no warranty, either # express or implied, for this software. import os import sys import types from gdist import GDistribution, setup def exec_module(path): """Executes the Python file at `path` and returns it as the module""" globals_ = {} if sys.version_info[0] == 2: execfile(path, globals_) else: with open(path, encoding="utf-8") as h: exec(h.read(), globals_) module = types.ModuleType("") module.__dict__.update(globals_) return module def main(): # distutils depends on setup.py beeing executed from the same dir. # Most of our custom commands work either way, but this makes # it work in all cases. os.chdir(os.path.dirname(os.path.realpath(__file__))) const = exec_module(os.path.join("quodlibet", "const.py")) # convert to a setuptools compatible version string version = const.VERSION_TUPLE if version[-1] == -1: version_string = ".".join(map(str, version[:-1])) + ".dev0" else: version_string = ".".join(map(str, version)) package_path = "quodlibet" packages = [] for root, dirnames, filenames in os.walk(package_path): if "__init__.py" in filenames: relpath = os.path.relpath(root, os.path.dirname(package_path)) package_name = relpath.replace(os.sep, ".") packages.append(package_name) assert packages setup_kwargs = { 'distclass': GDistribution, 'name': "quodlibet", 'version': version_string, 'url': "https://quodlibet.readthedocs.org", 'description': "a music library, tagger, and player", 'author': "Joe Wreschnig, Michael Urman, & others", 'author_email': "quod-libet-development@googlegroups.com", 'maintainer': "Steven Robertson and Christoph Reiter", 'license': "GNU GPL v2", 'packages': packages, 'package_data': { "quodlibet": [ "images/hicolor/*/*/*.png", "images/hicolor/*/*/*.svg", ], }, 'scripts': [ "quodlibet.py", "exfalso.py", "operon.py", ], 'po_directory': "po", 'po_package': "quodlibet", 'shortcuts': ["data/quodlibet.desktop", "data/exfalso.desktop"], 'dbus_services': [ "data/net.sacredchao.QuodLibet.service", # https://github.com/quodlibet/quodlibet/issues/1268 # "data/org.mpris.MediaPlayer2.quodlibet.service", # "data/org.mpris.quodlibet.service", ], 'appdata': [ "data/quodlibet.appdata.xml", "data/exfalso.appdata.xml", ], 'man_pages': [ "data/quodlibet.1", "data/exfalso.1", "data/operon.1", ], "search_provider": "data/quodlibet-search-provider.ini", "zsh_completions": [ ("data/quodlibet.zsh", "_quodlibet"), ], "coverage_options": { "directory": "coverage", }, } setup(**setup_kwargs) if __name__ == "__main__": main() ���������������������������������������������������������������������������������������������quodlibet-3.9.1/po/���������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�014351� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/bg.po����������������������������������������������������������������������������0000644�0001750�0001750�00000570376�13115512742�015333� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Bulgarian translation of quodlibet. # Copyright (C) 2005 THE quodlibet'S COPYRIGHT HOLDER # This file is distributed under the same license as the quodlibet package. # Rostislav "zbrox" Raykov <zbrox@i-space.org>, 2005 # msgid "" msgstr "" "Project-Id-Version: quodlibet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2006-07-05 15:56-0500\n" "Last-Translator: Rostislav \"zbrox\" Raykov <zbrox@i-space.org>\n" "Language-Team: Bulgarian <dict@fsa-bg.org>\n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Редактиране на етикетите в аудио файловете Ви" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Редактор на музикални етикети" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "За слушане, разглеждане или редактиране на Вашата аудио колекция" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Слушане на музика" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Заглавие" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Артист" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Дата" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "жанр" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Оценка" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Сортиране по дата" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Настройки" #: ../quodlibet/browsers/albums/main.py:361 #, fuzzy msgid "Album List" msgstr "Спис_ък с албуми" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Спис_ък с албуми" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Всички албуми" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d албум" msgstr[1] "%d албума" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Показване на _обложките" msgstr[1] "Показване на _обложките" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Песните не са в албум" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d песен" msgstr[1] "%d песни" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d диск" msgstr[1] "%d диска" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Всички албуми" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Настройки на списъка с албуми" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Показване на _обложките" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[опции]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Показване на албум" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "непознат" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Нова емисия" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Въведете местоположението на аудио емисия:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 #, fuzzy msgid "Audio Feeds" msgstr "_Аудио емисии" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Аудио емисии" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "Из_тегляне" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Изтегляне на файлове" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Изтегляне на файл" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Неуспех при добавяне на емисията" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> не може да бъде добавена. Сървърът може да не е на линия или " "местоположението да не е аудио емисия." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Изтриване на файлове" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Разглеждане на фонотеката" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d песен" msgstr[1] "%d песни" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Невалиден шаблон" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "непознат" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Разделяне на _множество стойности" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Лично" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Премахване на станция" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Етикет" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Настройки на списъка с албуми" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Общ размер:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Общ размер:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Настройки на панели" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Показване на _обложките" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Всички албуми" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "Няма нови станции" #: ../quodlibet/browsers/filesystem.py:40 #, fuzzy msgid "File System" msgstr "Ф_айлова система" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "Ф_айлова система" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Неуспех при копиране на песните" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Избраните файлове не могат да бъдат копирани към други списъци с песни или " "към опашката." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "Пре_зареждане на фонотеката" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Неподдържан вид файл" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Списъците със станции могат да съдържат само местоположения на станции, не " "други списъци на станции или списъци на песни. Следните местоположения не " "могат да бъдат заредени:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Неуспех при добавяне на станцията" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 #, fuzzy msgid "Internet Radio" msgstr "_Радио по Интернет" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Изтегляне на файлове" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Нова станция" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Въведете местоположението на радиостанция в Интернет:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "оценка" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Нова станция" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Радио по Интернет" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Нова станция" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_Нова станция" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Нова станция" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Няма открити станции." #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Няма открити Интернет радиостанции на %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Всички изписани станции са вече във фонотеката Ви." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "_Добавяне към списък" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "Премахване от фонотеката" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d станция" msgstr[1] "%(count)d станции" #: ../quodlibet/browsers/media.py:36 #, fuzzy msgid "Device Properties" msgstr "Информация" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "точка на монтиране" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Име:" #: ../quodlibet/browsers/media.py:135 #, fuzzy msgid "Media Devices" msgstr "Аудио устройство: %s" #: ../quodlibet/browsers/media.py:136 #, fuzzy msgid "_Media Devices" msgstr "Аудио устройство: %s" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 #, fuzzy msgid "_Eject" msgstr "_Избор" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Информация" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Преименуване" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> не е валидно местоположение." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Пропадна изтриването на <b>%s</b>." #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 #, fuzzy msgid "Unable to copy song" msgstr "Неуспех при копиране на песните" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "" #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> не е валидно местоположение." #: ../quodlibet/browsers/media.py:545 #, fuzzy msgid "Unable to delete songs" msgstr "Неуспех при добавяне на песните" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Пропадна изтриването на <b>%s</b>." #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> не е валидно местоположение." #: ../quodlibet/browsers/media.py:579 #, fuzzy msgid "Unable to delete song" msgstr "Неуспех при редактиране на песента" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Пропадна изтриването на <b>%s</b>." #: ../quodlibet/browsers/media.py:597 #, fuzzy msgid "Unable to eject device" msgstr "Неуспех при изтриването на файл" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 #, fuzzy msgid "Paned Browser" msgstr "_Изглед на панели" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Изглед на панели" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "_Избор на всички" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Всички" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Настройки на панели" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 #, fuzzy msgid "Playlists" msgstr "Сп_исъци с песни" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "Сп_исъци с песни" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Премахване от фонотеката" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Внасяне" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Нов списък с песни" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Неуспех при внасяне на списъка" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet може да внася само списъци с песни с формат M3U или PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Неуспех при преименуване на списъка." #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Внасяне на списък с песни" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Нов списък с песни" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Нов списък с песни" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Настройки на панели" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Сп_исъци с песни" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Въведете име за новата папка:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Внасяне на списък с песни.\n" "\n" "Добавени са %d/%d песни." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Ограничаване на резултатите" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Търсене във фонотеката" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "Т_ърсене във фонотеката" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "_Изглед на панели" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Търсене" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "местонахождение" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet не е стартиран." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "фонотека и програма за слушане на музика" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[опции]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Показване на изпълняващата се песен и излизане" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Започване на изпълнението незабавно" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Отиване на следващата песен" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Отиване на предишната песен" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Започване на изпълнението" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Паузиране на изпълнението" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Сменяне между Слушане и Пауза" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Започване на изпълнението" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Увеличаване силата на звука" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Намаляване силата на звука" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Показване статуса на изпълнението" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Скриване на главния прозорец" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Показване на главния прозорец" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Превключване видимостта на главния прозорец" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Фокусиране на програмата" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "_Изключване на разглеждането" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Печат на текущия списък с песни" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Показване съдържанието на опашката" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Показване съдържанието на опашката" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet не е стартиран." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Затваряне на Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Прескачане в слушаната в момента песен" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Сменяне между Слушане и Пауза" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Включване на повтарянето, изключване или превключването му." #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Настройване силата на звука" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Търсене из фонотеката" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "запитване" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Слушане на файл" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "файлово име" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Оценка на текущата песен" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Оценка на текущата песен" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Отваряне на нов браузър" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Показване или скриване на опашката" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Показване или скриване на главния изглед с песни" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Филтриране по произволна стойност" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "етикет" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Филтриране по стойност на етикета" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "етикет=стойност" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Поставяне на файл или запитване на опашката" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "файлово име" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 #, fuzzy msgid "Unqueue a file or query" msgstr "Поставяне на файл или запитване на опашката" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Невалиден аргумент за \"%s\"." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Опитайте %s --help." #: ../quodlibet/devices/_base.py:65 #, fuzzy msgid "Unknown Device" msgstr "непознат" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: \"%s\" не е уникална представка." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "Невалидна стойност" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Файлово име" #: ../quodlibet/devices/storage.py:61 #, fuzzy msgid "Copy _album covers" msgstr "Показване на _обложките" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Показване на _грешки" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "описание" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "редактор на музикални етикети" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "папка" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[невалидна кодировка]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Заглавие" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Редактор на музикални етикети" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_Етикети със регистър на заглавие" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Настройки на панели" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Общ размер:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Редактиране на показваното" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Тежест" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Редактиране на показваното" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "Пре_глед" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d секунда" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Лично" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "Грешки на приставките" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Слушане на музика" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "_Радио по Интернет" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Оценка" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Не може да се запази песента" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Няма открити приставки." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Текст на песен" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Изчистване на търсенето" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Текст на песен" #: ../quodlibet/ext/events/lyricswindow.py:348 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "Преглед и редакция на етикетите на вървящата песен" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "местонахождение" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Скриване на главния прозорец" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Настройки" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "шаблон" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "шаблон" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d песен" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Информация" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "шаблон" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "местонахождение" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Заглавие" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 #, fuzzy msgid "Show notifications" msgstr "Няма нови станции" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 #, fuzzy msgid "Song Notifications" msgstr "Няма нови станции" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Име:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Други:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Артист" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Файлово име" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Произволен _албум" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "албуми" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Тежест" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Произволен _албум" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Внасяне на списък с песни" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Внасяне" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Текст на песен" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Не се изпълнява нищо" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d песен" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "шаблон" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Не се изпълнява нищо" #: ../quodlibet/ext/events/trayicon/__init__.py:53 #, fuzzy msgid "Tray Icon" msgstr "Настройки на иконата за статус" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "Сп_исъци с песни" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Преслушване" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "Пре_глед" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "П_роизволен ред" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "П_овтаряне" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Спиране след тази песен" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Отваряне на нов браузър" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Редактиране на _етикети" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Информация" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Сп_исъци с песни" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 #, fuzzy msgid "Scroll wheel adjusts volume" msgstr "" "Колелото на мишката наглася силата на звука;\n" "Shift и колелото на мишката променят песента." #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Колелото на ми_шката" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Показване на подсказка" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Текст на песен" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Текст на песен" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Показване на _грешки" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Файлове" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "Пре_глед" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Само този _артист" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Лично" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Само този _жанр" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Само този _артист" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "_Аудио емисии" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Въведете местоположението на аудио емисия:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Внасяне на списък с песни" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Внасяне" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Няма открити станции." #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Файлово име" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Файлово име" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Премахване от фонотеката" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Нов списък с песни" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "последно слушана" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "_Опашка" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Никога" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Няма песни" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Запазени стойности" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Преименуване" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Фонотека" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Скриване на главния прозорец" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Файлово име" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Не може да се запази песента" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Спис_ък с албуми" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Размер" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Търсене:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Търсене" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Спис_ък с албуми" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Редактиране на отметки..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Редактиране на отметки..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Отметки" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "ID в MusicBrainz на албума" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Файлово име" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "Д_иск" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Песен" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Заглавие" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "_Артист" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "ID в MusicBrainz на албума" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "запитване" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Търсене" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Няма открити приставки." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Разглеждане" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Неуспех при създаването на папка" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Преименуване" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "файлово име" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Невалиден шаблон" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Невалидна стойност" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Лично" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Неуспех при копиране на песните" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "_Изключване на разглеждането" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Редактиране на показваното" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "_Премахване на станция" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Филтриране по стойност на етикета" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer неуспя да зареди избраната песен." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Само този _жанр" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Опашка" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Запис" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "папка" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "Спис_ък с албуми" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Нова станция" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Внасяне на списък с песни" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Преименуване" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Внасяне на списък с песни" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Информация" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Внасяне на списък с песни" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Неуспех при внасяне на списъка" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Пропадна изтриването на <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Редактиране на етикетите" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Редактиране на етикетите" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Всички албуми" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "Пре_глед" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Етикет" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Неуспех при добавяне на песните" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Търсене" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "шаблон" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Запазване на редактираните стойности..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Оцветяване на _търсените фрази" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Фонотека" #: ../quodlibet/library/libraries.py:650 #, fuzzy msgid "Checking mount points" msgstr "точка на монтиране" #: ../quodlibet/library/libraries.py:660 #, fuzzy msgid "Scanning library" msgstr "Запазване на фонотеката" #: ../quodlibet/library/libraries.py:725 #, fuzzy, python-format msgid "Scanning %s" msgstr "Проверяване на %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Показване на про_граматични етикети" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "описание" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Стойност" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Редактор на музикални етикети" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Няма избрани песни." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "_Премахване на станция" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "_Премахване на станция" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Филтриране по стойност на етикета" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Филтриране по стойност на етикета" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Няма информация за времетраенето" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Неуспех при преименуване на файл." #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "_Премахване на станция" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Файл" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Показване на кратка информация за употреба" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> не е валидно местоположение." #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "непознат" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Подред" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "П_одред" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "Произв_олен" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "Произв_олен" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "П_овтаряне" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Една песен" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d секунда" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Няма открити станции." #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "Неуспех при създаването на папка" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "П_риставки" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Поддържани формати: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Аудио устройство: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Начало" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "липсва" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Време" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Име на отметка" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "ММ:СС" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Отметки" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Филтри" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "Н_икога не е слушано" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Топ 40" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Нова станция" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Произволен _жанр" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Произволен _артист" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Произволен _албум" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40те песни, които сте слушали най-много (може да са повече от 40, ако някой " "имат равен брой пускания)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "С_тойност:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Запазени стойности" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Запазване на редактираните стойности..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "Номера на песните" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "Спис_ък с албуми" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Без нагласяне на силата на звука" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "непознат" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Филтриране по стойност на етикета" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Файлове" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Изтриване на файлове" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "Преместване в _кошчето" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Преместване на %d/%d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "Неуспех при запазване на фонотеката" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Пропадна изтриването на <b>%s</b>." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Изтриване на %d/%d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Неуспех при изтриването на файл" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Пропадна изтриването на <b>%s</b>." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Изтегляния" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Размер" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "липсва от %d песен" msgstr[1] "липсва от %d песни" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "различно при %d песен" msgstr[1] "различно при %d песни" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Разделяне на _множество стойности" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Номерът на диска извън етикета за _албум" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "_Версията извън етикета за заглавието" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "_Аранжиментът извън етикета за артист" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Из_пълнителят извън етикета за артист" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Из_пълнителят извън етикета за артист" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "_Версията извън етикета за заглавието" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Добавяне на етикет" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Етикет:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Редактиране на етикетите" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Показване на про_граматични етикети" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Никога" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Неуспех при добавяне на етикет" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Неуспех при добавяне на песента" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Неуспех при добавяне на <b>%s</b>\n" "\n" "Текущо избраните файлове не поддържат множествени стойности." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Невалиден етикет" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Невалиден етикет <b>%s</b>\n" "\n" "Избраните в момента файлове не поддържат редакцията на този етикет." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Невалидна стойност" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Невалидна стойност: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Етикетът може да не е точен" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> претърпя промени, докато програмата вървеше. Запазването без " "опресняване на фонотеката може да презапише други промени по песента.\n" "\n" "Да се запази ли въпреки това?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Не може да се запази песента" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Запазването на <b>%s</b> пропадна. Файлът може би е само за четене, повреден " "или нямате права да го променяте." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "О_ще опции..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "П_риставки" #: ../quodlibet/qltk/exfalsowindow.py:267 #, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Настройки на Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Раз_деляне на:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Редактиране на етикети" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Папки" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Нова папка" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Избор на всички" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Нова папка" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Въведете име за новата папка:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Неуспех при създаването на папка" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Неуспех при изтриването на папка" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Песни" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Диск %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Песен номер %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Редактиране на показваното" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Няма избрани песни." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Няма песни" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Информация" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Текст на песен" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Продуцирано от %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "артист" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "артисти" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "изпълнители" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Никога" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d път" msgstr[1] "%d пъти" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "добавенa" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "последно слушана" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "Прослушвания" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "пропускания" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "оценка" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "времетраене" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Информация" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[невалидна кодировка]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "размер на файла" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "променян" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d избрана" msgstr[1] "%d избрани" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Песента е неналична" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Списък с песни" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d песен без албум" msgstr[1] "%d песни без албум" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Избор на дискография" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d песен без артист" msgstr[1] "%d песни без артист" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "албуми" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Общо времетраене:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Общ размер:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Файлове" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "Из_тегляне" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Редактиране на показваното" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Няма открит текст за тази песен." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Търсене на текст на песента..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Отказване от промените?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Етикетите бяха променени, но не бяха запазени. Ще запазите промените или ще " "се откажете от тях?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Никога" #: ../quodlibet/qltk/msg.py:86 #, fuzzy msgid "File exists" msgstr "Ф_айлова система" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Преименуване на файлове" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, fuzzy, python-format msgid "%d tasks running" msgstr "Quod Libet е стартиран" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Сменяне между Слушане и Пауза" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Сменяне между Слушане и Пауза" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Грешки на приставките" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "_Изключване на разглеждането" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "Р_ед на прослушване" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Редактиране на етикети" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Общ размер:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Няма открити приставки." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "П_риставки" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Показване на _грешки" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "Д_иск" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "Песен н_омер" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "групиране" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Алб_ум" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Файлово име" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Времетраене" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Автоматично прескачане до текущата песен" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Когато слушана песен се смени, автоматично да се селектира нея в списъка с " "песни" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Други:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Редактиране на показваното" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Видими колони" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Заглавието включва _версията" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Заглавието включва _версията" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Името на файла вклю_чва папката" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Настройки" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Списък на песните" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Видими колони" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Глобален филтър:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Търсене" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Разглеждане" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Когато слушана песен се смени, автоматично да се селектира нея в списъка с " "песни" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "_Оценка" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Спис_ък с албуми" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Паузиране на изпълнението" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "Без нагласяне на силата на звука" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "Без нагласяне на силата на звука" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "_Оценка" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "Запазване на оценките и броя на слушания" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Е-поща:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Оценките и броя на слушанията ще бъдат настроени за тази е-поща" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Отказване от промените?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Редактиране на етикетите" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Нова станция" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "Опресн_яване на фонотеката" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "Т_ърсене във фонотеката" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Проверка за промени във фонотеката Ви" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Пре_зареждане на фонотеката" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "" "Презареждане на всички песни от фонотеката ви (това може да отнеме много " "време)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Сканиране на пап_ки" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Няма песни" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Информация" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Опашка" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "Грешки на приставките" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "Р_азглеждане на фонотеката" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Превключване видимостта на главния прозорец" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Паузиране на изпълнението" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Избор на папки" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Неуспех при добавяне на песните" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> използва неподдържан протокол." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "П_рескачане към текущата песен" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Файл" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Песни" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Преглед" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Разглеждане" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Управление" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "Помощ" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "_Добавяне на папка..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "_Добавяне на файл..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Добавяне на местоположение" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Редактиране на отметки..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Спиране след тази песен" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Търсене" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Добавяне на местоположение" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Въведете местоположението на аудио файл:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Неуспех при добавяне на местоположението" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> не е валидно местоположение." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Добавяне на музика" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Добавяне на папка..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Слушане на музика" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Добавяне на файл..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Премахване на станция" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Оценка" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Заменяне на интервалите с долни черти" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Премахване на _несъвместимите с Windows символи" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Премахване на _диакритичните знаци" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Премахване на н_e-ASCII символите" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Преименуване на файлове" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "шаблон" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Запазване на редактираните стойности..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "Пре_глед" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Ново име" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Неуспех при преименуване на файл." #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Пропадна преименуването на <b>%s</b> на <b>%s</b>. Възможно е да има вече " "файл с такова име или да нямате привилегиите да създадете нов файл или да " "премахвате стария." #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "Показване на _грешки" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Продължаване" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Местоположението не е абсолютно" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Шаблона\n" "\t<b>%s</b>\n" "съдържа /, но не започва от главната папка (root folder). За да се избегнат " "зле именувани папки, направете шаблона да започва с / или ~/." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "Песните поставени в тези папки ще бъдат добавяни към фонотеката" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Избор на папки" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Запазени стойности" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Запазване на редактираните стойности..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "Спиране след тази песен" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Ограничаване:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Тежест" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Показване на оставащото време" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Текст на песен" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Фокусиране на програмата" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Прескачане в слушаната в момента песен" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Неуспех при добавяне на песните" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Неуспех при добавяне на песните" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Само този %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "Спис_ък с албуми" #: ../quodlibet/qltk/songlist.py:1095 #, fuzzy msgid "_Track Headers" msgstr "Номера на песните" #: ../quodlibet/qltk/songlist.py:1096 #, fuzzy msgid "_Album Headers" msgstr "Спис_ък с албуми" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1099 #, fuzzy msgid "_File Headers" msgstr "_Филтри" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Филтри" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Оцветяване на _търсените фрази" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Добавяне към _опашката" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "Премахване от фонотеката" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Замяна на _долните черти с интервали" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Етикети със регистър на заглавие" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Разделяне на _множество стойности" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Етикети от местоположението" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Етикетите заменят съществуващите" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Етикетите се добавят към съществуващите" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Шаблонът\n" "\t<b>%s</b>\n" "е невалиден. Възможно е да съдържа същия етикет два пъти или има " "небалансирани скоби (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Невалидни етикети" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Невалидни етикети <b>%s</b>\n" "\n" "Избраните в момента файлове не поддържат редактиране на тези етикети." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Шаблонът, който въведохте е невалиден. Уверете се, че сте въвели < и > " "като \\< и \\> и че етикетите са балансирани.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Редактиране на показваното" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Номера на песните" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Запо_чване от:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Общо песни:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Преслушване" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "Пре_глед" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "и още %d..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Запазване на песните, които сте променили." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Преместване на %d/%d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "точка на монтиране" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "местонахождение" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Списък с песни с името %s, вече съществува." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Показване на _обложките" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Ф_айлова система" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Показване на кратка информация за употреба" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Показване на версията на запазените права" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[опции]" #: ../quodlibet/util/__init__.py:182 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: Опцията \"%s\" не е разпозната." #: ../quodlibet/util/__init__.py:185 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: Опцията \"%s\" изисква аргумент." #: ../quodlibet/util/__init__.py:188 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: \"%s\" не е уникална представка." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d секунда" msgstr[1] "%d секунди" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Няма информация за времетраенето" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d секунда" msgstr[1] "%d секунди" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d минута" msgstr[1] "%d минути" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d час" msgstr[1] "%d часа" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d ден" msgstr[1] "%d дни" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d година" msgstr[1] "%d години" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Заглавие" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Датата трябва да бъде въведета във един от следните формати: ГГГГ, ГГГГ-ММ-" "ДД или ГГГГ-ММ-ДД ЧЧ:ММ:СС." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "" #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz идентификаторите трябва да са във формата UUID." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Неуспех при редактиране на песента" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Запазването на <b>%s</b> пропадна. Файлът може би е само за четене, повреден " "или нямате права да го променяте." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[невалидна кодировка]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "албум" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "аранжимент" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "аранжименти" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "аранжимент" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "автор" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "автори" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "композитор" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "композитори" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "композитор" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "диригент" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "диригенти" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "диригент" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "за контакт" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "авторски права" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "дата" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "описание" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "жанр" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "жанр" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "изпълнител" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "групиране" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "език" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "лиценз" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "местонахождение" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "текстописец" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "текстописци" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "текстописец" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "организация" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "заглавие" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "версия" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "интернет сайт" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "Артист на албума" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "диск" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "номер" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "каталожен номер" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "оригинална дата на издаване" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "оригинален албум" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "оригинален артист" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "дата на запис" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID в MusicBrainz на артиста" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID в MusicBrainz на песента" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "" #: ../quodlibet/util/tags.py:127 #, fuzzy msgid "MusicBrainz album status" msgstr "ID в MusicBrainz за артиста на албума" #: ../quodlibet/util/tags.py:128 #, fuzzy msgid "MusicBrainz album type" msgstr "ID в MusicBrainz на албума" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "ID в MusicBrainz на песента" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 #, fuzzy msgid "track gain" msgstr "номер" #: ../quodlibet/util/tags.py:133 #, fuzzy msgid "track peak" msgstr "номер" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 #, fuzzy msgid "album gain" msgstr "албум" #: ../quodlibet/util/tags.py:136 #, fuzzy msgid "album peak" msgstr "албум" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Настройки" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "дискове" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "песни" #: ../quodlibet/util/tags.py:145 #, fuzzy msgid "last started" msgstr "последно слушана" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "пълно име" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "точка на монтиране" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "човека" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "година" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "оригинална дата на издаване" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "Отметки" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "формат" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Сп_исъци с песни" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Разглеждане" #~ msgid "Unable to download lyrics." #~ msgstr "Неуспех при изтегляне на текстовете" #~ msgid "Remove all songs from the queue" #~ msgstr "Премахване на всички песни от опашката" #~ msgid "Watch this folder for new songs" #~ msgstr "Наблюдение на папката за нови песни" #~ msgid "Set or toggle the playback order" #~ msgstr "Промяна на реда на изпълнение" #, fuzzy #~ msgid "Combine tags with _multiple values" #~ msgstr "Разделяне на _множество стойности" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Неуспех при запазване на фонотеката" #, fuzzy #~ msgid "Unable to save iPod database" #~ msgstr "Неуспех при запазване на фонотеката" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "номер" #~ msgid "Shuffle" #~ msgstr "В разбъркан ред" #~ msgid "Weighted" #~ msgstr "Претеглен" #~ msgid "_Weighted" #~ msgstr "Пре_теглен" #~ msgid "_One Song" #~ msgstr "_Една песен" #~ msgid "Restart the playlist when finished" #~ msgstr "Започване наново списъка с песни след приключване" #, fuzzy #~ msgid "Disable Browser" #~ msgstr "_Изключване на разглеждането" #~ msgid "_Disable Browser" #~ msgstr "_Изключване на разглеждането" #, fuzzy #~ msgid "Force Write" #~ msgstr "Запис" #~ msgid "Filter on _Genre" #~ msgstr "Само този _жанр" #~ msgid "Filter on _Artist" #~ msgstr "Само този _артист" #~ msgid "Filter on Al_bum" #~ msgstr "Само този _албум" #~ msgid "_Music" #~ msgstr "_Музика" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Отметки" #~ msgid "Song _List" #~ msgstr "Списък с пес_ни" #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "Колелото на мишката сменя песента;\n" #~ "Shift и колелото на мишката променят силата на звука." #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Спиране след тази песен" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "и още %d..." #~ msgstr[1] "и още %d..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Номерът на диска извън етикета за _албум" #, fuzzy #~ msgid "Timeout" #~ msgstr "Време" #, fuzzy #~ msgid "Select an album" #~ msgstr "_Избор на всички" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Сп_исъци с песни" #~ msgid "Re_fresh Library" #~ msgstr "Опресн_яване на фонотеката" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Премахване на станция" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Неуспех при отваряне на файловете" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Невалидна стойност" #, fuzzy #~ msgid "command|filename" #~ msgstr "файлово име" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Търсене" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Употреба: %s %s" #~ msgid "_Download..." #~ msgstr "Из_тегляне..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Нова станция" #, fuzzy #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Пропадна изтриването на <b>%s</b>." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet вече е стартиран." #~ msgid "No song is currently playing." #~ msgstr "В момента не се слуша никаква песен." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Неуспех при писането към %s. Премахва се." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Редактиране на отметки..." #, fuzzy #~ msgid "_New Folder..." #~ msgstr "Нова папка..." #~ msgid "_Add to Playlist" #~ msgstr "_Добавяне към списък" #~ msgid "_Edit Display..." #~ msgstr "_Редактиране на показваното" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d станция" #~ msgid "_Order:" #~ msgstr "Р_ед:" #~ msgid "_Add a Location..." #~ msgstr "_Добавяне на местоположение..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "Номера на песните" #, fuzzy #~ msgid "People Headers" #~ msgstr "_Филтри" #, fuzzy #~ msgid "Album Headers" #~ msgstr "Спис_ък с албуми" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Филтри" #, fuzzy #~ msgid "File Headers" #~ msgstr "_Филтри" #, fuzzy #~ msgid "Production Headers" #~ msgstr "Номера на песните" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Етикет:" #, fuzzy #~ msgid "Warnings" #~ msgstr "_Оценка" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "Артист на албума" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "артисти" #, fuzzy #~ msgid "album (sort)" #~ msgstr "Артист на албума" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "изпълнители" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "изпълнители" #~ msgid "MusicBrainz album artist ID" #~ msgstr "ID в MusicBrainz за артиста на албума" #, fuzzy #~ msgid "errors" #~ msgstr "изпълнители" #~ msgid "Permanently delete this file?" #~ msgstr "Изтриване на файла за постоянно?" #~ msgid "Permanently delete these files?" #~ msgstr "Изтриване на файловете за постоянно?" #, fuzzy #~ msgid "Version:" #~ msgstr "версия" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "Грешки на приставките" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s не може да се добави към фонотеката Ви.\n" #~ "\n" #, fuzzy #~ msgid "No eject command found." #~ msgstr "Няма открити станции." #~ msgid "Unable to start web browser" #~ msgstr "Неуспех при стартирането на интернет браузър" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Не може да бъде открит интернет браузърът. Настройте променливата " #~ "$BROWSER или се уверете, че /usr/bin/sensible-browser съществува." #, fuzzy #~ msgid "Library Error" #~ msgstr "Разглеждане на фонотеката" #~ msgid "translator-credits" #~ msgstr "" #~ "Ростислав \"zbrox\" Райков <zbrox@i-space.org>\n" #~ "Проектът за превод на GNOME има нужда от\n" #~ "подкрепа. Научете повече за нас на http://gnome.cult.bg\n" #~ "Докладвайте за грешки на http://gnome.cult.bg/bugs" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Други колони, които да се показват, разделени от интервали" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "_Продължаване" #~ msgid "Search your library" #~ msgstr "Търсене из фонотеката" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Всички права запазени 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "Това е свободен софтуер; вижте изходния код за условията по копирането. " #~ "Няма НИКАКВА\n" #~ "гаранция; нито дори за ПРОДАВАЕМОСТ или ПРИГОДЕНОСТ ЗА НЯКАКВА ОПРЕДЕЛЕНА " #~ "ЦЕЛ.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Общ размер:" #~ msgid "Quod Libet Plugins" #~ msgstr "Приставки за Quod Libet" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Показва простите търсения в синьо, разширените в зелено и невалидните в " #~ "червено." #~ msgid "_Select" #~ msgstr "_Избор" #~ msgid "Separators for splitting tags" #~ msgstr "Разделители за разделяне на етикети" #~ msgid "Quod Libet Preferences" #~ msgstr "Настройки на Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Не е слушана _днес" #~ msgid "Not Played in a _Week" #~ msgstr "Не е слушана 1 _седмица" #~ msgid "Not Played in a _Month" #~ msgstr "Не е слушана 1 _месец" #~ msgid "B_ottom 40" #~ msgstr "Пос_ледните 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "40те песни, които сте слушали най-малко (може да са повече от 40, ако " #~ "някои имат равен брой пускания)" #~ msgid "gtk-media-next" #~ msgstr "Следваща" #~ msgid "gtk-media-previous" #~ msgstr "Предишна" #, fuzzy #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --refresh-library | --print-playing | control ]" #, fuzzy #~ msgid "Date" #~ msgstr "_Дата" #~ msgid "Choose New Stations" #~ msgstr "Избор на нови станции" #~ msgid "Add" #~ msgstr "Добавяне" #~ msgid "_Stations..." #~ msgstr "_Станции..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Затваряне на Quod Libet" #~ msgid "Unable to save library" #~ msgstr "Неуспех при запазване на фонотеката" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Неуспех при изпъление на песента" #~ msgid "Sort by title" #~ msgstr "Сортиране по заглавие" #~ msgid "Sort by artist" #~ msgstr "Сортиране по артист" #~ msgid "Lyrics provided by %s." #~ msgstr "Текстът е предоставен чрез %s" #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Няма открит текст на песента.\n" #~ "\n" #~ "Може да натиснете бутона \"Изтегляне\", за да се потърси текста в " #~ "Интернет. Също така може сами да въведете текста и да натиснете " #~ "\"Запазване\"." #~ msgid "part" #~ msgstr "част" #~ msgid "Opening audio device." #~ msgstr "Отваряне на аудио устройството." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d песни запазени" #~ msgid "MusicBrainz album ID" #~ msgstr "ID в MusicBrainz на албума" #~ msgid "Loaded song library." #~ msgstr "Заредена е фонотеката с песни." #~ msgid "Unable to open audio device" #~ msgstr "Неуспех при отваряне на аудио устройството" #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet не може да открие елемента на GStreamer 'filesrc'. Проверете " #~ "инсталацията си на GStreamer." #, fuzzy #~ msgid "C_opy album covers" #~ msgstr "Показване на _обложките" #~ msgid "Unable to retag multiple values" #~ msgstr "Неуспех при презаписването на множество стойности" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "Не се поддържа смяната на името на етикет с множествени стойности." #~ msgid "W: %s is not a QL song database." #~ msgstr "W: %s не е база данни за песни на Quod Libet" #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "Нагласяне на силата на звука за всяка песен (\"Радио\")" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "Нагласяне на силата на звука за всеки албум (\"Аудиофил\")" #~ msgid "_Volume Normalization" #~ msgstr "_Нормализиране на звука" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "Сканира се фонотеката Ви. Това може да отнеме няколко минути..\n" #~ "\n" #~ "%d презаредени песни\n" #~ "%d премахнати песни" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "Сканира се за нови песни и се добавят към фонотеката.\n" #~ "\n" #~ "%d добавени песни" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "M3U списъците не могат да се зареждат." #~ msgid "This station is already in your library." #~ msgstr "Зареждане, сканиране и запазване на фонотеката Ви" #~ msgid "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgstr "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "на <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Диск <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Песен номер <tracknumber>>>" #~ msgid "The library cannot be refreshed while Quod Libet is running." #~ msgstr "Фонотеката не може да бъде опреснена, докато Quod Libet върви." #~ msgid "Loading, scanning, and saving your library." #~ msgstr "Зареждане, сканиране и запазване на фонотеката Ви." #~ msgid "Rescan your library and exit" #~ msgstr "Сканиране наново на фонотеката и излизане." #~ msgid "" #~ "It looks like you are running Quod Libet right now. If you edit songs " #~ "also in Quod Libet's library while it is running, you may need to refresh " #~ "or re-add them.\n" #~ "\n" #~ "If you are not running Quod Libet, or are editing songs outside of its " #~ "library, you may ignore this warning." #~ msgstr "" #~ "Изглежда в момента Quod Libet е пуснат. Ако редактирате песни, които са " #~ "също въф фонотеката на Quod Libet, докато програмата върви, може да се " #~ "наложи да обновите фонотеката или да добавите песните наново.\n" #~ "\n" #~ "Ако Quod Libet не върви или редактирате песни извън фонотеката, може да " #~ "пренебрегнете това предупреждение." #~ msgid "GStreamer status %r != %r" #~ msgstr "Състояние на GStreamer %r != %r" #~ msgid "_Pane %d:" #~ msgstr "Пане_л %d:" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/ja.po����������������������������������������������������������������������������0000644�0001750�0001750�00000540176�13115512742�015330� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Japanese translations for PACKAGE package. # Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Yasushi Iwata <yasusii@lowlife.jp>, 2006. # msgid "" msgstr "" "Project-Id-Version: Quod Libet 0.23\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:35+0100\n" "Last-Translator: Yasushi Iwata <yasusii@lowlife.jp>\n" "Language-Team: Japanese\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "オーディオファイルのタグ編集" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "オーディオタグ・エディタ" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "オーディオファイルの再生、内容表示、編集ができます" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "ミュージックプレイヤー" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "タイトル" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "アーティスト(_A)" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "日付(_D)" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "ジャンル" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "レイティング(_R)" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "日付で並び換え" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "設定" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "アルバムリスト" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "アルバムリスト(_A)" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "全てのアルバム" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%dアルバム" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "アルバムのカバーを表示する(_c)" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "どのアルバムにも属さない曲" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%dトラック" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%dディスク" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "全てのアルバム" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "アルバムリストの設定" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "アルバムのカバーを表示する(_c)" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "場所" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "アルバムの表示" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "不明" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "新規フィード" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "オーディオフィードの場所を入力してください:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "オーディオフィード" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "オーディオフィード(_A)" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "ダウンロード(_D)" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "ファイルのダウンロード" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "ファイルのダウンロード" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "フィードを追加できません" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> を追加できませんでした。サーバがダウンしているか、もしくはオーディ" "オフィードの場所を間違えている可能性があります。" #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "ファイルの削除" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "ライブラリブラウザ" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d曲" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "不正なパターン" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "不明" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "複数の値に分割(_M)" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "カスタム(_C)" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "タグ" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "アルバムリストの設定" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "合計サイズ" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "合計サイズ" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "ペインブラウザの設定" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "アルバムのカバーを表示する(_c)" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "全てのアルバム" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "新しいラジオ局はありません" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "ファイルシステム" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "ファイルシステム(_F)" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "曲のコピーができません" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "選択されたファイルのソングリストまたはキューへのコピーに失敗しました。" #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "ライブラリへ追加(_A)" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "サポートしていないファイル形式です" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "ステーションリストに含められるのはそのラジオ局のプレイリストだけで、他局のリ" "ストや他局のプレイリストを含めることはできません。以下の場所は読み込みできま" "せんでした:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "ラジオ局を追加できません" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "インターネットラジオ" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "ファイルのダウンロード" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "新規ラジオ局" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "インターネットラジオ局の場所を入力してください:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "レイティング" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "新規ラジオ局(_N)" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "インターネットラジオ(_I)" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "新規ラジオ局" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "新規ラジオ局(_N)" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "新規ラジオ局" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "ラジオ局が見つかりません" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "%sにインターネットラジオ局が見つかりません。" #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "一覧にあるラジオ局は全てライブラリに登録されています。" #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "プレイリストへ追加(_A)" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "プレイリストから削除(_R)" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d局" #: ../quodlibet/browsers/media.py:36 #, fuzzy msgid "Device Properties" msgstr "プロパティ" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "デバイス:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "マウントされていません" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "マウントポイント" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "名前(_N)" #: ../quodlibet/browsers/media.py:135 #, fuzzy msgid "Media Devices" msgstr "オーディオデバイス: %s" #: ../quodlibet/browsers/media.py:136 #, fuzzy msgid "_Media Devices" msgstr "オーディオデバイス: %s" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 #, fuzzy msgid "_Eject" msgstr "イジェクト(_E)" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "プロパティ" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "名前の変更(_R)" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "使用中<b>%s</b>、利用可能<b>%s</b>" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "指定された場所 <b>%s</b> にアクセスできません。" #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>%s</b>の削除失敗。" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 #, fuzzy msgid "Unable to copy song" msgstr "曲のコピーができません" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "この曲を保存するための空き領域が不足しています" #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b>のコピーに失敗しました。" #: ../quodlibet/browsers/media.py:545 #, fuzzy msgid "Unable to delete songs" msgstr "曲を追加できません" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>%s</b>の削除失敗。" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "指定された場所 <b>%s</b> にアクセスできません。" #: ../quodlibet/browsers/media.py:579 #, fuzzy msgid "Unable to delete song" msgstr "曲の編集に失敗しました" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>%s</b>のイジェクト失敗。" #: ../quodlibet/browsers/media.py:597 #, fuzzy msgid "Unable to eject device" msgstr "ファイルを削除できませんでした。" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "ペインブラウザ" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "ペインブラウザ(_P)" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "全て選択(_A)" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "全て" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "ペインブラウザの設定" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "プレイリスト" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "プレイリスト(_P)" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "プレイリストから削除(_R)" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "インポート(_I)" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "新規プレイリスト" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "プレイリストをインポートできません" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod LibetではM3UとPLS形式のプレイリストしかインポートできません。" #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "プレイリストの名前を変更できません" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "プレイリストのインポート" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "新規プレイリスト(_N)" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "新規プレイリスト" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "ペインブラウザの設定" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "プレイリスト" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "フォルダ名を入力してください:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "プレイリストをインポートしています。\n" "\n" "%d/%d 曲を追加しました。" #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "検索結果の上限を設定(_L)" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "ライブラリの検索" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "ライブラリの検索(_S)" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "ペインブラウザ" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "検索" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "場所" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libetが起動していません。" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "ミュージックライブラリ/プレイヤー" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "場所" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "再生中の曲名を表示して終了" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "直ちに再生開始" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "次の曲へジャンプ" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "前の曲へジャンプ" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "再生開始" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "一時停止" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "再生/一時停止の切替" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "再生開始" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "音量を上げる" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "音量を下げる" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "プレイヤーの状態を表示" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "メインウィンドウを隠す" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "メインウィンドウを表示する" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "メインウィンドウの表示/非表示切り替え" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "起動中のプレイヤーにフォーカス" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "アクティブなフィルタを削除" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "ブラウザの無効化" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "現在のプレイリストを表示" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "キューの内容を表示" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "キューの内容を表示" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libetが起動していません。" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Quod Libetの終了" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "再生中の曲をシーク" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "再生/一時停止の切替" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "リピートのオン/オフまたは切替" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "音量のセット" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "オーディオライブラリの検索" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "ファイルの再生" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "ファイル名" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "再生中の曲をレイティング" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "現在のブラウザをセット" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "再生中の曲をレイティング" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "新しいブラウザを開く" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "キューの表示/非表示" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "メインソングリストの表示/非表示" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "ランダムな値でフィルタリング" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "タグ" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "タグの値でフィルタリング" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "ファイルまたはクエリの内容をキューに入れる" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "ファイル名" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 #, fuzzy msgid "Unqueue a file or query" msgstr "ファイルまたはクエリの内容をキューから削除" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: 不正な引数'%s'が指定されました。" #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: %s --help を試してみてください。" #: ../quodlibet/devices/_base.py:65 #, fuzzy msgid "Unknown Device" msgstr "不明なデバイス" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s'はユニークなプリフィックスではありません。" #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "不正な値" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "ファイル名のパターン(_F)" #: ../quodlibet/devices/storage.py:61 #, fuzzy msgid "Copy _album covers" msgstr "アルバムのカバーを表示する(_c)" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "使われていないカバーアートとディレクトリを削除(_R)" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "エラーの表示(_E)" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "説明" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "オーディオタグ・エディタ" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "ディレクトリ" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainzトラックID" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainzトラックID" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[不正なエンコーディング]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "タイトル" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "オーディオタグ・エディタ" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "タイトルの単語をキャピタライズする(_T)" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "ペインブラウザの設定" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "合計サイズ" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "ディスプレイの編集" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "ウェイト(_W)" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "ディスプレイの編集" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "プレビュー(_P)" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d秒" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "カスタム(_C)" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "プラグインのエラー" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "ミュージックプレイヤー" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "インターネットラジオ" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "レイティング(_R)" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "曲を保存できません" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "プラグインが見つかりません" #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "歌詞" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "検索条件をクリア" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "歌詞" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "場所" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "メインウィンドウを隠す" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "設定" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "パターン" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "パターン" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d曲" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "情報" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "パターン" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "場所" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "タイトル" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 #, fuzzy msgid "Show notifications" msgstr "新しいラジオ局はありません" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 #, fuzzy msgid "Song Notifications" msgstr "新しいラジオ局はありません" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "デバイス:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "名前(_N)" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "その他(_O)" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "アーティスト(_A)" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "ファイル名のパターン(_F)" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "アルバムでランダム選択(_b)" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "アルバム" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "ウェイト(_W)" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "アルバムでランダム選択(_b)" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "プレイリストのインポート" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "インポート(_I)" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "歌詞" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "再生中の曲はありません" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d曲" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "パターン" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "再生中の曲はありません" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "プレイリスト(_P)" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "プレイヤー" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "プレビュー(_P)" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "シャッフル(_S)" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "繰り返し(_R)" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "この曲の後で停止" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "新しいブラウザを開く" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "タグの編集(_T)" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "情報(_I)" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "プレイリスト" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "ディスプレイの編集" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "歌詞" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "歌詞" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "エラー" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "ファイル" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "プレビュー(_P)" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "アーティストでフィルタリング(_A)" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "カスタム(_C)" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "ジャンルでフィルタリング(_G)" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "アーティストでフィルタリング(_A)" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "オーディオフィード" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "オーディオフィードの場所を入力してください:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "プレイリストのインポート" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "インポート(_I)" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "ラジオ局が見つかりません" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "ファイル名のパターン(_F)" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "ファイル名のパターン(_F)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "プレイリストから削除(_R)" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "新規プレイリスト" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "最終再生日時" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "キュー(_Q)" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "なし" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "曲がありません" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "保存された値" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "名前の変更(_R)" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "ライブラリ" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "メインウィンドウを隠す" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "ファイル名" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "曲を保存できません" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "アルバムリスト" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "サイズ" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "検索" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "検索" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "アルバムリスト" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "ブックマークの編集(_E)" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "ブックマークの編集(_E)" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "ブックマーク" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz アルバム ID" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "ファイル名" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "ディスク(_D)" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "トラック" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "タイトル" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "アーティスト(_A)" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz アルバム ID" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "キュー(_Q)" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "検索" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "プラグインが見つかりません" #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "ブラウザ" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "フォルダを作成できません" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "名前の変更(_R)" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "不正なパターン" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "不正な値" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "カスタム(_C)" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "曲のコピーができません" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "ブラウザの無効化" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "ディスプレイの編集" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "タグの値でフィルタリング" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamerが選択された曲のロードに失敗しました。" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "ジャンルでフィルタリング(_G)" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "キュー(_Q)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "書き込み" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainzトラックID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "ディレクトリ" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "アルバムヘッダ(_A)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "新規ラジオ局(_N)" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "プレイリストのインポート" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "名前の変更(_R)" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "プレイリストのインポート" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "情報" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "プレイリストのインポート" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "プレイリストをインポートできません" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "<b>%s</b>のイジェクト失敗。" #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "タグの編集" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "タグの編集" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "全てのアルバム" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "プレビュー(_P)" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "タグ" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "曲を追加できません" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "検索" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "パターン" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "保存されている値を編集..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "検索文字列のカラー表示" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "ライブラリ" #: ../quodlibet/library/libraries.py:650 #, fuzzy msgid "Checking mount points" msgstr "マウントポイントを確認中" #: ../quodlibet/library/libraries.py:660 #, fuzzy msgid "Scanning library" msgstr "ソングライブラリ読み込み中" #: ../quodlibet/library/libraries.py:725 #, fuzzy, python-format msgid "Scanning %s" msgstr "%sをチェックしています" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "プログラマチックタグの表示(_p)" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "説明" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "値" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "オーディオタグ・エディタ" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "曲が選択されていません" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "タグの値でフィルタリング" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "タグの値でフィルタリング" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "時間情報なし" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "ファイル名を変更できません" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "ファイル" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "基本的な使い方を表示" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "指定された場所 <b>%s</b> にアクセスできません。" #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "不明" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "並び順" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "並び順(_I)" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "ランダム(_R)" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "ランダム(_R)" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "繰り返し(_R)" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "1曲だけ" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d秒" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "ラジオ局が見つかりません" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "フォルダを作成できません" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "プラグイン(_P)" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "サポートしているフォーマット: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "オーディオデバイス: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "曲の頭から再生" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "なし" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "時間" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "ブックマーク名" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "分:秒" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "ブックマーク" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "フィルタ(_F)" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "まだ1度も再生していない曲(_N)" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "上位40曲(_T)" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "新規ラジオ局" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "ジャンルでランダム選択(_G)" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "アーティストでランダム選択(_A)" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "アルバムでランダム選択(_b)" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "再生回数の上位40曲(組になっているものがある場合40曲以上が選択される場合もあり" "ます)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "値(_V)" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "保存された値" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "保存されている値を編集..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "トラック番号ヘッダ(_T)" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "アルバムヘッダ(_A)" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "リプレイの度に音量調整をする(_R)" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "不明" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "タグの値でフィルタリング" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "ファイル" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "ファイルの削除" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "ゴミ箱へ移動する(_M)" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "%d/%d移動中。" #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "ライブラリの保存に失敗しました" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "<b>%s</b>のイジェクト失敗。" #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "%d/%d 削除中。" #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "ファイルを削除できませんでした。" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "<b>%s</b>の削除失敗。" #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "ダウンロード" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "サイズ" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "%d曲が欠落しています" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "%d曲の内容がそれぞれ異なっています" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "複数の値に分割(_M)" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "albumからdiscを分離(_A)" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "titleからversionを分離(_V)" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "artisitからarrangerを分離(_t)" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "artistからperformer を分離(_P)" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "artistからperformer を分離(_P)" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "titleからversionを分離(_V)" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "タグの追加" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "タグ(_T)" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "タグの編集" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "プログラマチックタグの表示(_p)" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "なし" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "タグを追加できません" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "曲を追加できません" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" " <b>%s</b> を追加できません。\n" "\n" "選択されているファイルは複数のタグをサポートしていません。" #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "不正なタグ" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "不正なタグ <b>%s</b>\n" "\n" "選択されているファイルはこのタグをサポートしていません。" #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "不正な値" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "不正な値: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "タグが正しくない可能性があります" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "プログラム動作中に<b>%s</b>の内容が変更されました。ライブラリをリフレッシュせ" "ずに保存すると、この曲に対する他の修正内容を上書きしてしまう可能性がありま" "す。\n" "それでも保存を実行しますか? " #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "曲を保存できません" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "<b>%s</b>の保存に失敗しました。ファイルが読み取り専用になっている、あるいは破" "損している、またはあなたにファイル編集の権限が与えられていない可能性がありま" "す。" #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "ほかのオプション(_M)" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "プラグイン(_P)" #: ../quodlibet/qltk/exfalsowindow.py:267 #, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falsoの設定" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "タグの分割に用いる文字(_o)" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "タグの編集" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "フォルダ" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "新規フォルダ" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "全て選択(_S)" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "新規フォルダ" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "フォルダ名を入力してください:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "フォルダを作成できません" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "フォルダを削除できません" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "曲" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "ディスク %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "トラック %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "ディスプレイの編集" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "曲が選択されていません" #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "曲がありません" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "情報" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "歌詞" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "プロデュース %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "アーティスト" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "アーティスト" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "演奏者" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "なし" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d 回" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "登録日時" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "最終再生日時" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "再生回数" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "スキップ回数" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "レイティング" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "時間" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "情報" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[不正なエンコーディング]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "ビットレート" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "サイズ" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "修正日時" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d曲選択済み" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "トラック情報が取得できません" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "トラックリスト" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d曲にアルバム情報がありません" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "選択済みディスコグラフィ" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d曲にアーティスト情報がありません" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "アルバム" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "合計時間" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "合計サイズ" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "ファイル" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "ダウンロード(_D)" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "ディスプレイの編集(_E)" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "この曲の歌詞は見つかりませんでした。" #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "歌詞を検索中..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "タグの変更を破棄しますか?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "タグが変更されましたが、まだ保存されていません。保存しますか?それとも元に戻" "して変更を破棄しますか?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "なし" #: ../quodlibet/qltk/msg.py:86 #, fuzzy msgid "File exists" msgstr "同名のファイルが存在します" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "ファイル名の変更" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "再生/一時停止の切替" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "再生/一時停止の切替" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "プラグインのエラー" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "ブラウザの無効化" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "再生順(_O)" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "タグの編集" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "合計サイズ" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "プラグインが見つかりません" #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "プラグイン(_P)" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "エラーの表示(_E)" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "ディスク(_D)" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "トラック(_T)" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "グループ" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "アルバム(_b)" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "ファイル名(_F)" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "時間(_L)" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "再生中の曲へ自動的にジャンプする(_J)" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "再生する曲が変わったときにソングリストをスクロールさせます" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "その他(_O)" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "ディスプレイの編集(_E)" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "表示するカラム" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "タイトルにバージョンを含める(_v)" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "タイトルにバージョンを含める(_v)" #: ../quodlibet/qltk/prefs.py:108 #, fuzzy msgid "Album includes _disc subtitle" msgstr "アルバムにパートを含める(_p)" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "ファイル名にフォルダ名を含める(_f)" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "設定" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "ソングリスト" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "表示するカラム" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "グローバルに適用するフィルタ(_G)" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "検索" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "ブラウザ" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "再生する曲が変わったときにソングリストをスクロールさせます" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "レイティング(_R)" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "アルバムリスト" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "一時停止" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "ボリュームゲイン(dB)" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "ボリュームゲイン(dB)" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "リプレイの度に音量調整をする(_R)" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "リプレイの度に音量調整をする(_R)" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "レイティング(_R)" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "レイティングと再生回数を保存する" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "メールアドレス(_E)" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "レイティングと再生回数はこのメールアドレスにセットされます" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "タグの変更を破棄しますか?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "タグの編集" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "新規ラジオ局(_N)" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "ライブラリの再表示(_f)" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "ライブラリの検索(_S)" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "ライブラリの変更内容をチェックします" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "ライブラリの再読込(_l)" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "ライブラリの再読込(この処理はやや時間がかかるかもしれません)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "スキャンするディレクトリ(_D)" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "曲がありません" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "プロパティ" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "キュー(_Q)" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "プラグインのエラー" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d曲(%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "ライブラリの参照(_B)" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "メインウィンドウの表示/非表示切り替え" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "一時停止" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "ディレクトリの選択" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "曲を追加できません" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b>で使われているプロトコルをサポートしていません。" #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "再生中の曲にジャンプ(_J)" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "ファイル" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "曲" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "表示(_V)" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "ブラウザ" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "操作(_C)" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "ヘルプ(_H)" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "フォルダの追加(_A)" #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "ファイルの追加(_A)" #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "場所の追加" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "ブックマークの編集(_E)" #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "この曲の後で停止" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "検索" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "場所の追加" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "オーディオファイルのある場所を入力してください:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "場所の追加ができません" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "指定された場所 <b>%s</b> にアクセスできません。" #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "ミュージックの追加" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "フォルダの追加(_A)" #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "ミュージックプレイヤー" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "ファイルの追加(_A)" #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "ラジオ局の削除(_R)" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "レイティング(_R)" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "スペースをアンダースコアに置き換える(_u)" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Windowsと互換性のない文字を削除する(_W)" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "発音記号を削除する" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "非 ASCII 文字を削除する" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "ファイル名の変更" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "パターン" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "保存されている値を編集..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "プレビュー(_P)" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "新しい名前" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "ファイル名を変更できません" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "<b>%s</b>から<b>%s</b>への名前変更に失敗しました。変更先のファイルが既に存在" "する、新規ファイルを作成する権限がない、旧ファイルを削除する権限がないなどの" "可能性があります。" #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "エラーの表示(_E)" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "続行する(_C)" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "パス名が絶対パスになっていません" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "パターン\n" " <b>%s</b>\n" "に /が含まれていますが、ルートとなる位置を示していません。パターンを/か~/から" "始め、ルート位置を特定してください。" #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "入力されたフォルダをライブラリに追加します(複数入力するときは ':' で区切る)" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "ディレクトリの選択" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "保存された値" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "保存されている値を編集..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "この曲の後で停止" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "検索結果の上限(_L)" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "ウェイト(_W)" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "残り時間を表示" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "歌詞" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "起動中のプレイヤーにフォーカス" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "再生中の曲をシーク" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "曲を追加できません" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "曲を追加できません" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "%sでフィルタリング(_F)" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "アルバムヘッダ(_A)" #: ../quodlibet/qltk/songlist.py:1095 #, fuzzy msgid "_Track Headers" msgstr "トラック番号ヘッダ(_T)" #: ../quodlibet/qltk/songlist.py:1096 #, fuzzy msgid "_Album Headers" msgstr "アルバムヘッダ(_A)" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Peopleヘッダ" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Dateヘッダ" #: ../quodlibet/qltk/songlist.py:1099 #, fuzzy msgid "_File Headers" msgstr "_Fileヘッダ" #: ../quodlibet/qltk/songlist.py:1100 #, fuzzy msgid "_Production Headers" msgstr "_Productionヘッダ" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Customizeヘッダ" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "検索文字列のカラー表示" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "キューへ追加(_Q)" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "デバイスへコピー(_C)" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "プレイリストから削除(_R)" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "アンダースコアをスペースに置き換える(_u)" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "タイトルの単語をキャピタライズする(_T)" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "複数の値に分割する(_v)" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "パス名からタグへの変換" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "既存のタグを置き換える" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "既存のタグに追加する" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "不正なパターンが入力されました。\n" " <b>%s</b>\n" "同じタグが2度使われているか、ブラケットの開始、終了の対応(< / >)が取れ" "ていない可能性があります。" #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "不正なタグ" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "不正なタグ <b>%s</b>\n" "\n" "選択されたファイルは上記のタグをサポートしていません。" #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "入力されたパターンが不正です。< と > はそれぞれ \\< や \\> のよう" "に入力し、タグの開始と終了関係を保つように入力してください。\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "ディスプレイの編集" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "トラック番号" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "開始番号(_m)" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "合計トラック数(_T)" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "プレイヤー" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "プレビュー(_P)" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "変更した曲を保存しています。" #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "%d/%d移動中。" #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "マウントポイントを確認中" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "場所" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "プレイリスト%sは既に存在します。" #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "アルバムのカバーを表示する(_c)" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "ファイルシステム" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "基本的な使い方を表示" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "バージョンと著作権情報を表示" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "" #: ../quodlibet/util/__init__.py:182 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: オプション'%s'は認識できません。" #: ../quodlibet/util/__init__.py:185 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: オプション'%s'には引数が必要です。" #: ../quodlibet/util/__init__.py:188 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: '%s'はユニークなプリフィックスではありません。" #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d秒" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "時間情報なし" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d秒" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d分" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d時間" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d日" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d年" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "タイトル" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "日付は'YYYY'、'YYYY-MM-DD'または'YYYY-MM-DD HH:MM:SS'の形式で入力してくださ" "い。" #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "リプレイゲインは'x.yy dB'の形式で入力してください。" #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "リプレイゲインのピークは 'x.yy' の形式で入力してください。" #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz IDはUUID形式でなくてはなりません。" #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainzリリースステータスは'official'、'promotional'、'bootleg'のいずれか" "でなくてはなりません。" #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "曲の編集に失敗しました" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "<b>%s</b>の保存に失敗しました。ファイルが読み取り専用になっている、あるいは破" "損している、またはあなたにファイル編集の権限が与えられていない可能性がありま" "す。" #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[不正なエンコーディング]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "アルバム" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "アレンジャー" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "アレンジャー" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "アレンジャー" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "著作者" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "著作者" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "作曲者" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "作曲者" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "作曲者" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "指揮者" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "指揮者" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "指揮者" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "連絡先" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "著作権" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "日時" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "説明" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "ジャンル" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "ジャンル" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "演奏者" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "グループ" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "言語" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "ライセンス" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "場所" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "作詞者" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "作詞者" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "作詞者" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "組織" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "タイトル" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "バージョン" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "ウェブサイト" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "アルバムアーティスト" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "ディスク" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "トラック" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "レーベルID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "オリジナルリリース日時" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "オリジナルアルバム" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "オリジナルアーティスト" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "録音日時" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "リリース国" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainzトラックID" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainzトラックID" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainzトラックID" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBarainzアーティストID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainzトラックID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "" #: ../quodlibet/util/tags.py:127 #, fuzzy msgid "MusicBrainz album status" msgstr "MusicBrainzアルバムアーティストID" #: ../quodlibet/util/tags.py:128 #, fuzzy msgid "MusicBrainz album type" msgstr "MusicBrainz アルバム ID" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainzトラックID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "トラックのゲイン" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "トラックのピーク" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "アルバムのゲイン" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "アルバムのピーク" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "設定" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "ディスク" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "トラック" #: ../quodlibet/util/tags.py:145 #, fuzzy msgid "last started" msgstr "最終再生開始日時" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "フルネーム" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "マウントポイント" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "ピープル" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "年" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "オリジナルリリース日時" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "ブックマーク" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "フォーマット" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "プレイリスト" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "ブラウザ" #~ msgid "Unable to download lyrics." #~ msgstr "歌詞のダウンロードに失敗しました。" #~ msgid "Remove all songs from the queue" #~ msgstr "キューの曲をすべて削除" #~ msgid "Watch this folder for new songs" #~ msgstr "このフォルダの新しい曲をチェックする" #~ msgid "Set or toggle the playback order" #~ msgstr "再生順のセットまたは切替" #~ msgid "Uninitialized iPod" #~ msgstr "初期化されていない iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "iPodに空のデータベースを新規作成しますか?" #~ msgid "_Volume Gain (dB):" #~ msgstr "ボリュームゲイン(dB)" #, fuzzy #~ msgid "Combine tags with _multiple values" #~ msgstr "複数の値に分割する(_v)" #~ msgid "Model:" #~ msgstr "モデル" #~ msgid "Capacity:" #~ msgstr "容量" #~ msgid "Firmware:" #~ msgstr "ファームウェア" #, fuzzy #~ msgid "Removing orphaned iPod track" #~ msgstr "警告: 関連付けされていない iPod トラックを削除します" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "ライブラリの保存に失敗しました" #, fuzzy #~ msgid "Unable to save iPod database" #~ msgstr "ライブラリの保存に失敗しました" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "トラックのピーク" #~ msgid "Shuffle" #~ msgstr "シャッフル" #~ msgid "Weighted" #~ msgstr "ウェイト順" #~ msgid "_Weighted" #~ msgstr "ウェイト順(_W)" #~ msgid "_One Song" #~ msgstr "1曲のみ(_O)" #~ msgid "Restart the playlist when finished" #~ msgstr "終了したときにプレイリストをリスタートする" #~ msgid "Disable Browser" #~ msgstr "ブラウザの無効化" #~ msgid "_Disable Browser" #~ msgstr "ブラウザの無効化(_D)" #, fuzzy #~ msgid "Force Write" #~ msgstr "書き込み" #~ msgid "Filter on _Genre" #~ msgstr "ジャンルでフィルタリング(_G)" #~ msgid "Filter on _Artist" #~ msgstr "アーティストでフィルタリング(_A)" #~ msgid "Filter on Al_bum" #~ msgstr "アルバムでフィルタリング(_b)" #~ msgid "_Music" #~ msgstr "ミュージック(_M)" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "ブックマーク" #~ msgid "Song _List" #~ msgstr "ソングリスト(_L)" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "この曲の後で停止" #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "albumからdiscを分離(_A)" #, fuzzy #~ msgid "Timeout" #~ msgstr "時間" #, fuzzy #~ msgid "Select an album" #~ msgstr "全て選択(_A)" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "プレイリスト" #~ msgid "Re_fresh Library" #~ msgstr "ライブラリの再表示(_f)" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "ラジオ局の削除(_R)" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "ファイルのオープンに失敗しました" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "不正な値" #, fuzzy #~ msgid "heading|Search" #~ msgstr "検索" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "使い方: %s %s" #~ msgid "_Download..." #~ msgstr "ダウンロード(_D)" #, fuzzy #~ msgid "_New Station..." #~ msgstr "新規ラジオ局(_N)" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "<b>%s</b>を上書きしますか?" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet は既に起動しています。" #~ msgid "No song is currently playing." #~ msgstr "現在再生中の曲はありません。" #~ msgid "Unable to write to %s. Removing it." #~ msgstr "%sに書き込みできないため、削除します。" #~ msgid "_Edit Bookmarks..." #~ msgstr "ブックマークの編集(_E)" #, fuzzy #~ msgid "_New Folder..." #~ msgstr "新規フォルダ(_N)" #~ msgid "_Add to Playlist" #~ msgstr "プレイリストへ追加(_A)" #~ msgid "_Edit Display..." #~ msgstr "ディスプレイの編集(_E)" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d局" #~ msgid "_Add a Location..." #~ msgstr "場所の追加(_A)" #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Customizeヘッダ" #, fuzzy #~ msgid "Track Headers" #~ msgstr "トラック番号ヘッダ(_T)" #, fuzzy #~ msgid "People Headers" #~ msgstr "_Peopleヘッダ" #, fuzzy #~ msgid "Album Headers" #~ msgstr "アルバムヘッダ(_A)" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Dateヘッダ" #, fuzzy #~ msgid "File Headers" #~ msgstr "_Fileヘッダ" #, fuzzy #~ msgid "Production Headers" #~ msgstr "_Productionヘッダ" #, fuzzy #~ msgid "Tag:" #~ msgstr "タグ(_T)" #, fuzzy #~ msgid "Warnings" #~ msgstr "レイティング(_R)" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "アルバムアーティスト" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "アーティスト" #, fuzzy #~ msgid "album (sort)" #~ msgstr "アルバムアーティスト" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "演奏者" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "演奏者" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainzアルバムアーティストID" #, fuzzy #~ msgid "errors" #~ msgstr "エラー" #~ msgid "Permanently delete this file?" #~ msgstr "このファイルを完全に削除しますか?" #~ msgid "Permanently delete these files?" #~ msgstr "これらのファイルを完全に削除しますか?" #, fuzzy #~ msgid "Version:" #~ msgstr "バージョン" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "プラグインのエラー" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s をライブラリに追加できませんでした。\n" #~ "\n" #, fuzzy #~ msgid "No eject command found." #~ msgstr "ラジオ局が見つかりません" #~ msgid "Unable to start web browser" #~ msgstr "webブラウザを起動できません" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "webブラウザが見つかりません。環境変数$BOWSERを設定するか、/usr/sbin/" #~ "sensible-browserが存在することを確認してください。" #, fuzzy #~ msgid "Library Error" #~ msgstr "ライブラリブラウザ" #, fuzzy #~ msgid "_Output device:" #~ msgstr "デバイスへコピー(_C)" #~ msgid "translator-credits" #~ msgstr "Yasushi Iwata <yasusii@lowlife.jp>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "表示したいカラム名をスペースで区切って入力します" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "続行する(_C)" #~ msgid "Search your library" #~ msgstr "ライブラリを検索します" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "合計サイズ" #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet プラグイン" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "単純な検索は青、詳細な検索は緑、間違った入力内容は赤で表示します" #~ msgid "_Select" #~ msgstr "フォルダの選択(_S)" #~ msgid "Separators for splitting tags" #~ msgstr "タグを分割するときの区切り文字" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libetの設定" #~ msgid "Not Played To_day" #~ msgstr "この1日再生していない曲(_d)" #~ msgid "Not Played in a _Week" #~ msgstr "この1週間再生していない曲(_W)" #~ msgid "Not Played in a _Month" #~ msgstr "この1ヶ月再生していない曲(_M)" #~ msgid "B_ottom 40" #~ msgstr "下位40曲(_B)" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "再生回数の下位40曲(組になっているものがある場合40曲以上が選択される場合も" #~ "あります)" #, fuzzy #~ msgid "Date" #~ msgstr "日付(_D)" #~ msgid "Choose New Stations" #~ msgstr "新しいラジオ局を選択してください" #~ msgid "Add" #~ msgstr "追加" #, fuzzy #~ msgid "Bitrate" #~ msgstr "ビットレート" #~ msgid "_Stations..." #~ msgstr "ラジオ局(_S)" #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Quod Libetの終了" #~ msgid "Unable to save library" #~ msgstr "ライブラリの保存に失敗しました" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "曲の再生ができません" #~ msgid "Sort by title" #~ msgstr "タイトルで並び換え" #~ msgid "Sort by artist" #~ msgstr "アーティストで並び換え" #~ msgid "Lyrics provided by %s." #~ msgstr "歌詞の提供元 %s" #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "歌詞が見つかりません。\n" #~ "\n" #~ "ダウンロードボタンをクリックすると歌詞のオンライン検索を実行します。また、" #~ "自分で歌詞を入力して保存することもできます。" #~ msgid "part" #~ msgstr "パート" #~ msgid "Opening audio device." #~ msgstr "オーディオデバイスのオープン中です。" #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d 曲を保存しました" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainzアルバムID" #~ msgid "Loaded song library." #~ msgstr "ソングライブラリの読み込み" #~ msgid "Unable to open audio device" #~ msgstr "オーディオデバイスのオープンに失敗しました" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libetは'autosink'と'%(sink)s' ドライバへのアクセスに失敗しました。~/." #~ "quodlibet/configの\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "を編集してGStreamerのパイプラインを変更してください。" #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod LibetはGStreamerの'filesrc'要素を見つけられませんでした。GStreamerの" #~ "インストール状態を確認してください。" #~ msgid "Unable to retag multiple values" #~ msgstr "複数の値によるタグの付け直しはできません" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "複数の値を持つタグ名の変更はサポートされていません。" #~ msgid "W: %s is not a QL song database." #~ msgstr "警告: %sはQuod Libetのデータベースではありません" #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "曲単位の(\"Radio\")音量調整" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "アルバム単位の(\"Audiophile\")音量調整" #~ msgid "_Volume Normalization" #~ msgstr "音量の均一化" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "ライブラリをスキャンしています。この処理には数分かかるかもしれません。\n" #~ "\n" #~ "%d曲を再読込\n" #~ "%d曲を削除" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "新しい曲をスキャンしてライブラリに追加しています。\n" #~ "\n" #~ "%d曲を追加しました" #, fuzzy #~ msgid "Add Custom Header" #~ msgstr "カスタムヘッダの追加" #, fuzzy #~ msgid "_Header:" #~ msgstr "ヘッダ(_H)" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "M3Uプレイリストを読み込めません。" #~ msgid "This station is already in your library." #~ msgstr "このラジオ局は既にライブラリに登録されています。" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/lv.po����������������������������������������������������������������������������0000644�0001750�0001750�00000542755�13115512742�015364� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Einars Sprugis <einars8@gmail.com>, 2010. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2010-03-30 10:12+0300\n" "Last-Translator: Einars Sprugis <einars8@gmail.com>\n" "Language-Team: Latvian <locale@laka.lv>\n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" "X-Generator: Lokalize 1.0\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Rediģē tagus jūsu audio failos" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Audio tagu redaktors" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Atskaņo, pārlūko vai rediģē jūsu audio kolekciju" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Mūzikas atskaņotājs" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Nosaukums" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Mākslinieks" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Datums" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "Žanrs" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Vērtējums" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "_Kārtot pēc:" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Iestatījumi" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Albumu saraksts" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Albumu saraksts" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Visi albumi" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d albums" msgstr[1] "%d albumi" msgstr[2] "%d albumu" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Rādīt albumu _vākus" msgstr[1] "Rādīt albumu _vākus" msgstr[2] "Rādīt albumu _vākus" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Dziesmas nav albumā" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d celiņš" msgstr[1] "%d celiņi" msgstr[2] "%d celiņu" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disks" msgstr[1] "%d diski" msgstr[2] "%d disku" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Visi albumi" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Albumu saraksta iestatījumi" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Rādīt albumu _vākus" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Iegultajā _meklēšanā tiek iekļauti cilvēki" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[opcijas]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Albuma attēlojums" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Nezināms" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Jauna barotne" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Ievadiet audio barotnes adresi:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Audio barotnes" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Audio barotnes" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "Lejupielā_dēt" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Lejupielādēt failus" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Lejupielādēt failu" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Neizdevās pievienot barotni" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> neizdevās pievienot. Iespējams, nedarbojas serveris, vai arī " "ievadītā adrese nav audio barotne." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "_Atsvaidzināt bibliotēku" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Dzēst failus" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Pašreizējā audio aizmugure neatbalsta URL, audio barotņu pārlūks tiks " "atslēgts." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Bibliotēkas pārlūks" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d dziesma" msgstr[1] "%d dziesmas" msgstr[2] "%d dziesmu" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Nederīgs paraugs" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Nezināms" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Sadalīt _vairākās vērtībās" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Pielāgots" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Vērtējums" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tags" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Albumu saraksta iestatījumi" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Kopējais izmērs:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Kopējais izmērs:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Sadalītā pārlūka iestatījumi" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Rādīt albumu _vākus" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Visi albumi" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "organizācija" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Failu sistēma" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Failu sistēma" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Neizdevās pārkopēt dziesmas" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Izvēlētie faili nevar tikt pārkopēti uz citiem dziesmu sarakstiem vai rindu." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "Pievienot bibliotēk_ai" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Neatbalstīts faila tips" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Staciju saraksti var saturēt tikai staciju adreses, nevis citus staciju " "sarakstus vai repertuārus. Neizdevās ielādēt šādas stacijas:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Neizdevās pievienot staciju" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Interneta radio" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Lejupielādēt failus" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Jauna stacija" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Ievadiet interneta radiostacijas adresi:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "vērtējums" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "Jau_na stacija" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Interneta radio" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Jauna stacija" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "Jau_na stacija" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Jauna stacija" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 #, fuzzy msgid "No Category" msgstr "Bez kategorijas" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Nav atrasta neviena stacija" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Netika atrasta neviena interneta radiostacija ar adresi %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Visas sarakstā esošas stacijas jau ir jūsu bibliotēkā." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "Pievienot repertuār_am" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "Izņemt no _repertuāra" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d stacija" msgstr[1] "%(count)d stacijas" msgstr[2] "%(count)d staciju" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Ierīces īpašības" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Ierīce:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Nav piemontēta" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Montēšanas punkts:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Nosaukums:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Multivides ierīces" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Multivides ierīces" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "Izgrūz_t" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Īpašības" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "Pā_rdēvēt" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> izmantoti, <b>%s</b> pieejami" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nav pievienots." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopē <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Neizdevās pārkopēt dziesmu" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Nav pietiekami daudz brīvas vietas šajai dziesmai." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nevarēja tikt pārkopēta." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Neizdevās izdzēst dziesmas" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Dzēš <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> nevarēja tikt izdzēsta." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Neizdevās izdzēst dziesmu" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Neizdevās izgrūzt <b>%s</b>." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Neizdevās izgrūzt ierīci" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "Nav ierīču aizmugures, multivides ierīču pārlūks atslēgts." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Sadalītais pārlūks" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "Sadalītais _pārlūks" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Iezīmēt visus" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Visi" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Sadalītā pārlūka iestatījumi" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Repertuāri" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "Re_pertuāri" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Izņemt no _repertuāra" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importēt" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Jauns repertuārs" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Neizdevās importēt repertuāru" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet var importēt repertuārus tikai M3U un PLS formātā." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Neizdevās pārdēvēt repertuāru" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importēt repertuāru" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "Jau_ns repertuārs" #: ../quodlibet/browsers/playlists/menu.py:86 #, fuzzy, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" "Vai vēlaties turpināt?" msgstr[1] "" "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" "Vai vēlaties turpināt?" msgstr[2] "" "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" "Vai vēlaties turpināt?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Jauns repertuārs" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Sadalītā pārlūka iestatījumi" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Repertuāri" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Ievadiet jaunās mapes nosaukumu:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importē repertuāru.\n" "\n" "%(current)d/%(total)d dziesmas pievienotas." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Limitēt rezultātus" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Meklēt bibliotēkā" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Meklēt bibliotēkā" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Sadalītais pārlūks" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Meklēt" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "vieta" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet nav palaists." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "mūzikas bibliotēka un atskaņotājs" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[opcijas]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Izdrukā pašreiz atskaņoto dziesmu un iziet" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Nekavējoties uzsāk atskaņošanu" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Pāriet uz nākamo dziesmu" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Pāriet uz iepriekšējo dziesmu" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Sākt atskaņošanu" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pauzēt atskaņošanu" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Pārslēgt atskaņošanas/pauzes režīmu" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Sākt atskaņošanu" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Palielināt skaļumu" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Samazināt skaļumu" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Izdrukāt atskaņotāja statusu" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Slēpt galveno logu" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Rādīt galveno logu" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Pārslēgt galvenā loga redzamību" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Fokusēties uz darbojošos atskaņotāju" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Noņemt aktīvos pārlūka filtrus" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Atsvaidzināt un pārskenēt bibliotēku" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Atslēgt pārlūku" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Izdrukāt pašreizējo repertuāru" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Izdrukāt rindas saturu" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Izdrukāt rindas saturu" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet nav palaists." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Iziet no Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Meklēt pašreizējā dziesmā" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Pārslēgt atskaņošanas/pauzes režīmu" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Izslēgt, ieslēgt vai pārslēgt atkārtošanu" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Iestatīt skaļumu" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Meklēt jūsu audio bibliotēkā" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "vaicājums" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Atskaņot failu" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "faila nosaukums" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Novērtēt pašreiz atskaņoto dziesmu" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Iestatīt pašreizējo pārlūku" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Novērtēt pašreiz atskaņoto dziesmu" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Atvērt jaunu pārlūku" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Rādīt vai slēpt rindu" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Rādīt vai slēpt galveno dziesmu sarakstu" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtrēt pēc nejaušas vērtības" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tags" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtrēt pēc taga vērtības" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tags=vērtība" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Ierindot failu vai vaicājumu" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "faila nosaukums" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Atrindot failu vai vaicājumu" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Nederīgs arguments priekš '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Mēģiniet %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Nezināma ierīce" #: ../quodlibet/devices/__init__.py:32 #, fuzzy, python-format msgid "Could not import %s, which is needed for device support." msgstr "Neizdevās importēt dbus-python, kas ir nepieciešams ierīču atbalstam." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r nav atbalstīta ierīce." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: neizdevās atrast media-player-info." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Inicializē ierīces aizmuguri." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Mēģina '%s'" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Neizdevās pieslēgties ierīces aizmugurei." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Ierīces aizmugure inicializēta." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Faila nosaukuma paraugs:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopēt _albumu vākus" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Dzēst nevajadzīgos vākus un mapes" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Gadījās kļūda" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Ignorēt vis_as kļūdas" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "apraksts" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "audio tagu redaktors" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "mape" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz celiņa ID" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz celiņa ID" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Nederīgs kodējums]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Nosaukums" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Audio tagu redaktors" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_Tagu reģistrs ir tāds pats, kā nosaukuma reģistrs" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Sadalītā pārlūka iestatījumi" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Kopējais izmērs:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Rediģēt rādāmo" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "S_vars" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 #, fuzzy msgid "_Outline" msgstr "_Izvades līnija:" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Rediģēt rādāmo" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Priekšskats" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "Pašreizējā audio aizmugure neatbalsta URL, audio barotņu pārlūks tiks " "atslēgts." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d sekunde" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Pielāgots" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "_Notīrīt kļūdas" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Mūzikas atskaņotājs" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Interneta radio" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Vērtējums" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Neizdevās saglabāt dziesmu" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Nav atrasts neviens spraudnis." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Dziesmas vārdi" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Notīrīt meklējumu lauku" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Dziesmas vārdi" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "vieta" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Slēpt galveno logu" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Iestatījumi" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "paraugs" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "paraugs" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d dziesma" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Izvades žurnāls" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "paraugs" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Neizdevās pieslēgties ierīces aizmugurei." #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "vieta" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Nosaukums" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Neizdevās pieslēgties ierīces aizmugurei." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, fuzzy, python-format msgid "Could not contact service '%s'." msgstr "Neizdevās pieslēgties ierīces aizmugurei." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Ierīce:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Nosaukums:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "C_iti:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Mākslinieks" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Faila nosaukuma paraugs:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Nejaušs al_bums" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "albumi" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "S_vars" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Nejaušs al_bums" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Importēt repertuāru" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importēt" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Dziesmas vārdi" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Pašreiz neatskaņo" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d dziesma" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "paraugs" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Pašreiz neatskaņo" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "Re_pertuāri" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Atskaņotājs" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_Priekšskats" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Sajaukt" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Atkārtot" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Apstāties pēc šīs dziesmas" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Atvērt jaunu pārlūku" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Rediģēt _tagus" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informācija" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Repertuāri" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Rediģēt rādāmo" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Dziesmas vārdi" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Dziesmas vārdi" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Kļūdas" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Faili" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Priekšskats" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Filtrēt pēc māksliniek_a" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Pielāgots" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Filtrēt pēc žanra" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Filtrēt pēc māksliniek_a" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio barotnes" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Ievadiet audio barotnes adresi:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Importēt repertuāru" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importēt" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Nav atrasta neviena stacija" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Faila nosaukuma paraugs:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Faila nosaukuma paraugs:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Izņemt no _repertuāra" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, fuzzy, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" "Vai vēlaties turpināt?" msgstr[1] "" "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" "Vai vēlaties turpināt?" msgstr[2] "" "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" "Vai vēlaties turpināt?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Jauns repertuārs" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "Pēdējo reizi atskaņots" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "Ierindots" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Nekad" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Nav dziesmu" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Saglabātās vērtības" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Neizdevās pieslēgties ierīces aizmugurei." #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "Pā_rdēvēt" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Bibliotēka" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Slēpt galveno logu" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Faila nosaukums" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Neizdevās saglabāt dziesmu" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Albumu saraksts" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Izmērs" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Meklēt:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Meklēt" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Albumu saraksts" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "R_ediģēt grāmatzīmes..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "R_ediģēt grāmatzīmes..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Grāmatzīmes" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz albuma tips" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Faila nosaukums" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Disks" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Celiņš" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Nosaukums" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Izpildītājs" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz albuma tips" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "vaicājums" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Meklēt" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Nav atrasts neviens spraudnis." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Pārlūki" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Neizdevās izveidot mapi" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "tags" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "Pā_rdēvēt" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "tags" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Nederīgs paraugs" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Nederīga vērtība" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Pielāgots" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Neizdevās pārkopēt dziesmas" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Atslēgt pārlūku" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "_Vērtējums" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_Vērtējums" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Rediģēt rādāmo" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "_Vērtējums" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrēt pēc taga vērtības" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Filtrēt pēc žanra" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Ierindots" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Rakstīt" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz celiņa ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "mape" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "_Albumu galvenes" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "Jau_na stacija" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Importēt repertuāru" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 #, fuzzy msgid "Error during sync" msgstr "Kļūda ielādējot %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "Pā_rdēvēt" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Importēt repertuāru" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Informācija" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Importēt repertuāru" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Neizdevās importēt repertuāru" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Neizdevās izgrūzt <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "_Atsvaidzināt bibliotēku" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "_Atsvaidzināt bibliotēku" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Rediģēt tagus" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Rediģēt tagus" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Visi albumi" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Priekšskats" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Tags" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Neizdevās izdzēst dziesmas" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Meklēt" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "paraugs" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Rediģēt saglabātās vērtības..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Iekrā_sot meklējamos terminus" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Bibliotēka" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Pārbauda montēšanas punktus" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Skenē bibliotēku" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Skenē %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Rādīt programmatūras _tagus" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 #, fuzzy msgid "Too many arguments" msgstr "Par daudz kļūdu" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "apraksts" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Vērtība" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Audio tagu redaktors" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Nav izvēlēta neviena dziesma." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Filtrēt pēc taga vērtības" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Filtrēt pēc taga vērtības" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Nav ilguma informācijas" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Neizdevās pārdēvēt failu" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Fails" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Parādīt īsu lietošanas informāciju" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> nav derīga vieta." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Nezināms" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Pēc kārtības" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "Pē_c kārtības" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Nejauši" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Nejauši" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Atkārtot" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Viena dziesma" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 #, fuzzy msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "GStreamer izvades līnija, kas tiks izmantota atskaņošanai, piemēram, " "'alsasink device=default'. Atstājiet tukšu, lai izmantotu noklusēto līniju." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Izvades līnija:" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d sekunde" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nav atrasta neviena stacija" #: ../quodlibet/player/gstbe/util.py:112 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Nederīga GStreamer izvades līnija, mēģina noklusēto." #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Neizdevās izveidot audio izvadi" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Audio ierīce %r netika atrasta. Pārbaudiet jūsu Xine iestatījumus failā ~/." "quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "S_praudņi" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Atbalstītie formāti: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Audio ierīce: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Sākums" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/P" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Laiks" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Grāmatzīmes nosaukums" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Grāmatzīmes" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtri" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "_Nekad nav atskaņots" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "Augšējās _40" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Jauna stacija" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Nejauš_s žanrs" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Nej_aušs mākslinieks" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Nejaušs al_bums" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 dziesmas, ko esi atskaņojis visbiežāk (var tikt atlasītas vairāk nekā 40, " "ja ir 'neizšķirti' gadījumi)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Vērtība:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Saglabātās vērtības" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Rediģēt saglabātās vērtības..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "_Celiņu galvenes" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "_Albumu galvenes" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Replay Gain skaļuma regulācija" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Nezināms" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Filtrēt pēc taga vērtības" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Faili" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Dzēst failus" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "Pārvietot uz _miskasti" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Pārvieto %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "Neizdevās saglabāt iPod datubāzi" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Neizdevās izgrūzt <b>%s</b>." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Dzēš %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Neizdevās izdzēst failu" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Neizdevās izdzēst <b>%s</b>." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Lejupielādes" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Izmērs" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "trūkst no %d dziesmas" msgstr[1] "trūkst no %d dziesmām" msgstr[2] "trūkst no %d dziesmām" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "atšķirīgs %d dziesmā" msgstr[1] "atšķirīgs %d dziesmās" msgstr[2] "atšķirīgs %d dziesmās" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Sadalīt _vairākās vērtībās" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Izdalīt disku no _albuma" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Izdalīt _versiju no nosaukuma" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Izdalīt aranžētāju no izpildī_tāja" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Izdalīt iz_pildītāju no mākslinieka" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Izdalīt iz_pildītāju no mākslinieka" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Izdalīt _versiju no nosaukuma" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Pievienot tagu" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tags:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Rediģēt tagus" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Rādīt programmatūras _tagus" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Nekad" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Neizdevās pievienot tagu" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Neizdevās pievienot dziesmu" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Neizdevās pievienot <b>%s</b>\n" "\n" "Pašlaik izvēlētie faili neatbalsta vairākas vērtības." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Nederīgs tags" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Neatļauts tags <b>%s</b>\n" "\n" "Pašlaik izvēlētie faili neatbalsta šī taga rediģēšanu." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Nederīga vērtība" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Nederīga vērtība: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Tags var nebūt precīzs" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> tika izmainīts, programmai darbojoties. Saglabāšana, " "neatsvaidzinot jūsu bibliotēku, var pārrakstīt citas izmaiņas dziesmā.\n" "\n" "Tomēr saglabāt šo dziesmu?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Neizdevās saglabāt dziesmu" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Neizdevās saglabāt <b>%s</b>. Fails var būt tikai lasāms, bojāts vai arī " "jums nav atļauju to rediģēt." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Vairāk opciju..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "S_praudņi" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s un vēl %(count)d" msgstr[1] "%(title)s un vēl %(count)d" msgstr[2] "%(title)s un vēl %(count)d" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso iestatījumi" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Sadalīt _pie:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Tagu rediģēšana" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Mapes" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Jauna mape" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "Izvēlēties vi_sas apakšmapes" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Jauna mape" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Ievadiet jaunās mapes nosaukumu:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Neizdevās izveidot mapi" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Neizdevās izdzēst mapi" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Dziesmas" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "no %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "%s. disks" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "%s. celiņš" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Rediģēt rādāmo" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Nav izvēlēta neviena dziesma." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Nav dziesmu" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informācija" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Dziesmas vārdi" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Producējis %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "mākslinieks" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "mākslinieki" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "izpildītāji" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Nekad" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d reizi" msgstr[1] "%d reizes" msgstr[2] "%d reižu" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "pievienots" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "Pēdējo reizi atskaņots" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "atskaņojumi" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "izlaidumi" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "vērtējums" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "ilgums" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Informācija" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[Nederīgs kodējums]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitātrums" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "faila izmērs" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "mainīts" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d izvēlēti" msgstr[1] "%d izvēlēti" msgstr[2] "%d izvēlēti" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Celiņš nav pieejams" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Celiņu saraksts" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d dziesma bez albuma" msgstr[1] "%d dziesmas bez albuma" msgstr[2] "%d dziesmu bez albuma" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Izvēlētā diskogrāfija" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d dziesma bez mākslinieka" msgstr[1] "%d dziesmas bez mākslinieka" msgstr[2] "%d dziesmas bez mākslinieka" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albumi" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Kopējais ilgums:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Kopējais izmērs:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Faili" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "Lejupielā_dēt" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "R_ediģēt rādāmo..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Šajai dziesmai vārdi netika atrasti." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Meklē dziesmas vārdus..." #: ../quodlibet/qltk/maskedbox.py:20 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "" "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" "Vai vēlaties turpināt?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Izmest tagu izmaiņas?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tagi tika izmainīti, bet netika saglabāti. Saglabāt šos failus, vai " "atgriezties un izmest izmaiņas?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Nekad" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Fails pastāv" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Pārdēvēt failus" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Pārslēgt atskaņošanas/pauzes režīmu" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Pārslēgt atskaņošanas/pauzes režīmu" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Spraudņu kļūdas" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Ieslēgts" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Izslēgts" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Bez kategorijas" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Kārtība" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Tagu rediģēšana" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Kopējais izmērs:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Nav atrasts neviens spraudnis." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "S_praudņi" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Rādīt _kļūdas" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disks" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Celiņš" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "grupēšana" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bums" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Faila nosaukums" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Ilgums" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Pārlēkt uz atskaņoto dziesmu automātiski" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Kad atskaņotā dziesma izmainās, pāriet uz to arī dziesmu sarakstā" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "C_iti:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "R_ediģēt rādāmo..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Redzamās kolonnas" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Nosaukums iekļauj _versiju" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Iegultajā _meklēšanā tiek iekļauti cilvēki" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Albums iekļauj _diska apakšnosaukumu" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "_Faila nosaukums iekļauj mapi" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Iestatījumi" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Dziesmu saraksts" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Redzamās kolonnas" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Globālais filtrs:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Meklēt" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Pārlūki" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Apstiprināt vairākus vērtēju_mus" #: ../quodlibet/qltk/prefs.py:295 #, fuzzy msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Vaicāt pēc apstiprinājuma, pirms mainīt vērtējumu vairākām dziesmām uzreiz" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Ieslēgt viena klikšķa vērtējumus" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Ieslēgt novērtējumu, noklikšķinot uz vērtējumu kolonnas dziesmu sarakstā" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Vērtējumi" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Albumu saraksts" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Pauzēt atskaņošanu" #: ../quodlibet/qltk/prefs.py:362 #, fuzzy msgid "Output Configuration" msgstr "Izvades žurnāls" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Ja dziesmai nav pieejama Replay Gain informācija, mērogot skaļumu par šo " "vērtību" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Atkāpšanās pastiprinājums (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Mērogot skaļumu visām dziesmām par šo vērtību, ja vien neparādās apgriešana" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Priekšpastiprinājuma pastiprinājums (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "I_eslēgt Replay Gain skaļuma regulāciju" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Replay Gain skaļuma regulācija" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "Vērtējumi" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Saglabāt vērtējumus un _atskaņošanu skaitu" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_E-pasts:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Vērtējumi un atskaņošanu skaits tiks iestatīts šajai e-pasta adresei" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Izmest tagu izmaiņas?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Rediģēt tagus" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "Jau_na stacija" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "A_tsvaidzināt bibliotēku, palaižot programmu" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Meklēt bibliotēkā" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Pārbaudīt izmaiņas jūsu bibliotēkā" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Pār_lādēt bibliotēku" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Pārlādēt visas dziesmas jūsu bibliotēkā (tas var aizņemt ilgu laiku)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Skenēt _mapes" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Nav dziesmu" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s un vēl %(count)d" msgstr[1] "%(title)s un vēl %(count)d" msgstr[2] "%(title)s un vēl %(count)d" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Īpašības" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Rinda" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Notīrīt kļūdas" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d dziesma (%(time)s)" msgstr[1] "%(count)d dziesmas (%(time)s)" msgstr[2] "(count)d dziesmas (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "Pārlūkot _bibliotēku" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Pārslēgt galvenā loga redzamību" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Pauzēt atskaņošanu" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Izvēlieties mapes" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Neizdevās pievienot dziesmas" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> izmanto neatbalstītu protokolu." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Pārlēkt uz atskaņoto dziesmu" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Fails" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Dziesmas" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Skats" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Pārlūki" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Vadība" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Palīdzība" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "_Pievienot mapi..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "Pievienot _failu..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Pievienot vietu" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "R_ediģēt grāmatzīmes..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Apstāties pēc šīs dziesmas" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Meklēt" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Pievienot vietu" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Ievadiet audio faila atrašanās vietu:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Neizdevās pievienot vietu" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nav derīga vieta." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Pievienot mūziku" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Pievienot mapi..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Mūzikas atskaņotājs" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Pievienot _failu..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, fuzzy, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" "Vai vēlaties turpināt?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Vērtējums" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Vērtējums" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Aizvietot atstarpes ar pa_svītrām" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Izņemt ar Windows nesavietojamas rakstzīmes" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Izņemt _diakritiskās zīmes" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Izņemt ne-ASCII rakstzīmes" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Pārdēvēt failus" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "paraugs" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Rediģēt saglabātās vērtības..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Priekšskats" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Jauns nosaukums" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Neizdevās pārdēvēt failu" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Neizdevās pārdēvēt <b>%s</b> par <b>%s</b>. Mērķa fails, iespējams, jau " "eksistē, vai arī jums nav atļauju izveidot jaunu vai dzēst veco failu." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Ignorēt vis_as kļūdas" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Turpināt" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Ceļš nav absolūts" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Paraugs\n" "\t<b>%s</b>\n" "satur '/', bet nesākas no saknes mapes. Lai izvairītos no mapju nepareizas " "nosaukšanas, pievienojiet savam paraugam sakni, iesākot to ar '/' vai '~/'." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Šajās mapēs (jāatdala ar ':') esošās dziesmas tiks pievienotas jūsu " "bibliotēkai" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Izvēlieties mapes" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Saglabātās vērtības" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Rediģēt saglabātās vērtības..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Meklēt pēc ieraks_tīšanas" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" "Parāda meklējuma rezultātus pēc tam, kad lietotājs ir pārtraucis rakstīt." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limits:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "S_vars" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Rādīt atlikušo laiku" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Dziesmas vārdi" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Fokusēties uz darbojošos atskaņotāju" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Meklēt pašreizējā dziesmā" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Neizdevās izdzēst dziesmas" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Neizdevās izdzēst dziesmas" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtrēt pēc %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "_Albumu galvenes" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Celiņu galvenes" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Albumu galvenes" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "C_ilvēku galvenes" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Datumu galvenes" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_Failu galvenes" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Producēšanas galvenes" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "Pielāg_ot galvenes..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Iekrā_sot meklējamos terminus" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Pie_vienot rindai" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "Kopēt uz ierī_ci" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "Izņemt no _repertuāra" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Aizvietot pasvīt_ras ar atstarpēm" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Tagu reģistrs ir tāds pats, kā nosaukuma reģistrs" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Sadalīt _vairākās vērtībās" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tagi no ceļa" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Tagi aizvieto pastāvošos tagus" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Tagi tiek pievienoti pastāvošajiem tagiem" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Paraugs\n" "\t<b>%s</b>\n" "ir nederīgs. Iespējams, tas satur vienu un to pašu tagu divreiz, vai arī " "tajā ir nenobalancētas zīmes (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Nederīgi tagi" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Nederīgi tagi <b>%s</b>\n" "\n" "Pašreiz izvēlētie faili neatbalsta šo tagu rediģēšanu." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Jūsu ievadītais paraugs nav derīgs. Pārliecinieties, ka ievadiet < un " "> kā \\< un \\> un ka jūsu tagi ir nobalancēti.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Rediģēt rādāmo" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Celiņu numuri" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Sākt _no:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Celiņi kopā:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Atskaņotājs" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_Priekšskats" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "un vēl %d..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Saglabā jūsu izmainītās dziesmas." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d dziesmas saglabātas\n" "(%(remaining)s atlikušas)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Pārvieto %(current)d/%(total)d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Pārbauda montēšanas punktus" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "vieta" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Repertuārs ar nosaukumu %s jau pastāv." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Rādīt albumu _vākus" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Failu sistēma" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Parādīt īsu lietošanas informāciju" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Parādīt versiju un autortiesības" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[opcijas]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Opcija %r nav atpazīta." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Opcijai %r nepieciešams arguments." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r nav unikāls prefikss." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kb/s" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d sekunde" msgstr[1] "%d sekundes" msgstr[2] "%d sekunžu" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Nav ilguma informācijas" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekunde" msgstr[1] "%d sekundes" msgstr[2] "%d sekunžu" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minūte" msgstr[1] "%d minūtes" msgstr[2] "%d minūšu" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d stunda" msgstr[1] "%d stundas" msgstr[2] "%d stundu" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d diena" msgstr[1] "%d dienas" msgstr[2] "%d dienu" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d gads" msgstr[1] "%d gadi" msgstr[2] "%d gadu" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "nē" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Datumam jābūt ievadītam 'GGGG', 'GGGG-MM-DD' vai 'GGGG-MM-DD HH:MM:SS' " "formātā." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Replay Gain pastiprinājumi jāievada 'x.yy dB' formātā." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Replay Gain maksimumi jāievada 'x.yy' formātā." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz ID-iem jābūt UUID formātā." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz izlaiduma statusam jābūt 'official', 'promotional' vai 'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Neizdevās rediģēt dziesmu" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Neizdevās saglabāt <b>%s</b>. Fails var būt tikai lasāms, bojāts vai arī " "jums nav atļauju to rediģēt." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Nederīgs kodējums]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "albums" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "aranžētājs" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "aranžētāji" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "aranžētājs" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "autors" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "autori" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "komponists" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "komponisti" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "komponists" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "diriģents" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "diriģenti" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "diriģents" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "kontakts" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "autortiesības" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "datums" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "apraksts" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "žanrs" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "žanrs" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "izpildītājs" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "grupēšana" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "valoda" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licence" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "vieta" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "dziesmu vārdu autors" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "vārdu autori" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "dziesmu vārdu autors" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organizācija" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "nosaukums" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versija" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "tīmekļa vietne" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "albuma mākslinieks" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "sit./min." #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "diska apakšnosaukums" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disks" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "celiņš" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "izdevēja ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "oriģinālais izlaiduma datums" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "oriģinālais albums" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "oriģinālais mākslinieks" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "ierakstīšanas datums" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "izlaiduma valsts" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz celiņa ID" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz izlaiduma ID" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "MusicBrainz izlaiduma ID" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz mākslinieka ID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz izlaiduma ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz albuma statuss" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz albuma tips" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz izlaiduma ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "celiņa pastiprinājums" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "celiņa maksimums" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "albuma pastiprinājums" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "albuma maksimums" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Iestatījumi" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "diski" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "celiņi" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "pēdējo reizi sākts" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "pilns vārds" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "montēšanas punkts" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "cilvēki" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "gads" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "oriģinālais izlaiduma datums" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "grāmatzīme" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "Nav ilguma informācijas" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Repertuāri" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Pārlūki" #, fuzzy #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "" #~ "Neizdevās importēt python-feedparser, audio barotņu pārlūks tiks atslēgts." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Quod Libet nonāca izņēmumsituācijā. Dump fails, kas mums palīdzēs " #~ "atkļūdot avāriju, tika saglabāts <b>%s</b>. Lūdzu, aizpildiet jaunu " #~ "problēmas ziņojumu vietnē http://code.google.com/p/quodlibet/issues/" #~ "list , un pievienojiet šo failu vai arī iekļaujiet tā saturu. Šis fails " #~ "var saturēt identificējošu situāciju par jums vai jūsu sistēmu, piemēram, " #~ "nesen atskaņoto failu sarakstu. Ja tas nav pieņemami, tā vietā sūtiet <b>" #~ "%s</b> kopā ar aprakstu par jūsu darbībām avārijas brīdī.\n" #~ "\n" #~ "Quod Libet tagad var būt nestabils. Vēlams to aizvērt un pārstartēt. Jūsu " #~ "bibliotēka tiks saglabāta." #~ msgid "Unable to download lyrics." #~ msgstr "Neizdevās lejupielādēt dziesmas vārdus." #~ msgid "Remove all songs from the queue" #~ msgstr "Izņemt no rindas visas dziesmas" #~ msgid "Watch this folder for new songs" #~ msgstr "Vērot šo mapi" #~ msgid "Set or toggle the playback order" #~ msgstr "Iestatīt vai pārslēgt atskaņošanas kārtību" #~ msgid "Uninitialized iPod" #~ msgstr "Neinicializēts iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Vai vēlaties izveidot tukšu datubāzi uz šī iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "S_kaļuma pastiprinājums (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Ko_mbinēt tagus ar vairākām vērtībām" #~ msgid "Model:" #~ msgstr "Modelis:" #~ msgid "Capacity:" #~ msgstr "Ietilpība:" #~ msgid "Firmware:" #~ msgstr "Programmatūra:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Dzēš nevajadzīgu iPod celiņu" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Neizdevās saglabāt iPod datubāzi" #~ msgid "Unable to save iPod database" #~ msgstr "Neizdevās saglabāt iPod datubāzi" #, fuzzy #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "Neizdevās importēt python-gpod, iPod atbalsts tiks atslēgts." #, fuzzy #~ msgid "Track Repeat" #~ msgstr "celiņa maksimums" #~ msgid "Shuffle" #~ msgstr "Sajaukt" #~ msgid "Weighted" #~ msgstr "Svērti" #~ msgid "_Weighted" #~ msgstr "S_vērti" #~ msgid "_One Song" #~ msgstr "V_iena dziesma" #~ msgid "Restart the playlist when finished" #~ msgstr "Pārstartēt repertuāru, kad pabeigts" #~ msgid "Disable Browser" #~ msgstr "Atslēgt pārlūku" #~ msgid "_Disable Browser" #~ msgstr "A_tslēgt pārlūku" #, fuzzy #~ msgid "Force Write" #~ msgstr "Rakstīt" #~ msgid "Filter on _Genre" #~ msgstr "Filtrēt pēc žanra" #~ msgid "Filter on _Artist" #~ msgstr "Filtrēt pēc māksliniek_a" #~ msgid "Filter on Al_bum" #~ msgstr "Filtrēt pēc al_buma" #~ msgid "_Music" #~ msgstr "_Mūzika" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Grāmatzīmes" #~ msgid "Song _List" #~ msgstr "_Dziesmu saraksts" #, fuzzy #~ msgid "D:" #~ msgstr "B: " #, fuzzy #~ msgid "W:" #~ msgstr "B: " #, fuzzy #~ msgid "E:" #~ msgstr "E: " #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Apstāties pēc šīs dziesmas" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "un vēl %d..." #~ msgstr[1] "un vēl %d..." #~ msgstr[2] "un vēl %d..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Izdalīt disku no _albuma" #, fuzzy #~ msgid "Timeout" #~ msgstr "Laiks" #, fuzzy #~ msgid "Select an album" #~ msgstr "Iezīmēt visus" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s un vēl %(count)d" #~ msgstr[1] "%(title)s un vēl %(count)d" #~ msgstr[2] "%(title)s un vēl %(count)d" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Repertuāri" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "Izmantot noapaļot_us stūrus sīktēliem" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "Noapaļot albumu vāciņu sīktēlus. Iespējams, būs jāpārstartē programma, " #~ "lai izmaiņas stātos spēkā." #~ msgid "Re_fresh Library" #~ msgstr "_Atsvaidzināt bibliotēku" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Vērtējums" #~ msgid "Unable to open input files" #~ msgstr "Neizdevās atvērt ievades failus" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "GStreamer nav elementa failu nolasīšanai. Pārbaudiet jūsu GStreamer " #~ "instalācijas iestatījumus." #~ msgid "Invalid audio backend" #~ msgstr "Nederīga audio aizmugure" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "Audio aizmugure %r nav instalēta." #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "command|filename" #~ msgstr "faila_nosaukums" #~ msgid "command|tag" #~ msgstr "tags" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: neizdevās atrast media-player-info." #, fuzzy #~ msgid "heading|Search" #~ msgstr "Meklēt" #~ msgid "%d of %d" #~ msgstr "%d no %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Lietošana: %s %s" #~ msgid "_Download..." #~ msgstr "Lejupielā_dēt..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "Jau_na stacija" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Pārrakstīt <b>%s</b>?" #~ msgid "Output Error" #~ msgstr "Izvades kļūda" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "Neizdevās inicializēt GStreamer izvades līniju. Līnija var nebūt derīga, " #~ "vai arī ierīce jau tiek izmantota. Pārbaudiet jūsu atskaņotāja " #~ "iestatījumus." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet jau ir palaists." #~ msgid "No song is currently playing." #~ msgstr "Pašreiz netiek atskaņota neviena dziesma." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Neizdevās uz %s. Dzēš to." #~ msgid "_Edit Bookmarks..." #~ msgstr "R_ediģēt grāmatzīmes..." #~ msgid "_New Folder..." #~ msgstr "Jau_na mape..." #~ msgid "_Add to Playlist" #~ msgstr "Pievienot repertuār_am" #~ msgid "_Edit Display..." #~ msgstr "R_ediģēt rādāmo..." #~ msgid "Output Log" #~ msgstr "Izvades žurnāls" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d stacija" #~ msgid "_Add a Location..." #~ msgstr "Pievienot _vietu..." #~ msgid "_Output Log" #~ msgstr "Izvades ž_urnāls" #~ msgid "Invalid command %r received." #~ msgstr "Saņemta nederīga komanda %r." #~ msgid "Unknown browser %r." #~ msgstr "Nezināms pārlūks %r." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "Pielāg_ot galvenes..." #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "" #~ "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" #~ "Vai vēlaties turpināt?" #~ msgstr[1] "" #~ "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" #~ "Vai vēlaties turpināt?" #~ msgstr[2] "" #~ "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" #~ "Vai vēlaties turpināt?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "" #~ "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" #~ "Vai vēlaties turpināt?" #~ msgstr[1] "" #~ "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" #~ "Vai vēlaties turpināt?" #~ msgstr[2] "" #~ "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" #~ "Vai vēlaties turpināt?" #, fuzzy #~ msgid "Track Headers" #~ msgstr "_Celiņu galvenes" #, fuzzy #~ msgid "People Headers" #~ msgstr "C_ilvēku galvenes" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Albumu galvenes" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Datumu galvenes" #, fuzzy #~ msgid "File Headers" #~ msgstr "_Failu galvenes" #, fuzzy #~ msgid "Production Headers" #~ msgstr "_Producēšanas galvenes" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Tags:" #~ msgid "Too Many Errors" #~ msgstr "Par daudz kļūdu" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Aptur atskaņošanu, jo tika novērotas %d kļūdas pēc kārtas." #~ msgid "Warnings" #~ msgstr "Brīdinājumi" #~ msgid "album artist (sort)" #~ msgstr "albuma mākslinieks (kārtot)" #~ msgid "artist (sort)" #~ msgstr "mākslinieks (kārtot)" #~ msgid "album (sort)" #~ msgstr "albums (kārtot)" #~ msgid "performer (sort)" #~ msgstr "izpildītājs (kārtot)" #~ msgid "performers (sort)" #~ msgstr "izpildītāji (kārtot)" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz albuma mākslinieka ID" #~ msgid "errors" #~ msgstr "kļūdas" #~ msgid "Permanently delete this file?" #~ msgstr "Neatgriezeniski dzēst šo failu?" #~ msgid "Permanently delete these files?" #~ msgstr "Neatgriezeniski dzēst šos failus?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s un vēl %(count)d..." #~ msgstr[1] "%(title)s un vēl %(count)d..." #~ msgstr[2] "%(title)s un vēl %(count)d..." #, fuzzy #~ msgid "Version:" #~ msgstr "versija" #~ msgid "_Cause an Error" #~ msgstr "Izraisīt _kļūdu" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s nevarēja tikt pievienota jūsu bibliotēkai.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Komanda 'eject' nav atrasta." #~ msgid "Unable to start web browser" #~ msgstr "Neizdevās palaist tīmekļa pārlūku" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Neizdevās atrast tīmekļa pārlūku. Lūdzu, iestatiet mainīgo '$BROWSER', " #~ "vai arī pārliecinieties, ka /usr/bin/sensible-browser eksistē." #, fuzzy #~ msgid "Library Error" #~ msgstr "Bibliotēkas pārlūks" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Izvades līnija:" #~ msgid "translator-credits" #~ msgstr "Einārs Sprūģis <einars8@gmail.com>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Citas kolonnas, ko attēlot, atdalītas ar atstarpēm" #~ msgid "_Edit and Continue" #~ msgstr "R_ediģēt un turpināt" #, fuzzy #~ msgid "You are about to change the rating of %d song." #~ msgid_plural "You are about to change the rating of %d songs." #~ msgstr[0] "" #~ "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" #~ "Vai vēlaties turpināt?" #~ msgstr[1] "" #~ "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" #~ "Vai vēlaties turpināt?" #~ msgstr[2] "" #~ "Jūs grasāties mainīt vērtējumu %d dziesmām.\n" #~ "Vai vēlaties turpināt?" #~ msgid "Confirm rating" #~ msgstr "Apstiprināt vērtējumu" #~ msgid "Search your library" #~ msgstr "Meklēt jūsu bibliotēkā" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quod-libet-development@googlegroups.com>\n" #~ "Autortiesības 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "Šī ir brīvā programmatūra; kopēšanas nosacījumiem skatiet pirmkodu.\n" #~ "Netiek dota NEKĀDA garantija, pat PIEPRASĪJUMA vai NODERĪBAS ĪPAŠAM\n" #~ "MĒRĶIM garantija.\n" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r nesatur nekādus pārlūkus." #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Kopējais izmērs:" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r nesatur nekādas ierīces." #~ msgid "%s: Could not import ctypes." #~ msgstr "%s: neizdevās importēt ctypes." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: neizdevās atrast media-player-info." #, fuzzy #~ msgid "Couldn't find module %s." #~ msgstr "%s: neizdevās atrast media-player-info." #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet spraudņi" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Attēlot vienkāršos meklējumus zilā krāsā, paplašinātos - zaļā, bet " #~ "nederīgos - sarkanā krāsā" #~ msgid "_Select" #~ msgstr "Izvēlētie_s" #~ msgid "Separators for splitting tags" #~ msgstr "Atdalītāji tagu sadalīšanai" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet iestatījumi" #~ msgid "Not Played To_day" #~ msgstr "Nav atskaņots šo_dien" #~ msgid "Not Played in a _Week" #~ msgstr "Nav atskaņots š_onedēļ" #~ msgid "Not Played in a _Month" #~ msgstr "Nav atskaņots šo_mēness" #~ msgid "B_ottom 40" #~ msgstr "Apakšējās 4_0" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "40 dziesmas, ko esi atskaņojis visretāk (var tikt atlasītas vairāk nekā " #~ "40, ja ir 'neizšķirti' gadījumi)" #~ msgid "gtk-media-next" #~ msgstr "gtk-media-next" #~ msgid "gtk-media-previous" #~ msgstr "gtk-media-previous" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | vadīkla ]" #~ msgid "Date" #~ msgstr "Datums" #~ msgid "Choose New Stations" #~ msgstr "Izvēlieties jaunas stacijas" #~ msgid "Add" #~ msgstr "Pievienot" #~ msgid "Bitrate" #~ msgstr "Bitātrums" #~ msgid "_Stations..." #~ msgstr "_Stacijas..." #~ msgid "Quod Libet" #~ msgstr "Quod Libet" #~ msgid "Initializing audio backend (%s)" #~ msgstr "Inicializē audio aizmuguri (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "Inicializē galveno bibliotēku (%s)" #~ msgid "Unable to save library" #~ msgstr "Neizdevās saglabāt bibliotēku" #~ msgid "" #~ "The audio output pipeline %r could not be created. Check your GStreamer " #~ "settings in ~/.quodlibet/config." #~ msgstr "" #~ "Audio izvades līnija %r nevarēja tikt izveidota. Pārbaudiet jūsu " #~ "GStreamer iestatījumus failā ~/.quodlibet/config." �������������������quodlibet-3.9.1/po/da.po����������������������������������������������������������������������������0000644�0001750�0001750�00000547730�13115512743�015326� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Danish translations for quodlibet # Copyright (C) 2016 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the quodlibet package. # scootergrisen, 2016-2017. # msgid "" msgstr "" "Project-Id-Version: quodlibet 3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2017-01-08 00:00+0000\n" "Last-Translator: scootergrisen\n" "Language-Team: Danish\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Rediger tags i dine lydfiler" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" "Ex Falso er en tag-editor med den samme brugerflade til tag-redigering som " "Quod Libet. Den giver dig mulighed for at vise og redigere tags i filen, for " "alle de filformater som den understøtter." #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" "Understøttede filformater inkludere Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, " "MOD/XM/IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Lyd-tag-editor" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Lyt til, gennemse eller rediger din lydsamling" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" "Quod Libet er et lydhåndteringsprogram. Det giver adskillige måder at vise " "dit lydbibliotek og understøttelse af internet-radio og lyd-feeds. Det har " "ekstrem fleksibel metadata-tag-redigering og -søgningsformåenheder." #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Musikafspiller" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "_Titel" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Kunstner" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Dato" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Bedømmelse" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 msgid "Sort _by…" msgstr "Sortér _efter…" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Præferencer" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Albumliste" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Albumliste" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Alle album" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d album" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Genindlæs album_cover" msgstr[1] "Genindlæs album_covere" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Sange som ikke er i et album" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d spor" msgstr[1] "%d spor" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disk" msgstr[1] "%d diske" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 msgid "An Example Album" msgstr "Et eksempel-album" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Albumliste-præferencer" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Vis album_covere" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Indbygget _søgning inkluderer personer" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 msgid "Options" msgstr "Valgmuligheder" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Album-visning" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "_Luk" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Ukendt" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Nyt feed" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Indtast placeringen af et lyd-feed:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "_Tilføj" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Lyd-feeds" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Lyd-feeds" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 msgid "_Download…" msgstr "_Download…" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Download filer" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "_Gem" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Download fil" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "_Ny" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Kan ikke tilføje feed" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "%s kunne ikke tilføjes. Serveren kan være nede eller placeringen er måske " "ikke et lyd-feed." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 msgid "_Refresh" msgstr "_Opdater" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 msgid "_Delete" msgstr "_Slet" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Den aktuelle lyd-backend understøtter ikke URL'er, lyd-feeds-browser " "deaktiveret." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Bibliotek-browser" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d sang" msgstr[1] "%d sange" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Ugyldigt mønster" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Albumsamling" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "Album_samling" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "Ukendt %s" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "Flere %s-værdier" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Brugerdefineret" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 msgid "_Remove" msgstr "_Fjern" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Forén" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Albumsamling-præferencer" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "_Anvend" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "_Annuller" #: ../quodlibet/browsers/covergrid/main.py:125 msgid "Cover Grid" msgstr "Covergitter" #: ../quodlibet/browsers/covergrid/main.py:126 msgid "_Cover Grid" msgstr "_Covergitter" #: ../quodlibet/browsers/covergrid/prefs.py:54 msgid "Cover Grid Preferences" msgstr "Covergitter-præferencer" #: ../quodlibet/browsers/covergrid/prefs.py:64 msgid "Show album _text" msgstr "Vis album_tekst" #: ../quodlibet/browsers/covergrid/prefs.py:71 msgid "Show \"All Albums\" Item" msgstr "Vis \"Alle album\"-post" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "Lodret opdeling" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 msgid "Cover Magnification" msgstr "Cover forstørrelse" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Filsystem" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Filsystem" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Kan ikke kopiere sange" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "De valgte filer kan ikke kopieres til anden sangliste eller køen." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Føj til bibliotek" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Ikke-understøttet filtype" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Stationslister må kun indeholde placeringer af stationer, ikke andre " "stationslister eller spillelister. Følgende placeringer kan ikke indlæses:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Kan ikke tilføje station" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internet-radio" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Downloader stationsliste" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Ny station" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Indtast placeringen af en internet-radiostation:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Elektronisk" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "Hiphop/rap" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Oldies" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japansk" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "Indisk" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Religiøs" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Charts" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Tyrkisk" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Reggae/dancehall" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "Latin" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "Skoleradio" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Snak/nyheder" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambient" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Jazz" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Klassisk" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternativ" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metal" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Country" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Nyheder" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Slager" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Funk" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Blues" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Punk" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Reggaeton" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Slavisk" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Græsk" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gotisk" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rock" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "Vil du indlæse en liste med populære radiostationer?" #: ../quodlibet/browsers/iradio.py:455 msgid "_Load Stations" msgstr "_Indlæs stationer" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Internet-radio" #: ../quodlibet/browsers/iradio.py:538 msgid "_New Station…" msgstr "_Ny station…" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "_Opdater stationer" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Alle stationer" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Favoritter" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Ingen kategori" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Ingen stationer fundet" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Ingen internet-radiostationer blev fundet hos %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Alle viste stationer er allerede i dit bibliotek." #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "Føj til favoritter" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Fjern fra favoritter" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d station" msgstr[1] "%(count)d stationer" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Enhedsegenskaber" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Enhed:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Ikke monteret" #: ../quodlibet/browsers/media.py:55 msgid "Mount point:" msgstr "Monteringspunkt:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Navn:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Medieenheder" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Medieenheder" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Skub ud" #: ../quodlibet/browsers/media.py:360 msgid "_Properties" msgstr "_Egenskaber" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Omdøb" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%(used-size)s brugt, %(free-size)s tilgængelig" #: ../quodlibet/browsers/media.py:479 #, python-format msgid "%s is not connected." msgstr "%s er ikke tilsluttet." #: ../quodlibet/browsers/media.py:499 #, python-format msgid "Copying %(song)s" msgstr "Kopierer %(song)s" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Kan ikke kopiere sang" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Der er ikke nok ledig hukommelse til denne sang." #: ../quodlibet/browsers/media.py:526 #, python-format msgid "%s could not be copied." msgstr "%s kunne ikke kopieres." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Kan ikke slette sange" #: ../quodlibet/browsers/media.py:557 #, python-format msgid "Deleting %(song)s" msgstr "Sletter %(song)s" #: ../quodlibet/browsers/media.py:575 #, python-format msgid "%s could not be deleted." msgstr "%s kunne ikke slettes." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Kan ikke slette sang" #: ../quodlibet/browsers/media.py:594 #, python-format msgid "Ejecting %s failed." msgstr "Udskubning af %s fejlede." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Kan ikke skubbe enhed ud" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "Ingen enheds-backend, medieenheder-browser deaktiveret." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Rude-browser" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Rude-browser" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Vælg _alle" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Alle" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" "Tag-mønster med valgfri opmærkning. F.eks. <tt>composer</tt> eller\n" "<tt>%s</tt>" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "_Bred-tilstand" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Præferencer for rude-browser" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "Ens rudebredde" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Spilleliste" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Spillelister" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Fjern fra spilleliste" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importér" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Ny spilleliste" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Kan ikke importere spilleliste" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet kan kun importere spillelister i formaterne M3U og PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Kan ikke omdøbe spilleliste" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importér spilleliste" #: ../quodlibet/browsers/playlists/menu.py:25 msgid "_New Playlist…" msgstr "_Ny spilleliste…" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Hvad vil du gøre med den %d sang?" msgstr[1] "Hvad vil du gøre med de %d sange?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Bekræft handling for spillelisten \"%s\"" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "tom" #: ../quodlibet/browsers/playlists/prefs.py:39 msgid "Example Playlist" msgstr "Eksempel-spilleliste" #: ../quodlibet/browsers/playlists/prefs.py:47 msgid "Playlist Browser Preferences" msgstr "Præferencer for spilleliste-browser" #: ../quodlibet/browsers/playlists/prefs.py:52 msgid "Playlist display" msgstr "Spilleliste-visning" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Er du sikker på, at du vil slette spillelisten '%s'?" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Al information om den valgte spilleliste vil blive slettet og kan ikke " "gendannes." #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Indtast et navn til den nye spilleliste:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importerer spilleliste.\n" "\n" "%(current)d/%(total)d sange tilføjet." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Begræns resultater" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Søgebibliotek" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Søgebibliotek" #: ../quodlibet/browsers/soundcloud/main.py:38 msgid "Soundcloud Browser" msgstr "Soundcloud-browser" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "Sound_cloud" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Søgning" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "Gå til %s" #: ../quodlibet/browsers/soundcloud/main.py:380 msgid "Connected" msgstr "Tilsluttet" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "Quod Libet er nu tilsluttet, <b>%s</b>!" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "Log ud af %s" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "Indtast kode…" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "Log ind i %s" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "Soundcloud godkendelse" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "Indtast godkendelseskode til Soundcloud:" #: ../quodlibet/cli.py:50 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet kører ikke (tilføj '--run' for at starte den)" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "et musikbibliotek og -afspiller" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[valgmulighed]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Vis sangen som afspilles og afslut" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Start afspilning med det samme" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "Vis ikke nogen vinduer ved opstart" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Hop til næste sang" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "Hop til forrige sang eller genstart hvis nær begyndelsen" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Hop til forrige sang" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Start afspilning" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Sæt afspilning på pause" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Afspil/pause-tilstand til/fra" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Stop afspilning" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Skru op for lydstyrken" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Skru ned for lydstyrken" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Vis afspilningsstatus" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Skjul hovedvindue" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Vis hovedvindue" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Hovedvinduets synlighed til/fra" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Giv fokus til den kørende afspiller" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Fjern aktive browser-filtre" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Opdater og genskan bibliotek" #: ../quodlibet/cli.py:110 msgid "List available browsers" msgstr "Vis tilgængelige browsere" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Vis aktuelle spilleliste" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Vis køens indhold" #: ../quodlibet/cli.py:113 msgid "Print the active text query" msgstr "Vis den aktive tekst-anmodning" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Start uden plugins" #: ../quodlibet/cli.py:115 msgid "Start Quod Libet if it isn't running" msgstr "Start Quod Libet hvis ikke den kører" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Afslut Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Søg i sangen som afspilles" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 msgid "Set or toggle shuffle mode" msgstr "Sæt eller bland-tilstand til/fra" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Slå gentag fra, til eller til/fra" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Sæt lydstyrken" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Søg i dit lydbibliotek" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "anmodning" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Afspil en fil" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 msgctxt "command" msgid "filename" msgstr "filnavn" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Bedøm sangen som afspilles" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Sæt den aktuelle browser" #: ../quodlibet/cli.py:129 msgid "Stop after the playing song" msgstr "Stop efter sangen som afspilles" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Åbn en ny browser" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Vis eller skjul køen" #: ../quodlibet/cli.py:133 msgid "Show or hide the main song list (deprecated)" msgstr "Vis eller skjul hovedsanglisten (udgået)" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtrér efter en tilfældig værdi" #: ../quodlibet/cli.py:134 msgctxt "command" msgid "tag" msgstr "tag" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtrér efter en tag-værdi" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=værdi" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Sæt en fil eller anmodning i kø" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Kommasepareret filer i kø" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "filnavn" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Send filnavne fra resultater af anmodning til stdout" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Sæt en fil eller anmodning i kø" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Ugyldigt argument for '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Prøv %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Ukendt enhed" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "Kunne ikke importere %s, som er nødvendig til enhedsunderstøttelse." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r er ikke en understøttet enhed." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "Kunne ikke finde '%s'." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Klargør enhed-backend." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Prøver '%s'" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Kunne ikke oprette forbindelse til enheds-backend." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Enhed-backend klargjort." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Filnavn-mønster:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopiér _albumcovere" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Fjern ubrugte covere og mapper" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "Der opstod en fejl" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" "Du kan ignorere denne fejl, men programmet kan være ustabilt indtil det " "genstartes. Indsendelse af fejlrapport vil kun tage nogle få sekunder og kan " "hjælpe os meget." #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "Opret fejlrapport" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "Indsend fejlrapport" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "Afslut program" #: ../quodlibet/errorreport/ui.py:76 msgid "Ignore Error" msgstr "Ignorer fejl" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "Fejldetaljer:" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" "Diverse detaljer om fejlen og dit system vil blive sendt til en tredjeparts " "online-tjeneste (<a href='https://www.sentry.io'>www.sentry.io</a>). Du kan " "gennemgå dataene nedenfor inden de sendes." #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" "(valgfri) Giv venligst en kort beskrivelse af hvad der skete da fejlen " "opstod:" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "_Send" #: ../quodlibet/errorreport/ui.py:115 msgid "Short description…" msgstr "Kort beskrivelse…" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "Data som sendes:" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "en lyd-tag-editor" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "mappe" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "Grafik URL-cover-kilde" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" "Downloader covere linket til af artwork_url-tagget. Dette virker med " "Soundcloud-browseren." #: ../quodlibet/ext/covers/discogs.py:25 msgid "Discogs Cover Source" msgstr "Discogs-cover-kilde" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "Downloader covere fra Discogs." #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "Last.fm-cover-kilde" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Downloader covere fra Last.fm's covergrafik-arkiv." #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "MusicBrainz Cover Source" msgstr "MusicBrainz-cover-kilde" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Downloader covere fra MusicBrainz's covergrafik-arkiv." #: ../quodlibet/ext/editing/iconv.py:26 msgid "Convert Encodings" msgstr "Konvertér kodninger" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "Retter fejlfortolkede kodninger af tag-værdi i tag-editoren." #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "_Konvertér kodning…" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "Kana/Kanji-simpel-omformer" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "Konverterer kana/kanji til romaji inden omdøbning." #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "Romanisér _japansk tekst" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "Kunne ikke finde 'Kanji Kana-simpel-omformer' (kakasi)." #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "Regex-erstatning" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Tillader vilkårlige regex-erstatninger (s///) ved tagging eller omdøbning af " "filer." #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title Case" msgstr "Ord Med Stort" #: ../quodlibet/ext/editing/titlecase.py:21 msgid "Title-cases tag values in the tag editor." msgstr "Skriver ord med stort i tag-værdier i tag-editoren." #: ../quodlibet/ext/editing/titlecase.py:40 msgid "Title-_case Value" msgstr "Skriv _ord med stort i værdi" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "Tillad tags som kun har _STORE BOGSTAVER" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "_Ord med stort som mennesker skriver det" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Bruger almindelige engelsk regler for ord med stort, som i \"Dark Night of " "the Soul\"" #: ../quodlibet/ext/events/advanced_preferences.py:69 msgid "Advanced Preferences" msgstr "Avancerede præferencer" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "Tillad redigering af avancerede konfigurationsindstillinger." #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "Jeg ved hvad jeg har gang i" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "Animeret on-screen-visning" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "Viser sanginformation på din skærm når den skifter." #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "Øverst på skærmen" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "Midt på skærmen" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "Nederst på skærmen" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "_Placering:" #: ../quodlibet/ext/events/animosd/prefs.py:171 msgid "_Cover size:" msgstr "_Coverstørrelse:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 msgid "Display" msgstr "Visning" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "_Skrifttype:" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "Venstre" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "Centreret" #: ../quodlibet/ext/events/animosd/prefs.py:197 msgid "Right" msgstr "Højre" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "_Juster tekst:" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "Tekst" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "_Tekst:" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "_Udfyld:" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "Farver" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "_Skygger" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "_Omrids" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "_Afrundede hjørner" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "_Forsinkelse:" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "Effekter" #: ../quodlibet/ext/events/animosd/prefs.py:270 msgid "Ed_it Display Pattern…" msgstr "_Rediger visningsmønster…" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 msgid "Preview" msgstr "Forhåndsvis" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "Automatisk opdatering af bibliotek" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "Holder dit bibliotek up-to-date med inotify. Kræver %s." #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "Automatisk maskering" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" "Maskerer og afmaskerer automatisk drev når de afmonteres eller monteres." #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "Automatisk bedømmelse" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" "Bedømmer automatisk sange når de afspilles eller springes over. Dette bruger " "'accelerated'-algoritmen fra vux af Brian Nelson." #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "Vækkeur" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "Vækker dig med høj musik." #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "Godnatsang" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "Udtoner og sætter din musik på pause." #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "Flad" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "Live" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "Fuld bas og diskant" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "Klub" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "Stor hal" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "Fest" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "Blød" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "Fuld bas" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "Reggae" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "Hovedtelefoner" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "Blød rock" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "Fuld diskant" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "Dance" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "Techno" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "Ska" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "Bærbar" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "Equalizer" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" "Styrer tonen af din musik med en equalizer.\n" "Klik eller brug taster for at tilpasse niveauer (højreklik for at nulstille " "båndet)." #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "Den aktuelle backend understøtter ikke equalizering." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "%.1f kHz" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "%d Hz" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, python-format msgid "%.1f dB" msgstr "%.1f dB" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom" msgstr "Brugerdefineret" #: ../quodlibet/ext/events/equalizer.py:199 msgid "_Clear" msgstr "_Ryd" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "online" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "offline" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "chat" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "væk" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "xa" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "usynlig" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "Gajim-statusmeddelelse" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" "Skifter Gajim-statusmeddelelse i henhold til hvad du lytter til i øjeblikket." #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "sat på pause" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" "Vis kontoer, afskilt af mellemrum, for skift af statusmeddelelse. Hvis ingen " "er specificeret, skiftes statusmeddelelse for alle kontoer." #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "Tilføj '[sat på pause]'" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" "Hvis tilvalgt, tilføjes '[sat på pause]' til statusmeddelelse ved pause." #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "Statusser for hvilken meddelelser der ændres" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "Sæt på pause når stik til hovedtelefoner fjernes" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" "Sætter på pause når stikket til hovedtelefonerne fjernes og afspiller når " "det sættes i igen." #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "Blokér pauseskærm" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" "Forhindrer GNOME-pauseskærmen i at blive aktiveret når en sang afspilles." #: ../quodlibet/ext/events/inhibit.py:51 msgid "Music is playing" msgstr "Musik afspiller" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "Internet Radio Log" msgstr "Internetradio-log" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" "Optager de sidste 10 sange afspillet på radiostationer og viser dem i " "søgegenvejsmenuen." #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "JEP-118" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "Outputter en Jabber User Tunes-fil til ~/.quodlibet/jabber." #: ../quodlibet/ext/events/language.py:21 msgid "Change Language" msgstr "Skift sprog" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "Skrift brugerfladens sprog." #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "Systemets standard" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "En genstartes kræves før eventuelle ændringer træder i kraft" #: ../quodlibet/ext/events/lyricswindow.py:199 msgid "No active song" msgstr "Ingen aktiv sang" #: ../quodlibet/ext/events/lyricswindow.py:215 msgid "No lyrics found" msgstr "Ingen sangtekster fundet" #: ../quodlibet/ext/events/lyricswindow.py:227 msgid "Lyrics:" msgstr "Sangtekster:" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "_Zoomniveau:" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "URL:" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "Tilbagefør til standard" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" "Søg via URL'en ovenfor, hvis sangteksterne ikke kunne findes på LyricsWikia." #: ../quodlibet/ext/events/lyricswindow.py:339 msgid "Alternate search" msgstr "Alternativ søgning" #: ../quodlibet/ext/events/lyricswindow.py:347 msgid "Lyrics Window" msgstr "Sangtekstvindue" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "Viser et vindue med sangtekster fra sangen som afspilles." #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "UPnP AV-medieserver" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" "Eksponerer alle album til Rygel UPnP-medieserveren gennem D-Bus-grænsefladen " "til MediaServer2." #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "MPD-server" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" "Tillader fjernstyring af Quod Libet ved brug af en MPD-klient. Strømning-, " "spilleliste- og biblioteksstyring understøttes ikke." #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "_Port:" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "Lokal _IP:" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "_Adgangskode:" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 msgid "Connection" msgstr "Forbindelse" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "Testede klienter" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "MPRIS D-Bus-understøttelse" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" "Tillader styring af Quod Libet ved brug af D-Bus-grænsefladespecifikationen " "MPRIS 1.0/2.0." #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "Skjul hovedvindue ved luk" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Præferencer" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "Accepterer QL-mønstre. F.eks. %s" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "MQTT-udgiver" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "Udgiver statusmeddelelser til et MQTT-emne." #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "Mægler-værtsnavn" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "mægler-værtsnavn/-IP" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "Mægler-port" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "mægler-port" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "Emne" #: ../quodlibet/ext/events/mqtt.py:128 msgid "Playing Pattern" msgstr "Afspiller-mønster" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "Statustekst når en sang er startet." #: ../quodlibet/ext/events/mqtt.py:132 msgid "Paused Pattern" msgstr "Sat på pause-mønster" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "Tekst når en sang er sat på pause." #: ../quodlibet/ext/events/mqtt.py:136 msgid "No-song Text" msgstr "Ingen sang-tekst" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "Almindelig tekst til når der ikke er nogen sang" #: ../quodlibet/ext/events/mqtt.py:149 msgid "MQTT Configuration" msgstr "MQTT-konfiguration" #: ../quodlibet/ext/events/mqtt.py:153 msgid "Status Text" msgstr "Statustekst" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "Tilsluttet mægler hos %(host)s:%(port)d" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Kunne ikke oprette forbindelse til %(host)s:%(port)d (%(msg)s" #: ../quodlibet/ext/events/mqtt.py:192 msgid "Connection error" msgstr "Forbindelsesfejl" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "Notifikationstekst" #: ../quodlibet/ext/events/notify.py:88 msgid "_Title:" msgstr "_Titel:" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "Tilbagefør til standardmønster" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "_Krop:" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "_Vis notifikationer" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "Vis notifikationer" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "Kun ved <i>_manuelle</i> skift af sange" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "Kun ved <i>_automatiske</i> skift af sange" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "Ved <i>a_lle</i> skift af sange" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "Når når hovedvinduet ikke har _fokus" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "Vis \"_Næste\"-knap" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "Forbindelsesfejl" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "Kunne ikke oprette forbindelse til notifikationsdæmon." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "Sang-notifikationer" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "Viser en notifikation når sangen skiftes." #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Næste" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" "Besøg venligst Plugins-vinduet for at opsætte QLScrobbler. Indtil da vil " "sange ikke blive indsendt." #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "Kunne ikke kontakte tjenesten '%s'." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "Godkendelse fejlede: ugyldig URL." #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" "Godkendelse fejlede: ugyldigt brugernavn '%s' eller forkert adgangskode." #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "Klienten er udelukket. Kontakt forfatteren." #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "Forkert systemtid. Indsendelser kan fejle indtil det er rettet." #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "AudioScrobbler-indsendelse" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" "Audioscrobbler-klient til Last.fm, Libre.fm og andre Audioscrobbler-" "tjenester." #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "Godkendelse lykkedes." #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "_Tjeneste:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "_URL:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "User_name:" msgstr "_Brugernavn:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "_Adgangskode:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 msgid "Other…" msgstr "Anden…" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "_Bekræft kontodata" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "Konto" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Artist pattern:" msgstr "_Kunstner-mønster:" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Title pattern:" msgstr "_Titel-mønster:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "Ekskluderings_filter:" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" "Mønsteret brugt til at formatere kunstnernavnet til indsendelse. Lad være " "tom for standard." #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" "Mønsteret brugt til at formatere titlen til indsendelse. Lad være tom for " "standard." #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "Sange som matcher dette filter vil ikke blive indsendt." #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "_Offline-tilstand (indsend ikke noget)" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "Indsendelse" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "Slå lyden fra i radioreklamer" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" "Slår output fra når radioreklamer afspilles.\n" "Stationer: di.fm." #: ../quodlibet/ext/events/randomalbum.py:27 msgid "Random Album Playback" msgstr "Afspilning af tilfældigt album" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" "Starter et tilfældigt album når din spilleliste når sin slutning. Det kræver " "at din aktive browser understøtter filtrering efter album." #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "Højere bedømt" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "Afspillet oftere" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "Sprunget over oftere" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "Afspillet mere nyligt" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "Startet mere nyligt" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "Tilføjet mere nyligt" #: ../quodlibet/ext/events/randomalbum.py:44 msgid "Longer albums" msgstr "Længere album" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "sekunder før næste album startes" #: ../quodlibet/ext/events/randomalbum.py:87 msgid "Weights" msgstr "Vægtninger" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "Afspil nogle album mere end andre" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "undgå" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "foretræk" #: ../quodlibet/ext/events/randomalbum.py:201 msgid "Random Album" msgstr "Tilfældigt album" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "Venter på at starte %s" #: ../quodlibet/ext/events/rbimport.py:114 msgid "Import Failed" msgstr "Import fejlede" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "Importerede bedømmelse og statistik for %d sange" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "Rhythmbox-import" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "Importerer bedømmelser og sangstatisk fra Rhythmbox." #: ../quodlibet/ext/events/rbimport.py:132 msgid "Start Import" msgstr "Start import" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "Pauseskærm sat på pause" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "Sætter afspilning på pause når GNOME-pauseskærmen er aktiv." #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "Der er ikke installeret en søgeudbyder for Quod Libet i GNOME Shell." #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "GNOME-søgeudbyder" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "Tillader GNOME Shell at søge i biblioteket." #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "Alternativ søgelinje" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" "Alternativ søgelinje som altid er synlig og fylder hele vinduets bredde." #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "Squeezebox-synkronisering" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" "Får Logitech Squeezebox til at spejle Quod Libet-output, forudsat at begge " "læser fra et identisk bibliotek." #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "Fejl ved forsøg på at finde Squeezebox-server" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "Fejl ved forsøg på at finde %s. Tjek venligst indstillinger" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 msgid "Synchronized Lyrics" msgstr "Synkroniserede sangtekster" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" "Viser synkroniserede sangtekster fra .lrc-fil med samme navn som sporet." #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "Tekst:" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "Baggrund:" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "Skrifttype" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "Størrelse (px):" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "Telepathy-statusmeddelelser" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" "Opdaterer alle Telepathy-baserede IM-kontoer (som kofigureret i Empathy " "osv.) med en statusmeddelelse baseret på aktuelle sang." #: ../quodlibet/ext/events/telepathy_status.py:122 msgid "Playing:" msgstr "Afspiller:" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "Statustekst når en sang startes. Accepterer QL-mønstre. F.eks. %s" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "Sat på pause:" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" "Statustekst når en sang er sat på pause. Accepterer QL-mønstre. F.eks. %s" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "Almindelig tekst til status når der ikke er nogen sang" #: ../quodlibet/ext/events/telepathy_status.py:157 msgid "No song:" msgstr "Ingen sang:" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 msgid "Status Patterns" msgstr "Statusmønstre" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "Tema-skifter" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "Skifter det aktive GTK+-tema." #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "_Tema:" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "Standardtema" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "Foretræk version med mørkt tema" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "Menulinje til/fra" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "Menulinje til/fra ved tryk på Alt-tasten." #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Afspiller ikke" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "Bakkeikon" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "Styrer Quod Libet fra systembakken." #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "_Vis %(application-name)s" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 msgid "_Play" msgstr "_Afspil" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 msgid "P_ause" msgstr "_Pause" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 msgid "Pre_vious" msgstr "_Forrige" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "_Næste" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Bland" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Gentag" #: ../quodlibet/ext/events/trayicon/menu.py:86 msgid "Stop _After This Song" msgstr "Stop _efter denne sang" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 msgid "Open _Browser" msgstr "Åbn _browser" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Rediger _tags" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Information" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 msgid "Play_lists" msgstr "_Spillelister" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "_Afslut" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Adfærd" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "Rullehjul justerer lydstyrke" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "Rullehjul skifter sang" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "_Rullehjul" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Værktøjstip-visning" #: ../quodlibet/ext/events/viewlyrics.py:23 msgid "View Lyrics" msgstr "Vis sangtekster" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "Vis automatisk sangtekster under sanglisten i hovedvinduet." #: ../quodlibet/ext/events/viewlyrics.py:29 msgid "_Lyrics" msgstr "_Sangtekster" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "Start visualiseringer" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "Start eksterne visualiseringer." #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "Kunne ikke køre visualiseringer ved brug af '%s'" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 msgid "Error" msgstr "Fejl" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "Visualiserer-eksekverbar:" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "Genindlæs" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "Bølgeform søgelinje" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "En søgelinje som har form af den aktuelle sangs bølgeform." #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "Tilsidesæt forgrundsfarve:" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "Billede-gemmer" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "Gemmer cover-billedet af den aktuelle sang til en fil." #: ../quodlibet/ext/events/write_cover.py:66 msgid "File:" msgstr "Fil:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "_Tærskel:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "Tærskel indtil filteret aktiveres" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "_Forhold:" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "Komprimeringsforhold" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "%d %%" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "Lydkompressor" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" "Ændrer amplituden for alle datapunkter over en specifik tærskel med et " "bestemt forhold." #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "_Preset:" msgstr "_Forudindstilling:" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "Filter preset" msgstr "Filter-forudindstilling" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "_Frekvensklipning:" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "Frekvens for low-pass filterklipning" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "Feed-_niveau:" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "Feed-niveau" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "Standard" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "Nærmest til placering af virtuel højttaler (30°, 3 meter)" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "Chu Moy" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "Nær Chu Moy's crossfeeder (populær)" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "Jan Meier" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "Nær Jan Meier's CORDA-forstærkere (mindre ændring)" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom settings" msgstr "Brugerdefinerede indstillinger" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "Crossfeed" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" "Mikser den venstre og højre kanal på en måde som simulerer en højttaler " "under brug af hovedtelefoner eller til at justere for tidlige stereo " "optagelser." #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "Filter _band:" msgstr "Filter_bånd:" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "Frekvensbåndet af filteret" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "Filter _width:" msgstr "Filter_bredde:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "Frekvensbredden af filteret" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "_Niveau:" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "Niveauet af effekten" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "Karaoke" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "Fjerner hovedvokaler fra lyd." #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "Mono nedmiks" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "Nedmikser lydkanaler til mono." #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "_Hastighed:" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "_Tempo:" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "_Tonehøjde:" #: ../quodlibet/ext/gstreamer/pitch.py:89 msgid "Audio Pitch / Speed" msgstr "Lydtonehøjde/-hastighed" #: ../quodlibet/ext/gstreamer/pitch.py:90 msgid "Controls the pitch of an audio stream." msgstr "Styrer tonehøjden af en lydstrøm." #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 msgid "Export Playlist to Folder" msgstr "Eksportér spilleliste til mappe" #: ../quodlibet/ext/playlist/export_to_folder.py:38 msgid "_Export" msgstr "_Eksportér" #: ../quodlibet/ext/playlist/export_to_folder.py:43 msgid "Destination folder:" msgstr "Destinationsmappe:" #: ../quodlibet/ext/playlist/export_to_folder.py:58 msgid "Filename pattern:" msgstr "Filnavn-mønster:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "Eksporterer en spilleliste ved at kopiere filer til en mappe." #: ../quodlibet/ext/playlist/export_to_folder.py:156 msgid "Default filename pattern:" msgstr "Standardfilnavn-mønster:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "Eksportér til Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" "Eksporterer dynamisk en spilleliste til Logitech Squeezebox-spilleliste, " "forudsat at begge deler en mappestruktur. Deler konfiguration med <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox-synkronisering-" "plugin</a>." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "Eksportér spilleliste til Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "Spillelistenavn (vil overskrive eksisterende)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "Eksportér til Squeezebox-spilleliste" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 msgid "Remove Playlist Duplicates" msgstr "Fjern duplikater fra spilleliste" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "Fjerner duplikerede indtastninger i en spilleliste." #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Er du sikker på, at du vil fjerne %d duplikeret sang?" msgstr[1] "Er du sikker på, at du vil fjerne %d duplikerede sange?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "De duplikerede sange vil blive fjernet fra spillelisten '%s'." #: ../quodlibet/ext/playlist/shuffle.py:15 msgid "Shuffle Playlist" msgstr "Bland spilleliste" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "Blander tilfældigt en spilleliste." #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "Følg markør" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "Afspilning følger dit valg eller den næste sang i listen når opbrugt." #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "Playcount-equalizer" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "Bland, foretræk sange med færre samlet afspilninger." #: ../quodlibet/ext/playorder/playcounteq.py:25 msgid "Prefer less played" msgstr "Foretræk færre afspilninger" #: ../quodlibet/ext/playorder/queue.py:19 msgid "Queue Only" msgstr "Sæt kun i kø" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" "Begrænser afspilning af sange til køen. Vælg denne afspilningsrækkefølge i " "hovedvinduet, så vil dobbeltklik på en sang sætte den i kø i stedet for at " "afspille den." #: ../quodlibet/ext/playorder/reverse.py:14 msgid "Reverse" msgstr "Omvend" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "Vender om på afspilningsrækkefølgen af sange." #: ../quodlibet/ext/playorder/skip_songs.py:25 msgid "Skip Songs" msgstr "Spring over sange" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" "Afspilning springer over sange med en bedømmelse som er det samme som eller " "under den givne tærskel." #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "Gentag hvert spor" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "Blander sange, men gentager hvert spor et sat antal gange." #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "Antal gange som hver sang skal afspilles:" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "Betinget anmodning" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" "Vælger anmodningen som skal matches, baseret på en betingelsesanmodning. " "Syntaksen er '@(if: betingelse, then, else)'." #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "Python-anmodning" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" "Brug Python-udtryk i anmodninger. Syntaksen er '@(python: udtryk)'. " "Variablen 's' er sangen som der søges efter." #: ../quodlibet/ext/query/savedsearch.py:19 msgid "Include Saved Search" msgstr "Inkluder gemte søgninger" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" "Inkluder resultaterne af en gemt søgning som del af en anden anmodning. " "Syntaksen er '@(saved: søgenavn)'." #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "Squeezebox OK. Bruger den eneste afspiller (%s)." #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "Kunne ikke oprette forbindelse til %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "Værtsnavn:" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "Port:" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 msgid "Username:" msgstr "Brugernavn:" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "Adgangskode:" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "Biblioteksmappe som serveren opretter forbindelse til." #: ../quodlibet/ext/_shared/squeezebox/base.py:132 msgid "Library path:" msgstr "Bibliotekssti:" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "_Bekræft indstillinger" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "Squeezebox-server" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Fejlret" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Squeezebox-server hos {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "uidentificeret Squeezebox-server" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "uidentificeret Squeezebox-afspiller: %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "Vælg Squeezebox-afspiller" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "_OK" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Fandt Squeezebox-server.\n" "Vælg venligst afspilleren" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "Tilpas billede til _vindue" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "_Program:" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "_Rediger billede efter gemning" #: ../quodlibet/ext/songsmenu/albumart.py:345 msgid "File_name:" msgstr "_Filnavn:" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "Gemning fejlede" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, python-format msgid "Unable to save \"%s\"." msgstr "Kan ikke gemme \"%s\"." #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] HTTP-fejl: %s" #: ../quodlibet/ext/songsmenu/albumart.py:613 msgid "Album Art Downloader" msgstr "Albumgrafik-downloader" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "fra %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "Opløsning: %s" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, python-format msgid "Size: %s" msgstr "Størrelse: %s" #: ../quodlibet/ext/songsmenu/albumart.py:690 msgid "_Search" msgstr "_Søg" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 msgid "Searching…" msgstr "Søger…" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "Færdig" #: ../quodlibet/ext/songsmenu/albumart.py:922 msgid "Download Album Art" msgstr "Download albumgrafik" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "Downloader albumcovere fra diverse websteder." #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "Kilder" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "APEv2 til ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" "Konverterer dine APEv2-tags til ID3v2-tags. Dette vil slette APEv2-taggene " "efter konvertering." #: ../quodlibet/ext/songsmenu/bookmarks.py:23 msgid "Go to Bookmark" msgstr "Gå til bogmærke" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "Håndtér bogmærker i de valgte filer." #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 msgid "_Edit Bookmarks…" msgstr "_Rediger bogmærker…" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 msgid "No Bookmarks" msgstr "Ingen bogmærker" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 msgid "MusicBrainz Lookup" msgstr "MusicBrainz-opslag" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Gentagger et album baseret på en MusicBrainz-søgning." #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "Brug kun år til \"date\"-tag" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "Skriv \"_albumartist\" når det er nødvendigt" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "Skriv sorterings-tags for kunstnernavne" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "Skriv _standard-MusicBrainz-tags" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "Skriv \"labelid\"-tag" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Filnavn" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 msgid "Disc" msgstr "Disk" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Spor" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 msgid "Title" msgstr "Titel" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Kunstner" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 msgid "MusicBrainz lookup" msgstr "MusicBrainz-opslag" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 msgid "_Query:" msgstr "_Anmodning:" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 msgid "S_earch" msgstr "_Søg" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "Resultater <i>(træk for at ændre rækkefølge)</i>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "Indtast venligst en anmodning." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "Stødte på fejl. Prøv venligst igen." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "Indlæser resultat…" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 msgid "No results found." msgstr "Ingen resultater fundet." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 msgid "Browse Folders" msgstr "Gennemse mapper" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "Åbner sangenes mapper i en filhåndtering." #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Unable to open folders" msgstr "Kan ikke åbne mapper" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "Intet program tilgængeligt til at åbne mapper." #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "Python-konsol" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "Interaktiv Python-konsol." #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "Du kan tilgå følgende objekter som standard:" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "Din aktuelle arbejdsmappe er:" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "Kommando" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "name" msgstr "navn" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "Navnet på denne kommando" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "kommando" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "Skal-kommando-syntaksen som skal køres" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "parameter" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" "Hvis specificeret, erstattes en parameter som forekommer i kommandoen med en " "værdi som brugeren har givet, ved f.eks. at bruge 'PARAM' spørges der om " "værdien ved alle forekomster af '{PARAM}' i din kommando, når den køre" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "mønster" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" "QL-mønsteret, f.eks. <~filename>, til udregning af en værdi for kommandoen. " "For spillelister understøtter dette også virtuelle tags <~playlistname> og " "<~#playlistindex>." #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "unik" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "Hvis sat, fjerner dette duplikeret udregnede værdier af mønsteret" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "maks. argumenter" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" "Højeste antal af argumenter som videregives til kommandoen på samme tid " "(ligesom xargs)" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 msgid "Input value" msgstr "Input-værdi" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "Værdi til %s?" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 msgid "Custom Commands" msgstr "Brugerdefinerede kommandoer" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Kører brugerdefinerede kommandoer (i partier hvis krævet) på sange ved brug " "af deres tags." #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "Rediger brugerdefinerede kommandoer" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" "Understøtter QL-mønstre.\n" "F.eks. <tt><~artist~title></tt>" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, python-format msgid "Unable to run custom command %s" msgstr "Kan ikke køre brugerdefineret kommando %s" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "%d duplikeret gruppe" msgstr[1] "%d duplikerede grupper" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "Sammenfold/udfold alle" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Duplikeret nøgle-udtryk er '%s'" #: ../quodlibet/ext/songsmenu/duplicates.py:372 msgid "Duplicates Browser" msgstr "Duplikerer browser" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "Finder og viser lignende taggede versioner af sange." #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" "Accepterer QL-tag-udtryk såsom <tt>~artist~title</tt> eller " "<tt>musicbrainz_track_id</tt>" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "_Gruppér duplikater efter:" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "Duplikér nøgle" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "Fjern _blanktegn" #: ../quodlibet/ext/songsmenu/duplicates.py:424 msgid "Remove _Diacritics" msgstr "Fjern _diakritiske" #: ../quodlibet/ext/songsmenu/duplicates.py:425 msgid "Remove _Punctuation" msgstr "Fjern _tegnsætning" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "Der skelnes _ikke mellem store og små bogstaver" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "Sammenhørende valgmuligheder" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 msgid "Edit Playcount" msgstr "Rediger playcount" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" "Rediger en sangs ~#playcount og ~#skipcount.\n" "\n" "Når flere sange vælges, forøges antallet, fremfor at blive sat.\n" "\n" "Når en sangs ~#playcount indstilles til 0, ryddes ~#lastplayed og " "~#laststarted. Men når en sang med 0 afspilninger sættes til et positivt " "afspilningsantal, vil ingen afspilningsantal blive oprettet." #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "Antal afspilninger" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "Antal overspring" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "Rediger indlejrede billeder" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "Fjerner eller erstatter indlejret billeder." #: ../quodlibet/ext/songsmenu/embedded.py:78 msgid "_Remove all Images" msgstr "_Fjern alle billeder" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "_Indlejr aktuelle billede" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "Sæt præcist bedømmelse" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "Tillader at bedømmelsen af sange sættes med et tal." #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "Giv venligst din ønskede bedømmelse på en skala fra 0.0 til 1.0" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Filter on Any Tag" msgstr "Filtrér efter vilkårlig tag" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "Opretter en søgeanmodning baseret på tags fra de valgte sange." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 msgid "Filter on Directory" msgstr "Filtrér efter mappe" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "Filtrerer efter mappe i et nyt browservindue." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "Akustisk fingeraftryk-opslag" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "Foretager opslag af sangens metadata gennem akustisk fingeraftryk." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "Indsend akustisk fingeraftryk" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Genererer akustiske fingeraftryk ved brug af chromaprint og indsender dem " "til acoustid.org." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "API-nøgle mangler" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" "Du skal specificere en acoustid.org API-nøgle i plugin-præferencerne inden " "du kan indsende fingeraftryk." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "Anmod om API-nøgle" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "API-_nøgle:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "AcoustID-webtjeneste" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Sat i kø" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "Analyserer" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "Opslag" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Skriv" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "Status" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "Udgivelse" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 msgid "Write MusicBrainz tags" msgstr "Skriv MusicBrainz-tags" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 msgid "Group by directory" msgstr "Gruppér efter mappe" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "Album Mode" msgstr "Album-tilstand" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" "Skriv albumrelaterede tags og prøv at reducere antallet af forskellige " "albumudgivelser" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "Genererer fingeraftryk:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "_Detaljer" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "_Indsend" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" "Sange skal enten have et <i><b>musicbrainz_trackid</b></i>- eller " "<i><b>artist</b></i>/<i><b>title</b></i>/<i><b>album</b></i>-tags for at " "blive indsendt." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "Fingeraftryk:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "Sange med MBID'er:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "Sange med tilstrækkelige tags:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "Sange som skal indsendes:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Færdig. %(to-send)d/%(all)d sange af indsende." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "Indsender fingeraftryk:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "Indsender…" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 msgid "Update Tags in Files" msgstr "Opdater tags i filer" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" "Opdater ændrede tags i filer. Dette vil sikre at antal afspilninger og " "bedømmelser er up-to-date." #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "Eksportér til HTML" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "Eksporterer den valgte sangliste til HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "Ret MP3-varighed" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" "Fjerner TLEN-billeder fra ID3-tags hvilket kan være årsagen til ugyldige " "sang varigheder." #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "Send til iFP" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "Uploader sange til en iRiver iFP-enhed." #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "Eksportér metadata" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "Eksporterer metadata af valgte sange som en .tags-fil." #: ../quodlibet/ext/songsmenu/importexport.py:92 msgid "Import Metadata" msgstr "Importér metadata" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "Importerer metadata til valgte sange from en .tags-fil." #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "Brænd CD" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Brænder CD'er med K3b, Brasero eller xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "Opdaterer chartliste." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "Allerede up-to-date." #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "Henter chart for uge af %s." #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "Synkronisering fuldført." #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "Fejl under synkronisering" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "Last.fm-synkronisering" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "Opdaterer dit biblioteks statistik fra din Last.fm-profil." #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 msgid "_Username:" msgstr "_Brugernavn:" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "Opret sorterings-tags" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "Konverterer album- og kunstnernavne til sorteringsnavne, dårligt." #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 msgid "Migrate Metadata" msgstr "Migrér metadata" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "Kopierer de quodlibet-specifikke metadata mellem sange." #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "_Kopiér" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "_Indsæt" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 msgid "Information to copy/paste" msgstr "Information til kopiér/indsæt" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "Kortlæg spor efter disk- og spornummer" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" "Aktivér dette når du vil migrere metadata fra et album til et andet alt i " "mens disk- og spornumrene passer sammen.\n" "\n" "<b>Bemærk:</b> dette skal være aktiveret når metadata kopieres for at " "sporinformation vil blive lagret." #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "Der er %d lagret spor." msgstr[1] "Der er %d lagrede spor." #: ../quodlibet/ext/songsmenu/playlist.py:31 msgid "Export as Playlist" msgstr "Eksportér som spilleliste" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "Eksporterer sange til en M3U- eller PLS-spilleliste." #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "Brug relative stier" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "Brug absolutte stier" #: ../quodlibet/ext/songsmenu/playlist.py:132 msgid "Unable to export playlist" msgstr "Kan ikke eksportere spilleliste" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Skrivning til <b>%s</b> fejlede." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 msgid "Rescan Songs" msgstr "Genskan sange" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" "Tjekker for filændringer og genindlæser/fjerner sangene hvis det er " "nødvendigt." #: ../quodlibet/ext/songsmenu/refresh.py:31 msgid "Rescan songs" msgstr "Genskan sange" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "ReplayGain-analysator" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "Forløb" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "Forstærkning" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "Spidspunkt" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "Der er <b>%(to-process)s</b> album at opdatere (af %(all)s)" msgstr[1] "Der er <b>%(to-process)s</b> album at opdatere (af %(all)s)" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "Replay Gain" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" "Analyserer og opdaterer ReplayGain-information, ved brug af GStreamer. " "Resultater grupperes efter album." #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "altid" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "hvis <b>nogen</b> RG-tags mangler" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "hvis <b>album</b> RG-tags mangler" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "_Behandl album:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 msgid "Existing Tags" msgstr "Eksisterende tags" #: ../quodlibet/ext/songsmenu/splitting.py:31 msgid "Split Tags" msgstr "Opdel tags" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "Opdeler disknummeret fra albummet og versionen fra titlen samtidigt." #: ../quodlibet/ext/songsmenu/splitting.py:56 msgid "Split Album" msgstr "Opdel album" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "Opdel disknummer." #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "BPM:" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "utilgængelig" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 msgid "Reset" msgstr "Nulstil" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 msgid "Tap" msgstr "Tryk" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "Tap BPM" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 msgid "Tap BPM for the selected song." msgstr "Tap BPM for den valgt sang." #: ../quodlibet/ext/songsmenu/website_search.py:35 msgid "Website Search" msgstr "Websted-søgning" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" "Søger på dine valg af websteder ved brug af vilkårlige sang-tags.\n" "Understøtter mønstre. F.eks. %(pattern-example)s." #: ../quodlibet/ext/songsmenu/website_search.py:78 msgid "Search URL patterns" msgstr "Søger i URL-mønstre" #: ../quodlibet/ext/songsmenu/website_search.py:88 msgid "Edit search URLs" msgstr "Rediger søge-URL'er" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 msgid "Configure Searches…" msgstr "Konfigurér søgninger…" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "Søg hos %(website)s" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "Søg efter kunstner på Wikipedia" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" "Åbner et browservindue med Wikipedia-artikel om kunstneren af sangen som " "afspilles." #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "Søg efter album på Wikipedia" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" "Åbner et browservindue med Wikipedia-artikel om albummet for sangen som " "afspilles." #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Bibliotek" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Tjekker monteringspunkter" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Skanner bibliotek" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Skanner %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "Indlæser filer" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Kunne ikke indlæse filen: %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Vis tags" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Vis kortfattet output" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Kolonner til at vise og bestemme rækkefølge i kortfattet tilstand (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "Vis også programmatiske tags" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Ikke nok argumenter" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "For mange argumenter" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "Beskrivelse" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Værdi" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Vis alle almindelige tags" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Kopiér tags fra en fil til en anden" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Vis ændringer, anvend dem ikke" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Spring over tags som ikke kan skrives" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Kan ikke kopiere tagget %r til filen: %r" #: ../quodlibet/operon/commands.py:157 msgid "Edit tags in a text editor" msgstr "Rediger tags i et tekstredigeringsprogram" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "Redigering afbrudt" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Start af tekstredigeringsprogrammet '%(editor-name)s' fejlede." #: ../quodlibet/operon/commands.py:260 msgid "No changes detected" msgstr "Ingen ændringer detekteret" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Sæt et tag og fjern eksisterende værdier" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Kan ikke sætte %r" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "Fjern tags" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "Værdi er et regulært udtryk" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "Fjern alle tags" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "Kan ikke kombinere '--all' med '--regexp'" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "Kan ikke fjerne %r fra %r" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "Fjern en tag-værdi" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "Tilføj en tag-værdi" #: ../quodlibet/operon/commands.py:456 msgid "List file information" msgstr "Vis filinformation" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" "Sæt det medfølgende billede som primære indlejret billede og fjern alle " "andre indlejrede billeder" #: ../quodlibet/operon/commands.py:515 #, python-format msgid "Failed to load image file: %r" msgstr "Kunne ikke indlæse billedfilen: %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "Billedredigering understøttes ikke for %(file_name)s (%(file_format)s)" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "Fejl alle indlejrede billeder" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Udtræk indlejrede billeder til %(filepath)s" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "Sti til hvor billederne vil blive gemt (standard er arbejdsmappen)" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Omdøb filer baseret på tags" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Udfyld tags baseret på filstien" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Fil" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Udfyld spornumre for alle filer" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Vis tags baseret på det givne mønster" #: ../quodlibet/operon/commands.py:768 msgid "Display help information" msgstr "Viser hjælpinformation" #: ../quodlibet/operon/util.py:40 #, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "'%(column-id)s' er ikke et gyldigt kolonnenavn (%(all-column-ids)s)." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Ukendt" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "I rækkefølge" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_I rækkefølge" #: ../quodlibet/order/reorder.py:23 msgid "Random" msgstr "Tilfældig" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Tilfældig" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "Foretræk højere bedømmelse" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "Gentag dette spor" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 msgid "Repeat all" msgstr "Gentag alle" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Én sang" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Strøm" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Gemmer i buffer" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "Kunne ikke oprette GStreamer-pipeline" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "Intet GStreamer-element fundet til håndtering af medieformat" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "Medieformat: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "GStreamer-plugin'et '%(name)s' kunne ikke klargøres" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "GStreamer-output-pipelinen brugt til afspilning. Lad være tom for " "standardpipelinen. I tilfælde af at pipelinen indeholder en sink, vil den " "blive brugt frem for den som er standard." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Output-pipeline:" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f sekunder" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "_Bufferens varighed:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "Deaktivér afspilning uden _huller" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" "Deaktivering af afspilning uden huller kan forhindre problemer ved skift af " "spor med nogle versioner af GStreamer." #: ../quodlibet/player/gstbe/util.py:93 msgid "No GStreamer audio sink found" msgstr "Intet GStreamer-lydsink fundet" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "Ugyldig GStreamer-output-pipeline" #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Kan ikke oprette lyd-output" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Lydenheden %r blev ikke fundet. Tjek dine Xine-indstillinger i ~/.quodlibet/" "config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "Kunne ikke finde modulet '{module}'. Måske skal du installere pakken?" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Kunne ikke finde GStreamer-element '{element}'." #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "Kør plugin'et \"%(name)s\" på %(count)s spilleliste?" msgstr[1] "Kør plugin'et \"%(name)s\" på %(count)s spillelister?" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 msgid "_Run Plugin" msgstr "_Kør plugin" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Understøttede formater: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Lydenhed: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Begyndelse" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "Utilgængelig" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Tidspunkt" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Bogmærkenavn" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Bogmærker" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtrér" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "Nyligt _afspillet" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Nyligt _tilføjet" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 msgid "All _Songs" msgstr "Alle _sange" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "Efter aktuelle _genre(r)" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "Efter aktuelle _kunstner(e)" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "Efter aktuelle _album" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Tilfældig _genre" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Tilfældig _kunstner" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Tilfældigt _album" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "De 40 sange som du mest har afspillet (flere end 40 blive valgt hvis nogle " "er ens)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Værdi:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Gemte værdier" #: ../quodlibet/qltk/cbes.py:263 msgid "Edit saved values…" msgstr "Rediger gemte værdier…" #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "_Automatisk" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "_Spor-tilstand" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "_Album-tilstand" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "_Mute" #: ../quodlibet/qltk/controls.py:128 msgid "_Replay Gain Mode" msgstr "_Replay Gain-tilstasnd" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "Ny %s" #: ../quodlibet/qltk/data_editors.py:218 msgid "(unknown)" msgstr "(ukendt)" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "Tag-udtryk" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "Tag-udtryk. F.eks. people:real eller ~album~year." #: ../quodlibet/qltk/data_editors.py:383 msgid "Enter new tag" msgstr "Indtast nyt tag" #: ../quodlibet/qltk/delete.py:37 msgid "Files:" msgstr "Filer:" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" "De valgte sange vil blive fjernet fra biblioteket og deres filer slettet fra " "disken." #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "De valgte filer vil blive slettet fra disken." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "Slet %(file_count)d fil permanent?" msgstr[1] "Slet %(file_count)d filer permanent?" #: ../quodlibet/qltk/delete.py:91 msgid "_Delete Files" msgstr "_Slet filer" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "De valgte sange vil blive fjernet fra biblioteket og deres filer flyttet til " "papirkurven." #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "De valgte filer vil blive flyttet til papirkurven." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "Flyt %(file_count)d fil til papirkurven?" msgstr[1] "Flyt %(file_count)d filer til papirkurven?" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Flyt til papirkurv" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Flyttede %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Kan ikke flytte til papirkurv" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 msgid "Moving one or more files to the trash failed." msgstr "Flytning af en eller flere filer til papirkurven fejlede." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Sletter %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 msgid "Unable to delete files" msgstr "Kan ikke slette filer" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 msgid "Deleting one or more files failed." msgstr "Sletning af en eller flere filer fejlede." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Downloads" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Størrelse" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "_Stop" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "mangler fra %d sang" msgstr[1] "mangler fra %d sange" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "forskellig på tværs af %d sang" msgstr[1] "forskellig på tværs af %d sange" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Opdel i _flere værdier" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Opdel disk ud af _album" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Opdel _version ud af titel" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Opdel arrangør ud af _kunstner" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Opdel _performer ud af kunstner" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "Opdel _performer ud af titel" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "Opdel _original kunstner ud af titel" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Tilføj et tag" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Rediger tags" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Vis _programmatiske tags" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Tilgå alle tags, inklusiv maskingenereret, f.eks. MusicBrainz- eller Replay " "Gain-tags" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 msgctxt "edittags" msgid "_Revert" msgstr "_Tilbagefør" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "_Gem" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Kan ikke tilføje tag" #: ../quodlibet/qltk/edittags.py:660 #, python-format msgid "Unable to add <b>%s</b>" msgstr "Kan ikke tilføje <b>%s</b>" #: ../quodlibet/qltk/edittags.py:662 #, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "De valgte filer understøtter ikke flere værdier for <b>%s</b>." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Ugyldigt tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Ugyldigt tag <b>%s</b>\n" "\n" "De valgte filer understøtter ikke redigering af dette tag." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Ugyldig værdi" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Ugyldig værdi: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Tag er måske ikke korrekt" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "%(file-name)s blev ændret mens programmet kørte. Gemning uden genindlæsning " "af dit bibliotek kan overskrive andre ændringer af sangen." #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Kan ikke gemme sang" #: ../quodlibet/qltk/_editutils.py:50 #, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Gemning af %(file-name)s fejlede. Filen kan være skrivebeskyttet, ødelagt " "eller du har ikke rettigheder til at redigere den." #: ../quodlibet/qltk/_editutils.py:142 msgid "_More options…" msgstr "_Flere valgmuligheder…" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "_Fortryd" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "_Omgør" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "_Om" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "_Søg efter opdateringer…" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/exfalsowindow.py:267 #, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s og %(count)s mere" msgstr[1] "%(title)s og %(count)s mere" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Præferencer for Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "_Opdel ved:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Tag-redigering" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Mapper" #: ../quodlibet/qltk/filesel.py:253 msgid "_New Folder…" msgstr "_Ny mappe…" #: ../quodlibet/qltk/filesel.py:262 msgid "_Select all Sub-Folders" msgstr "_Vælg alle undermapper" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Ny mappe" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Indtast et navn til den nye mappe:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Kan ikke oprette mappe" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Kan ikke slette mappe" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Sange" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "af %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disk %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Spor %s" #: ../quodlibet/qltk/info.py:108 msgid "_Edit Display…" msgstr "_Rediger visning…" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Ingen sang er valgt." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Ingen sange" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Information" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Sangtekster" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Produceret af %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "kunstner" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "kunstnere" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "performere" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Aldrig" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d gang" msgstr[1] "%(n)d gange" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "tilføjet" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "sidst afspillet" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "afspiller" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "springer over" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "bedømmelse" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "sti" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "længde" #: ../quodlibet/qltk/information.py:289 msgid "format" msgstr "format" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "codec" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 msgid "encoding" msgstr "kodning" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bithastighed" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "filstørrelse" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "ændret" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "Yderligere" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d valgt" msgstr[1] "%d valgt" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Spor utilgængeligt" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Sporliste" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d sang uden album" msgstr[1] "%d sange uden album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Valgt diskografi" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d sang uden kunstner" msgstr[1] "%d sange uden kunstner" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "album" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Samlet længde:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Samlet størrelse:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Filer" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:40 msgid "_Edit" msgstr "_Rediger" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Ingen sangtekster fundet til denne sang." #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "Søger efter sangtekster…" #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "Er du sikker på, at du vil fjerne alle sange?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "De valgte sange vil blive fjernet fra biblioteket." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "Fjern fra skjul" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "_Fjern fra skjul" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Forkast ændringer af tag?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tags er blevet ændret men ikke gemt. Gem disse filer eller tilbagefør og " "forkast ændringer?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 msgid "_Revert" msgstr "_Tilbagefør" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Filen findes" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "Erstat %(file-name)s?" #: ../quodlibet/qltk/msg.py:94 msgid "_Replace File" msgstr "_Erstat fil" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Aktive opgaver" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d opgaver kører" #: ../quodlibet/qltk/playorder.py:254 msgid "Toggle shuffle mode" msgstr "Bland-tilstand til/fra" #: ../quodlibet/qltk/playorder.py:270 msgid "Toggle repeat mode" msgstr "Gentag-tilstand til/fra" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Pluginfejl" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Aktiveret" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Deaktiveret" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Ingen kategori" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "Begivenheder" #: ../quodlibet/qltk/pluginwin.py:170 msgid "Play Order" msgstr "Afspilningsrækkefølge" #: ../quodlibet/qltk/pluginwin.py:171 msgid "Editing" msgstr "Redigering" #: ../quodlibet/qltk/pluginwin.py:173 msgid "Covers" msgstr "Covere" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Ingen plugins fundet." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Plugins" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Vis _fejl" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disk" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Spor" #: ../quodlibet/qltk/prefs.py:47 msgid "Grou_ping" msgstr "_Gruppering" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "_Album" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Filnavn" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Længde" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Hop automatisk til sangen som afspilles" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Når sangen som afspilles skiftes, rul den ind i sanglisten" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Andre:" #: ../quodlibet/qltk/prefs.py:88 msgid "_Edit…" msgstr "_Rediger…" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Tilføj eller fjern yderligere kolonne-headere" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Synlige kolonner" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Titel inkluderer _version" #: ../quodlibet/qltk/prefs.py:106 msgid "Artist includes all _people" msgstr "Kunstner inkluderer alle _personer" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Album inkluderer _disk-undertitel" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Filnavn inkluderer _mappe" #: ../quodlibet/qltk/prefs.py:123 msgid "Column Preferences" msgstr "Kolonne-præferencer" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Anvend aktuelle konfiguration til sangliste, hvor ved nye kolonner tilføjes " "til slutningen" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Sangliste" #: ../quodlibet/qltk/prefs.py:222 msgid "Edit Columns" msgstr "Rediger kolonner" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "Samlet varighed" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Globalt filter:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Anvend endvidere denne anmodning udover alle andre" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 msgctxt "heading" msgid "Search" msgstr "Søgning" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Browsere" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Bekræft _flere bedømmelser" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Spørg om bekræftelse før ændring af bedømmelse af flere sange på en gang" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Aktivér bedømmelser med ét _klik" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "Aktivér bedømmelse ved klik på bedømmelseskolonnen i sanglisten" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Bedømmelser" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Foretræk _indlejret grafik" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Vælg at bruge grafik indlejret i lyden (når det er muligt) frem for andre " "kilder" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "_Fast billedfilnavn:" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "Det eneste billedfilnavn der skal bruges hvis valgt" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "Albumgrafik-billedefil som skal bruges når tvunget" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Albumgrafik" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Afspilning" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Output-konfiguration" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Hvis der ikke er nogen Replay Gain-information tilgængelig for en sang, så " "skaleres lydstyrken af denne værdi" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "_Fall-back forstærkning (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Skalér lydstyrke for alle sange med denne værdi, så længe resultatet ikke " "klippes" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "_Pre-amp forstærkning (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "_Aktivér justering af lydstyrke for Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Justering af lydstyrke for Replay Gain" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "_Standardbedømmelse:" #: ../quodlibet/qltk/prefs.py:493 msgid "Rating _scale:" msgstr "Bedømmelses_skalering:" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Bayesian Average factor (C) til indsamlende bedømmelser.\n" "0 betyder et konventionelt gennemsnit, højere værdier betyder at albums med " "få spor vil have mindre ekstrem bedømmelse. Når denne værdi ændres udløser " "det en genudregning af alle albums." #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "_Bayesian gennemsnitlig mængde:" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Gem bedømmelser og _antal afspilninger" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_E-mail:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "Bedømmelser og antal afspilninger vil blive sat for denne e-mail-adresse" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Gem automatisk ændringer af tag" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "Gem ændringer til tags uden bekræftelse når flere filer redigeres" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Et sæt af separatorer som skal bruges når tag-værdier opdeles i tag-" "editoren. Listen er mellemrumssepareret" #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Tags" #: ../quodlibet/qltk/prefs.py:631 msgid "Updating for new ratings" msgstr "Opdaterer for nye bedømmelser" #: ../quodlibet/qltk/prefs.py:641 msgid "Scan library _on start" msgstr "_Skan bibliotek ved start" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 msgid "_Scan Library" msgstr "_Skan bibliotek" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Søg efter ændringer i dit bibliotek" #: ../quodlibet/qltk/prefs.py:658 msgid "Re_build Library" msgstr "_Genbyg bibliotek" #: ../quodlibet/qltk/prefs.py:661 msgid "Reload all songs in your library. This can take a long time." msgstr "Genindlæs alle sange i dit bibliotek. Dette kan tage lang tid." #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "Mapper som skal skannes" #: ../quodlibet/qltk/prefs.py:677 msgid "Hidden Songs" msgstr "Skjulte sange" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s og %(count)d mere" msgstr[1] "%(title)s og %(count)d mere" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Egenskaber" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Kø" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "Stop når tom" #: ../quodlibet/qltk/queue.py:129 msgid "_Clear Queue" msgstr "_Ryd kø" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d sang (%(time)s)" msgstr[1] "%(count)d sange (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Gennemse bibliotek" #: ../quodlibet/qltk/quodlibetwindow.py:395 msgid "Toggle queue visibility" msgstr "Køens synlighed til/fra" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "Fejl ved afspilning" #: ../quodlibet/qltk/quodlibetwindow.py:524 msgid "Set up library directories?" msgstr "Opsæt biblioteksmapper?" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "Du har ikke opsat nogen musikbiblioteker. Vil du gøre det nu?" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "_Ikke nu" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "_Sæt op" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Kan ikke tilføje sange" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s bruger en ikke-understøttet protokol." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Hop til sangen som afspilles" # scootergrisen: jeg prøver med "Arkiv" fremfor "Fil/Filer" for at afprøve det lidt #: ../quodlibet/qltk/quodlibetwindow.py:986 msgid "_File" msgstr "_Arkiv" #: ../quodlibet/qltk/quodlibetwindow.py:987 msgid "_Song" msgstr "_Sang" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Visning" #: ../quodlibet/qltk/quodlibetwindow.py:989 msgid "_Browse" msgstr "_Gennemse" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Betjening" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Hjælp" #: ../quodlibet/qltk/quodlibetwindow.py:997 msgid "_Add a Folder…" msgstr "_Tilføj en mappe…" #: ../quodlibet/qltk/quodlibetwindow.py:1002 msgid "_Add a File…" msgstr "_Tilføj en fil…" #: ../quodlibet/qltk/quodlibetwindow.py:1007 msgid "_Add a Location…" msgstr "_Tilføj en placering…" #: ../quodlibet/qltk/quodlibetwindow.py:1036 msgid "Edit Bookmarks…" msgstr "Rediger bogmærker…" #: ../quodlibet/qltk/quodlibetwindow.py:1056 msgid "Stop After This Song" msgstr "Stop efter denne sang" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "_Tastaturgenveje" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Onlinehjælp" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Søgehjælp" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Tilføj en placering" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Indtast placeringen af en lydfil:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Kan ikke tilføje placering" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, python-format msgid "%s is not a valid location." msgstr "%s er ikke en gyldig placering." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Tilføj musik" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 msgid "_Add Folders" msgstr "_Tilføj mapper" #: ../quodlibet/qltk/quodlibetwindow.py:1379 msgid "Music Files" msgstr "Musikfiler" #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "_Add Files" msgstr "_Tilføj filer" #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Er du sikker på, at du vil ændre bedømmelsen af alle %d sange?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "De gemte bedømmelser vil blive fjernet" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Bedømmelsen af alle valgte sange vil blive ændret til '%s'" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 msgid "_Remove Rating" msgstr "_Fjern bedømmelse" #: ../quodlibet/qltk/ratingsmenu.py:98 msgid "Change _Rating" msgstr "_Skift bedømmelse" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Erstat mellemrum med _understregningstegn" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Fjern tegn som er inkompatible med _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Fjern _diakritiske tegn" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Fjern ikke-_ACSII-tegn" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Brug kun _små bogstaver" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Omdøb filer" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Sti-mønstre" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 msgid "Edit saved patterns…" msgstr "Rediger gemte mønstre…" #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Forhåndsvis" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nyt navn" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Kan ikke omdøbe fil" #: ../quodlibet/qltk/renamefiles.py:256 #, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Omdøbning af <b>%(old-name)s</b> til <b>%(new-name)s</b> fejlede. Målfilen " "findes muligvis allerede eller du har ikke rettighed til at oprette den nye " "fil eller fjerne den gamle." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Ignorer _alle fejl" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Fortsæt" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Stien er ikke absolut" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Mønsteret\n" "\t<b>%s</b>\n" "indeholder / men starter ikke fra roden. Brug rodning for at forhindre " "fejlnavngivne mapper ved at starte dit mønster med / or ~/." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Sange i de viste mapper vil blive føjet til biblioteket under genindlæsning " "af et bibliotek" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Vælg mapper" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Gemte søgninger" #: ../quodlibet/qltk/searchbar.py:53 msgid "Edit saved searches…" msgstr "Rediger gemte søgninger…" #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "Søg i dit bibliotek ved brug af fri tekst eller QL-anmodninger" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Søg efter _skrivning" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Vis søgeresultater når brugeren stopper med at skrive." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Grænse:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Vægtning" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Vis resterende tid" #: ../quodlibet/qltk/shortcuts.py:16 msgid "Main Window" msgstr "Hovedvindue" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "Søg baglæns 10 sekunder" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "Søg fremad 10 sekunder" #: ../quodlibet/qltk/shortcuts.py:19 msgid "Focus the search entry" msgstr "Giv fokus til søgeindtastningen" #: ../quodlibet/qltk/shortcuts.py:22 msgid "Reset filters and jump to the playing song" msgstr "Nulstil filtre og hop til sangen som afspilles" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "Åbn informationsvinduet for de valgte sange" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "Åbn tag-editoren for de valgte sange" #: ../quodlibet/qltk/shortcuts.py:28 msgid "Queue the selected songs" msgstr "Sæt de valgte sange i kø" #: ../quodlibet/qltk/shortcuts.py:29 msgid "Delete the selected songs" msgstr "Slet de valgte sange" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "Vis den indbyggede søgeindtastning" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "Venstreklik på en kolonne-header" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "Tilføj kolonnen til listen med kolonner som sorteres efter" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "Træ-visning" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "Sammenfold elementet eller vælg forælder-elementet" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "Udfold elementet" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "Tekstindtastninger" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "Omgør den sidste fortryd-ændring" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "Vælg alle sange i alle ruder" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtrér efter %s" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "Alle _headere" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Spor-headere" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Album-headere" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Personer-headere" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Dato-headere" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_Fil-headere" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Produktion-headere" #: ../quodlibet/qltk/songlist.py:1115 msgid "_Customize Headers…" msgstr "_Brugerdefinerede headere…" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "_Udfold kolonne" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "Kør plugin'et \"%(name)s\" på %(count)d sang?" msgstr[1] "Kør plugin'et \"%(name)s\" på %(count)d sange?" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "Kør plugin'et \"%(name)s\" på %(count)d album?" msgstr[1] "Kør plugin'et \"%(name)s\" på %(count)d album?" #: ../quodlibet/qltk/songsmenu.py:149 msgid "Configure Plugins…" msgstr "Konfigurér plugins…" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Føj til _kø" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Kopiér til enhed" #: ../quodlibet/qltk/songsmenu.py:378 msgid "_Remove from Library" msgstr "_Fjern fra bibliotek" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Erstat _understregningstegn med mellemrum" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Foretag title-case af tags" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Opdel i flere _værdier" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tags fra sti" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Tags erstatter de eksisterende" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Tags tilføjes til de eksisterende" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "Gem" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Mønsteret\n" "\t<b>%s</b>\n" "er ugyldigt. Det indeholder muligvis det samme tag to gange eller det har " "ubalancerede parenteser (</>)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Ugyldige tags" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Ugyldigt tags <b>%s</b>\n" "\n" "De valgte filer understøtter ikke redigering af disse tags." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Mønsteret du har indtastet var ugyldigt. Sørg for at du indtaster < og " "> som \\< og \\> og at dine tags er balanceret.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Rediger visning" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Spornumre" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Start _fra:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Samlet spor:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Afspil/pause" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Forrige" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "og %d mere…" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Gemmer sangene du ændrede." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d sange gemt\n" "(%(remaining)s tilbage)" #: ../quodlibet/qltk/wlw.py:234 #, python-format msgid "%(current)s of %(all)s" msgstr "%(current)s af %(all)s" #: ../quodlibet/update.py:89 msgid "Checking for Updates" msgstr "Søger efter opdateringer" #: ../quodlibet/update.py:124 msgid "Connection failed" msgstr "Forbindelsen fejlede" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "Du bruger allerede den seneste version %(version)s" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" "En ny version %(new-version)s er tilgængelig\n" "\n" "Du bruger i øjeblikket version %(old-version)s\n" "\n" "Besøg <a href='%(url)s'>webstedet</a>" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "Spillelister skal have et navn" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "En spilleliste ved navn %s findes allerede." #: ../quodlibet/util/cover/built_in.py:26 msgid "Embedded album covers" msgstr "Indlejrede albumcovere" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "Bruger covere som er indlejrede i lydfiler." #: ../quodlibet/util/cover/built_in.py:49 msgid "Filesystem cover" msgstr "Filsystemets cover" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" "Bruger billeder med almene navn fundet i mapper med almene mapper sammen med " "sangen." #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Vis kortfattet forbrugsinformation" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Vis version og ophavsret" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Anvendelse: %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[valgmulighed]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Valgmuligheden %r genkendes ikke." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Valgmuligheden %r kræver et argument." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r er ikke et unikt præfiks." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%s sekund" msgstr[1] "%s sekunder" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Ingen information om tid" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekund" msgstr[1] "%d sekunder" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minut" msgstr[1] "%d minutter" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d time" msgstr[1] "%d timer" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dag" msgstr[1] "%d dage" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d år" msgstr[1] "%d år" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 msgctxt "check" msgid "titlecase?" msgstr "Pølse!" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Datoen skal indtastes i formaterne 'YYYY', 'YYYY-MM-DD' eller 'YYYY-MM-DD HH:" "MM:SS'." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Replay Gain forstærkninger skal indtastes i 'x.yy dB'-format." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Replay Gain spidspunkter skal indtastes i 'x.yy'-format." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz-ID'er skal være i UUID-format." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz-udgivelsesstatus skal være 'official', 'promotional', eller " "'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Sprog skal være en trecifret ISO 639-2-kode" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Kan ikke redigere sang" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Gemning af <b>%s</b> fejlede. Filen kan være skrivebeskyttet, ødelagt eller " "du har ikke rettigheder til at redigere den." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[ugyldig kodning]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arrangør" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arrangører" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "arrangement" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "forfatter" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "forfattere" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "komponist" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "komponister" #: ../quodlibet/util/tags.py:78 msgid "composition" msgstr "komposition" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "dirigenter" #: ../quodlibet/util/tags.py:80 msgid "conducting" msgstr "dirigering" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "ophavsret" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "dato" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "beskrivelse" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:85 msgid "genres" msgstr "genrer" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "performer" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "gruppering" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "sprog" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licens" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "sted" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "tekstforfatter" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "tekstforfattere" #: ../quodlibet/util/tags.py:91 msgid "lyrics" msgstr "sangtekster" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organisation" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "titel" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "version" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "websted" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "albumkunstner" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "disk-undertitel" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disk" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "spor" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "etiket-ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "original udgivelsesdato" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "originalt album" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "original kunstner" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "optagelsesdato" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "udgivelsesland" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz recording ID" msgstr "MusicBrainz optagelse-ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz release track ID" msgstr "MusicBrainz udgivelsesspor-ID" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "MusicBrainz udgivelse-ID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz artist ID" msgstr "MusicBrainz kunstner-ID" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz release artist ID" msgstr "MusicBrainz udgivelseskunstner-ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM-ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz albumstatus" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz albumtype" #: ../quodlibet/util/tags.py:129 msgid "MusicBrainz release group ID" msgstr "MusicBrainz udgivelsesgruppe-ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "sporets forstærkning" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "sporets spidspunkt" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "albummets forstærkning" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "albummets spidspunkt" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "reference loudness" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "diske" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "spor" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "sidst startet" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "fulde navn" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "monteringspunkt" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "personer" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "år" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "originalt udgivelsesår" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "bogmærke" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "filformat" #: ../quodlibet/util/tags.py:165 msgid "playlists" msgstr "spillelister" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "antal kanaler" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "slags" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "roller" ����������������������������������������quodlibet-3.9.1/po/fr.po����������������������������������������������������������������������������0000644�0001750�0001750�00000612771�13115512743�015347� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# translation of fr.po to Français # Olivier Gambier <dev@viapanda.com>, 2006. # Ludovic DRUETTE <ludovicdruette@gmail.com>, 2016. # Olivier Humbert <trebmuh@tuxfamily.org>, 2017. # Jean-Michel Pouré <jm@poure.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2017-02-17 10:45+0100\n" "Last-Translator: Jean-Michel Pouré <jm@poure.com>\n" "Language-Team: français <>\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.7\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Éditer les étiquettes dans vos fichiers audio" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" "Ex Falso est un éditeur d'étiquette avec la même interface d'édition que " "Quod Libet. Il vous permet de voir et d'éditer n'importe quelles étiquettes " "que vous voulez, pour tous les formats de fichiers supportés." #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" "Gère les formats de fichier Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Éditeur d'étiquettes audio (tags)" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Écouter, parcourir ou éditer votre collection musicale" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" "Quod Libet est un gestionnaire de musique, qui permet de gérer votre " "bibliothèque audio avec beaucoup de souplesse, et offre un accès aux radio " "Internet et aux flux audio. En outre, il offre des fonctions étendues de " "gestion des méta-étiquettes et permet de puissantes recherches." #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Lecteur" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "_Titre" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artiste" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Date" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "Évaluation" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 msgid "Sort _by…" msgstr "_Trier par…" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Préférences" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Liste des albums" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Liste des _albums" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Tous les albums" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albums" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Recharger la _jaquettes de l'album" msgstr[1] "Recharger les _jaquettes de l'album" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Titres absents d'un album" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d piste" msgstr[1] "%d pistes" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disque" msgstr[1] "%d disques" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 msgid "An Example Album" msgstr "Un exemple d'album" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Préférences de l'affichage liste d'albums" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Montrer les _jaquettes des albums" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Inclure les personnes dans la _recherche" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 msgid "Options" msgstr "Options" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Affichage des albums" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "_Fermer" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Inconnu(e)" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Nouveau flux" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Saisir l'adresse d'un flux audio :" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "_Ajouter" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Flux audio" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Flux audio" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 msgid "_Download…" msgstr "_Télécharger…" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Télécharger les fichiers" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "Enregi_strer" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Télécharger le fichier" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "_Nouveau" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Impossible d'importer le flux" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "%s n'a pas pu être ajouté. Le serveur est peut-être en dérangement ou la " "ressource n'est pas un flux audio." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 msgid "_Refresh" msgstr "_Rafraîchir" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 msgid "_Delete" msgstr "_Supprimer" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Le système audio ne supporte pas les URLs. Les flux audio ont été désactivés." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Navigateur de bibliothèque" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d titre" msgstr[1] "%d titres" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Motif invalide" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Collection d'albums" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "_Collection d'albums" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "Inconnu(e) %s" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "%s multiples valeurs" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Autre" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 msgid "_Remove" msgstr "Supp_rimer" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Étiquette" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Fusionner" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Préférences de la collection d'albums" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "_Appliquer" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "_Annuler" #: ../quodlibet/browsers/covergrid/main.py:125 msgid "Cover Grid" msgstr "Mur de jaquettes" #: ../quodlibet/browsers/covergrid/main.py:126 msgid "_Cover Grid" msgstr "Mur de jaquettes" #: ../quodlibet/browsers/covergrid/prefs.py:54 msgid "Cover Grid Preferences" msgstr "Préférences du mur de jaquettes" #: ../quodlibet/browsers/covergrid/prefs.py:64 msgid "Show album _text" msgstr "Montrer les _textes des albums" #: ../quodlibet/browsers/covergrid/prefs.py:71 msgid "Show \"All Albums\" Item" msgstr "Montrer l'élément \"Tous les albums\"" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "Séparer verticalement" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 msgid "Cover Magnification" msgstr "Échelle de la jaquette" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Système de fichiers" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Système de fichiers" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Impossible de copier les titres" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Impossible de copier les fichiers sélectionnés vers des listes de titres ou " "dans la file d'attente" #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Ajouter à la bibliothèque" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Type de fichier non supporté" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Les listes de radio doivent contenir uniquement des emplacements de radio. " "Elles ne peuvent pas contenir des listes de radio ou des listes de lecture. " "Impossible de charger les emplacements suivants :\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Impossible d'ajouter la radio" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Radio Internet" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Télécharger la liste des stations" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Nouvelle radio Internet" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Saisissez l'adresse d'une radio Internet:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Électronique" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "Souhaitez-vous charger une liste de stations de radios populaires ?" #: ../quodlibet/browsers/iradio.py:455 msgid "_Load Stations" msgstr "_Charger les stations" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Radio Internet" #: ../quodlibet/browsers/iradio.py:538 msgid "_New Station…" msgstr "_Nouvelle station…" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "_Mise à jour des stations" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Toutes les stations" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Favoris" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Aucune catégorie" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Aucune radio trouvée." #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Aucune station radio ne correspond à %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Tous les radios listées sont déjà dans votre bibliothèque." #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "_Ajouter à la liste des favoris" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Supprimer des Favoris" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d radio" msgstr[1] "%(count)d radios" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Propriétés du périphérique" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Périphérique :" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Non monté" #: ../quodlibet/browsers/media.py:55 msgid "Mount point:" msgstr "Point de montage :" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Nom :" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Périphériques multimedia" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "Périphériques _multimedia" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Éjecter" #: ../quodlibet/browsers/media.py:360 msgid "_Properties" msgstr "_Propriétés" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "Re_nommer" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%(used-size)s utilisé(es), %(free-size)s disponible(s)" #: ../quodlibet/browsers/media.py:479 #, python-format msgid "%s is not connected." msgstr "%s n'est pas connecté." #: ../quodlibet/browsers/media.py:499 #, python-format msgid "Copying %(song)s" msgstr "Copie de %(song)s" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Impossible de copier le titre" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Espace libre insuffisant pour ce titre" #: ../quodlibet/browsers/media.py:526 #, python-format msgid "%s could not be copied." msgstr "%s n'a pas pu être copié." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Impossible de supprimer les titres" #: ../quodlibet/browsers/media.py:557 #, python-format msgid "Deleting %(song)s" msgstr "Suppression en cours de %(song)s" #: ../quodlibet/browsers/media.py:575 #, python-format msgid "%s could not be deleted." msgstr "%s ne peut pas être supprimé." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Impossible de supprimer le titre" #: ../quodlibet/browsers/media.py:594 #, python-format msgid "Ejecting %s failed." msgstr "L'éjection de %s a échoué." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Impossible d'éjecter le périphérique" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" "Aucun périphérique, désactivation du navigateur de périphériques de média." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Navigateur à panneaux" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "Navigateur à _panneaux" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Choisir _tous" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Tous" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" "Ajouter au motif une balise optionnelle, par exemple <tt>composer</tt> ou\n" "<tt>%s</tt>" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "Mode Pleine largeur" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Préférences du navigateur à panneaux" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Listes de lecture" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Listes de lecture" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Supp_rimer de la liste de lecture" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importer" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Créer une liste de lecture" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Impossible d'importer la liste de lecture" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet ne peut importer que des listes de lecture au format M3U ou PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Impossible de renommer la liste de lecture" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importer une liste de lecture" #: ../quodlibet/browsers/playlists/menu.py:25 msgid "_New Playlist…" msgstr "_Nouvelle liste de lecture…" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Que souhaitez-vous faire de ce %d titre ?" msgstr[1] "Que souhaitez-vous faire de ces %d titres ?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Confirmez l'action pour la liste de lecture \"%s\"" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "Vide" #: ../quodlibet/browsers/playlists/prefs.py:39 msgid "Example Playlist" msgstr "Exemple de liste de lecture" #: ../quodlibet/browsers/playlists/prefs.py:47 msgid "Playlist Browser Preferences" msgstr "Préférences du navigateur de liste de lecture" #: ../quodlibet/browsers/playlists/prefs.py:52 msgid "Playlist display" msgstr "Affichage de liste de lecture" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Confirmer la suppression de la liste de lecture '%s' ?" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Toutes les informations de cette liste de lecture vont être supprimées et ne " "pourront être récupérées" #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Saisissez un nom pour la nouvelle liste de lecture:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importation de liste de lecture.\n" "\n" "%(current)d/%(total)d titres ajoutés." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Limiter les résultats" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Rechercher dans la bibliothèque" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Rechercher dans la bibliothèque" #: ../quodlibet/browsers/soundcloud/main.py:38 msgid "Soundcloud Browser" msgstr "Navigateur Soundcloud" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "Sound_cloud" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Rechercher" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "Aller à %s" #: ../quodlibet/browsers/soundcloud/main.py:380 msgid "Connected" msgstr "Connecté" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "Quod Libet est maintenant connecté, <b>%s</b>!" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "Se déconnecter de %s" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "Saisir le code …" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "Se connecter à %s" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "Autorisation Soundcloud" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "Saisir le code d'authentification Soundcloud :" #: ../quodlibet/cli.py:50 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "" "Quod Libet n'est pas en fonctionnement (ajouter '--run' pour le lancer)" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "un lecteur et une bibliothèque de musique" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[option]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Afficher le titre en cours de lecture et quitter" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Commencer la lecture immédiatement" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "Cacher toutes les fenêtres au démarrage" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Aller au titre suivant" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "Aller au titre précédent ou recommencer si proche du début" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Aller au titre précédent" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Commencer la lecture" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Suspendre la lecture" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Basculer entre le mode lecture et pause" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Arrêter la lecture" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Augmenter le volume" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Diminuer le volume" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Afficher l'état du lecteur" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Cacher la fenêtre principale" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Afficher la fenêtre principale" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Basculer la visibilité de la fenêtre principale" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Focaliser le lecteur en fonction" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Enlever les filtres actifs du navigateur" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Rafraîchir et rescanner la bibliothèque" #: ../quodlibet/cli.py:110 msgid "List available browsers" msgstr "Lister les navigateurs disponibles" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Afficher la liste de lecture" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Afficher le contenu de la file d'attente" #: ../quodlibet/cli.py:113 msgid "Print the active text query" msgstr "Afficher le texte de la recherche en cours" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Démarrer sans greffons" #: ../quodlibet/cli.py:115 msgid "Start Quod Libet if it isn't running" msgstr "Démarrer Quod Libet s'il n'est pas en fonctionnement." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Quitter Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Se déplacer dans le titre en cours de lecture" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 msgid "Set or toggle shuffle mode" msgstr "Activer ou désactiver la lecture aléatoire" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Activer, désactiver ou basculer le mode répétition" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Régler le volume" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Rechercher dans votre bibliothèque de musique" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "requête" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Lire un fichier" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 msgctxt "command" msgid "filename" msgstr "nom de fichier" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Évaluer le titre en cours de lecture" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Définir le navigateur courant" #: ../quodlibet/cli.py:129 msgid "Stop after the playing song" msgstr "Arrêter après ce titre" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Démarrer un nouveau navigateur" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Afficher ou cacher la file d'attente" #: ../quodlibet/cli.py:133 msgid "Show or hide the main song list (deprecated)" msgstr "Afficher ou cacher la liste principale des titres (abandonné)" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtrer au hasard" #: ../quodlibet/cli.py:134 msgctxt "command" msgid "tag" msgstr "étiquette" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtrer sur la valeur d'une étiquette" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "étiquette=valeur" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "" "Mettre un fichier ou le résultat d'une recherche dans la file d'attente" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" "Mettre des fichiers séparés par un point-virgule dans la file d'attente" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "nom de fichier" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Afficher les résultats de la requête dans la sortie standard stdout" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Enlever un fichier ou le résultat d'une recherche de la file d'attente" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Argument non valide pour '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Essayez %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Périphérique inconnu" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "Impossible d'importer %s, qui est nécessaire au support matériel." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "Le système %r n'est pas supporté." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "Impossible de trouver '%s'." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Initialisation du gestionnaire de périphériques." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Tentative avec '%s'" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Impossible de se connecter au gestionnaire de périphériques." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Gestionnaire de périphériques initialisé." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "Motif du nom de _fichier :" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copier les jaquettes des _albums" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "Enleve_r les jaquettes et les dossiers inutilisés" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Une erreur est survenue" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 #, fuzzy msgid "Submit Error Report" msgstr "Port de l'intermédiaire" #: ../quodlibet/errorreport/ui.py:75 #, fuzzy msgid "Quit Program" msgstr "_Programme :" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Ignorer _toutes les erreurs" #: ../quodlibet/errorreport/ui.py:80 #, fuzzy msgid "Error details:" msgstr "Détails concernant l'erreur" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "description" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "un éditeur d'étiquettes (tags) audio" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "répertoire" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "URL des sources de jaquettes" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" "Télécharge les jaquettes liée à l'étiquette artwork_url. Fonctionne " "également dans le navigateur SounCloud." #: ../quodlibet/ext/covers/discogs.py:25 msgid "Discogs Cover Source" msgstr "Jaquettes depuis Discogs" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "Télécharger les jaquettes depuis Discogs." #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "Jaquettes depuis Last.fm" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Télécharger les jaquettes depuis les archives d'illustrations Last.fm." #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "MusicBrainz Cover Source" msgstr "Source d'illustrations MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" "Télécharger les jaquettes depuis les archives d'illustrations MusicBrainz." #: ../quodlibet/ext/editing/iconv.py:26 msgid "Convert Encodings" msgstr "Transcoder" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" "Corriger dans l'éditeur d'étiquettes les étiquettes comportant des erreurs " "d'encodage." #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "_Convertir le codage" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "Substitution Regex" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Autorise les substitutions regex (//s) durant l'étiquetage ou le renommage " "des fichiers." #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title Case" msgstr "Casse du titre" #: ../quodlibet/ext/editing/titlecase.py:21 msgid "Title-cases tag values in the tag editor." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:40 msgid "Title-_case Value" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "Autoriser les titres entièrement en MAJUSCULES" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Modifier le titre selon les règles typographiques britanniques (majuscule à " "chaque nom), en écrivant par exemple \"Dark Night of the Soul\"" #: ../quodlibet/ext/events/advanced_preferences.py:69 msgid "Advanced Preferences" msgstr "Préférences avancées" #: ../quodlibet/ext/events/advanced_preferences.py:70 #, fuzzy msgid "Allow editing of advanced config settings." msgstr "Permet un réglage fin des paramètres de configuration" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "Je confirme comprendre ce que je fais" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "Incrustation d'informations" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "Afficher les informations concernant un titre dès qu'il est modifié." #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "Haut d'écran" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "Milieu d'écran" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "Bas d'écran" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "_Position" #: ../quodlibet/ext/events/animosd/prefs.py:171 msgid "_Cover size:" msgstr "Taille de la jaquette :" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 msgid "Display" msgstr "Affichage" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "_Police :" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "Gauche" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "Centre" #: ../quodlibet/ext/events/animosd/prefs.py:197 msgid "Right" msgstr "Droite" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "_Alignement :" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "Texte" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "_Texte :" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "Remplissage :" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "Couleurs" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "Ombré" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "S_ouligné" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "Coins arrondis" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "_Délai :" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "Effets" #: ../quodlibet/ext/events/animosd/prefs.py:270 msgid "Ed_it Display Pattern…" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 msgid "Preview" msgstr "A_perçu" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "Rafraîchir la bibliothèque automatiquement" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "Maintenir votre bibliothèque à jour avec inotify. Dépend de %s" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "Masquer automatiquement" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" "Afficher et masquer automatiquement les lecteurs lorsqu'ils sont montés ou " "démontés." #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "Évaluation automatique" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" "Évaluer automatiquement les titres, selon qu'il sont joués ou passés. Cette " "méthode utilise l'algorithme 'accéléré' de vux par Brian Nelson." #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "Réveille-matin" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "Vous réveille en musique" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "Plat" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "Écouteurs" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "Égaliseur" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "Le gestionnaire de périphérique ne supporte pas d'équalisateur." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "%.1f kHz" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "%d Hz" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, python-format msgid "%.1f dB" msgstr "%.1f dB" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom" msgstr "Personnalisé" #: ../quodlibet/ext/events/equalizer.py:199 msgid "_Clear" msgstr "_Nettoyer" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "en ligne" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "non-connecté" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "invisible" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "en pause" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "Suspendre la lecture quand le casque audio est débranché" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" "Suspendre la lecture quand le casque audio est débranché et la reprendre dès " "qu'il est rebranché." #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "Désactiver l'économiseur d'écran" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "Désactive l'économiseur d'écran durant la lecture d'un titre." #: ../quodlibet/ext/events/inhibit.py:51 msgid "Music is playing" msgstr "La musique est en cours de lecture" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "Internet Radio Log" msgstr "Logs radio Internet" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" "Enregister les 10 derniers titres joués sur les stations radio, et les " "lister dans le menu contextuel." #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 msgid "Change Language" msgstr "Changer la langue" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "Afficher l'interface utilisateur dans une autre langue." #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "Valeurs systèmes par défaut" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "Pour appliquer les changements, un redémarrage est nécessaire" #: ../quodlibet/ext/events/lyricswindow.py:199 msgid "No active song" msgstr "Aucun titre actif" #: ../quodlibet/ext/events/lyricswindow.py:215 msgid "No lyrics found" msgstr "Les paroles n'ont pas été trouvées." #: ../quodlibet/ext/events/lyricswindow.py:227 msgid "Lyrics:" msgstr "Paroles :" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "Niveau de _Zoom :" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "URL :" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "Rétablir les valeurs par défaut" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" "Effectuer une recherche en utilisant l'URL ci-dessous si les paroles n'ont " "pu être trouvées dans LyricsWika." #: ../quodlibet/ext/events/lyricswindow.py:339 msgid "Alternate search" msgstr "Recherche alternative" #: ../quodlibet/ext/events/lyricswindow.py:347 msgid "Lyrics Window" msgstr "Fenêtre des paroles" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "Afficher les paroles du titre en cours de lecture dans un fenêtre." #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "Serveur UPnP AV Media" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" "Rendre disponible les albums via le serveur de média UPnP Rygel, en " "utilisant l'interface D-Bus MediaServer2." #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "Serveur MPD" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" "Permet de contrôler Quod Libet en utilisant un client MPD. Le streaming, les " "files de lecture et la gestion de la bibliothèque ne sont pas supportés." #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "_Port :" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "_IP locale :" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "Mot de p_asse :" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 msgid "Connection" msgstr "Connection" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "Clients testés" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "Support D-Bus MPRIS" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" "Autoriser le contrôle de Quod Libet selon les spécifications de l'interface " "D-Bus MPRIS 1.0/2.0." #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "Cacher la fenêtre principale lors de la sortie" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Préférences" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "Nom d'hôte de l'intermédiaire" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "Nom d'hôte / IP de l'intermédiaire" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "Port de l'intermédiaire" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "Port de l'intermédiaire" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "Sujet" #: ../quodlibet/ext/events/mqtt.py:128 msgid "Playing Pattern" msgstr "Motif de lecture" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "motif" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "Texte affiché quand un titre est en pause" #: ../quodlibet/ext/events/mqtt.py:136 msgid "No-song Text" msgstr "" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Journal" #: ../quodlibet/ext/events/mqtt.py:153 msgid "Status Text" msgstr "Texte indiquant le statut" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "Connecté à l'intermédiaire à l'adresse : %(host)s:%(port)d" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Impossible de se connecter à %(host)s:%(port)d (%(msg)s" #: ../quodlibet/ext/events/mqtt.py:192 msgid "Connection error" msgstr "Erreur de connexion" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "Texte de la notification" #: ../quodlibet/ext/events/notify.py:88 msgid "_Title:" msgstr "_Titre :" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "Rétablir le motif par défaut" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "Corps :" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "Afficher les notification_s" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "Afficher les notifications" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "Si le titre est modifié <i>_manuellement</i>" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "Si le titre est modifié <i>_automatiquement</i>" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "Ouvrir uniquement lorsque la fenêtre principale n'est pas activée" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "Afficher le bouton \"Suiva_nt\"" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "Erreur de connexion" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "Impossible de se connecter au démon de notification." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "Notifications de titre" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Suivant" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "Impossible de se connecter au service '%s'" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "Authentification impossible: URL invalide" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" "Authentication failed: nom d'utilisateur invalide '%s' ou mauvais mot de " "passe." #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "Le client a été banni. Veuillez contacter l'auteur." #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "Soumission à AudioScrobbler" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" "Client Audioscrobbler pour Last.fm, Libre.fm et autres services " "Audioscrobbler." #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "Authentification validée." #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "_Service :" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "_URL :" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "User_name:" msgstr "_Nom d'utilisateur :" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "Mot de _passe :" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 msgid "Other…" msgstr "Autre ..." #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "_Vérification des données du compte" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "Compte" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Artist pattern:" msgstr "Motif de l'_artiste :" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Title pattern:" msgstr "Motif du _titre" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "_Filtre d'exclusion :" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" "Le motif utilisé pour formater un artiste avant soumission. Laisser vide " "pour la valeur par défaut." #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" "Le motif utilisé pour formater un titre avant soumission. Laisser vide pour " "la valeur par défaut." #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "Les titres correspondant à cette recherche ne seront pas soumis." #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "M_ode non-connecté (ne rien soumettre)" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "Soumission" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 msgid "Random Album Playback" msgstr "Lecture aléatoire de l'album" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" "Lance la lecture d'un album au hasard lorsque votre liste de lecture se " "termine. Nécessite que le navigateur en cours d'utilisation supporte le " "filtrage par album." #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "Le mieux évalué" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "Le plus joué" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "Le plus sauté" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "Joué récemment" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "Lancé récemment" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "Ajouté récemment" #: ../quodlibet/ext/events/randomalbum.py:44 msgid "Longer albums" msgstr "Albums les plus longs" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "secondes avant de lancer l'album suivant" #: ../quodlibet/ext/events/randomalbum.py:87 msgid "Weights" msgstr "Poids" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "Lire des albums plus souvent que d'autres" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "éviter" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "préférer" #: ../quodlibet/ext/events/randomalbum.py:201 msgid "Random Album" msgstr "Album aléatoire" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "En attente de lancement de %s" #: ../quodlibet/ext/events/rbimport.py:114 msgid "Import Failed" msgstr "L'importation a échoué" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "Évaluations et statistiques de %d titres importés avec succès." #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "Importation Rhythmbox" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" "Importe les évaluations et les statistiques des titres à partir de Rhythmbox." #: ../quodlibet/ext/events/rbimport.py:132 msgid "Start Import" msgstr "Démarrer l'_importation" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "Suspendre la lecture quand l'économiseur d'écran Gnome s'affiche." #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" "Aucun fournisseur Gnome de recherche en ligne de commande n'est installé " "dans Quod Libet." #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "Fournisseur de recherche Gnome" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "Autoriser GNOME Shell à effectuer des recherches dans la bibliothèque." #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "Barre de progression alternative" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" "Barre de progression alternative, visible sur toute la largeur de la fenêtre." #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "Synchronisation Squeezebox" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 msgid "Synchronized Lyrics" msgstr "Paroles synchronisées" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" "Afficher les paroles de manière synchronisée avec l'audio, en utilisant un " "fichier .lrc de même nom que la piste." #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "Texte:" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "Fond :" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "Police" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "Taille (en pixel)" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 msgid "Playing:" msgstr "En cours de lecture :" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "En pause :" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 msgid "No song:" msgstr "Aucun titre :" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "motif" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "Changer de thème" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "Permet de changer de thème GTK+." #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "_Thème" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "Theme natif" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "Préférer la version sombre du thème" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Pas de lecture en cours" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 #, fuzzy msgid "Controls Quod Libet from the system tray." msgstr "Controler Quod Libet depuis la barre de notification." #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "Afficher %(application-name)s" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 msgid "_Play" msgstr "_Lecture" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 msgid "P_ause" msgstr "P_ause" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 msgid "Pre_vious" msgstr "Précédent" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "Suivant" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "Lire aléatoirement" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Répéter" #: ../quodlibet/ext/events/trayicon/menu.py:86 msgid "Stop _After This Song" msgstr "_Arrêter après ce titre" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 msgid "Open _Browser" msgstr "Ouvrir le _Navigateur" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Éditer les étique_ttes" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informations" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 msgid "Play_lists" msgstr "_Listes de lecture" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "_Quitter" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Fonctionnement" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "La molette de la souris ajuste le volume" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "La molete de la souris permet de passer d'une musique à l'autre" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Molette de la souris" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Suggestions Affichage" #: ../quodlibet/ext/events/viewlyrics.py:23 msgid "View Lyrics" msgstr "Voir les paroles" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" "Affiche automatiquement les paroles sous la liste des titres dans la fenêtre " "principale." #: ../quodlibet/ext/events/viewlyrics.py:29 msgid "_Lyrics" msgstr "Paro_les" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 msgid "Error" msgstr "Erreur" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "Recharger" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "Économiseur d'écran" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "Enregistrer la jaquette du titre courant dans un fichier." #: ../quodlibet/ext/events/write_cover.py:66 msgid "File:" msgstr "Fichier :" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "Seuil :" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "Niveau en deçà duquel le filtre est activé" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "Ratio :" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "Ratio de compression" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "Compresseur audio" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "_Preset:" msgstr "Présélection :" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "Filter preset" msgstr "Préréglage du filtre" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "Coupe de _Fréquence :" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "Coupe des fréquences en utilisant un filtre passe bas" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "Niveau d'entrée :" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "Niveau d'entrée" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "Par défaut" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom settings" msgstr "Configuration personnalisée" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "Crossfeed" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" "Mixe les deux canaux à la manière du réglage d'un casque audio, ou pour " "ajuster le son des anciens enregistrements audio." #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "Filter _band:" msgstr "Filtrer sur le groupe" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "La largeur de bande du filtre" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "Filter _width:" msgstr "Filtrer sur la taille" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "La largeur de fréquence du filtre" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "Niveau :" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "Niveau de l'effet" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "Supprimer les paroles dans l'audio" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "Mixage Mono" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "Mixer les canaux audio vers un seul canal mono" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "T_aux :" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "Tempo :" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "_Tonalité :" #: ../quodlibet/ext/gstreamer/pitch.py:89 msgid "Audio Pitch / Speed" msgstr "Tonalité / Vitesse Audio" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Saisissez l'adresse d'un flux audio." #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Exporter la liste de lecture vers Squeezebox" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importer" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Aucune radio trouvée." #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "Motif du nom de _fichier :" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "Motif du nom de _fichier :" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "Exporter vers Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 #, fuzzy msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" "Exporter une liste de lecture en temps réel vers l'appareil Squeezebox, à " "condition que QuodLibet et Squeezebox partagent la même structure de " "fichier. Permet de partager une configuration avec le greffon de partage " "Squeezebox Sync." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "Exporter la liste de lecture vers Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "Le nom de la liste de lecture (écrase le nom précédent)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "EXporter vers liste de lecture Sqeezebox" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 msgid "Remove Playlist Duplicates" msgstr "Supprimer les doublons dans la liste de lecture" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "Supprime les doublons dans une liste de lecture." #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Confirmer la suppression du titre %d en doublon ?" msgstr[1] "Confirmer la suppression des %d titres en doublon ?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 msgid "Shuffle Playlist" msgstr "Lecture aléatoire" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "Joue aléatoirement les titres d'une liste de lecture" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "Suivre le curseur" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 #, fuzzy msgid "Playcount Equalizer" msgstr "Égaliseur" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "Lire aléatoirement, en préférant les titres les moins joués." #: ../quodlibet/ext/playorder/playcounteq.py:25 msgid "Prefer less played" msgstr "Préférer les moins lus" #: ../quodlibet/ext/playorder/queue.py:19 msgid "Queue Only" msgstr "Uniquement en file d'attente" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 msgid "Reverse" msgstr "Inverser" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "Inverser l'ordre dans lequel les titres sont joués." #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Comptage du nombre de fois où un titre est sauté" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "Répéter chaque piste" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" "Lire aléatoirement, mais en répétant chaque piste un certain nombre de fois." #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "Nombre de répétitions pour chaque titre :" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "Requêtes conditionnelle" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "Requête Python" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" "Utiliser dans les requêtes des expression Python. La syntaxe est '@(python: " "expression)'. La variables 's' contient le titre analysé." #: ../quodlibet/ext/query/savedsearch.py:19 msgid "Include Saved Search" msgstr "Inclure les recherches sauvegardées" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "Queezebox OK. Utilisation de (%s)." #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "Impossible de se connecter à %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "Nom d'hôte" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "Port :" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 msgid "Username:" msgstr "Nom d'utilisateur :" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "Mot de passe :" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "Répertoire la bibliothèque auquel le serveur se connecte." #: ../quodlibet/ext/_shared/squeezebox/base.py:132 msgid "Library path:" msgstr "Chemin de la librairie :" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "_Vérifier la configuration" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "Serveur Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Débug" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Serveur Sqeezebox à l'adresse {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "Serveur Squeezebox inconnu" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "lecteur Squeezebox non-identifié : %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "Sélectionner un lecteur Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "_OK" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Serveur Squeezebox trouvé.\n" "Veuillez sélectionner le lecteur" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "Ajuster l'image à la fenêtre" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "_Programme :" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "_Éditer l'image après enregistrement" #: ../quodlibet/ext/songsmenu/albumart.py:345 msgid "File_name:" msgstr "_Nom de fichier" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "Échec de l'enregistrement" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, python-format msgid "Unable to save \"%s\"." msgstr "Impossible d'enregistrer \"%s\"." #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] Erreur HTTP : %s" #: ../quodlibet/ext/songsmenu/albumart.py:613 msgid "Album Art Downloader" msgstr "Téléchargement de jaquettes" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "depuis %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "Solution : %s" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, python-format msgid "Size: %s" msgstr "Taille : %s" #: ../quodlibet/ext/songsmenu/albumart.py:690 msgid "_Search" msgstr "_Rechercher" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 msgid "Searching…" msgstr "Recherche en cours ..." #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "Fait." #: ../quodlibet/ext/songsmenu/albumart.py:922 msgid "Download Album Art" msgstr "Télécharger des illustrations" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "Téléchargement de jaquettes d'album depuis plusieurs sites Web." #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "Sources" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "APEv2 vers ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" "Convertit des étiquettes APEv2 en étiquettes ID3v2. Les étiquettes APEv2 " "sont supprimées après conversion." #: ../quodlibet/ext/songsmenu/bookmarks.py:23 msgid "Go to Bookmark" msgstr "Aller aux signets" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "Gère les signets des fichiers sélectionnés." #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 msgid "_Edit Bookmarks…" msgstr "Modifi_er les signets" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 msgid "No Bookmarks" msgstr "Aucun signet" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 msgid "MusicBrainz Lookup" msgstr "Recherche MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Étiqueter l'album à nouveau, en utilisant MusicBrainz." #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "Indiquer uniquement l'année dans l'étiquette \"date\"" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" "Utiliser l'étiquette \"_albumartist\" (artiste auteur de l'album) si " "nécessaire" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "Trier les noms des artistes avant de les enregistrer dans l'étiquette" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "Écrire les étiquettes standard MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "Ecrire l'étiquette \"labelid\" (référence de l'étiquette)" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nom de fichier" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 msgid "Disc" msgstr "Disque" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Piste" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 msgid "Title" msgstr "Titre" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Artiste" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 msgid "MusicBrainz lookup" msgstr "Recherche MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 msgid "_Query:" msgstr "Re_quête :" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 msgid "S_earch" msgstr "R_echercher" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "Résultats <i>(cliquer-déplacer pour trier)</i>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "Veuillez saisir une requête." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "Des erreurs ont été rencontrées. Veuillez recommencer." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "Chargement des résultats" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 msgid "No results found." msgstr "Aucun résultat" #: ../quodlibet/ext/songsmenu/browsefolders.py:159 msgid "Browse Folders" msgstr "Naviguer dans les dossiers" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "Ouvre les dossiers des titres dans un gestionnaire de fichiers" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Unable to open folders" msgstr "Impossible d'ouvrir les dossiers" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "Aucun programme disponible pour ouvrir les dossiers." #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "Console Python" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "Console interactive Python." #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "Par défaut, vous avez accès aux objets suivants :" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "Votre répertoire par défaut est :" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "Commande" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "name" msgstr "nom" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "Le nom de cette commande" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "commande" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "Syntaxe de la commande à lancer" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "Paramètre" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "motif" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "unique" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "Nombre maximum d'arguments" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 msgid "Input value" msgstr "Valeur en entrée" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "Valeurs pour %s ?" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 msgid "Custom Commands" msgstr "Commandes personnalisée" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Lance des commanded personnalisée (par lots si nécessaire) sur des titres à " "partir de leurs étiquettes." #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "Editer une commande personnalisée" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, python-format msgid "Unable to run custom command %s" msgstr "Impossible de lancer la commande personnalisée %s" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "Replier / Déplier tout" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "L'expression de la clé dupliquée est '%s'" #: ../quodlibet/ext/songsmenu/duplicates.py:372 msgid "Duplicates Browser" msgstr "Navigateur de doublons" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "Recherche et affiche les titres ayant des étiquettes similaires" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "Regrouper les doublons par :" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "Clé en double" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "Supprimer les espaces" #: ../quodlibet/ext/songsmenu/duplicates.py:424 msgid "Remove _Diacritics" msgstr "Supprimer les caractères spéciaux" #: ../quodlibet/ext/songsmenu/duplicates.py:425 msgid "Remove _Punctuation" msgstr "Supprimer la ponctuation" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "Non-sensible à la casse" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "Options de correspondance" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 msgid "Edit Playcount" msgstr "Modifier le compteur de lectures" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "Nombre de lectures" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "Comptage du nombre de fois où un titre est sauté" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "Editer les images incorporées" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "Supprime ou remplace les images embarquées." #: ../quodlibet/ext/songsmenu/embedded.py:78 msgid "_Remove all Images" msgstr "Supp_rimer toutes les images" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "Incorporer l'image actuelle" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "Évaluer avec précision" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "Permet d'évaluer un titre en utilisant un nombre." #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "Veuillez évaluer en utilisant une échelle allant de 0.0 à 1.0" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Filter on Any Tag" msgstr "Filtrer sur la valeur d'une étiquette" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "" "Créé une requête de recherche à partir des étiquettes des titres " "sélectionnés." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 msgid "Filter on Directory" msgstr "Filtrer sur le répertoire" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "Filtrer sur le répertoire dans un nouvelle fenêtre de navigation" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "Rechercher à partir d'une empreinte accoustique" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" "Recherche les méta-données d'un titre en utilisant l'empreinte Acoustid" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "Soumettre une empreinte accoustique" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Génère une empreinte acoustique en utilisant Chromaprint et la soumet à " "Acoustid.org" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "Clé API manquante" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" "Pour soumettre des empreintes, vous devez au préalable saisir votre clé API " "dans les préférences du greffon." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "Demander une clé API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "Clé API :" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "Service Web AcoustID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Dans la file d'attente" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "En cours d'analyse" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "Recherche" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Écrire" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "Etat" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "Publication" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 msgid "Write MusicBrainz tags" msgstr "Ecrire les étiquettes MusicBrainz " #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 msgid "Group by directory" msgstr "Regrouper par répertoire" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "Album Mode" msgstr "Mode Album" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" "Ecrire les étiquettes concernant l'album en essayant de réduire le nombre de " "parutions différentes de l'album." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "En cours de génération des empreintes :" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "Informations _détaillés" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "_Soumettre" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" "Pour être soumis, les titres doivent comporter des étiquettes avec un " "identifiant de piste MusicBrainz <i><b>trackid</b></i>, ou un identifiant " "<i><b>artist</b></i> (artiste) / <i><b>title</b></i> (titre)/ <i><b>album</" "b></i>." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "Empreintes :" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "Titres comportant un identifiant MBIDs :" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "Titres suffisamment étiquettés :" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "Titres à soumettre :" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Fait. %(to-send)d/%(all)d titres à soumettre." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "En cours de soumission des empreintes :" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "En cours de soumission …" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 msgid "Update Tags in Files" msgstr "Mettre à jour les étiquettes dans les fichiers" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" "Mettre à jour les étiquettes dans les fichiers. C'est la certitude que le " "compteur de lecture et les évaluations sont à jour." #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "Exporter vers HTML" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "Exporter les titres sélectionnés vers HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "Corriger la durée du MP3" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" "Supprime les trames TLEN des étiquettes ID3, qui peuvent être sources " "d'erreurs dans le calcul de la durée." #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "Envoyer à iFP" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "Envoyer des titres vers un périphérique iRiver iFP." #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "Exporter les méta-données" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" "Exporter les méta-données des titres sélectionnés vers un fichier .tags." #: ../quodlibet/ext/songsmenu/importexport.py:92 msgid "Import Metadata" msgstr "Importer les méta-données" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" "Importe les méta-data des titres sélectionnés à partir d'un fichier .tags." #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "Graver un CD" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Gaver des CD avec K3b, Brasero ou xfburn" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "Bien à jour." #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "Synchronisation terminée." #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "Erreur durant la synchronisation" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "Synchronisation Last.fm" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" "Met à jour les statistique de votre bibliothèque à partir de votre profil " "Last.fm." #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 msgid "_Username:" msgstr "Nom d'_utilisateur :" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "Créé des étiquettes de tri" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" "Convertit les noms d'albums et d'artistes vers les noms de tri, sans " "adaptation." #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 msgid "Migrate Metadata" msgstr "Migrer les méta-données" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "Ajoute les métadata propres à Quodlibet dans les fichiers des titres." #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "_Copier" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "Coller" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 msgid "Information to copy/paste" msgstr "Informations vers copier/coller" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" "Se baser sur le numéro de disque et le numéro de piste pour établir des " "correspondances" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "%d piste est stockée." msgstr[1] "%d pistes sont stockées." #: ../quodlibet/ext/songsmenu/playlist.py:31 msgid "Export as Playlist" msgstr "Exporter vers liste de lecture" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "Exporter les titres sous vers liste de lecture M3U ou PLS." #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "Utiliser des chemins relatifs" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "Utiliser des chemins absolus" #: ../quodlibet/ext/songsmenu/playlist.py:132 msgid "Unable to export playlist" msgstr "Impossible d'exporter la liste de lecture" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "L'écriture sur <b>%s</b> a échoué." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 msgid "Rescan Songs" msgstr "Rescanner les titres" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" "Vérifie si un fichier a été modifié et le recharge ou le supprime si " "nécessaire." #: ../quodlibet/ext/songsmenu/refresh.py:31 msgid "Rescan songs" msgstr "Rescanner les titres" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "Analyseur ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "Progression" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "Gain" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "Peak" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "Replay Gain" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" "Analyse et met à jour les informations de ReplayGain, en utilisant " "GStreamer. Les résultats sont regroupés par album." #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "toujours" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "si <b>une ou plusieurs étiquettes</b> RG sont absentes" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "si <b>toutes les étiquettes<b> RG sont absentes" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "Appliquer aux albums :" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 msgid "Existing Tags" msgstr "Etiquettes existantes" #: ../quodlibet/ext/songsmenu/splitting.py:31 msgid "Split Tags" msgstr "Séparer les étiquettes" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" "Séparer en une seule opération le numéro de disque de l'album et la version " "du titre." #: ../quodlibet/ext/songsmenu/splitting.py:56 msgid "Split Album" msgstr "Séparer l'album" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "Séparer les numéros de disque." #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "Présélection :" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Étiquette" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Ouvrir le gestionnaire d'étiquettes des titres sélectionnés" #: ../quodlibet/ext/songsmenu/website_search.py:35 msgid "Website Search" msgstr "Recherche site Internet" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" "Rechercher sur les sites de votre choix, selon n'importe quelle étiquette.\n" "Supporte les motifs, par exemple %(pattern-example)s." #: ../quodlibet/ext/songsmenu/website_search.py:78 msgid "Search URL patterns" msgstr "Rechercher selon des motifs d'URL" #: ../quodlibet/ext/songsmenu/website_search.py:88 msgid "Edit search URLs" msgstr "Éditer les URLs sauvegardées" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 msgid "Configure Searches…" msgstr "Configurer les recherches …" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "Rechercher dans %(website)s" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "Rechercher un artiste dans Wikipedia" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" "Ouvre un navigateur avec l'article Wikipedia concernant l'artiste dont le " "titre est en cours de lecture." #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "Rechercher un album dans Wikipedia" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" "Ouvre un navigateur avec l'article Wikipedia concernant l'album en cours de " "lecture." #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Bibliothèque" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Vérification des points de montage" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Parcours de la bibliothèque" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Parcours de %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "Chargement des fichiers en cours" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Impossible de charger le fichier : %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Lister les étiquettes" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Afficher en sortie des informations détaillées" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "Lister également les étiquettes programmables" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Pas assez d'arguments" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "Trop d'arguments" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "Description" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Valeur" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Lister les étiquettes courantes" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Recopier les étiquettes d'un fichier vers un autre" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Montrer les modifications sans les appliquer" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Sauter les étiquettes qui ne peuvent pas être écrites" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Impossible de copier les étiquettes %r vers le fichier : %r" #: ../quodlibet/operon/commands.py:157 msgid "Edit tags in a text editor" msgstr "Editer les étiquettes dans un éditeur de texte" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "Modifications annulées" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Le lancement de l'éditeur de texte '%(editor-name)s' a échoué." #: ../quodlibet/operon/commands.py:260 msgid "No changes detected" msgstr "Aucun changement détecté" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Définir une étiquette et supprimer les valeurs existantes" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Impossible de définir %r" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "Supprimer les étiquettes" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "La valeur est une expression régulière" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "Supprimer toutes les étiquettes" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "Impossible de combiner '--all' avec '--regexp'" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "Impossible de supprimer %r de %r" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "Supprimer la valeur d'une étiquette" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "Ajouter une valeur d'étiquette" #: ../quodlibet/operon/commands.py:456 msgid "List file information" msgstr "Lister les informations du fichier" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" "Transforme l'image fournie en image embarquée et supprimer toutes les autres " "images embarquées" #: ../quodlibet/operon/commands.py:515 #, python-format msgid "Failed to load image file: %r" msgstr "Impossible de charger le fichier image : %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" "L'édition de l'image %(file_name)s au format (%(file_format)s) n'est pas " "supporté par le logiciel" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "Supprimer toutes les images incorporées" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Extraire les images embarquées dans %(filepath)s" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" "Chemin dans lequel les images sont sauvegardée (par défaut dans le " "répertoire en cours)" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Renommer les fichiers à partir des étiquettes" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Étiqueter en se basant le chemin de fichier " #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Fichier" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Remplir les numéros de pistes pour tous les fichiers" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Afficher les étiquettes selon un motif donné" #: ../quodlibet/operon/commands.py:768 msgid "Display help information" msgstr "Afficher des informations d'aide" #: ../quodlibet/operon/util.py:40 #, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "" "'%(column-id)s' n'est pas un nom valide pour la colonne (%(all-column-ids)s)." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Inconnu(e)" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Dans l'ordre" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "Dans l'_ordre" #: ../quodlibet/order/reorder.py:23 msgid "Random" msgstr "Aléatoire" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Aléatoire" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "Préférer les meilleures évaluations" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "Répéter cette piste" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 msgid "Repeat all" msgstr "Tout répéter" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Un titre" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Flux" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Mise en mémoire tampon" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "Impossible de créer une association GStreamer" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "Aucun élément GStreamer n'est disponible pour gérer le format du média" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "Le greffon GStreamer '%(name)s' n'a pas pu être lancé correctement" #: ../quodlibet/player/gstbe/prefs.py:25 #, fuzzy msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "Le canal de sortie GStreamer utilisée pour la lecture, comme 'alsasink " "device=default'. Laisser vide pour le canal par défaut." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "Pipeline de s_ortie" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f secondes" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "Mémoire tampon :" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 msgid "No GStreamer audio sink found" msgstr "Aucune sortie GStreamer audio n'est disponible" #: ../quodlibet/player/gstbe/util.py:112 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Canal de sortie GStreamer invalide, utilisation du canal pardéfaut." #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Impossible de créer la sortie audio" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Le périphérique audio %r n'a pas été trouvé. Vérifiez vos paramètres Xine " "dans ~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "Lancer le greffon \"%(name)s\" sur la liste %(count)s ?" msgstr[1] "Lancer le greffon \"%(name)s\" sur les listes %(count)s ?" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 msgid "_Run Plugin" msgstr "Lancer un greffons" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Formats supportés : %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Périphérique audio: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Début de la piste" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "Non disponible" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Temps" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Nom du signet" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Signets" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtres" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "_Joué(s) récemment" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "_Ajouté(s) récemment" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 msgid "All _Songs" msgstr "Tous les titres" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "Genre(s) en cours" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "Artiste(s) en cours" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "Album(s) en cours" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "_Genre aléatoire" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "_Artiste aléatoire" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Al_bum aléatoire" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "Les 40 titres les plus joués (plus de 40 peuvent être choisis en cas " "d'égalité)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Valeur :" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Entrées sauvegardées" #: ../quodlibet/qltk/cbes.py:263 msgid "Edit saved values…" msgstr "Éditer les entrées sauvegardées …" #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_matique" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "Mode Piste" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "Mode _Album" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "_Met" #: ../quodlibet/qltk/controls.py:128 msgid "_Replay Gain Mode" msgstr "Mode Replay Gain" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "Nouveau %s" #: ../quodlibet/qltk/data_editors.py:218 msgid "(unknown)" msgstr "(Inconnu)" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "Motif d'étiquette" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "Motif d'étiquette, c'est-à-dire people:nom ou ~album~année." #: ../quodlibet/qltk/data_editors.py:383 msgid "Enter new tag" msgstr "Saisir une nouvelle étiquette" #: ../quodlibet/qltk/delete.py:37 msgid "Files:" msgstr "Fichiers :" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" "Les titres sélectionnés seront supprimés de la bibliothèque et leurs " "fichiers supprimés du disque." #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "Les fichiers sélectionnés seront supprimés du disque." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "Supprimer %(file_count)d fichier de manière permanente ?" msgstr[1] "Supprimer %(file_count)d fichiers de manière permanente ?" #: ../quodlibet/qltk/delete.py:91 msgid "_Delete Files" msgstr "Supprimer les fichiers" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "Les titres sélectionnés seront supprimés de la bibliothèque et leurs " "fichiers déplacés vers la corbeille." #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "Les fichiers sélectionnés seront supprimés de la corbeille." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "Déplacer %(file_count)d fichier vers la corbeille ?" msgstr[1] "Déplacer %(file_count)d fichiers vers la corbeille ?" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Mettre à la corbeille" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Déplacement de %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Impossible à déplacer vers la corbeille" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 msgid "Moving one or more files to the trash failed." msgstr "" "Le déplacement d'un ou de plusieurs fichiers vers la corbeille a échoué." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Suppression en cours de %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 msgid "Unable to delete files" msgstr "Impossible de supprimer les fichiers" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 msgid "Deleting one or more files failed." msgstr "La suppression d'un ou de plusieurs fichiers a échouée." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Téléchargements" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Taille" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "Arrêter" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "manquant dans %d titre" msgstr[1] "manquant dans %d titres" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "différent dans le titre %d" msgstr[1] "différent dans les %d titres" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Séparer en _plusieurs valeurs" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Séparer le disque de l'_album" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Séparer la _version du titre" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Séparer l'arrangeur de l'ar_tiste" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Séparer l'intér_prète de l'artiste" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "Séparer l'intér_prète du titre" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "Séparer l'artiste d'origine (Originalartist) du titre" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Ajouter une étiquette" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "É_tiquette :" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Éditer les étiquettes" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Afficher les étiquettes _programmables" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Accéder à toutes les étiquettes, y compris celles générées automatiquement, " "comme par exemple les étiquettes MusicBrainz ou Replay Gain." #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 msgctxt "edittags" msgid "_Revert" msgstr "_Rétablir" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "Enregi_strer" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Impossible d'ajouter l'étiquette" #: ../quodlibet/qltk/edittags.py:660 #, python-format msgid "Unable to add <b>%s</b>" msgstr "Impossible d'ajouter <b>%s</b>" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Impossible d'ajouter <b>%s</b>\n" "\n" "Les fichiers sélectionnés actuellement ne permettent pas des valeurs " "multiples." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Étiquette non valide" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Étiquette invalide <b>%s</b>\n" "\n" "Les fichiers sélectionnés actuellement ne permettent pas l'édition de cette " "étiquette." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Valeur non valide" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Valeur invalide: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "L'étiquette peut ne pas être correcte" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "%(file-name)s semble avoir été modifié pendant le fonctionnement du " "programme. Enregistrer maintenant sans réactualiser votre bibliothèque " "pourrait écraser d'autres modifications appliquées au titre." #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Impossible d'enregistrer le titre" #: ../quodlibet/qltk/_editutils.py:50 #, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "L'enregistrement de %(file-name)s a échoué. Le fichier peut être en lecture " "seule, corrompu, ou vous n'avez pas la permission de l'éditer." #: ../quodlibet/qltk/_editutils.py:142 msgid "_More options…" msgstr "_Plus d'options …" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "Ann_uler" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "_Rétablir" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "_A propos" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "Vérifier les mises à jour …" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Greffons" #: ../quodlibet/qltk/exfalsowindow.py:267 #, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s et %(count)s de plus" msgstr[1] "%(title)s et %(count)s de plus" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Préférences d'Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Séparer _sur:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Édition d'étiquettes" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Dossiers" #: ../quodlibet/qltk/filesel.py:253 msgid "_New Folder…" msgstr "_Nouveau dossier …" #: ../quodlibet/qltk/filesel.py:262 msgid "_Select all Sub-Folders" msgstr "_Sélectionner tous les sous-dossiers" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Nouveau dossier" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Saisissez un nom pour le nouveau dossier :" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Impossible de créer le dossier" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Impossible de supprimer le dossier" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Titres" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "par %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disque %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Piste %s" #: ../quodlibet/qltk/info.py:108 msgid "_Edit Display…" msgstr "Modifi_er l'affichage…" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Aucun titre n'est sélectionné." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Aucun titre" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informations" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Paroles" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Produit par %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artiste" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artistes" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "interprètes" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Jamais" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d fois" msgstr[1] "%(n)d fois" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "ajoutée" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "dernière écoute" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "joué" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "sauts" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "évaluation" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "chemin" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "durée" #: ../quodlibet/qltk/information.py:289 msgid "format" msgstr "format" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "codec" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 msgid "encoding" msgstr "encodage" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "débit des données" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "taille du fichier" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "modifiée" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "Additionnel" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d sélectionnée" msgstr[1] "%d sélectionnées" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Piste indisponible" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Liste de pistes" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d titre sans album" msgstr[1] "%d titres sans album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Discographie sélectionnée" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d titre sans artiste" msgstr[1] "%d titres sans artiste" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albums" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Durée totale :" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Taille totale :" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Fichiers" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Télécharger" #: ../quodlibet/qltk/lyrics.py:40 msgid "_Edit" msgstr "_Éditer" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Ce titre ne contient aucune parole." #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "Recherche de paroles ..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "Confirmer la suppression de tous les titres ?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "Les titres sélectionnés seront supprimés de la bibliothèque." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "Réafficher" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "Réafficher" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Abandonner les modifications apportées aux étiquettes ?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Des étiquettes ont été changées, mais n'ont pas été enregistrées. " "Enregistrer ces fichiers, ou abandonner les changements?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 msgid "_Revert" msgstr "_Rétablir" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Le fichier existe" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "Remplacer %(file-name)s ?" #: ../quodlibet/qltk/msg.py:94 msgid "_Replace File" msgstr "_Remplacer le fichier" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Tâches actives" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d tâches en cours" #: ../quodlibet/qltk/playorder.py:254 msgid "Toggle shuffle mode" msgstr "Basculer le mode lecture aléatoire" #: ../quodlibet/qltk/playorder.py:270 msgid "Toggle repeat mode" msgstr "Basculer le mode Répétition" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Erreurs de greffon" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Activé" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Désactivé" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Aucune catégorie" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Ordre :" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Édition d'étiquettes (\"tags\")" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Taille de la jaquette :" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Aucun greffon trouvé." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Greffons" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Montrer les _erreurs" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disque" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "Pis_te" #: ../quodlibet/qltk/prefs.py:47 msgid "Grou_ping" msgstr "regrou_per" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Nom de _fichier" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "D_urée" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Aller automatiquement au titre en cours de lecture" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Défiler jusqu'au titre, dès qu'il est joué" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "Au_tres :" #: ../quodlibet/qltk/prefs.py:88 msgid "_Edit…" msgstr "_Éditer …" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Ajouter ou supprimer des colonnes supplémentaires" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Colonnes visibles" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Le titre contient la _version" #: ../quodlibet/qltk/prefs.py:106 msgid "Artist includes all _people" msgstr "L'artiste contient toutes les personnes" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "L'album contient le sous-titre du _disque" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Le nom de _fichier contient le répertoire" #: ../quodlibet/qltk/prefs.py:123 msgid "Column Preferences" msgstr "Préférences des colonnes" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Appliquer la configuration courante à la liste de titres, en ajoutant les " "nouvelles colonnes à la fin" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Liste des titres" #: ../quodlibet/qltk/prefs.py:222 msgid "Edit Columns" msgstr "Modifier les colonnes" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "Durée totale" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "Filtre _global :" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Appliquer cette recherche avec tous les autres" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 msgctxt "heading" msgid "Search" msgstr "Rechercher" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Navigateurs" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Confirmer les évaluations _multiples" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "Demander confirmation avant d'évaluer plusieurs titres à la fois" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Activer les n_otations en un clic" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "Activer l'évaluation par un clic dans la colonne évaluation des titres" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Evaluations" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Préférer les illustrations incorporées aux fichiers" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "Nom de l'image fixe :" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "Le nom de fichier de l'image à utiliser si sélectionné" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Jaquettes d'Album" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Lecture" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Afficher la configuration" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Si aucune information de Replay Gain n'est disponible pour un titre, " "multiplier le volume par cette valeur" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "Gain par _défaut (dB) :" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Multiplier le volume pour tous les titres par cette valeur, tant que le " "résultat ne sature pas" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "Gain _global (dB) :" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "_Activer l'ajustement de volume par les valeurs Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Ajustement du volume par Replay Gain" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "Évaluation par _défaut :" #: ../quodlibet/qltk/prefs.py:493 msgid "Rating _scale:" msgstr "Échelle d'évaluation :" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Enregistrer la notation et le _nombre d'écoutes" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "Courri_el :" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "La notation et le nombre d'écoutes seront enregistrés pour cette adresse " "électronique" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Enregistrer automatiquement les changements " #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Enregistrer les étiquettes modifées sans confirmation lorsque plusieurs " "fichiers sont édités en même temps" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Étiquettes" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Nouvelle radio internet" #: ../quodlibet/qltk/prefs.py:641 msgid "Scan library _on start" msgstr "Rafraîchir la bibliothèque au démarrage" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 msgid "_Scan Library" msgstr "_Rechercher dans la bibliothèque" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Chercher les changements dans la bibliothèque" #: ../quodlibet/qltk/prefs.py:658 msgid "Re_build Library" msgstr "Re_charger la bibliothèque" #: ../quodlibet/qltk/prefs.py:661 msgid "Reload all songs in your library. This can take a long time." msgstr "" "Recharger tous les titres de votre bibliothèque. Cette opération peut durer " "un certain temps." #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr " _Répertoires à scanner" #: ../quodlibet/qltk/prefs.py:677 msgid "Hidden Songs" msgstr "Titre cachés" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s et %(count)d de plus" msgstr[1] "%(title)s et %(count)d de plus" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Propriétés" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_file d'attente" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Nettoyer" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d titre (%(time)s)" msgstr[1] "%(count)d titres (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Parcourir la bibliothèque" #: ../quodlibet/qltk/quodlibetwindow.py:395 msgid "Toggle queue visibility" msgstr "Basculer la visibilité de la file d'attente" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "Erreur de lecture" #: ../quodlibet/qltk/quodlibetwindow.py:524 msgid "Set up library directories?" msgstr "Choisir des répertoires contenant les librairies" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "Pas mai_ntenant" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "Configurer" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Impossible d'ajouter les titres" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s utilise un protocole non supporté." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Aller au titre en cours de lecture" #: ../quodlibet/qltk/quodlibetwindow.py:986 msgid "_File" msgstr "_Fichier" #: ../quodlibet/qltk/quodlibetwindow.py:987 msgid "_Song" msgstr "Titre_s" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "Afficha_ge" #: ../quodlibet/qltk/quodlibetwindow.py:989 msgid "_Browse" msgstr "Navigation" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "Lecture" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Aide" #: ../quodlibet/qltk/quodlibetwindow.py:997 msgid "_Add a Folder…" msgstr "_Ajouter un dossier ..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 msgid "_Add a File…" msgstr "_Ajouter un fichier ..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 msgid "_Add a Location…" msgstr "Ajouter un chemin ..." #: ../quodlibet/qltk/quodlibetwindow.py:1036 msgid "Edit Bookmarks…" msgstr "Modifier les signets" #: ../quodlibet/qltk/quodlibetwindow.py:1056 msgid "Stop After This Song" msgstr "Arrêter après ce titre" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "Raccourcis clavier" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Aide en ligne" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Aide à la recherche" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Ajouter un chemin" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Saisir le chemin vers un fichier audio :" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Impossible d'ajouter le chemin" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, python-format msgid "%s is not a valid location." msgstr "%s n'est pas un chemin valide." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Ajouter de la musique" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Ajouter un dossier ..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Lecteur" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Ajouter un fichier ..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Confirmer la modification de l'évaluation de ces %d titres ?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "Les évaluations enregistrées seront supprimées" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "L'évaluation des titres sélectionnés sera transformée en '%s'" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 msgid "_Remove Rating" msgstr "Supprime_r les évaluations" #: ../quodlibet/qltk/ratingsmenu.py:98 msgid "Change _Rating" msgstr "Modifie_r l'évaluation" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Remplacer les espaces par des _soulignés" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Remplacer les caractères incompatibles avec _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Enlever les signes _diacritiques" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Remplacer les caractères non-_ASCII" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Utiliser uniquement des caractères minuscules" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Renommer les fichiers" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Chemin des motifs" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 msgid "Edit saved patterns…" msgstr "Éditer les motifs enregistrés..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "A_perçu" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nouveau nom" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Impossible de renommer le fichier" #: ../quodlibet/qltk/renamefiles.py:256 #, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Le renommage de <b>%(old-name)s</b> en <b>%(new-name)s</b> a échoué. Il se " "peut que le fichier destination existe déjà, ou que vous n'ayez pas la " "permission de créer le nouveau fichier ou de supprimer l'ancien." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Ignorer _toutes les erreurs" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Continuer" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Le chemin n'est pas absolu" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Le motif\n" "\t<b>%s</b>\n" "contient / mais ne commence pas à la racine. Pour éviter des répertoires mal " "nommés, enracinez votre motif en le commençant par le répertoire / ou le " "répertoire ~/." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Les titres placés dans ces répertoires seront ajoutées à votre bibliothèque " "au prochain rafraîchissement de la bibliothèque." #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Choisir des répertoires" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Recherches sauvegardées" #: ../quodlibet/qltk/searchbar.py:53 msgid "Edit saved searches…" msgstr "Éditer les recherches sauvegardées..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" "Rechercher dans votre bibliothèque, en utilisant un texte libre ou des " "requêtes QL" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Rechercher après avoir _tapé au clavier" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" "Afficher le résultat d'une recherche dès que l'utilisateur a terminé la " "saisie" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limite :" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Pondéré" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Montrer la durée restante" #: ../quodlibet/qltk/shortcuts.py:16 msgid "Main Window" msgstr "Fenêtre principale" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "Reculer de 10 secondes" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "Avancer de 10 secondes" #: ../quodlibet/qltk/shortcuts.py:19 msgid "Focus the search entry" msgstr "Focaliser sur la requête de recherche" #: ../quodlibet/qltk/shortcuts.py:22 msgid "Reset filters and jump to the playing song" msgstr "Réinitialiser les filtres et aller au titre en cours de lecture" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "Ouvrir la fenêtre d'informations des titres sélectionnés" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "Ouvrir le gestionnaire d'étiquettes des titres sélectionnés" #: ../quodlibet/qltk/shortcuts.py:28 msgid "Queue the selected songs" msgstr "Placer en file d'attente les titres sélectionnés" #: ../quodlibet/qltk/shortcuts.py:29 msgid "Delete the selected songs" msgstr "Supprimer les titres sélectionnés" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "Afficher le contenu de la recherche interne" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "Clic gauche sur le titre de la colonne" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "Ajouter la colonne à la liste des colonnes à trier" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "Vue arborescente" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "Replier l'élément ou sélectionner l'élément parent" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "Déplier l'élément" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "Entrées texte" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "Rétablir les derniers changement annulés" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "Sélectionner tous les titres des panneaux" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtrer sur %s" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "Toutes les entêtes" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Colonnes « _Piste »" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Colonnes « _Album »" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Colonnes « Ar_tistes »" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Colonnes « _Date »" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Colonnes « _Fichier »" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Colonnes « _Production »" #: ../quodlibet/qltk/songlist.py:1115 msgid "_Customize Headers…" msgstr "Colonnes « _Personnalisées »" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "Déplier la colonne" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "Lancer le greffon \"%(name)s\" sur la piste %(count)d ?" msgstr[1] "Lancer le greffon \"%(name)s\" sur les pistes %(count)d ?" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "Lancer le greffon \"%(name)s\" sur l'album %(count)d ?" msgstr[1] "Lancer le greffon \"%(name)s\" sur les albums %(count)d ?" #: ../quodlibet/qltk/songsmenu.py:149 msgid "Configure Plugins…" msgstr "Configurer les greffons …" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "A_jouter à la file d'attente" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Copier sur le périphérique" #: ../quodlibet/qltk/songsmenu.py:378 msgid "_Remove from Library" msgstr "Supp_rimer de la bibliothèque" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Remplacer les so_ulignés par des espaces" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Mettre une _majuscule aux valeurs résultantes" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Séparer en plusieurs _valeurs" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Étiquettes par chemin" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Les étiquettes remplacent celles existantes" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Les étiquettes sont ajoutées à celles existantes" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "Enregistrer" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Le motif\n" "\t<b>%s</b>\n" "n'est pas valide. Il peut contenir deux fois la même étiquette ou des " "parenthèses sans correspondance (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Étiquettes non valides" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Étiquettes invalides <b>%s</b>\n" "\n" "Les fichiers sélectionnés actuellement ne permettent pas l'édition de ces " "étiquettes." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Le motif saisi est invalide. Assurez-vous d'avoir saisi < et > comme " "\\< et \\> et que vos étiquettes sont judicieuses.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Modifier l'affichage" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Numéros de pistes" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Co_mmencer à:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "Nombre _total de pistes :" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Lecture/Pause" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Précédent" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "et %d de plus …" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Enregistrement en cours des titres modifés." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d titres enregistrés\n" "(%(remaining)s restantes)" #: ../quodlibet/qltk/wlw.py:234 #, python-format msgid "%(current)s of %(all)s" msgstr "%(current)s sur %(all)s" #: ../quodlibet/update.py:89 msgid "Checking for Updates" msgstr "Vérifier les mises à jour" #: ../quodlibet/update.py:124 msgid "Connection failed" msgstr "La connexion a échoué" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "Vous utilisez bien la dernière version %(version)s" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" "La version plus récente %(new-version)s est disponible\n" "\n" "Vous utilisez actuellement l'ancienne version %(old-version)s\n" "\n" "Visiter notre <a href='%(url)s'>site Internet</a>" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "Les listes de lectures doivent être nommées" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Une liste de lecture appelée %s existe déjà." #: ../quodlibet/util/cover/built_in.py:26 msgid "Embedded album covers" msgstr "jaquettes embarquées dans les étiquettes/titres" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "Utilise les jaquettes inclues dans les fichiers audio." #: ../quodlibet/util/cover/built_in.py:49 msgid "Filesystem cover" msgstr "Jaquette dans fichier" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "Utilise les images trouvées dans les répertoires contenant le titre." #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Afficher des informations d'utilisation succinctes " #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Afficher la version et le copyright" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Utilisation : %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[options]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "L'option %r n'est pas reconnue." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "L'option %r nécessite un argument" #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r n'est pas un préfixe unique." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%s secondes" msgstr[1] "%s secondes" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Aucun renseignement de durée" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d seconde" msgstr[1] "%d secondes" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minute" msgstr[1] "%d minutes" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d heure" msgstr[1] "%d heures" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d jour" msgstr[1] "%d jours" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d année" msgstr[1] "%d années" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 msgctxt "check" msgid "titlecase?" msgstr "" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "La date doit être saisie au format 'AAAA', 'AAAA-MM-JJ' ou 'AAAA-MM-JJ HH:MM:" "SS'." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Les gains ReplayGain doivent être saisis au format « x.yy dB »." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Les pics ReplayGain doivent être saisis au format 'x.yy'." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "" "Les identifiants de piste MusicBrainz doivent être dans le format UUID." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Le statut de publication MusicBrainz doit être « official » (officiel), " "« promotional » (promotionnel) ou « bootleg » (illégal)." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "La langue doit être au format ISO 639-2 avec trois caractères" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Impossible d'éditer le titre" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "La sauvegarde de <b>%s</b> a échoué. Le fichier peut être en lecture seule, " "corrompu, ou vous n'avez pas la permission de l'éditer." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Codage invalide]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arrangeur" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arrangeurs" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "arrangement" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "auteur" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "auteurs" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "compositeur" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "compositeurs" #: ../quodlibet/util/tags.py:78 msgid "composition" msgstr "composition" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "chef d'orchestre" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "chefs d'orchestre" #: ../quodlibet/util/tags.py:80 msgid "conducting" msgstr "dirigeant" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "contact" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "date" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "description" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:85 msgid "genres" msgstr "genres" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "interprète" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "regrouper" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "langue" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licence" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "endroit" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "parolier" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "paroliers" #: ../quodlibet/util/tags.py:91 msgid "lyrics" msgstr "paroles" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organisation" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "titre" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "version" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "site web" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "Artiste de l'album" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "sous-titre du disque" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disque" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "piste" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "numéro catalogue" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "date de première publication " #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "Nom de la première édition " #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "Artiste (première édition)" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "date d'enregistrement " #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "pays de publication" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz recording ID" msgstr "Identifiant MusicBrainz d'enregistrement" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz release track ID" msgstr "Identifiant MusicBrainz de piste" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "Identifiant MusicBrainz de parution " #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz artist ID" msgstr "Identifiant MusicBrainz d'artiste" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz release artist ID" msgstr "Identifiant MusicBrainz d'artiste dans la parution" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "Identifiant MusicBrainz de TRM" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "Statut MusicBrainz de l'album" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Type MusicBrainz de l'album" #: ../quodlibet/util/tags.py:129 msgid "MusicBrainz release group ID" msgstr "Identifiant MusicBrainz groupe de parutions " #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "gain pour la piste" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "pic de la piste" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "gain pour l'album" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "pic de l'album" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "disques" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "pistes" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "dernier lancement" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "chemin complet" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "point de montage" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "personnes" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "année" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "année de première publication " #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "signet" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "format de fichier" #: ../quodlibet/util/tags.py:165 msgid "playlists" msgstr "listes de lecture" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "Nombre de canaux" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "trier" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "rôles" #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "" #~ "Impossible d importer %s. Désactivation de navigateur de flux audio." #~ msgid "High Res" #~ msgstr "Haute résolution" #~ msgid "Audio Backend Failed to Load" #~ msgstr "Impossible de charger le gestionnaire audio" #~ msgid "" #~ "Loading the audio backend '%(name)s' failed. Audio playback will be " #~ "disabled." #~ msgstr "" #~ "Le chargement du périphérique audio '%(name)s' a échoué. La sortie audio " #~ "est désactivée." #~ msgid "_Open" #~ msgstr "_Ouvrir" #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Une exception est survenue dans Quod Libet. Un fichier de débuggage a été " #~ "enregistré dans <b >%(dump-path)s</b>, qui nous aidera à trouver la cause " #~ "du problème. Veuillez ouvrir un ticket d'incident à %(new-issue-url)s et " #~ "attachez-y ce fichier ou son contenu. Ce fichier peut contenir certaines " #~ "informations vous identifiant, telles qu'une liste de titres récemment " #~ "écoutés. Si ceci est inacceptable, envoyez à la place <b>%(mini-dump-" #~ "path)s</b> accompagné d'une description détaillée du problème." #~ msgid "Remove all songs from the queue" #~ msgstr "Supprimer tous les titres de la file d'attente" #~ msgid "Watch this folder for new songs" #~ msgstr "Surveiller les modifications sur ce dossier" #~ msgid "browsers" #~ msgstr "navigateurs" #, fuzzy #~ msgid "Controls the tone of your music with an equalizer." #~ msgstr "Contrôlez la tonalité de votre musique avec un égaliseur" #~ msgid "Unable to download lyrics." #~ msgstr "Impossible de télécharger des paroles." #~ msgid "Set or toggle the playback order" #~ msgstr "Définir ou basculer d'un ordre de lecture à un autre" #~ msgid "Uninitialized iPod" #~ msgstr "iPod non initialisé" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Voulez-vous créer une base de données vide sur cet iPod ?" #~ msgid "_Volume Gain (dB):" #~ msgstr "Gain du _volume (dB) :" #~ msgid "Combine tags with _multiple values" #~ msgstr "Combiner les tags à valeurs _multiples" #~ msgid "Model:" #~ msgstr "Modèle :" #~ msgid "Capacity:" #~ msgstr "Capacité :" #~ msgid "Firmware:" #~ msgstr "Firmware :" #, fuzzy #~ msgid "Removing orphaned iPod track" #~ msgstr "W: suppression d'une piste orpheline de l'iPod" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Impossible d'enregistrer la base de données de l'iPod" #~ msgid "Unable to save iPod database" #~ msgstr "Impossible d'enregistrer la base de données de l'iPod" #, fuzzy #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "" #~ "Impossible d importer %s. Désactivation de navigateur de flux audio." #, fuzzy #~ msgid "Track Repeat" #~ msgstr "pic de la piste" #~ msgid "Shuffle" #~ msgstr "Mélangé" #~ msgid "Weighted" #~ msgstr "Mélangé et pondéré" #~ msgid "_Weighted" #~ msgstr "Mélangé et _pondéré" #~ msgid "_One Song" #~ msgstr "_Une chanson" #~ msgid "Restart the playlist when finished" #~ msgstr "" #~ "Recommencer la liste de lecture après que toutes les chansons ont été " #~ "jouées" #~ msgid "Disable Browser" #~ msgstr "Désactiver le navigateur" #~ msgid "_Disable Browser" #~ msgstr "_Désactiver le navigateur" #, fuzzy #~ msgid "Force Write" #~ msgstr "Écrire" #~ msgid "Filter on _Genre" #~ msgstr "Filtrer sur ce _genre" #~ msgid "Filter on _Artist" #~ msgstr "Filtrer sur cet _artiste" #~ msgid "Filter on Al_bum" #~ msgstr "Filtrer sur cet al_bum" #~ msgid "_Music" #~ msgstr "_Musique" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Signets" #~ msgid "Song _List" #~ msgstr "_Liste de chansons" #, fuzzy #~ msgid "D:" #~ msgstr "A:" #, fuzzy #~ msgid "W:" #~ msgstr "A:" #, fuzzy #~ msgid "E:" #~ msgstr "E: " #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Arrêter après cette chanson" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "et %d de plus..." #~ msgstr[1] "et %d de plus..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Séparer le disque de l'_album" #, fuzzy #~ msgid "Timeout" #~ msgstr "Temps" #, fuzzy #~ msgid "Select an album" #~ msgstr "Choisir _tous" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s et %(count)d de plus" #~ msgstr[1] "%(title)s et %(count)d de plus" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Listes de lecture" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "_Utiliser des coins arrondis pour les vignettes" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "Arrondir les coins des jaquettes d'album. Peut nécessiter un redémarrage " #~ "pour prendre effet." #~ msgid "Re_fresh Library" #~ msgstr "Ra_fraîchir la bibliothèque" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "Supprimer les doublons" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Impossible d'ouvrir les fichiers" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "GStreamer n'a aucun élément pour gérer la lecture de fichiers. Vérifiez " #~ "votre installation." #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Valeur non valide" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "Le moteur audio %r n'est pas installé." #~ msgid "ql-save" #~ msgstr "Enregi_strer" #~ msgid "command|filename" #~ msgstr "nom_de_fichier" #~ msgid "command|tag" #~ msgstr "etiquette" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: Impossible de trouver %s." #, fuzzy #~ msgid "heading|Search" #~ msgstr "Rechercher" #~ msgid "%d of %d" #~ msgstr "%d sur %d" #~ msgid "Usage: %s %s\n" #~ msgstr "Utilisation: %s %s\n" #~ msgid "_Download..." #~ msgstr "_Télécharger..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Nouvelle radio internet" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Écraser <b>%s</b> ?" #~ msgid "Output Error" #~ msgstr "Erreur de sortie" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet est déjà en fonctionnement." #~ msgid "No song is currently playing." #~ msgstr "Il n'y a pas de chanson en cours de lecture." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Impossible d'écrire le fichier %s. Suppression." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Modifier les signets" #~ msgid "_New Folder..." #~ msgstr "_Nouveau dossier..." #~ msgid "_Add to Playlist" #~ msgstr "_Ajouter à la liste de lecture" #~ msgid "_Edit Display..." #~ msgstr "_Éditer l'affichage des informations..." #~ msgid "Output Log" #~ msgstr "Journal" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d radio" #~ msgid "_Add a Location..." #~ msgstr "_Ajouter une adresse..." #~ msgid "_Output Log" #~ msgstr "J_ournal" #~ msgid "Invalid command %r received." #~ msgstr "Commande invalide (%r) reçue." #~ msgid "Unknown browser %r." #~ msgstr "Navigateur inconnu (%r)." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Configurer les colonnes..." #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "" #~ "Vous êtes sur le point de changer la notation de %d chansons.\n" #~ "Voulez-vous continuer?" #~ msgstr[1] "" #~ "Vous êtes sur le point de changer la notation de %d chansons.\n" #~ "Voulez-vous continuer?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "Vous allez supprimer %d chanson." #~ msgstr[1] "Vous allez supprimer %d chansons." #, fuzzy #~ msgid "Track Headers" #~ msgstr "Colonnes « _Piste »" #, fuzzy #~ msgid "People Headers" #~ msgstr "Colonnes « Ar_tistes »" #, fuzzy #~ msgid "Album Headers" #~ msgstr "Colonnes « _Album »" #, fuzzy #~ msgid "Date Headers" #~ msgstr "Colonnes « _Date »" #, fuzzy #~ msgid "File Headers" #~ msgstr "Colonnes « _Fichier »" #, fuzzy #~ msgid "Production Headers" #~ msgstr "Colonnes « _Production »" #~ msgid "Tag:" #~ msgstr "É_tiquette :" #~ msgid "Too Many Errors" #~ msgstr "Trop d'erreurs" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Arrêt de la lecture suite à %d erreurs successives." #~ msgid "Warnings" #~ msgstr "Avertissements" #~ msgid "No log available." #~ msgstr "Aucun journal disponible" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "Artiste de l'album" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "artistes" #, fuzzy #~ msgid "album (sort)" #~ msgstr "Artiste de l'album" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "interprètes" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "interprètes" #~ msgid "MusicBrainz album artist ID" #~ msgstr "Identifiant MusicBrainz - artiste (album)" #~ msgid "errors" #~ msgstr "erreurs" #~ msgid "Permanently delete this file?" #~ msgstr "Supprimer définitivement ce fichier?" #~ msgid "Permanently delete these files?" #~ msgstr "Supprimer définitivement ces fichiers?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s et %(count)d de plus..." #~ msgstr[1] "%(title)s et %(count)d de plus..." #~ msgid "Version:" #~ msgstr "Version:" #~ msgid "_Cause an Error" #~ msgstr "_Provoquer une erreur" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "Impossible d'ajouter %s à la bibliothèque.\n" #~ "\n" #~ msgid "Do you wish to continue?" #~ msgstr "Voulez-vous continuer?" #, fuzzy #~ msgid "Confirm duplicates removal" #~ msgstr "Confirmez la suppression de la liste de lecture" #~ msgid "No eject command found." #~ msgstr "Pas de commande d'éjection trouvée." #~ msgid "Unable to start web browser" #~ msgstr "Impossible de lancer un navigateur web" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Aucun navigateur web n'a pu être trouvé. Veuillez positionner votre " #~ "variable $BROWSER, ou assurez-vous de l'existence de /usr/bin/sensible-" #~ "browser." #~ msgid "Library Error" #~ msgstr "Erreur de bibliothèque" #, fuzzy #~ msgid "_Output device:" #~ msgstr "Pipeline de s_ortie" #~ msgid "translator-credits" #~ msgstr "" #~ "Joshua Kwan <joshk@triplehelix.org>\n" #~ "kwikwi <kwiskas@gmail.com>\n" #~ "fab <fab@gnux.info>\n" #~ "Bastien Gorissen <kadomony@gmail.com>\n" #~ "Nick Boultbee <nick.boultbee@googlemail.com>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "" #~ "Listez les autres en-têtes que vous voulez voir affichés, séparées par " #~ "des espaces" #~ msgid "_Edit and Continue" #~ msgstr "Éditer et Continuer" #, fuzzy #~ msgid "You are about to change the rating of %d song." #~ msgid_plural "You are about to change the rating of %d songs." #~ msgstr[0] "" #~ "Vous êtes sur le point de changer la notation de %d chanson.\n" #~ "Voulez-vous continuer?" #~ msgstr[1] "" #~ "Vous êtes sur le point de changer la notation de %d chansons.\n" #~ "Voulez-vous continuer?" #~ msgid "Confirm rating" #~ msgstr "Vérifier notation" #~ msgid "Search your library" #~ msgstr "Rechercher dans votre bibliothèque de musique" #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "Ce programme est un logiciel libre ; veuillez voir la source pour les\n" #~ "conditions de duplication. Il n'y a PAS de garantie; même pour la\n" #~ "COMMERCIALISATION ou L'APTITUDE À UN OBJET PARTICULIER.\n" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r ne contient aucun navigateur." #~ msgid "Total size unknown" #~ msgstr "Taille totale inconnue" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r ne contient aucun périphérique." #~ msgid "Quod Libet Plugins" #~ msgstr "Greffons de Quod Libet" #~ msgid "Quod Libet Preferences" #~ msgstr "Préférences de Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Pas jouée aujour_d'hui" #~ msgid "Not Played in a _Week" #~ msgstr "Pas jouée depuis une _semaine" #~ msgid "Not Played in a _Month" #~ msgstr "Pas jouée depuis un _mois" #~ msgid "B_ottom 40" #~ msgstr "Fl_op 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "Les 40 chansons que vous avez le moins jouées (plus de 40 peuvent être " #~ "choisies en cas d'égalité)" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Afficher les recherches simples en bleu, les avancées en vert, et les " #~ "invalides en rouge" #~ msgid "_Select" #~ msgstr "_Choisir" #~ msgid "Separators for splitting tags" #~ msgstr "Séparateurs pour la séparation des étiquettes (\"tags\")" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | contrôle ]" #~ msgid "Date" #~ msgstr "Date" #~ msgid "Choose New Stations" #~ msgstr "Choisir des nouvelles radios Internet" #~ msgid "Add" #~ msgstr "Ajouter" #, fuzzy #~ msgid "Bitrate" #~ msgstr "Débit des données" #~ msgid "_Stations..." #~ msgstr "_Radios internet..." #~ msgid "Quod Libet" #~ msgstr "Quod Libet" #~ msgid "Initializing audio backend (%s)" #~ msgstr "Initialisation du moteur audio (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "Initialisation de la librairie (%s)" #~ msgid "Unable to save library" #~ msgstr "Impossible d'enregistrer la bibliothèque de données." #~ msgid "" #~ "The audio output pipeline %r could not be created. Check your GStreamer " #~ "settings in ~/.quodlibet/config." #~ msgstr "" #~ "Le canal de sortie %r n'a pas pu être créée. Vérifiez vos paramètres " #~ "GStreamer dans ~/.quodlibet/config." #~ msgid "Sort by title" #~ msgstr "Tri par titre" #~ msgid "Sort by artist" #~ msgstr "Tri par artiste" #~ msgid "Lyrics provided by %s." #~ msgstr "Paroles fournies par %s" #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Des paroles n'ont pas été trouvées.\n" #~ "\n" #~ "Vous pouvez appuyer le bouton Télécharger pour faire une recherche de " #~ "paroles en ligne. Vous pouvez aussi saisir les paroles vous-même et " #~ "appuyer 'Enregistrer'." #~ msgid "part" #~ msgstr "partie" #~ msgid "Opening audio device." #~ msgstr "Ouverture du périphérique audio." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d chansons sauvegardées" #~ msgid "MusicBrainz album ID" #~ msgstr "Identifiant MusicBrainz - album" #~ msgid "Loaded song library." #~ msgstr "Bibliothèque de chansons chargée." #~ msgid "Unable to open audio device" #~ msgstr "Impossible d'ouvrir la périphérique audio" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet a essayé d'accéder aux pilotes 'autosink' et '%(sink)s' mais " #~ "aucun n'a pu être ouvert. Définissez votre canal GStreamer en changeant " #~ "la ligne\n" #~ "<b>pipeline = %(sink)s</b>\n" #~ " dans ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet n'a pas pu trouver l'élément 'filesrc' de GStreamer. Vérifiez " #~ "votre installation de GStreamer." �������quodlibet-3.9.1/po/sv.po����������������������������������������������������������������������������0000644�0001750�0001750�00000547272�13115512743�015373� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Swedish translation of Quod Libet 2.5 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Daniel Nyberg <p.daniel.nyberg@gmail.com>, 2013. # Erik Christiansson <spam.erik@alphafish.com>, 2006. # msgid "" msgstr "" "Project-Id-Version: Quod Libet 2.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:30+0100\n" "Last-Translator: Daniel Nyberg <p.daniel.nyberg@gmail.com>\n" "Language-Team: SWEDISH\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Redigera taggar i ljudfiler" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Ljudtaggsredigerare" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Lyssna på, bläddra i eller redigera din ljudsamling" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Musikspelare" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "_Titel" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artist" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Datum" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Betyg" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Sortera _på..." #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Inställningar" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Albumlista" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Albumlista" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Alla album" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d album" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Ladda om omslaget" msgstr[1] "Ladda om omslagen" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Låtar utan album" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d spår" msgstr[1] "%d spår" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d skiva" msgstr[1] "%d skivor" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Alla album" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Inställningar för albumlista" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Visa album_omslag" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Sökning inkluderar personer" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[alternativ]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Albumvisning" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Okänd" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Ny feed" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Ange platsen för en ljud-feed:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Ljudfeeds" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Ljudfeeds" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Hämta" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Hämta filer" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Hämta fil" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Kunde ej lägga till feed" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> kunde ej läggas till. Servern kan vara nere eller så innehåller " "platsen ej en ljudfeed." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "Uppdatera biblioteket" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Ta bort filer" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Nuvarande ljud-backend stödjer inte URL:er. Ljudströmsbläddraren avaktiverad." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Biblioteksbläddrare" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d låt" msgstr[1] "%d låtar" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Ogiltigt mönster" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Albumsamling" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "_Albumsamling" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "Okänd %s" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "Multipla %s-värden" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Anpassad" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "Ta bort taggar" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tagg" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Slå samman" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Inställningar för skivsamling" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Total storlek:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Total storlek:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Inställningar för panelbläddrare" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Visa album_omslag" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Alla album" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "Inga nya stationer" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Filsystem" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Filsystem" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Kunde ej kopiera låtar" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "De valda filerna kan inte kopieras till andra låtlistor eller till kön." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "Lägg _till i bibliotek" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Filtypen stödjs ej" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Stationslistor kan endast innehålla stationsplatser, ej andra stationslistor " "eller spellistor. Följande platser kan ej laddas:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Kunde ej lägga till station" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internetradio" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Ladda hem stationslista" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Ny station" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Ange adressen till en internetradiostation:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Elektrinisk" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "Hip Hop / Rap" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Gamla favoriter" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japanskt" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "indisk" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Religiöst" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Topplistemusik" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Turkiskt" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Reggae / Dancehall" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "Latin" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "Universitetsradio" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Prat / Nyheter" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambient" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Jazz" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Klassiskt" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternativ" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metal" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Country" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Nyheter" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Schlager" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Funk" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Blues" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Punk" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Reggaeton" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Slavisk" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Grekiskt" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gothic" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rock" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Uppdatera stationer" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Internetradio" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Ny station" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "_Uppdatera stationer" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Alla stationer" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Favoriter" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Ingen kategori" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Inga stationer funna" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Inga internetradiostationer hittades på %s" #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Alla listade stationer finns redan i biblioteket" #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "_Lägg till som favorit" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Ta bort från favoriter" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d station" msgstr[1] "%(count)d stationer" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Enhetsinställningar" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Enhet:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Ej monterad" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Monteringspunkt:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Namn:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Mediaenheter" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Mediaenheter" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Mata ut" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Egenskaper" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Byt namn" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> använt, <b>%s</b> tillgängligt" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> is ej ansluten." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopierar <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Kunde ej kopiera låt" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Det finns inte tillräckligt med fritt utrymme för den här sången." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> kunde inte kopieras." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Kunde ej ta bort låtar." #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Tar bort <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> kunde inte tas bort." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Kunde ej ta bort låt" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Utmatning av <b>%s</b> misslyckades." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Kunde inte mata ut enhet" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "Ingen enhetsdrivrutin. Mediaenheter avaktiverade." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Panelbläddrare" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Panelbläddrare" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Välj _alla" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Alla" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Inställningar för panelbläddrare" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Spellistor" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "Spellistor" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Ta _bort från spellista" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importera" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Ny spellista" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Kan ej importera spellistor" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet kan endast importera spellistor i M3U- och PLS-format." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Kan ej byta namn på spellista" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importera spellista" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Ny spellista" #: ../quodlibet/browsers/playlists/menu.py:86 #, fuzzy, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Är du säker på att du vill ändra betygen på alla %d låtar?" msgstr[1] "Är du säker på att du vill ändra betygen på alla %d låtar?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Ny spellista" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Inställningar för panelbläddrare" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Spellistor" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Är du säker på att du vill ta bort spellistan '%s'?" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "All information om den valda spellistan kommer att tas bort och kan inte " "återställas." #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Ange ett namn på den nya spellistan:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importerar spellista.\n" "\n" "%(current)d/%(total)d låtar tillagda." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Begränsa resultat" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Sök i bibliotek" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Sök i bibliotek" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Panelbläddrare" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Sök" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "plats" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet körs inte" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "musikbibliotek och -spelare" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[alternativ]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Skriver ut den låt som spelas och avslutar" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Börja spela omgående" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Hoppa till nästa låt" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" "Hoppa till föregående låt, eller starta om aktuell låt om det är nära början" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Hoppa till föregående låt" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Starta uppspelning" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pausa uppspelning" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Växla spelnings-/paus-läge" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Stoppa uppspelning" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Höj volymen" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Sänk volymen" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Skriv ut spelarstatus" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Dölj huvudfönstret" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Visa huvudfönstret" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Växla synlighet för huvudfönstret" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Fokuserar på den spelare som körs" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Ta bort aktuella bläddrarfilter" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Uppdatera och skanna om biblioteket" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Inaktivera bläddrare" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Skriv ut nuvarande spellista" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Skriv ut innehållet i kön" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Skriv ut innehållet i kön" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Starta utan insticksmoduler" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet körs inte" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Avsluta Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Sök innom spelande låt" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Växla spelnings-/paus-läge" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Stäng av, på eller växla repetering" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Ställ in volymen" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Sök i ljudbiblioteket" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "fråga" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Spela en fil" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "filnamn" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Betygsätt den spelande låten" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Ange nuvarande bläddrare" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Betygsätt den spelande låten" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Öppna ny bläddrare" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Visa eller dölj bläddraren" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Visa eller dölj huvudlåtfönstret" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtrera på slumpvis värde" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "tagg" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtrera på ett taggvärde" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tagg=värde" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Kölägg en fil eller fråga" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Kölägg kommaseparerad lista" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "filnamn" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Skriv ut filnamnen på sökresultatet till stdout" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Ta bort fil eller fråga från kö" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Ogiltigt argument för '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Försök med %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Okänd enhet" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "Kan inte importera %s, som behövs för enhetsstöd." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r stöds inte. " #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Kan inte hitta %s." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Initialiserar enhetsdrivrutin." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Testar '%s'" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Kunde inte ansluta till enhetsdrivrutin." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Enhetsdrivrutin initierad." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Filnamn mönster:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopiera _omslag" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Ta bort oanvända omslag och kataloger" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Ett fel har inträffat" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Ignorera _alla fel" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "beskrivning" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "en ljudtaggsredigerare" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "mapp" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz spår-ID" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz spår-ID" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Oglitig kodning]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "_Titel" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editera taggar i redigerare" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "Första bokstaven i varje ord _versal" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Inställningar för panelbläddrare" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Total storlek:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Redigera visning" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Vikt" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 #, fuzzy msgid "_Outline" msgstr "_Utgångspipeline" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Redigera visning" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Förhandsgranska" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 #, fuzzy msgid "Automatic Masking" msgstr "Auto_matisk" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 #, fuzzy msgid "Automatic Rating" msgstr "Auto_matisk" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "Nuvarande ljud-backend stödjer inte URL:er. Ljudströmsbläddraren avaktiverad." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%.1f sekunder" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Anpassad" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "_Rensa fel" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Musikspelare" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Internetradio" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Betyg" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "Förval" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Kunde ej spara låt" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Inga insticksmoduler hittades." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Text" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Töm sökning" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Text" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "plats" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Dölj huvudfönstret" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Inställningar" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Sökvägsmönster" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Sökvägsmönster" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d låt" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Utkonfiguration" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "Sökvägsmönster" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Kunde inte ansluta till enhetsdrivrutin." #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "plats" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "_Titel" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 #, fuzzy msgid "Show notifications" msgstr "Inga nya stationer" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Kunde inte ansluta till enhetsdrivrutin." #: ../quodlibet/ext/events/notify.py:251 #, fuzzy msgid "Song Notifications" msgstr "Inga nya stationer" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Nästa" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, fuzzy, python-format msgid "Could not contact service '%s'." msgstr "Kunde inte ansluta till enhetsdrivrutin." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Enhet:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Namn:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Andra:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Artist" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Filnamn mönster:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Slumpvis al_bum" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "album" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Vikt" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Slumpvis al_bum" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Importera spellista" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importera" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 #, fuzzy msgid "Alternative Seek Bar" msgstr "Alternativ" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Text" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Spelar ej" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d låt" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "Sökvägsmönster" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Spelar ej" #: ../quodlibet/ext/events/trayicon/__init__.py:53 #, fuzzy msgid "Tray Icon" msgstr "Inställningar för notifieringsikon" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "Spellistor" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Spela upp/pausera" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "Föregående" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 #, fuzzy msgid "_Next" msgstr "Nästa" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Blanda" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Repetera" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Stoppa efter denna låt" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Öppna ny bläddrare" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Redigera _taggar" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Information" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Spellistor" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Beteende" #: ../quodlibet/ext/events/trayicon/prefs.py:42 #, fuzzy msgid "Scroll wheel adjusts volume" msgstr "" "Skrollhjulet justerar volymen\n" "Skift och skrollhjulet byter låt" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Rullhjul" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Hjälptextvisning" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Text" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Text" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Visa fel" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 #, fuzzy msgid "Waveform Seek Bar" msgstr "Alternativ" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Filer" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Förhandsgranska" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Filtrera på _artist" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 #, fuzzy msgid "Default" msgstr "Förval" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "Anpassad sortering" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Filtrera på _genre" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Filtrera på _artist" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Ljudfeeds" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Ange platsen för en ljud-feed:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Importera spellista" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importera" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Inga stationer funna" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Filnamn mönster:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Filnamn mönster:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Ta bort dubletter" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, fuzzy, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Är du säker på att du vill ta bort %d dublett?" msgstr[1] "Är du säker på att du vill ta bort %d dublett?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "Dubletter kommer att tas bort från spellistan '%s'." #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Ny spellista" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "senast spelad" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "Köad" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Aldrig" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Inga låtar" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Sparade sökningar" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Kunde inte ansluta till enhetsdrivrutin." #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Byt namn" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Bibliotek" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Avlusa" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Dölj huvudfönstret" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Filnamn" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Kunde ej spara låt" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Albumomslag" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Storlek" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Sök:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Sök" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Albumomslag" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Redigera bokmärken" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Redigera bokmärken" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Bokmärken" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album typ" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Filnamn" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Skiva" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Spår" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "_Titel" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "_Artist" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album typ" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "fråga" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Sök" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Inga insticksmoduler hittades." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Bläddrare" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Kunde ej skapa mapp" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "tagg" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Byt namn" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "tagg" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Ogiltigt mönster" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Ogiltigt värde" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "Anpassad sortering" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Kunde ej kopiera låtar" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Inaktivera bläddrare" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Duplicate Key" msgstr "Ta bort dubletter" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "Ta bort dubletter" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "Ta bort dubletter" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "Ta bort taggar" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Redigera visning" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "Extrahera inbäddade bilder" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Extrahera inbäddade bilder" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "Ta bort alla taggar" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "Extrahera inbäddade bilder" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrera på ett taggvärde" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer kunde ej ladda den valda låten." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Filtrera på _genre" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Köad" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Skriv" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz spår-ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "mapp" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "_Albumläge" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Uppdatera stationer" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Importera spellista" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 #, fuzzy msgid "Error during sync" msgstr "Fel vid läsning av %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Byt namn" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Importera spellista" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Information" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Importera spellista" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Kan ej importera spellistor" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Utmatning av <b>%s</b> misslyckades." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Uppdatera biblioteket" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Uppdatera biblioteket" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Redigera taggar" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Redigera taggar" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Alla album" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Förhandsgranska" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Tagg" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Kunde ej ta bort låtar." #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Sök" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "Sökvägsmönster" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Redigera sparade sökningar..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Färglägg _söktermer" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Bibliotek" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Kontrollerar monteringspunkter" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Kontrollerar bibliotek" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Kontrollerar %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Kunde inte ladda filen: %r" #: ../quodlibet/operon/commands.py:37 #, fuzzy msgid "List tags" msgstr "Lista alla taggar." #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Koncis utmatning" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Vilka kolumner som syns och i vilken ordning i koncist läge (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "Lista även programmatiska taggar" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Inte nog många argument" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "För många argument" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "Beskrivning" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Värde" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Visa alla gemensamma taggar" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Kopiera taggar från en fil till en annan" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Visa förändringar, verkställ dem inte" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Hoppa över taggar som inte kan skrivas" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Kan ej kopiera tagen %r till filen: %r" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editera taggar i redigerare" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Inga låtar är valda." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Sätt en tagg och ta bort alla existerande värden" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Kunde inte sätta %r" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "Ta bort taggar" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "Värdet är ett reguljärt uttryck" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "Ta bort alla taggar" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "Kan inte kombinera '--all' med '--regexp'" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "Kan inte ta bort %r från %r" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "Ta bort ett taggvärde" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "Lägg till ett taggvärde" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Visa filinformation" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Kunde inte ladda filen: %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "Extrahera inbäddade bilder" #: ../quodlibet/operon/commands.py:568 #, fuzzy, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Extrahera inbäddade bilder" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Fil" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Visa kortfattad användningsinformation" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "'%s' är inte ett giltigt kolumnnamn (%s)." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Okänd" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "I ordning" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_I ordning" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Slumpvis" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Slumpvis" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Repetera" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "En låt" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Ström" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Buffrar" #: ../quodlibet/player/gstbe/player.py:319 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "Kunde inte skapa förvald GStreamer pipeline." #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 #, fuzzy msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "GStreamer output-pipeline används för uppspelning, exempelvis 'alsasink " "device=default'. Lämna tomt för förinstäld pipeline." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Utgångspipeline" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f sekunder" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "_Buffertlängd:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Inga stationer funna" #: ../quodlibet/player/gstbe/util.py:112 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Ogiltig GStreamer output pipeline, försöker med förvalt värde." #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Kunde ej skapa audiodata" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Ljudenheten %r hittades inte. Kontrollera dina Xine-inställningar i ~/." "quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, fuzzy, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Kunde inte länka GStreamer-pipeline: '%s'" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Insticksmoduler" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Format som stödjs: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Ljudenhet: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Början" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Tid" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Bokmärkesnamn" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Bokmärken" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filter" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "Nyligen _spelad" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Nyligen _tillagda" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 _högsta" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Alla stationer" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Slumpvis _genre" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Slumpvis _artist" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Slumpvis al_bum" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "De 40 mesta spelade låtarna (mer än 40 kan väljas om flera låtar är spelade " "lika mycket)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Värde:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Sparade värden" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Redigera sparade värden..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_matisk" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "_Spårläge" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "_Albumläge" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Replay Gain volymjusterning" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Okänd" #: ../quodlibet/qltk/data_editors.py:355 #, fuzzy msgid "Tag expression" msgstr "Värdet är ett reguljärt uttryck" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Filtrera på ett taggvärde" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Filer" #: ../quodlibet/qltk/delete.py:63 #, fuzzy msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "Dubletter kommer att tas bort från spellistan '%s'." #: ../quodlibet/qltk/delete.py:72 #, fuzzy msgid "The selected files will be deleted from disk." msgstr "Dubletter kommer att tas bort från spellistan '%s'." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Ta bort filer" #: ../quodlibet/qltk/delete.py:106 #, fuzzy msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "Dubletter kommer att tas bort från spellistan '%s'." #: ../quodlibet/qltk/delete.py:115 #, fuzzy msgid "The selected files will be moved to the trash." msgstr "Dubletter kommer att tas bort från spellistan '%s'." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Flytta till papperskorgen" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Flyttar %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Kunde ej flytta till papperskorg" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Misslyckades med att flytta <b>%s</b> till papperskorg." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Tar bort %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Kunde ej ta bort fil" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Borttagning av <b>%s</b> misslyckades." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Hämtningar" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Storlek" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "saknas från %d låt" msgstr[1] "saknas från %d låtar" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "skiljer sig mellan %d låt" msgstr[1] "skiljer sig mellan %d låtar" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Dela till flera värden" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Hämta skiva ur _album" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Hämta _version ur titel" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Hämta arrangör ur ar_tist" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Hämta _uppträdande ut artist" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "Hämta _framträdanden från titel" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "Hämta _originalartist från titel" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Lägg till en tagg" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tagg:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Redigera taggar" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Ta bort _programmatiska taggar" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Ge åtkomst till alla taggar, inklusive maskingenererade. Exempelvis " "MusicBrainz- och Replay Gain-taggar" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Aldrig" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Kunde ej lägga till tagg" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Kunde ej lägga till låt" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Kunde ej lägga till <b>%s</b>\n" "\n" "Den valda filen har ej stöd för flera värden." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Ogiltig tall" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Ogiltig tagg <b>%s</b>\n" "\n" "Den valda filen har ej stöd för att redigera den här taggen." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Ogiltigt värde" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Felaktigt värde: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Taggen är möjligtvis ej korrekt" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> har ändrats utanför programet. Att spara utan att uppdatera " "bilbioteket kan skriva över andra ändringar.\n" "\n" "Spara ändå?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Kunde ej spara låt" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Sparning av filen <b>%s</b> misslyckades. Filen kan vara skrivskyddad, " "korrupt eller så har du inte tillstånd att redigera den." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Fler alternativ" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Insticksmoduler" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s och %(count)d till" msgstr[1] "%(title)s och %(count)d till" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso inställningar" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Dela _på:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Taggredigering" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Mappar" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Ny mapp" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "Välj _alla rekursivt" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Ny mapp" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Namn på den nya mappen:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Kunde ej skapa mapp" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Kunde ej ta bort mapp" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Låtar" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "av %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Skiva %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Spår %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Redigera visning" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Inga låtar är valda." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Inga låtar" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Information" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Text" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Producerad av %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artist" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artister" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "uppträdande" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Aldrig" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d gång" msgstr[1] "%(n)d gånger" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "tillagd" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "senast spelad" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "spelningar" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "överhoppningar" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "betyg" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "längd" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Information" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "Ökande" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "filstorlek" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "ändrad" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d vald" msgstr[1] "%d valda" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Spår otillgängligt" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Spårlista" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d låt utan album" msgstr[1] "%d låtar utan album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Vald discografi" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d låt utan artist" msgstr[1] "%d låtar utan artist" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "album" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Total längd:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Total storlek:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Filer" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Hämta" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Redigera visning..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Ingen text hittades för denna låt." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Söker efter text..." #: ../quodlibet/qltk/maskedbox.py:20 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "Är du säker på att du vill ta bort %d dublett?" #: ../quodlibet/qltk/maskedbox.py:21 #, fuzzy msgid "The selected songs will be removed from the library." msgstr "Dubletter kommer att tas bort från spellistan '%s'." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Förkasta taggändringar?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Taggar har ändrats men ej sparade. Spara filerna eller återgå och förkasta " "ändringarna?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Aldrig" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Filen existerar" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Byt namn på filer" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Aktiva uppgifter" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d uppgifter körs" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Växla spelnings-/paus-läge" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Växla spelnings-/paus-läge" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Insticksmodulfel" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Aktiverad" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Inaktiverad" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Ingen kategori" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "Spel_ordning" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Taggredigering" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Total storlek:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Inga insticksmoduler hittades." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Insticksmoduler" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Visa _fel" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Skiva" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "Sp_år" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "gruppering" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Filnamn" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Längd" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Hoppa automatiskt till spelande låt" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "När en låt spelas, skrolla till den i låtlistan" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Andra:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Redigera visning..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Synliga kolumner" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Titel innehåller _version" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Sökning inkluderar personer" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Album innehåller skivunderrubrik" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Filnamn innehåller _mapp" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Inställningar" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Låtlista" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Synliga kolumner" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Globalt filter:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Använd den här sökningen som ett tillägg till alla andra" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Sök" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Bläddrare" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Bekräfta _multipla betyg" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Fråga om man är helt säker innan betygen ändras på flera låtar samtidigt" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Aktivera_ enklicksbetyg" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Möjliggör betygssättning genom att klicka på betygskolumnen i spellistan" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Betyg" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Föredra _inbäddade bilder" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "Använd grafik som finns inbäddade i ljudfilerna i första hand" #: ../quodlibet/qltk/prefs.py:319 #, fuzzy msgid "_Fixed image filename:" msgstr "_Tvinga bildfilnamn:" #: ../quodlibet/qltk/prefs.py:321 #, fuzzy msgid "The single image filename to use if selected" msgstr "Albumbild som ska tvunget ska användas" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "Albumbild som ska tvunget ska användas" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Albumomslag" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Uppspelning" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Utkonfiguration" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Skala med volymen med det här värdet om ingen Reply Gain-information finns " "tillgänglig" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "_Fall-back förstärkning (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Skala volymen för alla låtar med det här värdet så länge som resultatet inte " "klipper." #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "_Pre-amp förstärkning (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "_Aktivera Replay Gain volymjusterning" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Replay Gain volymjusterning" #: ../quodlibet/qltk/prefs.py:450 #, fuzzy msgid "_Default rating:" msgstr "Förval" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "Betyg" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Bayesisk medelvärdesfaktor (C) för sammanlagt betyg.\n" "0 betyder vanligt medelvärde. Högre faktor betyder att album med får spår " "kommer få mindre extremt betyg. Förändring av faktorn startar en omberäkning " "av alla album." #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "_Bayesisk medelvärdesfaktor" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Spara betyg och antalet _spelningar" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Epost:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "Betyg och antalet spelningar kommer att sparas för denna epost adressen" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Spara taggförändringar automatiskt" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "Spara taggförändringar utan bekräftelse när flera filer editerats" #: ../quodlibet/qltk/prefs.py:587 #, fuzzy msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "En lista med skiljetecken som används vid delning av taggvärden. Listan är " "mellanslagsseparerad." #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Taggar" #: ../quodlibet/qltk/prefs.py:631 msgid "Updating for new ratings" msgstr "Uppdaterar betyg" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "_Uppdatera biblioteket vid programstart" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Sök i bibliotek" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Kontrollera ändringar i biblioteket" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Ladda om biblioteket" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Ladda om alla låtar i bilbioteket (kan ta lång tid)" #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "Skanna mappar" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Inga låtar" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s och %(count)d till" msgstr[1] "%(title)s och %(count)d till" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Egenskaper" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Kö" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Rensa fel" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d låt (%(time)s)" msgstr[1] "%(count)d låtar (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Bläddra i bibliotek" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Växla synlighet för huvudfönstret" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Uppspelning" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Välj mappar" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Kunde ej lägga till låtar" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> använder ett protokoll som inte stödjs" #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Hoppa till spelande låt" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Fil" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Låtar" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Visa" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Bläddrare" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Kontroll" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Hjälp" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "Lägg _till mapp.." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "Lägg _till fil..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Lägg till en plats" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Redigera bokmärken" #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Stoppa efter denna låt" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Onlinehjälp" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Sök i hjälpen" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Lägg till en plats" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Ange platsen för en ljudfil:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Kan lägga till plats" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> är ej en giltig plats." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Lägg till musik" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "Lägg _till mapp.." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Musikspelare" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Lägg _till fil..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Är du säker på att du vill ändra betygen på alla %d låtar?" #: ../quodlibet/qltk/ratingsmenu.py:26 #, fuzzy msgid "The saved ratings will be removed" msgstr "Dubletter kommer att tas bort från spellistan '%s'." #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Betyget på alla markerade låtar kommer att ändras till '%s'" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "Ta bort taggar" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Betyg" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Ersätt mellanslag med _understreck" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Ta bort _Windows-inkompatibla " #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Ta bort diakritiska tecken" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Ta bort icke-ASCII-tecken" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Använd enbart _gemener" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Byt namn på filer" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Sökvägsmönster" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Redigera sparade mönster" #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Förhandsgranska" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nytt namn" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Kunde ej byta namn på fil" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Namnbyte av <b>%s</b> till <b>%s</n> misslyckades. Möjligtvis finns redan " "målfilen eller så har du inte rättigheter att skapa den nya filen eller ta " "bort den gamla." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Ignorera _alla fel" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Fortsätt" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Sökvägen är ej absolut" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Mönstret\t<b>%s</b>\n" "innehåller / men startar inte från roten. För att undvika feldöpta mappar " "ska mönster börja med / eller ~/." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Låtar i de här mapparna kommer att läggas till i biblioteket när det " "uppdateras" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Välj mappar" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Sparade sökningar" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Redigera sparade sökningar..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Sök när man slutat skriva" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Visa sökresultat när användaren har slutat skriva" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Gräns:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Vikt" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Visa återstående tid" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Text" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Fokuserar på den spelare som körs" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Sök innom spelande låt" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Kunde ej ta bort låtar." #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Kunde ej ta bort låtar." #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtrera på %s" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "Alla _Kolumner" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Spårkolumner" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Albumkolumner" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Personkolumner" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Datumkolumner" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_Filkolumner" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Produktionskolumner" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Kolumninställningar..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Färglägg _söktermer" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Lägg till i _kö" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Kopiera till enhet" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Ta bort från bibliotek" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Ersätt _understreck med mellanslag" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Första bokstaven i varje ord _versal" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Dela till flera _värden" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Taggar från sökväg" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Taggar ersätter redan existerande" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Taggar läggs till till redan existerande" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Mönstret\n" "\t<b>%s</b>\n" "är ogiltigt. Möjligtvis innehåller det samma tagg två gånger eller " "obalanserade hakar (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Ogiltiga taggar" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Ogiltiga taggar <b>%s</b>\n" "\n" "Filen har inte stöd för att redigera dessa taggar." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Mönstret är ogiltigt. Säkerställ att du skriver < och > som \\< och " "> och att hakarna är balanserade.\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Redigera visning" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Spårnummer" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Börja frå_n" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Antal spår:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Spela upp/pausera" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Föregående" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "och %d till..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Sparar låtarna du ändrade." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d låtar sparade\n" "(%(remaining)s återstår)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Flyttar %(current)d/%(total)d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Kontrollerar monteringspunkter" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "plats" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "En spellista med namnet %s finns redan." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Ladda om omslaget" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Filsystem" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Visa kortfattad användningsinformation" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Visa version och copyright" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[alternativ]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Alternativet %r känns ej igen." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Alternativet %r kräver ett argument." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r är ej ett unikt prefix." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbit/s" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d sekund" msgstr[1] "%d sekunder" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Ingen tidsinformation" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekund" msgstr[1] "%d sekunder" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minut" msgstr[1] "%d minuter" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d timma" msgstr[1] "%d timmar" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dag" msgstr[1] "%d dagar" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d år" msgstr[1] "%d år" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "svenne" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Datumet måste skrivas in på formatet 'YYYY', 'YYYY-MM-DD' eller 'YYYY-MM-DD " "HH:MM:SS'." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Replay Gain-förstärkningar måste anges på formen 'x.yy dB'." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Replay Gain-toppar måste anges på formen 'x.yy'." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz ID måste vara på UUID-format." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz utgivningsstatus måste vara 'official', 'promotional' eller " "'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Språket måste vara en ISO 639-2 trebokstavsförkortning" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Kunde ej redigera låt" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Sparning av filen <b>%s</b> misslyckades. Filen kan vara skrivskyddad, " "korrupt eller så har du inte tillstånd att redigera den." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Oglitig kodning]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arrangör" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arrangörer" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "arrangör" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "författare" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "författare" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "kompositör" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "kompositörer" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "kompositör" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "dirigenter" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "dirigent" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "datum" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "beskrivning" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "genre" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "uppträdande" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "gruppering" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "språk" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licens" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "plats" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "lyrist" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "lyrister" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "lyrist" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organisation" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "titel" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "version" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "webbsida" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "album artist" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "Skivunderrubrik" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "skiva" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "spår" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "katalognummer" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "ursprungligt släppdatum" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "ursprungligt album" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "ursprunglig artist" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "inspelningsdatum" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "utgivningsland" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz spår-ID" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz release-ID" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "MusicBrainz release-ID" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist-ID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz release-ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz album status" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz album typ" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz release-ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "spårförstärkning" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "spårtopp" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "albumförstärkning" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "albumtopp" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "Referensljudstyrka" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "skivor" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "spår" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "senast spelad" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "fullt namn" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "monteringspunkt" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "personer" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "år" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "ursprungligt släppdatum" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "Bokmärke" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "filformat" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Spellistor" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Bläddrare" #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "Kunde inte importera %s. Ljudströmsbläddraren avaktiverad." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Ett undantagsfel har inträffat i Quod Libet. En dumpfil har skapats i <b>" #~ "%s</b>. Den underlättar felsökningen. Skapa ett nytt ärende på http://" #~ "code.google.com/p/quodlibet/issues/list och bifoga filen eller infoga " #~ "innehållet. Filen kan innehålla viss personlig information om dig och din " #~ "dator. Exempelvis en lista med de senaste spelade filerna. Om det inte är " #~ "acceptabelt, skicka <b>%s</b> med en beskrivning om vad du gjorde i " #~ "stället.\n" #~ "\n" #~ "Nu är Quod Libet instabilt. Omstart rekommenderas. Ditt bibliotek kommer " #~ "att sparas." #~ msgid "Unable to download lyrics." #~ msgstr "Kunde ej hämta text." #~ msgid "Remove all songs from the queue" #~ msgstr "Ta bort alla låtar från kön" #~ msgid "Watch this folder for new songs" #~ msgstr "Vaka över denna mapp för nya låtar" #~ msgid "Set or toggle the playback order" #~ msgstr "Ange eller växla spelordningen" #~ msgid "Uninitialized iPod" #~ msgstr "iPod ej initierad" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Vill du skapa en tom databas på den här iPoden?" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Volymsförstärkning (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Lägg ihop taggar med _multipla värden" #~ msgid "Model:" #~ msgstr "Modell:" #~ msgid "Capacity:" #~ msgstr "Kapacitet:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Tar bort överblivna iPod-låtar" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Kunde ej iPod-databas" #~ msgid "Unable to save iPod database" #~ msgstr "Kunde ej iPod-databas" #, fuzzy #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "Kunde inte importera python-gpod, iPodstöd avaktiverat." #, fuzzy #~ msgid "Track Repeat" #~ msgstr "spårtopp" #~ msgid "Shuffle" #~ msgstr "Blanda" #~ msgid "Weighted" #~ msgstr "Viktad" #~ msgid "_Weighted" #~ msgstr "_Viktad" #~ msgid "_One Song" #~ msgstr "_En låt" #~ msgid "Restart the playlist when finished" #~ msgstr "Starta om spellistan vid slut" #~ msgid "Disable Browser" #~ msgstr "Inaktivera bläddrare" #~ msgid "_Disable Browser" #~ msgstr "_Inaktivera bläddrare" #, fuzzy #~ msgid "Force Write" #~ msgstr "Skriv" #~ msgid "Filter on _Genre" #~ msgstr "Filtrera på _genre" #~ msgid "Filter on _Artist" #~ msgstr "Filtrera på _artist" #~ msgid "Filter on Al_bum" #~ msgstr "Filtrera på al_bum" #~ msgid "_Music" #~ msgstr "_Musik" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Bokmärken" #~ msgid "Song _List" #~ msgstr "Låt_lista" #, fuzzy #~ msgid "D:" #~ msgstr "D:" #, fuzzy #~ msgid "W:" #~ msgstr "W:" #, fuzzy #~ msgid "E:" #~ msgstr "E:" #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "Skrollhjulet byter låt\n" #~ "Skift och skrollhjulet justerar volymen" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Stoppa efter denna låt" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "och %d till..." #~ msgstr[1] "och %d till..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Hämta skiva ur _album" #, fuzzy #~ msgid "Timeout" #~ msgstr "Tid" #, fuzzy #~ msgid "Select an album" #~ msgstr "Välj _alla" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s och %(count)d till" #~ msgstr[1] "%(title)s och %(count)d till" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Spellistor" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "_Använd rundande hörn på miniatyrbilder" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "Runda hörnen på albumbilder. Omstart kan behövas för att träda i kraft" #~ msgid "Re_fresh Library" #~ msgstr "Uppdatera biblioteket" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "Ta bort taggar" #~ msgid "Unable to open input files" #~ msgstr "Kunde ej öppna infiler" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "GStreamer har ingen funktionalitet att läsa filer. Kontrollera dina " #~ "GStreamerinställningar." #~ msgid "Invalid audio backend" #~ msgstr "Ogiltigt ljuddrivrutin" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "Ljuddrivrutinen %r är inte installerad." #~ msgid "ql-save" #~ msgstr "ql-save" #~ msgid "ql-revert" #~ msgstr "ql-revert" #~ msgid "Print all tags to stdout" #~ msgstr "Skriv ut alla taggar till stdout" #~ msgid "Load tags dumped with 'dump'" #~ msgstr "Läs in taggar dumpade med 'dump'" #~ msgid "command|filename" #~ msgstr "filnamn" #~ msgid "command|tag" #~ msgstr "tagg" #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: Hittar inte 'libudev'." #~ msgid "heading|Search" #~ msgstr "Sök" #~ msgid "%d of %d" #~ msgstr "%d av %d" #~ msgid "Usage: %s %s\n" #~ msgstr "Användning: %s %s\n" #~ msgid "_Download..." #~ msgstr "_Hämta..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Ny station" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Skriv över <b>%s</b>?" #~ msgid "Output Error" #~ msgstr "Utfel" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "GStreamer output pipeline kunde inte initieras. Pipelinen kan vara " #~ "ogiltig, eller så används redan enheten. Kontrollera " #~ "uppspelningsinställningarna." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet körs redan." #~ msgid "No song is currently playing." #~ msgstr "Ingen låt spelas för tillfället" #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Kunde inte skriva till %s. Tar bort den." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Redigera bokmärken" #~ msgid "_New Folder..." #~ msgstr "Ny mapp..." #~ msgid "_Add to Playlist" #~ msgstr "_Lägg till i spellista" #~ msgid "_Edit Display..." #~ msgstr "_Redigera visning..." #~ msgid "Output Log" #~ msgstr "Utgångslogg" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d station" #~ msgid "_Order:" #~ msgstr "_Ordning:" #~ msgid "_Add a Location..." #~ msgstr "Lägg _till plats..." #~ msgid "_Output Log" #~ msgstr "_Utlogg" #~ msgid "Invalid command %r received." #~ msgstr "Ogiltigt kommando %r." #~ msgid "Unknown browser %r." #~ msgstr "Okänd bläddrare %r." #~ msgid "Custom _Sort..." #~ msgstr "Egen _sortering..." #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "Är du säker på att du vill ändra betygen på alla %d låtar?" #~ msgstr[1] "Är du säker på att du vill ändra betygen på alla %d låtar?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "Är du säker på att du vill ta bort %d dublett?" #~ msgstr[1] "Är du säker på att du vill ta bort %d dubletter?" #~ msgid "Track Headers" #~ msgstr "Spårkolumner" #~ msgid "People Headers" #~ msgstr "Personkolumner" #~ msgid "Album Headers" #~ msgstr "Albumkolumner" #~ msgid "Date Headers" #~ msgstr "Datumkolumner" #~ msgid "File Headers" #~ msgstr "Filkolumner" #~ msgid "Production Headers" #~ msgstr "Produktionskolumner" #~ msgid "Tag:" #~ msgstr "Tagg:" #~ msgid "Descending" #~ msgstr "Avtagande" #~ msgid "Too Many Errors" #~ msgstr "För många fel" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Uppspelning avbryts på grund av att det var %d fel på rad." #~ msgid "Warnings" #~ msgstr "Varningar" #~ msgid "General" #~ msgstr "Övergripande" #~ msgid "No log available." #~ msgstr "Inga loggar tillgängliga." #~ msgid "album artist (sort)" #~ msgstr "album artist (sort)" #~ msgid "artist (sort)" #~ msgstr "artist (sort)" #~ msgid "album (sort)" #~ msgstr "album (sort)" #~ msgid "performer (sort)" #~ msgstr "uppträdande (sort)" #~ msgid "performers (sort)" #~ msgstr "uppträdanden (sort)" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz album artist-ID" #~ msgid "errors" #~ msgstr "fel" #~ msgid "Failed reading album art \"%s\"" #~ msgstr "Kunde inte läsa albumbiler \"%s\"" #~ msgid "Permanently delete this file?" #~ msgstr "Ta bort filen permanent?" #~ msgid "Permanently delete these files?" #~ msgstr "Ta bort filerna permanent?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s och %(count)d till..." #~ msgstr[1] "%(title)s och %(count)d till..." #~ msgid "Version:" #~ msgstr "Version:" #~ msgid "_Cause an Error" #~ msgstr "_Orsaka ett fel" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s kunde ej läggas till i biblioteket.\n" #~ "\n" #~ msgid "Error running command %r, caused by: %r." #~ msgstr "Fel inträffade vid körning av kommando %r, orsakat av %r." #~ msgid "" #~ "Cannot save library contents to %s (it's a directory). Please remove it " #~ "and try again." #~ msgstr "" #~ "Kunde inte spara biblioteksinnehåll till %s (det är en katalog). Ta bort " #~ "den och försök igen." #~ msgid "Library Error" #~ msgstr "Biblioteksfel" #~ msgid "_Output device:" #~ msgstr "_Utenhet" #~ msgid "translator-credits" #~ msgstr "Erik Christiansson" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Andra kolumner att visa, separerade med mellanslag" #~ msgid "_Edit and Continue" #~ msgstr "_Editera och fortsätt" #~ msgid "Search your library" #~ msgstr "Sök i ditt bibliotek" #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "Detta är fri mjukvara, se källkoden för kopieringsvillkor. There is NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ "Inga garantier lämnas, inte ens för KÖP eller LÄMPLIGHET FÖR NÅGOT " #~ "SPECIELLT ÄNDAMÅL.\n" #~ msgid "Unable to start web browser" #~ msgstr "Kunde ej starta webbläsare" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Ingen webbläsare kunde hittas. Ställ in din $BROWSER-variabel eller " #~ "säkerställ att /usr/bin/sensible-browser finns." #, fuzzy #~ msgid "No eject command found." #~ msgstr "Inga stationer funna" #, fuzzy #~ msgid "Confirm rating" #~ msgstr "Information" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Total storlek:" #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet-insticksmoduler" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Visa enkla sökningar i blått, avancerade i grönt och ogiltiga i rött" #~ msgid "_Select" #~ msgstr "_Välj" #~ msgid "Separators for splitting tags" #~ msgstr "Avgränsare för taggdelning" #~ msgid "Quod Libet Preferences" #~ msgstr "Inställningar för Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Ej spelad i_dag" #~ msgid "Not Played in a _Week" #~ msgstr "Ej spelad på en _vecka" #~ msgid "Not Played in a _Month" #~ msgstr "Ej spelad på en _månad" #~ msgid "B_ottom 40" #~ msgstr "40 _lägsta" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "De 40 minst spelade låtarna (mer än 40 kan väljas om flera låtar är " #~ "spelade lika mycket)" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | kontroll ]" #, fuzzy #~ msgid "Date" #~ msgstr "_Datum" #~ msgid "Choose New Stations" #~ msgstr "Välj nya stationer" #~ msgid "Add" #~ msgstr "Lägg till" #, fuzzy #~ msgid "Bitrate" #~ msgstr "bitrate" #~ msgid "_Stations..." #~ msgstr "_Stationer..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Avsluta Quod Libet" #~ msgid "Unable to save library" #~ msgstr "Kunde ej spara bibliotek" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Kan ej spela låt" #~ msgid "Sort by title" #~ msgstr "Sortera efter titel" #~ msgid "Sort by artist" #~ msgstr "Sortera efter artist" #~ msgid "Lyrics provided by %s." #~ msgstr "Texter från %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Texter hittades inte.\n" #~ "\n" #~ "Klicka på kanppen Hämta för att låte Quod Libet söka efter texten på " #~ "internet. Du kan också skriva in texten själv och klicka på Spara." #~ msgid "part" #~ msgstr "del" #~ msgid "Opening audio device." #~ msgstr "Öppnar ljudenhet" #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d låtar sparade" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz album-ID" #~ msgid "Loaded song library." #~ msgstr "Låtbibliotek laddat." #~ msgid "Unable to open audio device" #~ msgstr "Kunde ej öppna ljudenhet" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet försökte komma åt drivrutinerna 'autosink' och '%(sink)s' men " #~ "kunde inte öppna dem. Konfigurera din GStreamer-pipeline genom att ändra " #~ "raden\n" #~ "....<b>pipeline = %(sink)s</b>\n" #~ "i ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet kunde ej hitta GStreamer-elementet 'filesrc'. Kontrollera din " #~ "GStreamer-installation." #, fuzzy #~ msgid "C_opy album covers" #~ msgstr "Visa album_omslag" #~ msgid "Unable to retag multiple values" #~ msgstr "Kan ej tagga om flera värden" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "Det går ej att byta namn på en tagg med flera värden." #~ msgid "W: %s is not a QL song database." #~ msgstr "W: %s är ej en QL-låtdatabas." #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "Låtvis (\"radio\") volymjustering" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "Albumvis (\"audiofil\") volymjustering" #~ msgid "_Volume Normalization" #~ msgstr "_Volymnormalisering" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "Skannar biblioteket. Detta kan ta flera minuter.\n" #~ "\n" #~ "%d låtar omladdade\n" #~ "%d låtar borttagna" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "Söker efter nya låtar och lägger till dem i biblioteket.\n" #~ "\n" #~ "%d låtar tillagda" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "M3U-spellistor kan ej laddas." #~ msgid "This station is already in your library." #~ msgstr "Stationen finns redan i biblioteket." #~ msgid "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgstr "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "av <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Skiva <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Spår <tracknumber>>>" #~ msgid "The library cannot be refreshed while Quod Libet is running." #~ msgstr "Biblioteket kan inte uppdateras när Quod Libet körs" #~ msgid "Loading, scanning, and saving your library." #~ msgstr "Läser hem, skannar och sparar bilblioteket" #~ msgid "Rescan your library and exit" #~ msgstr "Skannar om biblioteket och avslutar" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/ro.po����������������������������������������������������������������������������0000644�0001750�0001750�00000525771�13115512743�015363� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# translation of ro.po to Română # Romanian translation of Quod Libet # Copyright (C) 2006, Free Software Foundation # This file is distributed under the same license as the Quod Libet package. # # # Mugurel Tudor <mugurelu@gnome.ro>, 2006. # Mişu Moldovan <dumol@gnome.ro>, 2006. msgid "" msgstr "" "Project-Id-Version: ro\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:30+0100\n" "Last-Translator: Mugurel Tudor <mugurelu@gnome.ro>\n" "Language-Team: Română <gnomero@lists.sourceforge.net>\n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3;plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" "2:1));\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Editare etichete fişiere audio" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Editor pentru etichete audio" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Ascultaţi, editaţi sau cautaţi în propria colecţie audio" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Redare audio" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Titlu" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artist" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Dată" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "gen" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "E_valuare" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Sortează după dată" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Preferinţe" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Listă albume" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Listă _albume" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Toate albumele" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albume" msgstr[2] "%d de albume" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Arată _coperţile albumelor" msgstr[1] "Arată _coperţile albumelor" msgstr[2] "Arată _coperţile albumelor" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Piese ce nu aparţin unui album" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d pistă" msgstr[1] "%d piste" msgstr[2] "%d de piste" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disc" msgstr[1] "%d discuri" msgstr[2] "%d de discuri" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Toate albumele" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Preferinţe listă albume" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Arată _coperţile albumelor" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[opţiuni]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Afişare albume" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Necunoscut" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Flux nou" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Introduceţi locaţia unui flux audio:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Fluxuri audio" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "Fluxuri a_udio" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Caută" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Descarcă fişierele" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Descarcă fişierul" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Nu s-a putut adăuga fluxul" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> nu a putut fi adăugat. Serverul ar putea fi nefuncţional ori " "locaţia ar putea să nu fie a unui flux audio." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "Reactualizare c_olecţie" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Ştergere fişiere" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Navigator colecţie" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d piesă" msgstr[1] "%d piese" msgstr[2] "%d de piese" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Şablon invalid" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Necunoscut" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Separă în valori _multiple" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Personalizat" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "E_valuare" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Etichetă" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferinţe listă albume" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Mărime totală:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Mărime totală:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Preferinţe navigator încastrat" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Arată _coperţile albumelor" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Toate albumele" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "organizaţie" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Sistem de fişiere" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "Sistem de _fişiere" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Nu s-au putut copia piesele" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Fişierele selectate nu pot fi copiate în alte liste de piese sau în coadă." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Adaugă la colecţie" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Tip nesuportat de fişier" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Listele de staţii pot conţine doar locaţiile staţiilor, nu şi alte liste de " "staţii sau liste de redare. Următoarele locaţii nu pot fi încărcate:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Nu s-a putut adăuga staţia" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Radio Internet" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Descarcă fişierele" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Staţie nouă" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Introduceţi locaţia unei staţii radio Internet:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "evaluare" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "Staţie _nouă" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "Radio _Internet" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Staţie nouă" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "Staţie _nouă" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Staţie nouă" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Nici s-a găsit nici o staţie" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Nu s-a găsit nici o staţie radio Internet la %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Toate staţiile listate sunt deja în colecţie." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "_Adaugă în listă" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "Şte_rge din listă" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d staţie" msgstr[1] "%(count)d staţii" msgstr[2] "%(count)d de staţii" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Proprietăţi dispozitiv" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Dispozitiv:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Nu este montat" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Punct de montare:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Nume:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Dispozitive media" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "Dispozitive _media" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Ejectare" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Proprietăţi" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Redenumeşte" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> folosit, <b>%s</b> disponibil" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nu este conectat." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Copiez <b>%s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Nu s-a putut copia piesa" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Nu există suficient spaţiu disponibil pentru această piesă." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nu a putut fi copiat." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Nu s-au putut şterge piesele" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Şterg <b>%s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> nu a putut fi şters." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Nu s-a putut şterge piesa" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Ejectarea <b>%s</b> a eşuat." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Nu s-a putut ejecta dispozitivul" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Navigator încastrat" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Navigator încastrat" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Selectează t_ot" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Toate" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Preferinţe navigator încastrat" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Liste" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Liste" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Şte_rge din listă" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importă" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Listă nouă" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Nu s-a putut importa lista de redare" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet poate importa liste de redare doar în formatele M3U sau PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Nu s-a putut redenumi lista" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importă lista" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "Listă _nouă" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Listă nouă" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Preferinţe navigator încastrat" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Liste" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Introduceţi un nume pentru noul director:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Se importă lista de redare.\n" "\n" "%d/%d piese adăugate." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Limitează rezultatele" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Căutare în colecţie" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "Caută în c_olecţie" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Navigator încastrat" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Caută" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "locaţie" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet nu este pornit." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "redare audio pentru colecţii de muzică" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[opţiuni]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Afişare piesă redată curent" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Cu pornire imediată a redării" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Salt la piesa următoare" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Salt la piesa precedentă" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Start redare" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pauză redare" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Comutare între start şi pauză redare" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Start redare" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Volum mai mare" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Volum mai mic" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Afişare status curent" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Ascundere fereastră principală" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Afişare fereastră principală" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Comutare a vizibilităţii ferestrei principale" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Focalizare a ferestrei de redare" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "Reactualizare c_olecţie" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Dezactivează navigatorul" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Afişare a listei curente" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Afişare a cozii curente" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Afişare a cozii curente" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet nu este pornit." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Ieşire Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Derulare în piesa redată curent" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Comutare între start şi pauză redare" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Anulare, activare sau comutare a repetării" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Setare volum" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Căutare în colecţia muzicală" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "căutare" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Redare fişier" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "nume" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Evaluare a piesei redate curent" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Setare a navigatorului web utilizat" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Evaluare a piesei redate curent" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Deschidere nou navigator web" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Afişare/ascundere a cozii" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Afişare/ascundere a listei principale de piese" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtrare după o valoare aleatoare" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Etichetă" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtrare dupa o valoare din etichetă" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "etichetă=valoare" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Punere fişier în coadă sau căutare" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "nume" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 #, fuzzy msgid "Unqueue a file or query" msgstr "Punere fişier în coadă sau căutare" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Argument invalid pentru „%s”." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Încercaţi %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Dispozitiv necunoscut" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: „%s” nu este un prefix unic." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "Valoare invalidă" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Model nume _fişier:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copiază coperţile _albumelor" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "Ş_terge directoarele şi coperţile nefolosite" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Arată _erorile" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "descriere" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "un editor de etichete audio" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "director" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "ID pistă MusicBrainz" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID pistă MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Codare invalidă]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Titlu" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor pentru etichete audio" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "Prima literă _majusculă" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Preferinţe navigator încastrat" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Mărime totală:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Editare afişare" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Pondere" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editare afişare" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Previzualizare" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d secundă" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Personalizat" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "Erori module" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Redare audio" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Radio Internet" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "E_valuare" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Nu s-a putut salva piesa" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Nici un modul nu a fost găsit." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Versuri" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Şterge căutarea" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Versuri" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "locaţie" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Ascundere fereastră principală" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Preferinţe" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "şablon" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "şablon" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d piesă" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Informaţii" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "şablon" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "locaţie" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Titlu" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Dispozitiv:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Nume:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "Alt_ele:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Artist" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "Model nume _fişier:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "A_lbum aleator" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "albume" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Pondere" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "A_lbum aleator" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Importă lista" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importă" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Versuri" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Oprit" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d piesă" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "şablon" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Oprit" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "_Liste" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Redare" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_Previzualizare" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Aleator" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Repetare" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Stop după această piesă" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Deschidere nou navigator web" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Editare _etichete" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informaţii" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Liste" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Editare afişare" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Versuri" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Versuri" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Arată _erorile" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Fişiere" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Previzualizare" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Filtrare după _artist" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Personalizat" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Filtrare după _gen" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Filtrare după _artist" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Fluxuri audio" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Introduceţi locaţia unui flux audio:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Importă lista" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importă" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Nici s-a găsit nici o staţie" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "Model nume _fişier:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "Model nume _fişier:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Şte_rge din listă" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Listă nouă" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "ultima redare" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "_Coadă" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Niciodată" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Nici o piesă" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Valori salvate" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Redenumeşte" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Colecţie" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Ascundere fereastră principală" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Nume fişier" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Nu s-a putut salva piesa" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Listă albume" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Mărime" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Caută:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Caută" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Listă albume" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Editare favorite..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editare favorite..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Favorite" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tip album MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nume fişier" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "Di_sc" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Pistă" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Titlu" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "_Artist" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tip album MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "căutare" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Caută" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Nici un modul nu a fost găsit." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Navigatoare" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Nu s-a putut crea directorul" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "comandă|etichetă" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Redenumeşte" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "comandă|etichetă" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Şablon invalid" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Valoare invalidă" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Personalizat" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Nu s-au putut copia piesele" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Dezactivează navigatorul" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "E_valuare" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "E_valuare" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Editare afişare" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "E_valuare" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrare dupa o valoare din etichetă" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer nu a putut încărca piesa selectată." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Filtrare după _gen" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Coadă" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Scrie" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID pistă MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "director" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "Coloane _album" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "Staţie _nouă" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Importă lista" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Redenumeşte" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Importă lista" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Informaţii" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Importă lista" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Nu s-a putut importa lista de redare" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Ejectarea <b>%s</b> a eşuat." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Reactualizare c_olecţie" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Reactualizare c_olecţie" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Editare etichete" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Editare etichete" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Toate albumele" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Previzualizare" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Etichetă" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Nu s-au putut şterge piesele" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Caută" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "şablon" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Editare valori salvate..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Colorează termenii de _căutare" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Colecţie" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Se verifică punctele de montare" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Se verifică colecţia" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Se verifică %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Arată etichetele _programatice" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "descriere" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Valoare" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor pentru etichete audio" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Nici o piesă nu este selectată." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Filtrare dupa o valoare din etichetă" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Filtrare dupa o valoare din etichetă" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Durată necunoscută" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Nu s-a putut redenumi fişierul" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Fişier" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Arată pe scurt informaţiile de utilizare" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> nu este o locaţie validă." #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "Necunoscut" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "În ordine" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "În _ordine" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Aleator" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Aleator" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Repetare" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "O singură piesă" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d secundă" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nici s-a găsit nici o staţie" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "Nu s-a putut crea directorul" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Module" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Formate suportate: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Dispozitiv audio: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Început" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Timp" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Nume favorit" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Favorite" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtre" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "Nu a fost _niciodată redat" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Primele 40" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Staţie nouă" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "_Gen aleator" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "A_rtist aleator" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "A_lbum aleator" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "Cele mai des redate 40 de piese (mai mult de 40 în anumite cazuri)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Valoare:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Valori salvate" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Editare valori salvate..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "Coloane _pistă" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "Coloane _album" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ajustare de volum _replay gain" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Necunoscut" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Filtrare dupa o valoare din etichetă" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Fişiere" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Ştergere fişiere" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Mută la Gunoi" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Mut %d/%d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "Nu s-a putut salva baza de date iPod" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Ejectarea <b>%s</b> a eşuat." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Se şterge %d/%d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Nu s-a putut şterge fişierul" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Ştergerea <b>%s</b> a eşuat." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Transferuri" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Mărime" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "lipseşte din %d piesă" msgstr[1] "lipseşte din %d piese" msgstr[2] "lipseşte din %d de piese" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "diferit în %d piesă" msgstr[1] "diferit în %d piese" msgstr[2] "diferit în %d de piese" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Separă în valori _multiple" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Separă discul de _album" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Separă _versiunea de titlu" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Separă aranjorul de ar_tist" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Separă _interpretul de artist" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Separă _interpretul de artist" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Separă _versiunea de titlu" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Adaugă o etichetă" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Etichetă:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Editare etichete" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Arată etichetele _programatice" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Niciodată" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Nu s-a putut adăuga eticheta" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Nu s-a putut adăuga piesa" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Nu s-a putut adăuga <b>%s</b>\n" "\n" "Fişierul selectat nu suportă valori multiple." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Etichetă invalidă" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Etichetă invalidă <b>%s</b>\n" "\n" "Fişierle selectate curent nu suportă editarea acestei etichete." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Valoare invalidă" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Valoare invalidă: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Eticheta ar putea fi imprecisă" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> a fost modificat în timp ce aplicaţia era pornită. Salvarea sa " "fără reactualizarea colecţiei ar putea suprascrie alte modificări ale " "piesei.\n" "\n" "Salvaţi totuşi această piesă?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Nu s-a putut salva piesa" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Salvarea <b>%s</b> a eşuat. Fişierul ar putea fi protejat la scriere, corupt " "sau cu drepturi prea stricte pentru a-l putea edita." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Mai multe opţiuni..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Module" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s şi %(count)d în plus" msgstr[1] "%(title)s şi %(count)d în plus" msgstr[2] "%(title)s şi %(count)d în plus" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Preferinţe Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Separare _la:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Editare etichete" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Directoare" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Director nou" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Selectează toate subdirectoarele" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Director nou" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Introduceţi un nume pentru noul director:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Nu s-a putut crea directorul" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Nu s-a putut şterge directorul" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Piese" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "de către %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Discul %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Pista %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Editare afişare" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Nici o piesă nu este selectată." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Nici o piesă" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informaţii" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Versuri" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Produs de către %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artist" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artişti" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "interpreţi" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Niciodată" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "O dată" msgstr[1] "De %(n)d ori" msgstr[2] "De %(n)d de ori" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "adăugat" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "ultima redare" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "redări" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "întreruperi" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "evaluare" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "durată" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Informaţii" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[Codare invalidă]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "rată de biţi" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "mărime fişier" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "modificat" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d selectată" msgstr[1] "%d selectate" msgstr[2] "%d selectate" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Pistă nedisponibilă" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Listă piste" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d piesă fără album" msgstr[1] "%d piese fără album" msgstr[2] "%d de piese fără album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Discografie selectată" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d piesă fără artist" msgstr[1] "%d piese fără artist" msgstr[2] "%d de piese fără artist" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albume" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Durată totală:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Mărime totală:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Fişiere" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Caută" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Editare afişare..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Versurile pentru această piesă nu au putut fi găsite." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Se caută versurile..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Anulaţi modificarea etichetelor?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Etichetele au fost modificate, dar nu au fost salvate. Salvaţi aceste " "fişiere sau reveniţi la valorile iniţiale şi anulaţi modificările?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Niciodată" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Fişierul există" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Redenumire fişiere" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Comutare între start şi pauză redare" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Comutare între start şi pauză redare" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Erori module" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "Dezactivează navigatorul" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Ordine:" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Editare etichete" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Mărime totală:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Nici un modul nu a fost găsit." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Module" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Arată _erorile" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "Di_sc" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Pistă" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "grupare" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Nume _fişier" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "D_urată" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Sări automat la piesa redată" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Când se schimbă piesa redată, derulează la aceasta în listă" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "Alt_ele:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Editare afişare..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Coloane vizibile" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Titlul include ver_siunea" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Titlul include ver_siunea" #: ../quodlibet/qltk/prefs.py:108 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Albumul include pa_rtea" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Numele de fişier include dire_ctorul" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Preferinţe" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Listă piese" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Coloane vizibile" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "Filtru _global:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Caută" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Navigatoare" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "Când se schimbă piesa redată, derulează la aceasta în listă" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "E_valuare" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Listă albume" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Pauză redare" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "Ajustare de volum _replay gain" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "Ajustare de volum _replay gain" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "E_valuare" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "Salvează evaluarile şi numărul de redări" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Adresă de mail:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "Evaluările şi numărul de redări vor fi setate pentru această adresă de mail" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Anulaţi modificarea etichetelor?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Editare etichete" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "Staţie _nouă" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "Reactualizare c_olecţie" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "Caută în c_olecţie" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Caută noutăţi în colecţie" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Reîn_cărcare colecţie" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Reîncarcă toate piesele din colecţie (poate dura foarte mult)" # ??? #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "_Directoare indexate" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Nici o piesă" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, fuzzy, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s şi %(count)d în plus" msgstr[1] "%(title)s şi %(count)d în plus" msgstr[2] "%(title)s şi %(count)d în plus" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Proprietăţi" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Coadă" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "Erori module" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d piesă (%(time)s)" msgstr[1] "%(count)d piese (%(time)s)" msgstr[2] "%(count)d de piese (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Navigare în colecţie" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Comutare a vizibilităţii ferestrei principale" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Pauză redare" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Selectare directoare" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Nu s-au putut adăuga piesele" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> foloseşte un protocol nesuportat." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Sări la piesa redată" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Fişier" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Piese" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Vizualizare" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Navigatoare" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Ajutor" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "Adăugare _director..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "Adăugare _fişier..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Adăugare locaţie" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editare favorite..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Stop după această piesă" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Caută" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Adăugare locaţie" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Introduceţi locaţia unui fişier audio:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Nu s-a putut adăuga locaţia" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nu este o locaţie validă." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Adăugare muzică" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "Adăugare _director..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Redare audio" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Adăugare _fişier..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "E_valuare" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "E_valuare" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Înlocuieşte spaţiile cu liniuţe de _subliniere" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Şterge caracterele incompatibile cu sistemele _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Şterge semnele _diacritice" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Şterge caracterele non-_ASCII" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Redenumire fişiere" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "şablon" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Editare valori salvate..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Previzualizare" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nume nou" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Nu s-a putut redenumi fişierul" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Redenumirea fişierului <b>%s</b> în <b>%s</b> a eşuat. S-ar putea ca " "fişierul ţintă să existe deja sau poate nu aveţi drepturile necesare pentru " "a crea noul fişier sau a-l şterge pe cel vechi." #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "Arată _erorile" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Continuă" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Calea nu este una absolută" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Şablonul\n" "\t<b>%s</b>\n" "conţine / dar nu porneşte din rădăcină. Pentru a evita directoarele greşit " "numite, aveţi grijă ca şablonul să înceapă cu / sau ~/." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Piesele din aceste directoare (separate de „:”) vor fi adăugate la colecţie" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Selectare directoare" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Valori salvate" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Editare valori salvate..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "Stop după această piesă" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limită:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Pondere" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Arată timpul rămas" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Versuri" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Focalizare a ferestrei de redare" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Derulare în piesa redată curent" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Nu s-au putut şterge piesele" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Nu s-au putut şterge piesele" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtrare după %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "Coloane _album" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Coloane _pistă" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Coloane _album" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Coloane _persoane" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Coloane _dată" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Coloane _fişier" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Coloane _producţie" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Personalizează coloanele..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Colorează termenii de _căutare" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Adaugă în _coadă" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Copiază către dispozitiv" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "Şte_rge din listă" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Înlocuieşte liniuţele de _subliniere cu spaţii" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Prima literă _majusculă" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Separă în valori m_ultiple" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Etichetare din cale" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Etichetele le înlocuiesc pe cele actuale" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Etichetele sunt adăugate la cele actuale" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Şablonul\n" "\t<b>%s</b>\n" "este invalid. S-ar putea să conţină aceeaşi etichetă de două ori sau " "paranteze potrivite greşit (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Etichete invalide" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Etichete invalide <b>%s</b>\n" "\n" "Fişierele selectate nu suportă editarea acestor etichete." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Şablonul introdus a fost invalid. Asiguraţi-vă că aţi introdus < şi > " "ca \\< şi \\> şi că parantezele sunt potrivite corect.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Editare afişare" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Număr piste" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Start _de la:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Total piste:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Redare" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_Previzualizare" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "şi alte %d..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Se salvează piesele modificate." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Mut %d/%d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Se verifică punctele de montare" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "locaţie" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "O listă cu numele „%s” există deja." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Arată _coperţile albumelor" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Sistem de fişiere" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Arată pe scurt informaţiile de utilizare" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Arată versiunea şi drepturile de autor" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[opţiuni]" #: ../quodlibet/util/__init__.py:182 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: Opţiunea „%s” nu a fost recunoscută." #: ../quodlibet/util/__init__.py:185 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: Opţiunea „%s” necesită un argument." #: ../quodlibet/util/__init__.py:188 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: „%s” nu este un prefix unic." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d secundă" msgstr[1] "%d secunde" msgstr[2] "%d de secunde" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Durată necunoscută" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d secundă" msgstr[1] "%d secunde" msgstr[2] "%d de secunde" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minut" msgstr[1] "%d minute" msgstr[2] "%d de minute" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d oră" msgstr[1] "%d ore" msgstr[2] "%d de ore" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d zi" msgstr[1] "%d zile" msgstr[2] "%d de zile" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d an" msgstr[1] "%d ani" msgstr[2] "%d de ani" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "fără_capitalizare" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Data trebuie introdusă în formatul „YYYY”, „YYYY-MM-DD” sau „YYYY-MM-DD HH:" "MM:SS”." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Normalizarea Replay Gain trebuie introdusă în format „x.yy dB”." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Vârfurile Replay Gain trebuie introduse în format „x.yy”." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "ID-urile MusicBrainz trebuie să fie în formatul UUID." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Statusul de lansare MusicBrainz trebuie să fie „official” (oficial), " "„promotional” (promoţional) sau „bootleg” (ilegal)." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Nu s-a putut edita piesa" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Salvarea <b>%s</b> a eşuat. Fişierul ar putea fi protejat la scriere, corupt " "sau cu drepturi prea stricte pentru a-l putea edita." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Codare invalidă]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "aranjor" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "aranjori" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "aranjor" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "autori" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "compozitor" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "compozitori" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "compozitor" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "dirijor" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "dirijori" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "dirijor" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "contact" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "drepturi de autor" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "dată" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "descriere" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "gen" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "gen" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "interpret" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "grupare" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "limbaj" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licenţă" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "locaţie" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "textier" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "textieri" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "textier" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organizaţie" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "titlu" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versiune" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "adresă internet" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "artist album" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disc" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "pistă" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "ID etichetă" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "dată iniţială de lansare" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "album iniţial" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "artist iniţial" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "dată de înregistrare" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "ţara de lansare" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID pistă MusicBrainz" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID pistă MusicBrainz" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "ID pistă MusicBrainz" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID artist MusicBrainz" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID pistă MusicBrainz" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "ID TRM MusicBrainz" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "ID PUID MusicBrainz" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "Status album MusicBrainz" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Tip album MusicBrainz" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "ID pistă MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "corecţie pistă" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "vârf pistă" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "corecţie album" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "vârf album" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Preferinţe" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "discuri" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "piste" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "ultima lansare" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "nume complet" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "punct de montare" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "persoane" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "an" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "dată iniţială de lansare" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "Favorite" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "format" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Liste" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Navigatoare" #~ msgid "Unable to download lyrics." #~ msgstr "Nu s-au putut descărca versurile." #~ msgid "Remove all songs from the queue" #~ msgstr "Şterge toate piesele din coadă" #~ msgid "Watch this folder for new songs" #~ msgstr "Monitorizează acest director pentru piese noi" #~ msgid "Set or toggle the playback order" #~ msgstr "Setare ori comutare a ordinii de redare" #~ msgid "Uninitialized iPod" #~ msgstr "iPod neiniţializat" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Doriţi să creaţi o bază de date goală pe acest iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Volume Gain (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Combină etichetele cu valori m_ultiple" #~ msgid "Model:" #~ msgstr "Model:" #~ msgid "Capacity:" #~ msgstr "Capacitate:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #, fuzzy #~ msgid "Removing orphaned iPod track" #~ msgstr "W: sterg pista orfană din iPod" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Nu s-a putut salva baza de date iPod" #~ msgid "Unable to save iPod database" #~ msgstr "Nu s-a putut salva baza de date iPod" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "vârf pistă" #~ msgid "Shuffle" #~ msgstr "Aleator" #~ msgid "Weighted" #~ msgstr "Ponderat" #~ msgid "_Weighted" #~ msgstr "_Ponderat" #~ msgid "_One Song" #~ msgstr "O _singură piesă" #~ msgid "Restart the playlist when finished" #~ msgstr "Repetă lista" #~ msgid "Disable Browser" #~ msgstr "Dezactivează navigatorul" #~ msgid "_Disable Browser" #~ msgstr "_Dezactivează navigatorul" #, fuzzy #~ msgid "Force Write" #~ msgstr "Scrie" #~ msgid "Filter on _Genre" #~ msgstr "Filtrare după _gen" #~ msgid "Filter on _Artist" #~ msgstr "Filtrare după _artist" #~ msgid "Filter on Al_bum" #~ msgstr "Filtrare după al_bum" #~ msgid "_Music" #~ msgstr "_Muzică" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Favorite" #~ msgid "Song _List" #~ msgstr "Listă _piese" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Stop după această piesă" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "şi alte %d..." #~ msgstr[1] "şi alte %d..." #~ msgstr[2] "şi alte %d..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Separă discul de _album" #, fuzzy #~ msgid "Timeout" #~ msgstr "Timp" #, fuzzy #~ msgid "Select an album" #~ msgstr "Selectează t_ot" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s şi %(count)d în plus" #~ msgstr[1] "%(title)s şi %(count)d în plus" #~ msgstr[2] "%(title)s şi %(count)d în plus" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Liste" #~ msgid "Re_fresh Library" #~ msgstr "Reactualizare c_olecţie" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "E_valuare" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Nu s-au putut deschide fişierele" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Valoare invalidă" #~ msgid "command|filename" #~ msgstr "comandă|nume" #~ msgid "command|tag" #~ msgstr "comandă|etichetă" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Caută" #~ msgid "%d of %d" #~ msgstr "%d din %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Utilizare: %s %s" #~ msgid "_Download..." #~ msgstr "_Descarcă..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "Staţie _nouă" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Suprascriu <b>%s</b>?" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet este deja pornit." #~ msgid "No song is currently playing." #~ msgstr "Nici o piesă nu este redată curent." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Nu se poate scrie %s. Va fi eliminat din listă." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Editare favorite..." #~ msgid "_New Folder..." #~ msgstr "Director _nou..." #~ msgid "_Add to Playlist" #~ msgstr "_Adaugă în listă" #~ msgid "_Edit Display..." #~ msgstr "_Editare afişare..." #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d staţie" #~ msgid "_Add a Location..." #~ msgstr "Adăugare _locaţie..." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Personalizează coloanele..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "Coloane _pistă" #, fuzzy #~ msgid "People Headers" #~ msgstr "Coloane _persoane" #, fuzzy #~ msgid "Album Headers" #~ msgstr "Coloane _album" #, fuzzy #~ msgid "Date Headers" #~ msgstr "Coloane _dată" #, fuzzy #~ msgid "File Headers" #~ msgstr "Coloane _fişier" #, fuzzy #~ msgid "Production Headers" #~ msgstr "Coloane _producţie" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Etichetă:" #, fuzzy #~ msgid "Warnings" #~ msgstr "E_valuare" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "artist album" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "artişti" #, fuzzy #~ msgid "album (sort)" #~ msgstr "artist album" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "interpreţi" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "interpreţi" #~ msgid "MusicBrainz album artist ID" #~ msgstr "ID artist album MusicBrainz" #, fuzzy #~ msgid "errors" #~ msgstr "interpreţi" #~ msgid "Permanently delete this file?" #~ msgstr "Ştergeţi permanent acest fişier?" #~ msgid "Permanently delete these files?" #~ msgstr "Ştergeţi permanent aceste fişiere?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s şi alte %(count)d în plus..." #~ msgstr[1] "%(title)s şi alte %(count)d în plus..." #~ msgstr[2] "%(title)s şi alte %(count)d în plus..." #, fuzzy #~ msgid "Version:" #~ msgstr "versiune" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "Erori module" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s nu a putut fi adăugat la colecţie.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Nu s-a găsit comanda eject." #~ msgid "Unable to start web browser" #~ msgstr "Nu s-a putut porni navigatorul web" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Nu s-a găsit un navigator web. Setaţi variabila $BROWSER, sau asiguraţi-" #~ "vă că /usr/bin/sensible-browser există." #, fuzzy #~ msgid "Library Error" #~ msgstr "Navigator colecţie" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Copiază către dispozitiv" #~ msgid "translator-credits" #~ msgstr "" #~ "Mugurel Tudor <mugurelu@gnome.ro>\n" #~ "Mişu Moldovan <dumol@gnome.ro>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Alte coloane pentru afişare, separate prin spaţii" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "_Continuă" #~ msgid "Search your library" #~ msgstr "Căutare în colecţie" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Drepturi de autor © 2004-2006 Joe Wreschnig, Michael Urman şi alţii\n" #~ "\n" #~ "Acesta este free software, vedeţi sursele pentru condiţiile de copiere. " #~ "Nu\n" #~ "se oferă NICI o garanţie, nici măcar pentru o POSIBILĂ COMERCIALIZARE sau " #~ "de\n" #~ "FOLOSIRE PENTRU UN SCOP ANUME.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Mărime totală:" #~ msgid "Quod Libet Plugins" #~ msgstr "Module Quod Libet" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Colorează căutările simple cu albastru, cele avansate cu verde şi cele " #~ "invalide cu roşu" #~ msgid "_Select" #~ msgstr "_Selectează" #~ msgid "Separators for splitting tags" #~ msgstr "Caractere pentru separarea etichetelor" #~ msgid "Quod Libet Preferences" #~ msgstr "Preferinţe Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Nu a fost redat _astăzi" #~ msgid "Not Played in a _Week" #~ msgstr "Nu a fost redat de o _săptămână" #~ msgid "Not Played in a _Month" #~ msgstr "Nu a fost redat de o _lună" #~ msgid "B_ottom 40" #~ msgstr "_Ultimele 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "Cele mai rar redate 40 de piese (mai mult de 40 în anumite cazuri)" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #, fuzzy #~ msgid "Date" #~ msgstr "_Dată" #~ msgid "Choose New Stations" #~ msgstr "Adăugare staţii noi" #~ msgid "Add" #~ msgstr "Adaugă" #, fuzzy #~ msgid "Bitrate" #~ msgstr "rată de biţi" #~ msgid "_Stations..." #~ msgstr "_Staţii..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Ieşire Quod Libet" #~ msgid "Unable to save library" #~ msgstr "Nu s-a putut salva colecţia" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Nu s-a putut reda piesa" #~ msgid "Sort by title" #~ msgstr "Sortează după titlu" #~ msgid "Sort by artist" #~ msgstr "Sortează după artist" #~ msgid "Lyrics provided by %s." #~ msgstr "Versuri furnizate de către %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Nu s-au găsit versuri salvate.\n" #~ "\n" #~ "Puteţi apăsa pe butonul „Caută” pentru a căuta versuri pe internet. Le " #~ "puteţi de asemenea introduce dumneavoastră, nu uitaţi să apăsaţi apoi " #~ "„Salvează”." #~ msgid "part" #~ msgstr "parte" #~ msgid "Opening audio device." #~ msgstr "Se deschide dispozitivul audio." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d piese salvate" #~ msgid "MusicBrainz album ID" #~ msgstr "ID album MusicBrainz" #~ msgid "Loaded song library." #~ msgstr "S-a încărcat colecţia de piese." #~ msgid "Unable to open audio device" #~ msgstr "Nu s-a putut deschide dispozitivul audio" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "S-a încercat accesarea driver-elor „autosink” şi „%(sink)s” dar acestea " #~ "nu au putut fi deschise. Setaţi un pipelinel GStreamer schimbând linia\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "în ~/.quodlibet/config ." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Nu s-a găsit elementul GStreamer „filesrc”. Verificaţi instalarea " #~ "GStreamer." �������quodlibet-3.9.1/po/nb.po����������������������������������������������������������������������������0000644�0001750�0001750�00000600376�13115512743�015335� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Norwegian translation of Quod Libet # Copyright (C) 2004-2017 Joe Wreschnig and other Quod Libet authors # This file is distributed under the same license as the Quod Libet package. # # Eirik Haatveit <haatveit@gmail.com>, 2007. # Åka Sikrom <a4 ætt hush dått com>, 2016-2017. # msgid "" msgstr "" "Project-Id-Version: nb\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2017-04-08 04:08+0200\n" "Last-Translator: Åka Sikrom <a4 ætt hush dått com>\n" "Language-Team: Norwegian Bokmål\n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Poedit 1.8.7.1\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Rediger tagger i lydfiler" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" "Ex Falso er en taggbehandler med samme tagg-grensesnitt som Quod Libet. Det " "lar deg se og redigere alle tagger i alle støttede filformater." #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" "Programmet støtter formatene Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC og MIDI." #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Lydtagg-behandler" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Lytt til, bla gjennom eller rediger lydsamling" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" "Quod Libet er et program for håndtering av musikk. Det tilbyr ulike måter å " "vise et lydbibliotek på, og støtter avspilling av internettradio og andre " "lydstrømmer. Det er også et godt verktøy for redigering av metadata-tagger " "og søking." #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Musikkspiller" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "_Tittel" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artist" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Dato" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "Sjan_ger" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Vurdering" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 msgid "Sort _by…" msgstr "Sorter _etter …" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Innstillinger" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Albumliste" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Albumliste" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Alle album" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d album" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Last inn album_omslag på nytt" msgstr[1] "Last inn album_omslag på nytt" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Låter uten album" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d spor" msgstr[1] "%d spor" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d plate" msgstr[1] "%d plater" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 msgid "An Example Album" msgstr "Et eksempelalbum" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Innstillinger for albumliste" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Vis album_omslag" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "_Søk inkluderer personer" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 msgid "Options" msgstr "Valg" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Albumvisning" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "_Lukk" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Ukjent" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Ny kilde" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Skriv inn adressen til en lydkilde: " #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "L_egg til" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Lydkilder" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Lydkilder" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 msgid "_Download…" msgstr "Last ne_d …" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Last ned filer" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "La_gre" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Last ned fil" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "_Ny" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Klarte ikke å legge til kilde" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "Klarte ikke å legge til %s. Tjeneren kan være utilgjengelig, eller " "plasseringa er ikke en lydkilde." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 msgid "_Refresh" msgstr "Oppdate_r" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 msgid "_Delete" msgstr "Sle_tt" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Gjeldende lyd-bakstykke støtter ikke nettadresser. Lydstrøm-utforsker slått " "av." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Bibliotekutforsker" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d låt" msgstr[1] "%d låter" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Ugyldig mønster" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Albumsamling" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "Album_samling" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "Ukjent %s" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "Flere %s verdier" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Selvvalgt" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 msgid "_Remove" msgstr "_Fjern" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tagg" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Slå sammen" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Innstillinger for albumsamling" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "_Bruk" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "Avbr_yt" #: ../quodlibet/browsers/covergrid/main.py:125 msgid "Cover Grid" msgstr "Omslagsnett" #: ../quodlibet/browsers/covergrid/main.py:126 msgid "_Cover Grid" msgstr "_Omslagsnett" #: ../quodlibet/browsers/covergrid/prefs.py:54 msgid "Cover Grid Preferences" msgstr "Omslagsnett-innstillinger" #: ../quodlibet/browsers/covergrid/prefs.py:64 msgid "Show album _text" msgstr "Vis album_tekst" #: ../quodlibet/browsers/covergrid/prefs.py:71 msgid "Show \"All Albums\" Item" msgstr "Vis elementet «alle album»" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "Vertikal opp\tdeling" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 msgid "Cover Magnification" msgstr "Omslagsforstørrelse" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Filsystem" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Filsystem" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Klarte ikke å legge til låter" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "Klarte ikke å kopiere eller legge valgte filer i kø." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Legg til i bibliotek" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Gjeldende filtype støttes ikke" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Stasjonslister skal bare inneholde adresser til stasjoner, og ikke andre " "stasjons- eller spillelister. Klarte ikke å laste inn følgende " "plasseringer: \n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Klarte ikke å legge til stasjon" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Nettradio" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Laster ned stasjonsliste" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Ny stasjon" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Skriv inn adressen til en nettradio-stasjon:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Elektronisk" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "Hip-Hop / Rap" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Gamleviser" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japansk" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "Indisk" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Religiøst" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Lister" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Tyrkisk" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Reggae / Dancehall" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "Latin" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "Studentradio" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Prat / Nyheter" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambient" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Jazz" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Klassisk" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternativt" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metal" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Country" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Nyheter" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Schlager" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Funk" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Blues" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Punk" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Reggaeton" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Slavisk" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Gresk" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gotisk" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rock" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "Vil du laste inn en liste over populære radiokanaler?" #: ../quodlibet/browsers/iradio.py:455 msgid "_Load Stations" msgstr "Last inn stasjoner" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Nettradio" #: ../quodlibet/browsers/iradio.py:538 msgid "_New Station…" msgstr "_Ny stasjon …" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "_Oppdater stasjoner" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Alle stasjoner" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Favoritter" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Ingen kategori" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Fant ingen stasjoner" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Fant ingen nettradio-stasjoner på %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Alle oppførte stasjoner ligger i biblioteket allerede." #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "Legg til i favoritter" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Fjern fra favoritter" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d stasjon" msgstr[1] "%(count)d stasjoner" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Egenskaper for enhet" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Enhet:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Ikke montert" #: ../quodlibet/browsers/media.py:55 msgid "Mount point:" msgstr "Monteringspunkt:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Navn:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Medieenheter" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Medieenheter" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Løs ut" #: ../quodlibet/browsers/media.py:360 msgid "_Properties" msgstr "_Egenskaper" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Gi nytt navn" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%(used-size)s brukt, %(free-size)s tilgjengelig" #: ../quodlibet/browsers/media.py:479 #, python-format msgid "%s is not connected." msgstr "%s er ikke tilkoblet." #: ../quodlibet/browsers/media.py:499 #, python-format msgid "Copying %(song)s" msgstr "Kopierer %(song)s" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Klarte ikke å kopiere låt" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Det er ikke nok ledig lagringsplass til denne låta." #: ../quodlibet/browsers/media.py:526 #, python-format msgid "%s could not be copied." msgstr "Klarte ikke å kopiere %s." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Klarte ikke å slette låter" #: ../quodlibet/browsers/media.py:557 #, python-format msgid "Deleting %(song)s" msgstr "Sletter %(song)s" #: ../quodlibet/browsers/media.py:575 #, python-format msgid "%s could not be deleted." msgstr "Klarte ikke å slette %s." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Klarte ikke å slette låt" #: ../quodlibet/browsers/media.py:594 #, python-format msgid "Ejecting %s failed." msgstr "Klarte ikke å løse ut %s." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Klarte ikke å løse ut enhet" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "Bakstykke for enhet mangler. Medieenhet-utforsker slått av." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Rutevisning" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Rutevisning" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Velg alle" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Alle" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" "Taggmønster med valgfri markering som f.eks. <tt>komponist</tt> eller\n" "<tt>%s</tt>" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "_Bred modus" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Innstillinger for rutevisning" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "Lik rutebredde" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Spillelister" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Spillelister" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Fjern fra spilleliste" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importer" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Ny spilleliste" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Klarte ikke å importere spilleliste" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet kan bare importere spillelister i formatene M3U og PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Klarte ikke å gi nytt navn til spilleliste" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importer spilleliste" #: ../quodlibet/browsers/playlists/menu.py:25 msgid "_New Playlist…" msgstr "_Ny spilleliste …" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Hva vil du gjøre med %d låt?" msgstr[1] "Hva vil du gjøre med disse %d låtene?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Bekreft handling for spilleliste «%s»" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "tom" #: ../quodlibet/browsers/playlists/prefs.py:39 msgid "Example Playlist" msgstr "Eksempelliste" #: ../quodlibet/browsers/playlists/prefs.py:47 msgid "Playlist Browser Preferences" msgstr "Innstillinger for spilleliste-utforsker" #: ../quodlibet/browsers/playlists/prefs.py:52 msgid "Playlist display" msgstr "Spillelistevisning" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Er du sikker på at du vil slette spillelista «%s»?" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "All informasjon om valgt spilleliste blir slettet, og kan ikke gjenopprettes." #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Skriv inn navn på ny spilleliste:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importerer spilleliste.\n" "\n" "%(current)d/%(total)d låter lagt til." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Begrens resultater" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Søk i bibliotek" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Søk i bibliotek" #: ../quodlibet/browsers/soundcloud/main.py:38 msgid "Soundcloud Browser" msgstr "Soundcloud-utforsker" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "Sound_cloud" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Søk" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "Gå til %s" #: ../quodlibet/browsers/soundcloud/main.py:380 msgid "Connected" msgstr "Tilkoblet" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "Quod Libet er nå tilkoblet. <b>%s</b>!" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "Logg ut av %s" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "Skriv inn kode …" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "Logg inn på %s" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "Soundcloud-autorisering" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "Skriv inn Soundcloud-autoriseringskode:" #: ../quodlibet/cli.py:50 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet kjører ikke (bruk valget «--run» for å kjøre)" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "musikkbibliotek og -spiller" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[valg]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Skriv ut spillende låt og avslutt" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Begynn avspilling med en gang" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "Ikke vis noen vinduer ved oppstart" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Hopp til neste låt" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "Hopp til forrige låt eller start på nytt hvis nettopp begynt" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Hopp til forrige låt" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Start avspilling" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pause avspilling" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Skift mellom avspilling/pause-modus" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Stopp avspilling" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Øk volum" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Demp volum" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Skriv ut spillerstatus" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Skjul hovedvindu" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Vis hovedvindu" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Vis/skjul hovedvindu" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Fokuser på kjørende spiller" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Fjern gjeldende visningsfiltre" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Oppdater bibliotek og skann på nytt" #: ../quodlibet/cli.py:110 msgid "List available browsers" msgstr "Vis tilgjengelige utforskere" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Skriv ut gjeldende spilleliste" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Skriv ut innhold i kø" #: ../quodlibet/cli.py:113 msgid "Print the active text query" msgstr "Skriv ut gjeldende tekstspørring" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Start uten tillegg" #: ../quodlibet/cli.py:115 msgid "Start Quod Libet if it isn't running" msgstr "Start Quod Libet hvis det ikke kjører" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Avslutt Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Søk i låta som spilles av" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 msgid "Set or toggle shuffle mode" msgstr "Slå av/på tilfeldig rekkefølge" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Bytt eller slå gjentakelsesmodus av/på" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Juster volum" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Søk i musikkbibliotek" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "spørring" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Spill av en fil" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 msgctxt "command" msgid "filename" msgstr "filnavn" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Vurder låt som spilles av" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Velg visningsmodus for gjeldende vindu" #: ../quodlibet/cli.py:129 msgid "Stop after the playing song" msgstr "Stopp etter spillende låt" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Åpne nytt visningsvindu" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Vis eller skjul kø" #: ../quodlibet/cli.py:133 msgid "Show or hide the main song list (deprecated)" msgstr "Vis eller skjul hovedlåtliste (utgått)" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtrer på tilfeldig verdi" #: ../quodlibet/cli.py:134 msgctxt "command" msgid "tag" msgstr "tagg" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtrer på taggverdi" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tagg=verdi" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Legg fil eller spørring i kø" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Legg komma-adskilte filnavn i kø" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "filnavn" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Skriv ut filnavn fra søketreff til standardutdata" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Fjern fil eller spørring fra kø" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Ugyldig argument for «%s»." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Prøv %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Ukjent enhet" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "Klarte ikke å importere %s. Dette er påkrevet for enhetsstøtte." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "Enheten %r støttes ikke." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "Fant ikke «%s»." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Laster inn enhet-bakstykke." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Prøver «%s»" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Klarte ikke å koble til enhet-bakstykke." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Enhet-bakstykke lastet inn." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Filnavnmønster:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopier _albumomslag" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Fjern ubrukte omslag og mapper" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "Det oppstod en feil" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" "Du kan se bort fra denne feilmeldinga, men programmet kan oppføre seg " "ustabilt frem til du starter det på nytt. Hjelp oss gjerne med å rette " "feilen ved å sende inn en feilrapport." #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "Send feilrapport" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "Send feilrapport" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "Avslutt program" #: ../quodlibet/errorreport/ui.py:76 msgid "Ignore Error" msgstr "Ignorer feil" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "Feildetaljer:" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" "Detaljer om programfeilen og systemet ditt blir sendt til en " "tredjepartstjeneste på nett (<a href='https://www.sentry.io'>www.sentry.io</" "a>). Du kan se gjennom dataene nedenfor før du evt. velger å sende dem." #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "(valgfritt) Kort beskrivelse av hva du gjorde da feilen oppstod:" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "_Send" #: ../quodlibet/errorreport/ui.py:115 msgid "Short description…" msgstr "Kort beskrivelse …" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "Data som blir sendt:" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "lydtagg-behandler" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "mappe" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "Nettadresse til omslagsbilde" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" "Laster ned omslagsbilder fra adressen i taggen «artwork_url». Dette fungerer " "med Soundcloud-utforskeren." #: ../quodlibet/ext/covers/discogs.py:25 msgid "Discogs Cover Source" msgstr "Discogs-omslagskilde" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "Last ned omslagsbilder fra Discogs." #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "Last.fm-omslagskilde" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Laster ned omslagsbilder fra Last.fm-arkivet." #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "MusicBrainz Cover Source" msgstr "MusicBrainz-omslagskilde" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Laster ned omslagsbilder fra MusicBrainz-arkivet." #: ../quodlibet/ext/editing/iconv.py:26 msgid "Convert Encodings" msgstr "Konverter kodinger" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "Retter opp feiltolkede kodinger av taggverdier i taggbehandleren." #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "_Konverter koding …" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "Enkel Kana/Kanji-omformer" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "Konverterer kana/kanji til romaji før navnebytte." #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "Romaniser _japansk tekst" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "Fant ikke «Kanji Kana Simple Inverter» (kakasi)." #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "Bruk reg.uttrykk" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Tillater arbitrær bruk av regulære uttrykk («s///») ved tagging eller " "endring av filnavn." #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title Case" msgstr "Tittelversaler" #: ../quodlibet/ext/editing/titlecase.py:21 msgid "Title-cases tag values in the tag editor." msgstr "Tittelversaliser tagger i taggbehandler." #: ../quodlibet/ext/editing/titlecase.py:40 msgid "Title-_case Value" msgstr "Tittelversaliser verdi" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "Tillat tagger med _BARE STORE BOKSTAVER" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "_Tittelversalisering" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Bruker vanlig engelsk modell for tittelversalisering, som f.eks. «Dark Night " "of the Soul»" #: ../quodlibet/ext/events/advanced_preferences.py:69 msgid "Advanced Preferences" msgstr "Avanserte innstillinger" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "Tillat endring av avanserte oppsettsvalg." #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "Jeg vet hva jeg gjør" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "Animert skjermvisning" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "Viser info om låt ved låtbytte." #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "Toppen av skjermen" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "Midt på skjermen" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "Bunnen av skjermen" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "_Posisjon:" #: ../quodlibet/ext/events/animosd/prefs.py:171 msgid "_Cover size:" msgstr "_Omslagsstørrelse:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 msgid "Display" msgstr "Visning" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "Skri_ft:" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "Venstre" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "Sentrum" #: ../quodlibet/ext/events/animosd/prefs.py:197 msgid "Right" msgstr "Høyre" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "_Juster tekst:" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "Tekst" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "_Tekst:" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "_Fyll:" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "Farger" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "_Skygger" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "K_ontur" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "Avru_ndede hjørner" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "_Forsinkelse:" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "Effekter" #: ../quodlibet/ext/events/animosd/prefs.py:270 msgid "Ed_it Display Pattern…" msgstr "Rediger visningsmønster …" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 msgid "Preview" msgstr "Forhåndsvis" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "Automatisk bibliotek-oppdatering" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "Holder biblioteket oppdatert ved hjelp av inotify. Krever %s." #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "Automatisk maskering" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" "Viser og skjuler lagringsenheter automatisk når de monteres og avmonteres." #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "Automatisk vurdering" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" "Gir låter automatisk vurdering basert på om du spiller gjennom eller hopper " "over dem. Denne funksjonen bruker vux-algoritmen «accelerated» av Brian " "Nelson." #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "Vekkerklokke" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "Vekkefunksjon med høy musikk." #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "Nattasang" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "Toner ut og setter musikk på pause." #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "Flat" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "Levende" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "Full bass og diskant" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "Klubb" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "Stor hall" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "Fest" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "Myk" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "Full bass" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "Reggae" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "Hodetelefoner" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "Soft rock" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "Full diskant" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "Dance" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "Techno" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "Ska" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "Laptop" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "Equalizer" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" "Kontrollerer overtonenivåer i lydfiler.\n" "Klikk eller bruk knapper for å tilpasse nivåer (høyreklikk for å " "tilbakestille)." #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "Gjeldende bakstykke støtter ikke overtone-kontroll." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "%.1f kHz" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "%d Hz" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, python-format msgid "%.1f dB" msgstr "%.1f dB" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom" msgstr "Selvvalgt" #: ../quodlibet/ext/events/equalizer.py:199 msgid "_Clear" msgstr "_Tøm" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "tilkoblet" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "frakoblet" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "prat" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "borte" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "xa" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "usynlig" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "Gajim-statusmelding" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "Endrer Gajim-statusmelding basert på hva du spiller av." #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "pauset" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" "Viser kontoer - adskilt med komma - for endring av statusmelding. Hvis ingen " "er valgt, blir statusmeldinger for alle kontoer endret." #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "Legg til «[på pause]»" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" "Hvis dette er valgt, blir «[paused]» lagt til statusmeldinger ved pause." #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "Statuser som statusmelding skal endres for" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "Pause ved frakobling av hodetelefoner" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" "Setter musikk på pause når du kobler fra hodetelefoner, og fortsetter " "avspilling når du kobler dem til igjen." #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "Hindre skjermsparer" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" "Hindrer GNOME-skjermspareren fra å slå seg på mens du spiller av musikk." #: ../quodlibet/ext/events/inhibit.py:51 msgid "Music is playing" msgstr "Musikk under avspilling" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "Internet Radio Log" msgstr "Internettradio-logg" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" "Husker de 10 siste låtene som ble spilt på radiokanaler, og viser dem i " "søkemenyen." #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "JEP-118" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "Skriver ut Jabber User Tunes-fil til ~/.quodlibet/jabber." #: ../quodlibet/ext/events/language.py:21 msgid "Change Language" msgstr "Bytt språk" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "Endre grensesnitt-språk." #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "Forvalgt av system" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "Programmet må startes på nytt for å ta i bruk endringer" #: ../quodlibet/ext/events/lyricswindow.py:199 msgid "No active song" msgstr "Ingen låt spilles av" #: ../quodlibet/ext/events/lyricswindow.py:215 msgid "No lyrics found" msgstr "Fant ingen sangtekst" #: ../quodlibet/ext/events/lyricswindow.py:227 msgid "Lyrics:" msgstr "Sangtekst:" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "_Zoomnivå:" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "Adresse:" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "Tilbakestill til standardverdi" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" "Søk via ovennevnt nettadresse hvis sangtekst ikke finnes på LyricsWikia." #: ../quodlibet/ext/events/lyricswindow.py:339 msgid "Alternate search" msgstr "Alternativt søk" #: ../quodlibet/ext/events/lyricswindow.py:347 msgid "Lyrics Window" msgstr "Sangtekst-vindu" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "Viser et vindu med sangtekst for gjeldende låt." #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "UPnP AV-medietjener" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" "Viser alle album til Rygel UPnP-medietjener via D-Bus-grensesnittet " "MediaServer2." #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "MPD-tjener" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" "Tillater fjernstyring av Quod Libet ved bruk av MPD-klient. Strømming, " "spillelister og bibliotekbehandling støttes ikke." #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "_Port:" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "Lokal _IP:" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "P_assord:" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 msgid "Connection" msgstr "Tilkobling" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "Testede klienter" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "MPRIS D-Bus-støtte" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" "Tillater styring av Quod Libet ved bruk av D-Bus-grensesnitt-spesifikasjonen " "MPRIS 1.0/2.0." #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "Skjul hovedvindu ved lukking" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Innstillinger" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "Tillater QL-mønstre som f.eks. %s" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "MQTT-utgiver" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "Sender statusmeldinger til et MQTT-emne." #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "Mellomtjener-vertsnavn" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "mellomtjener-vertsnavn/-IP" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "Mellomtjener-port" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "mellomtjener-port" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "Emne" #: ../quodlibet/ext/events/mqtt.py:128 msgid "Playing Pattern" msgstr "Avspillingsmønster" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "Statustekst når du spiller av en låt." #: ../quodlibet/ext/events/mqtt.py:132 msgid "Paused Pattern" msgstr "Pausemønster" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "Tekst når du setter en låt på pause." #: ../quodlibet/ext/events/mqtt.py:136 msgid "No-song Text" msgstr "«Ingen låt»-tekst" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "Ren tekst når du ikke spiller av en låt" #: ../quodlibet/ext/events/mqtt.py:149 msgid "MQTT Configuration" msgstr "MQTT-oppsett" #: ../quodlibet/ext/events/mqtt.py:153 msgid "Status Text" msgstr "Statustekst" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "Tilkoblet mellomtjener på %(host)s:%(port)d" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Klarte ikke å koble til %(host)s:%(port)d (%(msg)s" #: ../quodlibet/ext/events/mqtt.py:192 msgid "Connection error" msgstr "Tilkoblingsfeil" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "Varslingstekst" #: ../quodlibet/ext/events/notify.py:88 msgid "_Title:" msgstr "_Tittel:" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "Tilbakestill til standardmønster" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "_Brødtekst:" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "Vi_s varsling" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "Vis varslinger" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "Bare ved <i>_manuelt</i> låtbytte" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "Bare ved <i>_automatisk</i> låtbytte" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "Ved <i>a_lle</i> typer låtbytte" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "Bare når hovedvindu ikke er i _fokus" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "Vis «_Neste»-knapp" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "Tilkoblingsfeil" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "Klarte ikke å koble til bakgrunnsprosess for varslinger." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "Låtvarslinger" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "Viser et varsel ved låtbytte." #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Neste" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" "Besøk Tillegg-vinduet for å sette opp QLScrobbler. Ingen låter blir sendt " "inn før du gjør dette." #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "Klarte ikke å koble til tjenesten «%s»." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "Autentisering mislyktes. Ugyldig nettadresse." #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" "Autentisering mislyktes. Brukernavnet «%s» eller oppgitt passord er feil." #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "Klienten er utestengt. Kontakt forfatteren." #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" "Systemet har feil dato/klokkeslett. Innsending av låter kan mislykkes inntil " "du retter opp dette." #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "AudioScrobbler-innsending" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" "Audioscrobbler-klient for Last.fm, Libre.fm og andre Audioscrobbler-" "tjenester." #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "Du er nå autentisert." #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "_Tjeneste:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "_Adresse:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "User_name:" msgstr "Bruker_navn:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "_Passord:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 msgid "Other…" msgstr "Annet …" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "_Bekreft kontoinformasjon" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "Konto" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Artist pattern:" msgstr "_Artistmønster:" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Title pattern:" msgstr "_Tittelmønster:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "Utelat _filter:" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" "Mønster til formatering av artistnavn for innsending. La feltet stå tomt for " "å bruke standardmønster." #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" "Mønster til formatering av tittel for innsending. La feltet stå tomt for å " "bruke standardmønster." #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "Låter som samsvarer med dette filteret blir ikke sendt inn." #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "_Frakoblet modus (ikke send inn noe)" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "Innsending" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "Demp reklamelyd" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" "Slår av lyden når radiokanaler spiller reklame.\n" "Kanaler: di.fm." #: ../quodlibet/ext/events/randomalbum.py:27 msgid "Random Album Playback" msgstr "Tilfeldig albumavspilling" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" "Spiller av et tilfeldig album når du har spilt gjennom en spilleliste. Dette " "krever at gjeldende utforsker støtter filtrering på album." #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "Høyere vurdering" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "Oftere spilt" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "Oftere hoppet over" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "Nyligere spilt" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "Nyligere startet" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "Nyligere lagt til" #: ../quodlibet/ext/events/randomalbum.py:44 msgid "Longer albums" msgstr "Lengre album" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "sekunder før neste album spilles av" #: ../quodlibet/ext/events/randomalbum.py:87 msgid "Weights" msgstr "Vektinger" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "Spill noen album oftere enn andre" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "unngå" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "foretrekk" #: ../quodlibet/ext/events/randomalbum.py:201 msgid "Random Album" msgstr "Tilfeldig album" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "Venter på å starte %s" #: ../quodlibet/ext/events/rbimport.py:114 msgid "Import Failed" msgstr "Importering mislyktes" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "Vurderinger og statistikk for %d låter er nå importert" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "Rhythmbox-importering" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "Importerer vurderinger og låtstatistikk fra Rhythmbox." #: ../quodlibet/ext/events/rbimport.py:132 msgid "Start Import" msgstr "Start importering" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "Pause ved skjermsparer" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "Setter spilleren på pause når GNOME-skjermspareren slår seg på" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "Ingen GNOME Shell-søketilbyder for Quod Libet er installert." #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "GNOME-søketilbyder" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "Lar GNOME Shell søke i biblioteket." #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "Alternativ søkelinje" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" "En alternativ søkelinje som alltid er synlig og fyller ut hele vinduets " "bredde." #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "Squeezebox-synk" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" "Speiler Quod Libet-utdata til Logitech Squeezebox, gitt at begge leser fra " "samme bibliotek." #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "Fant ikke Squeezebox-tjener" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "Fant ikke %s. Kontroller oppsett." #: ../quodlibet/ext/events/synchronizedlyrics.py:34 msgid "Synchronized Lyrics" msgstr "Synkronisert sangtekst" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" "Viser synkronisert sangtekst når en «.lrc»-fil som har samme navn som en låt" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "Tekst:" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "Bakgrunn:" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "Skrifttype" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "Størrelse (px):" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "Telepathy-statusmeldinger" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" "Oppdaterer alle Telepathy-baserte direktemeldingskontoer (som er satt opp i " "Empathy o.l.) med statusmelding basert på låta du spiller av." #: ../quodlibet/ext/events/telepathy_status.py:122 msgid "Playing:" msgstr "Spiller:" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "Statustekst når du starter en låt. Godtar QL-mønstre som f.eks. %s" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "Pauset:" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" "Statustekst når du setter en låt på pause. Godtar QL-mønstre som f.eks. %s" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "Ren tekst når du ikke spiller av en låt" #: ../quodlibet/ext/events/telepathy_status.py:157 msgid "No song:" msgstr "Ingen låt:" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 msgid "Status Patterns" msgstr "Statusmønstre" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "Temaveksler" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "Endrer gjeldende GTK+-tema." #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "_Tema:" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "Forvalgt tema" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "Foretrekk mørk temaversjon" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "Slå på/av menylinje" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "Slå på/av menylinja ved å trykke Alt." #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Ingenting spilles av" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "Systemkurv-ikon" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "Kontrollerer Quod Libet fra systemkurven." #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "_Vis %(application-name)s" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 msgid "_Play" msgstr "S_pill av" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 msgid "P_ause" msgstr "P_ause" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 msgid "Pre_vious" msgstr "_Forrige" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "_Neste" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Stokk om" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Gjenta" #: ../quodlibet/ext/events/trayicon/menu.py:86 msgid "Stop _After This Song" msgstr "Stopp _etter denne låta" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 msgid "Open _Browser" msgstr "Åpne _utforsker" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Rediger _tagger" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informasjon" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 msgid "Play_lists" msgstr "Spille_lister" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "_Avslutt" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Oppførsel" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "Rullehjul stiller inn volum" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "Rullehjul bytter låt" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Rulle_hjul" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Vis hjelpebobler" #: ../quodlibet/ext/events/viewlyrics.py:23 msgid "View Lyrics" msgstr "Vis sangtekst" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "Viser sangtekster under låtliste i hovedvindu automatisk." #: ../quodlibet/ext/events/viewlyrics.py:29 msgid "_Lyrics" msgstr "Sa_ngtekst" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "Start visualisering" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "Start ekstern visualisering." #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "Klarte ikke å kjøre visualisering med «%s»" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 msgid "Error" msgstr "Feil" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "Kjørbart visualiseringsprogram:" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "Last inn på nytt" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "Lydbølge-søkelinje" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "Søkelinje som former seg etter lydbølge av gjeldende låt." #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "Overstyr forgrunnsfarge:" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "Bildelagring" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "Lagrer omslagsbilde for gjeldende låt i en fil." #: ../quodlibet/ext/events/write_cover.py:66 msgid "File:" msgstr "Fil:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "_Terskel:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "Terskel for når filteret slår seg på" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "For_hold:" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "Komprimeringsforhold" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "%d %%" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "Lydkompressor" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" "Endrer lydstyrke på alle lyder med styrke over en gitt terskel men et gitt " "komprimeringsforhold." #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "_Preset:" msgstr "_Forvalg:" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "Filter preset" msgstr "Filteroppsett" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "_Frekvensterskel:" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "Kappefrekvens for lavpass-filter" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "Innmatings_nivå:" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "Innmatingsnivå" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "Standard" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "Nærmest virtuell høyttalerplassering (30°, 3 meter)" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "Chu Moy" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "Nærme Chu Moys «crossfeeder» (populært)" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "Jan Meier" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "Nærme Jan Meiers CORDA-forsterkere (liten endring)" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom settings" msgstr "Selvvalgte innstillinger" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "Kryssmating" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" "Blander lyd fra venstre og høyre kanal for f.eks. å simulere et " "høyttaleroppsett ved bruk av hodetelefoner, eller for å kompensere for " "tidlige stereo-innspillinger." #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "Filter _band:" msgstr "Filtrer _band:" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "Filterets frekvensbånd" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "Filter _width:" msgstr "Filtrer _bredde:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "Filterets frekvensvidde" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "Ni_vå:" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "Effektnivå" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "Karaoke" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "Fjerner hovedvokal fra lyd." #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "Mono-nedmiks" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "Mikser ned flere lydkanaler til mono." #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "Fr_ekvens:" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "_Tempo:" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "_Tonehøyde:" #: ../quodlibet/ext/gstreamer/pitch.py:89 msgid "Audio Pitch / Speed" msgstr "Tonehøyde / hastighet" #: ../quodlibet/ext/gstreamer/pitch.py:90 msgid "Controls the pitch of an audio stream." msgstr "Styrer tonehøyde på lydstrøm." #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 msgid "Export Playlist to Folder" msgstr "Eksporter spilleliste til mappe" #: ../quodlibet/ext/playlist/export_to_folder.py:38 msgid "_Export" msgstr "_Eksporter" #: ../quodlibet/ext/playlist/export_to_folder.py:43 msgid "Destination folder:" msgstr "Målmappe:" #: ../quodlibet/ext/playlist/export_to_folder.py:58 msgid "Filename pattern:" msgstr "_Filnavn-mønster:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "Eksporterer en spilleliste ved å kopiere filer til en mappe." #: ../quodlibet/ext/playlist/export_to_folder.py:156 msgid "Default filename pattern:" msgstr "_Forvalgt filnavn-mønster:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "Eksporter til Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" "Eksporterer en spilleliste dynamisk til Logitech Squeezebox, gitt at begge " "bruker samme mappestruktur. Deler oppsett med <a href=\"quodlibet:///prefs/" "plugins/Squeezebox Output\">Squeezebox Sync</a>-tillegget." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "Eksporter spilleliste til Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "Spillelistenavn (overskriver gjeldende navn)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "Eksporter til Squeezebox-spilleliste" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 msgid "Remove Playlist Duplicates" msgstr "Fjern duplikater fra spilleliste" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "Fjerner duplikater fra spillelister." #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Er du sikker på at du hvis fjerne %d duplikat?" msgstr[1] "Er du sikker på at du hvis fjerne %d duplikater?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "Duplikatlåter blir fjernet fra spillelista «%s»." #: ../quodlibet/ext/playlist/shuffle.py:15 msgid "Shuffle Playlist" msgstr "Stokk om spilleliste" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "Stokker om låter i en spilleliste." #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "Følg peker" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" "Avspilling følger utvalg, eller neste låt i lista når utvalg er oppbrukt." #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "Avspillingsutjevner" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" "Spill av i omstokket rekkefølge, med vekt på låter som har blitt spilt " "færrest antall ganger." #: ../quodlibet/ext/playorder/playcounteq.py:25 msgid "Prefer less played" msgstr "Foretrekk låter med færre avspillinger" #: ../quodlibet/ext/playorder/queue.py:19 msgid "Queue Only" msgstr "Bare kø" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" "Begrenser avspilling til låter som ligger i kø. Når denne " "avspillingsrekkefølgen er valgt i hovedvinduet blir låter lagt i kø ved " "dobbeltklikk i stedet for å bli spilt av direkte." #: ../quodlibet/ext/playorder/reverse.py:14 msgid "Reverse" msgstr "Omvendt" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "Spiller av låter i omvendt rekkefølge" #: ../quodlibet/ext/playorder/skip_songs.py:25 msgid "Skip Songs" msgstr "Hopp over låter" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" "Avspilling hopper over låter med vurderingskarakter som er lik eller under " "valgt terskelverdi." #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "Gjenta hvert spor" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "Stokk om låtrekkefølge og spill av hvert spor valgt antall ganger." #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "Antall avspillinger per låt:" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "Betinget spørring" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" "Velger spørring å samsvare med basert på en betingelsesspørring. Syntaks: " "«@(if: tilstand, så, ellers)»." #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "Python-spørring" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" "Bruk Python-uttrykk i spørringer. Syntaks: «@(python: uttrykk)». Variabelen " "«s» er låta som samsvarer med uttrykket." #: ../quodlibet/ext/query/savedsearch.py:19 msgid "Include Saved Search" msgstr "Ta med lagret søk" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" "Ta med søketreff fra lagret søk som del av en annen spørring. Syntaks: " "«@(saved: søkenavn)»." #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "Squeezebox OK. Bruker eneste spiller (%s)." #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "Klarte ikke å koble til %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "Vertsnavn:" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "Port:" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 msgid "Username:" msgstr "Brukernavn:" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "Passord:" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "Bibliotekmappe som tjener kobler til." #: ../quodlibet/ext/_shared/squeezebox/base.py:132 msgid "Library path:" msgstr "Bibliotek-sti:" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "_Kontroller oppsett" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "Squeezebox-tjener" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Feilsøk" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Squeezebox-tjener på {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "ukjent Squeezebox-tjener" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "ukjent Squeezebox-spiller: %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "Velg Squeezebox-spiller" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "_OK" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Fant Squeezebox-tjener.\n" "Velg spiller" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "Tilpass bilde til _vindu" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "_Program:" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "_Rediger bilde etter lagring" #: ../quodlibet/ext/songsmenu/albumart.py:345 msgid "File_name:" msgstr "Fil_navn:" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "Lagring mislyktes" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, python-format msgid "Unable to save \"%s\"." msgstr "Klarte ikke å lagre «%s»." #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] HTTP-feil: %s" #: ../quodlibet/ext/songsmenu/albumart.py:613 msgid "Album Art Downloader" msgstr "Nedlastingsverktøy for omslag" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "fra %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "Oppløsning: %s" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, python-format msgid "Size: %s" msgstr "Størrelse: %s" #: ../quodlibet/ext/songsmenu/albumart.py:690 msgid "_Search" msgstr "_Søk" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 msgid "Searching…" msgstr "Søker …" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "Ferdig" #: ../quodlibet/ext/songsmenu/albumart.py:922 msgid "Download Album Art" msgstr "Last ned album-omslag" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "Last ned omslagsbilder fra diverse nettsteder." #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "Kilder" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "APEv2 til ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" "Konverterer APEv2-tagger til ID3v2. APEv2-tagger blir slettet etter " "konvertering." #: ../quodlibet/ext/songsmenu/bookmarks.py:23 msgid "Go to Bookmark" msgstr "Gå til bokmerke" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "Håndterer bokmerker i valgte filer." #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 msgid "_Edit Bookmarks…" msgstr "R_ediger bokmerker …" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 msgid "No Bookmarks" msgstr "Ingen bokmerker" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 msgid "MusicBrainz Lookup" msgstr "MusicBrainz-oppslag" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Tagger album på nytt basert på MusicBrainz-oppslag." #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "Bare bruk år i «date»-tagg" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "Skriv «_albumartist» hvis nødvendig" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "Skriv sorteringstagger for artistnavn" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "Skriv _standard MusicBrainz-tagger" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "Skriv «labelid»-tagg" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Filnavn" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 msgid "Disc" msgstr "Plate" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Spor" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 msgid "Title" msgstr "Tittel" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Artist" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 msgid "MusicBrainz lookup" msgstr "MusicBrainz-oppslag" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 msgid "_Query:" msgstr "_Spørring:" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 msgid "S_earch" msgstr "S_øk" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "Treff <i>(dra for å endre rekkefølge)</i>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "Skriv inn en spørring." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "Det oppstod en feil. Prøv på nytt." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "Laster inn treff …" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 msgid "No results found." msgstr "Søket ga ingen treff." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 msgid "Browse Folders" msgstr "Utforsk mapper" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "Åpner låtmapper i filutforsker." #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Unable to open folders" msgstr "Klarte ikke å åpne mapper" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "Ingen filutforsker tilgjengelig." #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "Python-konsoll" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "Interaktiv Python-konsoll." #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "Du kan bruke følgende objekter som standard:" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "Gjeldende arbeidsmappe er:" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "Kommando" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "name" msgstr "navn" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "Navn på denne kommandoen" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "kommando" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "Skallkommando-syntaks som skal kjøres" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "parameter" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" "Hvis dette er valgt, blir en parameter i kommandoen erstattet med selvvalgt " "verdi. For eksempel: bruk «PARAM» for å bli bedt om verdier for alle " "forekomster av «{PARAM}» i en kommando" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "mønster" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" "QL-mønster - f.eks. <~filnavn> - som skal brukes til å beregne en verdi for " "kommandoen. Dette støtter også bruk av taggene <~playlistname> og " "<~#playlistindex> for spillelister." #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "unik" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" "Hvis dette er valgt, blir duplikatverdier som mønsteret fører til fjernet" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "maks argumenter" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" "Maksimalt antall argumenter som kan sendes til kommandoen om gangen (likner " "xargs)" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 msgid "Input value" msgstr "Inndataverdi" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "Verdi for %s?" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 msgid "Custom Commands" msgstr "Selvvalgte kommandoer" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Kjører selvvalgte kommandoer (buntvis hvis påkrevet) på låter som bruker " "valgt(e) tagg(er)." #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "Rediger selvvalgte kommandoer" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" "Støtter QL-mønstre\n" "f.eks. <tt><~artist~title></tt>" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, python-format msgid "Unable to run custom command %s" msgstr "Klarte ikke å kjøre selvvalgt kommando %s" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "%d duplikatgruppe" msgstr[1] "%d duplikatgrupper" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "Fold sammen / Utvid alle" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Uttrykk for duplikatnøkkel er «%s»" #: ../quodlibet/ext/songsmenu/duplicates.py:372 msgid "Duplicates Browser" msgstr "Dupliserer utforsker" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "FInner og viser låtversjoner med liknende tagger." #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" "Godtar QL-tagguttrykk som <tt>~artist~title</tt> eller " "<tt>musicbrainz_track_id</tt>" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "_Grupper duplikater etter:" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "Duplikatnøkkel" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "Fjern _blanktegn" #: ../quodlibet/ext/songsmenu/duplicates.py:424 msgid "Remove _Diacritics" msgstr "Fjern _diakritikk" #: ../quodlibet/ext/songsmenu/duplicates.py:425 msgid "Remove _Punctuation" msgstr "Fjern _tegnsetting" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "Ignorer små/store bokstaver" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "Søkevalg" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 msgid "Edit Playcount" msgstr "Rediger antall avspillinger" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" "Rediger ~#playcount og ~#skipcount for en låt.\n" "\n" "Antall blir økt - ikke endret - hvis flere låter er valgt.\n" "\n" "Hvis du endrer ~#playcount til 0, blir ~#lastplayed og ~#laststarted tømt. " "Hvis du endrer en låt uten avspillinger til positivt antall avspillinger, " "får ingen av disse noen verdi." #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "Antall avspillinger" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "Antall ganger hoppet over" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "Rediger innebygde bilder" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "Sletter eller erstatter innebygde bilder." #: ../quodlibet/ext/songsmenu/embedded.py:78 msgid "_Remove all Images" msgstr "_Fjern alle bilder" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "_Bygg inn gjeldende bilde" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "Endre nøyaktig vurdering" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "Tillater endring av låtvurderinger med tallverdier." #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "Skriv inn en vurderingsverdi mellom 0.0 og 1.0" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Filter on Any Tag" msgstr "Filtrer etter hvilken som helst tagg" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "Lager søkespørring basert på tagger for valgte låter." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 msgid "Filter on Directory" msgstr "Filtrer etter mappe" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "Filtrerer på mappe i nytt utforskervindu." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "Akustisk fingeravtrykk-søk" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "Slår opp låt-metadata ved hjelp av akustisk fingeravtrykk." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "Send inn akustiske fingeravtrykk" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Lager akustiske fingeravtrykk ved hjelp av chromaprint og sender dem inn til " "acoustid.org." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "API-nøkkel mangler" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" "Du må sette opp en API-nøkkel for acoustid.org i tilleggsoppsettet for å " "sende inn fingeravtrykk." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "Be om API-nøkkel" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "API-_nøkkel:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "AcoustID-nettjeneste" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "I kø" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "Analyserer" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "Oppslag" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Skriv" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "Status" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "Utgivelse" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 msgid "Write MusicBrainz tags" msgstr "Skriv MusicBrainz-tagger" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 msgid "Group by directory" msgstr "Grupper etter mappe" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "Album Mode" msgstr "Albummodus" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" "SKriver album-relaterte tagger og prøver å redusere antall ulike " "albumutgivelser" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "Lager fingeravtrykk:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "_Detaljer" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "_Send inn" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" "Låter enten ha taggen <i><b>musicbrainz_trackid</b></i> eller taggene " "<i><b>artist</b></i> / <i><b>title</b></i> / <i><b>album</b></i> for å bli " "sendt inn." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "Fingeravtrykk:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "Låter med MBID:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "Låter med tilstrekkelig taggdata:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "Låter å sende inn:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Ferdig. %(to-send)d/%(all)d låter å sende inn." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "Sender inn fingeravtrykk:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "Sender inn …" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 msgid "Update Tags in Files" msgstr "Oppdater tagger i filer" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" "Oppdater endrede tagger i filer. Dette holder avspillingsstatistikk og " "vurderinger oppdatert." #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "Eksporter til HTML" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "Eksporterer valgt låtliste i HTML-format." #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "Rett opp MP3-låtvarighet" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" "Fjerner TLEN-rammer fra ID3-tagger som kan forårsake feilaktige " "varighetsverdier." #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "Send til iFP" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "Last opp låter til iRiver iFP-enhet." #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "Eksporter metadata" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "Eksporterer metadata for valgte låter til en «.tags»-fil." #: ../quodlibet/ext/songsmenu/importexport.py:92 msgid "Import Metadata" msgstr "Importer metadata" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "Importerer metadata for valgte låter fra en «.tags»-fil." #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "Skriv CD" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Skriver CD-er med K3b, Brasero eller xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "Oppdaterer liste." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "Allerede oppdatert." #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "Henter ukeliste for %s." #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "Synk utført." #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "Feil under synk" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "Last.fm-synk" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "Oppdaterer bibliotekstatistikk med data fra Last.fm-profil" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 msgid "_Username:" msgstr "Br_ukernavn:" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "Lag sorteringstagger" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "Konverterer album- og artistnavn til sorteringsnavn, på enkelt vis." #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 msgid "Migrate Metadata" msgstr "Flytt over metadata" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "Kopierer quodlibet-bestemte metadata mellom låter." #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "_Kopier" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "_Lim inn" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 msgid "Information to copy/paste" msgstr "Informasjon å kopiere/lime inn" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "Tilordne spor etter plate- og spornummer" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" "Slå på dette når du vil flytte metadata fra et album til et annet med " "tilsvarende plate- og spornumre.\n" "<b>Merk:</b> dette må være slått på når metadata blir kopiert for at " "sporinformasjon skal bli lagret." #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "Det finnes %d lagret spor." msgstr[1] "Det finnes %d lagrede spor." #: ../quodlibet/ext/songsmenu/playlist.py:31 msgid "Export as Playlist" msgstr "Eksporter som spilleliste" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "Eksporterer låter til M3U- eller PLS-spilleliste." #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "Bruk relative filstier" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "Bruk fullstendige filstier" #: ../quodlibet/ext/songsmenu/playlist.py:132 msgid "Unable to export playlist" msgstr "Klarte ikke å eksportere spilleliste" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Skriving til <b>%s</b> mislyktes." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 msgid "Rescan Songs" msgstr "Søk gjennom låter på nytt" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" "Ser etter filendringer, og fjerner eller laster inn låter på nytt hvis " "nødvendig." #: ../quodlibet/ext/songsmenu/refresh.py:31 msgid "Rescan songs" msgstr "Søk gjennom låter på nytt" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "ReplayGain-analyseringsverktøy" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "Framdrift" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "Forsterkning" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "Maksverdi" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "<b>%(to-process)s</b> album skal oppdateres (av %(all)s)" msgstr[1] "<b>%(to-process)s</b> album skal oppdateres (av %(all)s)" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" "Analyserer og oppdaterer ReplayGain-informasjon ved hjelp av GStreamer. " "Resultater blir gruppert per album." #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "alltid" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "hvis <b>hvilken som helst</b> RG-tagg mangler" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "hvis <b>album</b>-RG-tagg mangler" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "_Behandle album:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 msgid "Existing Tags" msgstr "Gjeldende tagger" #: ../quodlibet/ext/songsmenu/splitting.py:31 msgid "Split Tags" msgstr "Splitt tagger" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "Skiller platenummer fra albumnavn og samtidig versjon fra tittel." #: ../quodlibet/ext/songsmenu/splitting.py:56 msgid "Split Album" msgstr "Del opp album" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "Trekk ut platenummer." #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "BPM:" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "i/t" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 msgid "Reset" msgstr "Tilbakestill" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 msgid "Tap" msgstr "Trykk" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "Beregn BPM" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 msgid "Tap BPM for the selected song." msgstr "Beregn BPM for valgt låt ved å trykke i takt." #: ../quodlibet/ext/songsmenu/website_search.py:35 msgid "Website Search" msgstr "Nettsted-søk" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" "Søker på valgt nettside med tagger.\n" "Støtter mønstre som f.eks. %(pattern-example)s." #: ../quodlibet/ext/songsmenu/website_search.py:78 msgid "Search URL patterns" msgstr "Søk i adressemønstre" #: ../quodlibet/ext/songsmenu/website_search.py:88 msgid "Edit search URLs" msgstr "Rediger søkeadresser …" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 msgid "Configure Searches…" msgstr "Sett opp søk …" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "Søk på %(website)s" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "Søk etter artist på Wikipedia" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" "Åpner nettleservindu med Wikipedia-artikkel om artisten for spillende artist." #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "Søk etter album på Wikipedia" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" "Åpner nettleservindu med Wikipedia-artikkel om artisten for spillende album." #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Bibliotek" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Kontrollerer monteringspunkter" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Søker gjennom bibliotek" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Søker gjennom %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "Laster inn filer" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Klarte ikke å laste inn fil: %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Vis tagger" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Skriv ut kortfattet info" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Kolonner som skal vises og sortering i kortfattet modus (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "Vis programmatiske tagger" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Argument(er) mangler" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "For mange argumenter" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "Beskrivelse" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Verdi" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Vis alle fellestagger" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Kopier tagger fra en fil til en annen" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Vis endringer, men ikke lagre dem" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Hopp over tagger som ikke kan skrives" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Klarte ikke å kopiere tagg %r til fil: %r" #: ../quodlibet/operon/commands.py:157 msgid "Edit tags in a text editor" msgstr "Rediger tagger med tekstbehandler" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "Redigering avbrutt" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Oppstart av tekstbehadnler «%(editor-name)s» mislyktes." #: ../quodlibet/operon/commands.py:260 msgid "No changes detected" msgstr "Fant ingen endringer" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Endre tagg og fjern gjeldende verdier" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Klarte ikke å endre %r" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "Fjern tagger" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "Verdien er et regulært uttrykk" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "Fjern alle tagger" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "Du kan ikke bruke «--all» og «--regexp» samtidig" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "Klarte ikke å fjerne %r fra %r" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "Fjern taggverdi" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "Legg til taggverdi" #: ../quodlibet/operon/commands.py:456 msgid "List file information" msgstr "Vis filinformasjon" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" "Bruk gjeldende bilde som primært innebygd bilde, og fjern alle andre " "innebygde bilder" #: ../quodlibet/operon/commands.py:515 #, python-format msgid "Failed to load image file: %r" msgstr "Klarte ikke å laste inn bildefil: %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "Bilderedigering støttes ikke for %(file_name)s (%(file_format)s)" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "Fjern alle innebygde bilder" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Pakk ut innebygde bilder i %(filepath)s" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "Sti hvor bilder skal lagres (standard er gjeldende arbeidsmappe)" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Gi filer nytt navn basert på tagger" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Fyll ut tagger basert på filsti" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Fil" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Fyll ut spornummer for alle filer" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Skriv tagger basert på valgt mønster" #: ../quodlibet/operon/commands.py:768 msgid "Display help information" msgstr "Vis hjelpetekst" #: ../quodlibet/operon/util.py:40 #, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "«%(column-id)s» er et ugyldig kolonnenavn (%(all-column-ids)s)." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Ukjent" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "I rekkefølge" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_I rekkefølge" #: ../quodlibet/order/reorder.py:23 msgid "Random" msgstr "Tilfeldig" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Tilfeldig" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "Foretrekk låter med høy vurderingskarakter" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "Gjenta gjeldende spor" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 msgid "Repeat all" msgstr "Gjenta alle" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Én låt" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Strøm" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Bygger mellomlager" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "Klarte ikke å lage GStreamer-datarør" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "Fant ingen GStreamer-element som kan håndtere gjeldende medieformat" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "Medieformat: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "Klarte ikke å laste inn GStreamer-tillegg «%(name)s»" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "GStramer-utdatarør som skal brukes til avspilling. La dette stå tomt for å " "bruke forvalgt datarør. Hvis datarøret inneholder en utgang, blir denne " "brukt i stedet for forvalgt utgang." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Utdatarør:" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f sekunder" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "_Mellomlagringstid:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "Slå av _sømløs avspilling" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" "Slå av sømløs avspilling for å omgå problemer som oppstår med enkelte " "versjoner av GStreamer." #: ../quodlibet/player/gstbe/util.py:93 msgid "No GStreamer audio sink found" msgstr "Fant ingen GStreamer-lydutgang" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "Ugyldig GStreamer-utdatarør" #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Klarte ikke å sende ut lyd" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "Fant ikke lydenhet %r. Kontroller Xine-oppsett i ~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "Fant ikke modul «{module}». Har du installert den?" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Fant ikke GStreamer-element «{element}»" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "Vil du kjøre tillegget «%(name)s» på %(count)s spilleliste?" msgstr[1] "Vil du kjøre tillegget «%(name)s» på %(count)s spillelister?" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 msgid "_Run Plugin" msgstr "_Kjør programtillegg" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Støttede formater: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Lydenhet: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Begynnelse" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "I.T." #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Tid" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Bokmerkenavn" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Bokmerker" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtre" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "Sist s_pilt" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Sist lagt til" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 på _topp" #: ../quodlibet/qltk/browser.py:63 msgid "All _Songs" msgstr "Alle _låter" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "På gjeldende _sjanger(e)" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "På gjeldende _artist(er)" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "På gjeldende al_bum" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Tilfeldig _sjanger" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Tilfeldig _artist" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Tilfeldig al_bum" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "De 40 mest spilte låtene i biblioteket (det kan dukke opp flere enn 40 hvis " "ulike låter har blitt spilt av like mange ganger)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Verdi:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Lagrede verdier" #: ../quodlibet/qltk/cbes.py:263 msgid "Edit saved values…" msgstr "Rediger lagrede verdier …" #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_matisk" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "_Spormodus" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "_Albummodus" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "_Demp" #: ../quodlibet/qltk/controls.py:128 msgid "_Replay Gain Mode" msgstr "_Replay Gain-modus" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "Ny %s" #: ../quodlibet/qltk/data_editors.py:218 msgid "(unknown)" msgstr "(ukjent)" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "Tagguttrykk" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "Tagguttrykk, som f.eks. «people:real» «~album~year»." #: ../quodlibet/qltk/data_editors.py:383 msgid "Enter new tag" msgstr "Skriv inn ny tagg" #: ../quodlibet/qltk/delete.py:37 msgid "Files:" msgstr "Filer:" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" "Valgte låter blir fjernet fra biblioteket og slettet fra lagringsenheten de " "ligger på." #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "Valgte filer blir slettet for godt." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "Er du sikker på at du vil slette %(file_count)d fil for godt?" msgstr[1] "Er du sikker på at du vil slette %(file_count)d filer for godt?" #: ../quodlibet/qltk/delete.py:91 msgid "_Delete Files" msgstr "Sle_tt filer" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "Valgte låter blir fjernet fra biblioteket og lagt i papirkurven for " "lagringsenheten de ligger på." #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "Valgte filer blir flyttet til papirkurv." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "Vil du legge %(file_count)d fil i papirkurv?" msgstr[1] "Vil du legge %(file_count)d filer i papirkurv?" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Flytt til papirkurv" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Flytter %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Klarte ikke å flytte til papirkurv" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 msgid "Moving one or more files to the trash failed." msgstr "Flytting av én eller flere filer til papirkurv mislyktes." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Sletter %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 msgid "Unable to delete files" msgstr "Klarte ikke å slette filer" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 msgid "Deleting one or more files failed." msgstr "Sletting av én eller flere filer mislyktes." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Nedlastninger" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Størrelse" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "_Stopp" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "mangler i %d låt" msgstr[1] "mangler i %d låter" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "ulikt i %d låt" msgstr[1] "ulikt i %d låter" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Del opp i _flere verdier" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Trekk platenummer ut av _album" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Trekk _versjon ut av tittel" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Trekk arrangør ut av ar_tist" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Trekk _utøver ut av artist" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "Trekk _utøver ut av tittel" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "Trekk _originalartist ut av tittel" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Legg til tagg" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tagg:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Rediger tagger" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Vis programmatiske tagger" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Se alle tagger, inkludert maskingenererte som f.eks. MusicBrainz- eller " "Replay Gain-tagger" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 msgctxt "edittags" msgid "_Revert" msgstr "_Tilbakestill" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "_Lagre" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Klarte ikke å legge til tagg" #: ../quodlibet/qltk/edittags.py:660 #, python-format msgid "Unable to add <b>%s</b>" msgstr "Klarte ikke å legge til <b>%s</b>" #: ../quodlibet/qltk/edittags.py:662 #, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "Valgte filer støtter ikke at <b>%s</b> har flere enn én verdi." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Ugyldig tagg" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "<b>%s</b> er en ugyldig tagg\n" "\n" "Valgte filer støtter ikke redigering av denne taggen." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Ugyldig verdi" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Ugyldig verdi: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Taggen er kanskje ikke nøyaktig" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "%(file-name)s ble endret mens programmet kjørte. Hvis du lagrer uten å " "oppdatere biblioteket, kan du overskrive andre endringer som er utført i " "mellomtiden." #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Klarte ikke å lagre låt" #: ../quodlibet/qltk/_editutils.py:50 #, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Lagring av %(file-name)s mislyktes. Fila er skrivebeskyttet, ødelagt, eller " "du mangler tillatelser til å redigere den." #: ../quodlibet/qltk/_editutils.py:142 msgid "_More options…" msgstr "_Flere valg …" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "_Angre" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "_Gjør om" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "O_m" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "_Se etter oppdateringer …" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Programtillegg" #: ../quodlibet/qltk/exfalsowindow.py:267 #, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s og %(count)s annen" msgstr[1] "%(title)s og %(count)s andre" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso-innstillinger" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Splitt _på:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Taggredigering" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Mapper" #: ../quodlibet/qltk/filesel.py:253 msgid "_New Folder…" msgstr "_Ny mappe …" #: ../quodlibet/qltk/filesel.py:262 msgid "_Select all Sub-Folders" msgstr "_Velg alle undermapper" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Ny mappe" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Skriv inn navn på ny mappe:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Klarte ikke å lage mappe" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Klarte ikke å slette mappe" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Låter" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "av %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Plate %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Spor %s" #: ../quodlibet/qltk/info.py:108 msgid "_Edit Display…" msgstr "R_ediger visning …" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Ingen låter er valgt." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Ingen låter" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informasjon" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Sangtekst" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Produsert av %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artist" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artister" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "utøvere" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Aldri" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d gang" msgstr[1] "%(n)d ganger" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "lagt til" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "sist spilt" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "avspillinger" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "hoppet over" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "vurdering" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "sti" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "varighet" #: ../quodlibet/qltk/information.py:289 msgid "format" msgstr "format" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "codec" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 msgid "encoding" msgstr "koding" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitfrekvens" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "filstørrelse" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "endret" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "Tillegg" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d valgt" msgstr[1] "%d valgte" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Spor utilgjengelig" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Sporliste" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d låt uten album" msgstr[1] "%d låter uten album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Valgt diskografi" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d låt uten artist" msgstr[1] "%d låter uten artist" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "album" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Total varighet:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Total størrelse:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Filer" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Last ned" #: ../quodlibet/qltk/lyrics.py:40 msgid "_Edit" msgstr "R_ediger" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Fant ingen sangtekst for denne låta." #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "Søker etter sangtekst …" #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "Er du sikker på at du vil fjerne alle låter?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "Valgte låter blir fjernet fra biblioteket." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "Vis" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "_Vis" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Vil du forkaste taggendringer?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tagger er endret, men ikke lagret. Vil du lagre filene, eller tilbakestille " "og forkaste alle endringer?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 msgid "_Revert" msgstr "_Tilbakestill" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Fila finnes" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "Vil du erstatte %(file-name)s?" #: ../quodlibet/qltk/msg.py:94 msgid "_Replace File" msgstr "_Erstatt fil" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Pågående oppgaver" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d kjørende oppgaver" #: ../quodlibet/qltk/playorder.py:254 msgid "Toggle shuffle mode" msgstr "Slå av/på tilfeldig rekkefølge" #: ../quodlibet/qltk/playorder.py:270 msgid "Toggle repeat mode" msgstr "Slå av/på gjentakelse" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Programtillegg-feil" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Slått på" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Slått av" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Ingen kategori" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "Hendelser" #: ../quodlibet/qltk/pluginwin.py:170 msgid "Play Order" msgstr "Avspillingsrekkefølge" #: ../quodlibet/qltk/pluginwin.py:171 msgid "Editing" msgstr "Redigering" #: ../quodlibet/qltk/pluginwin.py:173 msgid "Covers" msgstr "Omslag" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Fant ingen programtillegg." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Programtillegg" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Vis _feil" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Plate" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Spor" #: ../quodlibet/qltk/prefs.py:47 msgid "Grou_ping" msgstr "Gru_ppering" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Filnavn" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Varighet" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Hopp til spillende låt automatisk" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Hopp til gjeldende spor i låtliste ved låtbytte" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Annet:" #: ../quodlibet/qltk/prefs.py:88 msgid "_Edit…" msgstr "R_ediger …" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Legg til eller fjern tilleggskolonner" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Synlige kolonner" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Tittel inkluderer _versjon" #: ../quodlibet/qltk/prefs.py:106 msgid "Artist includes all _people" msgstr "Artist inneholder alle _personer" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Album inneholder _plate-undertittel" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Filnavn inneholder _mappe" #: ../quodlibet/qltk/prefs.py:123 msgid "Column Preferences" msgstr "Kolonneoppsett" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "Bruk gjeldende oppsett på låtliste, og legg til nye kolonner i slutten" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Låtliste" #: ../quodlibet/qltk/prefs.py:222 msgid "Edit Columns" msgstr "Rediger kolonner" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "Total varighet" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Globalt filter:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Bruk denne spørringa i tillegg til andre" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 msgctxt "heading" msgid "Search" msgstr "Søk" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Utforskere" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Bekreft _multi-vurdering" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Be bruker om å bekrefte endring av vurderingskarakter for flere låter " "samtidig" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Slå på _énklikksvurdering" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "Slå på vurdering ved å trykke på vurderingskolonnen i låtlista" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Vurderinger" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Foretrekk _innebygd omslag" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "Foretrekk omslagsbilder som er innebygd i lydfiler" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "_Fast bildefilnavn:" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "Bildefilnavn som skal brukes hvis dette er valgt" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "Omslagsbildefil som skal brukes ved tvang" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Albumomslag" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Avspilling" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Utdata-oppsett" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Juster volum med denne verdien på låter som ikke har Replay Gain-informasjon" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "_Tilbakefalls-forsterkning (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Juster volum med denne verdien på alle låter, så lenge det ikke fører til " "forvregning" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "_For-forsterkning (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "_Slå på Replay Gain-volumjustering" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Replay Gain-volumjustering" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "_Forvalgt vurdering:" #: ../quodlibet/qltk/prefs.py:493 msgid "Rating _scale:" msgstr "Vurderings_skala:" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Bayesisk gjennomsnittsfaktor (C) for aggregerte vurderinger.\n" "0 betyr typisk gjennomsnitt, og høyere verdier betyr at album med færre spor " "får mindre ekstreme vurderinger. Alle album får ny kalkulert vurdering hvis " "du endrer denne verdien." #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "_Bayesisk gjennomsnittsmengde:" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Lagre vurderinger og avspillings_antall" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_E-post:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Vurderinger og statistikk blir knyttet til denne e-postadressen" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Lagre taggendringer automatisk" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Lagre endringer av tagger uten å be om bekreftelse ved endring av flere filer" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Liste over skilletegn som skal brukes ved oppdeling av taggverdier. Selve " "lista bruker mellomrom som skilletegn" #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Tagger" #: ../quodlibet/qltk/prefs.py:631 msgid "Updating for new ratings" msgstr "Ser etter nye vurderinger" #: ../quodlibet/qltk/prefs.py:641 msgid "Scan library _on start" msgstr "Søk gjennom bibliotek ved _oppstart" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 msgid "_Scan Library" msgstr "_Søk gjennom bibliotek" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Se etter endringer i biblioteket" #: ../quodlibet/qltk/prefs.py:658 msgid "Re_build Library" msgstr "_Bygg bibliotek på nytt" #: ../quodlibet/qltk/prefs.py:661 msgid "Reload all songs in your library. This can take a long time." msgstr "Laster inn hele biblioteket på nytt (dette kan ta lang tid)." #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "Søk gjennom mapper" #: ../quodlibet/qltk/prefs.py:677 msgid "Hidden Songs" msgstr "Skjulte låter" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s og %(count)d annen" msgstr[1] "%(title)s og %(count)d andre" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Egenskaper" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Kø" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Tøm" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d låt (%(time)s)" msgstr[1] "%(count)d låter (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Utforsk bibliotek" #: ../quodlibet/qltk/quodlibetwindow.py:395 msgid "Toggle queue visibility" msgstr "Vis/skjul kø" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "Avspillingsfeil" #: ../quodlibet/qltk/quodlibetwindow.py:524 msgid "Set up library directories?" msgstr "Vil du sette opp bibliotekmapper?" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "Du har ikke satt opp et musikkbibliotek. Vil du gjøre det nå?" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "_Ikke nå" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "_Sett opp" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Klarte ikke å legge til låter" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s bruker en ustøttet protokoll." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Hopp til spillende låt" #: ../quodlibet/qltk/quodlibetwindow.py:986 msgid "_File" msgstr "_Fil" #: ../quodlibet/qltk/quodlibetwindow.py:987 msgid "_Song" msgstr "_Låter" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Visning" #: ../quodlibet/qltk/quodlibetwindow.py:989 msgid "_Browse" msgstr "_Bla gjennom" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Kontroll" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Hjelp" #: ../quodlibet/qltk/quodlibetwindow.py:997 msgid "_Add a Folder…" msgstr "_Legg til mappe …" #: ../quodlibet/qltk/quodlibetwindow.py:1002 msgid "_Add a File…" msgstr "_Legg til fil …" #: ../quodlibet/qltk/quodlibetwindow.py:1007 msgid "_Add a Location…" msgstr "_Legg til plassering …" #: ../quodlibet/qltk/quodlibetwindow.py:1036 msgid "Edit Bookmarks…" msgstr "Rediger bokmerker …" #: ../quodlibet/qltk/quodlibetwindow.py:1056 msgid "Stop After This Song" msgstr "Stopp etter denne låta" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "_Tastatursnarveier" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Hjelp på nett" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Søk etter hjelp" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Legg til plassering" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Skriv inn plassering til en lydfil:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Klarte ikke å legge til plassering" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, python-format msgid "%s is not a valid location." msgstr "%s er en ugyldig plassering." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Legg til musikk" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 msgid "_Add Folders" msgstr "_Legg til mapper" #: ../quodlibet/qltk/quodlibetwindow.py:1379 msgid "Music Files" msgstr "Musikkfiler" #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "_Add Files" msgstr "_Legg til filer" #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Er du sikker på at du vil endre vurdering av %d låter?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "Gjeldende vurderinger blir fjernet" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Vurdering av valgte låter blir endret til «%s»" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 msgid "_Remove Rating" msgstr "_Fjern vurdering" #: ../quodlibet/qltk/ratingsmenu.py:98 msgid "Change _Rating" msgstr "Fjern _vurdering" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Erstatt mellomrom med _understrek" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Fjern tegn som ikke søttes av _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Fjern diakritiske merker" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Fjern tegn som ikke er en del av _ASCII" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Bare bruk _små bokstaver" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Endre filnavn" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Sti-mønstre" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 msgid "Edit saved patterns…" msgstr "Rediger lagrede mønstre …" #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Forhåndsvisning" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nytt navn" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Klarte ikke å endre filnavn" #: ../quodlibet/qltk/renamefiles.py:256 #, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Endring av navn fra <b>%(old-name)s</b> til <b>%(new-name)s</b> mislyktes. " "Målfila finnes allerede, eller du mangler tillatelser til enten å lage den " "nye fila eller fjerne den gamle." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Ignorer _alle feil" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Fortsett" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Stien er ikke absolutt" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Mønsteret\n" "\t<b>%s</b>\n" "inneholder «/», men starter ikke fra rotmappe. For å unngå feilutformede " "mappenavn må du begynne mønsteret med «/» eller «~/»." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Låter som ligger i disse mappene blir lagt til når du oppdaterer biblioteket" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Velg mapper" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Lagrede søk" #: ../quodlibet/qltk/searchbar.py:53 msgid "Edit saved searches…" msgstr "Rediger lagrede søk …" #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "Søk i bibliotek ved bruk av fritekst eller QL-spørringer" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Søk e_tter skriving" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Vil søketreff når bruker slutter å skrive." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Grense:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Vekting" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Vis gjenstående tid" #: ../quodlibet/qltk/shortcuts.py:16 msgid "Main Window" msgstr "Hovedvindu" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "Hopp 10 sekunder bakover" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "Hopp 10 sekunder framover" #: ../quodlibet/qltk/shortcuts.py:19 msgid "Focus the search entry" msgstr "Fokuser på søkefelt" #: ../quodlibet/qltk/shortcuts.py:22 msgid "Reset filters and jump to the playing song" msgstr "Tilbakestill filtre og hopp til spillende låt" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "Åpne informasjonsvindu for valgte låter" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "Åpne taggbehandler for valgte låter" #: ../quodlibet/qltk/shortcuts.py:28 msgid "Queue the selected songs" msgstr "Legg valgte låter i kø" #: ../quodlibet/qltk/shortcuts.py:29 msgid "Delete the selected songs" msgstr "Slett valgte låter" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "Vis søketekst" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "Venstreklikk på kolonneoverskrift" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "Legg til kolonne i lista over kolonner som låter blir sortert på" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "Trevisning" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "Folder sammen element eller velger forelder-element" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "Utvider element" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "Tekstskriving" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "Gjør om siste angrede endring" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "Velg alle låter i faner" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtrer på %s" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "Alle _hoder" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Sporkolonner" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Albumkolonner" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Personkolonner" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Datokolonner" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_Filkolonner" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Produksjonskolonner" #: ../quodlibet/qltk/songlist.py:1115 msgid "_Customize Headers…" msgstr "_Tilpass hoder …" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "_Utvid kolonne" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "Vil du kjøre tillegget «%(name)s» på %(count)d låt?" msgstr[1] "Vil du kjøre tillegget «%(name)s» på %(count)d låter?" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "Vil du kjøre tillegget «%(name)s» på %(count)d album?" msgstr[1] "Vil du kjøre tillegget «%(name)s» på %(count)d album?" #: ../quodlibet/qltk/songsmenu.py:149 msgid "Configure Plugins…" msgstr "Sett opp tillegg …" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Legg i _kø" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Kopier til enhet" #: ../quodlibet/qltk/songsmenu.py:378 msgid "_Remove from Library" msgstr "_Fjern fra bibliotek" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Erstatt _understrek med mellomrom" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Tittelversaliser tagger" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Del opp i flere _verdier" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tagger fra sti" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Tagger erstatter gjeldende tagger" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Tagger legges til gjeldende tagger" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "Lagre" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Mønsteret\n" "\t<b>%s</b>\n" "er ugyldig. Det inneholder enten samme tagg flere ganger, eller har " "ubalanserte parenteser (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Ugyldige tagger" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Taggene <b>%s</b> er ugyldige\n" "\n" "Valgte filer støtter ikke redigering av disse taggene." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Mønsteret du skrev inn er ugyldig. Pass på å skrive < og > som " "«\\<» og «\\>», og se til at taggene er balansert.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Rediger visning" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Spornummer" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Start fr_a:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Totalt antall:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Spill av/pause" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Forrige" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "og %d andre …" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Lagrer endrede låter." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d låter lagret\n" "(%(remaining)s gjenstår)" #: ../quodlibet/qltk/wlw.py:234 #, python-format msgid "%(current)s of %(all)s" msgstr "%(current)s av %(all)s" #: ../quodlibet/update.py:89 msgid "Checking for Updates" msgstr "Ser etter oppdateringer" #: ../quodlibet/update.py:124 msgid "Connection failed" msgstr "Tilkobling mislyktes" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "Du bruker allerede nyeste versjon (%(version)s)" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" "Det har kommet en ny versjon (%(new-version)s)\n" "\n" "Du bruker nå versjon %(old-version)s\n" "\n" "Besøk <a href='%(url)s'>programnettstedet</a>\n" "for å laste ned ny versjon" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "Spillelister må ha navn" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Det finnes allerede en spilleliste med navnet %s." #: ../quodlibet/util/cover/built_in.py:26 msgid "Embedded album covers" msgstr "Innebygde album-omslag" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "Bruker innebygde omslagsbilder." #: ../quodlibet/util/cover/built_in.py:49 msgid "Filesystem cover" msgstr "Filsystem-omslag" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "Bruker omslagsbildefiler som ligger i mapper sammen med låter." #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Vis kortfattet bruksinformasjon" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Vis versjon og opphavsrett" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Bruk: %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[valg]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Valget %r er ukjent." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Valget %r krever argument." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r er ikke et unikt prefiks." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%s sekund" msgstr[1] "%s sekunder" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Ingen tidsinformasjon" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekund" msgstr[1] "%d sekunder" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minutt" msgstr[1] "%d minutter" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d time" msgstr[1] "%d timer" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dag" msgstr[1] "%d dager" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d år" msgstr[1] "%d år" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 msgctxt "check" msgid "titlecase?" msgstr "kontroller|tittelversaler" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Dato må skrives inn i form av «ÅÅÅÅ», «ÅÅÅÅ-MM-DD» eller «ÅÅÅÅ-MM-DD TT:MM:" "SS»." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Replay Gain-forsterkninger må skrives inn i formatet «x.yy dB»." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Replay Gain-maksnivå må skrives inn i formatet «x.yy dB»." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz-ID-er skal være i UUID-format." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz-utgivelsesstatus må være «official», «promotional» eller " "«bootleg»." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Språk må velges med en tre-bokstavs ISO 639-2-kode" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Klarte ikke å redigere låt" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Lagring av <b>%s</b> mislyktes. Fila kan være skrivebeskyttet, ødelagt, " "eller du mangler tillatelser til å redigere den." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Ugyldig tegnkoding]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arrangør" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arrangører" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "arrangement" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "opphavsrettseier" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "opphavsrettseiere" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "komponist" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "komponister" #: ../quodlibet/util/tags.py:78 msgid "composition" msgstr "komposisjon" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "dirigenter" #: ../quodlibet/util/tags.py:80 msgid "conducting" msgstr "dirigering" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "opphavsrett" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "dato" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "beskrivelse" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "sjanger" #: ../quodlibet/util/tags.py:85 msgid "genres" msgstr "sjangrer" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "utøver" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "gruppering" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "språk" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "lisens" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "sted" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "sangtekstforfatter" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "sangtekstforfattere" #: ../quodlibet/util/tags.py:91 msgid "lyrics" msgstr "sangtekst" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organisasjon" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "tittel" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versjon" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "nettsted" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "albumartist" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "plate-undertittel" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "plate" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "spor" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "platemerke-ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "opprinnelig utgivelsesdato" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "opprinnelig album" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "opprinnelig artist" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "innspillingsdato" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "utgivelsesland" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz recording ID" msgstr "MusicBrainz-innspillings-ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz release track ID" msgstr "MusicBrainz-utgivelsesspor-ID" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "MusicBrainz-utgivelses-ID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz artist ID" msgstr "MusicBrainz-artist-ID" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz release artist ID" msgstr "MusicBrainz-utgivelsesartist-ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz-TRM-ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP-PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz-albumstatus" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz-albumtype" #: ../quodlibet/util/tags.py:129 msgid "MusicBrainz release group ID" msgstr "MusicBrainz-utgivelsesgruppe-ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "sporforsterkning" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "spor-maksverdi" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "albumforsterkning" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "album-maksverdi" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "referansenivå" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "plater" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "spor" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "sist startet" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "fullt navn" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "monteringspunkt" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "personer" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "år" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "opprinnelig utgivelsesår" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "bokmerke" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "filformat" #: ../quodlibet/util/tags.py:165 msgid "playlists" msgstr "spillelister" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "antall kanaler" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "sortering" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "roller" #~ msgid "Remove all songs from the queue" #~ msgstr "Fjern alle låter fra kø" #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "Klarte ikke å importere %s. Lydstrøm-utforsker slått av." #~ msgid "High Res" #~ msgstr "Høy oppløsning" #~ msgid "Audio Backend Failed to Load" #~ msgstr "Klarte ikke å laste inn lyd-bakstykke" #~ msgid "" #~ "Loading the audio backend '%(name)s' failed. Audio playback will be " #~ "disabled." #~ msgstr "" #~ "Innlasting av lyd-bakstykke «%(name)s» mislyktes. Avspilling av lyd er " #~ "slått av." #~ msgid "_Open" #~ msgstr "_Åpne" #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Det har oppstått en programfeil i Quod Libet. En fil med informasjon om " #~ "feilen er lagret som <b >%(dump-path)s</b>. Vi ber om at du rapporterer " #~ "dette som en ny programfeil via %(new-issue-url)sog legger ved innholdet " #~ "i denne fila. Den kan inneholde informasjon som identifiserer deg og/" #~ "eller systemet ditt, som f.eks. en liste over filer som er blitt spilt av " #~ "nylig. Bruk heller fila <b>%(mini-dump-path)s</b> og beskriv hva du " #~ "gjorde da feilen oppstod hvis du ikke vil at personlig informasjon skal " #~ "bli med i rapporten." #~ msgid "" #~ "Quod Libet may now be unstable. Closing it and restarting is recommended. " #~ "Your library will be saved." #~ msgstr "" #~ "Quod Libet kan nå oppføre seg ustabilt. Du bør lukke programmet og starte " #~ "det på nytt. Biblioteket blir lagret som normalt." #~ msgid "Watch this folder for new songs" #~ msgstr "Se etter nye låter i denne mappa" #~ msgid "Controls the tone of your music with an equalizer." #~ msgstr "Kontrollerer overtoner i musikken med en «equalizer»." #~ msgid "browsers" #~ msgstr "utforskere" #~ msgid "tooltip" #~ msgstr "hjelpeboble" #~ msgid "Event Logging" #~ msgstr "Loggføring av hendelser" #~ msgid "Sends song events to the Zeitgeist event logging service." #~ msgstr "Sender låthendelser til Zeitgeist-loggtjeneste." #~ msgid "Unable to download lyrics." #~ msgstr "Klarte ikke å laste ned sangtekst." #~ msgid "Uninitialized iPod" #~ msgstr "iPod ikke klartgjort" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Vil du lage en tom database på denne iPod-en?" #~ msgid "_Create Database" #~ msgstr "_Lag database" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Volumforsterkning (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Kombiner tagger med _flere verdier" #~ msgid "Model:" #~ msgstr "Modell:" #~ msgid "Capacity:" #~ msgstr "Kapasitet:" #~ msgid "Firmware:" #~ msgstr "Fastvare:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Fjerner foreldreløst iPod-spor" #~ msgid "Saving iPod database…" #~ msgstr "Lagrer iPod-database …" #~ msgid "Unable to save iPod database" #~ msgstr "Klarte ikke å lagre iPod-database" #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "Fant ikke libgpod. Støtte for iPod er slått av." #~ msgid "Set or toggle the playback order" #~ msgstr "Velg eller bytt avspillingsrekkefølge" #~ msgid "Playback follows your selection." #~ msgstr "Avspilling følger utvalg." #~ msgid "Track Repeat" #~ msgstr "Gjenta låt" #~ msgid "Shuffle" #~ msgstr "Omstokket" #~ msgid "Weighted" #~ msgstr "Vektet" #~ msgid "_Weighted" #~ msgstr "_Vektet" #~ msgid "_One Song" #~ msgstr "_Én låt" #~ msgid "Restart the playlist when finished" #~ msgstr "Spill av spillelista på nytt når den er ferdig" #~ msgid "Disable Browser" #~ msgstr "Slå av utforsker" #~ msgid "_Disable Browser" #~ msgstr "_Slå av utforsker" #, fuzzy #~ msgid "Force Write" #~ msgstr "Skriv" #~ msgid "Filter on _Genre" #~ msgstr "Filtrer på _sjanger" #~ msgid "Filter on _Artist" #~ msgstr "Filtrer på _artist" #~ msgid "Filter on Al_bum" #~ msgstr "Filtrer på al_bum" #~ msgid "_Music" #~ msgstr "_Musikk" #~ msgid "Add Bookmark" #~ msgstr "Legg til bokmerke" #~ msgid "Song _List" #~ msgstr "Låt_liste" #~ msgid "D:" #~ msgstr "D:" #~ msgid "W:" #~ msgstr "A:" #~ msgid "E:" #~ msgstr "F:" #~ msgid "Stop _after this song" #~ msgstr "Stopp _etter denne låta" #~ msgid "_Release:" #~ msgstr "_Utgivelse:" #~ msgid "%d _release:" #~ msgid_plural "%d _releases:" #~ msgstr[0] "%d utgivelse:" #~ msgstr[1] "%d _utgivelser:" #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "%d resultat funnet." #~ msgstr[1] "%d resultater funnet." #~ msgid "Split _disc from album" #~ msgstr "Trekk platenummer ut av album" #, fuzzy #~ msgid "Timeout" #~ msgstr "Tid" #~ msgid "Select an album" #~ msgstr "Velg alle" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s og %(count)d til" #~ msgstr[1] "%(title)s og %(count)d til" #~ msgid "Playlist Export" #~ msgstr "Eksporter spillelister" #~ msgid "Re_fresh Library" #~ msgstr "_Oppdater bibliotek" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Vurdering" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Klarte ikke å åpne filer" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Ugyldig verdi" #~ msgid "command|filename" #~ msgstr "kommando|filnavn" #~ msgid "command|tag" #~ msgstr "kommando|tagg" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Søk" #~ msgid "%d of %d" #~ msgstr "%d av %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Bruk: %s %s" #~ msgid "_Download..." #~ msgstr "_Last ned..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Ny stasjon" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Skrive over <b>%s</b>?" #, fuzzy #~ msgid "Output Error" #~ msgstr "_Utdatalogg" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet kjører allerede." #~ msgid "No song is currently playing." #~ msgstr "For øyeblikket spilles ingen låt." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Klarte ikke å skrive til %s. Fjerner den." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Rediger bokmerker..." #~ msgid "_New Folder..." #~ msgstr "_Ny mappe..." #~ msgid "_Add to Playlist" #~ msgstr "_Legg til spilleliste" #~ msgid "_Edit Display..." #~ msgstr "_Rediger visning..." #, fuzzy #~ msgid "Output Log" #~ msgstr "_Utdatalogg" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d stasjon" #~ msgid "_Add a Location..." #~ msgstr "_Legg til en adresse..." #~ msgid "_Output Log" #~ msgstr "_Utdatalogg" #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "Kolonne_instillinger..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "_Sporkolonner" #, fuzzy #~ msgid "People Headers" #~ msgstr "_Personkolonner" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Albumkolonner" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Datokolonner" #, fuzzy #~ msgid "File Headers" #~ msgstr "_Filkolonner" #, fuzzy #~ msgid "Production Headers" #~ msgstr "_Produksjonskolonner" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Tagg:" #, fuzzy #~ msgid "Warnings" #~ msgstr "_Vurdering" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "album-artist" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "artister" #, fuzzy #~ msgid "album (sort)" #~ msgstr "album-artist" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "utøvere" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "utøvere" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz album-artist-ID" #~ msgid "errors" #~ msgstr "feil" #~ msgid "Permanently delete this file?" #~ msgstr "Slett denne filen permanent?" #~ msgid "Permanently delete these files?" #~ msgstr "Slett disse filene permanent?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s og %(count)d annen..." #~ msgstr[1] "%(title)s og %(count)d andre..." #, fuzzy #~ msgid "Version:" #~ msgstr "versjon" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "_Fjern feilmeldinger" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "Klarte ikke å legge til %s i biblioteket.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Ingen utløsningskommando funnet." #~ msgid "Unable to start web browser" #~ msgstr "Klarte ikke å starte nettleseren" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Klarte ikke å finne en nettleser. Angi $BROWSER-variabelen, eller sørg " #~ "for at /usr/bin/sensible-browser finnes." #, fuzzy #~ msgid "Library Error" #~ msgstr "Bibliotekvisning" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Utdatalogg" #~ msgid "translator-credits" #~ msgstr "Eirik Haatveit" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Vis andre kolonner, separert av mellomrom" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "_Fortsett" #, fuzzy #~ msgid "Confirm rating" #~ msgstr "Informasjon" #~ msgid "Search your library" #~ msgstr "Søk i biblioteket ditt" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Opphavsrett 2004-2007 Joe Wreschnig, Michael Urman, og andre\n" #~ "\n" #~ "Dette er fri programvare, se kildekoden for kopieringsbetingelser.\n" #~ "Det finnes INGEN garanti, ikke engang for SALGBARHET eller SKIKKETHET\n" #~ "FOR ET BESTEMT FORMÅL.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Total størrelse:" #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet-programtillegg" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "Viser enkle søk i blått, avanserte i grønt, og ugyldige i rødt" #~ msgid "_Select" #~ msgstr "_Velg" #~ msgid "Separators for splitting tags" #~ msgstr "Separator for splitting av tagger" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet-instillinger" #~ msgid "Not Played To_day" #~ msgstr "Ikke spilt i _dag" #~ msgid "Not Played in a _Week" #~ msgstr "Ikke spilt på en _uke" #~ msgid "Not Played in a _Month" #~ msgstr "Ikke spilt på en _måned" #~ msgid "B_ottom 40" #~ msgstr "40 på _bunn" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "De 40 minst spilte låtene i biblioteket (det kan være mer enn 40 valgte, " #~ "om det er flere som har vært hørt på like mange ganger)" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | kontroll ]" #, fuzzy #~ msgid "Date" #~ msgstr "_Dato" #~ msgid "Choose New Stations" #~ msgstr "Velg nye stasjoner" #~ msgid "Add" #~ msgstr "Legg til" #, fuzzy #~ msgid "Bitrate" #~ msgstr "bitrate" #~ msgid "_Stations..." #~ msgstr "_Stasjoner..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Avslutt Quod Libet" #~ msgid "Unable to save library" #~ msgstr "Klarte ikke å lagre biblioteket" #~ msgid "Sort by title" #~ msgstr "Sorter etter tittel" #~ msgid "Sort by artist" #~ msgstr "Sorter etter artist" #~ msgid "Lyrics provided by %s." #~ msgstr "Låttekster fra %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Ingen låttekst funnet\n" #~ "\n" #~ "Du kan trykke på «Last ned»-knappen for å få Quod Libet til å søke etter " #~ "låttekster på nettet. Du kan også skrive dem inn selv, og trykke på " #~ "«Lagre»-knappen." #~ msgid "part" #~ msgstr "del " #~ msgid "Opening audio device." #~ msgstr "Åpner lydenhet." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d låter lagret" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz album-ID" #~ msgid "Unable to open audio device" #~ msgstr "Klarte ikke å åpne lydenhet" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet forsøkte å få tilgang til «autosink»- og «%(sink)s»-driverene, " #~ "men klarte ikke å åpne dem. Velg din GStreamer-kommandokø ved å endre " #~ "linjen med\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "i ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet klarte ikke å finne GStreamer-elementet «filesrc». Kontroller " #~ "GStreamer-installasjonen din." ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/pt.po����������������������������������������������������������������������������0000644�0001750�0001750�00000603550�13115512744�015357� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Portuguese/Brazil translation of Quod Libet. # Copyright (C) 2004 Joe Wreschnig # This file is distributed under the same license as the Quod Libet package. # Alexandre Passos <alexandre.tp@gmail.com>, 2006. # Djavan Fagundes <djavan@comum.org>, 2010. msgid "" msgstr "" "Project-Id-Version: Quod Libet 0.23\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2010-06-15 09:00-0300\n" "Last-Translator: Djavan Fagundes <djavan@comum.org>\n" "Language-Team: Portuguese/Brazil <gnome-l10n-br@listas.cipspa.org.br>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 0.5.2\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Editar informações em seus arquivos de som" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Editor de informações de músicas" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Ouça, navegue, ou edite sua coleção de músicas" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Reprodutor de músicas" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Título" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "Gênero" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "N_ota" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Ordenar por:" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Preferências" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Lista de álbuns" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Lista de á_lbuns" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Todos os álbuns" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d álbum" msgstr[1] "%d álbuns" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Mostrar _capas" msgstr[1] "Mostrar _capas" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Músicas sem álbum" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d faixa" msgstr[1] "%d faixas" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disco" msgstr[1] "%d discos" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Todos os álbuns" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Preferências da lista de álbuns" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Mostrar _capas" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Bu_sca inline inclui pessoa" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[opções]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Lista de álbuns" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Desconhecido" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Novo feed" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Entre a localização de um feed de áudio:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Feeds de áudio" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Feeds de áudio" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Download" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Baixar arquivos" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Baixar arquivo" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Impossível adicionar feed" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> não pôde ser adicionado. O servidor pode estar fora do ar, ou a " "localização pode não ser de um feed válido." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "Atuali_zar biblioteca" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Apagar arquivos" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "O backend atual de áudio não suporta URLs, assim, o navegador de feeds de " "áudio está desabilitado." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Navegador de biblioteca" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d música" msgstr[1] "%d músicas" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Padrão inválido" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Desconhecido" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Divide em vári_os valores" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Personalizado" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Remover Estação" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Etiqueta" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferências da lista de álbuns" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Tamanho total:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Tamanho total:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Preferências do navegador" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Mostrar _capas" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Todos os álbuns" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "Nenhuma estação nova" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Sistema de arquivos" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Sistema de arquivos" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Impossível copiar músicas" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Os arquivos selecionados não puderam ser copiados para outras listas de " "músicas ou para a fila de reprodução." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Adicionar à biblioteca" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Tipo de arquivo não suportado" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Listas de estações só podem conter localizações de estações, não outras " "listas de estações ou playlists. As seguintes localizações não puderam ser " "carregadas.\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Impossível adicionar estação" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Rádio via Internet" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Baixar arquivos" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Nova estação" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Favor entrar com a localização de uma estação de rádio via internet." #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "classificação" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Nova estação" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "Rádio via _Internet" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Nova estação" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_Nova estação" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Nova estação" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 #, fuzzy msgid "No Category" msgstr "Nenhuma categoria" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Nenhuma estação encontrada" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Nenhuma estação de rádio via internet foi encontrada em %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Todas as estações listadas já estão em sua biblioteca." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "_Adicionar à lista de reprodução" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "_Remover da lista de reprodução" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d estação" msgstr[1] "%(count)d estações" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Propriedades do aparelho" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Aparelho:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Não montado" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Ponto de montagem:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Nome:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Aparelhos externos" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Aparelhos externos" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Ejetar" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Propriedades" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Renomear" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> usado, <b>%s</b> disponível" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> não está conectado." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Copiando <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Impossível copiar a música" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Não existe espaço livre suficiente para essa música." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> não pôde ser copiado." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Impossível remover músicas" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Apagando <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> não pôde ser apagado." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Impossível apagar música" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Falha ao ejetar <b>%s</b> ." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Impossível ejetar aparelho" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" "Nenhum backend de dispositivo, assim o navegador de dispositivos multimídia " "está desabilitado." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Navegador" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Navegador" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Selecionar _todos" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Todos" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Preferências do navegador" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Listas de reprodução" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "Listas de re_produção" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Remover da lista de reprodução" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importar" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Nova lista de reprodução" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Impossível importar lista de reprodução" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet só pode importar lista de reprodução nos formatos M3U e PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Impossível renomear lista de reprodução" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importar lista de reprodução" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Nova lista de reprodução" #: ../quodlibet/browsers/playlists/menu.py:86 #, fuzzy, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" "Você irá alterar a classificação de %d músicas.\n" "Você tem certeza que deseja continuar?" msgstr[1] "" "Você irá alterar a classificação de %d músicas.\n" "Você tem certeza que deseja continuar?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Nova lista de reprodução" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Preferências do navegador" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Listas de reprodução" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Digite o nome da nova lista de reprodução:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importando lista de reprodução.\n" "\n" "%(current)d/%(total)d músicas adicionadas." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Limitar resultados" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Buscar na biblioteca" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Buscar na biblioteca" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Navegador" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Buscar" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "localização" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet não está em execução." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "uma biblioteca e um reprodutor de músicas" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[opções]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Exibe a música que está tocando e sai" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Começar a tocar imediatamente" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Ir para a próxima música" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Ir para a música anterior" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Começar a tocar" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pausar reprodução" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Altera o estado tocando/pausado" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Começar a tocar" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Aumenta o volume" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Diminui o volume" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Escreve o status (tocando/pausado)" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Oculta a janela principal" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Mostra a janela principal" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Altera a visibilidade da janela principal" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Focaliza o player que está rodando" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Remover filtros de navegador ativo" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Atualizar e re-escanear biblioteca" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Desabilitar navegador" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Mostra a playlist atual" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Mostra conteúdo da fila" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Mostra conteúdo da fila" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet não está em execução." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Sair do Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Avança/retorna na música atual" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Altera o estado tocando/pausado" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Liga, desliga ou alterar o modo repetir" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Ajusta o volume" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Buscar na sua biblioteca" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "busca" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Reproduz um arquivo" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "nome de arquivo" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Avaliar música atual" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Editar o navegador atual" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Avaliar música atual" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Abre um novo navegador" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Mostrar ou ocultar a fila" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Mostrar ou ocultar a lista de músicas" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtrar por um valor aleatório" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "tag" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtrar por uma etiqueta" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=valor" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Enfileirar um arquivo ou busca" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "nome de arquivo" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Desenfileirar um arquivo ou busca" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Argumento inválido para '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Tente %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Aparelho desconhecido" #: ../quodlibet/devices/__init__.py:32 #, fuzzy, python-format msgid "Could not import %s, which is needed for device support." msgstr "" "Não foi possível importar o dbus-python, que é necessário para suporte a " "dispositivos." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r não é um dispositivos com suporte." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Não foi possível encontrar o media-player-info." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Inicializando o backend de dispositivo." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Tentando '%s'" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Não foi possível conectar ao backend de dispositivo." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Backend de dispositivos inicializado." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Formato do _nome de arquivo:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Mostrar _capas" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Remover capas e diretórios não-utilizados" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Houve um erro" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Ignorar _todos os erros" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "descrição" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "um editor de informações de músicas" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "diretório" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Codificação Inválida]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Título" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor de informações de músicas" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_Valores dependentes da caixa do título" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Preferências do navegador" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 #, fuzzy msgid "Animated On-Screen Display" msgstr "_On-Screen Display" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Tamanho total:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Editar exibição" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Ponderado" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 #, fuzzy msgid "_Outline" msgstr "Saída d_o pipeline:" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editar exibição" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Visualizar" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 #, fuzzy msgid "Party" msgstr "_Part" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "O backend atual de áudio não suporta URLs, assim, o navegador de feeds de " "áudio está desabilitado." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "1 second" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Personalizado" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "Limpar _erros" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Reprodutor de músicas" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Rádio via Internet" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "N_ota" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "Set Rating" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Impossível gravar música" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Nenhum plug-in foi encontrado." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Letras" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Limpar busca" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Letras" #: ../quodlibet/ext/events/lyricswindow.py:348 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "Ver e editar tags na música atual" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "localização" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Oculta a janela principal" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Preferências" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d música" #: ../quodlibet/ext/events/mqtt.py:138 #, fuzzy msgid "Plain text for when there is no current song" msgstr "Pause/resume the current song" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Registro de saída" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Não foi possível conectar ao backend de dispositivo." #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "localização" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Título" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 #, fuzzy msgid "Show notifications" msgstr "Nenhuma estação nova" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Não foi possível conectar ao backend de dispositivo." #: ../quodlibet/ext/events/notify.py:251 #, fuzzy msgid "Song Notifications" msgstr "Nenhuma estação nova" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 #, fuzzy msgid "Next" msgstr "_Next" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, fuzzy, python-format msgid "Could not contact service '%s'." msgstr "Não foi possível conectar ao backend de dispositivo." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Aparelho:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Nome:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Outros:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "Formato do _nome de arquivo:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Ál_bum aleatório" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "álbums" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Ponderado" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Ál_bum aleatório" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Importar lista de reprodução" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importar" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Letras" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Play _song" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "Plain text for status when there is no current song" msgstr "Pause/resume the current song" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d música" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Não tocando" #: ../quodlibet/ext/events/trayicon/__init__.py:53 #, fuzzy msgid "Tray Icon" msgstr "Preferências do Ícone" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "Reprodutor" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "_Pause" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "Pre_vious" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 #, fuzzy msgid "_Next" msgstr "_Next" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Embaralhado" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Repetir" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Parar após essa música" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Abre um novo navegador" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Editar Etique_tas" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informação" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Listas de reprodução" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 #, fuzzy msgid "Scroll wheel adjusts volume" msgstr "" "Roda do mouse ajusta volume;\n" "Shift e roda do mouse troca de música" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 #, fuzzy msgid "Scroll _Wheel" msgstr "Roda do Mouse" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Mostrar Dicas" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Letras" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Letras" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Erros" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Arquivos" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Visualizar" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Filtrar por _artista" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 #, fuzzy msgid "Default" msgstr "Set Rating" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Personalizado" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Filtrar por _gênero" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Filtrar por _artista" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Feeds de áudio" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Entre a localização de um feed de áudio:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Importar lista de reprodução" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importar" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Nenhuma estação encontrada" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "Formato do _nome de arquivo:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "Formato do _nome de arquivo:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Remove tag selecionada" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, fuzzy, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" "Você irá alterar a classificação de %d músicas.\n" "Você tem certeza que deseja continuar?" msgstr[1] "" "Você irá alterar a classificação de %d músicas.\n" "Você tem certeza que deseja continuar?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Nova lista de reprodução" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "reproduzida pela última vez" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "Enfileirada" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Nunca" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "pular contagem" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Valores gravados" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Não foi possível conectar ao backend de dispositivo." #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Renomear" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Biblioteca" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Oculta a janela principal" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Nome de arquivo" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Impossível gravar música" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Lista de álbuns" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Tamanho" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Busca:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Lista de álbuns" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Editar marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editar marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Marcadores" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tipo de álbum MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nome de arquivo" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Disco" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Faixa" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Título" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Artista" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tipo de álbum MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "busca" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Nenhum plug-in foi encontrado." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Navegadores" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Impossível criar pasta" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Renomear" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "padrão" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Valor inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Personalizado" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Impossível copiar músicas" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Desabilitar navegador" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Duplicate Key" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_Remover Estação" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "New/Edit Playlist" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 #, fuzzy msgid "Skip Count" msgstr "pular contagem" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "Remove tag selecionada" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrar por uma etiqueta" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "O GStreamer não conseguiu carregar as músicas selecionadas." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Filtrar por _gênero" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Enfileirada" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Escrever" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "diretório" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "Cabeçalhos de á_lbuns" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Nova estação" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Importar lista de reprodução" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 #, fuzzy msgid "Error during sync" msgstr "Erro carregando %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Renomear" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Importar lista de reprodução" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Informação" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Importar lista de reprodução" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Impossível importar lista de reprodução" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Falha ao ejetar <b>%s</b> ." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Atuali_zar biblioteca" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Atuali_zar biblioteca" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Editar etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Editar etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Todos os álbuns" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Visualizar" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Etiqueta" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Impossível remover músicas" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "Invalid Pattern" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Editar valores gravados..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Colorir itens da _busca" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Biblioteca" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Verificando pontos de montagem" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Lendo biblioteca" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Checando %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Mostrar etiquetas _programáticas" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 #, fuzzy msgid "Too many arguments" msgstr "Muitos erros" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "description" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Valor" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor de informações de músicas" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Nenhuma música selecionada." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "_Remover Estação" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "Remove tag selecionada" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Filtrar por uma etiqueta" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Filtrar por uma etiqueta" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Nenhuma informação de tempo" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Impossível renomear arquivo" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "Remove tag selecionada" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Arquivo" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Mostra breve instrução de uso" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> não é uma localização válida." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Desconhecido" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Em ordem" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "Em _ordem" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "A_leatório" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "A_leatório" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Repetir" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Uma música" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 #, fuzzy msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "O pipeline de saída do GStreamer usado para reprodução, como 'alsasink " "dispositivo=padrão'. Deixar em branco para pipeline padrão." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "Saída d_o pipeline:" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "1 second" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nenhum dispositivo de som encontrado" #: ../quodlibet/player/gstbe/util.py:112 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Saída do pipeline do GStreamer inválida, tentando o padrão." #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Impossível criar saída de áudio" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "O dispositivo de áudio %r não foi encontrado. Verifique as suas " "configurações do Xine em ~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Plug-ins" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Formatos suportados: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Dispositivo de som: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Início" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Tempo" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Nome do marcador" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Marcadores" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtros" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "_Nunca reproduzidas" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 _mais" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "All songs" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "_Gênero aleatório" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "_Artista aleatório" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Ál_bum aleatório" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "As quarenta músicas mais tocadas (mais de quarenta podem ser escolhidas se " "houver empates)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Valor:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Valores gravados" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Editar valores gravados..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "Cabeçalhos de Faixa" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "Cabeçalhos de á_lbuns" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ajuste de volume de ganho de reprodução" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Desconhecido" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Filtrar por uma etiqueta" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Arquivos" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Apagar arquivos" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Mover para a lixeira" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Movendo %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "Impossível gravar biblioteca do iPod" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Falha ao ejetar <b>%s</b> ." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Apagando %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Impossível apagar arquivo" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Apagar <b>%s</b> falhou." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Downloads" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Tamanho" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "faltando em %d música" msgstr[1] "faltando em %d músicas" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "diferente em %d música" msgstr[1] "diferente em %d músicas" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Divide em vári_os valores" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Separar disco de á_lbum" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Separar _versão de título" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Separar arranjador de ar_tista" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Separar _intérprete de artista" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Separar _intérprete de artista" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Separar _versão de título" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Adicionar uma etiqueta" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "Etique_ta:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Editar etiquetas" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Mostrar etiquetas _programáticas" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Nunca" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Impossível adicionar etiqueta" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Impossível adicionar música" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Não é possível adicionar <b>%s</b>\n" "\n" "Os arquivos selecionados não suportam múltiplos valores." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Etiqueta inválida" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Etiqueta <b>%s</b> inválida\n" "\n" "Os arquivos selecionados não suportam a edição desta etiqueta." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Valor inválido" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Valor inválido: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Etiqueta pode não ser exata" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> mudou com o programa sendo executado. Gravar sem atualizar a " "biblioteca pode sobrescrever outras mudanças à música.\n" "\n" "Gravar mesmo assim?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Impossível gravar música" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Gravar <b>%s</b> falhou. O arquivo pode ser somente leitura, estar " "corrompido , ou você pode não ter permissão para editá-lo." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Mais opções..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "_About" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Plug-ins" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s e %(count)d mais" msgstr[1] "%(title)s e %(count)d mais" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Preferências do Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Separar _em:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Edição de etiquetas" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Pastas" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Nova pasta" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Selecionar todas as subpastas" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Nova pasta" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Entre com o nome da nova pasta:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Impossível criar pasta" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Impossível remover pasta" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Músicas" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "por %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disco %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Faixa %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Editar exibição" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Nenhuma música selecionada." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Nenhuma música" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informação" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Letras" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Produzido por %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artistas" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "intérpretes" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Nunca" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d vez" msgstr[1] "%(n)d vezes" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "adicionado" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "reproduzida pela última vez" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "reproduz" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "pula" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "classificação" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "duração" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Informação" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[Codificação Inválida]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "taxa de bits" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "tamanho do arquivo" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "modificado" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d selecionado" msgstr[1] "%d selecionados" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Faixa indisponível" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Lista de faixas" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d música sem álbum" msgstr[1] "%d músicas sem álbum" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Discografia selecionada" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d música sem artista" msgstr[1] "%d músicas sem artistas" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "álbums" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Duração total:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Tamanho total:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Arquivos" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Editar display..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Letras dessa música não encontradas" #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Buscando letras..." #: ../quodlibet/qltk/maskedbox.py:20 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "" "Você irá alterar a classificação de %d músicas.\n" "Você tem certeza que deseja continuar?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Descartar mudanças?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tags foram mudadas, mas não gravadas. Gravar esses arquivos, ou reverter e " "descartar mudanças?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Nunca" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Arquivo existe" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Renomear arquivos" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, fuzzy, python-format msgid "%d tasks running" msgstr "Quod Libet está rodando" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Altera o estado tocando/pausado" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Altera o estado tocando/pausado" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Erros dos plug-ins" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Habilitado" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Desabilitado" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Nenhuma categoria" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Ordem de Reprodução" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Edição de etiquetas" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Tamanho total:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Nenhum plug-in foi encontrado." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Plug-ins" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Mostrar _erros" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disco" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Faixa" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "agrupamento" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Ál_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Nome de arquivo" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "Du_ração" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Pular automaticamente para a música atualmente sendo reproduzida" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Quando a música reproduzida mudar, mostrá-la na lista" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Outros:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Editar display..." #: ../quodlibet/qltk/prefs.py:91 #, fuzzy msgid "Add or remove additional column headers" msgstr "Set and save column headers" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Colunas visíveis" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Título inclui _versão" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Bu_sca inline inclui pessoa" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Álbum inclui legenda do _disco" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Nome de arquivo inclui _pasta" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Preferências" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Lista de músicas" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Colunas visíveis" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Filtro global:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Buscar" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Navegadores" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Confirmar _múltiplas classificações" #: ../quodlibet/qltk/prefs.py:295 #, fuzzy msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Pede confirmação antes de alterar a classificação de múltiplas faixas de uma " "vez" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Habilitar classificação de u_m clique" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Habilita a classificação clicando na coluna de classificação na lista de " "músicas" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Classificações" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Lista de álbuns" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Pausar reprodução" #: ../quodlibet/qltk/prefs.py:362 #, fuzzy msgid "Output Configuration" msgstr "Registro de saída" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Se a informação de ganho de replay não está disponível para a música, coloca " "o volume neste valor." #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Ganho de fall-back (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Ajusta o volume para todas as músicas para este valor, contanto que o " "resultado não será cortado" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Ganho de pre-amp (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "Habilitar o ajuste de volume de ganho de _replay" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Ajuste de volume de ganho de reprodução" #: ../quodlibet/qltk/prefs.py:450 #, fuzzy msgid "_Default rating:" msgstr "Set Rating" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "Classificações" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Salvar _classificações e contagem de reproduções" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Notas e contagens de reproduções serão enviadas para esse email" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Descartar mudanças?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Editar etiquetas" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Nova estação" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "Atuali_zar biblioteca ao iniciar" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Buscar na biblioteca" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Checar por mudanças na biblioteca" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Re_carregar biblioteca" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Recarregar todas as músicas na biblioteca (isso pode demorar muito)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Escanear _diretórios" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Nenhuma música" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s e %(count)d mais" msgstr[1] "%(title)s e %(count)d mais" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Propriedades" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Fila de reprodução" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "Limpar _erros" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d música (%(time)s)" msgstr[1] "%(count)d músicas (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Navegar pela biblioteca" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Altera a visibilidade da janela principal" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Pausar reprodução" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Selecionar diretórios" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Impossível adicionar músicas" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> utiliza um protocolo não-suportado." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Ir para a música atual" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Arquivo" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Músicas" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Ver" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Navegadores" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Controle" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "A_juda" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "_Adicionar uma pasta..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "_Adicionar um arquivo..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Adicionar uma localização" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editar marcadores..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Parar após essa música" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Buscar" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Adicionar uma localização" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Entre a localização de um arquivo de som:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Impossível adicionar estação" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> não é uma localização válida." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Adicionar música" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Adicionar uma pasta..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Reprodutor de músicas" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Adicionar um arquivo..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, fuzzy, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" "Você irá alterar a classificação de %d músicas.\n" "Você tem certeza que deseja continuar?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Remover Estação" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "N_ota" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Substituir espaços por _underscores" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Substituir caracteres incompatíveis com o _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Retirar _marcas diacríticas" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Substituir caracteres não-_ASCII" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Renomear arquivos" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "Invalid Pattern" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Editar valores gravados..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Visualizar" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Novo nome" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Impossível renomear arquivo" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Renomear <b>%s</b> para <b>%s</b> falhou. Possivelmente o novo nome já está " "usado, ou você não tem permissão para criar o novo arquivo ou apagar o velho." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Ignorar _todos os erros" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Continue" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Caminho não é absoluto" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "O padrão\n" "\t<b>%s</b>\n" "contem / mas não começa do diretório raiz. Para evitar pastas com os nomes " "incorretos, inicie o seu padrão por / ou ~/." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Músicas nessas pastas (separadas por ':') serão adicionadas à sua biblioteca" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Selecionar diretórios" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Valores gravados" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Editar valores gravados..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Procurar após digi_tar" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Exibir resultados da pesquisa após o usuário parar de digitar." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limite:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Ponderado" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Mostra tempo restante" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Letras" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Focaliza o player que está rodando" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Avança/retorna na música atual" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Impossível remover músicas" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Impossível remover músicas" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtrar em %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "Cabeçalhos de á_lbuns" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Cabeçalhos de Faixa" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Cabeçalhos de á_lbuns" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Cabeçalhos de _pessoas" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Cabeçalhos de _data" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Cabeçalhos de _filtros" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Cabeçalhos de p_rodução" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "Per_sonalizar cabeçalhos" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Colorir itens da _busca" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Adicionar à _fila" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Copiar para o aparelho" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Remover da Biblioteca" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Substituir _underscores por espaços" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Valores dependentes da caixa do título" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "_Separar em múltiplos valores" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Etiquetas do caminho do arquivo" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Etiquetas substituem outras preexistentes" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Etiquetas são adicionadas a outras" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "O padrão\n" "\t<b>%s</b>\n" "é inválido. Possivelmente ele contem a mesma etiqueta mais de uma vez ou tem " "colchetes desbalanceados (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Etiquetas inválidas" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Etiquetas inválidas <b>%s</b>\n" "\n" "Os arquivos selecionados não suportam essas etiquetas." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "O padrão inserido por você era inválido. Se lembre de colocar < e > " "como \\< e \\> e que as suas etiquetas são balanceadas.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Editar exibição" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Números de faixa" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Começar _de:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "Faixas ao _todo:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "_Pause" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "Pre_vious" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "e %d mais..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Gravando as músicas alteradas." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d músicas salvas\n" "(%(remaining)s restando)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Movendo %(current)d/%(total)d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Verificando pontos de montagem" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "localização" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Uma lista de reprodução chamada %s já existe." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Mostrar _capas" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Sistema de arquivos" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Mostra breve instrução de uso" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Mostra versão e copyright" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[opções]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Opção %r não reconhecida." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Opção %r requer um parâmetro." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r não é um prefixo único." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Nenhuma informação de tempo" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hora" msgstr[1] "%d horas" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dia" msgstr[1] "%d dias" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d ano" msgstr[1] "%d anos" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "A data deve ser entrada nos formatos AAAA, AAAA-MM-DD ou AAAA-MM-DD HH:MM:SS." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Ganhos em ReplayGain devem ser inseridos no formato 'x.yy dB'." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Picos ReplayGain devem ser inseridos no formato x.yy." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "Identificadores MusicBrainz devem estar no formato UUID." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Os status de release MusicBrainz devem ser 'official', 'promotional' ou " "'bootleg'" #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Impossível editar música" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Gravar <b>%s</b> falhou. O arquivo pode ser somente leitura, estar " "corrompido , ou você pode não ter permissão para editá-lo." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Codificação Inválida]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "álbum" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arranjador" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arranjadores" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "arranjador" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "autores" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "compositor" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "compositores" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "compositor" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "condutor" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "condutores" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "condutor" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "contato" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "descrição" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "gênero" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "gênero" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "intérprete" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "agrupamento" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "língua" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licença" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "localização" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "compositor" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "letristas" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "compositor" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organização" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "título" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versão" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "site" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "artista do álbum" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "legenda do álbum" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disco" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "faixa" # label ID #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "identificador de rótulo" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "data original de lançamento" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "álbum original" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "artista original" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "data de gravação" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "país de origem" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID de artista MusicBrainz" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID de faixa MusicBrainz" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "ID de TRM MusicBrainz" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "ID de álbum MusicBrainz" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Tipo de álbum MusicBrainz" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "ID de faixa MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "ganho da faixa" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "pico da faixa" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "ganho do álbum" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "pico do álbum" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "referência de loudness" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "discos" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "faixas" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "reproduzida pela última vez" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "nome completo" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "ponto de montagem" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "pessoas" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "ano" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "data original de lançamento" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "favoritos" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "formato" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Listas de reprodução" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Navegadores" #, fuzzy #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "" #~ "Não foi possível importar python-feedparser, navegador de feeds de áudio " #~ "desabilitado." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Uma exceção ocorreu no Quod Libet. Um arquivo de dump foi salvo em <b>%s</" #~ "b> ele ajudará você a depurar o erro. Por favor, encaminhe o erro para " #~ "http://code.google.com/p/quodlibet/issues/list e anexe este arquivo ou " #~ "inclua seu conteúdo. Este arquivo pode conter alguma informação de " #~ "identificação sobre você e seu sistema, assim como a lista de arquivos " #~ "recentes reproduzidos. Se isto não for aceitável para você envie <b>%s</" #~ "b> no lugar e uma descrição do que você estava fazendo no momento.\n" #~ "\n" #~ "Quod Libet pode agora instável agora. Fechá-lo e reiniciá-lo é " #~ "recomendado. Sua biblioteca irá ser salva." #~ msgid "Unable to download lyrics." #~ msgstr "Impossível baixar letras" #~ msgid "Remove all songs from the queue" #~ msgstr "Remover todas as músicas da fila de reprodução" #~ msgid "Watch this folder for new songs" #~ msgstr "Buscar nessa pasta por novas músicas" #~ msgid "Set or toggle the playback order" #~ msgstr "Define ou altera a ordem de reprodução" #~ msgid "Uninitialized iPod" #~ msgstr "iPod não-inicializado" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Você deseja criar uma base de dados vazia nesse iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "Ganho de _Volume (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Combinar etiquetas com _múltiplos valores" #~ msgid "Model:" #~ msgstr "Modelo:" #~ msgid "Capacity:" #~ msgstr "Capacidade:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Removendo faixa órfã do iPod" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Impossível gravar biblioteca do iPod" #~ msgid "Unable to save iPod database" #~ msgstr "Impossível gravar biblioteca do iPod" #, fuzzy #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "" #~ "Não foi possível importar python-gpod, suporte ao iPod desabilitado." #, fuzzy #~ msgid "Track Repeat" #~ msgstr "pico da faixa" #~ msgid "Shuffle" #~ msgstr "Embaralhar" #~ msgid "Weighted" #~ msgstr "Ponderado" #~ msgid "_Weighted" #~ msgstr "_Ponderado" #~ msgid "_One Song" #~ msgstr "_Uma música" #~ msgid "Restart the playlist when finished" #~ msgstr "Reiniciar a lista de reprodução quando acabado" #~ msgid "Disable Browser" #~ msgstr "Desabilitar navegador" #~ msgid "_Disable Browser" #~ msgstr "_Desabilitar navegador" #, fuzzy #~ msgid "Force Write" #~ msgstr "Escrever" #~ msgid "Filter on _Genre" #~ msgstr "Filtrar por _gênero" #~ msgid "Filter on _Artist" #~ msgstr "Filtrar por _artista" #~ msgid "Filter on Al_bum" #~ msgstr "Filtrar por ál_bum" #~ msgid "_Music" #~ msgstr "_Música" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Marcadores" #~ msgid "Song _List" #~ msgstr "_Lista de músicas" #, fuzzy #~ msgid "D:" #~ msgstr "W: " #, fuzzy #~ msgid "W:" #~ msgstr "W: " #, fuzzy #~ msgid "E:" #~ msgstr "E: " #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "Roda do mouse troca de música;\n" #~ "Shift e roda do mouse ajusta o volume" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Parar após essa música" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "e %d mais..." #~ msgstr[1] "e %d mais..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Separar disco de á_lbum" #, fuzzy #~ msgid "Timeout" #~ msgstr "Tempo" #, fuzzy #~ msgid "Select an album" #~ msgstr "Selecionar _todos" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s e %(count)d mais" #~ msgstr[1] "%(title)s e %(count)d mais" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Listas de reprodução" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "_Usar cantos arredondados nas miniaturas" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "Arredonda os cantos da imagem de miniatura da arte da capa. Pode requerer " #~ "a reinicialização para funcionar." #~ msgid "Re_fresh Library" #~ msgstr "Atuali_zar biblioteca" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Remover Estação" #~ msgid "Unable to open input files" #~ msgstr "Impossível abrir arquivos de entrada" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "O GStreamer não possui elementos para manipular arquivos. Verifique suas " #~ "configurações de instalação do GStreamer." #~ msgid "Invalid audio backend" #~ msgstr "Backend de áudio inválido" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "O backend de áudio %r não está instalado." #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "command|filename" #~ msgstr "nome_de_arquivo" #~ msgid "command|tag" #~ msgstr "etiqueta" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: Não foi possível encontrar o media-player-info." #, fuzzy #~ msgid "heading|Search" #~ msgstr "Buscar" #~ msgid "%d of %d" #~ msgstr "%d de %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Uso: %s %s" #~ msgid "_Download..." #~ msgstr "_Download..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Nova estação" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Sobrescrever <b>%s</b>?" #~ msgid "Output Error" #~ msgstr "Erro de saída" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "O pipeline de saída do GStreamer não pôde ser inicializado. O pipeline " #~ "deve ser inválido, ou o dispositivo deve estar em uso. Verifique as " #~ "preferências de reprodução." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet já está em execução." #~ msgid "No song is currently playing." #~ msgstr "Nenhuma música está sendo tocada." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Impossível escrever em %s. Removendo." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Editar marcadores..." #~ msgid "_New Folder..." #~ msgstr "_Nova pasta..." #~ msgid "_Add to Playlist" #~ msgstr "_Adicionar à lista de reprodução" #~ msgid "_Edit Display..." #~ msgstr "_Editar display..." #~ msgid "Output Log" #~ msgstr "Registro de saída" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d estação" #~ msgid "_Order:" #~ msgstr "_Ordem:" #~ msgid "_Add a Location..." #~ msgstr "_Adicionar um local..." #~ msgid "_Output Log" #~ msgstr "Registr_o de saída" #~ msgid "Invalid command %r received." #~ msgstr "Comando inválido %r recebido." #~ msgid "Unknown browser %r." #~ msgstr "Navegador desconhecido: %r" #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "Per_sonalizar cabeçalhos" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "" #~ "Você irá alterar a classificação de %d músicas.\n" #~ "Você tem certeza que deseja continuar?" #~ msgstr[1] "" #~ "Você irá alterar a classificação de %d músicas.\n" #~ "Você tem certeza que deseja continuar?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "" #~ "Você irá alterar a classificação de %d músicas.\n" #~ "Você tem certeza que deseja continuar?" #~ msgstr[1] "" #~ "Você irá alterar a classificação de %d músicas.\n" #~ "Você tem certeza que deseja continuar?" #, fuzzy #~ msgid "Track Headers" #~ msgstr "Cabeçalhos de Faixa" #, fuzzy #~ msgid "People Headers" #~ msgstr "Cabeçalhos de _pessoas" #, fuzzy #~ msgid "Album Headers" #~ msgstr "Cabeçalhos de á_lbuns" #, fuzzy #~ msgid "Date Headers" #~ msgstr "Cabeçalhos de _data" #, fuzzy #~ msgid "File Headers" #~ msgstr "Cabeçalhos de _filtros" #, fuzzy #~ msgid "Production Headers" #~ msgstr "Cabeçalhos de p_rodução" #, fuzzy #~ msgid "Tag:" #~ msgstr "Etique_ta:" #~ msgid "Too Many Errors" #~ msgstr "Muitos erros" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Parando a reprodução pelo fato de haver %d erros em uma linha." #~ msgid "Warnings" #~ msgstr "Avisos" #, fuzzy #~ msgid "No log available." #~ msgstr "No information available" #~ msgid "album artist (sort)" #~ msgstr "artista do álbum (ordenado)" #~ msgid "artist (sort)" #~ msgstr "artistas (ordenado)" #~ msgid "album (sort)" #~ msgstr "álbum (ordenado)" #~ msgid "performer (sort)" #~ msgstr "intérprete (ordenado)" #~ msgid "performers (sort)" #~ msgstr "intérpretes (ordenado)" #~ msgid "MusicBrainz album artist ID" #~ msgstr "ID do álbum do artista no MusicBrainz" #~ msgid "errors" #~ msgstr "erros" #~ msgid "Permanently delete this file?" #~ msgstr "Permanentemente apagar este arquivo?" #~ msgid "Permanently delete these files?" #~ msgstr "Permanently apagar estes arquivos?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s e %(count)d mais..." #~ msgstr[1] "%(title)s e %(count)d mais..." #, fuzzy #~ msgid "Version:" #~ msgstr "_Version" #~ msgid "_Cause an Error" #~ msgstr "_Causar um erro" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s não pode ser adicionada à sua biblioteca.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Nenhum comando para ejetar encontrado." #~ msgid "Unable to start web browser" #~ msgstr "Impossível abrir um navegador web" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Um navegador de internet não foi encontrado. Por favor, defina a variável " #~ "$BROWSER, ou garanta que /usr/bin/sensible-browser exista." #, fuzzy #~ msgid "Library Error" #~ msgstr "Navegador de biblioteca" #, fuzzy #~ msgid "_Output device:" #~ msgstr "Saída d_o pipeline:" #~ msgid "translator-credits" #~ msgstr "" #~ "Alexandre Passos <alexandre.tp@gmail.com>\n" #~ "Djavan Fagundes <djavan@comum.org>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Outras colunas a mostrar, separadas por espaços" #~ msgid "_Edit and Continue" #~ msgstr "_Editar e continuar" #, fuzzy #~ msgid "You are about to change the rating of %d song." #~ msgid_plural "You are about to change the rating of %d songs." #~ msgstr[0] "" #~ "Você irá alterar a classificação de %d músicas.\n" #~ "Você tem certeza que deseja continuar?" #~ msgstr[1] "" #~ "Você irá alterar a classificação de %d músicas.\n" #~ "Você tem certeza que deseja continuar?" #~ msgid "Confirm rating" #~ msgstr "Confirmar classificação" #~ msgid "Search your library" #~ msgstr "Busca na sua biblioteca" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quod-libet-development@googlegroups.com>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, e outros\n" #~ "\n" #~ "Este software é livre; veja o código fonte para as condições de " #~ "redistribuição. Não há\n" #~ "NENHUMA garantia; nem para COMERCIALIZAÇÃO ou UTILIDADE PARA UM PROPÓSITO " #~ "ESPECÍFICO.\n" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r não possui nenhum navegador." #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Tamanho total:" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r não contém nenhum dispositivo." #~ msgid "%s: Could not import ctypes." #~ msgstr "%s: Não foi possível importar ctypes." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: Não foi possível encontrar o media-player-info." #, fuzzy #~ msgid "Couldn't find module %s." #~ msgstr "%s: Não foi possível encontrar o media-player-info." #~ msgid "Quod Libet Plugins" #~ msgstr "Plug-ins do Quod Libet" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Mostra buscas simples em azul, avançadas em verde, e inválidas em vermelho" #~ msgid "_Select" #~ msgstr "_Selecionar" #~ msgid "Separators for splitting tags" #~ msgstr "Separadores para as etiquetas" #~ msgid "Quod Libet Preferences" #~ msgstr "Preferências do Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Não reproduzidas _hoje" #~ msgid "Not Played in a _Week" #~ msgstr "Não reproduzidas em uma _semana" #~ msgid "Not Played in a _Month" #~ msgstr "Não reproduzidas em um _mês" #~ msgid "B_ottom 40" #~ msgstr "40 m_enos" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "As quarenta músicas menos tocadas (mais de quarenta podem ser escolhidas " #~ "se houver empates)" #~ msgid "gtk-media-next" #~ msgstr "gtk-media-next" #~ msgid "gtk-media-previous" #~ msgstr "gtk-media-previous" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #~ msgid "Date" #~ msgstr "Data" #~ msgid "Choose New Stations" #~ msgstr "Escolher novas estações" #~ msgid "Add" #~ msgstr "Adicionar" #~ msgid "Bitrate" #~ msgstr "Taxa de bits" #~ msgid "_Stations..." #~ msgstr "_Estações..." #~ msgid "Quod Libet" #~ msgstr "Quod Libet" #~ msgid "Initializing audio backend (%s)" #~ msgstr "Inicializando backend de áudio (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "Inicializando biblioteca principal (%s)" #~ msgid "Unable to save library" #~ msgstr "Impossível gravar biblioteca" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Impossível tocar música" #~ msgid "" #~ "The audio output pipeline %r could not be created. Check your GStreamer " #~ "settings in ~/.quodlibet/config." #~ msgstr "" #~ "O pipeline de saída de áudio %r não pôde ser criado. Verifique suas " #~ "configurações do GStreamer em ~/.quodlibet/config." #~ msgid "Sort by title" #~ msgstr "Ordenar por título" #~ msgid "Sort by artist" #~ msgstr "Ordenar por artista" #~ msgid "Lyrics provided by %s." #~ msgstr "Letras por %s" #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Nenhuma letra foi encontrada.\n" #~ "\n" #~ "Você pode clicar no botão Download para que Quod Libet busque por letras " #~ "das músicas na internet. Você pode digitá-las você mesmo e clicar em " #~ "gravar." #~ msgid "part" #~ msgstr "parte" #~ msgid "Opening audio device." #~ msgstr "Abrindo dispositivo de som." #~ msgid "Moving %d/%d." #~ msgstr "Movendo %d/%d." #~ msgid "Deleting %d/%d." #~ msgstr "Apagando %d/%d." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d músicas gravadas" #~ msgid "MusicBrainz album ID" #~ msgstr "ID de álbum MusicBrainz" #~ msgid "Loaded song library." #~ msgstr "Biblioteca carregada." #~ msgid "Unable to open audio device" #~ msgstr "Impossível abrir dispositivo de som" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet tentou acessar os drivers 'autosink' e '%(sink)s' mas não foi " #~ "capaz de abrir nenhum deles. Escolhe a pipeline correta no seu GStreamer " #~ "mudando a linha\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "no seu arquivo ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet não conseguiu achar o elemento GStreamer 'filesrc'. Verificque " #~ "a sua instalação do GStreamer." #, fuzzy #~ msgid "C_opy album covers" #~ msgstr "Mostrar _capas" #~ msgid "Unable to retag multiple values" #~ msgstr "Impossível alterar as tags de múltiplos valores" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "Mudar o nome de uma tag com valores múltiplos não é possível." #~ msgid "W: %s is not a QL song database." #~ msgstr "W: %s não é uma base de dados de músicas QL." #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "Ajuste por música (\"Radio\")" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "Ajuste por álbum (\"Audiófilo\")" #~ msgid "_Volume Normalization" #~ msgstr "Normalização do _Volume" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "Quod Libet está lendo a sua biblioteca. Isso pode demorar vários " #~ "minutos.\n" #~ "\n" #~ "%d músicas recarregadas\n" #~ "%d músicas removidas" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "Quod Libet está procurando por músicas novas e adicionando-as à sua " #~ "biblioteca.\n" #~ "\n" #~ "%d músicas adicionadas" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "Playlists M3U não podem ser carregadas." #~ msgid "This station is already in your library." #~ msgstr "Essa estação já está em sua biblioteca." #~ msgid "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgstr "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "por <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disco <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Faixa <tracknumber>>>" #~ msgid "The library cannot be refreshed while Quod Libet is running." #~ msgstr "" #~ "A biblioteca não pode ser atualizada enquando Quod Libet está rodando." #~ msgid "Loading, scanning, and saving your library." #~ msgstr "Carregando, lendo e gravando a biblioteca." #~ msgid "Rescan your library and exit" #~ msgstr "Relê a sua biblioteca e sai" #~ msgid "" #~ "It looks like you are running Quod Libet right now. If you edit songs " #~ "also in Quod Libet's library while it is running, you may need to refresh " #~ "or re-add them.\n" #~ "\n" #~ "If you are not running Quod Libet, or are editing songs outside of its " #~ "library, you may ignore this warning." #~ msgstr "" #~ "Parece que você está usando o Quod Libet agora. Se você editar músicas " #~ "que também estão na biblioteca do Quod Libet enquanto ele está rodando, " #~ "você precisa mandar atualizá-las ou relê-las.\n" #~ "\n" #~ "Se você não está usando o Quod Libet, ou está editando músicas que não " #~ "estão em sua biblioteca, você pode ignorar esse aviso." #~ msgid "GStreamer status %r != %r" #~ msgstr "Status do GStreamer %r != %r" #~ msgid "_Pane %d:" #~ msgstr "_Painel %d:" #~ msgid "Double-click a tag value to change it, right-click for other options" #~ msgstr "Duplo-clique numa tag altera, botão direito dá opções" #~ msgid "Add a new tag" #~ msgstr "Adicionar nova tag" #~ msgid "Tag by Filename" #~ msgstr "Tag por arquivo" #~ msgid "The first letter of each word will be capitalized" #~ msgstr "A primeira letra de cada palavra estará em maiúsculas" #~ msgid "" #~ "Characters not allowed in Windows filenames (\\:?;\"<>|) will be replaced " #~ "by underscores" #~ msgstr "" #~ "Caracteres não permitidos em arquivos Windows (\\:?;\"<>|) serão " #~ "substituídos por underscores" #~ msgid "" #~ "Characters outside of the ASCII set (A-Z, a-z, 0-9, and punctuation) will " #~ "be replaced by underscores" #~ msgstr "" #~ "Caracteres não-ASCII (A-Z, a-z, 0-9, e pontuação básica) serão " #~ "substituídos por underscores" #~ msgid "Apply to these _files..." #~ msgstr "Aplicar a esses _arquivos..." #~ msgid "Path" #~ msgstr "Caminho" #~ msgid "Tray Preferences - Quod Libet" #~ msgstr "Preferências do Painel - Quod Libet" #~ msgid "E: You need GTK+ 2.6 and PyGTK 2.6 or greater." #~ msgstr "E: Você precisa de GTK+ 2.6 e PyGTK 2.6 ou mais recente." #~ msgid "E: You have GTK+ %s and PyGTK %s." #~ msgstr "E: Você tem GTK+ %s e PyGTK %s." #~ msgid "E: Please upgrade GTK+/PyGTK." #~ msgstr "E: Por favor, atualize GTK+/PyGTK." #~ msgid "%(different)s, %(missing)s" #~ msgstr "%(different)s, %(missing)s" #~ msgid "Search Bar" #~ msgstr "Barra de Busca" #~ msgid "Play songs in random order" #~ msgstr "Tocas as músicas em ordem aleatória" #~ msgid "S_ong" #~ msgstr "Mú_sica" #~ msgid "_Choose randomly" #~ msgstr "_Escolher aleatoriamente" #~ msgid "Drag songs here to add them to the play queue" #~ msgstr "Arraste músicas para cá para adicioná-las à fila de reprodução" #~ msgid "" #~ "Deleting <b>%s</b> failed. Possibly the target file does not exist, or " #~ "you do not have permission to delete it." #~ msgstr "" #~ "Apagar <b>%s</b> falhou. Possivelmente o arquivo não existe, ou você não " #~ "tem permissão para apagá-lo." #~ msgid "" #~ "Quod Libet was unable to open your audio device. Often this means another " #~ "program is using it, or your audio drivers are not configured.\n" #~ "\n" #~ "Quod Libet will now exit." #~ msgstr "" #~ "Quod Libet não conseguiu abrir o seu dispositivo de som. Normalmente, " #~ "isso significa que outro programa está usando-o, ou os seus drivers de " #~ "som não estão configurados. \n" #~ "Quod Libet vai sair." #~ msgid "_New/Edit Playlist..." #~ msgstr "_New/Edit Playlist..." #~ msgid "" #~ "Enter a name for the new playlist. If it already exists it will be opened " #~ "for editing." #~ msgstr "" #~ "Enter a name for the new playlist. If it already exists it will be opened " #~ "for editing." #~ msgid "Turn shuffle off, on, or toggle it" #~ msgstr "Turn shuffle off, on, or toggle it" #~ msgid "Closing _minimizes to system tray" #~ msgstr "Closing _minimizes to system tray" #~ msgid "Performed by %s" #~ msgstr "Performed by %s" #~ msgid "arranged by %s" #~ msgstr "arranged by %s" #~ msgid "conducted by %s" #~ msgstr "conducted by %s" #~ msgid "composed by %s" #~ msgstr "composed by %s" #~ msgid "written by %s" #~ msgstr "written by %s" #~ msgid "Add songs to your library" #~ msgstr "Add songs to your library" #~ msgid "Visit the artist's website" #~ msgstr "Visit the artist's website" #~ msgid "Change volume" #~ msgstr "Change volume" #~ msgid "Supported formats:" #~ msgstr "Supported formats:" #~ msgid "" #~ "Invalid tag <b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing this tag.Invalid tags " #~ "<b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing these tags." #~ msgstr "" #~ "Invalid tag <b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing this tag.Invalid tags " #~ "<b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing these tags." #~ msgid "(shared across all %d songs)" #~ msgstr "(shared across all %d songs)" #~ msgid "(different across %d songs, missing from %d songs)" #~ msgstr "(different across %d songs, missing from %d songs)" #~ msgid "1 minute" #~ msgstr "1 minute" #~ msgid "1 hour" #~ msgstr "1 hour" #~ msgid "1 day" #~ msgstr "1 day" #~ msgid "An audio player and tag editor" #~ msgstr "An audio player and tag editor" #~ msgid "" #~ "If you have songs in directories that will not always be mounted (for " #~ "example, a removable device or an NFS shared drive), list those mount " #~ "points here. Files in these directories will not be removed from the " #~ "library if the device is not mounted." #~ msgstr "" #~ "If you have songs in directories that will not always be mounted (for " #~ "example, a removable device or an NFS shared drive), list those mount " #~ "points here. Files in these directories will not be removed from the " #~ "library if the device is not mounted." #~ msgid "" #~ "These characters will be used as separators when \"Split values\" is " #~ "selected in the tag editor" #~ msgstr "" #~ "These characters will be used as separators when \"Split values\" is " #~ "selected in the tag editor" #~ msgid "Initialized multimedia key support." #~ msgstr "Initialised multimedia key support." #~ msgid "1 track" #~ msgstr "1 track" #~ msgid "Adjust audio volume" #~ msgstr "Adjust audio volume" #~ msgid "Check for changes in the library made since the program was started" #~ msgstr "Check for changes in the library made since the program was started" #~ msgid "1 time" #~ msgstr "1 time" #~ msgid "Add a new tag to the file" #~ msgstr "Add a new tag to the file" #~ msgid "Invalid date format" #~ msgstr "Invalid date format" #~ msgid "" #~ "Invalid date: <b>%s</b>.\n" #~ "\n" #~ "The date must be entered in YYYY or YYYY-MM-DD format." #~ msgstr "" #~ "Invalid date: <b>%s</b>.\n" #~ "\n" #~ "The date must be entered in YYYY or YYYY-MM-DD format." #~ msgid "No on-screen display" #~ msgstr "No on-screen display" #~ msgid "Display OSD on the top" #~ msgstr "Display OSD on the top" #~ msgid "Display OSD on the bottom" #~ msgstr "Display OSD on the bottom" #~ msgid "Select a color for the OSD" #~ msgstr "Select a colour for the OSD" #~ msgid "Select a second color for the OSD" #~ msgstr "Select a second colour for the OSD" #~ msgid "Song _list" #~ msgstr "Song _list" #, fuzzy #~ msgid "[directory]" #~ msgstr "directory" #~ msgid "" #~ "Quod Libet - a music library and player\n" #~ "Options:\n" #~ " --help, -h Display this help message\n" #~ " --version Display version and copyright information\n" #~ " --refresh-library Rescan your song cache and then exit.\n" #~ " --print-playing Print the currently playing song.\n" #~ "\n" #~ " Player controls:\n" #~ " --next, --previous, --play-pause, --play, --pause\n" #~ " Change songs or pause/resume playing.\n" #~ " --volume +|-|0..100\n" #~ " Increase, decrease, or set the volume.\n" #~ " --shuffle 0|1|t, --repeat 0|1|t\n" #~ " Enable, disable, or toggle shuffle and repeat. \n" #~ " --query search-string\n" #~ " Make a new playlist from the given search.\n" #~ " --seek [+|-][HH:MM:]SS\n" #~ " Seek to a position in the current song.\n" #~ " --play-file filename\n" #~ " Play this file, adding it to the library if necessary.\n" #~ "\n" #~ "For more information, see the manual page (`man 1 quodlibet').\n" #~ msgstr "" #~ "Quod Libet - a music library and player\n" #~ "Options:\n" #~ " --help, -h Display this help message\n" #~ " --version Display version and copyright information\n" #~ " --refresh-library Rescan your song cache and then exit.\n" #~ " --print-playing Print the currently playing song.\n" #~ "\n" #~ " Player controls:\n" #~ " --next, --previous, --play-pause, --play, --pause\n" #~ " Change songs or pause/resume playing.\n" #~ " --volume +|-|0..100\n" #~ " Increase, decrease, or set the volume.\n" #~ " --shuffle 0|1|t, --repeat 0|1|t\n" #~ " Enable, disable, or toggle shuffle and repeat. \n" #~ " --query search-string\n" #~ " Make a new playlist from the given search.\n" #~ " --seek [+|-][HH:MM:]SS\n" #~ " Seek to a position in the current song.\n" #~ " --play-file filename\n" #~ " Play this file, adding it to the library if necessary.\n" #~ "\n" #~ "For more information, see the manual page (`man 1 quodlibet').\n" #~ msgid "" #~ "Quod Libet %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE." #~ msgstr "" #~ "Quod Libet %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE." #~ msgid "E: Unknown command line option: %s" #~ msgstr "E: Unknown command line option: %s" #~ msgid "%d:%02d:%02d" #~ msgstr "%d:%02d:%02d" #~ msgid "%d:%02d" #~ msgstr "%d:%02d" #~ msgid "" #~ "Ex Falso - an audio file tagger\n" #~ "Usage: %s [directory]\n" #~ "\n" #~ "For more information, see the manual page (`man 1 exfalso').\n" #~ msgstr "" #~ "Ex Falso - an audio file tagger\n" #~ "Usage: %s [directory]\n" #~ "\n" #~ "For more information, see the manual page (`man 1 exfalso').\n" #~ msgid "Quod Libet is free software licensed under the GNU GPL v2." #~ msgstr "Quod Libet is free software licensed under the GNU GPL v2." #~ msgid "Songs heard:" #~ msgstr "Songs heard:" #~ msgid "Listening" #~ msgstr "Listening" #~ msgid "%s and %d more - Properties" #~ msgstr "%s and %d more - Properties" #~ msgid "" #~ "No on-screen display\n" #~ "Display OSD on the top\n" #~ "Display OSD on the bottom" #~ msgstr "" #~ "No on-screen display\n" #~ "Display OSD on the top\n" #~ "Display OSD on the bottom" #~ msgid "" #~ "No volume adjustment\n" #~ "Per-song (\"Radio\") volume adjustment\n" #~ "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "" #~ "No volume adjustment\n" #~ "Per-song (\"Radio\") volume adjustment\n" #~ "Per-album (\"Audiophile\") volume adjustment" #~ msgid "Perfor_mer" #~ msgstr "Perfor_mer" #~ msgid "Pick a random album from your library" #~ msgstr "Pick a random album from your library" #~ msgid "Pick a random artist from your library" #~ msgstr "Pick a random artist from your library" #~ msgid "Pick a random genre from your library" #~ msgstr "Pick a random genre from your library" #~ msgid "Play next song" #~ msgstr "Play next song" #~ msgid "Pre_vious song" #~ msgstr "Pre_vious song" #~ msgid "Select a font for the OSD" #~ msgstr "Select a font for the OSD" #~ msgid "Pause _song" #~ msgstr "Pause _song" #~ msgid "xx minutes, " #~ msgstr "xx minutes, " ��������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/es.po����������������������������������������������������������������������������0000644�0001750�0001750�00000604702�13115512744�015343� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Spanish translation of Quod Libet # Copyright (C) 2010 Johám-Luís Miguéns Vila # This file is distributed under the same license as the Quod Libet package. # Contacta conmigo para: # - Indicar errores, comentarios, sugerencias sobre la traducción. # - Colaborar / tomar el relevo en la misma. # Johám-Luís Miguéns Vila <galiza.ceive@gmail.com>, 2005-2010. # msgid "" msgstr "" "Project-Id-Version: QuodLibet dev\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2010-02-15 18:25+0100\n" "Last-Translator: Johám-Luís Miguéns Vila <galiza.ceive@gmail.com>\n" "Language-Team: Spanish <LL@li.org>\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Edita las etiquetas de tus archivos de música" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Editor de etiquetas de audio" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Escucha, examina o edita tu colección de música" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Reproductor de música" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Título" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "F_echa" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "Estilo" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Puntuación" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Ordenar _por:" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Preferencias" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Lista de álbumes" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Lista de á_lbumes" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Todos los álbumes" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d álbum" msgstr[1] "%d álbumes" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Mostrar _carátulas" msgstr[1] "Mostrar _carátulas" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Canciones sin álbum" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d pista" msgstr[1] "%d pistas" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disco" msgstr[1] "%d discos" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Todos los álbumes" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Preferencias de la lista de álbumes" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Mostrar _carátulas" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "La _búsqueda incluye los \"componentes\"" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[opciones]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Vista de álbumes" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Desconocido" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Nueva fuente (feed)" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Introduce la direcciónde la fuente de audio (feed)" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Fuentes de audio" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "Fuentes de _audio" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Descargar" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Descargar archivos" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Descargar archivo" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "No ha sido posible añadir la fuente" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "No se ha podido añadir <b>%s</b>. Es posible que el servidor esté caido, o " "que la dirección no contenga una fuente de audio (feed)." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "Ac_tualizar la colección" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Eliminar los archivos" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "La infraestructura de sonido actual no admite URLs. El navegador de fuentes " "(feed) de audio ha sido desactivado." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Navegador de la colección" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d canción" msgstr[1] "%d canciones" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Patrón inválido" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Colección de álbumes" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "_Colección de álbumes" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Desconocido" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Extraer en valores _múltiples" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Personalizada" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Eliminar la emisora" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Etiqueta" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Unir" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferencias de la lista de álbumes" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Tamaño total:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Tamaño total:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Preferencias de la vista por paneles" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Mostrar _carátulas" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Todos los álbumes" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "No existen emisoras nuevas" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Sistema de archvos" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "Sistema de _archivos" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "No ha sido posible copiar las canciones" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Los archivos seleccionados no pueden ser copiados\n" "a otra lista ni a la cola de reproducción." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Añadir a la colección" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Tipo de archivo no admitido" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Las listas de emisoras sólo pueden contener la dirección de las mismas, no " "otra lista de emisoras o lista de reproducción. Las siguientes emisoras no " "han podido ser cargadas:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "No se ha podido añadir la emisora" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Radio por Internet" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Descargar archivos" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Nueva emisora" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Por favor, introduce la dirección de una emisora de radio por Internet" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Electrónica" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "Hip Hop / Rap" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Viejos éxitos" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japonesa" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "India" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Religiosa" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Éxitos" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Turca" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Regae / Baile" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "puntuación" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "Radio universitaria" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Debate / Noticias" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambiente" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Jazz" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Clásica" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternativa" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metal" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Country" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Noticias" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Schlager" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Funk" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Blues" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Punk" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Reggaeton" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Eslava" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Griega" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gótica" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rock" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Nueva emisora" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "Radio por _Internet" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Nueva emisora" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_Nueva emisora" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Nueva emisora" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Favoritos" #: ../quodlibet/browsers/iradio.py:580 #, fuzzy msgid "No Category" msgstr "Sin categoría" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "No se han encontrado emisoras" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "No se han encontrado emisoras en %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Todas las emisoras referidas ya se encuentran en tu colección." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "_Añadir a la lista" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "_Eliminar de la lista" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d emisora" msgstr[1] "%(count)d emisoras" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Propiedades del dispositivo" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Dispositivo:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "No montado" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Punto de montaje:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Nombre" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Dispositivos externos" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "Dispositivos _externos" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Expulsar" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Propiedades" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Cambiar el nombre" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> utilizado, <b>%s</b> disponible" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> no está conectado." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Copiando <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "No se ha podido copiar la canción" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "No hay espacio libre suficiente para esta canción" #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "No se ha podido copiar <b>%s<b>." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "No se han podido eliminar las canciones" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Eliminando <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "No ha podido eliminarse <b>%s</b>.." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "No se ha podido eliminar la canción" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Error al expulsar <b>%s</b>." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "No ha sido posible expulsar el dispositivo" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" "Sin infraestructura de dispositivos. El navegador de dispositivos ha sido " "desactivado." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Vista en paneles" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Vista en paneles" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Seleccionar _todo" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Todo" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Preferencias de la vista por paneles" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Listas" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Listas" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Eliminar de la lista" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importar" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Nueva lista" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "No ha sido posible importar la lista de reproducción" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet sólo puede importar listas de reproducción en los formatos M3U y " "PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "No ha sido posible cambiar el nombre de la lista" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importar lista" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Nueva lista" #: ../quodlibet/browsers/playlists/menu.py:86 #, fuzzy, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" "Deseas continuar?" msgstr[1] "" "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" "Deseas continuar?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Nueva lista" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Preferencias de la vista por paneles" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Listas" #: ../quodlibet/browsers/playlists/util.py:33 #, fuzzy, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Estás a punto de eliminar la lista <i>%s</i>.\n" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Toda la información sobre la lista seleccionada será eliminada y no se podrá " "restaurar." #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Introduce un nombre para la nueva carpeta" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importando la lista de reproducción.\n" "\n" "%(current)d/%(total)d canciones añadidas." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Limitar resultados" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Buscar en la colección" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Buscar en la colección" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Vista en paneles" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Buscar" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "ubicación" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet no está siendo ejecutado" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "un gestor y reproductor de música" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[opciones]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Muestra la canción reproducida y termina" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Comenzar a reproducir de inmediato" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Saltar hasta la siguiente canción" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" "Ir a la canción anterior o reiniciar la actual si está próxima al comienzo" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Volver a la canción anterior" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Comenzar la reproducción" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Parar la reproducción" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Alternar reproducir y parar" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Comenzar la reproducción" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Subir el volumen" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Bajar el volumen" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Mostrar el estado del reproductor" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Esconder la ventana principal" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Mostrar la ventana principal" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Alternar la visibilidad de la ventana principal" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Centrarse en el reproductor" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Eliminar los filtros de navegación activos" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Actualizar y analizar de nuevo la colección" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Desactivar el navegador" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Mostrar la lista de reproducción" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Mostrar las canciones en la cola de reproducción" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Mostrar las canciones en la cola de reproducción" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Comenzar sin extensiones" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet no está siendo ejecutado" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Salir de Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Avanzar en la canción activa" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Alternar reproducir y parar" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Activar o desactivar el modo repetición" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Ajustar el volumen" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Buscar en la colección" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "búsqueda" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Reproducir un archivo" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "nombre del archivo" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Puntuar la canción activa" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Configurar el navegador actual" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Puntuar la canción activa" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Abrir un nuevo navegador" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Mostrar o esconder la cola de reproducción" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Mostrar o esconder la lista principal de canciones" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtro en un valor aleatorio" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "etiqueta" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtro en un valor de las etiquetas" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "etiqueta=valor" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Poner en cola un archivo o búsqueda" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Añadir nombres de archivo separados por comas a la cola" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "nombre del archivo" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" "Mostrar los nombres de archivo de los resultados de la búsqueda en la salida " "estandard" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Eliminar de la cola un archivo o búsqueda" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Argumento inválido para '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Intenta %s --help" #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Dispositivo desconocido" #: ../quodlibet/devices/__init__.py:32 #, fuzzy, python-format msgid "Could not import %s, which is needed for device support." msgstr "" "No se ha podido importar la librería dbus-python, necesaria para la " "interacción con dispositivos externos" #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r no es un dispositivo admitido." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: no se ha podido encontrar media-player-info" #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Activando la infraestructura de dispositivos." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Intentando '%s'" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "No se ha podido conectar a una infraestructura de dispositivos" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "La infraestructura de dispositivos ha sido iniciada." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Patrón para el nombre de _archivo:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copiar las _carátulas del álbum" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Eliminar las portadas de discos y las carpetas sin utilizar" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Ha ocurrido un error" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "_Ignorar todos los errores" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "descripción" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "un editor de etiquetas de audio" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "ruta" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "ID MusicBrainz de la pista" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID MusicBrainz de la pista" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Codificación inválida]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Título" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor de etiquetas de audio" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "C_on mayúscula inicial los valores resultantes" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Preferencias de la vista por paneles" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Tamaño total:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Editar la vista" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Importancia" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 #, fuzzy msgid "_Outline" msgstr "_Infraestructura de salida de sonido:" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editar la vista" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Prever" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 #, fuzzy msgid "Automatic Masking" msgstr "Auto_mática" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 #, fuzzy msgid "Automatic Rating" msgstr "Auto_mática" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "La infraestructura de sonido actual no admite URLs. El navegador de fuentes " "(feed) de audio ha sido desactivado." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d segundo" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Personalizada" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "_Eliminar errores" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Reproductor de música" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Radio por Internet" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Puntuación" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "Predefinida" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "No ha sido posible guardar la canción" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "No se ha encontrado extensión alguna" #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Letra" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Borrar la búsqueda" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Letra" #: ../quodlibet/ext/events/lyricswindow.py:348 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "Ver y editar las etiquetas de la canción reproducida" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "ubicación" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Esconder la ventana principal" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Preferencias" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "patrón" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "patrón" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d canción" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Registro" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "patrón" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "No se ha podido conectar a una infraestructura de dispositivos" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "ubicación" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Título" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 #, fuzzy msgid "Show notifications" msgstr "No existen emisoras nuevas" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "No se ha podido conectar a una infraestructura de dispositivos" #: ../quodlibet/ext/events/notify.py:251 #, fuzzy msgid "Song Notifications" msgstr "No existen emisoras nuevas" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Siguiente" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, fuzzy, python-format msgid "Could not contact service '%s'." msgstr "No se ha podido conectar a una infraestructura de dispositivos" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Dispositivo:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Nombre" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Otras:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "Patrón para el nombre de _archivo:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Ál_bum aleatorio" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "álbumes" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Importancia" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Ál_bum aleatorio" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Importar lista" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importar" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 #, fuzzy msgid "Alternative Seek Bar" msgstr "Alternativa" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Sin reproducción" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d canción" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "patrón" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Sin reproducción" #: ../quodlibet/ext/events/trayicon/__init__.py:53 #, fuzzy msgid "Tray Icon" msgstr "Preferencias del Icono" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "_Listas" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Reproductor" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_Prever" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 #, fuzzy msgid "_Next" msgstr "Siguiente" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Aleatoriamente" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Repetir" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Parar después de esta canción" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Abrir un nuevo navegador" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Editar las _etiquetas" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Información" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Listas" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Comportamiento" #: ../quodlibet/ext/events/trayicon/prefs.py:42 #, fuzzy msgid "Scroll wheel adjusts volume" msgstr "" "La rueda del ratón ajusta el volumen\n" "Shift y la rueda del ratón cambia de canción" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Rueda del _Ratón" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Editar vista" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Errores" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 #, fuzzy msgid "Waveform Seek Bar" msgstr "Alternativa" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Archivos" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Prever" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Filtrar por _artista" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 #, fuzzy msgid "Default" msgstr "Predefinida" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Personalizada" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Filtrar por _género" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Filtrar por _artista" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Fuentes de audio" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Introduce la direcciónde la fuente de audio (feed)" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Importar lista" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importar" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "No se han encontrado emisoras" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "Patrón para el nombre de _archivo:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "Patrón para el nombre de _archivo:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, fuzzy, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" "Deseas continuar?" msgstr[1] "" "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" "Deseas continuar?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "Las canciones duplicadas serán eliminadas de la lista '%s'." #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Nueva lista" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "última reproducción" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "En cola" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Nunca" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "saltar el contador" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Valores guardados" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "No se ha podido conectar a una infraestructura de dispositivos" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Cambiar el nombre" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Colección" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Esconder la ventana principal" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Nombre del archivo" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "No ha sido posible guardar la canción" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Lista de álbumes" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Tamaño" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Buscar" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Lista de álbumes" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Editar los marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editar los marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Marcadores" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tipo de álbum según MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nombre del archivo" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Disco" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Pista" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Título" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Artista" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tipo de álbum según MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "búsqueda" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "No se ha encontrado extensión alguna" #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Navegadores" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "No se ha podido crear la carpeta" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Cambiar el nombre" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Patrón inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Valor inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Personalizada" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "No ha sido posible copiar las canciones" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Desactivar el navegador" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Duplicate Key" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_Eliminar la emisora" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Editar la vista" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 #, fuzzy msgid "Skip Count" msgstr "saltar el contador" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "Extraer las imágenes incrustadas" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Extraer las imágenes incrustadas" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "Extraer las imágenes incrustadas" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtro en un valor de las etiquetas" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer no ha podido cargar la canción seleccionada" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Filtrar por _género" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "En cola" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Guardar" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID MusicBrainz de la pista" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "ruta" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "Cabeceras de _álbumes" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Nueva emisora" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Importar lista" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 #, fuzzy msgid "Error during sync" msgstr "Error al cargar %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Cambiar el nombre" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Importar lista" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Información" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Importar lista" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "No ha sido posible importar la lista de reproducción" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Error al expulsar <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Ac_tualizar la colección" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Ac_tualizar la colección" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Editar etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Editar etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Todos los álbumes" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Prever" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Etiqueta" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "No se han podido eliminar las canciones" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Buscar" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "patrón" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Editar los valores guardados..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Colorear los términos de la _búsqueda" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Colección" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Comprobando los puntos de montaje" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Analizando la colección" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Analizando %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Error al abrir el archivo: %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Mostrar las etiquetas" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Mostrar salida para depuración" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Columnas y orden de disposición en el modo depuración (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Mostrar _mensajes adicionales para depuración" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Sin argumentos suficientes" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 #, fuzzy msgid "Too many arguments" msgstr "Demasiados errores" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "descripción" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Valor" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Mostrar las etiquetas habituales" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Copiar las etiquetas de un archivo a otro" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Mostrar los cambios, sin aplicarlos" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Saltar las etiquetas que no se puedan escribir" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "No se ha podido copiar la etiqueta %r al archivo: %r" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor de etiquetas de audio" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "No se ha seleccionado canción alguna" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Establecer una etiqueta y eliminar los valores existentes" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "No se ha podido establecer %r" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "_Eliminar la emisora" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "El valor es una expresión regular" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "Eliminar la etiqueta seleccionada" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "No se puede combinar '--all' con '--regexp'" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "No se ha podido eliminar %r de %r" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Filtro en un valor de las etiquetas" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Filtro en un valor de las etiquetas" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "No existe información sobre la duración" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Error al abrir el archivo: %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "Extraer las imágenes incrustadas" #: ../quodlibet/operon/commands.py:568 #, fuzzy, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Extraer las imágenes incrustadas" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Renombrar los archivos según las etiquetas" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Rellenar las etiquetas según la ruta al archivo" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Archivo" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Rellenar los números de pista de todos los archivos" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Mostrar las etiquetas basándose en el patrón indicado" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Muestra información sumaria sobre los distintos comandos" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> no es una dirección válida." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Desconocido" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "En orden" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_En orden" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "Aleato_rio" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "Aleato_rio" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Repetir" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Una canción" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Llenando el buffer" #: ../quodlibet/player/gstbe/player.py:319 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "No se ha podido crear la pipeline GStreamer predefinida" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 #, fuzzy msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "La infraestructura de salida GStreamer utilizada para la reproducción, e.g. " "'alsasink device=default'.\n" "Déjalo en blanco para utilizar la predeterminada." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Infraestructura de salida de sonido:" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d segundo" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "Duración del _buffer:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "No se encontró dispositivo de sonido" #: ../quodlibet/player/gstbe/util.py:112 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Salida de GStreamer inválida, intentando la predeterminada." #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "No fue posible generar salida de audio" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "No se ha encontrado el dispositivo de sonido %r. Comprueba la configuración " "de Xine en ~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, fuzzy, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "No se ha podido enlazar la pipeline GStreamer: '%s'" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Extensiones" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Formatos admitidos: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Dispositivo de sonido: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Comienzo" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/D" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Posición" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Nombre del marcador" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Marcadores" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtros" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "_Nunca reproducidas" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Añadidas _recientemente" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 más _eschuchadas" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Nueva emisora" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "_Género aleatorio" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "_Artista aleatorio" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Ál_bum aleatorio" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "Las 40 canciones que más has escuchado (pueden mostrarse más de 40 si " "algunas se reproducieron el mismo número de veces)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Valor:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Valores guardados" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Editar los valores guardados..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_mática" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "Cabeceras de _fichero" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "Cabeceras de _álbumes" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ajuste de volumen _replay gain" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Desconocido" #: ../quodlibet/qltk/data_editors.py:355 #, fuzzy msgid "Tag expression" msgstr "El valor es una expresión regular" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Filtro en un valor de las etiquetas" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Archivos" #: ../quodlibet/qltk/delete.py:63 #, fuzzy msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "Las canciones duplicadas serán eliminadas de la lista '%s'." #: ../quodlibet/qltk/delete.py:72 #, fuzzy msgid "The selected files will be deleted from disk." msgstr "Las canciones duplicadas serán eliminadas de la lista '%s'." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Eliminar los archivos" #: ../quodlibet/qltk/delete.py:106 #, fuzzy msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "Las canciones duplicadas serán eliminadas de la lista '%s'." #: ../quodlibet/qltk/delete.py:115 #, fuzzy msgid "The selected files will be moved to the trash." msgstr "Las canciones duplicadas serán eliminadas de la lista '%s'." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Mover a la papelera" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Moviendo %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "No ha sido posible guardar la base de datos del iPod" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Error al expulsar <b>%s</b>." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Eliminando %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "No se ha podido eliminar el archivo" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Ha ocurrido un error al eliminar <b>%s</b>." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Descargas" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Tamaño" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "no fue encontrada de %d canción" msgstr[1] "no se hallaron de %d canciones" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "difiere a lo largo de %d canción" msgstr[1] "difieren a lo largo de %d canciones" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Extraer en valores _múltiples" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Extraer el disco del ál_bum" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Extraer la _versión del título" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Extraer el arreglista del ar_tista" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Extraer el _intérprete del artista" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Extraer el _intérprete del artista" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Extraer la _versión del título" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Añadir una etiqueta" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Etiqueta:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Editar etiquetas" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Mostrar _mensajes adicionales para depuración" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Acceso a todas las etiquetas, incluso a aquellas generadas automáticamente, " "p.ej. las etiquetas MusicBrainz o ReplayGain" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Nunca" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "No se ha podido añadir la etiqueta" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "No a sido posible añadir la canción" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "No se ha podido añadir <b>%s</b>\n" "\n" "Los archivos seleccionados no permiten valores múltiples." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Etiqueta inválida" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Etiqueta inválida <b>%s</b>\n" "\n" "Los archivos seleccionados no permiten la edición de la etiqueta." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Valor inválido" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Valor inválido: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "La etiqueta puede no ser correcta" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "Se ha modificado <b>%s</b> mientras el programa estaba siendo ejecutado. Si " "se guardasen los cambios sin actualizar la colección podrían ser eliminadas " "otras modificaciones efectuadas.\n" "¿ Guardar de todos modos?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "No ha sido posible guardar la canción" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "No se ha podido guardar <b>%s</b>. Es posible que el archivo sea sólo de " "escritura, que esté corrupto o que no tengas permisos para editarlo." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Más opciones..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Extensiones" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s y %(count)d más" msgstr[1] "%(title)s y %(count)d más" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Configuración de Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Extraer _de:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Edición de etiquetas" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Directorio" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Nueva carpeta" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "Seleccionar todas las carpetas subordinadas" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Nueva carpeta" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Introduce un nombre para la nueva carpeta" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "No se ha podido crear la carpeta" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "No se ha podido eliminar la carpeta" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Canciones" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "por %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disco %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Pista %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Editar la vista" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "No se ha seleccionado canción alguna" #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Sin canciones" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Información" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Letra" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Producido por %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artistas" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "intérpretes" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Nunca" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] " %d vez" msgstr[1] " %d veces" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "añadida" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "última reproducción" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "contador" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "saltada" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "puntuación" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "duración" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Información" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "Ascendiente" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "tasa de bits" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "tamaño" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "modificada" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d seleccionada" msgstr[1] "%d seleccionadas" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Pista no disponible" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Lista de pistas" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d canción sin álbum" msgstr[1] "%d canciones sin álbum" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Discografía seleccionada" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d canción sin artista" msgstr[1] "%d canciones sin artista" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "álbumes" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Duración total:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Tamaño total:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Archivos" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Descargar" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Editar la vista..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "No se ha encontrado la letra de esta canción." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Buscando la letra de la canción..." #: ../quodlibet/qltk/maskedbox.py:20 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "" "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" "Deseas continuar?" #: ../quodlibet/qltk/maskedbox.py:21 #, fuzzy msgid "The selected songs will be removed from the library." msgstr "Las canciones duplicadas serán eliminadas de la lista '%s'." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "¿ Descartar las modificaciones en las etiquetas?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Las etiquetas se han modificado pero no han sido guardadas. ¿Guardar eses " "ficheros o revertir y descartar dichos cambios?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Nunca" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "El archivo ya existe" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Cambiar el nombre del archivo" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Tareas activas" #: ../quodlibet/qltk/notif.py:188 #, fuzzy, python-format msgid "%d tasks running" msgstr "Quod Libet está siendo ejecutado" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Alternar reproducir y parar" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Alternar reproducir y parar" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Errores en las extensiones" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Activado" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Desactivado" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Sin categoría" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Orden de reproducción" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Edición de etiquetas" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Tamaño total:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "No se ha encontrado extensión alguna" #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Extensiones" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Mostrar _Errores" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disco" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "Pis_ta" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "agrupación" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Ál_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Nombre de _archivo" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "Durac_ión" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Ir automáticamente a la canción reproducida" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Cuando cambie la canción reproducida, centrar la lista en la misma." #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Otras:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Editar la vista..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Añadir o eliminar columnas de información adicional" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Columnas visibles" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "El título incluye la _versión" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "La _búsqueda incluye los \"componentes\"" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "El álbum incluye el _subtítulo" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "El nombre incluye la _carpeta" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Preferencias" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Aplicar la configuración actual a la lista, añadiendo nuevas etiquetas al " "final" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Lista de canciones" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Columnas adicionales" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "Filtro _globale:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Aplicar esta búsqueda añadiéndola a las demás" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Buscar" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Navegadores" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Confirmar la puntuación _múltiple" #: ../quodlibet/qltk/prefs.py:295 #, fuzzy msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Solicitar confirmación antes de cambiar la puntuación de varias canciones a " "la vez" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Activar las puntuaciones con _un click" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Permitir las puntuaciones al hacer click en la columna de puntuaciones de la " "lista" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Puntuaciónes" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Preferir la carátula _incrustada" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Elegir utilizar la carátula incrustada en el archivo de audio (si está " "disponible) antes que la tomada de otras fuentes" #: ../quodlibet/qltk/prefs.py:319 #, fuzzy msgid "_Fixed image filename:" msgstr "Nombre _forzoso de la imagen:" #: ../quodlibet/qltk/prefs.py:321 #, fuzzy msgid "The single image filename to use if selected" msgstr "El nombre de la imagen de portada para utilizar al predeterminarlo" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "El nombre de la imagen de portada para utilizar al predeterminarlo" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Lista de álbumes" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Parar la reproducción" #: ../quodlibet/qltk/prefs.py:362 #, fuzzy msgid "Output Configuration" msgstr "Registro" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Si no existe información sobre el ajuste Replay Gain para una canción,\n" "multiplicar el volumen por este valor" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Ganancia por defecto (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Multiplicar el volumen de todas las canciones por este valor, siempre que el " "resultado no provoque cortes" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Ganancia de _volumen (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "Activar el ajuste de volumen _replay gain" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Ajuste de volumen _replay gain" #: ../quodlibet/qltk/prefs.py:450 #, fuzzy msgid "_Default rating:" msgstr "Predefinida" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "Puntuaciónes" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Factor de media _Bayesiana (C) para las puntuaciones agregadas.\n" "0 significa una media convencional, valores mayores implican que los álbumes " "con \n" "pocas pistas tendrán menores puntuaciones extremas. Al cambiar este valor se " "inicia un \n" "recálculo para todos los álbumes." #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "Cantidad de la media _Bayesiana:" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Guardar puntuaciones y co_ntadores" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "Correo _electrónico:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "Las puntuaciones y los contadores se configurarán para esta dirección de " "correo-e" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "¿ Descartar las modificaciones en las etiquetas?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Guardar los cambios en las etiquetas sin confirmación individual al editar " "varios archivos" #: ../quodlibet/qltk/prefs.py:587 #, fuzzy msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Relación de separadores para utilizar al extraer valores de etiqueta. La " "lista está separa por espacios" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Editar etiquetas" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Nueva emisora" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "A_ctualizar la colección al iniciar" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Buscar en la colección" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Buscar cambios en la colección" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Rec_argar la colección" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "" "Recarga todas las canciones de tu colección (puede llevar bastante tiempo... " "un cafetito?)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Analizar _Carpetas" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Sin canciones" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s y %(count)d más" msgstr[1] "%(title)s y %(count)d más" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Propiedades" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Cola de reproducción" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Eliminar errores" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d canción (%(time)s)" msgstr[1] "%(count)d canciones (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Examinar la colección" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Alternar la visibilidad de la ventana principal" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Parar la reproducción" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Seleccionar Directorios" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "No ha sido posible añadir las canciones" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> utiliza un protocolo no permitido." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Ir a la canción reproducida" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Archivo" #: ../quodlibet/qltk/quodlibetwindow.py:987 msgid "_Song" msgstr "Canción" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Ver" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Navegadores" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Ayuda" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "_Añadir un directorio..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "_Añadir un archivo..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Añadir una dirección" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editar los marcadores..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Parar después de esta canción" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Ayuda en Internet" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Buscar" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Añadir una dirección" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Introduce la ubicación del archivo de audio" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "No ha sido posible añadir la dirección" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> no es una dirección válida." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Añadir música" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Añadir un directorio..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Reproductor de música" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Añadir un archivo..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, fuzzy, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" "Deseas continuar?" #: ../quodlibet/qltk/ratingsmenu.py:26 #, fuzzy msgid "The saved ratings will be removed" msgstr "Las canciones duplicadas serán eliminadas de la lista '%s'." #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Se cambiará la puntuación de todas las canciones seleccionadas a '%s'" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Eliminar la emisora" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Puntuación" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Reemplazar los espacios con _guiones bajos" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Eliminar los caracteres incompatibles con _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Eliminar las marcas _diacríticas" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Eliminar los caracteres no-_ASCII" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Utilizar únicamente caracteres en minúscula" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Cambiar el nombre del archivo" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "patrón" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Editar los valores guardados..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Prever" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nuevo nombre" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "No ha sido posible cambiar el nombre del archivo" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Error al cambiar el nombre de <b>%s</b> a <b>%s</b>. Puede ser que ya exista " "el archivo de destino o que no tengas permiso para crear el nuevo fichero o " "eliminar el antiguo." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "_Ignorar todos los errores" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Continuar" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "La dirección no es absoluta" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "El patrón\n" "\t<b>%s</b>\n" "contiene / pero no comienza por root (/). Para evitar errores, comienza el " "patrón con / o ~/" #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Las canciones localizadas en estas carpetas (separadas por ':') serán " "añadidas a la colección" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Seleccionar Directorios" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Valores guardados" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Editar los valores guardados..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "Busca en tu colección, mediante texto o búsquedas QL" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Buscar despues de _escribir" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Mostrar los resultados después de terminar de escribir." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "Lím_ite:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Importancia" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Mostrar el tiempo restante" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Letra" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Centrarse en el reproductor" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Avanzar en la canción activa" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "No se han podido eliminar las canciones" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "No se han podido eliminar las canciones" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 #, fuzzy msgid "Expands the element" msgstr "Columnas adicionales" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtrar por %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "Cabeceras de _álbumes" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Cabeceras de _fichero" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Cabeceras de _álbumes" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Cabeceras de los _componentes" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Cabeceras de la _fecha" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Cabeceras de _archivo" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Cabeceras de la _producción" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Personalizar cabeceras..." #: ../quodlibet/qltk/songlist.py:1120 #, fuzzy msgid "_Expand Column" msgstr "Columnas adicionales" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Colorear los términos de la _búsqueda" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Añadir a la _cola" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Copiar al dispositivo" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Eliminar de la Colección" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Reemplazar _guiones bajos por espacios" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "C_on mayúscula inicial los valores resultantes" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Extraer en valores _múltiples" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Etiquetas a partir de la dirección" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Las etiquetas reemplazan a las existentes" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Las etiquetas se añaden a las existentes" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "El patrón\n" "\t<b>%s</b>\n" "es inválido. Es posible que contenga la misma etiqueta dos veces o que tenga " "paréntesis o llaves desemparejados (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Etiquetas inválidas" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Etiquetas inválidas <b>%s</b>\n" "\n" "Los archivos seleccionados no permiten la edición de etiquetas." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "El patrón introducido es inválido. Asegúrate de introducir < y > " "como \n" "\\< y \\> y que las etiquetas estén bien ajustadas.\n" " \n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Editar la vista" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Números de pista" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Comienza de_sde:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "Pistas _totales:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Reproductor" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_Prever" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "y %d más..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Guardando las canciones modificadas..." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "Guardadas %(current)d/%(total)d canciones.\n" "(restan %(remaining)s)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Moviendo %(current)d/%(total)d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Comprobando los puntos de montaje" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "ubicación" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Una lista de reproducción con nombre %s ya existe." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Mostrar _carátulas" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Vista de sistema de ficheros" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Muestra información sumaria sobre los distintos comandos" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Muestra la versión y el copyright" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[opciones]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Opción %r no reconocida." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "La opción %r requiere un argumento." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r no es un prefijo único" #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "No existe información sobre la duración" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hora" msgstr[1] "%d horas" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d día" msgstr[1] "%d días" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d año" msgstr[1] "%d años" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "La title case no se ajusta a las reglas del español." #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "La fecha ha de ser introducida en el formato 'AAAA', 'AAAA-MM-DD' o 'AAAA-MM-" "DD HH:MM:SS'" #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" "Las ganancias Replay Gain han de ser introducidas en el formato 'x.yy dB'" #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Los picos Replay Gain han de ser introducidos en el formato 'x.yy'" #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "Los ID de MusicBrainz han de ser en el formato UUID" #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "La versión de MusicBrainz debe ser 'official', 'promotional' o 'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "El idioma ha de ser un código de tres letras ISO 639-2" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "No ha sido posible editar la canción" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "No se ha podido guardar <b>%s</b>. Es posible que el archivo sea sólo de " "escritura, que esté corrupto o que no tengas permisos para editarlo." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Codificación inválida]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "álbum" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arreglista" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arreglistas" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "arreglista" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "autores" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "compositor/a" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "compositores/as" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "compositor/a" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "director/a" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "directores/as" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "director/a" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "contacto" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "fecha" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "descripción" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "estilo" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "estilo" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "intérprete" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "agrupación" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "idioma" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licencia" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "ubicación" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "letrista" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "letristas" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "letrista" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "compañía" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "título" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versión" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "página de Internet" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "artista del álbum" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "parte" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disco" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "pista" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "número de catálogo" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "fecha de publicación original" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "álbum original" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "artista original" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "fecha de grabación" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "país de publicación" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID MusicBrainz de la pista" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID MusicBrainz de la publicación" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "ID MusicBrainz de la publicación" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID MusicBrainz del artista" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID MusicBrainz de la publicación" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "ID MusicBrainz del TRM" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "PUID de MusicIP" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "Estado del álbum según MusicBrainz" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Tipo de álbum según MusicBrainz" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "ID MusicBrainz de la publicación" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "ganancia de volumen de la pista" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "pico de ganancia de la pista" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "ganancia de volumen del álbum" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "pico de ganancia del álbum" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Preferencias" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "discos" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "pistas" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "comenzada por última vez" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "nombre completo" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "punto de montaje" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "componentes" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "año" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "fecha de publicación original" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "marcador" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "formato" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Listas" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Navegadores" #, fuzzy #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "" #~ "No ha sido posible importar python-feedparser, el navegador de fuentes " #~ "(feed) de audio ha sido desactivado." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Quod Libet ha tenido un problema. Un archivo de depuración que nos puede " #~ "ayudar a analizar el error ha sido guardado en <b>%s</b>.\n" #~ "Por favor, crea un nuevo tema en http://code.google.com/p/quodlibet/" #~ "issues/list y anexa dicho archivo o copia su contenido . \n" #~ "Ese archivo puede contener información sobre tu sistema, tal como la " #~ "lista de música reproducida recientemente. Si no deseas hacer\n" #~ "pública dicha información envía el fichero <b>%s</b> con una descripción " #~ "sobre lo que estabas haciendo." #~ msgid "" #~ "Quod Libet may now be unstable. Closing it and restarting is recommended. " #~ "Your library will be saved." #~ msgstr "" #~ "Puede ser que QuodLibet esté inestable. Se recomienda cerrarlo y abrirlo " #~ "de nuevo. Se guardará la colección." #~ msgid "Unable to download lyrics." #~ msgstr "No ha sido posible descargar la letra." #~ msgid "Remove all songs from the queue" #~ msgstr "Elimina todas las canciones de la cola de reproducción" #~ msgid "Watch this folder for new songs" #~ msgstr "Monitorizar este directorio en busca de nuevas canciones" #~ msgid "Set or toggle the playback order" #~ msgstr "Configurar o alternar el orden de reproducción" #~ msgid "Uninitialized iPod" #~ msgstr "iPod sin configurar" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Deseas crear una base de datos vacía en este iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "Ganancia de _volumen (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Combinar las etiquetas con valores _múltiples" #~ msgid "Model:" #~ msgstr "Modelo:" #~ msgid "Capacity:" #~ msgstr "Capacidad:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Eliminando pistas huérfanas del iPod" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "No ha sido posible guardar la base de datos del iPod" #~ msgid "Unable to save iPod database" #~ msgstr "No ha sido posible guardar la base de datos del iPod" #, fuzzy #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "" #~ "No se ha podido importar python-gpod. La interacción con el iPod se ha " #~ "desactivado." #, fuzzy #~ msgid "Track Repeat" #~ msgstr "pico de ganancia de la pista" #~ msgid "Shuffle" #~ msgstr "Aleatoriamente" #~ msgid "Weighted" #~ msgstr "Dinámica" #~ msgid "_Weighted" #~ msgstr "_Dinámica" #~ msgid "_One Song" #~ msgstr "_Una canción" #~ msgid "Restart the playlist when finished" #~ msgstr "Reinicia la lista de reproducción al terminar" #~ msgid "Disable Browser" #~ msgstr "Desactivar el navegador" #~ msgid "_Disable Browser" #~ msgstr "_Desactivar el Navegador" #, fuzzy #~ msgid "Force Write" #~ msgstr "Guardar" #~ msgid "Filter on _Genre" #~ msgstr "Filtrar por _género" #~ msgid "Filter on _Artist" #~ msgstr "Filtrar por _artista" #~ msgid "Filter on Al_bum" #~ msgstr "Filtrar por ál_bum" #~ msgid "_Music" #~ msgstr "_Música" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Marcadores" #~ msgid "Song _List" #~ msgstr "_Lista de canciones" #, fuzzy #~ msgid "D:" #~ msgstr "A:" #, fuzzy #~ msgid "W:" #~ msgstr "A:" #, fuzzy #~ msgid "E:" #~ msgstr "E:" #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "La rueda del ratón cambia la canción\n" #~ "Shift y la rueda del ratón ajusta el volumen" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Parar después de esta canción" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "y %d más..." #~ msgstr[1] "y %d más..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Extraer el disco del ál_bum" #, fuzzy #~ msgid "Timeout" #~ msgstr "Posición" #, fuzzy #~ msgid "Select an album" #~ msgstr "Seleccionar _todo" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s y %(count)d más" #~ msgstr[1] "%(title)s y %(count)d más" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Listas" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "_Utilizar esquinas redondeadas en las miniaturas de las imágenes" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "Redondear las esquinas de las imágenes correspondientes a las portadas de " #~ "los discos.\n" #~ "Puede ser necesario reiniciar la aplicación para que sea efectivo." #~ msgid "Re_fresh Library" #~ msgstr "Ac_tualizar la colección" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Eliminar la emisora" #~ msgid "Unable to open input files" #~ msgstr "No ha sido posible abrir los archivos" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "GStreamer no tiene ningún elemento para leer archivos. Comprueba las " #~ "opciones de instalación de GStreamer." #~ msgid "Invalid audio backend" #~ msgstr "Infraestructura de sonido inválida" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "La infraestructura de sonido %r no está instalada" #~ msgid "ql-save" #~ msgstr "Guardar" #, fuzzy #~ msgid "ql-revert" #~ msgstr "_Eliminar de la colección" #~ msgid "Print all tags to stdout" #~ msgstr "Mostrar todas las etiquetas en la salida estandard" #~ msgid "Load tags dumped with 'dump'" #~ msgstr "Cargar las etiquetas extraídas con 'dump'" #~ msgid "command|filename" #~ msgstr "archivo" #~ msgid "command|tag" #~ msgstr "etiqueta" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: no se ha podido encontrar media-player-info" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Buscar" #~ msgid "%d of %d" #~ msgstr "%d de %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Utilización: %s %s" #~ msgid "_Download..." #~ msgstr "_Descargar..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Nueva emisora" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Sobreescribir <b>%s</b>?" #~ msgid "Output Error" #~ msgstr "Error en la salida de audio" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "No ha podido ser iniciada la salida de GStreamer. Es posible que\n" #~ "la configuración sea inválida o que el dispositivo esté siendo " #~ "utilizado.\n" #~ "Verifica las opciones de configuración." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet ya está siendo ejecutado" #~ msgid "No song is currently playing." #~ msgstr "No se está a reproducir ninguna canción" #~ msgid "Unable to write to %s. Removing it." #~ msgstr "No ha sido posible escribir en %s. Eliminándolo." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Editar los marcadores..." #~ msgid "_New Folder..." #~ msgstr "Nueva _carpeta..." #~ msgid "_Add to Playlist" #~ msgstr "_Añadir a la lista" #~ msgid "_Edit Display..." #~ msgstr "_Editar la vista..." #~ msgid "Output Log" #~ msgstr "Registro" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d emisora" #~ msgid "_Order:" #~ msgstr "_Orden" #~ msgid "_Add a Location..." #~ msgstr "_Añadir una dirección..." #~ msgid "_Output Log" #~ msgstr "_Salida del log" #~ msgid "Invalid command %r received." #~ msgstr "Se ha recibido el comando inválido %r." #~ msgid "Unknown browser %r." #~ msgstr "Navegador desconocido %r." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Personalizar cabeceras..." #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "" #~ "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" #~ "Deseas continuar?" #~ msgstr[1] "" #~ "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" #~ "Deseas continuar?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "" #~ "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" #~ "Deseas continuar?" #~ msgstr[1] "" #~ "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" #~ "Deseas continuar?" #, fuzzy #~ msgid "Track Headers" #~ msgstr "Cabeceras de _fichero" #, fuzzy #~ msgid "People Headers" #~ msgstr "Cabeceras de los _componentes" #, fuzzy #~ msgid "Album Headers" #~ msgstr "Cabeceras de _álbumes" #, fuzzy #~ msgid "Date Headers" #~ msgstr "Cabeceras de la _fecha" #, fuzzy #~ msgid "File Headers" #~ msgstr "Cabeceras de _archivo" #, fuzzy #~ msgid "Production Headers" #~ msgstr "Cabeceras de la _producción" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Etiqueta:" #~ msgid "Descending" #~ msgstr "Descendiente" #~ msgid "Too Many Errors" #~ msgstr "Demasiados errores" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "" #~ "Parando la reproducción porque se sucedieron %d errores consecutivos." #~ msgid "Warnings" #~ msgstr "Advertencias" #~ msgid "General" #~ msgstr "General" #~ msgid "No log available." #~ msgstr "Sin registros" #~ msgid "album artist (sort)" #~ msgstr "artista del álbum (ordenar)" #~ msgid "artist (sort)" #~ msgstr "artista (ordenar)" #~ msgid "album (sort)" #~ msgstr "álbum (ordenar)" #~ msgid "performer (sort)" #~ msgstr "intérprete (ordenar)" #~ msgid "performers (sort)" #~ msgstr "intérpretes (ordenar)" #~ msgid "MusicBrainz album artist ID" #~ msgstr "ID MusicBrainz del artista del álbum" #~ msgid "errors" #~ msgstr "errores" #~ msgid "Failed reading album art \"%s\"" #~ msgstr "Error al leer la carátula \"%s\"" #~ msgid "Permanently delete this file?" #~ msgstr "¿Eliminar definitivamente el archivo?" #~ msgid "Permanently delete these files?" #~ msgstr "¿Eliminar definitivamente los archivos?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s y %(count)d más..." #~ msgstr[1] "%(title)s y %(count)d más..." #, fuzzy #~ msgid "Version:" #~ msgstr "versión" #~ msgid "_Cause an Error" #~ msgstr "_Provocar un error" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s no se ha podido añadir a tu colección.\n" #~ "\n" #~ msgid "Error running command %r, caused by: %r." #~ msgstr "Error al ejecutar el comando %r, causado por: %r." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%s</b> that will help us debug the crash. Please file a new issue at " #~ "http://code.google.com/p/quodlibet/issues /list and attach this file or " #~ "include its contents. This file may contain some identifying information " #~ "about you or your system, such as a list of recent files played. If this " #~ "is unacceptable, send <b>% s</b> instead with a description of whatyou " #~ "were doing." #~ msgstr "" #~ "Quod Libet ha tenido un problema. Un archivo de depuración que nos puede " #~ "ayudar a analizar el error ha sido guardado en <b>%s</b>.\n" #~ "Por favor, crea un nuevo tema en http://code.google.com/p/quodlibet/" #~ "issues/list y anexa dicho archivo o copia su contenido . \n" #~ "Ese archivo puede contener información sobre tu sistema, tal como la " #~ "lista de música reproducida recientemente. Si no deseas hacer\n" #~ "pública dicha información envía el fichero <b>%s</b> con una descripción " #~ "sobre lo que estabas haciendo.\n" #~ "\n" #~ "A partir de ahora Quod Libet puede volverse inestable. Se recomienda " #~ "salir del programa y ejecutarlo de nuevo. \n" #~ "Se guardará tu colección." #~ msgid "Could not import python-gpod, iPod support disabled." #~ msgstr "" #~ "No se ha podido importar python-gpod. La interacción con el iPod se ha " #~ "desactivado." #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Infraestructura de salida de sonido:" #~ msgid "Search your library" #~ msgstr "Buscar en la colección" #~ msgid "No eject command found." #~ msgstr "No se ha encontrado el comando para expulsar (eject)." #~ msgid "Unable to start web browser" #~ msgstr "No ha sido posible iniciar el navegador de Internet" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "No se ha encontrado un navegador de Internet. Por favor, configura la " #~ "variable $BROWSER o asegúrate de que /usr/bin/nombre_del_navegador existe." #, fuzzy #~ msgid "Library Error" #~ msgstr "Navegador de la colección" #~ msgid "translator-credits" #~ msgstr "ashtophet" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Mostrar otras columnas, separadas por espacios" #~ msgid "_Edit and Continue" #~ msgstr "_Editar y continuar" #, fuzzy #~ msgid "You are about to change the rating of %d song." #~ msgid_plural "You are about to change the rating of %d songs." #~ msgstr[0] "" #~ "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" #~ "Deseas continuar?" #~ msgstr[1] "" #~ "Estás a punto de cambiar la puntuación de %d canciones.\\n\n" #~ "Deseas continuar?" #~ msgid "Confirm rating" #~ msgstr "Confirmar la puntuación" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quod-libet-development@googlegroups.com>\n" #~ "Copyright 2004-2010 Joe Wreschnig, Michael Urman, et alii\n" #~ "\n" #~ "Este programa es software libre; accede al código fuente para comprobar " #~ "las\n" #~ "condiciones de copia. No existe garantía alguna, ni siquiera de APTITUD " #~ "PARA EL\n" #~ "COMERCIO o de AJUSTARSE a alguna finalidad particular.\n" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r no contiene ningún navegador" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Tamaño total:" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r no contiene ningún dispositivo." #~ msgid "%s: Could not import ctypes." #~ msgstr "%s: No se puede importar ctypes." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: no se ha podido encontrar media-player-info" #, fuzzy #~ msgid "Couldn't find module %s." #~ msgstr "%s: no se ha podido encontrar media-player-info" #~ msgid "Quod Libet Plugins" #~ msgstr "Extensiones del Quod Libet" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Muestra las búsquedas simples en azul, las avanzadas en verde, y las " #~ "inválidas en rojo" #~ msgid "_Select" #~ msgstr "_Seleccionar" #~ msgid "Separators for splitting tags" #~ msgstr "Separadores para extraer las etiquetas" #~ msgid "Quod Libet Preferences" #~ msgstr "Preferencias de Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "No reproducidas ho_y" #~ msgid "Not Played in a _Week" #~ msgstr "No reproducidas en una s_emana" #~ msgid "Not Played in a _Month" #~ msgstr "No reproducidas en un _mes" #~ msgid "B_ottom 40" #~ msgstr "Úl_timas 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "Las 40 canciones que menos has escuchado (pueden mostrarse más de 40 si " #~ "algunas se reproducieron el mismo número de veces)" #~ msgid "gtk-media-next" #~ msgstr "_Siguiente" #~ msgid "gtk-media-previous" #~ msgstr "_Anterior" #~ msgid "gtk-media-play" #~ msgstr "_Reproducir" #~ msgid "gtk-media-pause" #~ msgstr "_Parar" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #~ msgid "Date" #~ msgstr "Fecha" #~ msgid "Choose New Stations" #~ msgstr "Escoger nuevas emisoras" #~ msgid "Add" #~ msgstr "Añadir" #~ msgid "Bitrate" #~ msgstr "Tasa de bits" #~ msgid "_Stations..." #~ msgstr "_Emisoras..." #~ msgid "Quod Libet" #~ msgstr "Quod Libet" #~ msgid "Initializing audio backend (%s)" #~ msgstr "Activando la infraestructura de sonido (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "Cargando la colección principal (%s)" #~ msgid "Unable to save library" #~ msgstr "No ha sido posible guardar la colección" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Imposible añadir canción" #~ msgid "" #~ "The audio output pipeline %r could not be created. Check your GStreamer " #~ "settings in ~/.quodlibet/config." #~ msgstr "" #~ "No se ha podido crear la salida de audio %r. Comprueba la configuración " #~ "de GStreamer en ~/.quodlibet/config" #~ msgid "Sort by title" #~ msgstr "Ordenar por título" #~ msgid "Sort by artist" #~ msgstr "Ordenar por artista" #~ msgid "Lyrics provided by %s." #~ msgstr "Letras obtenidas de %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "No se han encontrado las letras.\n" #~ "\n" #~ "Puedes hacer clic en el botón de descargar para que Quod Libet las busque " #~ "online. También las puedes introducir tú mism@ y guardarlas. " #~ msgid "Recommend" #~ msgstr "Recomendado" #~ msgid "_LastFM webservice URL: http://" #~ msgstr "URL del servicio _LastFM: http://" #~ msgid "The main url for lastfm webservices. Must end in a trailing /" #~ msgstr "La URL para acceder a los servicios lastfm. Debe terminar con un /" #~ msgid "LastFM _similar artist webservice: " #~ msgstr "Servicio LastFM de artistas _similares" #~ msgid "" #~ "Enter here the xml webservice lookup that gets appended to the main " #~ "service url" #~ msgstr "" #~ "Introduce aquí el fichero xml de búsqueda que se añade a la URL principal." #~ msgid "LastFM top _tracks webservice: " #~ msgstr "Canciones _más escuchadas en LastFM" #~ msgid "LastFM top _albums webservice: " #~ msgstr "Álbums más _escuchados en LastFM" #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d canciones guardadas" #~ msgid "part" #~ msgstr "parte" #~ msgid "Opening audio device." #~ msgstr "Accediendo al dispositivo de sonido" #~ msgid "MusicBrainz album ID" #~ msgstr "ID MusicBrainz del álbum" #~ msgid "Loaded song library." #~ msgstr "La colección fue cargada" #~ msgid "Unable to open audio device" #~ msgstr "Imposible acceder al dispositivo de audio" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet ha intentado acceder a los plugins 'autosink' y '%(sink)ss' " #~ "pero no ha podido utilizar ninguno de ellos. Configura el plugin de " #~ "GStreamer editando\n" #~ " <b>pipeline = %(sink)s</b>/nen ~/.quodlibet/config" #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet no ha podido encontrar el elemento 'filesrc' de GStreamer. " #~ "Verifica la instalación de GStreamer." #~ msgid "Unable to retag multiple values" #~ msgstr "Imposible renombrar una etiqueta" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "" #~ "No se permite editar el nombre de una etiqueta con múltiples valores." #~ msgid "Select _recursively" #~ msgstr "Seleccionar _recursivamente" #~ msgid "Select Recursively" #~ msgstr "Seleccionar recursivamente" #~ msgid "Also select files from subdirectory when in file system view." #~ msgstr "" #~ "También seleccionará los ficheros de los subdirectorios en la vista de " #~ "sistema de ficheros" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "Quod Libet está examinando tu colección. Este proceso puede demorar " #~ "varios minutos. \n" #~ "%d canciones recargadas\n" #~ "%d canciones eliminadas" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "Quod Libet está examinando la colección y de haber nuevas canciones las \n" #~ "añadirá a la colección.\n" #~ "\n" #~ "%d canciones añadidas" #~ msgid "W: %s is not a QL song database." #~ msgstr "A: %s no es una canción de la colección del QL" #~ msgid "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgstr "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "por <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disco <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Pista <tracknumber>>>" #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "Ajuste de voumen por canción (\"Radio\")" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "Ajuste de volumen por álbum (\"Audiófilo\")" #~ msgid "_Volume Normalization" #~ msgstr "Normalización del _volumen" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "Las listas M3U no pueden ser cargadas" #~ msgid "This station is already in your library." #~ msgstr "Esta emisora ya se encuentra en la Colección" #~ msgid "The library cannot be refreshed while Quod Libet is running." #~ msgstr "" #~ "La colección no puede ser actualizada mientras se está ejecutando el Quod " #~ "Libet" #~ msgid "Loading, scanning, and saving your library." #~ msgstr "Cargando, examinando y guardando su colección" #~ msgid "Rescan your library and exit" #~ msgstr "Actualiza tu colección" #~ msgid "Old Plugins" #~ msgstr "Extensiones antiguas" #~ msgid "" #~ "It looks like you are running Quod Libet right now. If you edit songs " #~ "also in Quod Libet's library while it is running, you may need to refresh " #~ "or re-add them.\n" #~ "\n" #~ "If you are not running Quod Libet, or are editing songs outside of its " #~ "library, you may ignore this warning." #~ msgstr "" #~ "Parece que estás ejecutandor Quod Libet. Si editas las canciones al mismo " #~ "tiempo en la colección de Quod Libet mientras se está ejecutando, nece-" #~ "sitarás actualizarla o añadirlas de nuevo.\n" #~ "\n" #~ "Si no estás ejecutando Quod Libet, o estás editando canciones que no " #~ "están en su colección, puedes ignorar esta advertencia." #~ msgid "GStreamer status %r != %r" #~ msgstr "Estado del GStreamer %r != %r" #~ msgid "_Pane %d:" #~ msgstr "_Panel %d:" #~ msgid "Double-click a tag value to change it, right-click for other options" #~ msgstr "" #~ "Haz doble-click en un valor de la etiqueta para modificarlo, clic \n" #~ "derecho para otras opciones." #~ msgid "Add a new tag" #~ msgstr "Añadir una nueva etiqueta" #~ msgid "Tag by Filename" #~ msgstr "Etiqueta a partir del nombre de fichero" #~ msgid "The first letter of each word will be capitalized" #~ msgstr "La primera letra de cada palabra será puesta en mayúsculas" #~ msgid "" #~ "Characters not allowed in Windows filenames (\\:?;\"<>|) will be replaced " #~ "by underscores" #~ msgstr "" #~ "Los caracteres que no son permitidos en los nombres de ficheros de " #~ "windows (\\:?;\"<>|) serán reemplazados por guiones bajos" #~ msgid "" #~ "Characters outside of the ASCII set (A-Z, a-z, 0-9, and punctuation) will " #~ "be replaced by underscores" #~ msgstr "" #~ "Los caracteres no incluidos en la especificación ASCII (A-Z, a-z, 09, y " #~ "los de puntuación) serán reemplazados por guiones bajos" #~ msgid "Apply to these _files..." #~ msgstr "Aplicar a estes _ficheros..." #~ msgid "Path" #~ msgstr "Ruta" #~ msgid "Tray Preferences - Quod Libet" #~ msgstr "Preferencias del icono - Quod Libet" #~ msgid "E: You need GTK+ 2.6 and PyGTK 2.6 or greater." #~ msgstr "E: Necesitas GTK+ 2.6 y PyGTK 2.6 o superior" #~ msgid "E: You have GTK+ %s and PyGTK %s." #~ msgstr "E: Tienes GTK+ %s y PyGTK %s." #~ msgid "E: Please upgrade GTK+/PyGTK." #~ msgstr "E: Por favor, actualiza GTK+/PyGTK" #~ msgid "Set play order" #~ msgstr "Establecer el orden de reproducción" #~ msgid "" #~ "Deleting <b>%s</b> failed. Possibly the target file does not exist, or " #~ "you do not have permission to delete it." #~ msgstr "" #~ "La elminación de <b>%s</b> erró. Posiblemente el fichero no existe o no " #~ "tienes permisos para eliminarlo." #~ msgid "%(different)s, %(missing)s" #~ msgstr "%(different)s, %(missing)s" #~ msgid "Search Bar" #~ msgstr "Barra de búsqueda" #~ msgid "Play songs in random order" #~ msgstr "Reproduce las canciones en orden aleatorio" #~ msgid "S_ong" #~ msgstr "Canció_n" #~ msgid "_Choose randomly" #~ msgstr "_Escoger aleatoriamente" #~ msgid "Drag songs here to add them to the play queue" #~ msgstr "" #~ "Arrastra las canciones aquí para añadirlas a la cola de reproducción" #~ msgid "" #~ "Quod Libet was unable to open your audio device. Often this means another " #~ "program is using it, or your audio drivers are not configured.\n" #~ "\n" #~ "Quod Libet will now exit." #~ msgstr "" #~ "Quod Libet no pudo acceder a tu dispositivo de audio. Esto suele " #~ "significar que otro programa lo está utilizando o que los controladores " #~ "no están configurados. \n" #~ "\n" #~ "Quod Libet terminará ahora." ��������������������������������������������������������������quodlibet-3.9.1/po/gl.po����������������������������������������������������������������������������0000644�0001750�0001750�00000600564�13115512744�015340� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Ex Falso / Quod Libet galician translation # Copyright (C) 2005 Johám-Luís Miguéns Vila # Johám-Luís Miguéns Vila <galiza.ceive@gmail.com>, 2005 - 2010 # Galician: galego reintegracionista, seguindo as normas da Associaçom Galega da Língua <http://www.agalgz.org>. # msgid "" msgstr "" "Project-Id-Version: Quod Libet VC\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:34+0100\n" "Last-Translator: Johám-Luís Miguéns Vila <galiza.ceive@gmail.com>\n" "Language-Team: GALICIAN\n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Editar as etiquetas dos arquivos de áudio" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Editor de etiquetas de áudio" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Escoite, explore ou edite a sua colecçom de música" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Reprodutor de música" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Título" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "Estilo" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Qualificaçom" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Ordenar _por:" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Preferências" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Lista de Álbuns" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Lista de _Álbuns" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Todos os Álbuns" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d álbum" msgstr[1] "%d álbuns" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Mostrar _cobertas dos discos" msgstr[1] "Mostrar _cobertas dos discos" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Canções sem álbum" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d pista" msgstr[1] "%d pistas" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disco" msgstr[1] "%d discos" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Todos os Álbuns" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Preferências da Lista de Álbuns" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Mostrar _cobertas dos discos" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "A procura _inclúi \"componentes\"" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[opções]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Vista de álbuns" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Desconhecido" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Nova Fonte" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Por favor, introduça a localizaçom da fonte (feed):" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Fontes de Áudio (feeds)" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "Fontes de _Áudio (feeds)" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Baixar" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Baixar os arquivos" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Baixar o arquivo" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Non foi possível engadir a fonte" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> nom puido ser engadida. O servidor pode estar caído, ou o endereço " "pode nom ser o de umha fonte de áudio (feed)." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "Ac_tualizar a colecçom" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Eliminar os ficheiros" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "A infraestrutura de áudio activa nom admite URLs. \n" "Desactivou-se o navegador de fontes (feeds)." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Navegador da Colecçom" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d cançom" msgstr[1] "%d canções" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Padrom inválido" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Colecçom de álbuns" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "_Colecçom de álbuns" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Desconhecido" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Extraer em valores _múltiplos" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Personalizada" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Eliminar Emisora" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Etiqueta" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Juntar" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferências da Lista de Álbuns" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Tamanho total:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Tamanho total:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Preferências do Navegador em paneis" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Mostrar _cobertas dos discos" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Todos os Álbuns" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "Nom há novas emisoras" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Sistema de arquivos" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "Sistema de _arquivos" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Nom foi possível copiar as canções" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Os arquivos seleccionados nom se puiderom copiar a outras listas de " "reproduçom ou à fileira" #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Engadir à Colecçom" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Tipo de arquivo nom admitido" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "As listas de emisoras só podem conter endereços de emisoras, nom outras " "listas de emisoras NEM listas de reproduçom. Os seguintes endereços nom " "puiderom ser carregados:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Nom foi possível engadir a emisora" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Radio por Internet" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Baixar os arquivos" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Nova Emisora" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Por favor, introduz o endereço dumha emisora por Internet" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Electrónica" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "Hip Hop / Rap" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Velhos sucessos" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japonesa" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "Índio" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Religioso" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Charts" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Turca" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Reggae / Baile" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "qualificaçom" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "Rádio universitária" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Faladoiro / Notícias" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambiente" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Jazz" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Clássica" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternativa" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metal" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Country" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Notícias" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Schlager" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Funk" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Blues" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Punk" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Reggaeton" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Eslava" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Grega" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gótica" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rock" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Nova Emisora" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "Radio por _Internet" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Nova Emisora" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_Nova Emisora" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Nova Emisora" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Prediletos" #: ../quodlibet/browsers/iradio.py:580 #, fuzzy msgid "No Category" msgstr "Sem categoria" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Nom se atopárom emisoras" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Nom se atopárom emisoras de radio por internet em %s" #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Todas as emisoras relacionadas já estám na sua colecçom" #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "_Engadir à lista" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "Elimina_r da Lista" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d emisora" msgstr[1] "%(count)d emisoras" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Propriedades do dispositivo" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Dispositivo:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Nom está montado" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Ponto de montagem:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Nome:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Dispositivos externos" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "Dispositivos _externos" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Expulsar" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Propriedades" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Mudar o nome" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> utilizado, <b>%s</b> disponível" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nom está conectado." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "A copiar <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Non foi possível copiar a cançom" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Nom há espaço livre de abondo para essa cançom." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nom puido ser copiada." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Nom se puidérom eliminar as canções" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "A eliminar <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> nom se puido eliminar." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Non foi possível eliminar a cançom" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Erro ao expulsar <b>%s</b>." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Nom foi possível expulsar o dispositivo" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" "Sem sistema de infraestrutura de dispositivos, desactivou-se o navegador de " "dispositivos" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Vista em paneis" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Vista em paneis" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Seleccionar _tudo" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Tudo" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Preferências do Navegador em paneis" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Listas" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Listas" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Elimina_r da Lista" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importar" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Nova Lista" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Non foi possível importar a lista" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "O Quod Libet só pode importar listas nos formatos M3U ou PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Non foi possível mudar o nome da lista" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importar lista" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Nova Lista" #: ../quodlibet/browsers/playlists/menu.py:86 #, fuzzy, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" "Está a piques de mudar as qualificações de %d canções.\n" "Deseja continuar?" msgstr[1] "" "Está a piques de mudar as qualificações de %d canções.\n" "Deseja continuar?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Nova Lista" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Preferências do Navegador em paneis" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Listas" #: ../quodlibet/browsers/playlists/util.py:33 #, fuzzy, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Está a piques de apagar a lista <i>%s</i>.\n" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Toda a informaçom sobre a lista selecionada vai ser eliminada e nom se " "poderá repor" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Introduz um nome para o novo cartafol:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "A importar a lista de reproduçom\\n\n" "\n" "%(current)d/%(total)d canções engadidas." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Limitar os resultados" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Procurar na colecçom" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Procurar na colecçom" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Vista em paneis" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Procurar" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "endereço" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "O Quod Libet nom está a ser executado." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "um gestor de música e reprodutor" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[opções]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Mostra a cançom que se está a reproduzir" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Começar a tocar imediatamente" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Ir à cançom seguinte" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "Saltar à cançom anterior ou, de estar próximo ao início, recomeçar" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Ir à cançom anterior" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Começar a reproduçom" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Parar a reproduçom" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Alternar entre reproduzir e parar" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Começar a reproduçom" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Aumentar o volume" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Diminuir o volume" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Mostrar o estado do reprodutor" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Agochar a fiestra principal" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Mostrar a fiestra principal" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Alternar entre mostrar e agochar a fiestra principal" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Centrar-se no reprodutor actual" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Eliminar os filtros de navegaçom activos" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Reler e actualizar a colecçom" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Desactivar o Navegador" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Mostrar a lista de reproduçom actual" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Mostrar o conteúdo da fileira" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Mostrar o conteúdo da fileira" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Começar sem extensões" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "O Quod Libet nom está a ser executado." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Sair do Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Avançar na cançom reproduzida" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Alternar entre reproduzir e parar" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Activar ou desactivar o modo repetiçom" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Configurar o volume" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Procurar na colecçom" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "procura" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Reproduzir um arquivo" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "nome do ficheiro" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Qualificar a cançom activa" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Configurar o navegador activo" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Qualificar a cançom activa" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Abrir um novo navegador" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Mostrar ou agochar a fileira" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Mostrar ou agochar a lista principal" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtro num valor aleatório" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "etiqueta" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtrar num valor da etiqueta" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "etiqueta=valor" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Pôr na fileira un arquivo ou procura" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Engadir à fileira nomes de arquivo separados por comas" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "nome do ficheiro" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Mostrar na saída padrom os nomes de archivo dos resultados da procura" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Eliminar da fileira um arquivo ou procura" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Argumento inválido para '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Tenta %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Dispositivo desconhecido" #: ../quodlibet/devices/__init__.py:32 #, fuzzy, python-format msgid "Could not import %s, which is needed for device support." msgstr "" "Nom se puido importar a biblioteca dbus-python, necessária para\n" "a interacçom com os dispositivos." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r nom é um dispositivo admitido." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Nom se puido achar media-player-info." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "A iniciar a infraestrutura de dispositivos." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "A tentar '%s'" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Nom se puido conectar a unha infraestrutura gestora de dispositivos." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Iniciou-se a infraestrutura de dispositivos." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Padrom para o _nome:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copiar as _cobertas dos discos" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Eliminar cobertas e cartafoles nom utilizados" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Ocorreu un erro" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Ignorar todos os _erros" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "descriçom" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "um editor de etiquetas de música" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "cartafol" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "ID do MusicBraniz da pista" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID do MusicBraniz da pista" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Codificaçom inválida]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Título" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor de etiquetas de áudio" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_Letras capitais nas etiquetas" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Preferências do Navegador em paneis" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Tamanho total:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Editar a vista" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Importância" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 #, fuzzy msgid "_Outline" msgstr "Infraestrutura de _saída:" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editar a vista" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Antever" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 #, fuzzy msgid "Automatic Masking" msgstr "Auto_mática" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 #, fuzzy msgid "Automatic Rating" msgstr "Auto_mática" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "A infraestrutura de áudio activa nom admite URLs. \n" "Desactivou-se o navegador de fontes (feeds)." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d segundo" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Personalizada" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "_Eliminar os erros" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Reprodutor de música" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Radio por Internet" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Qualificaçom" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "Predefinido" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Nom foi possível guardar a cançom" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Nom se atopárom extensões." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Letra" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Limpar a procura" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Letra" #: ../quodlibet/ext/events/lyricswindow.py:348 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "Ver e editar as tags da cançom reproduzida" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "endereço" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Agochar a fiestra principal" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Preferências" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "padrom" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "padrom" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d cançom" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Saída do registro" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "padrom" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Nom se puido conectar a unha infraestrutura gestora de dispositivos." #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "endereço" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Título" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 #, fuzzy msgid "Show notifications" msgstr "Nom há novas emisoras" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Nom se puido conectar a unha infraestrutura gestora de dispositivos." #: ../quodlibet/ext/events/notify.py:251 #, fuzzy msgid "Song Notifications" msgstr "Nom há novas emisoras" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Seguinte" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, fuzzy, python-format msgid "Could not contact service '%s'." msgstr "Nom se puido conectar a unha infraestrutura gestora de dispositivos." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Dispositivo:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Nome:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Outros:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "Padrom para o _nome:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Ál_bum aleatório" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "álbuns" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Importância" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Ál_bum aleatório" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Importar lista" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importar" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 #, fuzzy msgid "Alternative Seek Bar" msgstr "Alternativa" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Parado" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d cançom" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "padrom" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Parado" #: ../quodlibet/ext/events/trayicon/__init__.py:53 #, fuzzy msgid "Tray Icon" msgstr "Preferências da Ícona" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "Reprodutor" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "_Parar" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_Antever" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 #, fuzzy msgid "_Next" msgstr "Seguinte" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Aleatoriamente" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Repetir" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Parar despois desta cançom" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Abrir um novo navegador" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Editar as _etiquetas" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informaçom" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Listas" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Comportamento" #: ../quodlibet/ext/events/trayicon/prefs.py:42 #, fuzzy msgid "Scroll wheel adjusts volume" msgstr "" "A roda do rato axusta o volume;\n" "Shift e a roda do rato muda de cançom" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Roda do _Rato" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Editar vista" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Letra" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Erros" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 #, fuzzy msgid "Waveform Seek Bar" msgstr "Alternativa" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Arquivos" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Antever" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Filtrar no _artista" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 #, fuzzy msgid "Default" msgstr "Predefinido" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Personalizada" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Filtrar no e_stilo" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Filtrar no _artista" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Fontes de Áudio (feeds)" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Por favor, introduça a localizaçom da fonte (feed):" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Importar lista" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importar" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Nom se atopárom emisoras" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "Padrom para o _nome:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "Padrom para o _nome:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, fuzzy, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" "Está a piques de mudar as qualificações de %d canções.\n" "Deseja continuar?" msgstr[1] "" "Está a piques de mudar as qualificações de %d canções.\n" "Deseja continuar?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "As canções duplicadas serám eliminadas da lista '%s'." #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Nova Lista" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "última vez tocada" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "Na fileira" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Nunca" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "saltar contador" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Valores guardados" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Nom se puido conectar a unha infraestrutura gestora de dispositivos." #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Mudar o nome" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Colecçom" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Agochar a fiestra principal" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Nome do ficheiro" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Nom foi possível guardar a cançom" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Lista de Álbuns" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Tamanho" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Procurar:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Procurar" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Lista de Álbuns" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Editar os marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editar os marcadores..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Marcadores" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tipo de álbum segundo MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nome do ficheiro" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Disco" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Pista" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Título" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "_Artista" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tipo de álbum segundo MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "procura" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Procurar" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Nom se atopárom extensões." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Navegadores" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Nom foi possível criar o cartafol" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Mudar o nome" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "etiqueta" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Padrom inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Valor inválido" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Personalizada" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Nom foi possível copiar as canções" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Desactivar o Navegador" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Duplicate Key" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_Eliminar Emisora" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Editar a vista" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 #, fuzzy msgid "Skip Count" msgstr "saltar contador" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "Extrair as imagens incrustadas" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Extrair as imagens incrustadas" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "Extrair as imagens incrustadas" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtrar num valor da etiqueta" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "O GStreamer nom puido carregar a cançom seleccionada." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Filtrar no e_stilo" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Na fileira" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Guardar" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID do MusicBraniz da pista" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "cartafol" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "Cabeceiras dos _álbuns" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Nova Emisora" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Importar lista" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 #, fuzzy msgid "Error during sync" msgstr "Erro ao carregar %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Mudar o nome" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Importar lista" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Informaçom" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Importar lista" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Non foi possível importar a lista" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Erro ao expulsar <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Ac_tualizar a colecçom" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Ac_tualizar a colecçom" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Editar as etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Editar as etiquetas" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Todos os Álbuns" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Antever" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Etiqueta" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Nom se puidérom eliminar as canções" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Procurar" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "padrom" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Editar os valores guardados..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Cores nos termos da _procura" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Colecçom" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "A comprovar os pontos de montagem" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "A analisar a colecçom" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "A analisar %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Erro ao carregar o arquivo: %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Mostrar as etiquetas" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Mostrar saída de depuraçom" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Colunas para serem mostradas e a sua orde no modo de depuraçom (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Mostrar informaçom para de_puraçom" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Sem argumentos dabondo" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 #, fuzzy msgid "Too many arguments" msgstr "Demasiados erros" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "descriçom" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Valor" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Mostrar todas as etiquetas habituais" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Copiar as etiquetas dum arquivo para outro" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Mostrar as mudanças, sem aplica-las" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Saltar as etiquetas que nom se podem escrever" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Nom se puido copiar a etiqueta %r para o arquivo: %r" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor de etiquetas de áudio" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Sem canções seleccionadas." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Estabelecer umha etiqueta e eliminar os valores anteriores" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Nom se puido estabelecer %r" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "_Eliminar Emisora" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "O valor é umha expressom regular" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "Eliminar a tag seleccionada" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "Impossível combinar '--all' com '--regexp'" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "Impossível eliminar %r de %r" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Filtrar num valor da etiqueta" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Filtrar num valor da etiqueta" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Sem informaçom sobre a duraçom" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Erro ao carregar o arquivo: %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "Extrair as imagens incrustadas" #: ../quodlibet/operon/commands.py:568 #, fuzzy, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Extrair as imagens incrustadas" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Mudar o nome dos arquivos a partires das etiquetas" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Tirar as etiquetas da rota ao arquivo" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Arquivo" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Criar os números de pista para todos os arquivos" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Mostrar as etiquetas baseadas no padrom indicado" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Mostra informaçom sumária sobre o modo de utilizaçom" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> nom é umha localizaçom válida." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Desconhecido" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Em Ordem" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_Ordenadamente" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "Aleató_rio" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "Aleató_rio" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Repetir" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Umha cançom" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "A encher o buffer" #: ../quodlibet/player/gstbe/player.py:319 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "Nom se puido criar a pipeline GStreamer predefinida." #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 #, fuzzy msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "A saída de GStreamer utilizada para a reproduçom, e.g. 'alsasink " "device=default'.\n" "Deixa-a em branco para utilizar a predeterminada." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "Infraestrutura de _saída:" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d segundo" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "Duraçom do _buffer:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nom foi atopado dispositivo de áudio" #: ../quodlibet/player/gstbe/util.py:112 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Saida de GStreamer inválida, tentará-se com a predeterminada." #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Non foi possível criar a saída de som" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Nom se atopou o dispositivo de som %r. Verifica as configurações do Xine em " "~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, fuzzy, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Nom puido ligar-se com a pipeline do GStreamer: '%s'" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Extensões" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Formatos admitidos: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Dispositivo de áudio: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Começo" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/D" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Intre" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Nome do marcador" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Marcadores" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtros" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "_Nunca tocadas" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Engadidas _recentemente" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Nova Emisora" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "E_stilo aleatório" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "_Artista aleatório" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Ál_bum aleatório" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "As 40 canções mais tocadas (podem resultar mais se houverem canções " "reproduzidas um mesmo número de vezes)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Valor:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Valores guardados" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Editar os valores guardados..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_mática" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "Cabeceiras dos _números de pista" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "Cabeceiras dos _álbuns" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ajuste de volume do _Replay Gain" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Desconhecido" #: ../quodlibet/qltk/data_editors.py:355 #, fuzzy msgid "Tag expression" msgstr "O valor é umha expressom regular" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Filtrar num valor da etiqueta" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Arquivos" #: ../quodlibet/qltk/delete.py:63 #, fuzzy msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "As canções duplicadas serám eliminadas da lista '%s'." #: ../quodlibet/qltk/delete.py:72 #, fuzzy msgid "The selected files will be deleted from disk." msgstr "As canções duplicadas serám eliminadas da lista '%s'." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Eliminar os ficheiros" #: ../quodlibet/qltk/delete.py:106 #, fuzzy msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "As canções duplicadas serám eliminadas da lista '%s'." #: ../quodlibet/qltk/delete.py:115 #, fuzzy msgid "The selected files will be moved to the trash." msgstr "As canções duplicadas serám eliminadas da lista '%s'." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Mover à Lixeira" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "A mover %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "Nom foi possível guardar a base de dados do iPod" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Erro ao expulsar <b>%s</b>." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "A eliminar %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Nom foi possível eliminar o arquivo" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Erro ao intentar eliminar <b>%s</b>." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Descargas" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Tamanho" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "nom se achou da cançom %d" msgstr[1] "nom se achou de %d canções" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "diferente em %d cançom" msgstr[1] "diferente em %d cançõess" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Extraer em valores _múltiplos" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Extraer o disco do _Álbum" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Extraer a _Versom do Título" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Extraer o Arrangista do Ar_tista" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Extraer o _Intérprete do Artista" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Extraer o _Intérprete do Artista" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Extraer a _Versom do Título" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Engadir umha etiqueta" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "E_tiqueta:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Editar as etiquetas" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Mostrar informaçom para de_puraçom" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Acesso a todas as etiquetas, mesmo as geradas automaticamente, p.ex. " "etiquetas da MusicBrainz ou Replay Gain" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Nunca" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Nom foi possível engadir a etiqueta" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Nom foi possível engadir a cançom" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Nom foi possível engadir <b>%s</b>\n" "\n" "Os arquivos seleccionados nom permitem valores múltiplos." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Etiqueta inválida" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Etiqueta inválida <b>%s</b>\n" "\n" "Os arquivos seleccionados nom permitem a ediçom das etiquetas." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Valor inválido" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Valor inválido: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "A etiqueta pode nom ser correcta" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> mudou mentres o programa está a ser executado. Guardar sem reler a " "colecçom pode eliminar outras modificações que se figéram.\n" "\n" "Guardar de todos xeitos?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Nom foi possível guardar a cançom" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Erro ao guardar <b>%s</b>. Pode ser que o arquivo só permita a leitura, " "esteja corrompido, ou nom tenha permissões para o editar." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Mais opções..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Extensões" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s e %(count)d mais" msgstr[1] "%(title)s e %(count)d mais" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Preferências do Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Extraer _de:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Ediçom das etiquetas" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Cartafoles" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Novo Cartafol" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "Seleccionar todos os _cartafoles subordinados" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Novo Cartafol" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Introduz um nome para o novo cartafol:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Nom foi possível criar o cartafol" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Nom foi possível eliminar o cartafol" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Canções" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "por %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disco %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Pista %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Editar a vista" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Sem canções seleccionadas." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Sem Canções" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informaçom" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Letra" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Produzido por %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artistas" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "intérpretes" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Nunca" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d vez" msgstr[1] "%d vezes" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "engadida" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "última vez tocada" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "contador" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "saltada" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "qualificaçom" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "duraçom" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Informaçom" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "Ascendente" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "taxa de bits" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "tamaño do ficheiro" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "modificada" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d seleccionada" msgstr[1] "%d seleccionadas" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Pista nom disponível" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Lista de pistas" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d cançom sem album" msgstr[1] "%d canções sem album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Discografia seleccionada" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d cançom sem artista" msgstr[1] "%d canções sem artista" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "álbuns" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Duraçom total:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Tamanho total:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Arquivos" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Baixar" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Editar a vista..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Nom se atopou a letra desta cançom" #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "A procurar a letra..." #: ../quodlibet/qltk/maskedbox.py:20 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "" "Está a piques de mudar as qualificações de %d canções.\n" "Deseja continuar?" #: ../quodlibet/qltk/maskedbox.py:21 #, fuzzy msgid "The selected songs will be removed from the library." msgstr "As canções duplicadas serám eliminadas da lista '%s'." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Descartar as mudanças na etiqueta?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "As etiquetas fôrom mudadas mais nom guardadas. Guardar os ficheiros, ou " "desfazer e descartar as mudanças?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Nunca" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "O arquivo já existe" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Mudar o nome dos arquivos" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Tarefas ativas" #: ../quodlibet/qltk/notif.py:188 #, fuzzy, python-format msgid "%d tasks running" msgstr "Quod Libet está a ser executado" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Alternar entre reproduzir e parar" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Alternar entre reproduzir e parar" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Erros das extensões" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Activado" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Desactivado" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Sem categoria" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "Ordem de Repr_oduçom" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Ediçom das etiquetas" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Tamanho total:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Nom se atopárom extensões." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Extensões" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Mostrar os _erros" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disco" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Pista" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "agrupaçom" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Ál_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Nome" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "D_uraçom" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Ir à cançom reproduzida automaticamente" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Centrar a lista na cançom reproduzida quando esta mudar" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Outros:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Editar a vista..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Engadir ou eliminar colunas de informaçom adicionais." #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Colunas visíveis" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "O título inclúi a _versom" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "A procura _inclúi \"componentes\"" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "O album inclúi o subtítulo do _disco / parte" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "O nome inclúi o _cartafol" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Preferências" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Aplicar a configuraçom actual á lista, engadindo novas colunas ao final" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Lista de canções" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Colunas adicionais" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "Filtro _global:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Aplicar esta procura engadindo-a às demais" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Procurar" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Navegadores" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Confirmar a _qualificaçom múltipla" #: ../quodlibet/qltk/prefs.py:295 #, fuzzy msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Obter confirmaçom antes de mudar a qualificaçom de várias canções à vez." #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Activar as qualificações com _um click" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Permitir mudar a qualificaçom com um click na coluna de qualificações da " "lista" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Qualificações" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Preferir as capas _integradas" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Escholhe utilizar as capas integradas no arquivo de áudio (quando estiverem " "disponíveis), com preferência sobre outras fontes" #: ../quodlibet/qltk/prefs.py:319 #, fuzzy msgid "_Fixed image filename:" msgstr "_Forçar o nome de arquivo da imagem:" #: ../quodlibet/qltk/prefs.py:321 #, fuzzy msgid "The single image filename to use if selected" msgstr "O nome do arquivo da capa que se pretender forçar" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "O nome do arquivo da capa que se pretender forçar" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Lista de Álbuns" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Parar a reproduçom" #: ../quodlibet/qltk/prefs.py:362 #, fuzzy msgid "Output Configuration" msgstr "Saída do registro" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "De nom existir informaçom sobre o axuste Replay Gain para a cançom, " "multiplicar o volume por este valor" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Ganância por defeito (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Multiplicar o volume de todas as canções por este valor, sempre que nom se " "produçam cortes" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Ganância do _volume (dB)" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "_Activar o ajuste de volume do _Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Ajuste de volume do _Replay Gain" #: ../quodlibet/qltk/prefs.py:450 #, fuzzy msgid "_Default rating:" msgstr "Predefinido" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "Qualificações" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Factor de Média Bayesiana (C) para as qualificações agregadas.\n" "0 significa umha média convencional, valores máis elevados significam que os " "álbuns\n" "com poucas pistas terám menores qualificações estremas. Modificar este valor " "fai que se inicie\n" "o recálculo para todos os álbuns." #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "Quantidade da média _Bayesiana" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Guardar qualificações e o _contador" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Endereço de correio-e" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "As qualificações e o contador determinarám-se para este endereço de correio-e" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Descartar as mudanças na etiqueta?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Ao se editárem múltiplos arquivos, guardar as modificações às etiquetas sen " "solicitar confirmaçom individual" #: ../quodlibet/qltk/prefs.py:587 #, fuzzy msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Relaçom de separadores para diferenciar os valores das etiquetas, separados " "por espaços" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Editar as etiquetas" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Nova Emisora" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "Actualizar a colecçom ao iniciar" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Procurar na colecçom" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Procurar mudanças na colecçom" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Reler a colecçom" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Reler todas as canções da sua colecçom (pode demorar moito tempo)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Analisar os _cartafoles" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Sem Canções" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s e %(count)d mais" msgstr[1] "%(title)s e %(count)d mais" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Propriedades" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Fileira" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Eliminar os erros" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d cançom (%(time)s)" msgstr[1] "%(count)d canções (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Examinar a colecçom" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Alternar entre mostrar e agochar a fiestra principal" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Parar a reproduçom" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Seleccionar os cartafoles" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Nom foi possível engadir as canções" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> emprega um protocolo nom admitido." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Ir à cançom reproduzida" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Arquivo" #: ../quodlibet/qltk/quodlibetwindow.py:987 msgid "_Song" msgstr "C_ançom" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Ver" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Navegadores" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Controis" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Ajuda" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "_Engadir um Cartafol..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "_Engadir um arquivo..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Engadir umha localizaçom" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editar os marcadores..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Parar despois desta cançom" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Ajuda na Internet" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Procurar" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Engadir umha localizaçom" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Por favor, introduça a localizaçom dum arquivo de música:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Nom foi possívell engadir a localizaçom" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nom é umha localizaçom válida." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Engadir música" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Engadir um Cartafol..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Reprodutor de música" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Engadir um arquivo..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, fuzzy, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" "Está a piques de mudar as qualificações de %d canções.\n" "Deseja continuar?" #: ../quodlibet/qltk/ratingsmenu.py:26 #, fuzzy msgid "The saved ratings will be removed" msgstr "As canções duplicadas serám eliminadas da lista '%s'." #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "A qualificaçom de todas as canções seleccionadas mudará para '%s'" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Eliminar Emisora" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Qualificaçom" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Reemprazar espaços com _guiões baixos" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Eliminar os caracteres nom compatíveis com _Windows(tm)" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Eliminar as marcas _diacríticas" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Eliminar os caracteres nom-_ASCII" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Utilizar unicamente caracteres de caixa-_baixa" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Mudar o nome dos arquivos" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "padrom" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Editar os valores guardados..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Antever" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Novo nome" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Nom foi possível mudar o nome do arquivo" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Erro ao tentar mudar o nome de <b>%s</b> a <b>%s</b>. Pode ser que o arquivo " "de destino já exista, ou que nom tenha permissões para criar o novo arquivo " "ou eliminar o antigo." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Ignorar todos os _erros" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Continuar" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "A rota nom é absoluta" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "O padrom\n" "\t<b>%s</b>\n" "contém / mais nom começa no cartafol pai (/). Para previr cartafoles com " "nomes errados, começa o padrom por / or ~/." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "As canções localizadas nesses cartafoles (separados por ':') serám engadidas " "à sua colecçom" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Seleccionar os cartafoles" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Valores guardados" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Editar os valores guardados..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "Procura na tua colecçom, empregando texto ou procuras do QL" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Procurar despois de _escrever" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Mostrar os resultados despois de rematar de escrever." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limite:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Importância" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Mostrar o tempo restante" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Letra" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Centrar-se no reprodutor actual" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Avançar na cançom reproduzida" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Nom se puidérom eliminar as canções" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Nom se puidérom eliminar as canções" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 #, fuzzy msgid "Expands the element" msgstr "Colunas adicionais" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtrar por %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "Cabeceiras dos _álbuns" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Cabeceiras dos _números de pista" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Cabeceiras dos _álbuns" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Cabeceiras dos _componentes" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Cabeçeiras de _data" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Cabeceira dos _arquivos" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Cabeceiras da _produçom" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Personalizar as cabeceiras..." #: ../quodlibet/qltk/songlist.py:1120 #, fuzzy msgid "_Expand Column" msgstr "Colunas adicionais" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Cores nos termos da _procura" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "En_gadir à fileira" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Copiar ao dispositivo" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Eliminar da Colecçom" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Reemprazar _guiões baixos com espaços" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Letras capitais nas etiquetas" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Dividir em _valores múltiplos" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Etiquetas a partires da rota" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "As etiquetas substituem as já existentes" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "As etiquetas engadem-se às já existentes" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "O padrom\n" "\t<b>%s</b>\n" "é inválido. Pode ser que contenha duas vezes a mesma etiqueta ou que tenha " "chaves dessajustadas(< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Etiquetas inválidas" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Etiquetas inválidas <b>%s</b>\n" "\n" "Os arquivos seleccionados nom permitem a ediçom das etiquetas." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "O padrom introduzido é inválido. Assegure-se de que pus < e > como " "\\< e \\> e que as etiquetas estám ajustadas.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Editar a vista" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Números de pista" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Começar de_nde:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Pistas totais:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "_Parar" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_Antever" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "e %d mais..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "A guardar as canções modificadas." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d canções guardadas\\n\n" "(%(remaining)s restantes)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "A mover %(current)d/%(total)d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "A comprovar os pontos de montagem" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "endereço" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Xá existe umha lista co nome %s ." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Mostrar _cobertas dos discos" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Sistema de arquivos" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Mostra informaçom sumária sobre o modo de utilizaçom" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Mostrar a versão e o copyright" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[opções]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Nom se reconhece a opçom %r." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "A opçom %r requer um argumento." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r nom é um prefixo único." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Sem informaçom sobre a duraçom" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d segundo" msgstr[1] "%d segundos" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hora" msgstr[1] "%d horas" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dia" msgstr[1] "%d dias" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d ano" msgstr[1] "%d anos" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Nom há titlecase em galego" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "A data há ser introduzida no formato 'YYYY', 'YYYY-MM-DD' ou 'YYYY-MM-DD HH:" "MM:SS'" #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "As ganâncias Replay Gain ham-de-ser introduzidas no formato 'x.yy dB'" #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Os picos ReplayGain ham-de-ser introduzidos no formato 'x.yy'" #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "As IDs das pistas MusicBrainz ham-de-ser no formato UUID." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "O estado oficial da publicaçom no MusicBrainz há ser 'official', " "'promotional' ou 'bootleg'" #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "O idioma tem de ser um código de três letras ISO 639-2" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Nom foi possível editar a etiqueta da cançom" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Erro ao guardar <b>%s</b>. Pode ser que o arquivo só permita a leitura, " "esteja corrompido, ou nom tenha permissões para o editar." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Codificaçom inválida]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "álbum" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arrangista" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arrangistas" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "arrangista" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "autor/a" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "autores/as" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "compositor/a" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "compositores/as" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "compositor/a" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "director/a" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "directores/as" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "director/a" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "Contacto" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "descriçom" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "estilo" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "estilo" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "intérprete" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "agrupaçom" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "idioma" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licença" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "endereço" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "autor da letra" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "Autores/as das letras" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "autor da letra" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "companhia" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "título" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versom" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "Sítio de Internet" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "artista do álbum" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "parte" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disco" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "pista" # label ID #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "Número de catálogo" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "data de publicaçom original" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "álbum original" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "artista original" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "data da gravaçom" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "país de publicaçom" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID do MusicBraniz da pista" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID do MusicBrainz do lançamento" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "ID do MusicBrainz do lançamento" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID do MusicBrainz do artista" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID do MusicBrainz do lançamento" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "ID do MusicBraniz do TRM" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "PUID do MUsicIP" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "Estado do álbum segundo MusicBrainz" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Tipo de álbum segundo MusicBrainz" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "ID do MusicBrainz do lançamento" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "ganância de volume da pista" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "pico de ganância da pista" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "ganância de volume do âlbum" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "pico de ganância do álbum" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Preferências" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "discos" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "pistas" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "última vez iniciada" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "localizaçom" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "ponto de montagem" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "componentes" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "ano" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "data de publicaçom original" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "marcador" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "Formato" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Listas" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Navegadores" #, fuzzy #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "" #~ "Nom se puido importar o python-feedparser. Desactivou-se o navegador de " #~ "fontes (feeds) " #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Ocorreu un problema no Quod Libet. Un arquivo de depuraçom, que nos pode " #~ "ajudar a analisar o erro, foi guardado em <b>%s</b>. \n" #~ "Por favor, abre un novo tema en http://code.google.com/p/quodlibet/issues/" #~ "list e inclúi o arquivo ou o contido do mesmo. \n" #~ "O arquivo pode conter informaçom do teu sistema, p.ex. unha lista das " #~ "canções reproduzidas recentemente. \n" #~ "Se isso nom for aceitável, envia <b>%s</b> com umha descriçom do que " #~ "estavas a fazer." #~ msgid "" #~ "Quod Libet may now be unstable. Closing it and restarting is recommended. " #~ "Your library will be saved." #~ msgstr "" #~ "QuodLibet pode ressultar inestável. Recomenda-se fechá-lo e reiniciá-lo.\n" #~ "Guardará-se a colecçom." #~ msgid "Unable to download lyrics." #~ msgstr "Nom se puido baixar a letra" #~ msgid "Remove all songs from the queue" #~ msgstr "Eliminar todas as canções da fileira" #~ msgid "Watch this folder for new songs" #~ msgstr "Verificar a existência de novas canções no cartafol" #~ msgid "Set or toggle the playback order" #~ msgstr "Configurar ou alternar a ordem de reproduçom" #~ msgid "Uninitialized iPod" #~ msgstr "iPod sem configurar" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Desejas criar umha base de dados baleira neste iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "Ganância do _volume (dB)" #~ msgid "Combine tags with _multiple values" #~ msgstr "Combinar as etiquetas com múltiplos _valores" #~ msgid "Model:" #~ msgstr "Modelo:" #~ msgid "Capacity:" #~ msgstr "Capacidade:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #~ msgid "Removing orphaned iPod track" #~ msgstr "A eliminar pista orfã do iPod" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Nom foi possível guardar a base de dados do iPod" #~ msgid "Unable to save iPod database" #~ msgstr "Nom foi possível guardar a base de dados do iPod" #, fuzzy #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "" #~ "Nom se puido importar a biblioteca python-gpod,\n" #~ "as capacidades de interacçom com o iPod fôrom desactivadas." #, fuzzy #~ msgid "Track Repeat" #~ msgstr "pico de ganância da pista" #~ msgid "Shuffle" #~ msgstr "Aleatoriamente" #~ msgid "Weighted" #~ msgstr "Dinâmica" #~ msgid "_Weighted" #~ msgstr "_Dinâmica" #~ msgid "_One Song" #~ msgstr "_Umha cançom" #~ msgid "Restart the playlist when finished" #~ msgstr "Recomeçar a lista de reproduçom ao rematar" #~ msgid "Disable Browser" #~ msgstr "Desactivar o Navegador" #~ msgid "_Disable Browser" #~ msgstr "_Desactivar o Navegador" #, fuzzy #~ msgid "Force Write" #~ msgstr "Guardar" #~ msgid "Filter on _Genre" #~ msgstr "Filtrar no e_stilo" #~ msgid "Filter on _Artist" #~ msgstr "Filtrar no _artista" #~ msgid "Filter on Al_bum" #~ msgstr "Filtrar no ál_bum" #~ msgid "_Music" #~ msgstr "_Música" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Marcadores" #~ msgid "Song _List" #~ msgstr "_Lista de canções" #, fuzzy #~ msgid "D:" #~ msgstr "A:" #, fuzzy #~ msgid "W:" #~ msgstr "A:" #, fuzzy #~ msgid "E:" #~ msgstr "E:" #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "A roda do rato muda de cançom;\n" #~ "Shift e a roda do rato configura o volume" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Parar despois desta cançom" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "e %d mais..." #~ msgstr[1] "e %d mais..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Extraer o disco do _Álbum" #, fuzzy #~ msgid "Timeout" #~ msgstr "Intre" #, fuzzy #~ msgid "Select an album" #~ msgstr "Seleccionar _tudo" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s e %(count)d mais" #~ msgstr[1] "%(title)s e %(count)d mais" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Listas" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "_Utilizar cantos redondeados nas miniaturas" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "Redondear os cantos das miniaturas das cobertas. Pode ser necessário " #~ "reiniciar para que tenha efecto." #~ msgid "Re_fresh Library" #~ msgstr "Ac_tualizar a colecçom" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Eliminar Emisora" #~ msgid "Unable to open input files" #~ msgstr "Nom se puiderom abrir os arquivos" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "O GStreamer nom tem nengum elemento para ler arquivos. Verifica as opções " #~ "de instalaçom do GStreamer." #~ msgid "Invalid audio backend" #~ msgstr "A infraestrutura de som nom é válida" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "A infraestrutura de som %r nom está instalada." #~ msgid "ql-save" #~ msgstr "Guardar" #, fuzzy #~ msgid "ql-revert" #~ msgstr "E_liminar" #~ msgid "Print all tags to stdout" #~ msgstr "Mostrar todas as etiquetas na saída estándard" #~ msgid "Load tags dumped with 'dump'" #~ msgstr "Mostrar as etiquetas que arroja o 'dump'" #~ msgid "command|filename" #~ msgstr "nome de arquivo" #~ msgid "command|tag" #~ msgstr "etiqueta" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: Nom se puido achar media-player-info." #, fuzzy #~ msgid "heading|Search" #~ msgstr "Procurar" #~ msgid "%d of %d" #~ msgstr "%d de %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Utilizaçom: %s %s" #~ msgid "_Download..." #~ msgstr "_Baixar..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Nova Emisora" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Sobreescrever <b>%s</b>?" #~ msgid "Output Error" #~ msgstr "Erro na saída" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "Nom se puido iniciar a saída do GStreamer. Pode ser que a saída " #~ "especificada seja inválida\n" #~ "ou que o dispositivo esteja a ser utilizado. Verifique as configurações " #~ "do reprodutor." #~ msgid "Quod Libet is already running." #~ msgstr "O Quod Libet já se está a executar." #~ msgid "No song is currently playing." #~ msgstr "Nom se está a reproduzir cançom nengumha." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Nom foi possível escrever em %s. Eliminando-o." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Editar os marcadores..." #~ msgid "_New Folder..." #~ msgstr "Novo _cartafol..." #~ msgid "_Add to Playlist" #~ msgstr "_Engadir à lista" #~ msgid "_Edit Display..." #~ msgstr "_Editar a vista..." #~ msgid "Output Log" #~ msgstr "Saída do registro" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d emisora" #~ msgid "_Order:" #~ msgstr "_Ordem:" #~ msgid "_Add a Location..." #~ msgstr "_Engadir umha localizaçom..." #~ msgid "_Output Log" #~ msgstr "_Registro" #~ msgid "Invalid command %r received." #~ msgstr "Recebeu-se o comando inválido %r." #~ msgid "Unknown browser %r." #~ msgstr "Navegador desconhecido %r." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Personalizar as cabeceiras..." #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "" #~ "Está a piques de mudar as qualificações de %d canções.\n" #~ "Deseja continuar?" #~ msgstr[1] "" #~ "Está a piques de mudar as qualificações de %d canções.\n" #~ "Deseja continuar?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "" #~ "Está a piques de mudar as qualificações de %d canções.\n" #~ "Deseja continuar?" #~ msgstr[1] "" #~ "Está a piques de mudar as qualificações de %d canções.\n" #~ "Deseja continuar?" #, fuzzy #~ msgid "Track Headers" #~ msgstr "Cabeceiras dos _números de pista" #, fuzzy #~ msgid "People Headers" #~ msgstr "_Cabeceiras dos _componentes" #, fuzzy #~ msgid "Album Headers" #~ msgstr "Cabeceiras dos _álbuns" #, fuzzy #~ msgid "Date Headers" #~ msgstr "Cabeçeiras de _data" #, fuzzy #~ msgid "File Headers" #~ msgstr "Cabeceira dos _arquivos" #, fuzzy #~ msgid "Production Headers" #~ msgstr "Cabeceiras da _produçom" #, fuzzy #~ msgid "Tag:" #~ msgstr "E_tiqueta:" #~ msgid "Descending" #~ msgstr "Descendente" #~ msgid "Too Many Errors" #~ msgstr "Demasiados erros" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "A parar a reproduçom porque se sucedérom %d erros seguidos." #~ msgid "Warnings" #~ msgstr "Advertências" #~ msgid "General" #~ msgstr "Geral" #~ msgid "No log available." #~ msgstr "Sem registros" #~ msgid "album artist (sort)" #~ msgstr "artista do álbum (ordenar)" #~ msgid "artist (sort)" #~ msgstr "artista (ordenar)" #~ msgid "album (sort)" #~ msgstr "álbum (ordenar)" #~ msgid "performer (sort)" #~ msgstr "intérprete (ordenar)" #~ msgid "performers (sort)" #~ msgstr "intérpretes (ordenar)" #~ msgid "MusicBrainz album artist ID" #~ msgstr "ID do MusicBrainz do artista do album" #~ msgid "errors" #~ msgstr "erros" #~ msgid "Failed reading album art \"%s\"" #~ msgstr "Erro ao ler a capa do álbum \"%s\"" #~ msgid "Permanently delete this file?" #~ msgstr "Eliminar permanentemente este arquivo?" #~ msgid "Permanently delete these files?" #~ msgstr "Eliminar permanentemente estes arquivos?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s e %(count)d mais..." #~ msgstr[1] "%(title)s e %(count)d mais..." #, fuzzy #~ msgid "Version:" #~ msgstr "versom" #~ msgid "_Cause an Error" #~ msgstr "_Provocar um erro" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s nom se puido engadir à colecçom.\n" #~ "\n" #~ msgid "Error running command %r, caused by: %r." #~ msgstr "Erro ao executar o comando %r, causado por: %r." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%s</b> that will help us debug the crash. Please file a new issue at " #~ "http://code.google.com/p/quodlibet/issues /list and attach this file or " #~ "include its contents. This file may contain some identifying information " #~ "about you or your system, such as a list of recent files played. If this " #~ "is unacceptable, send <b>% s</b> instead with a description of whatyou " #~ "were doing." #~ msgstr "" #~ "Ocorreu un problema no Quod Libet. Un arquivo de depuraçom, que nos pode " #~ "ajudar a analisar o erro, foi guardado em <b>%s</b>. \n" #~ "Por favor, abre un novo tema en http://code.google.com/p/quodlibet/issues/" #~ "list e inclúi o arquivo ou o contido do mesmo. \n" #~ "O arquivo pode conter informaçom do teu sistema, p.ex. unha lista das " #~ "canções reproduzidas recentemente. \n" #~ "Se isso non é aceitável, envia <b>%s</b> com umha descriçom do que " #~ "estavas a fazer.\n" #~ "\n" #~ "O Quod Libet pode-se tornar agora inestável. Fecha-lo e executá-lo de " #~ "novo é o recomendado. A base de dados da sua coleçom guardará-se." #~ msgid "Could not import python-gpod, iPod support disabled." #~ msgstr "" #~ "Nom se puido importar a biblioteca python-gpod,\n" #~ "as capacidades de interacçom com o iPod fôrom desactivadas." #, fuzzy #~ msgid "_Output device:" #~ msgstr "Infraestrutura de _saída:" #~ msgid "Search your library" #~ msgstr "Procurar na colecçom" #~ msgid "No eject command found." #~ msgstr "Nom foi encontrado o comando para expulsar (eject)." #~ msgid "Unable to start web browser" #~ msgstr "Nom foi possível iniciar um navegador de Internet" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Nom se atopu nengum navegador de Internet. Por favor, configure a " #~ "variável $BROWSER, ou verifique que /usr/bin/navegador existe." #, fuzzy #~ msgid "Library Error" #~ msgstr "Navegador da Colecçom" #~ msgid "translator-credits" #~ msgstr "ashtophet" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Outras colunas para seren mostradas, separadas por espaços" #~ msgid "_Edit and Continue" #~ msgstr "_Editar e continuar" #, fuzzy #~ msgid "You are about to change the rating of %d song." #~ msgid_plural "You are about to change the rating of %d songs." #~ msgstr[0] "" #~ "Está a piques de mudar as qualificações de %d canções.\n" #~ "Deseja continuar?" #~ msgstr[1] "" #~ "Está a piques de mudar as qualificações de %d canções.\n" #~ "Deseja continuar?" #~ msgid "Confirm rating" #~ msgstr "Confirmar a qualificaçom" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quod-libet-development@googlegroups.com>\n" #~ "Copyright 2004-2010 Joe Wreschnig, Michael Urman, et alii\n" #~ "\n" #~ "Este programa é Software Livre: aceda ao código fonte para verificar as " #~ "condições de cópia.\n" #~ "NOM HÁ garantia nemgumha; nem sequera de APTITUDE PARA O COMÉRCIO ou de " #~ "SER\n" #~ "AXEITADO PARA ALGUM PROPÓSITO PARTICULAR.\n" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r nom contém nengum navegador." #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Tamanho total:" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r nom contém nengum dispositivo." #~ msgid "%s: Could not import ctypes." #~ msgstr "%s: Nom se puido importar o ctypes." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: Nom se puido achar media-player-info." #, fuzzy #~ msgid "Couldn't find module %s." #~ msgstr "%s: Nom se puido achar media-player-info." #~ msgid "Quod Libet Plugins" #~ msgstr "Extensões do Quod Libet" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Mostrar as procuras simples em azul, as avançadas em verde, e as " #~ "inválidas em vermelho" #~ msgid "_Select" #~ msgstr "_Seleccionar" #~ msgid "Separators for splitting tags" #~ msgstr "Separadores para extraer as etiquetas" #~ msgid "Quod Libet Preferences" #~ msgstr "Preferências do Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Nom tocadas _hoje" #~ msgid "Not Played in a _Week" #~ msgstr "Nom tocadas numha _semana" #~ msgid "Not Played in a _Month" #~ msgstr "Nom tocadas num _més" #~ msgid "B_ottom 40" #~ msgstr "Ú_ltimas 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "As 40 canções que menos tocadas (podem resultar mais se houverem canções " #~ "reproduzidas o mesmo número de vezes)" #~ msgid "gtk-media-next" #~ msgstr "_Seguinte" #~ msgid "gtk-media-previous" #~ msgstr "_Anterior" #~ msgid "gtk-media-play" #~ msgstr "_Reproduzir" #~ msgid "gtk-media-pause" #~ msgstr "_Parar" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #~ msgid "Date" #~ msgstr "Data" #~ msgid "Choose New Stations" #~ msgstr "Escolher Novas Emisoras" #~ msgid "Add" #~ msgstr "Engadir" #~ msgid "Bitrate" #~ msgstr "Taxa de bits" #~ msgid "_Stations..." #~ msgstr "_Emisoras..." #~ msgid "Quod Libet" #~ msgstr "Quod Libet" #~ msgid "Initializing audio backend (%s)" #~ msgstr "A activar a infraestrutura de som (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "A carregar a colecçom principal (%s)" #~ msgid "Unable to save library" #~ msgstr "Nom foi possível guardar a colecçom" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Impossível reproduzir a cançom" #~ msgid "" #~ "The audio output pipeline %r could not be created. Check your GStreamer " #~ "settings in ~/.quodlibet/config." #~ msgstr "" #~ "A saída de áudio %r non puido ser criada. Verifica as configurações do " #~ "GStreamer em ~/.quodlibet/config." #~ msgid "Sort by title" #~ msgstr "Ordenar polo título" #~ msgid "Sort by artist" #~ msgstr "Ordenar polo artista" #~ msgid "Lyrics provided by %s." #~ msgstr "Letra fornecida por %s" #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Nom se atopou a letra.\n" #~ "\n" #~ "Pode premer em Baixar para que o QL as procure em Internet. Tamém pode " #~ "introduzi-la voçê e guardá-la" #~ msgid "Recommend" #~ msgstr "Recomendada" #~ msgid "_LastFM webservice URL: http://" #~ msgstr "URL do serviço web do _LastFM: http://" #~ msgid "The main url for lastfm webservices. Must end in a trailing /" #~ msgstr "A url principal para os serviços web do lastfm. Deve rematar em /" #~ msgid "LastFM _similar artist webservice: " #~ msgstr "Serviço web de artista _similar do LastFM:" #~ msgid "" #~ "Enter here the xml webservice lookup that gets appended to the main " #~ "service url" #~ msgstr "" #~ "Indroduz o enderezo do ficheiro xml que complementa a url do serviço " #~ "principal" #~ msgid "LastFM top _tracks webservice: " #~ msgstr "Canções mais _tocadas do serviço LastFM:" #~ msgid "LastFM top _albums webservice: " #~ msgstr "_Albums mais tocados do serviço LastFM:" #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d canções guardadas" #~ msgid "part" #~ msgstr "Movimento" #~ msgid "Opening audio device." #~ msgstr "A aceder ao dispositivo de áudio." #~ msgid "MusicBrainz album ID" #~ msgstr "ID de MusicBrainz do álbum" #~ msgid "Loaded song library." #~ msgstr "A colecçom musical foi carregada." #~ msgid "Unable to open audio device" #~ msgstr "Impossível aceder ao dispositivo de som" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "O Quod Libet tentou aceder aos controladores 'autosink' e '%(sink)s' mais " #~ "nom puido abrir nengum deles. Configure o plugin do GStreamer mudando a\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "linha anterior em ~/.quodlibet/config" #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "O Quod Libet nom puido atopar o elemento do GStreamer 'filesrc'. Comprove-" #~ "se a instalaçom do GStreamer." #~ msgid "Unable to retag multiple values" #~ msgstr "Impossível modificar distintos valores da etiqueta" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "" #~ "Mudar o nome dumha etiqueta com múltiplos valores non está suportado" #~ msgid "W: %s is not a QL song database." #~ msgstr "W: %s nom é umha cançom da colecçom do QL." #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "Ajuste de volume por-cançom (\"Radio\")" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "Ajuste de volume por-album (\"Audiophile\")" #~ msgid "_Volume Normalization" #~ msgstr "Normalizaçom do _Volume" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "A examinar a sua colecçom. Pode levar vários minutos.\n" #~ "\n" #~ "%d canções recarregadas\n" #~ "%d canções eliminadas" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "A procurar novas canções e a engadi-las à colecçom.\n" #~ "\n" #~ "%d canções engadidas" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "Nom podem ser carregadas listas M3U" #~ msgid "This station is already in your library." #~ msgstr "Esta emisora já está na sua colecçom" #~ msgid "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgstr "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "por <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disco <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgid "The library cannot be refreshed while Quod Libet is running." #~ msgstr "" #~ "A colecçom nom pode ser actualizada no entanto o QL está a ser executado." #~ msgid "Loading, scanning, and saving your library." #~ msgstr "A carregar, a examinar e a guardar a sua colecçom." #~ msgid "Rescan your library and exit" #~ msgstr "Actualiza a sua colecçom" #~ msgid "Old Plugins" #~ msgstr "Extensões antigas" #~ msgid "" #~ "It looks like you are running Quod Libet right now. If you edit songs " #~ "also in Quod Libet's library while it is running, you may need to refresh " #~ "or re-add them.\n" #~ "\n" #~ "If you are not running Quod Libet, or are editing songs outside of its " #~ "library, you may ignore this warning." #~ msgstr "" #~ "Semelha que está a executar, assemade, o Quod Libet. Se editar as tags " #~ "das canções na colecçom do QL no entanto estiver a ser executado, " #~ "cumprirá que as engada ou actualize a colecçom.\n" #~ "\n" #~ "Se nom estiver a executar QL, ou estiver a editar as tags além da sua " #~ "colecçom, pode ignorar esta advertência." #~ msgid "GStreamer status %r != %r" #~ msgstr "Estado do GStreamer %r != %r" #~ msgid "_Pane %d:" #~ msgstr "_Panel %d:" #~ msgid "Double-click a tag value to change it, right-click for other options" #~ msgstr "" #~ "Duplo-clic num valor da tag para mudá-lo, clic-direito para outras opções" #~ msgid "Add a new tag" #~ msgstr "Engadir umha nova tag" #~ msgid "Tag by Filename" #~ msgstr "Tag a partires do Nome" #~ msgid "The first letter of each word will be capitalized" #~ msgstr "A primeira letra de cada palavra será posta em maiúsculas" #~ msgid "" #~ "Characters not allowed in Windows filenames (\\:?;\"<>|) will be replaced " #~ "by underscores" #~ msgstr "" #~ "Os caracteres nom permitidos nos nomes de ficheiro de WindowsTM (\\:?;" #~ "\"<>|) serám reemprazados por barras baixas" #~ msgid "" #~ "Characters outside of the ASCII set (A-Z, a-z, 0-9, and punctuation) will " #~ "be replaced by underscores" #~ msgstr "" #~ "Os caracteres além do conjunto ASCII (A-Z, a-z, 0-9, e pontuaçom) serám " #~ "reemprazados com barras baixas" #~ msgid "Apply to these _files..." #~ msgstr "Aplicar a estes _ficheiros..." #~ msgid "Path" #~ msgstr "Endereço" #~ msgid "Tray Preferences - Quod Libet" #~ msgstr "Preferências da icona - Quod Libet" #~ msgid "E: You need GTK+ 2.6 and PyGTK 2.6 or greater." #~ msgstr "E: Necesita GTK+ 2.6 e PyGTK 2.6 (ou versões máis novas)." #~ msgid "E: You have GTK+ %s and PyGTK %s." #~ msgstr "E: Tem GTK+ %s e PyGTK %s." #~ msgid "E: Please upgrade GTK+/PyGTK." #~ msgstr "E: Por favor, actualize GTK+/PyGTK." #~ msgid "Set play order" #~ msgstr "Estabelecer a ordem de reproduçom" #~ msgid "" #~ "Deleting <b>%s</b> failed. Possibly the target file does not exist, or " #~ "you do not have permission to delete it." #~ msgstr "" #~ "A eliminaçom de <b>%s</b> errou. Possivelmente o ficheiro nom existe, ou " #~ "vostede nom tem permissões para eliminá-lo." #~ msgid "%(different)s, %(missing)s" #~ msgstr "%(different)s, %(missing)s" #~ msgid "Search Bar" #~ msgstr "Barra de pesquisa" #~ msgid "Play songs in random order" #~ msgstr "Reproduz as canções em ordem aleatória" #~ msgid "S_ong" #~ msgstr "Canç_om" #~ msgid "_Choose randomly" #~ msgstr "_Escolher aleatoriamente" #~ msgid "Drag songs here to add them to the play queue" #~ msgstr "Arrastar canções para engadir" #~ msgid "" #~ "Quod Libet was unable to open your audio device. Often this means another " #~ "program is using it, or your audio drivers are not configured.\n" #~ "\n" #~ "Quod Libet will now exit." #~ msgstr "" #~ "Quod Libet nom puido aceder ao seu dispositivo de áudio. Às vezes isto " #~ "sucede quando outro programa o está a empregar, ou os drivers nom estám " #~ "configurados.\n" #~ "\n" #~ "Quod Libet fechará agora." ��������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/hu.po����������������������������������������������������������������������������0000644�0001750�0001750�00000515546�13115512744�015357� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:35+0100\n" "Last-Translator: SZERVÁC Attila <sas@321.hu>\n" "Language-Team: hu\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Tagok szerkesztése hangfájljaidban" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Hang tag szerkesztő" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Hallgasd, böngészd vagy szerkeszd zenéidet" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Zenelejátszó" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Cím" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Művész" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Dátum" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "műfaj" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "É_rték" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Rendezés dátum szerint" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Jellemzők" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Album lista" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Album lista" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Minden album" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Album borítók mutatása" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Dalok albumon kívül" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d szám" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d lemez" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Minden album" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Album lista jellemzők" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Album borítók mutatása" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[lehetőségek]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Album kiírás" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Ismeretlen" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Új forrás" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Add meg a hangforrás helyét:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Hangforrások" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "H_angforrások" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "Letöltés" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Fájlok letöltése" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Fájl letöltése" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Forrás hozzáadása sikertelen" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> nem tölthető be. Talán a kiszolgáló áll, vagy a hely nem " "hangforrás." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "Daltár _frissítése" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Fájlok törlése" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Daltár böngésző" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d dal" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Hibás minta" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Ismeretlen" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Több értékre szedés" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "Egyedi" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "É_rték" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Album lista jellemzők" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Összméret:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Összméret:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Paneles böngésző beállítások" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Album borítók mutatása" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Minden album" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "szervezet" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Fájlrendszer" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Fájlrendszer" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Dalok másolása sikertelen" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "A kijelölt fájlok nem másolhatók más dal listába vagy sorba." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "Daltárhoz _adás" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Nem támogatott fájl típus" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Az állomás listák csak állomások helyeit tartalmazhatják, más állomás " "listákat vagy lejátszó-listákat nem. Az alábbi helyek nem tölthetők be:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Állomás hozzáadása sikertelen" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internet Rádió" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Fájlok letöltése" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Új állomás" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Add meg egy Internet rádió állomás helyét:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "érték" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "Új állomás" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Internet Rádió" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Új állomás" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "Új állomás" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Új állomás" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Nem leltem állomást" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Nem leltem Internet rádió állomást itt: %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Már minden kiírt állomás a daltárban van." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "Listához _adás" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "Tö_rlés a listáról" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d állomás" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Eszköz Tulajdonságok" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Eszköz:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Nincs csatolva" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Csatolási pont:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Név:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Média eszközök" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Média eszközök" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "Kiad" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Tulajdonságok" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "Átnevez" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> használt, <b>%s</b> elérhető" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nincs csatlakoztatva" #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>%s</b> másolása" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Dal másolása sikertelen" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Nincs elég hely e dalhoz" #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> másolása sikertelen" #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Dalok törlése meghiúsult" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>%s</b> törlése" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> törlése sikertelen" #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "A dal törlése sikertelen" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>%s</b> kinyitása sikertelen" #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Nem tudom kinyitni az eszközt" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Paneles böngésző" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Paneles böngésző" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Mindent kijelöl" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Minden" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Paneles böngésző beállítások" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Listák" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "Listák" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Tö_rlés a listáról" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Import" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Új lista" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Lista importálása sikertelen" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "A Quod Libet csak PLS és M3U listákat tud importálni" #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Lista átnevezése sikertelen" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Listák importálása" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "Új lista" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Új lista" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Paneles böngésző beállítások" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Listák" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Adj nevet az új mappának:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Lista importálása.\n" "\n" "%d/%d dal behozva." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "Eredmény kor_lát" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Daltár keresése" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "Daltár kere_sése" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Paneles böngésző" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Keres" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "hely" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "A Quod Libet nem fut." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "egy zenekönyvtár és lejátszó" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[lehetőségek]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Kiírja a most forgó dalt és kilép" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Lejátszás kezdése azonnal" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Ugrás a következő dalra" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Ugrás az előző dalra" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Lejátszás indítása" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Lejátszás szünete" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Lejátszás/szünet váltása" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Lejátszás indítása" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Hang be" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Hang ki" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Lejátszó állapot kiírása" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Főablak rejtése" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Főablak mutatása" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Főablak mutatásának váltása" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Fókusz a futó lejátszóra" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Aktív böngésző szűrők törlése" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "Daltár _frissítése" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Böngésző kikapcsolása" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Mostani lista kiírása" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Sor tartalmának kiírása" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Sor tartalmának kiírása" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "A Quod Libet nem fut." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Quod Libet bezárása" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Ugrás a forgó dalban" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][ÓÓ:]PP:MM" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Lejátszás/szünet váltása" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Ismétlés be/ki/váltás" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Hangerő beállítása" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Daltár keresése" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "lekérés" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Fájl lejátszása" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "fájlnév" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "E dal értéke" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "E böngésző beállítása" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "E dal értéke" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Új böngésző megnyitása" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Sor mutatása/rejtése" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Fő dal lista mutatása/rejtése" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Szűrő egy véletlen értéken" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tag" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Szűrő egy tag értéken" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=érték" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Fájl vagy lekérés a lejátszósorba" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "fájlnév" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Fájl vagy lekérés törlése a sorból" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Rossz argumentum ehhez: '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Próbáld ezt: %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Ismeretlen eszköz" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s' nem egyedi előtag." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "Rossz érték" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Fájlnév minta:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "_Album borítók másolása" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "Nem használt borítók és mappák törlése" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Hibák mutatása" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "leírás" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "egy hang tag szerkesztő" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "könyvtár" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Hibás kódolás]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Cím" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Hang tag szerkesztő" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "Cím szerinti tagok" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Paneles böngésző beállítások" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Összméret:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Kijelző szerkesztése" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "Súly" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Kijelző szerkesztése" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "Előnézet" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d mp." #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "Egyedi" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "Hibák tisztitása" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Zenelejátszó" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Internet Rádió" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "É_rték" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Dal mentése sikertelen" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Beillesztések nem találhatók" #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Szövegek" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Keresés törlése" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Szövegek" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "hely" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Főablak rejtése" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Jellemzők" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "minta" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "minta" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d dal" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Információ" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "minta" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "hely" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Cím" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Eszköz:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Név:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "Más_ok:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Művész" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Fájlnév minta:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Véletlen _album" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "albumok" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "Súly" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Véletlen _album" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Listák importálása" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Import" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Szövegek" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Nem játszik" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d dal" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "minta" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Nem játszik" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "Listák" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Lejátszó" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "Előnézet" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "S_huffle" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "Ismétlés" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Stop e szám után" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Új böngésző megnyitása" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "_Tag szerkesztés" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Információ" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Listák" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Kijelző szerkesztése" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Szövegek" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Szövegek" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Hibák" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Fájlok" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "Előnézet" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Szűrő a _szerzőn/előadón" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "Egyedi" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Szűrő a _műfajon" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Szűrő a _szerzőn/előadón" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Hangforrások" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Add meg a hangforrás helyét:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Listák importálása" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Import" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Nem leltem állomást" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Fájlnév minta:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Fájlnév minta:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Tö_rlés a listáról" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Új lista" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "utolsó lejátszás" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "Lejátszósor" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Soha" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Nincs dal" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Mentett értékek" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "Átnevez" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Daltár" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Főablak rejtése" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Fájlnév" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Dal mentése sikertelen" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Album lista" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Méret" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "Kere_s:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Keres" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Album lista" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "Könyvjelzők sz_erkesztése..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "Könyvjelzők sz_erkesztése..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Könyvjelzők" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album típus" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Fájlnév" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Lemez" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Szám" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Cím" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "_Művész" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album típus" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "lekérés" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Keres" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Beillesztések nem találhatók" #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Böngészők" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Mappa létrehozása sikertelen" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "Átnevez" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Hibás minta" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Rossz érték" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "Egyedi" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Dalok másolása sikertelen" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Böngésző kikapcsolása" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "É_rték" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "É_rték" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Kijelző szerkesztése" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "É_rték" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Szűrő egy tag értéken" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Szűrő a _műfajon" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "Lejátszósor" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Ír" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "könyvtár" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "_Album fejlécek" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "Új állomás" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Listák importálása" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "Átnevez" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Listák importálása" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Információ" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Listák importálása" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Lista importálása sikertelen" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "<b>%s</b> kinyitása sikertelen" #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Daltár _frissítése" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Daltár _frissítése" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Tag szerkesztés" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Tag szerkesztés" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Minden album" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "Előnézet" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Tag" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Dalok törlése meghiúsult" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Keres" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "minta" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Mentett értékek szerkesztése..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Színes kere_ső kifejezések" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Daltár" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Csatolási pontok ellenőrzése" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Daltár átnézése" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "%s átnézése" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "_Programozható tagok mutatása" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "leírás" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Érték" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Hang tag szerkesztő" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Nincs kijelölt dal" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Szűrő egy tag értéken" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Szűrő egy tag értéken" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Nincs idő adat" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Fájl átnevezése sikertelen" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Fájl" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Kiírja a tömör útmutatót" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> nem egy érvényes hely" #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "Ismeretlen" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Sorban" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_Sorban" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "Véletlen" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "Véletlen" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "Ismétlés" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Egy dal" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d mp." #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nem leltem állomást" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "Mappa létrehozása sikertelen" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Pluginok" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Támogatott formátumok: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Hang eszköz: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Kezd..." #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Idő" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Könyvjelző név" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "PP:MM" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Könyvjelzők" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "Szűrők" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "Soha _nem játszott" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 legmenőbb" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Új állomás" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Véletlen _műfaj" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Véletlen _szerző/előadó" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Véletlen _album" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "A legtöbbet lejátszott 40 dal (csomókban több is kijelölhető)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "Érték:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Mentett értékek" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Mentett értékek szerkesztése..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "_Sáv fejlécek" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "_Album fejlécek" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Fájlok átnevezése" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Ismeretlen" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Szűrő egy tag értéken" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Fájlok" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Fájlok törlése" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Mozgatás a kukába" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "%d/%d mozgatása" #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "iPod adatbázis mentése sikertelen" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "<b>%s</b> kinyitása sikertelen" #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "%d/%d törlése" #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Fájl törlése sikertelen" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "<b>%s</b> törlése sikertelen" #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Letöltések" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Méret" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "hiányzik %d dalból" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "eltér %d dal közt" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Több értékre szedés" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "_Album és lemez elválasztása" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "_Verzió és cím elválasztása" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "A hangszerelőt és a többi Művészt ne mossuk egybe !" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Az előadót és a többi Művészt ne mossuk egybe !" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Az előadót és a többi Művészt ne mossuk egybe !" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "_Verzió és cím elválasztása" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Tag hozzáadása" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Tag szerkesztés" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "_Programozható tagok mutatása" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Soha" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Tag hozzáadása sikertelen" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Dal hozzáadása sikertelen" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "<b>%s</b> hozzáadása sikertelen\n" "\n" "A kijelölt fájlok nem támogatnak többszörös értékeket." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Rossz tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Rossz tag <b>%s</b>\n" "\n" "A kijelölt fájlok nem támogatják e tag szerkesztését." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Rossz érték" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Hibás érték: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "A tag pontatlannak hat" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> változott a program futása alatt. A daltár frissítése nélküli " "mentés felülírhatja e dal más változásait.\n" "\n" "Mégis mentes e dalt?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Dal mentése sikertelen" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "<b>%s</b> mentése sikertelen. Lehet, hogy a fájl csak-olvasható, hibás, vagy " "nincs jogod szerkeszteni." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "Több lehetőség..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Pluginok" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s és %(count)d még" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso jellemzők" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Vágás így:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Tag szerkesztés" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Mappák" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Új mappa" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "Alkönyvtárak kijelölé_se" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Új mappa" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Adj nevet az új mappának:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Mappa létrehozása sikertelen" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Mappa törlése sikertelen" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Dalok" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "by %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "%s lemez" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "%s szám" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Kijelző szerkesztése" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Nincs kijelölt dal" #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Nincs dal" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Információ" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Szövegek" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Készítette: %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "művész" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "művészek" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "előadók" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Soha" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%dx" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "hozzáadva" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "utolsó lejátszás" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "lejátszás" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "kihagyás" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "érték" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "hossz" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Információ" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[Hibás kódolás]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitarány" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "fájlméret" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "módosítva" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d kijelölt" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Elérhetetlen szám" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Szám lista" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d dal nem tartozik albumhoz" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Kijelölt diszkográfia" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d dalhoz nincs szerző" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albumok" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Összhossz:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Összméret:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Fájlok" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "Letöltés" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "Kijelző sz_erkesztése..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Nincs szöveg ehhez a dalhoz." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Szöveg keresése..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Tag cserék elvetése?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "A tagok változtak, de nincsenek elmentve. Mented e fájlokat, vagy elveted a " "változtatásokat?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Soha" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "A fájl létezik" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Fájlok átnevezése" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Lejátszás/szünet váltása" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Lejátszás/szünet váltása" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Plugin hibák" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "Böngésző kikapcsolása" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "S_orrend:" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Tag szerkesztés" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Összméret:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Beillesztések nem találhatók" #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Pluginok" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Hibák mutatása" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Lemez" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Szám" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "csoport" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "_Album" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Fájlnév" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Hossz" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "Automatikus ugrás a forgó dalra" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "A dal váltásakor a lista görgetése" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "Más_ok:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "Kijelző sz_erkesztése..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Látható oszlopok" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "_Verzió a címben" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "_Verzió a címben" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Mappa a _fájlnévben" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Jellemzők" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Dal lista" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Látható oszlopok" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Globális szűrő:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Keres" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Böngészők" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "A dal váltásakor a lista görgetése" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "É_rték" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Album lista" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Lejátszás szünete" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "É_rték" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "Értékek és lejátszások mentése" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Értékekhez és lejátszásokhoz beállítandó email cím" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Tag cserék elvetése?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Tag szerkesztés" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "Új állomás" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "Daltár _frissítése" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "Daltár kere_sése" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Változások átnézése a daltárban" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Daltár újratö_ltése" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Minden dal újratöltése a daltárban (sokáig tarthat)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Könyvtárak átnézése" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Nincs dal" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, fuzzy, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s és %(count)d még" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Tulajdonságok" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "Lejátszósor" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "Hibák tisztitása" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d dal (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "Daltár _böngészése" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Főablak mutatásának váltása" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Lejátszás szünete" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Könyvtárak kijelölése" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Dalok hozzáadása sikertelen" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> nem támogatott protokollt használ" #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Ugrás a lejátszásra" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Fájl" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Dalok" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Nézet" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Böngészők" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Vezérlés" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Súgó" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "Mappa hozzá_adása..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "Fájl hozzá_adása..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Hely hozzáadása" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "Könyvjelzők sz_erkesztése..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Stop e szám után" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Keres" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Hely hozzáadása" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Add meg egy hang fájl helyét:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Hely hozzáadása sikertelen" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nem egy érvényes hely" #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Zene hozzáadása" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "Mappa hozzá_adása..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Zenelejátszó" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Fájl hozzá_adása..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "É_rték" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "É_rték" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Szóközök helyett aláhúzások !" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "w$-inkompatibilis jeleket mellőz" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Mellékjelek ki" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Nem-_ASCII karakterek ki" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Fájlok átnevezése" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "minta" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Mentett értékek szerkesztése..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "Előnézet" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Új név" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Fájl átnevezése sikertelen" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "<b>%s</b> átnevezése erre: <b>%s</b> sikertelen. A cél fájl talán létezik, " "nincs jogod az új fájl létrehozására vagy a régi törlésére." #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "Hibák mutatása" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "Tovább" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Az ösvény nem abszolút" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "A minta\n" "\t<b>%s</b>\n" "tartalmaz /-t de nem indul gyökértől. Könyvtárnév-tévesztés ellen, adj " "gyökeret a mintának /-rel vagy ~/-rel kezdéssel." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "E mappákban levő dalok (':'-tal elválasztva) a daltárhoz adódnak" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Könyvtárak kijelölése" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Mentett értékek" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Mentett értékek szerkesztése..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "Stop e szám után" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "Kor_lát:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "Súly" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Maradék idő kiírása" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Szövegek" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Fókusz a futó lejátszóra" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Ugrás a forgó dalban" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Dalok törlése meghiúsult" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Dalok törlése meghiúsult" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "Szűrő itt: %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "_Album fejlécek" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Sáv fejlécek" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Album fejlécek" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Személ_y fejlécek" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Dátum fejlécek" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_Fájl fejlécek" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Termék fejlécek" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Egyéni fejlécek..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Színes kere_ső kifejezések" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Sorhoz adás" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "Eszközre másolás" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "Tö_rlés a listáról" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Aláhúzások helyett szóköz" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Cím szerinti tagok" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Több értékre _vágás" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tagok az ösvényből" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Létezőket cserélő tagok" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Létezőkhöz adandó tagok" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "A minta\n" "\t<b>%s</b>\n" "rossz. Talán ugyanaz a tag 2x vagy páratlan zárójelek vannak benne (< / " ">)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Érvénytelen tagok" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Érvénytelen tagok <b>%s</b>\n" "\n" "A kijelölt fájlok nem támogatják e tagok szerkesztését." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "A minta rossz. A < és > legyen \\< és \\> és legyenek párban.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Kijelző szerkesztése" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Számok száma" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Indítás innen:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "Összes szám:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Lejátszó" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "Előnézet" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "és még %d..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Módosított dalok mentése" #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "%d/%d mozgatása" #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Csatolási pontok ellenőrzése" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "hely" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Már van egy %s nevű lista" #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Album borítók mutatása" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Fájlrendszer" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Kiírja a tömör útmutatót" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Kiírja a verziót és a szerzői jogokat" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[lehetőségek]" #: ../quodlibet/util/__init__.py:182 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: '%s' nem ismert lehetőség." #: ../quodlibet/util/__init__.py:185 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: '%s' egy argumentumot vár." #: ../quodlibet/util/__init__.py:188 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: '%s' nem egyedi előtag." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d mp." #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Nincs idő adat" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d mp." #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d perc" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d óra" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d nap" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d év" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "cím-nagybetű" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "A dátumot 'ÉÉÉÉ', 'ÉÉÉÉ-HH-NN' vagy 'ÉÉÉÉ-HH-NN ÓÓ:PP:MM' formában kell " "bevinni." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "" #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "A MusicBrainz ID-knek UUID formátumúaknak kell lenniük" #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "A MusicBrainz kiadási állapot 'official', 'promotional' vagy 'bootleg' kell " "legyen" #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "A dal szerkesztése sikertelen" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "<b>%s</b> mentése sikertelen. Lehet, hogy a fájl csak-olvasható, hibás, vagy " "nincs jogod szerkeszteni." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Hibás kódolás]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "hangszerelő" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "hangszerelők" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "hangszerelő" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "szerző" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "szerzők" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "zeneszerző" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "zeneszerzők" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "zeneszerző" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "karmester" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "karmesterek" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "karmester" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "kapcsolat" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "dátum" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "leírás" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "műfaj" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "műfaj" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "előadó" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "csoport" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "nyelv" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licenc" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "hely" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "szövegíró" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "szövegírók" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "szövegíró" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "szervezet" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "cím" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "verzió" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "weblap" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "album művész" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "lemez" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "szám" # label ID #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "címke ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "eredeti kiadási dátum" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "eredeti album" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "eredeti művész" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "rögzítési dátum" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "megjelenés országa" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist ID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz album állapot" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz album típus" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz track ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "szám csúcs" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "album csúcs" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Jellemzők" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "lemezek" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "számok" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "utolsó indítás" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "pontos elérés" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "csatolási pont" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "személyek" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "év" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "eredeti kiadási dátum" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "Könyvjelzők" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "formátum" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Listák" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Böngészők" #~ msgid "Unable to download lyrics." #~ msgstr "Szöveg letöltése sikertelen" #~ msgid "Remove all songs from the queue" #~ msgstr "Minden dal törlése a sorból" #~ msgid "Watch this folder for new songs" #~ msgstr "Új dalok keresése e mappában" #~ msgid "Set or toggle the playback order" #~ msgstr "Sorrend beállítása/váltása" #~ msgid "Uninitialized iPod" #~ msgstr "Iniciálatlan iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Készítesz egy üres adatbázist ezen az iPod-on?" #~ msgid "Combine tags with _multiple values" #~ msgstr "Tagok egyesítése több értékkel" #~ msgid "Model:" #~ msgstr "Modell:" #~ msgid "Capacity:" #~ msgstr "Kapacitás:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #, fuzzy #~ msgid "Removing orphaned iPod track" #~ msgstr "F: elavult iPod sáv eltávolítása" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "iPod adatbázis mentése sikertelen" #~ msgid "Unable to save iPod database" #~ msgstr "iPod adatbázis mentése sikertelen" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "szám csúcs" #~ msgid "Shuffle" #~ msgstr "Shuffle" #~ msgid "Weighted" #~ msgstr "Weighted" #~ msgid "_Weighted" #~ msgstr "Súlyozott" #~ msgid "_One Song" #~ msgstr "_Egy dal" #~ msgid "Restart the playlist when finished" #~ msgstr "Lista újraindítása befejezéskor" #~ msgid "Disable Browser" #~ msgstr "Böngésző kikapcsolása" #~ msgid "_Disable Browser" #~ msgstr "Böngésző kikapcsolása" #, fuzzy #~ msgid "Force Write" #~ msgstr "Ír" #~ msgid "Filter on _Genre" #~ msgstr "Szűrő a _műfajon" #~ msgid "Filter on _Artist" #~ msgstr "Szűrő a _szerzőn/előadón" #~ msgid "Filter on Al_bum" #~ msgstr "Szűrő az _albumon" #~ msgid "_Music" #~ msgstr "_Zene" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Könyvjelzők" #~ msgid "Song _List" #~ msgstr "Dal _lista" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Stop e szám után" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "és még %d..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "_Album és lemez elválasztása" #, fuzzy #~ msgid "Timeout" #~ msgstr "Idő" #, fuzzy #~ msgid "Select an album" #~ msgstr "Mindent kijelöl" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s és %(count)d még" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Listák" #~ msgid "Re_fresh Library" #~ msgstr "Daltár _frissítése" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "É_rték" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Fájlok megnyitása sikertelen" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Rossz érték" #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "command|filename" #~ msgstr "fájlnév" #~ msgid "command|tag" #~ msgstr "tag" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Keres" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Használat: %s %s" #~ msgid "_Download..." #~ msgstr "Letöltés..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "Új állomás" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Felülírod: <b>%s</b>?" #~ msgid "Quod Libet is already running." #~ msgstr "A Quod Libet már fut." #~ msgid "No song is currently playing." #~ msgstr "Nem fut dal." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "%s írása sikertelen. Eltávolítom." #~ msgid "_Edit Bookmarks..." #~ msgstr "Könyvjelzők sz_erkesztése..." #~ msgid "_New Folder..." #~ msgstr "Ú_j mappa..." #~ msgid "_Add to Playlist" #~ msgstr "Listához _adás" #~ msgid "_Edit Display..." #~ msgstr "Kijelző sz_erkesztése..." #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d állomás" #~ msgid "_Add a Location..." #~ msgstr "Hely hozzá_adása..." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Egyéni fejlécek..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "_Sáv fejlécek" #, fuzzy #~ msgid "People Headers" #~ msgstr "Személ_y fejlécek" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Album fejlécek" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Dátum fejlécek" #, fuzzy #~ msgid "File Headers" #~ msgstr "_Fájl fejlécek" #, fuzzy #~ msgid "Production Headers" #~ msgstr "_Termék fejlécek" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Tag:" #, fuzzy #~ msgid "Warnings" #~ msgstr "É_rték" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "album művész" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "művészek" #, fuzzy #~ msgid "album (sort)" #~ msgstr "album művész" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "előadók" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "előadók" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz album művész ID" #~ msgid "errors" #~ msgstr "hibák" #~ msgid "Permanently delete this file?" #~ msgstr "Végleg törlöd e fájlt?" #~ msgid "Permanently delete these files?" #~ msgstr "Végleg törlöd e fájlokat?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s és %(count)d még..." #, fuzzy #~ msgid "Version:" #~ msgstr "verzió" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "Hibák tisztitása" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s-t nem tudtam hozzáadni a daltárhoz.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Nem találtam 'eject' parancsot" #~ msgid "Unable to start web browser" #~ msgstr "Web böngésző indítása sikertelen" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Nem lelek web böngészőt. Állítsd be a $BROWSER változót, vagy nézd meg, " #~ "létezik-e /usr/bin/sensible-browser." #, fuzzy #~ msgid "Library Error" #~ msgstr "Daltár böngésző" #, fuzzy #~ msgid "_Output device:" #~ msgstr "Eszközre másolás" #~ msgid "translator-credits" #~ msgstr "sas," #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Más látható oszlopok szóközökkel elválasztva" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "Tovább" #~ msgid "Search your library" #~ msgstr "Daltár keresése" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, és mások\n" #~ "\n" #~ "Ez szbaf szoftver; lásd a forrást a másolási feltételekért. NINCS\n" #~ "garancia; sem az ELADHATÓSÁGRA sem az EGYES CÉLRA VALÓ MEGFELELÉSRE.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Összméret:" #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet Pluginok" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "Egyszerű keresések kékkel, haladók zölddel, érvénytelenek pirossal" #~ msgid "_Select" #~ msgstr "Vála_szt" #~ msgid "Separators for splitting tags" #~ msgstr "Tagok elválasztói" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet beállítások" #~ msgid "Not Played To_day" #~ msgstr "_Ma még nem játszott" #~ msgid "Not Played in a _Week" #~ msgstr "1 hé_ten belül nem játszott" #~ msgid "Not Played in a _Month" #~ msgstr "1 _hónapon belül nem játszott" #~ msgid "B_ottom 40" #~ msgstr "40 legritkább" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "A legutóbb lejátszott 40 dal (csomókban több is kijelölhető)" #~ msgid "gtk-media-next" #~ msgstr "gtk-media-next" #~ msgid "gtk-media-previous" #~ msgstr "gtk-media-previous" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | vezérlő ]" #, fuzzy #~ msgid "Date" #~ msgstr "_Dátum" #~ msgid "Choose New Stations" #~ msgstr "Válassz új állomásokat" #~ msgid "Add" #~ msgstr "Hozzáad" #, fuzzy #~ msgid "Bitrate" #~ msgstr "bitarány" #~ msgid "_Stations..." #~ msgstr "Állomá_sok..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Quod Libet bezárása" #~ msgid "Unable to save library" #~ msgstr "Daltár mentése sikertelen" #~ msgid "Sort by title" #~ msgstr "Rendezés cím szerint" #~ msgid "Sort by artist" #~ msgstr "Rendezés művész szerint" #~ msgid "Lyrics provided by %s." #~ msgstr "A szöveg forrása: %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Nincs szöveg ehhez a hangfájlhoz.\n" #~ "\n" #~ "A Letöltés gombbal a Quod Libet rákereshet a hálózaton. Kézzel is be " #~ "lehet vinni, majd a mentés gombra kattintani." #~ msgid "part" #~ msgstr "rész" #~ msgid "Opening audio device." #~ msgstr "Hang eszköz megnyitása." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d dal elmentve" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz album ID" #~ msgid "Loaded song library." #~ msgstr "Daltár betöltve." #~ msgid "Unable to open audio device" #~ msgstr "Hang eszköz megnyitása sikertelen" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "A Quod Libet megpróbálta elérni az 'autosink' és '%(sink)s' meghajtókat, " #~ "de nem tudta megnyitni. Állítsd be a GStreamer pipát a\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "sor cseréjével a ~/.quodlibet/config-ban." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "A Quod Libet nem leli a 'filesrc' GStreamer elemet. Ellenőrizd a " #~ "GStreamer telepítést." ����������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/POTFILES.skip��������������������������������������������������������������������0000644�0001750�0001750�00000000115�13112005742�016465� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������tests/test_qltk_notif.py tests/test_util.py build dist quodlibet/optpackages ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/en_CA.po�������������������������������������������������������������������������0000644�0001750�0001750�00000554242�13115512744�015704� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# English/Canada translation of Quod Libet. # Copyright (C) 2004 Joe Wreschnig # This file is distributed under the same license as the Quod Libet package. # Joe Wreschnig <piman@sacredchao.net>, 2004 # # NB: I am not actually Canadian, but I need a translation to test my i18n # support, and I know Canadian better than, say, Kurdish. # msgid "" msgstr "" "Project-Id-Version: Quod Libet 0.18\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:32+0100\n" "Last-Translator: Joe Wreschnig <piman@sacredchao.net>\n" "Language-Team: Joe Wreschnig <piman@sacredchao.net>\n" "Language: en_CA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Edit tags in your audio files" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Audio tag editor" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Listen to, browse, or edit your audio collection" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Music Player" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Title" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artist" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Date" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Rating" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Sort by date" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Preferences" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Album List" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Album List" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "All Albums" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albums" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Show album _covers" msgstr[1] "Show album _covers" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Songs not in an album" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d track" msgstr[1] "%d tracks" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disc" msgstr[1] "%d discs" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "All Albums" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Album List Preferences" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Show album _covers" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[options]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Album Display" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Unknown" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "New Feed" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Enter the location of an audio feed:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Audio Feeds" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Audio Feeds" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Download" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Download Files" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Download File" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Unable to add feed" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> could not be added. The server may be down, or the location may " "not be an audio feed." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "Re_fresh Library" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Delete Files" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Library Browser" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d song" msgstr[1] "%d songs" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Invalid pattern" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Unknown" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Split into _Multiple Values" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Custom" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Remove Station" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Album List Preferences" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Total size:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Total size:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Paned Browser Preferences" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Show album _covers" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "All Albums" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "No new stations" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "File System" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_File System" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Unable to copy songs" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "The files selected cannot be copied to other song lists or the queue." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Add to Library" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Unsupported file type" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Unable to add station" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internet Radio" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Download Files" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "New Station" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Enter the location of an Internet radio station:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "rating" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_New Station" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Internet Radio" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "New Station" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_New Station" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "New Station" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "No stations found" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "No Internet radio stations were found at %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "All stations listed are already in your library." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "_Add to Playlist" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "_Remove from Playlist" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d station" msgstr[1] "%(count)d stations" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Device Properties" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Device:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Not mounted" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Mount Point:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Name:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Media Devices" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Media Devices" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Eject" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Properties" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Rename" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> used, <b>%s</b> available" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> is not connected." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Copying <b>%s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Unable to copy song" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "There is not enough free space for this song." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> could not be copied." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Unable to delete songs" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Deleting <b>%s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> could not be deleted." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Unable to delete song" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Ejecting <b>%s</b> failed." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Unable to eject device" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Paned Browser" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Paned Browser" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Select _All" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "All" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Paned Browser Preferences" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Playlists" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Playlists" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Remove from Playlist" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Import" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "New Playlist" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Unable to import playlist" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet can only import playlists in the M3U and PLS formats." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Unable to rename playlist" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Import Playlist" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_New Playlist" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "New Playlist" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Paned Browser Preferences" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Playlists" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Enter a name for the new folder:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importing playlist.\n" "\n" "%d/%d songs added." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Limit Results" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Search Library" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Search Library" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Paned Browser" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Search" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "location" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet is not running." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "a music library and player" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[options]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Print the playing song and exit" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Begin playing immediately" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Jump to next song" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Jump to previous song" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Start playback" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pause playback" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Toggle play/pause mode" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Start playback" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Turn up volume" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Turn down volume" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Print player status" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Hide main window" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Show main window" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Toggle main window visibility" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Focus the running player" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Remove active browser filters" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "Re_fresh Library" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Disable Browser" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Print the current playlist" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Print the contents of the queue" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Print the contents of the queue" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet is not running." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Exit Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Seek within the playing song" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Toggle play/pause mode" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Turn repeat off, on, or toggle it" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Set the volume" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Search your audio library" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "query" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Play a file" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "filename" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Rate the playing song" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Set the current browser" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Rate the playing song" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Open a new browser" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Show or hide the queue" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Show or hide the main song list" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filter on a random value" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "tag" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filter on a tag value" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=value" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Enqueue a file or query" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "filename" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Unqueue a file or query" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Invalid argument for '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Try %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Unknown Device" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s' is not a unique prefix." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "Could not play %s." #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "Invalid tag name" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Filename Pattern:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copy _album covers" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Remove unused covers and directories" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Show _Errors" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "description" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "an audio tag editor" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "directory" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Invalid Encoding]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Title" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Audio tag editor" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_Title-case tags" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Paned Browser Preferences" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 #, fuzzy msgid "Animated On-Screen Display" msgstr "_On-Screen Display" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Total size:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Edit Display" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Weighted" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Edit Display" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Preview" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 #, fuzzy msgid "Party" msgstr "_Part" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "1 second" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Custom" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "_Clear Errors" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Music Player" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Internet Radio" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Rating" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "Set Rating" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Unable to save song" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "No plugins found." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Lyrics" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Clear search" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Lyrics" #: ../quodlibet/ext/events/lyricswindow.py:348 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "View and edit tags in the playing song" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "location" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Hide main window" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Preferences" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d song" #: ../quodlibet/ext/events/mqtt.py:138 #, fuzzy msgid "Plain text for when there is no current song" msgstr "Pause/resume the current song" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Information" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Could not play %s." #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "location" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Title" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 #, fuzzy msgid "Show notifications" msgstr "No new stations" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 #, fuzzy msgid "Song Notifications" msgstr "No new stations" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 #, fuzzy msgid "Next" msgstr "_Next" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Device:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Name:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Others: " #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Artist" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Filename Pattern:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Random Al_bum" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "albums" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Weighted" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Random Al_bum" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Import Playlist" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Import" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Lyrics" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Play _song" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 #, fuzzy msgid "Plain text for status when there is no current song" msgstr "Pause/resume the current song" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d song" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "Invalid Pattern" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Not playing" #: ../quodlibet/ext/events/trayicon/__init__.py:53 #, fuzzy msgid "Tray Icon" msgstr "Tray Icon Preferences" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "Player" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "_Pause" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "Pre_vious" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 #, fuzzy msgid "_Next" msgstr "_Next" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Shuffle" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Repeat" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Stop after this song" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Open a new browser" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Edit _Tags" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Information" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Playlists" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 #, fuzzy msgid "Scroll wheel adjusts volume" msgstr "" "Scroll wheel adjusts volume\n" "Shift and scroll wheel changes song" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Scroll _Wheel" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Tooltip Display" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Lyrics" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Lyrics" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Errors" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Files" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Preview" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Filter on _Artist" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 #, fuzzy msgid "Default" msgstr "Set Rating" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Custom" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Filter on _Genre" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Filter on _Artist" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio Feeds" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Enter the location of an audio feed:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Import Playlist" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Import" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "No stations found" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Filename Pattern:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Filename Pattern:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Remove selected tag" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "New Playlist" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "last played" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "_Queue" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Never" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "skip count" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Saved Values" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Could not play %s." #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Rename" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Library" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Hide main window" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Filename" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Unable to save song" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Album List" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Size" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Search:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Search" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Album List" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Edit Bookmarks..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Edit Bookmarks..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Bookmarks" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album type" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Filename" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Disc" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Track" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Title" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "_Artist" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album type" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "query" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Search" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "No plugins found." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Browsers" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Unable to create folder" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Rename" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "pattern" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Invalid value" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Custom" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Unable to copy songs" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Disable Browser" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Duplicate Key" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_Remove Station" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Edit Display" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 #, fuzzy msgid "Skip Count" msgstr "skip count" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "Remove selected tag" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Filter on a tag value" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer was unable to load the selected song." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Filter on _Genre" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Queue" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Write" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "directory" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "_Album Headers" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_New Station" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Import Playlist" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Rename" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Import Playlist" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Information" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Import Playlist" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Unable to import playlist" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Ejecting <b>%s</b> failed." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Re_fresh Library" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Re_fresh Library" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Edit Tags" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Edit Tags" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "All Albums" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Preview" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Tag" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Unable to delete songs" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Search" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "Invalid Pattern" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Edit saved values..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Colour _search terms" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Library" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Checking mount points" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Scanning library" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Scanning %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Show _programmatic tags" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "Description" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Value" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Audio tag editor" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "No songs are selected." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "_Remove Station" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "Remove selected tag" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Filter on a tag value" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Filter on a tag value" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "No time information" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Unable to rename file" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "Remove selected tag" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "File" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Display brief usage information" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> is not a valid location." #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "Unknown" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "In Order" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_In Order" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Random" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Random" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Repeat" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "One Song" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "1 second" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "No audio device found" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "Unable to create folder" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Plugins" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Supported formats: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Audio device: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Beginning" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Time" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Bookmark Name" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Bookmarks" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filters" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "_Never Played" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "All songs" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Random _Genre" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Random _Artist" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Random Al_bum" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Value:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Saved Values" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Edit saved values..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "_Track Headers" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "_Album Headers" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "_Replay Gain volume adjustment" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Unknown" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Filter on a tag value" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Files" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Delete Files" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Move to Trash" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "%(current)s/%(total)s" #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "Unable to save iPod database" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Ejecting <b>%s</b> failed." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "%(current)s/%(total)s" #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Unable to delete file" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Deleting <b>%s</b> failed." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Downloads" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Size" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "missing from %d song" msgstr[1] "missing from %d songs" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "different across %d song" msgstr[1] "different across %d songs" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Split into _Multiple Values" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Split Disc out of _Album" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Split Arranger out of Ar_tist" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Add a Tag" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Edit Tags" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Show _programmatic tags" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Never" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Unable to add tag" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Unable to add song" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Unable to add <b>%s</b>\n" "\n" "The files currently selected do not support multiple values." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Invalid tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Invalid value" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Tag may not be accurate" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> changed while the program was running. Saving without refreshing " "your library may overwrite other changes to the song.\n" "\n" "Save this song anyway?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Unable to save song" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_More options..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "_About" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s and %(count)d more" msgstr[1] "%(title)s and %(count)d more" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso Preferences" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Split _on:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Tag Editing" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Folders" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "New Folder" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Select All Subfolders" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "New Folder" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Enter a name for the new folder:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Unable to create folder" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Unable to delete folder" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Songs" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "by %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disc %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Track %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Edit Display" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "No songs are selected." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "No Songs" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Information" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Lyrics" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Produced by %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artist" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artists" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "performers" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Never" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d time" msgstr[1] "%d times" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "added" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "last played" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "plays" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "skips" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "rating" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "length" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Information" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[Invalid Encoding]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "file size" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "modified" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d selected" msgstr[1] "%d selected" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Track unavailable" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Track List" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d song with no album" msgstr[1] "%d songs with no album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Selected Discography" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d song with no artist" msgstr[1] "%d songs with no artist" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albums" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Total length:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Total size:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Files" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Edit Display..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "No lyrics found for this song." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Searching for lyrics..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Discard tag changes?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Never" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "File exists" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Rename Files" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, fuzzy, python-format msgid "%d tasks running" msgstr "Quod Libet is running" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Toggle play/pause mode" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Toggle play/pause mode" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Plugin Errors" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "Disable Browser" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "Play _Order" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Tag Editing" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Total size:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "No plugins found." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Show _Errors" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disc" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Track" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "grouping" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Filename" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Length" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Jump to playing song automatically" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "When the playing song changes, scroll to it in the song list" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Others: " #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Edit Display..." #: ../quodlibet/qltk/prefs.py:91 #, fuzzy msgid "Add or remove additional column headers" msgstr "Set and save column headers" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Visible Columns" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Title includes _version" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Title includes _version" #: ../quodlibet/qltk/prefs.py:108 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Album includes _part" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Filename includes _folder" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Preferences" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Song List" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Visible Columns" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Global filter:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Search" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Browsers" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "When the playing song changes, scroll to it in the song list" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "Rating" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Album List" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Pause playback" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "_Volume Gain (dB):" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "_Replay Gain volume adjustment" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "_Replay Gain volume adjustment" #: ../quodlibet/qltk/prefs.py:450 #, fuzzy msgid "_Default rating:" msgstr "Set Rating" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "Rating" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "Save ratings and play counts" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Ratings and play counts will be set for this email address" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Discard tag changes?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Edit Tags" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_New Station" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "Re_fresh Library" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Search Library" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Check for changes in your library" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Re_load Library" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Reload all songs in your library (this can take a long time)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Scan _Directories" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "No Songs" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, fuzzy, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s and %(count)d more" msgstr[1] "%(title)s and %(count)d more" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Properties" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Queue" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Clear Errors" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d song (%(time)s)" msgstr[1] "%(count)d songs (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Browse Library" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Toggle main window visibility" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Pause playback" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Select Directories" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Unable to add songs" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> uses an unsupported protocol." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Jump to Playing Song" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "File" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Songs" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_View" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Browsers" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Help" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "_Add a Folder..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "_Add a File..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Add a Location" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Edit Bookmarks..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Stop after this song" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Search" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Add a Location" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Enter the location of an audio file:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Unable to add location" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> is not a valid location." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Add Music" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Add a Folder..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Music Player" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Add a File..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Remove Station" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Rating" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Replace spaces with _underscores" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Strip _Windows-incompatible characters" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Strip _diacritical marks" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Strip non-_ASCII characters" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Rename Files" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "Invalid Pattern" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Edit saved values..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Preview" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "New Name" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Unable to rename file" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Renaming <b>%s</b> to <b>%s</b> failed. Possibly the target file already " "exists, or you do not have permission to make the new file or remove the old " "one." #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "Show _Errors" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Continue" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Path is not absolute" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Songs placed in these folders (separated by ':') will be added to your " "library" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Select Directories" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Saved Values" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Edit saved values..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "search-string" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limit:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Weighted" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Display remaining time" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Lyrics" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Focus the running player" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Seek within the playing song" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Unable to delete songs" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Unable to delete songs" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filter on %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Track Headers" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_People Headers" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Date Headers" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_File Headers" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Production Headers" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Customize Headers..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Colour _search terms" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Add to _Queue" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Copy to Device" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Remove from Library" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Replace _underscores with spaces" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Title-case tags" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Split into multiple _values" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tags From Path" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Tags replace existing ones" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Tags are added to existing ones" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Invalid tags" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Edit Display" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Track Numbers" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Start fro_m:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Total tracks:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "_Pause" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "Pre_vious" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "and %d more..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Saving the songs you changed." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "%(current)s/%(total)s" #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Checking mount points" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "location" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "A playlist named %s already exists." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Show album _covers" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "File System" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Display brief usage information" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Display version and copyright" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[options]" #: ../quodlibet/util/__init__.py:182 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: Option '%s' not recognized." #: ../quodlibet/util/__init__.py:185 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: Option '%s' requires an argument." #: ../quodlibet/util/__init__.py:188 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: '%s' is not a unique prefix." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d second" msgstr[1] "%d seconds" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "No time information" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d second" msgstr[1] "%d seconds" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minute" msgstr[1] "%d minutes" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hour" msgstr[1] "%d hours" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d day" msgstr[1] "%d days" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d year" msgstr[1] "%d years" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Replay Gain gains must be entered in 'x.yy dB' format." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Replay Gain peaks must be entered in 'x.yy' format." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz IDs must be in UUID format." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Unable to edit song" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Invalid Encoding]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arranger" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arrangers" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "arranger" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "author" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "authors" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "composer" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "composers" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "composer" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "conductor" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "conductors" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "conductor" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "contact" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "date" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "description" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "genre" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "performer" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "grouping" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "language" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licence" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "location" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "lyricist" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "lyricists" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "lyricist" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organization" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "title" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "version" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "website" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "album artist" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disc" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "track" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "label ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "original release date" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "original album" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "original artist" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "recording date" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "release country" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist ID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz album status" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz album type" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz track ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "track gain" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "track peak" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "album gain" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "album peak" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Preferences" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "discs" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "tracks" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "last started" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "full name" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "mount point" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "people" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "year" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "original release date" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "Bookmarks" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "format" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Playlists" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Browsers" #~ msgid "Unable to download lyrics." #~ msgstr "Unable to download lyrics." #~ msgid "Remove all songs from the queue" #~ msgstr "Remove all songs from the queue" #~ msgid "Watch this folder for new songs" #~ msgstr "Watch this folder for new songs" #~ msgid "Set or toggle the playback order" #~ msgstr "Set or toggle the playback order" #~ msgid "Uninitialized iPod" #~ msgstr "Uninitialized iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Do you want to create an empty database on this iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Volume Gain (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Combine tags with _multiple values" #~ msgid "Model:" #~ msgstr "Model:" #~ msgid "Capacity:" #~ msgstr "Capacity:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #, fuzzy #~ msgid "Removing orphaned iPod track" #~ msgstr "W: removing orphaned iPod track" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Unable to save iPod database" #~ msgid "Unable to save iPod database" #~ msgstr "Unable to save iPod database" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "track peak" #~ msgid "Shuffle" #~ msgstr "Shuffle" #~ msgid "Weighted" #~ msgstr "Weighted" #~ msgid "_Weighted" #~ msgstr "_Weighted" #~ msgid "_One Song" #~ msgstr "_One Song" #~ msgid "Restart the playlist when finished" #~ msgstr "Restart the playlist when finished" #~ msgid "Disable Browser" #~ msgstr "Disable Browser" #~ msgid "_Disable Browser" #~ msgstr "_Disable Browser" #, fuzzy #~ msgid "Force Write" #~ msgstr "Write" #~ msgid "Filter on _Genre" #~ msgstr "Filter on _Genre" #~ msgid "Filter on _Artist" #~ msgstr "Filter on _Artist" #~ msgid "Filter on Al_bum" #~ msgstr "Filter on Al_bum" #~ msgid "_Music" #~ msgstr "_Music" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Bookmarks" #~ msgid "Song _List" #~ msgstr "Song _List" #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Stop after this song" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "and %d more..." #~ msgstr[1] "and %d more..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Split Disc out of _Album" #, fuzzy #~ msgid "Timeout" #~ msgstr "Time" #, fuzzy #~ msgid "Select an album" #~ msgstr "Select _All" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s and %(count)d more" #~ msgstr[1] "%(title)s and %(count)d more" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Playlists" #~ msgid "Re_fresh Library" #~ msgstr "Re_fresh Library" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Remove Station" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Unable to open files" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Invalid tag name" #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "command|filename" #~ msgstr "filename" #~ msgid "command|tag" #~ msgstr "tag" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "Could not play %s." #, fuzzy #~ msgid "heading|Search" #~ msgstr "Search" #~ msgid "%d of %d" #~ msgstr "%d of %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Usage: %s %s" #~ msgid "_Download..." #~ msgstr "_Download..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_New Station" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Overwrite <b>%s</b>?" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet is already running." #~ msgid "No song is currently playing." #~ msgstr "No song is currently playing." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Unable to write to %s. Removing it." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Edit Bookmarks..." #~ msgid "_New Folder..." #~ msgstr "_New Folder..." #~ msgid "_Add to Playlist" #~ msgstr "_Add to Playlist" #~ msgid "_Edit Display..." #~ msgstr "_Edit Display..." #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d station" #~ msgid "_Order:" #~ msgstr "_Order:" #~ msgid "_Add a Location..." #~ msgstr "_Add a Location..." #, fuzzy #~ msgid "Unknown browser %r." #~ msgstr "Opening web browser: %s" #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Customize Headers..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "_Track Headers" #, fuzzy #~ msgid "People Headers" #~ msgstr "_People Headers" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Album Headers" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Date Headers" #, fuzzy #~ msgid "File Headers" #~ msgstr "_File Headers" #, fuzzy #~ msgid "Production Headers" #~ msgstr "_Production Headers" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Tag:" #, fuzzy #~ msgid "Warnings" #~ msgstr "Rating" #, fuzzy #~ msgid "No log available." #~ msgstr "No information available" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "album artist" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "artists" #, fuzzy #~ msgid "album (sort)" #~ msgstr "album artist" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "performers" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "performers" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz album artist ID" #~ msgid "errors" #~ msgstr "errors" #~ msgid "Permanently delete this file?" #~ msgstr "Permanently delete this file?" #~ msgid "Permanently delete these files?" #~ msgstr "Permanently delete these files?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s and %(count)d more..." #~ msgstr[1] "%(title)s and %(count)d more..." #, fuzzy #~ msgid "Version:" #~ msgstr "_Version" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "_Clear Errors" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "No eject command found." #~ msgid "Unable to start web browser" #~ msgstr "Unable to start web browser" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #, fuzzy #~ msgid "Library Error" #~ msgstr "Library Browser" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Copy to Device" #~ msgid "translator-credits" #~ msgstr "translator-credits" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Other columns to display, separated by spaces" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "_Continue" #~ msgid "Search your library" #~ msgstr "Search your library" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Total size:" #, fuzzy #~ msgid "%s: Could not import ctypes." #~ msgstr "Could not play %s." #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet Plugins" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgid "_Select" #~ msgstr "_Select" #~ msgid "Separators for splitting tags" #~ msgstr "Separators for splitting tags" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet Preferences" #~ msgid "Not Played To_day" #~ msgstr "Not Played To_day" #~ msgid "Not Played in a _Week" #~ msgstr "Not Played in a _Week" #~ msgid "Not Played in a _Month" #~ msgstr "Not Played in a _Month" #~ msgid "B_ottom 40" #~ msgstr "B_ottom 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgid "gtk-media-next" #~ msgstr "gtk-media-next" #~ msgid "gtk-media-previous" #~ msgstr "gtk-media-previous" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #, fuzzy #~ msgid "Date" #~ msgstr "_Date" #~ msgid "Choose New Stations" #~ msgstr "Choose New Stations" #~ msgid "Add" #~ msgstr "Add" #, fuzzy #~ msgid "Bitrate" #~ msgstr "bitrate" #~ msgid "_Stations..." #~ msgstr "_Stations..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Exit Quod Libet" #~ msgid "Unable to save library" #~ msgstr "Unable to save library" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Unable to play song" #~ msgid "Sort by title" #~ msgstr "Sort by title" #~ msgid "Sort by artist" #~ msgstr "Sort by artist" #~ msgid "Lyrics provided by %s." #~ msgstr "Lyrics provided by %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgid "part" #~ msgstr "part" #~ msgid "Opening audio device." #~ msgstr "Opening audio device." #~ msgid "Moving %d/%d." #~ msgstr "Moving %d/%d." #~ msgid "Deleting %d/%d." #~ msgstr "Deleting %d/%d." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d songs saved" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz album ID" #~ msgid "Loaded song library." #~ msgstr "Loaded song library." #~ msgid "Unable to open audio device" #~ msgstr "Unable to open audio device" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgid "C_opy album covers" #~ msgstr "C_opy album covers" #~ msgid "Unable to retag multiple values" #~ msgstr "Unable to retag multiple values" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "Changing the name of a tag with multiple values is not supported." #~ msgid "W: %s is not a QL song database." #~ msgstr "W: %s is not a QL song database." #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "Per-song (\"Radio\") volume adjustment" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "Per-album (\"Audiophile\") volume adjustment" #~ msgid "_Volume Normalization" #~ msgstr "_Volume Normalization" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "M3U playlists cannot be loaded." #~ msgid "This station is already in your library." #~ msgstr "This station is already in your library." #~ msgid "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgstr "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgid "The library cannot be refreshed while Quod Libet is running." #~ msgstr "The library cannot be refreshed while Quod Libet is running." #~ msgid "Loading, scanning, and saving your library." #~ msgstr "Loading, scanning, and saving your library." #~ msgid "Rescan your library and exit" #~ msgstr "Rescan your library and exit" #~ msgid "Old Plugins" #~ msgstr "Old Plugins" #~ msgid "" #~ "It looks like you are running Quod Libet right now. If you edit songs " #~ "also in Quod Libet's library while it is running, you may need to refresh " #~ "or re-add them.\n" #~ "\n" #~ "If you are not running Quod Libet, or are editing songs outside of its " #~ "library, you may ignore this warning." #~ msgstr "" #~ "It looks like you are running Quod Libet right now. If you edit songs " #~ "also in Quod Libet's library while it is running, you may need to refresh " #~ "or re-add them.\n" #~ "\n" #~ "If you are not running Quod Libet, or are editing songs outside of its " #~ "library, you may ignore this warning." #~ msgid "GStreamer status %r != %r" #~ msgstr "GStreamer status %r != %r" #~ msgid "_Pane %d:" #~ msgstr "_Pane %d:" #~ msgid "Double-click a tag value to change it, right-click for other options" #~ msgstr "" #~ "Double-click a tag value to change it, right-click for other options" #~ msgid "Add a new tag" #~ msgstr "Add a new tag" #~ msgid "Tag by Filename" #~ msgstr "Tag by Filename" #~ msgid "The first letter of each word will be capitalized" #~ msgstr "The first letter of each word will be capitalized" #~ msgid "" #~ "Characters not allowed in Windows filenames (\\:?;\"<>|) will be replaced " #~ "by underscores" #~ msgstr "" #~ "Characters not allowed in Windows filenames (\\:?;\"<>|) will be replaced " #~ "by underscores" #~ msgid "" #~ "Characters outside of the ASCII set (A-Z, a-z, 0-9, and punctuation) will " #~ "be replaced by underscores" #~ msgstr "" #~ "Characters outside of the ASCII set (A-Z, a-z, 0-9, and punctuation) will " #~ "be replaced by underscores" #~ msgid "Apply to these _files..." #~ msgstr "Apply to these _files..." #~ msgid "Path" #~ msgstr "Path" #~ msgid "Tray Preferences - Quod Libet" #~ msgstr "Tray Preferences - Quod Libet" #~ msgid "%(different)s, %(missing)s" #~ msgstr "%(different)s, %(missing)s" #~ msgid "E: You need GTK+ 2.6 and PyGTK 2.6 or greater." #~ msgstr "E: You need GTK+ 2.6 and PyGTK 2.6 or greater." #~ msgid "E: You have GTK+ %s and PyGTK %s." #~ msgstr "E: You have GTK+ %s and PyGTK %s." #~ msgid "E: Please upgrade GTK+/PyGTK." #~ msgstr "E: Please upgrade GTK+/PyGTK." #~ msgid "Search Bar" #~ msgstr "Search Bar" #~ msgid "Play songs in random order" #~ msgstr "Play songs in random order" #~ msgid "S_ong" #~ msgstr "S_ong" #~ msgid "_Choose randomly" #~ msgstr "_Choose randomly" #~ msgid "Drag songs here to add them to the play queue" #~ msgstr "Drag songs here to add them to the play queue" #~ msgid "" #~ "Deleting <b>%s</b> failed. Possibly the target file does not exist, or " #~ "you do not have permission to delete it." #~ msgstr "" #~ "Deleting <b>%s</b> failed. Possibly the target file does not exist, or " #~ "you do not have permission to delete it." #~ msgid "" #~ "Quod Libet was unable to open your audio device. Often this means another " #~ "program is using it, or your audio drivers are not configured.\n" #~ "\n" #~ "Quod Libet will now exit." #~ msgstr "" #~ "Quod Libet was unable to open your audio device. Often this means another " #~ "program is using it, or your audio drivers are not configured.\n" #~ "\n" #~ "Quod Libet will now exit." #~ msgid "_New/Edit Playlist..." #~ msgstr "_New/Edit Playlist..." #~ msgid "" #~ "Enter a name for the new playlist. If it already exists it will be opened " #~ "for editing." #~ msgstr "" #~ "Enter a name for the new playlist. If it already exists it will be opened " #~ "for editing." #~ msgid "Turn shuffle off, on, or toggle it" #~ msgstr "Turn shuffle off, on, or toggle it" #~ msgid "Closing _minimizes to system tray" #~ msgstr "Closing _minimizes to system tray" #~ msgid "Performed by %s" #~ msgstr "Performed by %s" #~ msgid "arranged by %s" #~ msgstr "arranged by %s" #~ msgid "conducted by %s" #~ msgstr "conducted by %s" #~ msgid "composed by %s" #~ msgstr "composed by %s" #~ msgid "written by %s" #~ msgstr "written by %s" #~ msgid "Add songs to your library" #~ msgstr "Add songs to your library" #~ msgid "Visit the artist's website" #~ msgstr "Visit the artist's website" #~ msgid "Change volume" #~ msgstr "Change volume" #~ msgid "Supported formats:" #~ msgstr "Supported formats:" #~ msgid "" #~ "Invalid tag <b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing this tag.Invalid tags " #~ "<b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing these tags." #~ msgstr "" #~ "Invalid tag <b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing this tag.Invalid tags " #~ "<b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing these tags." #~ msgid "(shared across all %d songs)" #~ msgstr "(shared across all %d songs)" #~ msgid "(different across %d songs, missing from %d songs)" #~ msgstr "(different across %d songs, missing from %d songs)" #~ msgid "1 minute" #~ msgstr "1 minute" #~ msgid "1 hour" #~ msgstr "1 hour" #~ msgid "1 day" #~ msgstr "1 day" #~ msgid "An audio player and tag editor" #~ msgstr "An audio player and tag editor" #~ msgid "" #~ "If you have songs in directories that will not always be mounted (for " #~ "example, a removable device or an NFS shared drive), list those mount " #~ "points here. Files in these directories will not be removed from the " #~ "library if the device is not mounted." #~ msgstr "" #~ "If you have songs in directories that will not always be mounted (for " #~ "example, a removable device or an NFS shared drive), list those mount " #~ "points here. Files in these directories will not be removed from the " #~ "library if the device is not mounted." #~ msgid "" #~ "These characters will be used as separators when \"Split values\" is " #~ "selected in the tag editor" #~ msgstr "" #~ "These characters will be used as separators when \"Split values\" is " #~ "selected in the tag editor" #~ msgid "Initialized multimedia key support." #~ msgstr "Initialized multimedia key support." #~ msgid "1 track" #~ msgstr "1 track" #~ msgid "Adjust audio volume" #~ msgstr "Adjust audio volume" #~ msgid "Check for changes in the library made since the program was started" #~ msgstr "Check for changes in the library made since the program was started" #~ msgid "1 time" #~ msgstr "1 time" #~ msgid "Add a new tag to the file" #~ msgstr "Add a new tag to the file" #~ msgid "Invalid date format" #~ msgstr "Invalid date format" #~ msgid "" #~ "Invalid date: <b>%s</b>.\n" #~ "\n" #~ "The date must be entered in YYYY or YYYY-MM-DD format." #~ msgstr "" #~ "Invalid date: <b>%s</b>.\n" #~ "\n" #~ "The date must be entered in YYYY or YYYY-MM-DD format." #~ msgid "No on-screen display" #~ msgstr "No on-screen display" #~ msgid "Display OSD on the top" #~ msgstr "Display OSD on the top" #~ msgid "Display OSD on the bottom" #~ msgstr "Display OSD on the bottom" #~ msgid "Select a color for the OSD" #~ msgstr "Select a colour for the OSD" #~ msgid "Select a second color for the OSD" #~ msgstr "Select a second colour for the OSD" #~ msgid "Song _list" #~ msgstr "Song _list" #, fuzzy #~ msgid "[directory]" #~ msgstr "directory" #~ msgid "" #~ "Quod Libet - a music library and player\n" #~ "Options:\n" #~ " --help, -h Display this help message\n" #~ " --version Display version and copyright information\n" #~ " --refresh-library Rescan your song cache and then exit.\n" #~ " --print-playing Print the currently playing song.\n" #~ "\n" #~ " Player controls:\n" #~ " --next, --previous, --play-pause, --play, --pause\n" #~ " Change songs or pause/resume playing.\n" #~ " --volume +|-|0..100\n" #~ " Increase, decrease, or set the volume.\n" #~ " --shuffle 0|1|t, --repeat 0|1|t\n" #~ " Enable, disable, or toggle shuffle and repeat. \n" #~ " --query search-string\n" #~ " Make a new playlist from the given search.\n" #~ " --seek [+|-][HH:MM:]SS\n" #~ " Seek to a position in the current song.\n" #~ " --play-file filename\n" #~ " Play this file, adding it to the library if necessary.\n" #~ "\n" #~ "For more information, see the manual page (`man 1 quodlibet').\n" #~ msgstr "" #~ "Quod Libet - a music library and player\n" #~ "Options:\n" #~ " --help, -h Display this help message\n" #~ " --version Display version and copyright information\n" #~ " --refresh-library Rescan your song cache and then exit.\n" #~ " --print-playing Print the currently playing song.\n" #~ "\n" #~ " Player controls:\n" #~ " --next, --previous, --play-pause, --play, --pause\n" #~ " Change songs or pause/resume playing.\n" #~ " --volume +|-|0..100\n" #~ " Increase, decrease, or set the volume.\n" #~ " --shuffle 0|1|t, --repeat 0|1|t\n" #~ " Enable, disable, or toggle shuffle and repeat. \n" #~ " --query search-string\n" #~ " Make a new playlist from the given search.\n" #~ " --seek [+|-][HH:MM:]SS\n" #~ " Seek to a position in the current song.\n" #~ " --play-file filename\n" #~ " Play this file, adding it to the library if necessary.\n" #~ "\n" #~ "For more information, see the manual page (`man 1 quodlibet').\n" #~ msgid "" #~ "Quod Libet %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE." #~ msgstr "" #~ "Quod Libet %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE." #~ msgid "E: Unknown command line option: %s" #~ msgstr "E: Unknown command line option: %s" #~ msgid "%d:%02d:%02d" #~ msgstr "%d:%02d:%02d" #~ msgid "%d:%02d" #~ msgstr "%d:%02d" #~ msgid "" #~ "Ex Falso - an audio file tagger\n" #~ "Usage: %s [directory]\n" #~ "\n" #~ "For more information, see the manual page (`man 1 exfalso').\n" #~ msgstr "" #~ "Ex Falso - an audio file tagger\n" #~ "Usage: %s [directory]\n" #~ "\n" #~ "For more information, see the manual page (`man 1 exfalso').\n" #~ msgid "Quod Libet is free software licensed under the GNU GPL v2." #~ msgstr "Quod Libet is free software licensed under the GNU GPL v2." #~ msgid "Songs heard:" #~ msgstr "Songs heard:" #~ msgid "Listening" #~ msgstr "Listening" #~ msgid "%s and %d more - Properties" #~ msgstr "%s and %d more - Properties" #~ msgid "" #~ "No on-screen display\n" #~ "Display OSD on the top\n" #~ "Display OSD on the bottom" #~ msgstr "" #~ "No on-screen display\n" #~ "Display OSD on the top\n" #~ "Display OSD on the bottom" #~ msgid "" #~ "No volume adjustment\n" #~ "Per-song (\"Radio\") volume adjustment\n" #~ "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "" #~ "No volume adjustment\n" #~ "Per-song (\"Radio\") volume adjustment\n" #~ "Per-album (\"Audiophile\") volume adjustment" #~ msgid "Perfor_mer" #~ msgstr "Perfor_mer" #~ msgid "Pick a random album from your library" #~ msgstr "Pick a random album from your library" #~ msgid "Pick a random artist from your library" #~ msgstr "Pick a random artist from your library" #~ msgid "Pick a random genre from your library" #~ msgstr "Pick a random genre from your library" #~ msgid "Play next song" #~ msgstr "Play next song" #~ msgid "Pre_vious song" #~ msgstr "Pre_vious song" #~ msgid "Select a font for the OSD" #~ msgstr "Select a font for the OSD" #~ msgid "Pause _song" #~ msgstr "Pause _song" #~ msgid "xx minutes, " #~ msgstr "xx minutes, " ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/pl.po����������������������������������������������������������������������������0000644�0001750�0001750�00000565645�13115512745�015364� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Polish translation for quodlibet. # Copyright © 2005-2017 the quodlibet authors. # This file is distributed under the same license as the quodlibet package. # msgid "" msgstr "" "Project-Id-Version: quodlibet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2017-05-20 01:18+0200\n" "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n" "Language-Team: Polish <community-poland@mozilla.org>\n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit;\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Modyfikowanie etykiet w plikach dźwiękowych" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" "Ex Falso to edytor etykiet, posiadający ten sam interfejs modyfikowania " "etykiet, co odtwarzacz Quod Libet. Umożliwia on przeglądanie i modyfikowanie " "wszystkich etykiet w plikach muzycznych, we wszystkich obsługiwanych " "formatach." #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" "Obsługiwane formaty plików: Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, MusePack, WavPack, MPEG-4 AAC, Monkey’s Audio, WMA, SPC, MIDI." #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Edytor etykiet plików dźwiękowych" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Słuchanie, przeglądanie i modyfikowanie kolekcji muzycznej" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" "Quod Libet jest programem do zarządzania muzyką. Dostarcza on wiele sposobów " "na przeglądanie kolekcji muzyki, a także obsługę radia internetowego " "i kanałów dźwiękowych. Posiada on także niezwykle elastyczne funkcje " "modyfikowania etykiet metadanych i wyszukiwania." #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Odtwarzacz muzyki" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "_Tytuł" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Wykonawca" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "Da_ta" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "_Gatunek" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Ocena" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 msgid "Sort _by…" msgstr "Porządkowanie _według…" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Preferencje" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Lista albumów" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Lista _albumów" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Wszystkie albumy" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albumy" msgstr[2] "%d albumów" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Ponownie wczytaj o_kładkę albumu" msgstr[1] "Ponownie wczytaj o_kładki albumów" msgstr[2] "Ponownie wczytaj o_kładki albumów" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Utwory nieprzypisane do albumów" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d ścieżka" msgstr[1] "%d ścieżki" msgstr[2] "%d ścieżek" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d płyta" msgstr[1] "%d płyty" msgstr[2] "%d płyt" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 msgid "An Example Album" msgstr "Przykładowy album" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Preferencje listy albumów" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Wyświetlanie o_kładek albumów" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Wewnętrzne wy_szukiwanie obejmuje osoby" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 msgid "Options" msgstr "Opcje" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Lista albumów" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "Za_mknij" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Nieznany" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Nowy kanał" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Położenie kanału dźwiękowego:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "_Dodaj" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Kanały dźwiękowe" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Kanały dźwiękowe" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 msgid "_Download…" msgstr "_Pobierz…" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Pobierz pliki" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "_Zapisz" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Pobierz plik" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "_Nowe" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Nie można dodać kanału" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "Nie można dodać %s. Serwer może nie działać lub położenie może nie być " "kanałem dźwiękowym." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 msgid "_Refresh" msgstr "_Odśwież" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 msgid "_Delete" msgstr "_Usuń" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Obecny mechanizm dźwięku nie obsługuje adresów URL. Przeglądarka kanałów " "dźwiękowych została wyłączona." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Przeglądarka kolekcji" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d utwór" msgstr[1] "%d utwory" msgstr[2] "%d utworów" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Nieprawidłowy wzorzec" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Kolekcja albumów" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "_Kolekcja albumów" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "Nieznane %s" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "Wiele wartości %s" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Niestandardowe" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 msgid "_Remove" msgstr "_Usuń" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Etykieta" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Połącz" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Preferencje kolekcji albumów" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "_Zastosuj" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "_Anuluj" #: ../quodlibet/browsers/covergrid/main.py:125 msgid "Cover Grid" msgstr "Siatka okładek" #: ../quodlibet/browsers/covergrid/main.py:126 msgid "_Cover Grid" msgstr "_Siatka okładek" #: ../quodlibet/browsers/covergrid/prefs.py:54 msgid "Cover Grid Preferences" msgstr "Preferencje siatki okładek" #: ../quodlibet/browsers/covergrid/prefs.py:64 msgid "Show album _text" msgstr "_Wyświetlanie tekstów albumów" #: ../quodlibet/browsers/covergrid/prefs.py:71 msgid "Show \"All Albums\" Item" msgstr "Wyświetlanie elementu „Wszystkie albumy”" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "Podział w pionie" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 msgid "Cover Magnification" msgstr "Powiększanie okładek" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "System plików" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_System plików" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Nie można skopiować utworów" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Nie można skopiować wybranych plików do innych list utworów lub kolejki." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Dodaj do kolekcji" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Nieobsługiwany typ pliku" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Lista stacji może zawierać tylko położenia stacji, a nie ich listy lub listy " "odtwarzania. Następujące położenia nie mogą zostać wczytane:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Nie można dodać stacji" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Radio internetowe" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Pobieranie listy stacji" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Nowa stacja" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Położenie internetowej stacji radiowej:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Elektroniczne" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "Hip-hop/rap" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Oldies" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japońskie" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "Indyjskie" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Religijne" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Listy przebojów" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Tureckie" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Reggae/dancehall" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "Latynoskie" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "Radia uniwersyteckie" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Talk-show/wiadomości" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambient" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Jazz" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Klasyczna" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternative" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metal" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Country" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Wiadomości" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Schlager" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Funk" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Blues" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Punk" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Reggaeton" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Słowiańskie" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Greckie" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gothic" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rock" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "Wczytać listę popularnych stacji radiowych?" #: ../quodlibet/browsers/iradio.py:455 msgid "_Load Stations" msgstr "_Wczytaj stacje" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "Radio _internetowe" #: ../quodlibet/browsers/iradio.py:538 msgid "_New Station…" msgstr "_Nowa stacja…" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "Zakt_ualizuj stacje" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Wszystkie stacje" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Ulubione" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Bez kategorii" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Nie odnaleziono żadnych stacji" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Nie odnaleziono internetowych stacji radiowych w %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Wszystkie podane stacje już znajdują się w kolekcji." #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "Dodaj do ulubionych" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Usuń z ulubionych" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d stacja" msgstr[1] "%(count)d stacje" msgstr[2] "%(count)d stacji" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Właściwości urządzenia" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Urządzenie:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Niezamontowane" #: ../quodlibet/browsers/media.py:55 msgid "Mount point:" msgstr "Punkt montowania:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Nazwa:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Urządzenia" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Urządzenia" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Wysuń" #: ../quodlibet/browsers/media.py:360 msgid "_Properties" msgstr "_Właściwości" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Zmień nazwę" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "Użyte: %(used-size)s, dostępne: %(free-size)s" #: ../quodlibet/browsers/media.py:479 #, python-format msgid "%s is not connected." msgstr "%s nie jest połączone." #: ../quodlibet/browsers/media.py:499 #, python-format msgid "Copying %(song)s" msgstr "Kopiowanie %(song)s" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Nie można skopiować utworu" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Brak wystarczającej ilości wolnego miejsca na ten utwór." #: ../quodlibet/browsers/media.py:526 #, python-format msgid "%s could not be copied." msgstr "Nie można skopiować %s." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Nie można usunąć utworów" #: ../quodlibet/browsers/media.py:557 #, python-format msgid "Deleting %(song)s" msgstr "Usuwanie %(song)s" #: ../quodlibet/browsers/media.py:575 #, python-format msgid "%s could not be deleted." msgstr "Nie można usunąć %s." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Nie można usunąć utworu" #: ../quodlibet/browsers/media.py:594 #, python-format msgid "Ejecting %s failed." msgstr "Wysunięcie %s się nie powiodło." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Nie można wysunąć urządzenia" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "Brak mechanizmu urządzeń. Przeglądarka urządzeń została wyłączona." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Przeglądarka panelowa" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Przeglądarka panelowa" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Z_aznacz wszystko" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Wszystkie" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" "Wzorzec etykiety z opcjonalnymi znacznikami, np. <tt>composer</tt> lub\n" "<tt>%s</tt>" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "Tryb _szeroki" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Preferencje przeglądarki panelowej" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "Równa szerokość paneli" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Listy odtwarzania" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Listy odtwarzania" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Usuń z listy odtwarzania" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "Za_importuj" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Nowa lista odtwarzania" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Nie można zaimportować listy odtwarzania" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Można importować tylko listy odtwarzania w formatach M3U i PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Nie można zmienić nazwy listy odtwarzania" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Zaimportuj listę odtwarzania" #: ../quodlibet/browsers/playlists/menu.py:25 msgid "_New Playlist…" msgstr "_Nowa lista odtwarzania…" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Co zrobić z %d utworem?" msgstr[1] "Co zrobić z %d utworami?" msgstr[2] "Co zrobić z %d utworami?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Potwierdź działanie dla listy odtwarzania „%s”" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "puste" #: ../quodlibet/browsers/playlists/prefs.py:39 msgid "Example Playlist" msgstr "Przykładowa lista odtwarzania" #: ../quodlibet/browsers/playlists/prefs.py:47 msgid "Playlist Browser Preferences" msgstr "Preferencje przeglądarki list odtwarzania" #: ../quodlibet/browsers/playlists/prefs.py:52 msgid "Playlist display" msgstr "Wyświetlanie list odtwarzania" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Na pewno usunąć listę odtwarzania „%s”?" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Wszystkie informacje o zaznaczonej liście odtwarzania zostaną usunięte i nie " "mogą zostać przywrócone." #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Nazwa nowej listy odtwarzania:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importowanie listy odtwarzania.\n" "\n" "Dodano utwory: %(current)d/%(total)d." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Ograniczenie liczby wyników" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Wyszukiwanie w kolekcji" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Wyszukiwanie w kolekcji" #: ../quodlibet/browsers/soundcloud/main.py:38 msgid "Soundcloud Browser" msgstr "Przeglądarka SoundCloud" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "Sound_Cloud" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Wyszukaj" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "Przechodzi do serwisu %s" #: ../quodlibet/browsers/soundcloud/main.py:380 msgid "Connected" msgstr "Połączono" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "Program Quod Libet jest teraz połączony, <b>%s</b>!" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "Wyloguj z serwisu %s" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "Kod…" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "Zaloguj w serwisie %s" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "Upoważnienie serwisu SoundCloud" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "Kod upoważnienia serwisu SoundCloud:" #: ../quodlibet/cli.py:50 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Program Quod Libet nie jest uruchomiony (parametr „--run” go uruchomi)" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "kolekcja muzyki i odtwarzacz" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[opcja]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Wyświetla odtwarzany utwór i kończy działanie" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Natychmiast rozpoczyna odtwarzanie" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "Bez wyświetlania okien po uruchomieniu" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Przechodzi do następnego utworu" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" "Przechodzi do poprzedniego utworu lub rozpoczyna ponownie, jeśli jest blisko " "początku" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Przechodzi do poprzedniego utworu" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Rozpoczyna odtwarzanie" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Wstrzymuje odtwarzanie" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Przełącza tryb odtwarzania/wstrzymania" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Zatrzymuje odtwarzanie" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Zwiększa głośność" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Zmniejsza głośność" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Wyświetla stan odtwarzacza" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Ukrywa główne okno" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Wyświetla główne okno" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Przełącza widoczność głównego okna" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Przenosi działający odtwarzacz na pierwszy plan" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Usuwa aktywne filtry przeglądarki" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Odświeża i ponownie skanuje kolekcję" #: ../quodlibet/cli.py:110 msgid "List available browsers" msgstr "Wyświetla listę dostępnych przeglądarek" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Wyświetla bieżącą listę odtwarzania" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Wyświetla zawartość kolejki" #: ../quodlibet/cli.py:113 msgid "Print the active text query" msgstr "Wyświetla aktywne zapytanie tekstowe" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Uruchamia bez wtyczek" #: ../quodlibet/cli.py:115 msgid "Start Quod Libet if it isn't running" msgstr "Uruchamia program Quod Libet, jeśli nie jest uruchomiony" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Kończy działanie programu Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Przewija odtwarzany utwór" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][GG∶]MM∶SS" #: ../quodlibet/cli.py:122 msgid "Set or toggle shuffle mode" msgstr "Ustawia lub przełącza tryb losowy" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Włącza, wyłącza lub przełącza stan powtarzania" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Ustawia głośność" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Przeszukuje kolekcję" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "zapytanie" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Odtwarza plik" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 msgctxt "command" msgid "filename" msgstr "nazwa pliku" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Ocenia odtwarzany utwór" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Ustawia bieżącą przeglądarkę" #: ../quodlibet/cli.py:129 msgid "Stop after the playing song" msgstr "Zatrzymuje po odtwarzanym utworze" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Otwiera nową przeglądarkę" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Wyświetla lub ukrywa kolejkę" #: ../quodlibet/cli.py:133 msgid "Show or hide the main song list (deprecated)" msgstr "Wyświetla lub ukrywa główną listę utworów (przestarzałe)" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtruje losowo" #: ../quodlibet/cli.py:134 msgctxt "command" msgid "tag" msgstr "etykieta" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtruje według wartości etykiety" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "etykieta=wartość" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Dodaje do kolejki plik lub zapytanie" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Dodaje do kolejki pliki oddzielone przecinkami" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "nazwa pliku" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Wyświetla nazwy plików wyniku zapytania na standardowym wyjściu" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Usuwa z kolejki plik lub zapytanie" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Nieprawidłowy parametr dla „%s”." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Proszę spróbować polecenia „%s --help”." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Nieznane urządzenie" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "Nie można zaimportować %s, które jest wymagane do obsługi urządzeń." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r nie jest obsługiwanym urządzeniem." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "Nie można odnaleźć „%s”." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Inicjowanie mechanizmu urządzeń." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Próbowanie „%s”" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Nie można połączyć z mechanizmem urządzeń." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Zainicjowano mechanizm urządzeń." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Wzorzec nazw plików:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopiowanie okładek _albumów" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Usuwanie nieużywanych okładek i katalogów" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "Wystąpił błąd" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" "Można zignorować ten błąd, ale program może być niestabilny do ponownego " "uruchomienia. Wysłanie błędu zajmie tylko kilka sekund i bardzo nam pomoże." #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "Zgłoś błąd" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "Wyślij błąd" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "Zakończ program" #: ../quodlibet/errorreport/ui.py:76 msgid "Ignore Error" msgstr "Zignoruj błąd" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "Informacje o błędzie:" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" "Różne informacje o błędzie i systemie zostaną wysłane do serwisu " "internetowego niezależnego od programu Quod Libet (<a href='https://www." "sentry.io'>www.sentry.io</a>). Poniżej można przejrzeć dane przed wysłaniem." #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "(opcjonalne) Proszę podać krótki opis okoliczności wystąpienia błędu:" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "_Wyślij" #: ../quodlibet/errorreport/ui.py:115 msgid "Short description…" msgstr "Krótki opis…" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "Dane do wysłania:" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "edytor etykiet plików dźwiękowych" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "katalog" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "Źródło okładek z adresu URL" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" "Pobiera okładki powiązane przez etykietę „artwork_url”. Działa " "z przeglądarką SoundCloud." #: ../quodlibet/ext/covers/discogs.py:25 msgid "Discogs Cover Source" msgstr "Źródło okładek serwisu Discogs" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "Pobiera okładki z serwisu Discogs." #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "Źródło okładek serwisu Last.fm" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Pobiera okładki z archiwum serwisu Last.fm." #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "MusicBrainz Cover Source" msgstr "Źródło okładek serwisu MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Pobiera okładki z archiwum serwisu MusicBrainz." #: ../quodlibet/ext/editing/iconv.py:26 msgid "Convert Encodings" msgstr "Konwertowanie kodowań" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" "Naprawia błędnie zinterpretowane kodowania wartości etykiet w edytorze " "etykiet." #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "_Konwertuj kodowanie…" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "Proste odwracanie znaków kana/kanji" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "Konwertuje znaki kana/kanji na romaji przed zmianą nazw." #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "_Romanizuj japoński tekst" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "Nie można odnaleźć „Kanji Kana Simple Inverter” (kakasi)." #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "Podstawianie wyrażeń regularnych" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Umożliwia podstawianie wyrażeń regularnych (s///) podczas zmieniania etykiet " "lub nazw plików." #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title Case" msgstr "Jak W Tytule" #: ../quodlibet/ext/editing/titlecase.py:21 msgid "Title-cases tag values in the tag editor." msgstr "Zmienia wielkości znaków w edytorze etykiet na Jak W Tytule." #: ../quodlibet/ext/editing/titlecase.py:40 msgid "Title-_case Value" msgstr "Wartość Jak W _Tytule" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "Dozwolenie _WIELKICH LITER w etykietach" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "_Angielska wartość Jak w Tytule" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Używa reguł języka angielskiego do ustalania wielkości znaków, np. „Dark " "Night of the Soul”" #: ../quodlibet/ext/events/advanced_preferences.py:69 msgid "Advanced Preferences" msgstr "Zaawansowane preferencje" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "Umożliwia modyfikowanie zaawansowanych ustawień konfiguracji." #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "Wiem, co robię" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "Animowane informacje na ekranie" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "Wyświetla na ekranie informacje o utworze po jego zmianie." #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "Góra ekranu" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "Środek ekranu" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "Dół ekranu" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "_Położenie:" #: ../quodlibet/ext/events/animosd/prefs.py:171 msgid "_Cover size:" msgstr "Rozmiar _okładki:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 msgid "Display" msgstr "Wyświetlanie" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "_Czcionka:" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "Lewo" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "Środek" #: ../quodlibet/ext/events/animosd/prefs.py:197 msgid "Right" msgstr "Prawo" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "Wy_równanie tekstu:" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "Tekst" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "_Tekst:" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "_Wypełnianie:" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "Kolory" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "_Cienie" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "_Obrys" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "Zaokrąglo_ne rogi" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "Opóźni_enie:" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "Efekty" #: ../quodlibet/ext/events/animosd/prefs.py:270 msgid "Ed_it Display Pattern…" msgstr "_Modyfikuj wzorzec wyświetlania…" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 msgid "Preview" msgstr "Podgląd" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "Automatyczna aktualizacja kolekcji" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "Aktualizuje kolekcję za pomocą mechanizmu inotify. Wymaga %s." #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "Automatyczne maskowanie" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" "Automatycznie maskuje i odmaskowuje napędy po ich odmontowaniu lub " "zamontowaniu." #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "Automatyczne oceny" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" "Automatycznie ocenia utwory podczas ich odtwarzania lub pomijania. Używa " "„przyspieszonego” algorytmu z vux autorstwa Briana Nelsona." #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "Budzik" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "Budzi za pomocą głośnej muzyki." #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "Kołysanka" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "Wycisza i wstrzymuje odtwarzanie muzyki." #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "Płasko" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "Na żywo" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "Mocne niskie i wysokie tony" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "Klub" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "Duża sala" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "Impreza" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "Lekko" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "Mocne niskie tony" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "Reggae" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "Słuchawki" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "Soft Rock" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "Mocne wysokie tony" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "Dance" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "Techno" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "Ska" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "Laptop" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "Korektor graficzny" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" "Steruje brzmieniem muzyki za pomocą korektora graficznego.\n" "Można kliknąć lub użyć klawiszy, aby dostosować poziomy (kliknięcie prawym " "przyciskiem myszy przywraca dane pasmo)." #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "Obecny mechanizm nie obsługuje korektora graficznego." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "%.1f kHz" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "%d Hz" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, python-format msgid "%.1f dB" msgstr "%.1f dB" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom" msgstr "Niestandardowe" #: ../quodlibet/ext/events/equalizer.py:199 msgid "_Clear" msgstr "Wy_czyść" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "dostępny" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "rozłączony" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "rozmowny" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "nieobecny" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "zajęty" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "niewidoczny" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "Aktualizowanie stanu programu Gajim" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "Zmienia wiadomość stanu programu Gajim na obecnie słuchany utwór." #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "wstrzymano" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" "Lista kont, oddzielonych spacjami, dla których zmieniać wiadomość stanu. " "Jeśli nie podano żadnego, to zmienione zostaną wiadomości stanu wszystkich " "kont." #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "Dodanie „[wstrzymano]”" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" "Jeśli jest zaznaczone, to „[wstrzymano]” będzie dodawane do wiadomości stanu " "podczas wstrzymania." #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "Stany, dla których wiadomość będzie zmieniana" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "Wstrzymanie po odłączeniu słuchawek" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "Wstrzymuje po odłączeniu słuchawek i wznawia po ich podłączeniu." #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "Wstrzymanie wygaszacza ekranu" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" "Uniemożliwia działanie wygaszacza ekranu środowiska GNOME podczas " "odtwarzania muzyki." #: ../quodlibet/ext/events/inhibit.py:51 msgid "Music is playing" msgstr "Odtwarzanie muzyki" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "Internet Radio Log" msgstr "Dziennik radia internetowego" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" "Nagrywa dziesięć ostatnich utworów odtwarzanych na stacjach radiowych " "i wyświetla je w menu kontekstowym przewijania." #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "JEP-118" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "Wypisuje plik „Jabber User Tunes” do ~/.quodlibet/jabber." #: ../quodlibet/ext/events/language.py:21 msgid "Change Language" msgstr "Zmiana języka" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "Zmienia język interfejsu użytkownika." #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "Domyślny systemu" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "Wymagane jest ponowne uruchomienie, aby uwzględnić zmiany" #: ../quodlibet/ext/events/lyricswindow.py:199 msgid "No active song" msgstr "Brak aktywnego utworu" #: ../quodlibet/ext/events/lyricswindow.py:215 msgid "No lyrics found" msgstr "Nie odnaleziono tekstu utworu" #: ../quodlibet/ext/events/lyricswindow.py:227 msgid "Lyrics:" msgstr "Tekst utworu:" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "_Poziom powiększenia:" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "Adres URL:" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "Przywróć domyślne" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" "Wyszukiwanie przez powyższy adres URL, jeśli nie można znaleźć tekstu utworu " "w serwisie LyricsWikia." #: ../quodlibet/ext/events/lyricswindow.py:339 msgid "Alternate search" msgstr "Alternatywne wyszukiwanie" #: ../quodlibet/ext/events/lyricswindow.py:347 msgid "Lyrics Window" msgstr "Okno tekstu utworu" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "Wyświetla okno zawierające tekst odtwarzanego utworu." #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "Serwer multimediów AV UPnP" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" "Wystawia wszystkie albumy serwerowi multimediów UPnP Rygel przez interfejs D-" "Bus MediaServer2." #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "Serwer MPD" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" "Zdalnie steruje programem Quod Libet za pomocą klienta MPD. Odtwarzanie " "strumieniowe, listy odtwarzania i zarządzanie kolekcją nie są obsługiwane." #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "_Port:" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "Lokalny adres _IP:" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "_Hasło:" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 msgid "Connection" msgstr "Połączenie" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "Przetestowani klienci" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "Obsługa MPRIS przez D-Bus" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" "Steruje programem Quod Libet za pomocą specyfikacji interfejsu MPRIS 1.0/2.0 " "usługi D-Bus." #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "Ukrywanie głównego okna podczas zamykania" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Preferencje" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "Przyjmuje wzorce QL, np. %s" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "Publikowanie MQTT" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "Publikuje wiadomości stanu do tematu MQTT." #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "Nazwa komputera brokera" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "nazwa komputera/adres IP brokera" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "Port brokera" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "port brokera" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "Temat" #: ../quodlibet/ext/events/mqtt.py:128 msgid "Playing Pattern" msgstr "Wzorzec odtwarzania" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "Tekst stanu, kiedy utwór jest rozpoczynany." #: ../quodlibet/ext/events/mqtt.py:132 msgid "Paused Pattern" msgstr "Wzorzec wstrzymania" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "Tekst, kiedy utwór jest wstrzymany." #: ../quodlibet/ext/events/mqtt.py:136 msgid "No-song Text" msgstr "Tekst braku utworu" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "Zwykły tekst, kiedy żaden utwór nie jest odtwarzany" #: ../quodlibet/ext/events/mqtt.py:149 msgid "MQTT Configuration" msgstr "Konfiguracja MQTT" #: ../quodlibet/ext/events/mqtt.py:153 msgid "Status Text" msgstr "Tekst stanu" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "Połączono z brokerem pod adresem %(host)s:%(port)d" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Nie można połączyć z %(host)s:%(port)d (%(msg)s" #: ../quodlibet/ext/events/mqtt.py:192 msgid "Connection error" msgstr "Błąd połączenia" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "Tekst powiadomienia" #: ../quodlibet/ext/events/notify.py:88 msgid "_Title:" msgstr "_Tytuł:" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "Przywraca domyślny wzorzec" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "T_reść:" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "_Powiadomienia" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "Wyświetlanie powiadomień" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "Tylko podczas <i>rę_cznej</i> zmiany utworu" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "Tylko podczas <i>_automatycznej</i> zmiany utworu" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "Podczas <i>_każdej</i> zmiany utworu" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "Tylko, jeśli główne _okno nie jest aktywne" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "Przycisk „_Następny”" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "Błąd połączenia" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "Nie można połączyć z usługą powiadomień." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "Powiadomienia o utworach" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "Wyświetla powiadomienia podczas zmiany utworu." #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Następny" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" "Proszę przejść do okna Wtyczki, aby ustawić QLScrobbler. Do tego czasu " "utwory nie będą wysyłane." #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "Nie można połączyć z serwisem „%s”." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "Uwierzytelnienie się nie powiodło: nieprawidłowy adres URL." #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" "Uwierzytelnienie się nie powiodło: nieprawidłowa nazwa użytkownika „%s” lub " "hasło." #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "Klient został zabroniony. Proszę skontaktować się z autorem." #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" "Błędny czas systemu. Wysyłanie może się nie udawać, dopóki czas nie zostanie " "poprawiony." #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "Wysyłanie do serwisów AudioScrobbler" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "Klient AudioScrobbler dla serwisów Last.fm, Libre.fm i innych." #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "Pomyślnie uwierzytelniono." #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "_Serwis:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "Adres _URL:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "User_name:" msgstr "_Nazwa użytkownika:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "_Hasło:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 msgid "Other…" msgstr "Inny…" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "_Sprawdź poprawność danych konta" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "Konto" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Artist pattern:" msgstr "_Wzorzec wykonawcy:" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Title pattern:" msgstr "Wzorzec _tytułu:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "_Filtr wykluczenia:" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" "Wzorzec używany do formatowania nazwy wykonawcy do wysyłki. Pozostawienie " "pustego pola spowoduje użycie domyślnego." #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" "Wzorzec używany do formatowania tytułu do wysyłki. Pozostawienie pustego " "pola spowoduje użycie domyślnego." #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "Utwory pasujące do tego filtru nie będą wysyłane." #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "Tryb _offline (bez wysyłania)" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "Wysyłanie" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "Wyciszanie reklam radiowych" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" "Wycisza wyjście, kiedy odtwarzane są reklamy radiowe.\n" "Stacje: di.fm." #: ../quodlibet/ext/events/randomalbum.py:27 msgid "Random Album Playback" msgstr "Odtwarzanie losowego albumu" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" "Odtwarza losowy album, kiedy lista odtwarzania dojdzie do końca. Wymagana " "jest obsługa filtrowania według albumów przez aktywną przeglądarkę." #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "Wyżej oceniane" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "Częściej odtwarzane" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "Częściej pomijane" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "Ostatnio odtwarzane" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "Ostatnio rozpoczęte" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "Ostatnio dodane" #: ../quodlibet/ext/events/randomalbum.py:44 msgid "Longer albums" msgstr "Dłuższe albumy" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "sekundy przed rozpoczęciem następnego albumu" #: ../quodlibet/ext/events/randomalbum.py:87 msgid "Weights" msgstr "Waga" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "Odtwarzanie niektórych albumów częściej, niż innych" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "unikanie" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "preferowanie" #: ../quodlibet/ext/events/randomalbum.py:201 msgid "Random Album" msgstr "Losowy album" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "Czekanie na rozpoczęcie %s" #: ../quodlibet/ext/events/rbimport.py:114 msgid "Import Failed" msgstr "Importowanie się nie powiodło" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "Pomyślnie zaimportowano oceny i statystyki dla tylu utworów: %d" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "Importowanie z programu Rhythmbox" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "Importuje oceny i statystyki utworów z programu Rhythmbox." #: ../quodlibet/ext/events/rbimport.py:132 msgid "Start Import" msgstr "Rozpocznij importowanie" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "Wstrzymywanie po wygaszeniu ekranu" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" "Wstrzymuje odtwarzanie, kiedy wygaszacz ekranu środowiska GNOME jest aktywny." #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" "Nie zainstalowano dostawcy wyszukiwania GNOME Shell dla programu Quod Libet." #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "Dostawca wyszukiwania GNOME" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "Umożliwia GNOME Shell przeszukiwanie kolekcji." #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "Alternatywny pasek przewijania" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" "Alternatywny pasek przewijania, który jest zawsze widoczny i rozciąga się na " "całą szerokość okna." #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "Synchronizacja ze Squeezebox" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" "Sprawia, że urządzenie Logitech Squeezebox ma to samo wyjście, co program " "Quod Libet, jeśli oba odczytują ze wspólnej kolekcji." #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "Błąd podczas wyszukiwania serwera Squeezebox" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "Błąd podczas wyszukiwania %s. Proszę sprawdzić poprawność ustawień" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 msgid "Synchronized Lyrics" msgstr "Synchronizowany tekst utworu" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" "Wyświetla synchronizowany tekst utworu z pliku .lrc o tej samej nazwie co " "ścieżka." #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "Tekst:" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "Tło:" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "Czcionka" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "Rozmiar (w pikselach):" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "Wiadomości stanu Telepathy" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" "Aktualizuje wszystkie konta komunikatora oparte na mechanizmie Telepathy " "(skonfigurowane w programie Empathy itp.) wiadomością stanu zawierającą " "obecnie odtwarzany utwór." #: ../quodlibet/ext/events/telepathy_status.py:122 msgid "Playing:" msgstr "Odtwarzanie:" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" "Tekst stanu, kiedy utwór jest rozpoczynany. Przyjmuje wzorce QL, np. %s" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "Wstrzymano:" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "Tekst stanu, kiedy utwór jest wstrzymany. Przyjmuje wzorce QL, np. %s" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "Zwykły tekst dla stanu, kiedy żaden utwór nie jest odtwarzany" #: ../quodlibet/ext/events/telepathy_status.py:157 msgid "No song:" msgstr "Brak utworu:" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 msgid "Status Patterns" msgstr "Wzorce stanu" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "Przełączanie motywu" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "Zmienia aktywny motyw biblioteki GTK+." #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "_Motyw:" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "Domyślny motyw" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "Ciemny motyw" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "Przełączanie paska menu" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "Przełącza pasek menu przez naciśnięcie klawisza Alt." #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Bezczynny" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "Ikona obszaru powiadamiania" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "Steruje programem Quod Libet z obszaru powiadamiania." #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "_Okno programu %(application-name)s" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 msgid "_Play" msgstr "_Odtwórz" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 msgid "P_ause" msgstr "_Wstrzymaj" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 msgid "Pre_vious" msgstr "_Poprzedni" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "_Następny" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Losowo" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "Powta_rzanie" #: ../quodlibet/ext/events/trayicon/menu.py:86 msgid "Stop _After This Song" msgstr "_Zatrzymanie po tym utworze" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 msgid "Open _Browser" msgstr "Otwórz p_rzeglądarkę" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Modyfikuj _etykiety" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informacje" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 msgid "Play_lists" msgstr "_Listy odtwarzania" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "Za_kończ" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Zachowanie" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "Przewinięcie kółkiem myszy zmienia głośność" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "Przewinięcie kółkiem myszy zmienia utwór" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Przewijanie _kółkiem myszy" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Wyświetlanie podpowiedzi" #: ../quodlibet/ext/events/viewlyrics.py:23 msgid "View Lyrics" msgstr "Wyświetlenie tekstu utworu" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" "Automatycznie wyświetla tekst utworu pod listą utworów w głównym oknie." #: ../quodlibet/ext/events/viewlyrics.py:29 msgid "_Lyrics" msgstr "_Tekst utworu" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "Uruchamianie wizualizacji" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "Uruchamia zewnętrzne wizualizacje." #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "Nie można uruchomić wizualizacji za pomocą „%s”" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 msgid "Error" msgstr "Błąd" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "Plik wykonywalny wizualizacji:" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "Wczytaj ponownie" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "Pasek przewijania w kształcie fali" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "Pasek przewijania w kształcie fali obecnego utwotu." #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "Zastąpienie koloru czcionki:" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "Zapisywanie obrazów" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "Zapisuje okładkę bieżącego utworu do pliku." #: ../quodlibet/ext/events/write_cover.py:66 msgid "File:" msgstr "Plik:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "_Próg:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "Próg, po którym filtr jest aktywny" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "_Współczynnik:" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "Współczynnik kompresji" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "%d%%" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "Kompresja dźwięku" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" "Zmienia amplitudy wszystkich próbek powyżej podanego progu za pomocą " "podanego współczynnika." #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "_Preset:" msgstr "_Ustawienie:" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "Filter preset" msgstr "Filtruj ustawienia" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "Wycięcie _częstotliwości:" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "Częstotliwość niskiego filtru wycięcia" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "Poziom _kanału:" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "Poziom kanału" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "Domyślne" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "Najbliżej do położenia głośnika wirtualnego (30°, 3 metry)" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "Chu Moy" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "Najbliżej do przenikania Chu Moy (popularne)" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "Jan Meier" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "Najbliżej do amplitunerów CORDA Jana Meiera (mała zmiana)" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom settings" msgstr "Niestandardowe ustawienia" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "Przenikanie" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" "Miksuje lewy i prawy kanał tak, aby symulować dźwięk z głośników podczas " "używania słuchawek, lub dostosować wczesne nagrania stereofoniczne." #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "Filter _band:" msgstr "_Filtrowanie pasma:" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "Pasmo częstotliwości filtru" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "Filter _width:" msgstr "Filtrowanie _szerokości:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "Szerokość częstotliwości filtru" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "_Poziom:" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "Poziom efektu" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "Karaoke" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "Usuwa głos z nagrania." #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "Miksowanie do mono" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "Miksuje kanały do dźwięku monofonicznego." #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "_Prędkość:" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "_Tempo:" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "T_onacja:" #: ../quodlibet/ext/gstreamer/pitch.py:89 msgid "Audio Pitch / Speed" msgstr "Tonacja/prędkość dźwięku" #: ../quodlibet/ext/gstreamer/pitch.py:90 msgid "Controls the pitch of an audio stream." msgstr "Steruje tonacją strumienia dźwiękowego." #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 msgid "Export Playlist to Folder" msgstr "Eksport listy odtwarzania do katalogu" #: ../quodlibet/ext/playlist/export_to_folder.py:38 msgid "_Export" msgstr "Wy_eksportuj" #: ../quodlibet/ext/playlist/export_to_folder.py:43 msgid "Destination folder:" msgstr "Katalog docelowy:" #: ../quodlibet/ext/playlist/export_to_folder.py:58 msgid "Filename pattern:" msgstr "Wzorzec nazw plików:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "Eksportuje listę odtwarzania przez skopiowanie plików do katalogu." #: ../quodlibet/ext/playlist/export_to_folder.py:156 msgid "Default filename pattern:" msgstr "Domyślny wzorzec nazw plików:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "Wyeksportuj do Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" "Dynamicznie eksportuje listę odtwarzania do listy odtwarzania urządzenia " "Logitech Squeezebox, jeśli oba używają takiej samej struktury katalogów. " "Używa konfiguracji <a href=\"quodlibet:///prefs/plugins/Squeezebox Output" "\">wtyczki synchronizacji z urządzeniem Squeezebox</a>." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "Eksport listy odtwarzania do urządzenia Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "Nazwa listy odtwarzania (zastąpi istniejącą)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "Eksport do listy odtwarzania urządzenia Squeezebox" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 msgid "Remove Playlist Duplicates" msgstr "Usunięcie duplikatów na liście odtwarzania" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "Usuwa podwójne wpisy na liście odtwarzania." #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Na pewno usunąć %d duplikat utworu?" msgstr[1] "Na pewno usunąć %d duplikaty utworów?" msgstr[2] "Na pewno usunąć %d duplikatów utworów?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "Duplikaty utworów zostaną usunięte z listy odtwarzania „%s”." #: ../quodlibet/ext/playlist/shuffle.py:15 msgid "Shuffle Playlist" msgstr "Losowa lista odtwarzania" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "Losuje kolejność utworów na liście odtwarzania." #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "Podążanie za kursorem" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" "Odtwarzanie podąża za zaznaczeniem lub następnym utworem na liście po " "wyczerpaniu zaznaczonych." #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "Wyrównywanie liczby odtworzeń" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "Losuje kolejność, preferując utwory z mniejszą liczbą odtworzeń." #: ../quodlibet/ext/playorder/playcounteq.py:25 msgid "Prefer less played" msgstr "Preferowanie rzadziej odtwarzanych" #: ../quodlibet/ext/playorder/queue.py:19 msgid "Queue Only" msgstr "Tylko kolejka" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" "Ogranicza odtwarzanie utworów do kolejki. Wybranie tej kolejności " "odtwarzania w głównym oknie, a następnie podwójne kliknięcie utworu doda go " "do kolejki." #: ../quodlibet/ext/playorder/reverse.py:14 msgid "Reverse" msgstr "Odwrotnie" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "Odwraca kolejność odtwarzania utworów." #: ../quodlibet/ext/playorder/skip_songs.py:25 msgid "Skip Songs" msgstr "Pomijanie utworów" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "Odtwarzanie pomija utwory z oceną równą lub niższą niż podany próg." #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "Powtarzanie każdej ścieżki" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" "Losowanie kolejności utworów, ale powtarzanie każdej ścieżki podaną liczbę " "razy." #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "Ile razy odtwarzać każdy utwór:" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "Zapytanie warunkowe" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" "Wybiera zapytanie do dopasowania na podstawie zapytania warunkowego. " "Składnia: „@(if: condition, then, else)”." #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "Zapytanie języka Python" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" "Użycie wyrażeń języka Python w zapytaniach. Składnia: „@(python: " "expression)”. Zmienna „s” to dopasowywany utwór." #: ../quodlibet/ext/query/savedsearch.py:19 msgid "Include Saved Search" msgstr "Dołączenie zapisanego wyszukiwania" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" "Dołączenie wyników zapisanego wyszukiwania jako część innego zapytania. " "Składnia: „@(saved: search name)”." #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "Squeezebox jest OK. Używanie jedynego odtwarzacza (%s)." #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "Nie można połączyć z %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "Nazwa komputera:" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "Port:" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 msgid "Username:" msgstr "Nazwa użytkownika:" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "Hasło:" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "Katalog kolekcji, z którym serwer ma się łączyć." #: ../quodlibet/ext/_shared/squeezebox/base.py:132 msgid "Library path:" msgstr "Ścieżka do kolekcji:" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "_Sprawdź ustawienia" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "Serwer Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Debugowanie" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Serwer Squeezebox pod adresem {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "niezidentyfikowany serwer Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "niezidentyfikowany odtwarzacz Squeezebox: %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "Wybór odtwarzacza Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "_OK" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Odnaleziono serwer Squeezebox.\n" "Proszę wybrać odtwarzacz" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "Dopasowanie _obrazu do okna" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "_Program:" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "_Modyfikowanie obrazu po zapisaniu" #: ../quodlibet/ext/songsmenu/albumart.py:345 msgid "File_name:" msgstr "_Nazwa pliku:" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "Zapisanie się nie powiodło" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, python-format msgid "Unable to save \"%s\"." msgstr "Nie można zapisać „%s”." #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] Błąd HTTP: %s" #: ../quodlibet/ext/songsmenu/albumart.py:613 msgid "Album Art Downloader" msgstr "Pobieranie okładek" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "z %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "Rozdzielczość: %s" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, python-format msgid "Size: %s" msgstr "Rozmiar: %s" #: ../quodlibet/ext/songsmenu/albumart.py:690 msgid "_Search" msgstr "Wy_szukaj" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 msgid "Searching…" msgstr "Wyszukiwanie…" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "Gotowe" #: ../quodlibet/ext/songsmenu/albumart.py:922 msgid "Download Album Art" msgstr "Pobieranie okładek" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "Pobiera okładki z różnych stron WWW." #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "Źródła" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "APEv2 na ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" "Konwertuje etykiety APEv2 na ID3v2. Spowoduje usunięcie etykiet APEv2 po " "konwersji." #: ../quodlibet/ext/songsmenu/bookmarks.py:23 msgid "Go to Bookmark" msgstr "Przejdź do zakładki" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "Zarządza zakładkami w zaznaczonych plikach." #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 msgid "_Edit Bookmarks…" msgstr "_Modyfikuj zakładki…" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 msgid "No Bookmarks" msgstr "Brak zakładek" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 msgid "MusicBrainz Lookup" msgstr "Wyszukiwanie w serwisie MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" "Ponownie nadaje etykiety albumu na podstawie wyszukiwania w serwisie " "MusicBrainz." #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "Użycie tylko roku z etykiety „date”" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "Zapisywanie etykiety „_albumartist”, kiedy jest to konieczne" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "Zapisywanie etykiet porządkowania dla nazw wykonawców" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "Zapisywanie _standardowych etykiet serwisu MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "Zapisywanie etykiety „labelid”" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nazwa pliku" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 msgid "Disc" msgstr "Płyta" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Ścieżka" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 msgid "Title" msgstr "Tytuł" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Wykonawca" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 msgid "MusicBrainz lookup" msgstr "Wyszukiwanie w serwisie MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 msgid "_Query:" msgstr "_Zapytanie:" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 msgid "S_earch" msgstr "Wy_szukaj" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "Wyniki <i>(przeciągnięcie zmienia kolejność)</i>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "Proszę wprowadzić zapytanie." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "Wystąpił błąd. Proszę ponowić." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "Wczytywanie wyników…" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 msgid "No results found." msgstr "Nie odnaleziono wyników." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 msgid "Browse Folders" msgstr "Przeglądanie katalogów" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "Otwiera katalogi utworów w menedżerze plików." #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Unable to open folders" msgstr "Nie można otworzyć katalogów" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "Żaden program do otwierania katalogów nie jest dostępny." #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "Konsola języka Python" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "Interaktywna konsola języka Python." #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "Domyślnie można uzyskać dostęp do następujących obiektów:" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "Bieżący katalog roboczy:" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "Polecenie" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "name" msgstr "nazwa" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "Nazwa tego polecenia" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "polecenie" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "Składnia wykonywanego polecenia powłoki" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "parametr" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" "Jeśli podano, to parametr, którego wystąpienia w poleceniu będą zastępowane " "wartością podaną przez użytkownika, np. za pomocą „PARAM” wszystkie kopie " "„{PARAM}” w poleceniu będą prosiły o podanie wartości podczas wykonywania" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "wzorzec" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" "Wzorzec QL, np. <~filename>, używany do obliczania wartości dla polecenia. " "Dla list odtwarzania obsługiwane są także etykiety wirtualne <~playlistname> " "i <~#playlistindex>." #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "unikalny" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "Jeśli ustawiono, to usunie duplikaty obliczonych wartości wzorca" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "maksymalna liczba parametrów" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" "Maksymalna liczba parametrów przekazywanych poleceniu za jednym razem (jak " "xargs)" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 msgid "Input value" msgstr "Wprowadzenie wartości" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "Wartość dla %s?" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 msgid "Custom Commands" msgstr "Niestandardowe polecenia" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Wykonuje niestandardowe polecenia (wsadowo, jeśli trzeba) na utworach za " "pomocą ich etykiet." #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "Modyfikuj niestandardowe polecenia" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" "Obsługuje wzorce QL\n" "np. <tt><~artist~title></tt>" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, python-format msgid "Unable to run custom command %s" msgstr "Nie można wykonać niestandardowego polecenia %s" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "%d duplikat grupy" msgstr[1] "%d duplikaty grupy" msgstr[2] "%d duplikatów grupy" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "Zwiń/rozwiń wszystko" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Wyrażenie klucza duplikatu: „%s”" #: ../quodlibet/ext/songsmenu/duplicates.py:372 msgid "Duplicates Browser" msgstr "Przeglądarka duplikatów" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "Wyszukuje i wyświetla podobnie oznaczone wersje utworów." #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" "Przyjmuje wzorce etykiet QL, takie jak <tt>~artist~title</tt> lub " "<tt>musicbrainz_track_id</tt>" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "_Grupowanie duplikatów według:" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "Klucz duplikatu" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "Usuwanie _spacji" #: ../quodlibet/ext/songsmenu/duplicates.py:424 msgid "Remove _Diacritics" msgstr "Usuwanie znaków _diakrytycznych" #: ../quodlibet/ext/songsmenu/duplicates.py:425 msgid "Remove _Punctuation" msgstr "Usuwanie _interpunkcji" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "Rozróżnianie wielkości _liter" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "Opcje dopasowywania" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 msgid "Edit Playcount" msgstr "Modyfikuj liczbę odtworzeń" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" "Modyfikuje ~#playcount i ~#skipcount utworu.\n" "\n" "Kiedy zaznaczono wiele utworów, liczby będą zwiększanie, a nie ustawiane.\n" "\n" "Kiedy ~#playcount utworu jest ustawiany na 0, wpisy ~#lastplayed " "i ~#laststarted zostaną wyczyszczone. Jednakże, kiedy utwór z zerem " "odtworzeń jest ustawiany na dodatnią liczbę odtworzeń, żadne czasy " "odtworzenia nie zostaną utworzone." #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "Liczba odtworzeń" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "Liczba pominięć" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "Modyfikowanie osadzonych obrazów" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "Usuwa lub zastępuje osadzone obrazy." #: ../quodlibet/ext/songsmenu/embedded.py:78 msgid "_Remove all Images" msgstr "_Usuń wszystkie obrazy" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "_Osadź bieżący obraz" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "Ustawianie dokładnej oceny" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "Umożliwia ustawianie oceny utworu jako liczby." #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "Proszę podać ocenę na skali od 0,0 do 1,0" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Filter on Any Tag" msgstr "Filtrowanie dowolnej etykiety" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "" "Tworzy zapytanie wyszukiwania na podstawie etykiet zaznaczonych utworów." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 msgid "Filter on Directory" msgstr "Filtrowanie według katalogów" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "Filtruje według katalogów w nowym oknie przeglądarki." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "Wyszukiwanie odcisku akustycznego" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "Wyszukuje metadane utworu przez odcisk akustyczny." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "Wysłanie odcisków akustycznych" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Tworzy odciski akustyczne za pomocą programu chromaprint i wysyła je do " "serwisu acoustid.org." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "Brak klucza API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" "Należy podać klucz API serwisu acoustid.org w preferencjach wtyczki przed " "wysłaniem odcisków." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "Zażądaj klucza API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "_Klucz API:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "Usługa WWW AcoustID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "W kolejce" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "Analizowanie" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "Wyszukaj" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Zapisz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "Stan" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "Wydanie" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 msgid "Write MusicBrainz tags" msgstr "Zapisywanie etykiet serwisu MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 msgid "Group by directory" msgstr "Grupowanie według katalogów" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "Album Mode" msgstr "Tryb albumów" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" "Zapisywanie etykiet powiązanych z albumem i próbowanie zmniejszenia liczby " "różnych wydań albumu" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "Tworzenie odcisków:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "_Szczegóły" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "_Wyślij" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" "Utwory wymagają etykiet <i><b>musicbrainz_trackid</b></i> lub <i><b>artist</" "b></i>/<i><b>title</b></i>/<i><b>album</b></i>, aby wysłać." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "Odciski:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "Utwory z MBID:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "Utwory z wystarczającymi etykietami:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "Utwory do wysłania:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Gotowe. Utwory do wysłania: %(to-send)d/%(all)d." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "Wysyłanie odcisków:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "Wysyłanie…" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 msgid "Update Tags in Files" msgstr "Aktualizacja etykiet w plikach" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" "Aktualizuje etykiety w plikach. Zapewni to aktualność liczby odtworzeń " "i ocen." #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "Eksport do pliku HTML" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "Eksportuje zaznaczoną listę utworów do pliku HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "Naprawa czasu trwania plików MP3" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" "Usuwa klatki TLEN z etykiet ID3, które mogą powodować nieprawidłowe czasy " "trwania utworów." #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "Wysłanie do urządzenia iFP" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "Wysyła utwory do urządzenia iFP iRiver." #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "Eksport metadanych" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "Eksportuje metadane zaznaczonych utworów jako plik .tags." #: ../quodlibet/ext/songsmenu/importexport.py:92 msgid "Import Metadata" msgstr "Import metadanych" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "Importuje metadane zaznaczonych utworów z pliku .tags." #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "Nagrywanie płyt CD" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Nagrywa płyty CD za pomocą programu K3b, Brasero lub xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "Aktualizowanie listy wykresów." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "Jest już aktualne." #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "Pobieranie wykresu dla tygodnia: %s." #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "Synchronizacja ukończona." #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "Błąd podczas synchronizacji" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "Synchronizacja z serwisem Last.fm" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "Aktualizuje statystyki kolekcji z profilu serwisu Last.fm." #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 msgid "_Username:" msgstr "Nazwa _użytkownika:" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "Tworzenie etykiet porządkowania" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" "Konwertuje nazwy albumów i wykonawców do ich porządkowania (niezbyt dobrze)." #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 msgid "Migrate Metadata" msgstr "Migracja metadanych" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "Kopiuje metadane programu Quod Libet między utworami." #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "S_kopiuj" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "Wk_lej" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 msgid "Information to copy/paste" msgstr "Informacje do skopiowania/wklejenia" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "Mapowanie ścieżek według numerów płyty i ścieżki" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" "Należy to włączyć, kiedy ma być wykonana migracja z jednego albumu do " "drugiego, dopasowując numery płyty i ścieżki.\n" "\n" "<b>Uwaga:</b> musi to zostać włączone, kiedy metadane są kopiowane, aby " "przechować informacje o ścieżce." #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "Jest %d przechowywana ścieżka." msgstr[1] "Są %d przechowywane ścieżki." msgstr[2] "Jest %d przechowywanych ścieżek." #: ../quodlibet/ext/songsmenu/playlist.py:31 msgid "Export as Playlist" msgstr "Wyeksportuj jako listę odtwarzania" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "Eksportuje utwory do listy odtwarzania M3U lub PLS." #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "Ścieżki względne" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "Ścieżki bezwzględne" #: ../quodlibet/ext/songsmenu/playlist.py:132 msgid "Unable to export playlist" msgstr "Nie można wyeksportować listy odtwarzania" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Zapisanie do <b>%s</b> się nie powiodło." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 msgid "Rescan Songs" msgstr "Ponownie skanuj utwory" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "Wyszukuje zmiany plików i wczytuje ponownie/usuwa je w razie potrzeby." #: ../quodlibet/ext/songsmenu/refresh.py:31 msgid "Rescan songs" msgstr "Ponownie skanuj utwory" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "Analizator ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "Postęp" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "Wzmocnienie" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "Szczyt" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "<b>%(to-process)s</b> album do zaktualizowania (z %(all)s)" msgstr[1] "<b>%(to-process)s</b> albumy do zaktualizowania (z %(all)s)" msgstr[2] "<b>%(to-process)s</b> albumów do zaktualizowania (z %(all)s)" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" "Analizuje i aktualizuje informacje ReplayGain za pomocą biblioteki " "GStreamer. Wyniki są grupowane według albumów." #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "zawsze" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "jeśli brakuje <b>dowolnych</b> etykiet RG" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "jeśli brakuje etykiet RG <b>album</b>" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "_Przetwarzane albumy:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 msgid "Existing Tags" msgstr "Istniejące etykiety" #: ../quodlibet/ext/songsmenu/splitting.py:31 msgid "Split Tags" msgstr "Rozdzielanie etykiet" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "Rozdziela numer płyty z albumu i wersję z tytułu w tym samym czasie." #: ../quodlibet/ext/songsmenu/splitting.py:56 msgid "Split Album" msgstr "Rozdzielanie albumów" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "Rozdziela numer płyty." #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "Uderzenia na minutę:" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "Nie dotyczy" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 msgid "Reset" msgstr "Przywróć" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 msgid "Tap" msgstr "Wystukaj" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "Wystukiwanie uderzeń na minutę" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 msgid "Tap BPM for the selected song." msgstr "Wystukuje uderzenia na minutę zaznaczonego utworu." #: ../quodlibet/ext/songsmenu/website_search.py:35 msgid "Website Search" msgstr "Wyszukiwanie na stronie WWW" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" "Przeszukuje wybraną stronę WWW za pomocą dowolnych etykiet utworów.\n" "Obsługuje wzorce, np. %(pattern-example)s." #: ../quodlibet/ext/songsmenu/website_search.py:78 msgid "Search URL patterns" msgstr "Wzorzec adresu URL wyszukiwania" #: ../quodlibet/ext/songsmenu/website_search.py:88 msgid "Edit search URLs" msgstr "Modyfikowanie adresów URL wyszukiwania" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 msgid "Configure Searches…" msgstr "Skonfiguruj wyszukiwania…" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "Wyszukaj w serwisie %(website)s" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "Wyszukiwanie wykonawcy w angielskiej Wikipedii" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" "Otwiera okno przeglądarki z artykułem z angielskiej Wikipedii o wykonawcy " "odtwarzanego utworu." #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "Wyszukiwanie albumu w angielskiej Wikipedii" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" "Otwiera okno przeglądarki z artykułem z angielskiej Wikipedii o albumie " "odtwarzanego utworu." #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Kolekcja" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Wyszukiwanie punktów montowania" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Skanowanie kolekcji" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Skanowanie %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "Wczytywanie plików" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Wczytanie pliku się nie powiodło: %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Wyświetla listę etykiet" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Wyświetla zwięzłe wyjście" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Kolumny do wyświetlenia i kolejność w trybie zwięzłym (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "Wyświetlanie także etykiet programistycznych" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Brak wystarczającej liczby parametrów" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "Za dużo parametrów" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "Opis" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Wartość" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Wyświetla wszystkie popularne etykiety" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Kopiuje etykiety z jednego pliku do drugiego" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Wyświetla zmiany, bez ich zastosowywania" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Pomija etykiety, które nie mogą zostać zapisane" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Nie można skopiować etykiety %r do pliku: %r" #: ../quodlibet/operon/commands.py:157 msgid "Edit tags in a text editor" msgstr "Modyfikuj etykiety w edytorze tekstu" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "Przerwano modyfikowanie" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Uruchomienie edytora tekstu „%(editor-name)s” się nie powiodło." #: ../quodlibet/operon/commands.py:260 msgid "No changes detected" msgstr "Nie wykryto zmian" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Ustawia etykietę i usuwa istniejące wartości" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Nie można ustawić %r" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "Usuwa etykiety" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "Wartość jest wyrażeniem regularnym" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "Usuwa wszystkie etykiety" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "Nie można łączyć „--all” z „--regexp”" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "Nie można usunąć %r z %r" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "Usuwa wartość etykiety" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "Dodaje wartość etykiety" #: ../quodlibet/operon/commands.py:456 msgid "List file information" msgstr "Wyświetla informacje o pliku" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" "Ustawia podany obraz jako główny obraz osadzony i usuwa wszystkie pozostałe " "osadzone obrazy" #: ../quodlibet/operon/commands.py:515 #, python-format msgid "Failed to load image file: %r" msgstr "Wczytanie pliku obrazu się nie powiodło: %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" "Modyfikowanie obrazów nie jest obsługiwane dla %(file_name)s " "(%(file_format)s)" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "Usuwa wszystkie osadzone obrazy" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Wydobywa osadzone obrazy do %(filepath)s" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "Ścieżka, do której zapisywać obrazy (domyślnie katalog roboczy)" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Zmienia nazwy plików na podstawie etykiet" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Wypełnia etykiety na podstawie ścieżek plików" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Plik" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Wypełnia numery ścieżek dla wszystkich plików" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Wyświetla etykiety na podstawie podanego wzorca" #: ../quodlibet/operon/commands.py:768 msgid "Display help information" msgstr "Wyświetla informacje o pomocy" #: ../quodlibet/operon/util.py:40 #, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "" "„%(column-id)s” nie jest prawidłową nazwą kolumny (%(all-column-ids)s)." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Nieznane" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "W kolejności" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_W kolejności" #: ../quodlibet/order/reorder.py:23 msgid "Random" msgstr "Losowo" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Losowo" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "Preferowanie wyżej ocenionych" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "Powtarzanie tej ścieżki" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 msgid "Repeat all" msgstr "Powtarzanie wszystkich" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Pojedynczo" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Strumień" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Buforowanie" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "Nie można utworzyć potoku biblioteki GStreamer" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" "Nie odnaleziono elementu biblioteki GStreamer do obsługi formatu multimediów" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "Format multimediów: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "Nie można zainicjować wtyczki biblioteki GStreamer „%(name)s”" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "Potok wyjściowy biblioteki GStreamer używany do odtwarzania. Pozostawienie " "pustego spowoduje użycie domyślnego potoku. Jeśli potok zawiera odpływ, to " "będzie on używany zamiast domyślnego." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Potok wyjściowy:" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f s" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "Długość _bufora:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "Wyłączenie płynnego _odtwarzania" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" "Wyłączenie płynnego odtwarzania może pomóc uniknąć problemów podczas " "zmieniania utworów w niektórych wersjach biblioteki GStreamer." #: ../quodlibet/player/gstbe/util.py:93 msgid "No GStreamer audio sink found" msgstr "Nie odnaleziono żadnych odpływów dźwięku biblioteki GStreamer" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "Nieprawidłowy potok wyjściowy biblioteki GStreamer" #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Nie można utworzyć wyjścia dźwięku" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Nie odnaleziono urządzenia dźwiękowego %r. Proszę sprawdzić poprawność " "ustawień programu Xine w ~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "Nie można odnaleźć modułu „{module}”. Może trzeba zainstalować pakiet?" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Nie można odnaleźć elementu biblioteki GStreamer „{element}”." #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "Uruchomić wtyczkę „%(name)s” na %(count)s liście odtwarzania?" msgstr[1] "Uruchomić wtyczkę „%(name)s” na %(count)s listach odtwarzania?" msgstr[2] "Uruchomić wtyczkę „%(name)s” na %(count)s listach odtwarzania?" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 msgid "_Run Plugin" msgstr "_Uruchom wtyczkę" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Obsługiwane formaty: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Urządzenie dźwiękowe: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Początek" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "Nie dotyczy" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Czas" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Nazwa zakładki" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM∶SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Zakładki" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtry" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "_Ostatnio odtwarzane" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Ostatnio _dodane" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 pop_ularnych" #: ../quodlibet/qltk/browser.py:63 msgid "All _Songs" msgstr "_Wszystkie utwory" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "Bi_eżący gatunek" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "Bieżący wy_konawca" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "Bieżący al_bum" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Losuj g_atunek" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Losuj _wykonawcę" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Losuj al_bum" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 najczęściej odtwarzanych utworów (może być więcej, jeśli utwory mają tę " "samą liczbę odtworzeń)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Wartość:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Zapisane wartości" #: ../quodlibet/qltk/cbes.py:263 msgid "Edit saved values…" msgstr "Modyfikuj zapisane wartości…" #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_matycznie" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "Tryb ś_cieżek" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "Tryb _albumów" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "Wy_ciszenie" #: ../quodlibet/qltk/controls.py:128 msgid "_Replay Gain Mode" msgstr "_Tryb ReplayGain" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "Nowe %s" #: ../quodlibet/qltk/data_editors.py:218 msgid "(unknown)" msgstr "(nieznany)" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "Wrażenie etykiety" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "Wrażenie etykiety, np. people:real lub ~album~year." #: ../quodlibet/qltk/data_editors.py:383 msgid "Enter new tag" msgstr "Nowa etykieta" #: ../quodlibet/qltk/delete.py:37 msgid "Files:" msgstr "Pliki:" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" "Zaznaczone utwory zostaną usunięte z kolekcji, a pliki usunięte z dysku." #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "Zaznaczone pliki zostaną usunięte z dysku." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "Trwale usunąć %(file_count)d plik?" msgstr[1] "Trwale usunąć %(file_count)d pliki?" msgstr[2] "Trwale usunąć %(file_count)d plików?" #: ../quodlibet/qltk/delete.py:91 msgid "_Delete Files" msgstr "_Usuń pliki" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "Zaznaczone utwory zostaną usunięte z kolekcji, a pliki przeniesione do kosza." #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "Zaznaczone pliki zostaną przeniesione do kosza." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "Przenieść %(file_count)d plik do kosza?" msgstr[1] "Przenieść %(file_count)d pliki do kosza?" msgstr[2] "Przenieść %(file_count)d plików do kosza?" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Przenieś do kosza" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Przenoszenie %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Nie można przenieść do kosza" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 msgid "Moving one or more files to the trash failed." msgstr "Przeniesienie jednego lub więcej plików do kosza się nie powiodło." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Usuwanie %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 msgid "Unable to delete files" msgstr "Nie można usunąć plików" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 msgid "Deleting one or more files failed." msgstr "Usunięcie jednego lub więcej plików się nie powiodło." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Pobrane pliki" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Rozmiar" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "Za_trzymaj" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "brak w %d utworze" msgstr[1] "brak w %d utworach" msgstr[2] "brak w %d utworach" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "różne w %d utworze" msgstr[1] "różne w %d utworach" msgstr[2] "różne w %d utworach" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Rozdziel na _wiele wartości" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Oddziel płytę od al_bumu" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Oddziel _wersję od tytułu" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Oddziel aranżera od _wykonawcy" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Oddziel _wykonawcę od wykonawcy" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "Oddziel _wykonawcę od tytułu" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "Oddziel p_ierwotnego wykonawcę od tytułu" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Dodaj etykietę" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Etykieta:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Modyfikuj etykiety" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "_Wyświetlanie etykiet programistycznych" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Dostęp do wszystkich etykiet, w tym tych utworzonych przez komputer, tzn. " "etykiet MusicBrainz lub ReplayGain" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 msgctxt "edittags" msgid "_Revert" msgstr "_Odwrotnie" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "_Zapisz" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Nie można dodać etykiety" #: ../quodlibet/qltk/edittags.py:660 #, python-format msgid "Unable to add <b>%s</b>" msgstr "Nie można dodać <b>%s</b>" #: ../quodlibet/qltk/edittags.py:662 #, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "Zaznaczone pliki nie obsługują wielu wartości dla <b>%s</b>." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Nieprawidłowa etykieta" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Nieprawidłowa etykieta <b>%s</b>\n" "\n" "Zaznaczone pliki nie obsługują modyfikowania tej etykiety." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Nieprawidłowa wartość" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Nieprawidłowa wartość: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Etykieta może być niewłaściwa" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "Zmieniono %(file-name)s w trakcie działania programu. Zapisanie bez " "odświeżenia kolekcji może spowodować zastąpienie innych zmian w utworze." #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Nie można zapisać utworu" #: ../quodlibet/qltk/_editutils.py:50 #, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Zapisanie %(file-name)s się nie powiodło. Plik jest tylko do odczytu, " "uszkodzony lub brak uprawnień do jego modyfikacji." #: ../quodlibet/qltk/_editutils.py:142 msgid "_More options…" msgstr "_Więcej opcji…" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "C_ofnij" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "Po_nów" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "_O programie" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "Wy_szukaj aktualizacje…" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Wtyczki" #: ../quodlibet/qltk/exfalsowindow.py:267 #, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s i %(count)s więcej" msgstr[1] "%(title)s i %(count)s więcej" msgstr[2] "%(title)s i %(count)s więcej" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Preferencje programu Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "_Rozdzielanie przy:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Modyfikowanie etykiet" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Katalogi" #: ../quodlibet/qltk/filesel.py:253 msgid "_New Folder…" msgstr "_Nowy katalog…" #: ../quodlibet/qltk/filesel.py:262 msgid "_Select all Sub-Folders" msgstr "Z_aznacz wszystkie podkatalogi" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Nowy katalog" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Nazwa nowego katalogu:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Nie można utworzyć katalogu" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Nie można usunąć katalogu" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Utwory" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr " %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "%s. płyta" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "%s. ścieżka" #: ../quodlibet/qltk/info.py:108 msgid "_Edit Display…" msgstr "_Modyfikuj wyświetlanie…" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Nie wybrano żadnych utworów." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Brak utworów" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informacje" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Tekst utworu" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Wyprodukowane przez %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "wykonawca" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "wykonawcy" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "wykonawcy" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Nigdy" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d raz" msgstr[1] "%(n)d razy" msgstr[2] "%(n)d razy" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "dodano" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "ostatnio odtworzone" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "odtwarzań" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "pominięć" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "ocena" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "ścieżka" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "długość" #: ../quodlibet/qltk/information.py:289 msgid "format" msgstr "format" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "kodek" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 msgid "encoding" msgstr "kodowanie" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "gęstość bitowa" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "rozmiar pliku" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "zmodyfikowano" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "Dodatkowe" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "Zaznaczono: %d" msgstr[1] "Zaznaczono: %d" msgstr[2] "Zaznaczono: %d" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Ścieżka jest niedostępna" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Lista ścieżek" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d utwór bez albumu" msgstr[1] "%d utwory bez albumu" msgstr[2] "%d utworów bez albumu" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Wybrana dyskografia" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d utwór bez wykonawcy" msgstr[1] "%d utwory bez wykonawcy" msgstr[2] "%d utworów bez wykonawcy" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albumy" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Całkowita długość:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Całkowity rozmiar:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Pliki" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Pobierz" #: ../quodlibet/qltk/lyrics.py:40 msgid "_Edit" msgstr "_Modyfikuj" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Nie odnaleziono tekstu tego utworu." #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "Wyszukiwanie tekstu utworu…" #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "Na pewno usunąć wszystkie utwory?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "Zaznaczone utwory zostaną usunięte z kolekcji." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "Wyświetl" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "_Wyświetl" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Odrzucić zmiany w etykietach?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Etykiety zostały zmienione, ale nie zostały zapisane. Zapisać te pliki czy " "przywrócić poprzednie wersje i odrzucić zmiany?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 msgid "_Revert" msgstr "_Przywróć" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Plik istnieje" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "Zastąpić %(file-name)s?" #: ../quodlibet/qltk/msg.py:94 msgid "_Replace File" msgstr "_Zastąp plik" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Aktywne zadania" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "Uruchomione zadania: %d" #: ../quodlibet/qltk/playorder.py:254 msgid "Toggle shuffle mode" msgstr "Przełącza tryb losowy" #: ../quodlibet/qltk/playorder.py:270 msgid "Toggle repeat mode" msgstr "Przełącza tryb powtarzania" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Błędy wtyczek" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Włączone" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Wyłączone" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Brak kategorii" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "Wydarzenia" #: ../quodlibet/qltk/pluginwin.py:170 msgid "Play Order" msgstr "Kolejność odtwarzania" #: ../quodlibet/qltk/pluginwin.py:171 msgid "Editing" msgstr "Modyfikowanie" #: ../quodlibet/qltk/pluginwin.py:173 msgid "Covers" msgstr "Okładki" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Nie odnaleziono żadnych wtyczek." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Wtyczki" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Wyświetlanie _błędów" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Płyta" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "Ścież_ka" #: ../quodlibet/qltk/prefs.py:47 msgid "Grou_ping" msgstr "_Grupowanie" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Nazwa pliku" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Długość" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "Automatyczne p_rzechodzenie do odtwarzanego utworu" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Podczas zmiany odtwarzanego utworu, lista zostanie przesunięta na nowy utwór" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Inne:" #: ../quodlibet/qltk/prefs.py:88 msgid "_Edit…" msgstr "_Modyfikuj…" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Dodawanie lub usuwanie dodatkowych nagłówków kolumn" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Widoczne kolumny" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Tytuł zawiera _wersję" #: ../quodlibet/qltk/prefs.py:106 msgid "Artist includes all _people" msgstr "Wykonawca zawiera wszystkie _osoby" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Album zawiera p_odpis płyty" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Nazwa pliku zawiera _katalog" #: ../quodlibet/qltk/prefs.py:123 msgid "Column Preferences" msgstr "Preferencje kolumn" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Zastosowuje bieżącą konfigurację do listy utworów, dodając nowe kolumny na " "końcu" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Lista utworów" #: ../quodlibet/qltk/prefs.py:222 msgid "Edit Columns" msgstr "Modyfikuj kolumny" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "Całkowity czas trwania" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Filtr globalny:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Zastosowuje to zapytanie w dodatku do innych" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 msgctxt "heading" msgid "Search" msgstr "Wyszukiwanie" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Przeglądarki" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Potwierdzanie _wielu ocen" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "Pyta o potwierdzenie przed zmienianiem ocen wielu utworów na raz" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Oceny jednym _kliknięciem" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "Włącza ocenianie kliknięciem na kolumnę ocen na liście utworów" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Oceny" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Preferowanie okładek _osadzonych" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Używa okładek osadzonych w pliku dźwiękowym (jeśli są dostępne) zamiast " "innych źródeł" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "_Stała nazwa pliku obrazu:" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "Jedyna używana nazwa pliku obrazu, jeśli zaznaczono" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "Obraz okładki używany podczas wymuszania" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Okładki" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Odtwarzanie" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Konfiguracja wyjścia" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Jeśli informacja ReplayGain nie jest dostępna dla utworu, to skaluje " "głośność według tej wartości" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "Wzmocnienie _zapasowe (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Skaluje głośność wszystkich utworów według tej wartości, dopóki wynikowy " "dźwięk się nie przycina" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "_Przedwzmocnienie (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "Dopasowywanie głośności _ReplayGain" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Dopasowywanie głośności ReplayGain" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "_Domyślna ocena:" #: ../quodlibet/qltk/prefs.py:493 msgid "Rating _scale:" msgstr "_Skala ocen:" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Czynnik średniej Bayesa (C) dla zgromadzonych ocen.\n" "0 oznacza zwykłą średnią, wyższe wartości oznaczają, że albumy z kilkoma " "ścieżkami będą miały mniej ekstremalne oceny. Zmiana tej wartości wywołuje " "ponowne obliczenie ocen wszystkich albumów." #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "Ilość uśredniania _Bayesa:" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Zapisywanie ocen i _liczby odtworzeń" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "Adres _e-mail:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Oceny i liczby odtworzeń będą przypisane do tego adresu e-mail" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Automatyczne zapisywanie zmian etykiet" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Zapisywanie zmian etykiet bez potwierdzania podczas modyfikowania wielu " "plików" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Zestaw separatorów do użycia podczas rozdzielania wartości etykiet " "w edytorze etykiet. Lista jest rozdzielana spacjami" #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Etykiety" #: ../quodlibet/qltk/prefs.py:631 msgid "Updating for new ratings" msgstr "Aktualizowanie dla nowych ocen" #: ../quodlibet/qltk/prefs.py:641 msgid "Scan library _on start" msgstr "_Skanowanie kolekcji podczas uruchamiania" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 msgid "_Scan Library" msgstr "_Skanuj kolekcję" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Wyszukuje zmiany w kolekcji" #: ../quodlibet/qltk/prefs.py:658 msgid "Re_build Library" msgstr "_Ponownie zbuduj kolekcję" #: ../quodlibet/qltk/prefs.py:661 msgid "Reload all songs in your library. This can take a long time." msgstr "Ponownie wczytuje wszystkie utwory w kolekcji. Może to chwilę potrwać." #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "Skanowane katalogów" #: ../quodlibet/qltk/prefs.py:677 msgid "Hidden Songs" msgstr "Ukryte utwory" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s i %(count)d więcej" msgstr[1] "%(title)s i %(count)d więcej" msgstr[2] "%(title)s i %(count)d więcej" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Właściwości" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Kolejka" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "Zatrzymanie po ukończeniu" #: ../quodlibet/qltk/queue.py:129 msgid "_Clear Queue" msgstr "Wy_czyść kolejkę" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d utwór (%(time)s)" msgstr[1] "%(count)d utwory (%(time)s)" msgstr[2] "%(count)d utworów (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Przeglądaj kolekcję" #: ../quodlibet/qltk/quodlibetwindow.py:395 msgid "Toggle queue visibility" msgstr "Przełącza widoczność kolejki" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "Błąd odtwarzania" #: ../quodlibet/qltk/quodlibetwindow.py:524 msgid "Set up library directories?" msgstr "Ustawić katalogi kolekcji?" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "Nie ustawiono kolekcji muzyki. Zrobić to teraz?" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "_Nie teraz" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "_Ustaw" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Nie można dodać utworów" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s używa nieobsługiwanego protokołu." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Przejdź do odtwarzanego utworu" #: ../quodlibet/qltk/quodlibetwindow.py:986 msgid "_File" msgstr "_Plik" #: ../quodlibet/qltk/quodlibetwindow.py:987 msgid "_Song" msgstr "_Utwór" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Widok" #: ../quodlibet/qltk/quodlibetwindow.py:989 msgid "_Browse" msgstr "P_rzeglądaj" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Sterowanie" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "Pomo_c" #: ../quodlibet/qltk/quodlibetwindow.py:997 msgid "_Add a Folder…" msgstr "_Dodaj katalog…" #: ../quodlibet/qltk/quodlibetwindow.py:1002 msgid "_Add a File…" msgstr "_Dodaj plik…" #: ../quodlibet/qltk/quodlibetwindow.py:1007 msgid "_Add a Location…" msgstr "_Dodaj położenie…" #: ../quodlibet/qltk/quodlibetwindow.py:1036 msgid "Edit Bookmarks…" msgstr "Modyfikuj zakładki…" #: ../quodlibet/qltk/quodlibetwindow.py:1056 msgid "Stop After This Song" msgstr "Zatrzymaj po tym utworze" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "_Skróty klawiszowe" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Pomoc online" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Przeszukiwanie pomocy" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Dodaj położenie" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Położenie pliku dźwiękowego:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Nie można dodać położenia" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, python-format msgid "%s is not a valid location." msgstr "%s nie jest prawidłowym położeniem." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Dodaj muzykę" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 msgid "_Add Folders" msgstr "_Dodaj katalogi" #: ../quodlibet/qltk/quodlibetwindow.py:1379 msgid "Music Files" msgstr "Pliki muzyczne" #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "_Add Files" msgstr "_Dodaj pliki" #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Na pewno zmienić ocenę wszystkich %d utworów?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "Zapisane oceny zostaną usunięte" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Ocena zaznaczonych utworów zostanie zmieniona na „%s”" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 msgid "_Remove Rating" msgstr "_Usuń oceny" #: ../quodlibet/qltk/ratingsmenu.py:98 msgid "Change _Rating" msgstr "Zmień _oceny" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Zmienianie spacji na p_odkreślenia" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Usuwanie znaków niezgodnych z systemem _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Usuwanie znaków _diakrytycznych" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Usuwanie znaków spoza zestawu _ASCII" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Używanie tylko _małych znaków" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Zmień nazwy plików" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Wzorzec ścieżki" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 msgid "Edit saved patterns…" msgstr "Modyfikuj zapisane wzorce…" #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Podgląd" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nowa nazwa" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Nie można zmienić nazwy pliku" #: ../quodlibet/qltk/renamefiles.py:256 #, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Zmiana nazwy <b>%(old-name)s</b> na <b>%(new-name)s</b> się nie powiodła. " "Prawdopodobnie docelowy plik już istnieje lub brak uprawnień do tworzenia " "nowych plików lub usuwania poprzednich." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "_Ignorowanie wszystkich błędów" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Kontynuuj" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Ścieżka nie jest bezwzględna" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Wzorzec\n" "\t<b>%s</b>\n" "zawiera „/”, ale nie zaczyna się od głównego katalogu. W celu uniknięcia " "błędnie nazwanych katalogów, należy zaczynać wzorzec od katalogu / lub ~/." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Utwory znajdujące się w tych katalogach zostaną dodane do kolekcji podczas " "jej odświeżania" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Wybierz katalogi" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Zapisane wyszukiwania" #: ../quodlibet/qltk/searchbar.py:53 msgid "Edit saved searches…" msgstr "Modyfikuj zapisane wyszukiwania…" #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "Przeszukuje kolekcję za pomocą zwykłego tekstu lub zapytań programu QL" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Wy_szukiwanie podczas pisania" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Wyświetla wyniki wyszukiwania, kiedy użytkownik przestaje pisać." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Ograniczenie:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Waga" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Wyświetlanie pozostałego czasu" #: ../quodlibet/qltk/shortcuts.py:16 msgid "Main Window" msgstr "Główne okno" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "Przewinięcie o 10 sekund do tyłu" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "Przewinięcie o 10 sekund do przodu" #: ../quodlibet/qltk/shortcuts.py:19 msgid "Focus the search entry" msgstr "Przejście do wyszukiwania" #: ../quodlibet/qltk/shortcuts.py:22 msgid "Reset filters and jump to the playing song" msgstr "Przywrócenie filtrów i przejście do odtwarzanego utworu" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "Otwarcie okna informacji o zaznaczonych utworach" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "Otwarcie edytora etykiet dla zaznaczonych utworów" #: ../quodlibet/qltk/shortcuts.py:28 msgid "Queue the selected songs" msgstr "Kolejkowanie zaznaczonych utworów" #: ../quodlibet/qltk/shortcuts.py:29 msgid "Delete the selected songs" msgstr "Usunięcie zaznaczonych utworów" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "Wyświetlenie wewnętrznego pola wyszukiwania" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "Kliknięcie lewym przyciskiem myszy na nagłówku kolumny" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "Dodanie kolumny do listy kolumn, według których porządkować" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "Widok drzewa" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "Zwinięcie elementu lub zaznaczenie elementu nadrzędnego" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "Rozwinięcie elementu" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "Pola tekstowe" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "Ponowienie ostatnio cofniętej zmiany" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "Zaznaczenie wszystkich utworów we wszystkich panelach" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtrowanie według %s" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "Wszystkie _nagłówki" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Nagłówki ś_cieżek" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Nagłówki _albumów" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Nagłówki _osób" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Nagłówki _dat" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Nagłówki p_lików" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Nagłówki p_rodukcji" #: ../quodlibet/qltk/songlist.py:1115 msgid "_Customize Headers…" msgstr "_Dostosuj nagłówki…" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "_Rozwiń kolumnę" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "Uruchomić wtyczkę „%(name)s” na %(count)d utworze?" msgstr[1] "Uruchomić wtyczkę „%(name)s” na %(count)d utworach?" msgstr[2] "Uruchomić wtyczkę „%(name)s” na %(count)d utworach?" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "Uruchomić wtyczkę „%(name)s” na %(count)d albumie?" msgstr[1] "Uruchomić wtyczkę „%(name)s” na %(count)d albumach?" msgstr[2] "Uruchomić wtyczkę „%(name)s” na %(count)d albumach?" #: ../quodlibet/qltk/songsmenu.py:149 msgid "Configure Plugins…" msgstr "Skonfiguruj wtyczki…" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Dodaj do _kolejki" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Skopiuj na urządzenie" #: ../quodlibet/qltk/songsmenu.py:378 msgid "_Remove from Library" msgstr "_Usuń z kolekcji" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Zmienianie p_odkreśleń na spacje" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Wielkie litery Jak W _Tytule" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Rozdzielanie na wiele _wartości" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Etykiety ze ścieżki" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Zastępowanie istniejących etykiet nowymi" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Dodawanie nowych etykiet do istniejących" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "Zapisz" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Wzorzec\n" "\t<b>%s</b>\n" "jest nieprawidłowy. Prawdopodobnie zawiera on dwa razy tę samą etykietę lub " "niezamknięte nawiasy (< i >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Nieprawidłowe etykiety" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Nieprawidłowe etykiety <b>%s</b>\n" "\n" "Obecnie zaznaczone pliki nie obsługują modyfikowania tych etykiet." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Podany wzorzec jest nieprawidłowy. Proszę upewnić się, że znaki < i > " "zostały wpisane jako \\< i \\>, a wszystkie otwarte etykiety zostały " "zamknięte.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Modyfikuj wyświetlanie" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Numery ścieżek" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "_Rozpoczynanie od:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Razem ścieżek:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Odtwórz/wstrzymaj" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Poprzednia" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "i %d więcej…" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Zapisywanie zmienionych utworów." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "Zapisane utwory: %(current)d/%(total)d\n" "(pozostało: %(remaining)s)" #: ../quodlibet/qltk/wlw.py:234 #, python-format msgid "%(current)s of %(all)s" msgstr "%(current)s z %(all)s" #: ../quodlibet/update.py:89 msgid "Checking for Updates" msgstr "Wyszukiwanie aktualizacji" #: ../quodlibet/update.py:124 msgid "Connection failed" msgstr "Połączenie się nie powiodło" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "Używana jest najnowsza wersja %(version)s" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" "Dostępna jest nowa wersja %(new-version)s\n" "\n" "Obecnie używana jest wersja %(old-version)s\n" "\n" "Proszę odwiedzić <a href='%(url)s'>stronę programu</a>" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "Listy odtwarzania muszą mieć nazwy" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Lista odtwarzania o nazwie %s już istnieje." #: ../quodlibet/util/cover/built_in.py:26 msgid "Embedded album covers" msgstr "Osadzone okładki albumów" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "Używa okładek osadzonych w plikach dźwiękowych." #: ../quodlibet/util/cover/built_in.py:49 msgid "Filesystem cover" msgstr "Okładka w systemie plików" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" "Używa najczęściej spotykanych nazw plików obrazów umieszczonych w katalogach " "obok plików utworów." #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Wyświetla skrócone informacje o użyciu" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Wyświetla wersję i prawa autorskie" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Użycie: %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[opcje]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Opcja %r nie została rozpoznana." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Opcja %r wymaga parametru." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r nie jest unikalnym przedrostkiem." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kb/s" #: ../quodlibet/util/__init__.py:419 #, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%s sekunda" msgstr[1] "%s sekundy" msgstr[2] "%s sekund" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Brak informacji o czasie" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekunda" msgstr[1] "%d sekundy" msgstr[2] "%d sekund" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuta" msgstr[1] "%d minuty" msgstr[2] "%d minut" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d godzina" msgstr[1] "%d godziny" msgstr[2] "%d godzin" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dzień" msgstr[1] "%d dni" msgstr[2] "%d dni" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d rok" msgstr[1] "%d lata" msgstr[2] "%d lat" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 msgctxt "check" msgid "titlecase?" msgstr "no_capitalize" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Datę należy podać w formacie „RRRR”, „RRRR-MM-DD” lub „RRRR-MM-DD GG∶MM∶SS”." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Wzmocnienie ReplayGain należy podać w formacie „x.yy dB”." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Szczyty ReplayGain należy podać w formacie „x.yy”." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "Identyfikatory MusicBrainz muszą być w formacie UUID." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Stan wydania MusicBrainz może wynosić tylko „official”, „promotional” lub " "„bootleg”." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Język musi być trzyliterowym kodem ISO 639-2" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Nie można zmodyfikować utworu" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Zapisanie <b>%s</b> się nie powiodło. Plik jest tylko do odczytu, uszkodzony " "lub brak uprawnień do jego modyfikacji." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Nieprawidłowe kodowanie]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "aranżer" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "aranżerowie" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "aranżacja" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "autorzy" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "kompozytor" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "kompozytorzy" #: ../quodlibet/util/tags.py:78 msgid "composition" msgstr "kompozycja" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "dyrygent" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "dyrygenci" #: ../quodlibet/util/tags.py:80 msgid "conducting" msgstr "dyrygowanie" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "prawa autorskie" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "opis" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "gatunek" #: ../quodlibet/util/tags.py:85 msgid "genres" msgstr "gatunki" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "wykonawca" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "grupowanie" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "język" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licencja" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "położenie" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "autor tekstu" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "autorzy tekstu" #: ../quodlibet/util/tags.py:91 msgid "lyrics" msgstr "tekst utworu" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "wydawca" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "tytuł" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "wersja" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "strona WWW" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "wykonawca albumu" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "Uderzenia na minutę" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "podpis płyty" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "płyta" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "ścieżka" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "numer katalogowy" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "data pierwszego wydania" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "oryginalny album" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "oryginalny wykonawca" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "data nagrania" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "kraj wydania" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz recording ID" msgstr "Identyfikator nagrania MusicBrainz" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz release track ID" msgstr "Identyfikator ścieżki wydania MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "Identyfikator wydania MusicBrainz" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz artist ID" msgstr "Identyfikator wykonawcy MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz release artist ID" msgstr "Identyfikator wykonawcy wydania MusicBrainz" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "Identyfikator TRM MusicBrainz" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "PUID MusicIP" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "Stan albumu MusicBrainz" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Typ albumu MusicBrainz" #: ../quodlibet/util/tags.py:129 msgid "MusicBrainz release group ID" msgstr "Identyfikator grupy wydania MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "wzmocnienie ścieżki" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "szczyt ścieżki" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "wzmocnienie albumu" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "szczyt albumu" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "punkt odniesienia głośności" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "płyty" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "ścieżki" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "ostatnio rozpoczęte" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "pełna nazwa" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "punkt montowania" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "osoby" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "rok" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "data pierwszego wydania" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "zakładka" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "format pliku" #: ../quodlibet/util/tags.py:165 msgid "playlists" msgstr "listy odtwarzania" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "liczba kanałów" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "porządkowanie" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "role" �������������������������������������������������������������������������������������������quodlibet-3.9.1/po/en_GB.po�������������������������������������������������������������������������0000644�0001750�0001750�00000526603�13115512745�015712� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# British English translation of Quod Libet. # Copyright (C) 2004 Joe Wreschnig # This file is distributed under the same license as the Quod Libet package. # Joe Wreschnig <piman@sacredchao.net>, 2004 # # msgid "" msgstr "" "Project-Id-Version: Quod Libet 2.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2016-07-19 22:34+0100\n" "Last-Translator: Nick Boultbee <nick.boultbee@gmail.com>\n" "Language-Team: Joe Wreschnig <piman@sacredchao.net>\n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Edit tags in your audio files" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Audio tag editor" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Listen to, browse, or edit your audio collection" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Music Player" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artist" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Date" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 msgid "Sort _by…" msgstr "" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Album List" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Album List" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "All Albums" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albums" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Reload album _cover" msgstr[1] "Reload album _covers" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Songs not in an album" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d track" msgstr[1] "%d tracks" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disc" msgstr[1] "%d discs" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 msgid "An Example Album" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Album List Preferences" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Show album _covers" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 msgid "Options" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Album Display" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Unknown" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "New Feed" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Enter the location of an audio feed:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Audio Feeds" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Audio Feeds" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 msgid "_Download…" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Download Files" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Download File" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Unable to add feed" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 msgid "_Refresh" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 msgid "_Delete" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Library Browser" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d song" msgstr[1] "%d songs" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Invalid pattern" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Custom" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 msgid "_Remove" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 msgid "Cover Grid" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:126 msgid "_Cover Grid" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Quod Libet Preferences" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Show album _covers" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "All Albums" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "organisation" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "File System" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_File System" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Unable to copy songs" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "The files selected cannot be copied to other song lists or the queue." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Add to Library" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Unsupported file type" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Unable to add station" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internet Radio" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "New Station" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Enter the location of an Internet radio station:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 msgid "_Load Stations" msgstr "" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Internet Radio" #: ../quodlibet/browsers/iradio.py:538 msgid "_New Station…" msgstr "" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Favourites" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "No stations found" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "No Internet radio stations were found at %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "All stations listed are already in your library." #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "Add to Favourites" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Remove from Favourites" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d station" msgstr[1] "%(count)d stations" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Device Properties" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Device:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Not mounted" #: ../quodlibet/browsers/media.py:55 msgid "Mount point:" msgstr "" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Name:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Media Devices" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Media Devices" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Eject" #: ../quodlibet/browsers/media.py:360 msgid "_Properties" msgstr "" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Rename" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "" #: ../quodlibet/browsers/media.py:479 #, python-format msgid "%s is not connected." msgstr "" #: ../quodlibet/browsers/media.py:499 #, python-format msgid "Copying %(song)s" msgstr "" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Unable to copy song" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "There is not enough free space for this song." #: ../quodlibet/browsers/media.py:526 #, python-format msgid "%s could not be copied." msgstr "" #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Unable to delete songs" #: ../quodlibet/browsers/media.py:557 #, python-format msgid "Deleting %(song)s" msgstr "" #: ../quodlibet/browsers/media.py:575 #, python-format msgid "%s could not be deleted." msgstr "" #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Unable to delete song" #: ../quodlibet/browsers/media.py:594 #, python-format msgid "Ejecting %s failed." msgstr "" #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Unable to eject device" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Paned Browser" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Paned Browser" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Select _All" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "All" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Paned Browser Preferences" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Playlists" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Playlists" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Remove from Playlist" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Import" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "New Playlist" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Unable to import playlist" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet can only import playlists in the M3U and PLS formats." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Unable to rename playlist" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Import Playlist" #: ../quodlibet/browsers/playlists/menu.py:25 msgid "_New Playlist…" msgstr "" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 msgid "Example Playlist" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:47 msgid "Playlist Browser Preferences" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:52 msgid "Playlist display" msgstr "" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Enter a name for the new playlist:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Limit Results" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Search Library" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Search Library" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Paned Browser" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Search" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 msgid "Connected" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "a music library and player" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Print the playing song and exit" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Begin playing immediately" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Jump to next song" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Jump to previous song" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Start playback" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pause playback" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Toggle play/pause mode" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Turn up volume" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Turn down volume" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Print player status" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Hide main window" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Show main window" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Toggle main window visibility" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Focus the running player" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Remove active browser filters" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Refresh and rescan library" #: ../quodlibet/cli.py:110 msgid "List available browsers" msgstr "" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Print the current playlist" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Print the contents of the queue" #: ../quodlibet/cli.py:113 msgid "Print the active text query" msgstr "" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 msgid "Start Quod Libet if it isn't running" msgstr "" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Exit Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Seek within the playing song" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Set or toggle the playback order" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Turn repeat off, on, or toggle it" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Set the volume" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Search your audio library" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "query" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Play a file" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 msgctxt "command" msgid "filename" msgstr "" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Rate the playing song" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Set the current browser" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Rate the playing song" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Open a new browser" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Show or hide the queue" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Show or hide the main song list" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filter on a random value" #: ../quodlibet/cli.py:134 msgctxt "command" msgid "tag" msgstr "" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filter on a tag value" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=value" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Enqueue a file or query" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "filename" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Unqueue a file or query" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Invalid argument for '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Try %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Unknown Device" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r is not a supported device." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Initialising device backend." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Device backend initialised." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copy _album covers" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Remove unused covers and directories" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Plugin Errors" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "description" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "an audio tag editor" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "directory" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 msgid "Discogs Cover Source" msgstr "" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "MusicBrainz Cover Source" msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 msgid "Convert Encodings" msgstr "" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "Romanise _Japanese text" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title Case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:21 msgid "Title-cases tag values in the tag editor." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:40 msgid "Title-_case Value" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 msgid "Advanced Preferences" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 msgid "_Cover size:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 msgid "Display" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "Centre" #: ../quodlibet/ext/events/animosd/prefs.py:197 msgid "Right" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "Colours" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 msgid "Ed_it Display Pattern…" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 msgid "Preview" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, python-format msgid "%.1f dB" msgstr "" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom" msgstr "" #: ../quodlibet/ext/events/equalizer.py:199 msgid "_Clear" msgstr "" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 msgid "Music is playing" msgstr "" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "Internet Radio Log" msgstr "" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "Change volume" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 msgid "No active song" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:215 msgid "No lyrics found" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:227 msgid "Lyrics:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 msgid "Alternate search" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:347 msgid "Lyrics Window" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 msgid "Connection" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Invalid pattern" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Invalid pattern" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 msgid "No-song Text" msgstr "" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 msgid "MQTT Configuration" msgstr "" #: ../quodlibet/ext/events/mqtt.py:153 msgid "Status Text" msgstr "" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 msgid "Connection error" msgstr "" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 msgid "_Title:" msgstr "" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "User_name:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 msgid "Other…" msgstr "" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Artist pattern:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Title pattern:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 msgid "Random Album Playback" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 msgid "Longer albums" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 msgid "Weights" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 msgid "Random Album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 msgid "Import Failed" msgstr "" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 msgid "Start Import" msgstr "" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 msgid "Synchronized Lyrics" msgstr "Synchronised Lyrics" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "Shows synchronised lyrics from .lrc file with same name as the track." #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 msgid "Playing:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 msgid "No song:" msgstr "" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 msgid "Status Patterns" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Not playing" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 msgid "_Play" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 msgid "P_ause" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 msgid "Pre_vious" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Shuffle" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Repeat" #: ../quodlibet/ext/events/trayicon/menu.py:86 msgid "Stop _After This Song" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 msgid "Open _Browser" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Edit _Tags" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Information" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 msgid "Play_lists" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Behaviour" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Scroll _Wheel" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Tooltip Display" #: ../quodlibet/ext/events/viewlyrics.py:23 msgid "View Lyrics" msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 msgid "_Lyrics" msgstr "" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 msgid "Error" msgstr "" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 msgid "File:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "_Preset:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "Filter preset" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom settings" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "Filter _band:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "Filter _width:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 msgid "Audio Pitch / Speed" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:90 msgid "Controls the pitch of an audio stream." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Import Playlist" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Import" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "No stations found" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "Filename" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 msgid "Default filename pattern:" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 msgid "Remove Playlist Duplicates" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 msgid "Shuffle Playlist" msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "last played" #: ../quodlibet/ext/playorder/queue.py:19 msgid "Queue Only" msgstr "" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 msgid "Reverse" msgstr "" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "No Songs" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 msgid "Include Saved Search" msgstr "" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 msgid "Username:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 msgid "Library path:" msgstr "" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 msgid "File_name:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, python-format msgid "Unable to save \"%s\"." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 msgid "Album Art Downloader" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, python-format msgid "Size: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:690 msgid "_Search" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 msgid "Searching…" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 msgid "Download Album Art" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 msgid "Go to Bookmark" msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 msgid "_Edit Bookmarks…" msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 msgid "No Bookmarks" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 msgid "MusicBrainz Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Filename" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 msgid "Disc" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Track" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 msgid "Title" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Artist" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 msgid "MusicBrainz lookup" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 msgid "_Query:" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 msgid "S_earch" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 msgid "No results found." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:159 msgid "Browse Folders" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Unable to open folders" msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "name" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "pattern" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 msgid "Input value" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 msgid "Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, python-format msgid "Unable to run custom command %s" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 msgid "Duplicates Browser" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:424 msgid "Remove _Diacritics" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:425 msgid "Remove _Punctuation" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 msgid "Edit Playcount" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:78 msgid "_Remove all Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Filter on Any Tag" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 msgid "Filter on Directory" msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Write" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 msgid "Write MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 msgid "Group by directory" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "Album Mode" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 msgid "Update Tags in Files" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 msgid "Import Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 msgid "_Username:" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 msgid "Migrate Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Information" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 msgid "Export as Playlist" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 msgid "Unable to export playlist" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "" #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 msgid "Rescan Songs" msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 msgid "Rescan songs" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 msgid "Existing Tags" msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:31 msgid "Split Tags" msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 msgid "Split Album" msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 msgid "Reset" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Tag" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Unable to delete songs" #: ../quodlibet/ext/songsmenu/website_search.py:35 msgid "Website Search" msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 msgid "Search URL patterns" msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:88 msgid "Edit search URLs" msgstr "" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 msgid "Configure Searches…" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Library" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Checking mount points" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Scanning library" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Scanning %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Value" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 msgid "Edit tags in a text editor" msgstr "" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 msgid "No changes detected" msgstr "" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "" #: ../quodlibet/operon/commands.py:456 msgid "List file information" msgstr "" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, python-format msgid "Failed to load image file: %r" msgstr "" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "File" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 msgid "Display help information" msgstr "" #: ../quodlibet/operon/util.py:40 #, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "" #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Unknown" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "In Order" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_In Order" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Random" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Random" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Repeat" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "One Song" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "GStreamer plugin '%(name)s' could not be initialised" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 msgid "No GStreamer audio sink found" msgstr "" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 msgid "_Run Plugin" msgstr "" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Supported formats: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Audio device: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Beginning" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Time" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Bookmark Name" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Bookmarks" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filters" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 msgid "All _Songs" msgstr "" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Random _Genre" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Random _Artist" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Random Al_bum" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Value:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Saved Values" #: ../quodlibet/qltk/cbes.py:263 msgid "Edit saved values…" msgstr "" #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 msgid "_Replay Gain Mode" msgstr "" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 msgid "(unknown)" msgstr "" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 msgid "Enter new tag" msgstr "" #: ../quodlibet/qltk/delete.py:37 msgid "Files:" msgstr "" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 msgid "_Delete Files" msgstr "" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Move to Trash" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "" #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 msgid "Moving one or more files to the trash failed." msgstr "" #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "" #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 msgid "Unable to delete files" msgstr "" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 msgid "Deleting one or more files failed." msgstr "" #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Downloads" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Size" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "missing from %d song" msgstr[1] "missing from %d songs" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "different across %d song" msgstr[1] "different across %d songs" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Split into _Multiple Values" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Split Disc out of _Album" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Split Arranger out of Ar_tist" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Add a Tag" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Edit Tags" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Show _programmatic tags" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 msgctxt "edittags" msgid "_Revert" msgstr "" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Unable to add tag" #: ../quodlibet/qltk/edittags.py:660 #, python-format msgid "Unable to add <b>%s</b>" msgstr "" #: ../quodlibet/qltk/edittags.py:662 #, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Invalid tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Invalid value" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Tag may not be accurate" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Unable to save song" #: ../quodlibet/qltk/_editutils.py:50 #, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" #: ../quodlibet/qltk/_editutils.py:142 msgid "_More options…" msgstr "" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "_About" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s and %(count)d more..." msgstr[1] "%(title)s and %(count)d more..." #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso Preferences" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Split _on:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Tag Editing" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Folders" #: ../quodlibet/qltk/filesel.py:253 msgid "_New Folder…" msgstr "" #: ../quodlibet/qltk/filesel.py:262 msgid "_Select all Sub-Folders" msgstr "" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "New Folder" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Enter a name for the new folder:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Unable to create folder" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Unable to delete folder" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Songs" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "by %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disc %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Track %s" #: ../quodlibet/qltk/info.py:108 msgid "_Edit Display…" msgstr "" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "No songs are selected." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "No Songs" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Information" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Lyrics" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Produced by %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artist" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artists" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "performers" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Never" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "added" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "last played" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "plays" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "skips" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "rating" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "length" #: ../quodlibet/qltk/information.py:289 msgid "format" msgstr "" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 msgid "encoding" msgstr "" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "file size" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "modified" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d selected" msgstr[1] "%d selected" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Track unavailable" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Track List" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d song with no album" msgstr[1] "%d songs with no album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Selected Discography" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d song with no artist" msgstr[1] "%d songs with no artist" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albums" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Total length:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Total size:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Files" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:40 msgid "_Edit" msgstr "" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "No lyrics found for this song." #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Discard tag changes?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 msgid "_Revert" msgstr "" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "File exists" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 msgid "_Replace File" msgstr "" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 msgid "Toggle shuffle mode" msgstr "" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Toggle play/pause mode" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Plugin Errors" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Disabled" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "Play _Order" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Tag Editing" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "version" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "No plugins found." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Show _Errors" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disc" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Track" #: ../quodlibet/qltk/prefs.py:47 msgid "Grou_ping" msgstr "" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Filename" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Length" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Jump to playing song automatically" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "When the playing song changes, scroll to it in the song list" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Others:" #: ../quodlibet/qltk/prefs.py:88 msgid "_Edit…" msgstr "" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Visible Columns" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Title includes _version" #: ../quodlibet/qltk/prefs.py:106 msgid "Artist includes all _people" msgstr "" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Album includes _disc subtitle" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Filename includes _folder" #: ../quodlibet/qltk/prefs.py:123 msgid "Column Preferences" msgstr "" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Song List" #: ../quodlibet/qltk/prefs.py:222 msgid "Edit Columns" msgstr "Visible Columns" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Global filter:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 msgctxt "heading" msgid "Search" msgstr "" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Browsers" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Ratings" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "_Enable Replay Gain volume adjustment" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 msgid "Rating _scale:" msgstr "" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Save ratings and play _counts" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Ratings and play counts will be set for this email address" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "" #: ../quodlibet/qltk/prefs.py:631 msgid "Updating for new ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:641 msgid "Scan library _on start" msgstr "" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 msgid "_Scan Library" msgstr "" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Check for changes in your library" #: ../quodlibet/qltk/prefs.py:658 msgid "Re_build Library" msgstr "" #: ../quodlibet/qltk/prefs.py:661 msgid "Reload all songs in your library. This can take a long time." msgstr "" #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "" #: ../quodlibet/qltk/prefs.py:677 msgid "Hidden Songs" msgstr "" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Properties" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Queue" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Queue" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d song (%(time)s)" msgstr[1] "%(count)d songs (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Browse Library" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Toggle main window visibility" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:524 msgid "Set up library directories?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Unable to add songs" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, python-format msgid "%s uses an unsupported protocol." msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Jump to Playing Song" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "File" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Songs" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_View" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Browsers" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Help" #: ../quodlibet/qltk/quodlibetwindow.py:997 msgid "_Add a Folder…" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1002 msgid "_Add a File…" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1007 msgid "_Add a Location…" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1036 msgid "Edit Bookmarks…" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1056 msgid "Stop After This Song" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Add a Location" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Enter the location of an audio file:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Unable to add location" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, python-format msgid "%s is not a valid location." msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Add Music" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "Folders" #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Music Player" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Files" #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 msgid "_Remove Rating" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:98 msgid "Change _Rating" msgstr "" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Replace spaces with _underscores" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Strip _Windows-incompatible characters" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Strip _diacritical marks" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Strip non-_ASCII characters" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Rename Files" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 msgid "Edit saved patterns…" msgstr "" #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Preview" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "New Name" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Unable to rename file" #: ../quodlibet/qltk/renamefiles.py:256 #, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Continue" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Path is not absolute" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Select Directories" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "" #: ../quodlibet/qltk/searchbar.py:53 msgid "Edit saved searches…" msgstr "" #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Search after _typing" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limit:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Weight" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Display remaining time" #: ../quodlibet/qltk/shortcuts.py:16 msgid "Main Window" msgstr "" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 msgid "Focus the search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:22 msgid "Reset filters and jump to the playing song" msgstr "" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 msgid "Queue the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Unable to delete songs" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filter on %s" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Track Headers" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_People Headers" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Date Headers" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_File Headers" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Production Headers" #: ../quodlibet/qltk/songlist.py:1115 msgid "_Customize Headers…" msgstr "" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 msgid "Configure Plugins…" msgstr "" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Add to _Queue" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Copy to Device" #: ../quodlibet/qltk/songsmenu.py:378 msgid "_Remove from Library" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Replace _underscores with spaces" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Title-case tags" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Split into multiple _values" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tags From Path" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Tags replace existing ones" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Tags are added to existing ones" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Invalid tags" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Edit Display" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Track Numbers" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Start fro_m:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Total tracks:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Saving the songs you changed." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, python-format msgid "%(current)s of %(all)s" msgstr "" #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Checking mount points" #: ../quodlibet/update.py:124 msgid "Connection failed" msgstr "" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "A playlist named %s already exists." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Reload album _cover" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 msgid "Filesystem cover" msgstr "" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Display brief usage information" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Display version and copyright" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[options]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Option %r not recognised." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Option '%r' requires an argument." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "'%r' is not a unique prefix." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d second" msgstr[1] "%d seconds" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "No time information" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d second" msgstr[1] "%d seconds" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minute" msgstr[1] "%d minutes" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hour" msgstr[1] "%d hours" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d day" msgstr[1] "%d days" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d year" msgstr[1] "%d years" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 msgctxt "check" msgid "titlecase?" msgstr "" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Replay Gain gains must be entered in 'x.yy dB' format." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Replay Gain peaks must be entered in 'x.yy' format." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz IDs must be in UUID format." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Unable to edit song" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Invalid Encoding]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arranger" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arrangers" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "author" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "authors" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "composer" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "composers" #: ../quodlibet/util/tags.py:78 msgid "composition" msgstr "" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "conductor" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "conductors" #: ../quodlibet/util/tags.py:80 msgid "conducting" msgstr "" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "contact" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "date" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "description" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:85 msgid "genres" msgstr "" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "performer" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "grouping" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "language" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licence" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "location" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "lyricist" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "lyricists" #: ../quodlibet/util/tags.py:91 msgid "lyrics" msgstr "" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organisation" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "title" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "version" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "website" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "album artist" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disc" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "track" # label ID #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "label ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "original release date" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "original album" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "original artist" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "recording date" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "release country" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz recording ID" msgstr "" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz release track ID" msgstr "" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz artist ID" msgstr "" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz release artist ID" msgstr "" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz album status" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz album type" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz album ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "track gain" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "track peak" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "album gain" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "album peak" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "discs" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "tracks" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "last started" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "full name" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "mount point" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "people" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "year" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "" #: ../quodlibet/util/tags.py:165 msgid "playlists" msgstr "" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Browsers" #~ msgid "Unable to download lyrics." #~ msgstr "Unable to download lyrics." #~ msgid "Remove all songs from the queue" #~ msgstr "Remove all songs from the queue" #~ msgid "Watch this folder for new songs" #~ msgstr "Watch this folder for new songs" #~ msgid "Uninitialized iPod" #~ msgstr "Uninitialised iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Do you want to create an empty database on this iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Volume Gain (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Combine tags with _multiple values" #~ msgid "Model:" #~ msgstr "Model:" #~ msgid "Capacity:" #~ msgstr "Capacity:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #~ msgid "Unable to save iPod database" #~ msgstr "Unable to save iPod database" #~ msgid "Shuffle" #~ msgstr "Shuffle" #~ msgid "Weighted" #~ msgstr "Weighted" #~ msgid "_Weighted" #~ msgstr "_Weighted" #~ msgid "_One Song" #~ msgstr "_One Song" #~ msgid "Restart the playlist when finished" #~ msgstr "Restart the playlist when finished" #~ msgid "Disable Browser" #~ msgstr "Disable Browser" #~ msgid "_Disable Browser" #~ msgstr "_Disable Browser" #~ msgid "Filter on _Genre" #~ msgstr "Filter on _Genre" #~ msgid "Filter on _Artist" #~ msgstr "Filter on _Artist" #~ msgid "Filter on Al_bum" #~ msgstr "Filter on Al_bum" #~ msgid "_Music" #~ msgstr "_Music" #~ msgid "Song _List" #~ msgstr "Song _List" #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Stop after this song" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "and %d more..." #~ msgstr[1] "and %d more..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Split Disc out of _Album" #, fuzzy #~ msgid "Timeout" #~ msgstr "Time" #, fuzzy #~ msgid "Select an album" #~ msgstr "Select _All" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Playlists" #~ msgid "Re_fresh Library" #~ msgstr "Re_fresh Library" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Remove Station" #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "command|filename" #~ msgstr "filename" #~ msgid "command|tag" #~ msgstr "tag" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Search" #~ msgid "%d of %d" #~ msgstr "%d of %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Usage: %s %s" #~ msgid "_Download..." #~ msgstr "_Download..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_New Station" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Overwrite <b>%s</b>?" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "GStreamer output pipeline could not be initialised. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet is already running." #~ msgid "No song is currently playing." #~ msgstr "No song is currently playing." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Unable to write to %s. Removing it." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Edit Bookmarks..." #~ msgid "_New Folder..." #~ msgstr "_New Folder..." #~ msgid "_Add to Playlist" #~ msgstr "_Add to Playlist" #~ msgid "_Edit Display..." #~ msgstr "_Edit Display..." #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d station" #~ msgid "_Order:" #~ msgstr "_Order:" #~ msgid "_Add a Location..." #~ msgstr "_Add a Location..." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Customise Headers..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "_Track Headers" #, fuzzy #~ msgid "People Headers" #~ msgstr "_People Headers" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Album Headers" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Date Headers" #, fuzzy #~ msgid "File Headers" #~ msgstr "_File Headers" #, fuzzy #~ msgid "Production Headers" #~ msgstr "_Production Headers" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Tag:" #~ msgid "errors" #~ msgstr "errors" #~ msgid "Permanently delete this file?" #~ msgstr "Permanently delete this file?" #~ msgid "Permanently delete these files?" #~ msgstr "Permanently delete these files?" #, fuzzy #~ msgid "Version:" #~ msgstr "_Version" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "No eject command found." #~ msgid "Unable to start web browser" #~ msgstr "Unable to start web browser" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #, fuzzy #~ msgid "Library Error" #~ msgstr "Library Browser" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Copy to Device" #~ msgid "translator-credits" #~ msgstr "translator-credits" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Other columns to display, separated by spaces" #~ msgid "Search your library" #~ msgstr "Search your library" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "Quod Libet %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE." #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet Plugins" #~ msgid "Not Played To_day" #~ msgstr "Not Played To_day" #~ msgid "Not Played in a _Week" #~ msgstr "Not Played in a _Week" #~ msgid "Not Played in a _Month" #~ msgstr "Not Played in a _Month" #~ msgid "B_ottom 40" #~ msgstr "B_ottom 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgid "gtk-media-next" #~ msgstr "gtk-media-next" #~ msgid "gtk-media-previous" #~ msgstr "gtk-media-previous" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgid "_Select" #~ msgstr "_Select" #~ msgid "Separators for splitting tags" #~ msgstr "Separators for splitting tags" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #~ msgid "Choose New Stations" #~ msgstr "Choose New Stations" #~ msgid "Add" #~ msgstr "Add" #~ msgid "_Stations..." #~ msgstr "_Stations..." #~ msgid "Unable to save library" #~ msgstr "Unable to save library" #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Unable to dump logs at all." #~ msgid "Sort by title" #~ msgstr "Sort by title" #~ msgid "Sort by artist" #~ msgstr "Sort by artist" #~ msgid "Lyrics provided by %s." #~ msgstr "Lyrics provided by %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgid "part" #~ msgstr "part" #~ msgid "Opening audio device." #~ msgstr "Opening audio device." #~ msgid "Moving %d/%d." #~ msgstr "Moving %d/%d." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d songs saved" #~ msgid "Loaded song library." #~ msgstr "Loaded song library." #~ msgid "Unable to open audio device" #~ msgstr "Unable to open audio device" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgid "C_opy album covers" #~ msgstr "C_opy album covers" #~ msgid "Unable to retag multiple values" #~ msgstr "Unable to retag multiple values" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "Changing the name of a tag with multiple values is not supported." #~ msgid "W: %s is not a QL song database." #~ msgstr "W: %s is not a QL song database." #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "Per-song (\"Radio\") volume adjustment" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "Per-album (\"Audiophile\") volume adjustment" #~ msgid "_Volume Normalization" #~ msgstr "_Volume Normalisation" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "M3U playlists cannot be loaded." #~ msgid "This station is already in your library." #~ msgstr "This station is already in your library." #~ msgid "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgstr "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgid "The library cannot be refreshed while Quod Libet is running." #~ msgstr "The library cannot be refreshed while Quod Libet is running." #~ msgid "Loading, scanning, and saving your library." #~ msgstr "Loading, scanning, and saving your library." #~ msgid "Rescan your library and exit" #~ msgstr "Rescan your library and exit" #~ msgid "Old Plugins" #~ msgstr "Old Plugins" #~ msgid "" #~ "It looks like you are running Quod Libet right now. If you edit songs " #~ "also in Quod Libet's library while it is running, you may need to refresh " #~ "or re-add them.\n" #~ "\n" #~ "If you are not running Quod Libet, or are editing songs outside of its " #~ "library, you may ignore this warning." #~ msgstr "" #~ "It looks like you are running Quod Libet right now. If you edit songs " #~ "also in Quod Libet's library while it is running, you may need to refresh " #~ "or re-add them.\n" #~ "\n" #~ "If you are not running Quod Libet, or are editing songs outside of its " #~ "library, you may ignore this warning." #~ msgid "GStreamer status %r != %r" #~ msgstr "GStreamer status %r != %r" #~ msgid "_Pane %d:" #~ msgstr "_Pane %d:" #~ msgid "Double-click a tag value to change it, right-click for other options" #~ msgstr "" #~ "Double-click a tag value to change it, right-click for other options" #~ msgid "Add a new tag" #~ msgstr "Add a new tag" #~ msgid "Tag by Filename" #~ msgstr "Tag by Filename" #~ msgid "The first letter of each word will be capitalized" #~ msgstr "The first letter of each word will be capitalised" #~ msgid "" #~ "Characters not allowed in Windows filenames (\\:?;\"<>|) will be replaced " #~ "by underscores" #~ msgstr "" #~ "Characters not allowed in Windows filenames (\\:?;\"<>|) will be replaced " #~ "by underscores" #~ msgid "" #~ "Characters outside of the ASCII set (A-Z, a-z, 0-9, and punctuation) will " #~ "be replaced by underscores" #~ msgstr "" #~ "Characters outside of the ASCII set (A-Z, a-z, 0-9, and punctuation) will " #~ "be replaced by underscores" #~ msgid "Apply to these _files..." #~ msgstr "Apply to these _files..." #~ msgid "Path" #~ msgstr "Path" #~ msgid "Tray Preferences - Quod Libet" #~ msgstr "Tray Preferences - Quod Libet" #~ msgid "%(different)s, %(missing)s" #~ msgstr "%(different)s, %(missing)s" #~ msgid "E: You need GTK+ 2.6 and PyGTK 2.6 or greater." #~ msgstr "E: You need GTK+ 2.6 and PyGTK 2.6 or greater." #~ msgid "E: You have GTK+ %s and PyGTK %s." #~ msgstr "E: You have GTK+ %s and PyGTK %s." #~ msgid "E: Please upgrade GTK+/PyGTK." #~ msgstr "E: Please upgrade GTK+/PyGTK." #~ msgid "Search Bar" #~ msgstr "Search Bar" #~ msgid "Play songs in random order" #~ msgstr "Play songs in random order" #~ msgid "S_ong" #~ msgstr "S_ong" #~ msgid "_Choose randomly" #~ msgstr "_Choose randomly" #~ msgid "Drag songs here to add them to the play queue" #~ msgstr "Drag songs here to add them to the play queue" #~ msgid "" #~ "Deleting <b>%s</b> failed. Possibly the target file does not exist, or " #~ "you do not have permission to delete it." #~ msgstr "" #~ "Deleting <b>%s</b> failed. Possibly the target file does not exist, or " #~ "you do not have permission to delete it." #~ msgid "" #~ "Quod Libet was unable to open your audio device. Often this means another " #~ "program is using it, or your audio drivers are not configured.\n" #~ "\n" #~ "Quod Libet will now exit." #~ msgstr "" #~ "Quod Libet was unable to open your audio device. Often this means another " #~ "program is using it, or your audio drivers are not configured.\n" #~ "\n" #~ "Quod Libet will now exit." #~ msgid "_New/Edit Playlist..." #~ msgstr "_New/Edit Playlist..." #~ msgid "" #~ "Enter a name for the new playlist. If it already exists it will be opened " #~ "for editing." #~ msgstr "" #~ "Enter a name for the new playlist. If it already exists it will be opened " #~ "for editing." #~ msgid "Turn shuffle off, on, or toggle it" #~ msgstr "Turn shuffle off, on, or toggle it" #~ msgid "Closing _minimizes to system tray" #~ msgstr "Closing _minimises to system tray" #~ msgid "Performed by %s" #~ msgstr "Performed by %s" #~ msgid "arranged by %s" #~ msgstr "arranged by %s" #~ msgid "conducted by %s" #~ msgstr "conducted by %s" #~ msgid "composed by %s" #~ msgstr "composed by %s" #~ msgid "written by %s" #~ msgstr "written by %s" #~ msgid "Add songs to your library" #~ msgstr "Add songs to your library" #~ msgid "Visit the artist's website" #~ msgstr "Visit the artist's website" #~ msgid "Supported formats:" #~ msgstr "Supported formats:" #~ msgid "" #~ "Invalid tag <b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing this tag.Invalid tags " #~ "<b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing these tags." #~ msgstr "" #~ "Invalid tag <b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing this tag.Invalid tags " #~ "<b>%s</b>\n" #~ "\n" #~ "The files currently selected do not support editing these tags." #~ msgid "(shared across all %d songs)" #~ msgstr "(shared across all %d songs)" #~ msgid "(different across %d songs, missing from %d songs)" #~ msgstr "(different across %d songs, missing from %d songs)" #~ msgid "1 minute" #~ msgstr "1 minute" #~ msgid "1 hour" #~ msgstr "1 hour" #~ msgid "1 day" #~ msgstr "1 day" #~ msgid "An audio player and tag editor" #~ msgstr "An audio player and tag editor" #~ msgid "" #~ "If you have songs in directories that will not always be mounted (for " #~ "example, a removable device or an NFS shared drive), list those mount " #~ "points here. Files in these directories will not be removed from the " #~ "library if the device is not mounted." #~ msgstr "" #~ "If you have songs in directories that will not always be mounted (for " #~ "example, a removable device or an NFS shared drive), list those mount " #~ "points here. Files in these directories will not be removed from the " #~ "library if the device is not mounted." #~ msgid "" #~ "These characters will be used as separators when \"Split values\" is " #~ "selected in the tag editor" #~ msgstr "" #~ "These characters will be used as separators when \"Split values\" is " #~ "selected in the tag editor" #~ msgid "Initialized multimedia key support." #~ msgstr "Initialised multimedia key support." #~ msgid "1 track" #~ msgstr "1 track" #~ msgid "Adjust audio volume" #~ msgstr "Adjust audio volume" #~ msgid "Check for changes in the library made since the program was started" #~ msgstr "Check for changes in the library made since the program was started" #~ msgid "1 time" #~ msgstr "1 time" #~ msgid "Add a new tag to the file" #~ msgstr "Add a new tag to the file" #~ msgid "Invalid date format" #~ msgstr "Invalid date format" #~ msgid "" #~ "Invalid date: <b>%s</b>.\n" #~ "\n" #~ "The date must be entered in YYYY or YYYY-MM-DD format." #~ msgstr "" #~ "Invalid date: <b>%s</b>.\n" #~ "\n" #~ "The date must be entered in YYYY or YYYY-MM-DD format." #~ msgid "No on-screen display" #~ msgstr "No on-screen display" #~ msgid "Display OSD on the top" #~ msgstr "Display OSD on the top" #~ msgid "Display OSD on the bottom" #~ msgstr "Display OSD on the bottom" #~ msgid "Select a color for the OSD" #~ msgstr "Select a colour for the OSD" #~ msgid "Select a second color for the OSD" #~ msgstr "Select a second colour for the OSD" #~ msgid "Song _list" #~ msgstr "Song _list" #, fuzzy #~ msgid "[directory]" #~ msgstr "directory" #~ msgid "" #~ "Quod Libet - a music library and player\n" #~ "Options:\n" #~ " --help, -h Display this help message\n" #~ " --version Display version and copyright information\n" #~ " --refresh-library Rescan your song cache and then exit.\n" #~ " --print-playing Print the currently playing song.\n" #~ "\n" #~ " Player controls:\n" #~ " --next, --previous, --play-pause, --play, --pause\n" #~ " Change songs or pause/resume playing.\n" #~ " --volume +|-|0..100\n" #~ " Increase, decrease, or set the volume.\n" #~ " --shuffle 0|1|t, --repeat 0|1|t\n" #~ " Enable, disable, or toggle shuffle and repeat. \n" #~ " --query search-string\n" #~ " Make a new playlist from the given search.\n" #~ " --seek [+|-][HH:MM:]SS\n" #~ " Seek to a position in the current song.\n" #~ " --play-file filename\n" #~ " Play this file, adding it to the library if necessary.\n" #~ "\n" #~ "For more information, see the manual page (`man 1 quodlibet').\n" #~ msgstr "" #~ "Quod Libet - a music library and player\n" #~ "Options:\n" #~ " --help, -h Display this help message\n" #~ " --version Display version and copyright information\n" #~ " --refresh-library Rescan your song cache and then exit.\n" #~ " --print-playing Print the currently playing song.\n" #~ "\n" #~ " Player controls:\n" #~ " --next, --previous, --play-pause, --play, --pause\n" #~ " Change songs or pause/resume playing.\n" #~ " --volume +|-|0..100\n" #~ " Increase, decrease, or set the volume.\n" #~ " --shuffle 0|1|t, --repeat 0|1|t\n" #~ " Enable, disable, or toggle shuffle and repeat. \n" #~ " --query search-string\n" #~ " Make a new playlist from the given search.\n" #~ " --seek [+|-][HH:MM:]SS\n" #~ " Seek to a position in the current song.\n" #~ " --play-file filename\n" #~ " Play this file, adding it to the library if necessary.\n" #~ "\n" #~ "For more information, see the manual page (`man 1 quodlibet').\n" #~ msgid "E: Unknown command line option: %s" #~ msgstr "E: Unknown command line option: %s" #~ msgid "%d:%02d:%02d" #~ msgstr "%d:%02d:%02d" #~ msgid "%d:%02d" #~ msgstr "%d:%02d" #~ msgid "" #~ "Ex Falso - an audio file tagger\n" #~ "Usage: %s [directory]\n" #~ "\n" #~ "For more information, see the manual page (`man 1 exfalso').\n" #~ msgstr "" #~ "Ex Falso - an audio file tagger\n" #~ "Usage: %s [directory]\n" #~ "\n" #~ "For more information, see the manual page (`man 1 exfalso').\n" #~ msgid "Quod Libet is free software licensed under the GNU GPL v2." #~ msgstr "Quod Libet is free software licensed under the GNU GPL v2." #~ msgid "Songs heard:" #~ msgstr "Songs heard:" #~ msgid "Listening" #~ msgstr "Listening" #~ msgid "%s and %d more - Properties" #~ msgstr "%s and %d more - Properties" #~ msgid "" #~ "No on-screen display\n" #~ "Display OSD on the top\n" #~ "Display OSD on the bottom" #~ msgstr "" #~ "No on-screen display\n" #~ "Display OSD on the top\n" #~ "Display OSD on the bottom" #~ msgid "" #~ "No volume adjustment\n" #~ "Per-song (\"Radio\") volume adjustment\n" #~ "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "" #~ "No volume adjustment\n" #~ "Per-song (\"Radio\") volume adjustment\n" #~ "Per-album (\"Audiophile\") volume adjustment" #~ msgid "Perfor_mer" #~ msgstr "Perfor_mer" #~ msgid "Pick a random album from your library" #~ msgstr "Pick a random album from your library" #~ msgid "Pick a random artist from your library" #~ msgstr "Pick a random artist from your library" #~ msgid "Pick a random genre from your library" #~ msgstr "Pick a random genre from your library" #~ msgid "Play next song" #~ msgstr "Play next song" #~ msgid "Pre_vious song" #~ msgstr "Pre_vious song" #~ msgid "Select a font for the OSD" #~ msgstr "Select a font for the OSD" #~ msgid "Pause _song" #~ msgstr "Pause _song" #~ msgid "xx minutes, " #~ msgstr "xx minutes, " �����������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/el.po����������������������������������������������������������������������������0000644�0001750�0001750�00000725172�13115512745�015342� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Language po/el translations for PACKAGE package. # Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Dimitris Papageorgiou <dipap@gmx.com>, 2012. # msgid "" msgstr "" "Project-Id-Version: el\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2015-09-14 22:31+0300\n" "Last-Translator: Dimitris Papageorgiou <dipap@gmx.com>\n" "Language-Team: Greek\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Επεξεργάσου τις ετικέτες στα αρχεία μουσικής σου" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" "Το Ex Falso είναι επεξεργαστής ετικετών μουσικής με διεπαφή ίδια με τον Quod " "Libet. Επιτρέπει την προβολή και επεξεργασία όλων των ετικετών του αρχείου, " "για κάθε τύπο αρχείου που υποστηρίζει." #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" "Οι υποστηριζόμενοι τύποι αρχείων περιλαμβάνουν τα Ogg Vorbis/Opus/Speex/" "FLAC, MP3, FLAC, MOD/XM/IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, " "WMA, SPC, MIDI." #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Επεξεργαστής ετικετών μουσικής" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Ακούστε, περιηγηθείτε ή επεξεργαστείτε την μουσική σας συλλογή" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" "O Quod Libet είναι ένα πρόγραμμα διαχείρισης της μουσικής σας. Παρέχει " "πολλούς διαφορετικούς τρόπους προβολής της μουσικοθήκης σας, καθώς και " "υποστήριξη για διαδικτυακό ραδιόφωνο και ροών ήχου. Έχει απίστευτα ευέλικτες " "δυνατότητες επεξεργασίας και αναζήτησης μεταδεδομένων ετικετών μουσικής." #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Αναπαραγωγή Μουσικής" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "_Τίτλος" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Καλλιτέχνης" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Ημερομηνία" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "_Είδος μουσικής" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Βαθμολογία" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 msgid "Sort _by…" msgstr "Τα_ξινόμηση κατά…" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Προτιμήσεις" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Λίστα Άλμπουμ" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Λίστα Ά_λμπουμ" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Όλα τα Άλμπουμ" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d άλμπουμ" msgstr[1] "%d άλμπουμς" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Επαναφόρτωση ε_ξώφυλλου του άλμπουμ" msgstr[1] "Επαναφόρτωση ε_ξώφυλλων των άλμπουμ" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Τραγούδια που δεν ανήκουν σε κάποιο άλμπουμ" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d τραγούδι" msgstr[1] "%d τραγούδια" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d δίσκος" msgstr[1] "%d δίσκοι" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 msgid "An Example Album" msgstr "Ένα Άλμπουμ για παράδειγμα" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Προτιμήσεις Λίστας Άλμπουμ" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Δείξε _εξώφυλλα των άλμπουμ" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Η _αναζήτηση συμπεριλαμβάνει ονόματα συντελεστών" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 msgid "Options" msgstr "Επιλογές" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Προβολή Άλμπουμ" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "_Κλείσιμο" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Άγνωστο" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Νέα Ροή" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Εισήγαγε την τοποθεσία μιας ροής ήχου" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "_Προσθήκη" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Ροές Ήχου" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Ροές Ήχου" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 msgid "_Download…" msgstr "_Λήψη" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Κατέβασμα Αρχείων" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "_Αποθήκευση" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Κατέβασμα Αρχείου" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "_Νέο" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Αδυναμία προσθήκης ροής" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "Η ροή <b>%s</b> δεν ήταν δυνατό να προστεθεί. Ίσως ο διακομιστής να είναι " "εκτός λειτουργίας, ή η τοποθεσία δεν είναι ροή ήχου." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 msgid "_Refresh" msgstr "Α_νανέωση" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 msgid "_Delete" msgstr "_Διαγραφή Αρχείων" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Το τρέχων ηχητικό σύστημα δεν υποστηρίζει απομακρυσμένες διευθύνσεις ο " "περιηγητής Ροών Ήχου απενεργοποιήθηκε" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Περιηγητής Μουσικοθήκης" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d τραγούδι" msgstr[1] "%d τραγούδια" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Μη έγκυρη αναζήτηση" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Συλλογή Άλμπουμ" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "Σ_υλλογή Άλμπουμ" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "Άγνωστο %s" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "Πολλαπλές Τιμές %s" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Προσαρμοσμένο" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 msgid "_Remove" msgstr "_Αφαίρεση" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Ετικέτα" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Συγχώνευση" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Προτιμήσεις Συλλογής Άλμπουμ" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "_Εφαρμογή" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "_Ακύρωση" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Μέγεθος _Εξώφυλλου:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Μέγεθος _Εξώφυλλου:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Προχωρημένες Προτιμήσεις" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Δείξε _εξώφυλλα των άλμπουμ" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Όλα τα Άλμπουμ" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "_Εμφάνιση ειδοποίησης" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Σύστημα Αρχείων" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Σύστημα Αρχείων" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Αδυναμία αντιγραφής τραγουδιών" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Τα επιλεγμένα τραγούδια δεν μπορούν να αντιγραφούν σε άλλες λίστες ή στην " "ουρά αναπαραγωγής." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Προσθήκη στην Μουσικοθήκη" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Μη υποστηριζόμενος τύπος αρχείου" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Οι λίστες σταθμών μπορούν να περιέχουν μόνο τοποθεσίες σταθμών, όχι άλλες " "λίστες σταθμών ή λίστες αναπαραγωγής. Οι ακόλουθες τοποθεσίας δεν μπορούν να " "εισαχθούν:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Δεν μπορεί να προστεθεί ο σταθμός" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Διαδικτυακό Ραδιόφωνο" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Κατέβασμα λίστας σταθμών" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Νέος Σταθμός" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Εισήγαγε την τοποθεσία ενός διαδικτυακού ραδιοφωνικού σταθμού" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Ηλεκτρονική" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Ιαπωνική" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "Ινδική" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Θρησκευτική" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Τουρκική" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "Κολεγιακό Ραδιόφωνο" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Ομιλία / Νέα" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Κλασική" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Ποπ" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Εναλακτική" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Νέα" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Σλαβική" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Ελληνική" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Ροκ" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "Θα θέλατε να φορτωθεί μια λίστα δημοφιλών σταθμών;" #: ../quodlibet/browsers/iradio.py:455 msgid "_Load Stations" msgstr "_Φόρτωση Σταθμών" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "Διαδικτυακό Ραδιό_φωνο" #: ../quodlibet/browsers/iradio.py:538 msgid "_New Station…" msgstr "_Νέος Σταθμός…" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "_Ανανέωση Σταθμών" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Όλοι οι Σταθμοί" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Αγαπημένα" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Χωρίς Κατηγορία" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Δεν βρέθηκαν σταθμοί" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Δεν βρέθηκε σταθμός ραδιοφώνου στο %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Όλοι οι σταθμοί που επεστράφησαν ανήκουν ήδη στην μουσικοθήκη" #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "Προσθήκη στα Αγαπημένα" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Αφαίρεση από τα Αγαπημένα" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d σταθμός" msgstr[1] "%(count)d σταθμοί" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Ιδιότητες Συσκευής" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Συσκευή:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Μη προσαρτημένο" #: ../quodlibet/browsers/media.py:55 msgid "Mount point:" msgstr "Σημείο Προσάρτησης:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "Ό_νομα:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Συσκευές Μέσων" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Συσκευές Μέσων" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Εξαγωγή" #: ../quodlibet/browsers/media.py:360 msgid "_Properties" msgstr "_Ιδιότητες" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Μετονομασία" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%(used-size)s σε χρήση, %(free-size)s διαθέσιμο" #: ../quodlibet/browsers/media.py:479 #, python-format msgid "%s is not connected." msgstr "%s δεν είναι συνδεδεμένο." #: ../quodlibet/browsers/media.py:499 #, python-format msgid "Copying %(song)s" msgstr "Αντιγραφή %(song)s" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Αδυναμία αντιγραφής τραγουδιού" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Δεν υπάρχει αρκετός ελεύθερος χώρος γι' αυτό το τραγούδι" #: ../quodlibet/browsers/media.py:526 #, python-format msgid "%s could not be copied." msgstr "Το %s δεν μπόρεσε να αντιγραφεί." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Αδυναμία διαγραφής τραγουδιών" #: ../quodlibet/browsers/media.py:557 #, python-format msgid "Deleting %(song)s" msgstr "Διαγραφή %(song)s" #: ../quodlibet/browsers/media.py:575 #, python-format msgid "%s could not be deleted." msgstr "Δεν ήταν δυνατό να διαγραφεί το %s." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Αδυναμία διαγραφής τραγουδιού" #: ../quodlibet/browsers/media.py:594 #, python-format msgid "Ejecting %s failed." msgstr "Η εξαγωγή του %s απέτυχε." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Αδυναμία εξαγωγής συσκευής" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" "Χωρίς υποστήριξη συσκευών, ο περιηγητής Συσκευών Μέσων απενεργοποιήθηκε." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Περιηγητής με Στήλες" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "Περιηγητής με _Στήλες" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Επιλογή Όλ_ων" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Όλα" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "Λειτουργία _Πλατιάς προβολής" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Προτιμήσεις Περιηγητή με Στήλες" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Λίστες Αναπαραγωγής" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Λίστες Αναπαραγωγής" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Αφαίρεση από την Λίστα" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Εισαγωγή" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Νέα Λίστα Αναπαραγωγής" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Αδυναμία εισαγωγής λίστας αναπαραγωγής" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Ο Quod Libet μπορεί να εισάγει λίστες τύπου M3U και PLS μόνο." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Αδυναμία μετονομασίας λίστας αναπαραγωγής" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Εισαγωγή Λίστας Αναπαραγωγής" #: ../quodlibet/browsers/playlists/menu.py:25 msgid "_New Playlist…" msgstr "_Νέα Λίστα Αναπαραγωγής…" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Τι θέλετε να κάνετε με αυτό το %d τραγούδι;" msgstr[1] "Τι θέλετε να κάνετε με αυτά τα %d τραγούδια;" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Επιβεβαίωση ενέργειας στην λίστα \"%s\"" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Νέα Λίστα Αναπαραγωγής" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Προτιμήσεις Περιηγητή με Στήλες" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Λίστες Αναπαραγωγής" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Θέλετε σίγουρα να διαγραφεί η λίστα αναπαραγωγής '%s';" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Οι πληροφορίες που αφορούν την επιλεγμένη λίστα αναπαραγωγής θα διαγραφούν " "χωρίς δυνατότητα ανάκτησης" #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Εισάγετε όνομα για την νέα λίστα" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Εισαγωγή λίστας αναπαραγωγής.\n" "\n" "%(current)d/%(total)d τραγούδια προστέθηκαν." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Περιορισμός Αποτελεσμάτων" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Αναζήτηση στην Μουσικοθήκη" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Αναζήτηση στην Μουσικοθήκη" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Περιηγητής με Στήλες" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Αναζήτηση" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "Σύνδεση" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Ο Quod Libet δεν εκτελείται (προσθέστε '--run' για να τον ξεκινήσετε)" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "Μουσικοθήκη και αναπαραγωγέας" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[επιλογή]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Εμφάνιση του αναπαραγόμενου τραγουδιού και έξοδος" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Έναρξη αναπαραγωγής άμεσα" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Μεταπήδηση στο επόμενο τραγούδι" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" "Μεταπήδηση στην αρχή του τραγουδιού ή στο προηγούμενο αν είναι ήδη κοντά " "στην αρχή" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Μεταπήδηση στο προηγούμενο τραγούδι" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Έναρξη αναπαραγωγής" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Παύση αναπαραγωγής" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Εναλλαγή αναπαραγωγής/παύσης" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Σταμάτημα αναπαραγωγής" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Αύξηση της έντασης αναπαραγωγής" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Μείωση της έντασης αναπαραγωγής" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Εμφάνιση της κατάστασης του αναπαραγωγέα" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Απόκρυψη του κυρίου παραθύρου" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Εμφάνιση του κυρίου παραθύρου" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Εναλλαγή ορατότητας κυρίου παραθύρου" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Εστίαση του εκτελούμενου αναπαραγωγέα" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Αφαίρεση ενεργών φίλτρων περιηγητή" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Ανανέωση και σάρωση ξανά της μουσικοθήκης" #: ../quodlibet/cli.py:110 msgid "List available browsers" msgstr "Προβολή διαθέσιμων περιηγητών" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Εμφάνιση της τρέχουσας λίστας αναπαραγωγής" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Εμφάνιση των περιεχομένων της ουράς αναπαραγωγής" #: ../quodlibet/cli.py:113 msgid "Print the active text query" msgstr "Εμφάνιση της ενεργής αναζήτησης" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Εκκίνηση χωρίς πρόσθετα" #: ../quodlibet/cli.py:115 msgid "Start Quod Libet if it isn't running" msgstr "Εκκινήστε τον Quod Libet αν δεν εκτελείται" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Έξοδος από τον Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Αναζήτηση στο αναπαραγόμενο τραγούδι" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][ΩΩ:]ΛΛ:ΔΔ" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Εναλλαγή αναπαραγωγής/παύσης" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Ενεργοποίηση, απενεργοποίηση ή εναλλαγή της επανάληψης" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Καθορισμός έντασης" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Αναζήτηση στην μουσικοθήκη" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "ερώτημα" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Αναπαραγωγή αρχείου" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 msgctxt "command" msgid "filename" msgstr "όνομα αρχείου" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Βαθμολόγηση αναπαραγόμενου τραγουδιού" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Καθορισμός τρέχοντος περιηγητή" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Βαθμολόγηση αναπαραγόμενου τραγουδιού" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Άνοιγμα νέου περιηγητή" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Εμφάνιση ή απόκρυψη της ουράς αναπαραγωγής" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Εμφάνιση ή απόκρυψη της κύριας λίστας τραγουδιών" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Φιλτρο βάσει τυχαίας τιμής" #: ../quodlibet/cli.py:134 msgctxt "command" msgid "tag" msgstr "ετικέτα" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Φίλτρο βάσει ετικέτας" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "ετικέτα=τιμή" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Προσθήκη ενός αρχείου ή ενός ερωτήματος στην ουρά" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Προσθήκη στην ουρά αρχείων διαχωρισμένων με κόμματα" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "όνομα αρχείου" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" "Εμφάνιση ονομάτων αρχείων ή αποτελεσμάτων ερωτήματος στην κανονική έξοδο" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Αφαίρεση αρχείου ή ερωτήματος από την ουρά αναπαραγωγής" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Μη έγκυρο όρισμα για το '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Δοκιμάστε το %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Άγνωστη Συσκευή" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "Δεν μπόρεσε να εισαχθεί το %s, που χρειάζεται για υποστήριξη συσκευών." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "Το %r δεν είναι υποστηριζόμενη συσκευή." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "Δεν βρέθηκε το %s." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Αρχικοποίηση υποστήριξης συσκευών" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Δοκιμή '%s'" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Δεν ήταν δυνατή η σύνδεση σε κάποιο σύστημα υποστήριξης συσκευών." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Αρχικοποιήθηκε η υποστήριξη συσκευών." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Πρότυπο ονόματος αρχείου:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Αντιγραφή εξώφυλλων ά_λμπουμ" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Αφαίρεση αχρείαστων εξώφυλλων και φακέλων" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Προκλήθηκε Σφάλμα" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 #, fuzzy msgid "Quit Program" msgstr "_Πρόγραμμα:" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Αγνόηση Όλων των Σ_φαλμάτων" #: ../quodlibet/errorreport/ui.py:80 #, fuzzy msgid "Error details:" msgstr "Λεπτομέρειες Σφάλματος" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "περιγραφή" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "ένας επεξεργαστής ετικετών μουσικής" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "κατάλογος" #: ../quodlibet/ext/covers/artwork_url.py:19 #, fuzzy msgid "Artwork URL Cover Source" msgstr "Πηγή Εξωφύλλου Last.fm" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "Πηγή Εξωφύλλου Last.fm" #: ../quodlibet/ext/covers/discogs.py:26 #, fuzzy msgid "Downloads covers from Discogs." msgstr "Λήψη εξώφυλλων άλμπουμ από διάφορες ιστοσελίδες." #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "Πηγή Εξωφύλλου Last.fm" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Λήψη εικόνας από το αρχείο εξώφυλλων του Last.fm." #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "MusicBrainz Cover Source" msgstr "Πηγή Εξωφύλλου MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Λήψη εικόνας από το αρχείο εξώφυλλων του musicbrainz." #: ../quodlibet/ext/editing/iconv.py:26 msgid "Convert Encodings" msgstr "Μετατροπή κωδικοποιήσεων" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "Διόρθωση λάθος εντοπισμένων κωδικοποιήσεων στις ετικέτες." #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "_Μετατροπή Κωδικοποιήσεων…" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "Απλός μετατροπέας Kana/Kanji" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" "Μετατροπή των γραμμάτων kana/kanji σε λατινικούς χαρακτήρες (romaji) πριν " "την μετονομασία." #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "Μετατροπή _Ιαπωνικού κειμένου σε λατινικούς χαρακτήρες" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "Δεν βρέθηκε το πρόγραμμα μετατροπής Kanji Kana (kakasi)." #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "Αντικατάσταση με χρήση Regex" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Επιτρέπει αντικαταστάσεις με χρήση κανονικών εκφράσεων (s///) στην " "επεξεργασία ετικετών ή την μετονομασία αρχείων." #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title Case" msgstr "Διόρθωση πεζών/Κεφαλαίων γραμμάτων" #: ../quodlibet/ext/editing/titlecase.py:21 msgid "Title-cases tag values in the tag editor." msgstr "Διόρθωση των κεφαλαίων στις ετικέτες." #: ../quodlibet/ext/editing/titlecase.py:40 msgid "Title-_case Value" msgstr "_Κεφαλαιοποίηση Του Πρώτου Γράμματος Κάθε Λέξης" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "Να επιτρέπονται Τ_Α ΚΕΦΑΛΑΙΑ στις ετικέτες" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "Κεφαλαιοποίηση με α_γγλικούς κανόνες" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Χρήση κοινών αγγλικών κανόνων για την κεφαλαιοποίηση, όπως στο \"Dark Night " "of the Soul\"" #: ../quodlibet/ext/events/advanced_preferences.py:69 msgid "Advanced Preferences" msgstr "Προχωρημένες Προτιμήσεις" #: ../quodlibet/ext/events/advanced_preferences.py:70 #, fuzzy msgid "Allow editing of advanced config settings." msgstr "Επιτρέψτε την αλλαγή ρυθμίσεων για προχωρημένους." #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "Κινούμενες Ειδοποιήσεις Οθόνης" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "Εμφανίζει πληροφορίες στην οθόνη σας στην αλλαγή τραγουδιού." #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "Κορυφή της οθόνης" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "Μέση της οθόνης" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "Κάτω μέρος της οθόνης" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "_Θέση:" #: ../quodlibet/ext/events/animosd/prefs.py:171 msgid "_Cover size:" msgstr "Μέγεθος _Εξώφυλλου:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 msgid "Display" msgstr "Προβολή" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "_Γραμματοσειρά:" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "Αριστερά" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "Κέντρο" #: ../quodlibet/ext/events/animosd/prefs.py:197 msgid "Right" msgstr "Δεξιά" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "_Στοίχιση κειμένου:" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "Κείμενο" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "_Κείμενο:" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "_Φόντο:" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "Χρώματα" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "_Σκιές" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "_Περίγραμμα" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "Στρογγυλεμένες _Γωνίες" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "Κα_θυστέρηση:" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "Εφέ" #: ../quodlibet/ext/events/animosd/prefs.py:270 msgid "Ed_it Display Pattern…" msgstr "_Επεξεργασία Πρότυπου Εμφάνισης…" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 msgid "Preview" msgstr "Προεπισκόπηση" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "Αυτόματη Ανανέωση Μουσικοθήκης" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" "Διατηρεί τη μουσικοθήκη σας ενημερωμένη με χρήση inotify. Χρειάζεται το %s." #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "Αυτόματη Απόκρυψη" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" "Αυτόματη εμφάνιση και απόκρυψη δίσκων καθώς προσαρτώνται ή αφαιρούνται." #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "Αυτόματη Βαθμολογία" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" "Αυτόματη βαθμολόγιση των τραγουδιών καθώς αναπαράγωνται ή προσπερνούνται. Με " "τη χρήση του 'επιταχυνόμενου' αλγόριθμου του Brian Nelson από το vux." #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "Ξυπνητήρι" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "Σας ξυπνά με δυνατή μουσική." #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "Νανούρισμα" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "Σταδιακή σίγαση και μετά παύση της μουσικής σας." #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "Επίπεδο" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "Ζωντανή" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "Πλήρης Μπάσα και Πρίμα" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "Κλαμπ" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "Μεγάλη Αίθουσα" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "Πάρτυ" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "Απαλή" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "Πλήρης Μπάσα" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "Ακουστικά" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "Απαλή Ροκ" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "Πλήρης Πρίμα" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "Χορευτική" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "Φορητός Υπολογιστής" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "Αντισταθμιστής" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "Το τρέχων ηχητικό σύστημα δεν υποστηρίζει αντιστάθμιση." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, python-format msgid "%.1f dB" msgstr "" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom" msgstr "Προσαρμοσμένο" #: ../quodlibet/ext/events/equalizer.py:199 msgid "_Clear" msgstr "_Καθαρισμός" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "Μήνυμα Κατάστασης Gajim" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "Αλλαγή του μηνύματος κατάστασης του Gajim σύμφωνα με το τι ακούτε." #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "παυμένο" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" "Γράψτε τους λογαριασμούς, διαχωρισμένους με κενά, για την αλλαγή μηνύματος. " "Αν το αφήσετε κενό θα αλλαχθεί το μήνυμα κατάστασης σε όλους τους " "λογαριασμούς." #: ../quodlibet/ext/events/gajim_status.py:160 #, fuzzy msgid "Add '[paused]'" msgstr "παυμένο" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" "Αν τσεκαριστεί κατά την παύση θα προστεθεί το '[paused]' στο μήνυμα " "κατάστασης." #: ../quodlibet/ext/events/gajim_status.py:187 #, fuzzy msgid "Statuses for which message will be changed" msgstr "Καταστάσεις για τις οποίες θα αλλαχθεί το μήνυμα κατάστασης" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "Αναστολή Προστασίας Οθόνης" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "Απενεργοποίηση της προστασίας οθόνης του GNOME κατά την αναπαραγωγή." #: ../quodlibet/ext/events/inhibit.py:51 msgid "Music is playing" msgstr "Αναπαράγεται μουσική" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "Internet Radio Log" msgstr "Καταγραφή Διαδικτυακού Ραδιοφώνου" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" "Καταγράφει τα τελευταία 10 τραγούδια που έχουν αναπαραχθεί σε ραδιοφωνικούς " "σταθμούς και τα εμφανίζει στο μενού της αναζήτησης χρόνου." #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "Εξάγει αρχείο μουσικής χρήστη Jabber στο ~/.quodlibet/jabber" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "Αλλαγή _Βαθμολογίας" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "Προεπιλογή" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 msgid "No active song" msgstr "Δεν υπάρχει ενεργό τραγούδι" #: ../quodlibet/ext/events/lyricswindow.py:215 msgid "No lyrics found" msgstr "Δεν βρέθηκαν στίχοι" #: ../quodlibet/ext/events/lyricswindow.py:227 msgid "Lyrics:" msgstr "Στίχοι:" #: ../quodlibet/ext/events/lyricswindow.py:284 #, fuzzy msgid "_Zoom level:" msgstr "Επίπε_δο:" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 #, fuzzy msgid "Revert to default" msgstr "Επαναφορά στο προκαθορισμένο πρότυπο" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Καθαρισμός αναζήτησης" #: ../quodlibet/ext/events/lyricswindow.py:347 msgid "Lyrics Window" msgstr "Παράθυρο Στίχων" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "Εμφανίζει ένα παράθυρο με στίχους του αναπαραγώμενου τραγουδιού." #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "Διακομιστής πολυμέσων UPnP AV Media Server" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" "Εξάγει όλα τα άλμπουμ στον διακομιστή πολυμέσων Rygel UPnP μέσω της διεπαφής " "D-Bus MediaServer2." #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "Διακομιστής MPD" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" "Έλεγχος του Quod Libet απομακρυσμένα με χρήση πελάτη MPD. Οι ροές και η " "διαχείριση λιστών αναπαραγωγής και της μουσικοθήκης δεν υποστηρίζονται." #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "_Θύρα:" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "Τοπική _IP:" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 #, fuzzy msgid "P_assword:" msgstr "Κωδικός:" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 msgid "Connection" msgstr "Σύνδεση" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "Δοκιμασμένοι Πελάτες" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "Υποστήριξη MPRIS D-Bus" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "Έλεγχος του Quod Libet με χρήση της διεπαφής D-Bus MPRIS 1.0/2.0." #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "Απόκρυψη του κυρίου παραθύρου στο κλείσιμο" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Προτιμήσεις" #: ../quodlibet/ext/events/mqtt.py:50 #, fuzzy, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" "Μήνυμα κατάστασης όταν κάποιο τραγούδι είναι παυμένο. Δέχεται πρότυπα QL π." "χ. %s" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Πρότυπα Διαδρομών" #: ../quodlibet/ext/events/mqtt.py:130 #, fuzzy msgid "Status text when a song is started." msgstr "" "Μήνυμα κατάστασης όταν αναπαράγεται κάποιο τραγούδι. Δέχεται πρότυπα QL π.χ. " "%s" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Πρότυπα Καταστάσεων" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "Χωρίς τρέχων τραγούδι:" #: ../quodlibet/ext/events/mqtt.py:138 #, fuzzy msgid "Plain text for when there is no current song" msgstr "Απλό κείμενο για την κατάσταση για όταν δεν υπάρχει τρέχων τραγούδι" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Ρύθμιση Εξόδου" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "Κατάσταση" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Δεν ήταν δυνατή η σύνδεση στο %s" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "Σφάλμα σύνδεσης" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "Κείμενο ειδοποίησης" #: ../quodlibet/ext/events/notify.py:88 msgid "_Title:" msgstr "_Τίτλος:" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "Επαναφορά στο προκαθορισμένο πρότυπο" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "_Σώμα:" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "_Εμφάνιση ειδοποίησης" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "Εμφάνιση ειδοποιήσεων" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "Μόνο σε <i>_χειροκίνητες</i> αλλαγές τραγουδιών" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "Μόνο σε <i>_αυτόματες</i> αλλαγές τραγουδιών" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "Σε <i>Ό_λες</i> τις αλλαγές τραγουδιών" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "Μόνο όταν το κύριο παράθυρο δεν είναι _εστιασμένο" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "Σφάλμα σύνδεσης" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "Δεν ήταν δυνατή η σύνδεση με τον δαίμονα ειδοποιήσεων." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "Ειδοποιήσεις Τραγουδιών" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "Εμφανίζει ειδοποίηση στην αλλαγή τραγουδιού." #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Επόμενο" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" "Παρακαλώ ανοίξτε το παράθυρο προσθέτων και ρυθμίστε το QLScrobbler. " "Διαφορετικά τα τραγούδια δεν θα υποβάλλονται." #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "Δεν ήταν δυνατή η σύνδεση στην υπηρεσία '%s'." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "Η πιστοποίηση απέτυχε: μη έγκυρο URL." #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "Η πιστοποίηση απέτυχε: Μη έγκυρο όνομα χρήστη '%s' ή λάθος κωδικός." #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "Ο πελάτης έχει απαγορευτεί. Ειδοποιήστε τον συγγραφέα." #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" "Λάθος ώρα συστήματος. Οι υποβολές μπορεί να αποτυγχάνουν μέχρι να διορθωθεί." #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "Υποβολή AudioScrobbler" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" "Πελάτης Audioscrobbler για το Last.fm, Libre.fm και άλλες υπηρεσίες " "Audioscrobbler." #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "Επιτυχημένη πιστοποίηση" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "_Υπηρεσία:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "User_name:" msgstr "Όνομα _χρήστη:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "_Κωδικός:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 msgid "Other…" msgstr "Άλλο…" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "_Επαλήθευση δεδομένων λογαριασμού" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "Λογαριασμός" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Artist pattern:" msgstr "Πρότυπο _Καλλιτέχνη:" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Title pattern:" msgstr "_Πρότυπο Τίτλου:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "_Φίλτρο εξαιρέσεων:" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" "Το πρότυπο που θα χρησιμοποιηθεί για την υποβολή του ονόματος καλλιτέχνη. " "Αφήστε το κενό για τη χρήση προκαθορισμένου." #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" "Το πρότυπο που θα χρησιμοποιηθεί για την υποβολή του τίτλου. Αφήστε το κενό " "για τη χρήση προκαθορισμένου." #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "Τα τραγούδια που ταιριάζουν με αυτό το φίλτρο δεν θα υποβάλλονται." #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "Λειτουργία Εκτός _Σύνδεσης (να μην υποβληθεί τίποτα)" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "Υποβολή" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "Σίγαση Ραδιοφωνικών Διαφημίσεων" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" "Σίγαση κατά την αναπαραγωγή ραδιοφωνικών διαφημίσεων.\n" "Σταθμοί: di.fm" #: ../quodlibet/ext/events/randomalbum.py:27 msgid "Random Album Playback" msgstr "Αναπαραγωγή Τυχαίου Άλμπουμ" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" "Θα ξεκινήσει ένα τυχαίο άλμπουμ όταν τελειώσει η λίστα αναπαραγωγής σας. " "Χρειάζεται ο ενεργός περιηγητής να υποστηρίζει φιλτράρισμα κατά άλμπουμ." #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "Πιο υψηλά βαθμολογημένο" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "Έχει αναπαραχθεί συχνά" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "Έχει παραληφθεί συχνά" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "Έχει αναπαραχθεί πρόσφατα" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "Έχει ξεκινήσει να αναπαράγεται πρόσφατα" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "Έχει προστεθεί πρόσφατα" #: ../quodlibet/ext/events/randomalbum.py:44 msgid "Longer albums" msgstr "Μεγαλύτερα σε διάρκεια άλμπουμ" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "δευτερόλεπτα πριν την εκκίνηση του επόμενου άλμπουμ" #: ../quodlibet/ext/events/randomalbum.py:87 msgid "Weights" msgstr "Βαρύτητες" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "Να προτιμούνται κάποια άλμπουμ περισσότερο" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "απέφυγε" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "προτίμησε" #: ../quodlibet/ext/events/randomalbum.py:201 msgid "Random Album" msgstr "Τυχαίο Άλμπουμ" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "Ξεκινά το %s" #: ../quodlibet/ext/events/rbimport.py:114 msgid "Import Failed" msgstr "Η Εισαγωγή Απέτυχε" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "Επιτυχής εισαγωγή βαθμολογιών και στατιστικών για %d τραγούδια" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "Εισαγωγή από τον Rhythmbox" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "Εισάγει βαθμολογίες και στατιστικά τραγουδιών από το Rhythmbox." #: ../quodlibet/ext/events/rbimport.py:132 msgid "Start Import" msgstr "Ξεκίνα την εισαγωγή" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "Παύση με την Προστασία Οθόνης" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "Παύει τη μουσική όταν ενεργοποιηθεί η προστασία οθόνης του GNOME." #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" "Δεν έχει εγκατασταθεί ο πάροχος αναζήτησης του Quod Libet για το GNOME Shell." #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "Πάροχος Αναζήτησης GNOME" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "Αναζήτηση στην μουσικοθήκη μέσα από το GNOME Shell." #: ../quodlibet/ext/events/seekbar.py:122 #, fuzzy msgid "Alternative Seek Bar" msgstr "Εναλακτική" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "Συγχρονισμός με το Squeezebox" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" "Κάντε το Logitech Squeezebox να καθρεφτίζει την έξοδο του Quod Libet, αρκεί " "να διαβάζουν από όμοια μουσικοθήκη" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "Σφάλμα στην εύρεση του διακομιστή Squeezebox" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "Σφάλμα στην εύρεση του %s. Παρακαλώ ελέγξτε τις ρυθμίσεις" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Προβολή Στίχων" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 #, fuzzy msgid "Text:" msgstr "_Κείμενο:" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 #, fuzzy msgid "Font" msgstr "_Γραμματοσειρά:" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "Μηνύματα Κατάστασης Telepathy" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" "Ενημερώνει όλους τους λογαριασμούς στιγμιαίων μηνυμάτων Telepathy (από το " "Empathy κτλ) με μήνυμα κατάστασης βασισμένο στο τρέχων τραγούδι." #: ../quodlibet/ext/events/telepathy_status.py:122 msgid "Playing:" msgstr "Αναπαράγεται:" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" "Μήνυμα κατάστασης όταν αναπαράγεται κάποιο τραγούδι. Δέχεται πρότυπα QL π.χ. " "%s" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "Παυμένο:" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" "Μήνυμα κατάστασης όταν κάποιο τραγούδι είναι παυμένο. Δέχεται πρότυπα QL π." "χ. %s" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "Απλό κείμενο για την κατάσταση για όταν δεν υπάρχει τρέχων τραγούδι" #: ../quodlibet/ext/events/telepathy_status.py:157 msgid "No song:" msgstr "Χωρίς τρέχων τραγούδι:" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 msgid "Status Patterns" msgstr "Πρότυπα Καταστάσεων" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "Εναλλαγέας Θεμάτων" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "Αλλάξτε το ενεργό θέμα GTK+." #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "_Θέμα:" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "Προεπιλεγμένο Θέμα" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "Χρήση της σκοτεινής παραλλαγής του θέματος" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Δεν αναπαράγεται" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "Εικονίδιο Περιοχής Συστήματος" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "Έλεγχος του Quod Libet από την περιοχή συστήματος." #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 msgid "_Play" msgstr "_Αναπαραγωγή" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 msgid "P_ause" msgstr "_Παύση" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 msgid "Pre_vious" msgstr "Προη_γούμενο" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "Επό_μενο" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Ανακάτεμα" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Επανάληψη" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Σταμάτησε μετά από αυτό το τραγούδι" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 msgid "Open _Browser" msgstr "Άνοιγμα _Περιηγητή" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Επε_ξεργασία Ετικετών" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "Π_ληροφορίες" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 msgid "Play_lists" msgstr "_Λίστες Αναπαραγωγής" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "Έ_ξοδος" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Συμπεριφορά" #: ../quodlibet/ext/events/trayicon/prefs.py:42 #, fuzzy msgid "Scroll wheel adjusts volume" msgstr "" "Ο τροχός του ποντικιού αυξομειώνει την ένταση ήχου\n" "Ο τροχός με πατημένο το Shift αλλάζει τραγούδια" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "_Τροχός Ποντικιού" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Προβολή Συμβουλής" #: ../quodlibet/ext/events/viewlyrics.py:23 msgid "View Lyrics" msgstr "Προβολή Στίχων" #: ../quodlibet/ext/events/viewlyrics.py:24 #, fuzzy msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "Προβολή στίχων κάτω από την λίστα τραγουδιών" #: ../quodlibet/ext/events/viewlyrics.py:29 msgid "_Lyrics" msgstr "_Στίχοι" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 msgid "Error" msgstr "Σφάλμα" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 #, fuzzy msgid "Waveform Seek Bar" msgstr "Εναλακτική" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "Αποθηκευτής Εικόνων" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "Η εικόνα εξωφύλλου του τρέχοντος τραγουδιού αποθηκεύεται σε αρχείο." #: ../quodlibet/ext/events/write_cover.py:66 msgid "File:" msgstr "Αρχείο:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "_Κατώφλι:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "Κατώφλι για την ενεργοποίηση του φίλτρου" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "_Αναλογία" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "Αναλογία συμπίεσης" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "Συμπιεστής Ήχου" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" "Αλλαγή του πλάτους κύματος όλων των δειγμάτων πάνω από κάποιο συγκεκριμένο " "κατώφλι με καθορισμένη αναλογία." #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "_Preset:" msgstr "_Προκαθορισμένο:" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "Filter preset" msgstr "Προκαθορισμένο φίλτρο" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "_Συχνότητα αποκοπής:" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "Συχνότητα αποκοπής φίλτρου χαμηλής συχνότητας" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "Επίπεδο _εισόδου:" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "Επίπεδο εισόδου" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "Προεπιλογή" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "Πλησιέστερο σε τοποθέτηση εικονικών ηχείων (30°, 3 μέτρα)" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "Πλησίον του διατροφοδοτητή του Chu Moy (δημοφιλές)" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "Πλησίον στους ενισχυτές CORDA του Jan Meier (μικρή αλλαγή)" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom settings" msgstr "Προσαρμοσμένες ρυθμίσεις" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "Διατροφοδότηση" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" "Αναμιγνύει το αριστερό και δεξιό κανάλι με τέτοιο τρόπο ώστε να προσομοιώνει " "ηχεία κατά την χρήση ακουστικών, ή για να διορθώσει κάποιες παλιές στέρεο " "ηχογραφήσεις." #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "Filter _band:" msgstr "_Ζώνη φίλτρου:" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "Η ζώνη συχνοτήτων του φίλτρου" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "Filter _width:" msgstr "_Εύρος φίλτρου:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "Το εύρος συχνοτήτων του φίλτρου" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "Επίπε_δο:" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "Η στάθμη επίδρασης" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "Αφαίρεση ανθρώπινης φωνής από τον ήχο." #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "Μονοφωνική μίξη" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "Μίξη των καναλιών σε μονοφωνικό." #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "_Ποσοστό:" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "_Τέμπο:" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "Τό_νος:" #: ../quodlibet/ext/gstreamer/pitch.py:89 msgid "Audio Pitch / Speed" msgstr "Τόνος / Ταχύτητα Ήχου" #: ../quodlibet/ext/gstreamer/pitch.py:90 msgid "Controls the pitch of an audio stream." msgstr "Έλεγχος του ηχητικού τόνου." #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Εξαγωγή της λίστας αναπαραγωγής στο Squeezebox" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Εισαγωγή" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Δεν βρέθηκαν σταθμοί" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Πρότυπο ονόματος αρχείου:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Πρότυπο ονόματος αρχείου:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 #, fuzzy msgid "Export to Squeezebox" msgstr "Εξαγωγή στο Squeezebox…" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 #, fuzzy msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" "Εξαγωγή λίστας αναπαραγωγής στο Logitech Squeezebox, αρκεί να χρησιμοποιούν " "την ίδια δομή καταλόγων. Χρησιμοποιεί τις ρυθμίσεις του προσθέτου Squeezebox " "Sync." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "Εξαγωγή της λίστας αναπαραγωγής στο Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "Όνομα λίστας (θα αντικαταστήσει τυχών υπάρχουσα)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "Εξαγωγή σε λίστα του Squeezebox" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 msgid "Remove Playlist Duplicates" msgstr "Αφαίρεση Διπλότυπων Από Λίστα" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "Αφαιρεί διπλότυπες καταχωρήσεις σε λίστα αναπαραγωγής." #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Σίγουρα θέλετε να αφαιρέσετε %d διπλότυπο τραγούδι;" msgstr[1] "Σίγουρα θέλετε να αφαιρέσετε %d διπλότυπα τραγούδια;" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "Τα διπλότυπα τραγούδια θα αφαιρεθούν από την λίστα αναπαραγωγής '%s'." #: ../quodlibet/ext/playlist/shuffle.py:15 msgid "Shuffle Playlist" msgstr "Ανακάτεμα Λίστας Αναπαραγωγής" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "Ανακατεύει τυχαία μια λίστα αναπαραγωγής." #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "Ακολούθηση Επιλογής" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 #, fuzzy msgid "Playcount Equalizer" msgstr "Αντισταθμιστής" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "τελευταία αναπαραγωγή" #: ../quodlibet/ext/playorder/queue.py:19 msgid "Queue Only" msgstr "Μόνο Ουρά" #: ../quodlibet/ext/playorder/queue.py:21 #, fuzzy msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" "Αναπαραγωγή μόνο τραγουδιών από την ουρά. Διπλό κλικ σε τραγούδι για να το " "προσθέσετε στην ουρά αναπαραγωγής." #: ../quodlibet/ext/playorder/reverse.py:14 msgid "Reverse" msgstr "Αντίστροφα" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "Αντιστρέφει τη σειρά αναπαραγωγής." #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Μετρητής Παραλείψεων" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" "Τυχαία σειρά, αλλά κάθε τραγούδι επαναλαμβάνεται έναν προκαθορισμένο αριθμό " "φορών." #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "Πόσες φορές να αναπαραχθεί το κάθε τραγούδι:" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 #, fuzzy msgid "Python Query" msgstr "Κονσόλα Python" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Αποθηκευμένες Αναζητήσεις" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "Το Squeezebox σε λειτουργία. Χρήση του μοναδικού αναπαραγωγέα (%s)." #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "Δεν ήταν δυνατή η σύνδεση στο %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "Όνομα Συσκευής:" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "Θύρα:" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 msgid "Username:" msgstr "Όνομα Χρήστη:" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "Κωδικός:" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "Κατάλογος μουσικοθήκης στον οποίο συνδέεται ο διακομιστής." #: ../quodlibet/ext/_shared/squeezebox/base.py:132 msgid "Library path:" msgstr "Τοποθεσία μουσικοθήκης:" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "_Επαλήθευση ρυθμίσεων" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "Διακομιστής Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Αποσφαλμάτωση" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Διακομιστής Squeezebox στο {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "άγνωστος διακομιστής Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "άγνωστος αναπαραγωγέας Squeezebox: %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "Επιλογή αναπαραγωγέα Squeezebox" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "_Εντάξει" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Βρέθηκε ο διακομιστής Squeezebox.\n" "Παρακαλώ επιλέξτε τον αναπαραγωγέα" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "Προσαρμογή _μεγέθους εικόνας στο μέγεθος παραθύρου" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "_Πρόγραμμα:" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "_Επεξεργασία της εικόνας μετά την αποθήκευση" #: ../quodlibet/ext/songsmenu/albumart.py:345 msgid "File_name:" msgstr "Όνομα _αρχείου" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "Η αποθήκευση απέτυχε" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, python-format msgid "Unable to save \"%s\"." msgstr "Αδυναμία αποθήκευσης \"%s\"." #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] Σφάλμα HTTP: %s" #: ../quodlibet/ext/songsmenu/albumart.py:613 msgid "Album Art Downloader" msgstr "Λήψη Εξώφυλλων Άλμπουμ" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "από %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "Ανάλυση: %s" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, python-format msgid "Size: %s" msgstr "Μέγεθος: %s" #: ../quodlibet/ext/songsmenu/albumart.py:690 msgid "_Search" msgstr "_Αναζήτηση" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 msgid "Searching…" msgstr "Αναζήτηση…" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "Τελείωσε" #: ../quodlibet/ext/songsmenu/albumart.py:922 msgid "Download Album Art" msgstr "Λήψη Εξώφυλλων Άλμπουμ" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "Λήψη εξώφυλλων άλμπουμ από διάφορες ιστοσελίδες." #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "Πηγές" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "APEv2 σε ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" "Μετατροπή των ετικετών APEv2 σε ID3v2. Μετά την μετατροπή θα διαγραφούν οι " "ετικέτες APEv2." #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "Μεταπήδηση σε Σελιδοδείκτη…" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 #, fuzzy msgid "Manages bookmarks in the selected files." msgstr "Εμφάνιση όλων των σελιδοδεικτών στα επιλεγμένα αρχεία." #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 msgid "_Edit Bookmarks…" msgstr "_Επεξεργασία Σελιδοδεικτών…" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 msgid "No Bookmarks" msgstr "Χωρίς Σελιδοδείκτες" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 msgid "MusicBrainz Lookup" msgstr "Αναζήτηση σε MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Συμπλήρωση ετικετών άλμπουμ βάσει αναζήτησης στο MusicBrainz." #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "Χρήση μόνο του έτους για την ετικέτα \"ημερομηνία\"" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "Προσθήκη ετικέτας \"_albumartist\" όταν χρειάζεται" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "Εγγραφή ετικετών ταξινόμησης για τα ονόματα καλλιτεχνών" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "Εγγραφή _κανονικών ετικετών MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Όνομα Αρχείου" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Δίσκος" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Κομμάτι" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 msgid "Title" msgstr "Τίτλος" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Καλλιτέχνης" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 msgid "MusicBrainz lookup" msgstr "Αναζήτηση σε MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 msgid "_Query:" msgstr "_Ερώτημα:" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 msgid "S_earch" msgstr "_Αναζήτηση" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "Αποτελέσματα <i>(τραβήχτε με το ποντίκι για αλλαγή σειράς)</i>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "Παρακαλώ εισάγεται ένα ερώτημα." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "Παρουσιάστηκε σφάλμα. Παρακαλώ δοκιμάστε ξανά." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "Φόρτωση αποτελέσματος…" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 msgid "No results found." msgstr "Δεν βρέθηκαν αποτελέσματα." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 msgid "Browse Folders" msgstr "Άνοιγμα Φακέλου" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "Άνοιγμα του φακέλου του τραγουδιού με τον διαχειριστή αρχείων." #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Unable to open folders" msgstr "Αδυναμία ανοίγματος φακέλων" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "Δεν υπάρχει διαθέσιμη εφαρμογή για το άνοιγμα φακέλων." #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "Κονσόλα Python" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "Διαδραστική κονσόλα Python" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "Έχετε πρόσβαση στα ακόλουθα αντικείμενα από προεπιλογή:" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "Ο τρέχων κατάλογος εργασίας σας είναι:" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "Εντολή" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "name" msgstr "όνομα" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "Η ονομασία αυτής της εντολής" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "εντολή" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "Η εντολή κελύφους που θα εκτελεσθεί" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "παράμετρος" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" "Αν οριστεί, μια παράμετρος η οποία θα αντικατασταθεί όπου βρεθεί με μια " "καθορισμένη από τον χρήστη τιμή, π.χ. χρησιμοποιώντας το 'PARAM' όλα τα " "'{PARAM}' στην εντολή σας θα αντικατασταθούν με τιμή που θα σας ζητηθεί κατά " "την εκτέλεση." #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "πρότυπο" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 #, fuzzy msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" "Το πρότυπο QL, π.χ. <~filename>, που χρησιμοποιείται για την δημιουργία της " "εντολής" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "μοναδικό" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "Αν ορισθεί, θα αφαιρεθούν τυχών διπλότυπα αποτελέσματα του προτύπου" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "Μέγιστα ορίσματα" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" "Ο μέγιστος αριθμός ορισμάτων που θα δωθούν στην εντολή σε κάθε εκτέλεση " "(όπως στο xargs)" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 msgid "Input value" msgstr "Εισαγωγή τιμής" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "Τιμή του %s;" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 msgid "Custom Commands" msgstr "Προσαρμοσμένες Εντολές" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Εκτελεί προσαρμοσμένες εντολές (σε δέσμες αν χρειάζεται) σε τραγούδια " "χρησιμοποιώντας τις τιμές ετικετών τους" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "Επεξεργασία Προσαρμοσμένων Εντολών" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 #, fuzzy msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" "Υποστηρίζει πρότυπα QL\n" "π.χ. <tt><~artist~title></tt>" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, python-format msgid "Unable to run custom command %s" msgstr "Αδυναμία εκτέλεσης προσαρμοσμένης εντολής %s" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "%d ομάδα διπλότυπων" msgstr[1] "%d ομάδες διπλότυπων" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "Σύμπτυξη / Ανάπτυξη όλων" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Το πρότυπο για το κλειδί διπλοτύπων είναι '%s'" #: ../quodlibet/ext/songsmenu/duplicates.py:372 msgid "Duplicates Browser" msgstr "Αναζήτηση Διπλότυπων" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "Εύρεση παρόμοιων εκδόσεων τραγουδιών." #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" "Δέχεται εκφράσεις QL όπως <tt>~artist~title</tt> ή <tt>musicbrainz_track_id</" "tt>" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "_Ομαδοποίηση διπλοτύπων με βάση:" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "Κλειδί Διπλοτύπων" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "Διαγραφή _Κενών" #: ../quodlibet/ext/songsmenu/duplicates.py:424 msgid "Remove _Diacritics" msgstr "Διαγραφή _Διακριτικών Σημείων" #: ../quodlibet/ext/songsmenu/duplicates.py:425 msgid "Remove _Punctuation" msgstr "Διαγραφή _Στίξης" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "Αγνόησε διαφορές πεζών/Κεφαλαίων" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "Επιλογές ταιριάσματος" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 msgid "Edit Playcount" msgstr "Επεξεργασία Μετρητή Αναπαραγωγών" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" "Επεξεργασία των μετρητών ~#playcount και ~#skipcount τραγουδιού.\n" "\n" "Όταν έχουν επιλεχθεί πολλαπλά τραγούδια, οι μετρητές θα προσαυξηθούν αντί " "να\n" "καθοριστούν.\n" "\n" "Αν ορίσετε το ~#playcount ενός τραγουδιού σε 0, οι καταχωρήσεις " "~#lastplayed\n" "και ~#laststarted διαγράφονται. Αν όμως ορίσετε θετική τιμή σε τραγούδι που\n" "δεν έχετε παίξει ποτέ δεν θα δημιουργηθούν αυτές οι τιμές." #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "Μετρητής Αναπαραγωγών" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "Μετρητής Παραλείψεων" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "Επεξεργασία Ενσωματωμένων Εικόνων" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "Διαγραφή ή αντικατάσταση των ενσωματωμένων εικόνων." #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "_Διαγραφή όλων των εικόνων" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "_Ενσωμάτωση τρέχουσας εικόνας" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "Καθορισμός Ακριβούς Βαθμολογίας" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "Επιτρέπει να ορισθεί η βαθμολογία τραγουδιού με αριθμό." #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "Παρακαλώ εισάγετε την επιθυμητή βαθμολογία με κλίμακα από 0,0 ως 1,0" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Filter on Any Tag" msgstr "Φίλτρο Βάσει Οποιασδήποτε Ετικέτας" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "" "Δημιουργία αναζήτησης βασισμένης σε ετικέτες των επιλεγμένων τραγουδιών." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 msgid "Filter on Directory" msgstr "Φίλτρο βάσει Καταλόγου" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "Φιλτράρισμα βάσει καταλόγου συστήματος αρχείων σε ένα νέο παράθυρο." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "Αναζήτηση Ακουστικού Αποτυπώματος" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" "Αναζήτηση μεταδεδομένων τραγουδιών χρησιμοποιώντας τα ακουστικά αποτυπώματά " "τους" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "Υποβολή Ακουστικών Αποτυπωμάτων" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Παράγει ακουστικά αποτυπώματα χρησιμοποιώντας το chromaprint και τα " "υποβάλλει στο 'acoustid.org'" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "Λείπει το κλεδί API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" "Πρέπει να καθορίσετε ένα κλειδί API για το Acoustid.org στις προτιμήσεις του " "προσθέτου πριν υποβάλλετε αποτυπώματα." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "Αίτηση για κλειδί API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "_Κλειδί API:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "Διαδικτυακή Υπηρεσία AcoustID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Σε αναμονή" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "Αναλύονται" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "Αναζήτηση" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Αποθήκευση" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "Κατάσταση" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "Κυκλοφορία" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 msgid "Write MusicBrainz tags" msgstr "Αποθήκευση ετικετών MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 msgid "Group by directory" msgstr "Ομαδοποίηση κατά κατάλογο" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "Album Mode" msgstr "Λειτουργία Άλμπουμ" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" "Αποθήκευση ετικετών σχετικών με το άλμπουμ και προσπάθησε να μειώσεις τις " "διαφορετικές κυκλοφορίες άλμπουμ" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "Παραγωγή αποτυπωμάτων:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "_Λεπτομέρειες" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "_Υποβολή" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" "Για να υποβληθούν τα τραγούδια χρειάζονται ετικέτες " "<i><b>musicbrainz_trackid</b></i> ή <i><b>artist</b></i> / <i><b>title</b></" "i> / <i><b>album</b></i>." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "Αποτυπώματα:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "Τραγούδια με MBID:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "Τραγούδια με επαρκείς ετικέτες:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "Τραγούδια για υποβολή:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Τέλος. %(to-send)d/%(all)d τραγούδια για υποβολή." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "Υποβάλλονται Αποτυπώματα:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "Υποβάλλονται…" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Ανανέωση Σταθμών" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 #, fuzzy msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" "Αποθήκευση των αρχείων ξανά. Οι μετρητές αναπαραγωγής και οι βαθμολογίες " "ενημερώνονται υποχρεωτικά." #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "Εξαγωγή σε HTML" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "Εξαγωγή της λίστας επιλεγμένων τραγουδιών σε HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "Διόρθωση της διάρκειας του MP3" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" "Αφαιρεί από τις ID3 ετικέτες τις καταχωρήσεις TLEN, που ίσως δημιουργούν " "λανθασμένες διάρκειες τραγουδιών." #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "Αποστολή στο iFP" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "Μεταφόρτωση τραγουδιών σε συσκευή iRiver iFP." #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "Εξαγωγή Μεταδεδομένων" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "Εξαγωγή μεταδεδομένων των επιλεγμένων τραγουδιών σε ένα αρχείο .tags." #: ../quodlibet/ext/songsmenu/importexport.py:92 msgid "Import Metadata" msgstr "Εισαγωγή Μεταδεδομένων" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" "Εισαγωγή μεταδεδομένων για τα επιλεγμένα τραγούδια από ένα αρχείο .tags." #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "Κάψιμο CD" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Δημιουργία CD με το K3b το Brasero ή το xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "Ενημέρωση λίστας chart." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "Ήδη ενημερωμένο." #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "Λήψη chart εβδομάδας %s." #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "Ο συγχρονισμός ολοκληρώθηκε." #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "Σφάλμα κατά τον συγχρονισμό" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "Συγχρονισμός last.fm" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" "Ενημερώστε τα στατιστικά της μουσικοθήκης σας από το προφίλ σας στο Last.fm." #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 msgid "_Username:" msgstr "_Όνομα χρήστη:" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "Δημιουργία Ετικετών Ταξινόμησης" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" "Μετατροπή ονομάτων άλμπουμ και καλλιτέχνη σε ετικέτες ταξινόμησης, συχνά " "αστόχως." #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Εξαγωγή Μεταδεδομένων" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Πληροφορίες" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Εισαγωγή Λίστας Αναπαραγωγής" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "Εξαγωγή τραγουδιών σε λίστα M3U ή PLS." #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "Χρήση σχετικών διαδρομών" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "Χρήση απόλυτων διαδρομών" #: ../quodlibet/ext/songsmenu/playlist.py:132 msgid "Unable to export playlist" msgstr "Αδυναμία εξαγωγής λίστας αναπαραγωγής" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Η εγγραφή στο <b>%s</b> απέτυχε." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Ανανέωση Τραγουδιών" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" "Ελέγχει για αλλαγές αρχείων και ξαναφορτώνει / αφαιρεί τα τραγούδια όπου " "χρειάζεται." #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Ανανέωση τραγουδιών" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "Αναλυτής ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "Πρόοδος" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "Ενίσχυση" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "Κορυφή" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, fuzzy, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" "Υπάρχει ακόμα <b>%(to-process)d</b> άλμπουμ για ενημέρωση (από %(all)d)" msgstr[1] "" "Υπάρχουν ακόμα <b>%(to-process)d</b> άλμπουμ για ενημέρωση (από %(all)d)" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "Ανάλυση ReplayGain με το GStreamer, με ομαδοποίηση κατά άλμπουμ." #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "πάντα" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "αν λείπουν <b>οποιεσδήποτε</b> ετικέτες RG" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "Αν λείπουν οι ετικέτες RG του <b>άλμπουμ</b>" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "_Επεξεργασία άλμπουμ:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 msgid "Existing Tags" msgstr "Υπάρχουσες Ετικέτες" #: ../quodlibet/ext/songsmenu/splitting.py:31 msgid "Split Tags" msgstr "Διαχωρισμός Ετικετών" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" "Διαχωρισμός του αριθμού δίσκου από το όνομα άλμπουμ και της έκδοσης από τον " "τίτλο ταυτοχρόνως." #: ../quodlibet/ext/songsmenu/splitting.py:56 msgid "Split Album" msgstr "Διαχωρισμός Άλμπουμ" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "Διαχωρισμός αριθμού δίσκου." #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Προκαθορισμένο:" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Ετικέτα" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Αδυναμία διαγραφής τραγουδιών" #: ../quodlibet/ext/songsmenu/website_search.py:35 msgid "Website Search" msgstr "Αναζήτηση σε Ιστοσελίδα" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" "Αναζητεί σε ιστοσελίδα επιλογής σας χρησιμοποιώντας ετικέτες τραγουδιών.\n" "Υποστηρίζει πρότυπα π.χ. %(pattern-example)s" #: ../quodlibet/ext/songsmenu/website_search.py:78 msgid "Search URL patterns" msgstr "Πρότυπα URL αναζήτησης" #: ../quodlibet/ext/songsmenu/website_search.py:88 msgid "Edit search URLs" msgstr "Επεξεργασία των URL αναζήτησης" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Επεξεργασία αναζητήσεων…" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "Αναζήτηση σε %(website)s" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "Αναζήτηση του καλλιτέχνη στη Βικιπαίδεια" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" "Ανοίγει ένα παράθυρο περιηγητή με το άρθρο της Βικιπαίδειας για τον " "καλλιτέχνη του τρέχοντος τραγουδιού." #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "Αναζήτηση του άλμπουμ στη Βικιπαίδεια" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" "Ανοίγει ένα παράθυρο περιηγητή με το άρθρο της Βικιπαίδειας για το τρέχον " "άλμπουμ" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Μουσικοθήκη" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Έλεγχος σημείων προσάρτησης" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Σάρωση της μουσικοθήκης" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Σάρωση του %s" #: ../quodlibet/library/libraries.py:745 #, fuzzy msgid "Loading files" msgstr "Η αποθήκευση απέτυχε" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Αποτυχία ανοίγματος αρχείου: %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Εμφάνιση ετικετών" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Εμφάνιση ωμής εξόδου" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Στήλες και η σειρά που θα εμφανιστούν στην ωμή έξοδο (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "Εμφάνιση _προγραμματικών ετικετών" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Μη αρκετός αριθμός ορισμάτων" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "Υπερβολικός αριθμός ορισμάτων" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "Περιγραφή" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Τιμή" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Εμφάνιση όλων των κοινών ετικετών" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Αντιγραφή ετικετών από ένα αρχείο σε άλλο" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Δείξε τις αλλαγές χωρίς να τις εφαρμόσεις" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Παράλειψη ετικετών που δεν μπορούν να γραφούν" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Αδύνατη αντιγραφή της ετικέτας %r στο αρχείο %r" #: ../quodlibet/operon/commands.py:157 msgid "Edit tags in a text editor" msgstr "Επεξεργασία ετικετών σε κειμενογράφο" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "Ακύρωση επεξεργασίας" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Η εκκίνηση του επεξεργαστή κειμένου '%(editor-name)s' απέτυχε." #: ../quodlibet/operon/commands.py:260 msgid "No changes detected" msgstr "Δεν ανιχνεύθηκαν αλλαγές" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Καθόρισε μια ετικέτα και αφαίρεσε τις παρούσες τιμές της" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Αδύνατος ο ορισμός του %r" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "Διαγραφή ετικετών" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "Η τιμή είναι κανονική παράσταση" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "Διαγραφή όλων των ετικετών" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "Αδύνατος ο συνδυασμός του '--all' με το '--regexp'" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "Αδύνατη η αφαίρεση του %r από το %r" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "Διαγραφή της τιμής ετικέτας" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "Προσθήκη τιμής σε ετικέτα" #: ../quodlibet/operon/commands.py:456 msgid "List file information" msgstr "Προβολή πληροφοριών αρχείου" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" "Καθορισμός της εικόνας ως κύριας ενσωματωμένης εικόνας και αφαίρεση των " "υπολοίπων ενσωματωμένων εικόνων." #: ../quodlibet/operon/commands.py:515 #, python-format msgid "Failed to load image file: %r" msgstr "Αποτυχία ανοίγματος αρχείου εικόνας: %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" "Η επεξεργασία εικόνων δεν επιτρέπεται για %(file_name)s (%(file_format)s)" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "Διαγραφή όλων των ενσωματωμένων εικόνων" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Εξαγωγή ενσωματωμένων εικόνων σε %(filepath)s" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" "Τοποθεσία αποθήκευσης εικόνων (η προεπιλογή είναι ο κατάλογος εργασίας)" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Μετονομασία αρχείων βάσει ετικετών" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Συμπλήρωση ετικετών βάσει διαδρομής αρχείου" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Αρχείο" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Συμπλήρωση αριθμών κομματιού για όλα τα αρχεία" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Εμφάνιση ετικετών βάσει παρεχόμενου προτύπου" #: ../quodlibet/operon/commands.py:768 msgid "Display help information" msgstr "Προβολή σύντομων πληροφοριών χρήσης" #: ../quodlibet/operon/util.py:40 #, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "Το '%(column-id)s' δεν είναι έγκυρο όνομα στήλης (%(all-column-ids)s)." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "Ά_γνωστο" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Με τη Σειρά" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "Με τη _Σειρά" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Τυχαία" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Τυχαία" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Επανάληψη" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Ένα Τραγούδι" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Ροή" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Buffering" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "Αδυναμία δημιουργίας διασωλήνωσης GStreamer" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" "Δεν βρέθηκε στοιχείο GStreamer ικανό να χειριστεί αυτό το είδος αρχείου" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "Μορφή πολυμέσου: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "Το πρόσθετο '%(name)s' του Gstreamer δεν ήταν δυνατό να αρχικοποιηθεί" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "Η διασωλήνωση του GStreamer που χρησιμοποιείται για αναπαραγωγή. Αφήστε το " "κενό για χρήση της προεπιλεγμένης τιμής. Αν η διασωλήνωση περιέχει και " "τελική έξοδο θα χρησιμοποιηθεί αντί της προεπιλεγμένης." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Διασωλήνωση εξόδου:" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f δευτερόλεπτα" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "Διάρκεια _Buffer:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "Απενεργοποίηση αναπαραγωγής χωρίς κενά (_gapless)" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" "Η απενεργοποίηση της αναπαραγωγής χωρίς κενά μερικές φορές αποτρέπει " "προβλήματα αλλαγής τραγουδιών με ορισμένες εκδόσεις του Gstreamer." #: ../quodlibet/player/gstbe/util.py:93 msgid "No GStreamer audio sink found" msgstr "Δεν βρέθηκε έξοδος ήχου GStreamer" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "Μη έγκυρη διασωλήνωση εξόδου GStreamer" #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Αδυναμία δημιουργίας εξόδου ήχου" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Η συσκευή ήχου %r δεν βρέθηκε. Ελέγξτε τις ρυθμίσεις του Xine στο ~/." "quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" "Δεν βρέθηκε το πρόσθετο '{module}'. Ίσως χρειάζεται να εγκατασταθεί το " "πακέτο." #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Αδυναμία εύρεσης του στοιχείου '{element}' του GStreamer." #: ../quodlibet/plugins/playlist.py:30 #, fuzzy, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" "Εκτέλεση του πρόσθετου \"%(name)s\" σε %(count)d λίστα αναπαραγωγής;" msgstr[1] "" "Εκτέλεση του πρόσθετου \"%(name)s\" σε %(count)d λίστες αναπαραγωγής;" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 msgid "_Run Plugin" msgstr "_Εκτέλεση Πρόσθετου" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Υποστηριζόμενοι τύποι αρχείων: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Συσκευή ήχου: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Αρχή" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "Μ/Δ" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Χρόνος" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Όνομα Σελιδοδείκτη" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "ΛΛ:ΔΔ" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Σελιδοδείκτες" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Φίλτρα" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "Πρόσφατα _Αναπαραχθέντα" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Πρόσφατα _Προστεθέντα" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "Κορυφαία _40" #: ../quodlibet/qltk/browser.py:63 msgid "All _Songs" msgstr "Όλα τα Τ_ραγούδια" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Τυχαίο Εί_δος" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Τυχαίος Καλλι_τέχνης" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Τυχαίο Άλ_μπουμ" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "Τα 40 τραγούδια που έχετε ακούσει περισσότερο (θα επιλεχθούν πάνω από 40 αν " "υπάρχουν ισοπαλίες)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Τιμή" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Αποθηκευμένες Τιμές" #: ../quodlibet/qltk/cbes.py:263 msgid "Edit saved values…" msgstr "Επεξεργασία αποθηκευμένων τιμών…" #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Αυτό_ματα" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "Λειτουργία _Κομματιού" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "Λειτουργία Ά_λμπουμ" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Αναλυτής ReplayGain" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "Νέο %s" #: ../quodlibet/qltk/data_editors.py:218 msgid "(unknown)" msgstr "(άγνωστο)" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "Πρότυπο ετικέτας" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "Πρότυπο ετικέτας π.χ. people:real ή ~album~year." #: ../quodlibet/qltk/data_editors.py:383 msgid "Enter new tag" msgstr "Εισάγετε τη νέα ετικέτα" #: ../quodlibet/qltk/delete.py:37 msgid "Files:" msgstr "Αρχεία:" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" "Τα επιλεγμένα τραγούδια θα αφαιρεθούν από τη μουσικοθήκη και τα αντίστοιχα " "αρχεία θα διαγραφούν από τον δίσκο." #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "Τα επιλεγμένα τραγούδια θα διαγραφούν από τον σκληρό σας δίσκο." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "Να διαγραφεί %(file_count)d αρχείο μόνιμα;" msgstr[1] "Να διαγραφούν %(file_count)d αρχεία μόνιμα;" #: ../quodlibet/qltk/delete.py:91 msgid "_Delete Files" msgstr "_Διαγραφή Αρχείων" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "Τα επιλεγμένα τραγούδια θα αφαιρεθούν από τη μουσικοθήκη και τα αντίστοιχα " "αρχεία θα μετακινηθούν στα απορρίματα." #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "Τα επιλεγμένα τραγούδια θα μεταφερθούν στον κάδο απορριμάτων." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "Μετακίνηση του %(file_count)d αρχείου στα απορρίματα;" msgstr[1] "Μετακίνηση των %(file_count)d αρχείων στα απορρίματα;" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Μετακίνηση στα Απορρίμματα" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Μετακίνηση %(current)d από %(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Αδυναμία μετακίνησης στα απορρίμματα" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 msgid "Moving one or more files to the trash failed." msgstr "Η μετακίνηση ενός ή περισσότερων αρχείων στα απορρίμματα απέτυχε." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Διαγραφή %(current)d από %(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 msgid "Unable to delete files" msgstr "Αδυναμία διαγραφής αρχείου" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 msgid "Deleting one or more files failed." msgstr "Η διαγραφή ενός ή περισσότερων αρχείων απέτυχε." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Λήψεις" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Μέγεθος" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "_Σταμάτα" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "Λείπει από %d τραγούδι" msgstr[1] "Λείπει από %d τραγούδια" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "Διαφορετικό σε %d τραγούδι" msgstr[1] "Διαφορετικό σε %d τραγούδια" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "_Διαμοιρασμός σε Πολλαπλές Τιμές" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Διαχωρισμός του Δίσκου από το Ά_λμπουμ" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Διαχωρισμός της Έκ_δοσης από τον Τίτλο" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Διαχωρισμός του Διευθετώντα από τον _Καλλιτέχνη" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Διαχωρισμός του _Εκτελεστή από τον Καλλιτέχνη" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "Διαχωρισμός του _Εκτελεστή από τον Τίτλο" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "Διαχωρισμός του _Αρχικού Καλλιτέχνη από τον Τίτλο" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Προσθήκη Ετικέτας" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "Ε_τικέτα:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Επεξεργασία Ετικετών" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Εμφάνιση _προγραμματικών ετικετών" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Επεξεργασία όλων των ετικετών, συμπεριλαμβανομένων και των αυτόματα " "δημιουργημένων απο λογισμικό όπως π.χ. MusicBrainz ή ετικέτες του Replay Gain" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 msgctxt "edittags" msgid "_Revert" msgstr "Επαναφο_ρά" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "_Αποθήκευση" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Αδυναμία προσθήκης ετικέτας" #: ../quodlibet/qltk/edittags.py:660 #, python-format msgid "Unable to add <b>%s</b>" msgstr "Αδυναμία προσθήκης <b>%s></b>" #: ../quodlibet/qltk/edittags.py:662 #, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "Τα επιλεγμένα αρχεία δεν υποστηρίζουν πολλαπλές τιμές <b>%s</b>." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Μη έγκυρη ετικέτα" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Μη έγκυρη ετικέτα <b>%s</b>\n" "\n" "Τα επιλεγμένα αρχεία δεν υποστηρίζουν επεξεργασία αυτής της ετικέτας." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Μη έγκυρη τιμή" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Μη έγκυρη τιμή: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Η ετικέτα ίσως να μην είναι ακριβής" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "Το %(file-name)s άλλαξε ενώ το πρόγραμμα εκτελούταν. Η αποθήκευση χωρίς " "ανανέωση της μουσικοθήκης ίσως αντικαταστήσει άλλες αλλαγές στο τραγούδι." #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Αδυναμία αποθήκευσης τραγουδιού" #: ../quodlibet/qltk/_editutils.py:50 #, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Η αποθήκευση του %(file-name)s απέτυχε. Το αρχείο ίσως είναι μόνο για " "ανάγνωση, κατεστραμμένο, ή δεν έχετε δικαιώματα επεξεργασίας του." #: ../quodlibet/qltk/_editutils.py:142 msgid "_More options…" msgstr "_Περισσότερες επιλογές…" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "_Αναίρεση" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "_Ξανακάνε" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "Σ_χετικά" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Πρόσθετα" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s και %(count)d ακόμη" msgstr[1] "%(title)s και %(count)d ακόμη" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Προτιμήσεις του Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Διαχωρισμός _στο:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Επεξεργασία ετικετών" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Φάκελοι" #: ../quodlibet/qltk/filesel.py:253 msgid "_New Folder…" msgstr "_Νέος Φάκελος…" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Επιλογή όλων των Υποφακέλων" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Νέος Φάκελος" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Εισάγετε όνομα για τον νέο φάκελο:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Αδυναμία δημιουργίας φακέλου" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Αδυναμία διαγραφής φακέλου" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Τραγούδια" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "από %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Δίσκος %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Κομμάτι %s" #: ../quodlibet/qltk/info.py:108 msgid "_Edit Display…" msgstr "_Επεξεργασία Εμφάνισης…" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Δεν υπάρχουν επιλεγμένα τραγούδια." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Κανένα Τραγούδι" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Πληροφορίες" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Στίχοι" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Παραγωγή από %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "καλλιτέχνης" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "καλλιτέχνες" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "εκτελεστές" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Ποτέ" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d φορά" msgstr[1] "%(n)d φορές" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "προστέθηκε" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "τελευταία αναπαραγωγή" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "αναπαραγωγές" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "παραλήψεις" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "βαθμολογία" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "διάρκεια" #: ../quodlibet/qltk/information.py:289 msgid "format" msgstr "μορφή" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "Αύξουσα" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "μέγεθος αρχείου" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "τροποποίηση" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d επιλεγμένο" msgstr[1] "%d επιλεγμένα" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Μη διαθέσιμο κομμάτι" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Λίστα Κομματιών" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d τραγούδι χωρίς άλμπουμ" msgstr[1] "%d τραγούδια χωρίς άλμπουμ" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Επιλεγμένη Δισκογραφία" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d τραγούδι χωρίς καλλιτέχνη" msgstr[1] "%d τραγούδια χωρίς καλλιτέχνες" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "άλμπουμ" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Συνολική διάρκεια:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Συνολικό μέγεθος:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Αρχεία" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Λήψη" #: ../quodlibet/qltk/lyrics.py:40 msgid "_Edit" msgstr "_Επεξεργασία…" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Δεν βρέθηκαν στίχοι γι' αυτό το τραγούδι." #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "Αναζήτηση στίχων…" #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "Θέλετε σίγουρα να αφαιρέσετε όλα τα τραγούδια;" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "Τα επιλεγμένα τραγούδια θα αφαιρεθούν από τη μουσικοθήκη." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "Επανεμφάνιση" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "Επανεμ_φάνιση" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Απόρριψη αλλαγών στις ετικέτες;" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Ετικέτες έχουν αλλαχθεί αλλά δεν έχουν αποθηκευθεί. Αποθήκευση αυτών των " "αρχείων ή επαναφορά και απόρριψη των αλλαγών;" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 msgid "_Revert" msgstr "Επανέφε_ρε" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Το αρχείο υπάρχει" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "Αντικατάσταση του %(file-name)s;" #: ../quodlibet/qltk/msg.py:94 msgid "_Replace File" msgstr "Αντικατάσταση Α_ρχείου" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Ενεργές διεργασίες" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d διεργασίες εκτελούνται" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Εναλλαγή αναπαραγωγής/παύσης" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Εναλλαγή αναπαραγωγής/παύσης" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Σφάλματα Πρόσθετων" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Ενεργοποιημένα" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Απενεργοποιημένα" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Χωρίς κατηγορία" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Σειρά Αναπαραγωγής" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Επεξεργασία ετικετών" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Μέγεθος _Εξώφυλλου:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Δεν βρέθηκαν πρόσθετα." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Πρόσθετα" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Εμφάνιση _Λαθών" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Δίσκος" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Κομμάτι" #: ../quodlibet/qltk/prefs.py:47 msgid "Grou_ping" msgstr "Ομα_δοποίηση" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Ά_λμπουμ" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Ό_νομα Αρχείου" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Διάρκεια" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "Α_υτόματη μεταπήδηση στο αναπαραγώμενο τραγούδι" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Όταν το αναπαραγώμενο τραγούδι αλλάζει, μετάβαση σε αυτό στην λίστα " "τραγουδιών" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "Ά_λλα:" #: ../quodlibet/qltk/prefs.py:88 msgid "_Edit…" msgstr "_Επεξεργασία…" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Προσθαφαίρεση κεφαλίδων στηλών" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Ορατές Στήλες" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Ο Τίτλος να περιλαμβάνει την έκ_δοση" #: ../quodlibet/qltk/prefs.py:106 msgid "Artist includes all _people" msgstr "Το πεδίο Καλλιτέχνης συμπεριλαμβάνει τα ονόματα όλων των συντελεστών" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Το Άλμπουμ περιλαμβάνει τον υπότιτλο του _δίσκου" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Το Όνομα Αρχείου συμπεριλαμβάνει και τον _φάκελο" #: ../quodlibet/qltk/prefs.py:123 msgid "Column Preferences" msgstr "Προτιμήσεις Στηλών" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Εφαρμογή τρεχόντων ρυθμίσεων στην λίστα τραγουδιών, προσθέτοντας νέες στήλες " "στο τέλος" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Λίστα Τραγουδιών" #: ../quodlibet/qltk/prefs.py:222 msgid "Edit Columns" msgstr "Επεξεργασία Στηλών" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "Κα_θολικό φίλτρο:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Εφαρμογή αυτού του ερωτήματος επιπροσθέτως από όλα τα άλλα" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 msgctxt "heading" msgid "Search" msgstr "Αναζήτηση" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Περιηγητές" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Επιβεβαίωση πο_λλαπλών βαθμολογήσεων" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Ζήτησε επιβεβαίωση πριν αλλάξεις τις βαθμολογίες πολλαπλών τραγουδιών " "μονομιάς" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Ενεργοποίηση βαθμολόγησης με έ_να κλικ" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Επέτρεψε τη βαθμολόγηση κάνοντας κλικ στην στήλη βαθμολογίας της λίστας " "τραγουδιών" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Βαθμολογίες" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Προτίμηση _ενσωματωμένων εικόνων" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Χρήση εξώφυλλων ενσωματωμένων στο αρχείο ήχου (όταν είναι διαθέσιμο) αντί " "από άλλες πηγές" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "Ε_ξαναγκασμός ονόματος αρχείου εικόνας:" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "Το όνομα αρχείου εικόνας που θα χρησιμοποιηθεί υποχρεωτικά" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "Το όνομα αρχείου εικόνας που θα χρησιμοποιηθεί υποχρεωτικά" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Εξώφυλλα Άλμπουμ" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Αναπαραγωγή" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Ρύθμιση Εξόδου" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Αν δεν είναι διαθέσιμες πληροφορίες Replay Gain για ένα τραγούδι, κλιμάκωσε " "την ένταση του ήχου κατά αυτή την τιμή" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "Εναλλακτική τιμή gain (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Κλιμάκωσε την ένταση για όλα τα τραγούδια κατά αυτή την τιμή, αρκεί να μην " "υπάρξει αποκοπή" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "Gain _προενίσχυσης (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "_Ρύθμιση της έντασης ήχου από το Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Ρύθμισης Έντασης Replay Gain" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "_Προεπιλεγμένη βαθμολογία:" #: ../quodlibet/qltk/prefs.py:493 msgid "Rating _scale:" msgstr "_Βαθμολογική κλίμακα:" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Μέσος Μπαγεσιανός παράγοντας (C) για την συγκεντρωτική βαθμολογία.\n" "Το 0 σημαίνει χρήση συμβατικού μέσου όρου, υψηλότερες τιμές σημαίνουν πως τα " "άλμπουμ με λίγα τραγούδια θα έχουν λιγότερο ακραίες βαθμολογίες. Αν αλλαχθεί " "αυτή η τιμή ενεργοποιείται επανυπολογισμός για όλα τα άλμπουμ." #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "_Μπαγεσιανός παράγοντας μέσου όρου:" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Αποθήκευση βαθμολογιών και _μετρητών αναπαραγωγών" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "Διεύθυνση ηλεκτρονικού _ταχυδρομείου:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "Οι βαθμολογίες και οι μετρητές αναπαραγωγών θα καθοριστούν γι' αυτή την " "διεύθυνση" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Αυτόματη αποθήκευση αλλαγών στις ετικέτες" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Αποθήκευση αλλαγών στις ετικέτες χωρίς επιβεβαίωση όταν γίνεται επεξεργασία " "πολλαπλών αρχείων" #: ../quodlibet/qltk/prefs.py:587 #, fuzzy msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Λίστα διαχωριστών που θα χρησιμοποιηθούν κατά των διαχωρισμό τιμών ετικετών. " "Η λίστα είναι διαχωρισμένη με κενά" #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Ετικέτες" #: ../quodlibet/qltk/prefs.py:631 msgid "Updating for new ratings" msgstr "Ανανέωση για τις νέες βαθμολογίες" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "_Ανανέωση της μουσικοθήκης κατά την εκκίνηση" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Αναζήτηση στην Μουσικοθήκη" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Έλεγχος για αλλαγές στην μουσικοθήκη σας" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "_Επαναφόρτωση Μουσικοθήκης" #: ../quodlibet/qltk/prefs.py:661 msgid "Reload all songs in your library. This can take a long time." msgstr "" "Επαναφόρτωση όλων των τραγουδιών της μουσικοθήκης σας. Πιθανό να χρειαστεί " "αρκετό χρόνο." #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "Σάρωση Καταλόγων" #: ../quodlibet/qltk/prefs.py:677 msgid "Hidden Songs" msgstr "Κρυμμένα Τραγούδια" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s και %(count)d ακόμη" msgstr[1] "%(title)s και %(count)d ακόμη" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Ιδιότητες" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Ουρά Αναπαραγωγής" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Καθαρισμός" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d τραγούδι (%(time)s)" msgstr[1] "%(count)d τραγούδια (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Περιήγηση στην Μουσικοθήκη" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Εναλλαγή ορατότητας κυρίου παραθύρου" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "Σφάλμα Αναπαραγωγής" #: ../quodlibet/qltk/quodlibetwindow.py:524 msgid "Set up library directories?" msgstr "Να οριστούν οι κατάλογοι της μουσικοθήκης;" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "Δεν έχετε ορίσει την μουσικοθήκη σας. Θα θέλατε να το κάνετε τώρα;" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "_Αργότερα" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "_Ρύθμιση" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Αδυναμία προσθήκης τραγουδιών" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, python-format msgid "%s uses an unsupported protocol." msgstr "Το πρωτόκολλο του %s δεν υποστηρίζεται." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Μεταπήδηση στο Αναπαραγώμενο Τραγούδι" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Αρχείο" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Τραγούδια" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Προβολή" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Περιηγητές" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "Έ_λεγχος" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Βοήθεια" #: ../quodlibet/qltk/quodlibetwindow.py:997 msgid "_Add a Folder…" msgstr "Προσθήκη _Φακέλου…" #: ../quodlibet/qltk/quodlibetwindow.py:1002 msgid "_Add a File…" msgstr "Προσθήκη _Αρχείου…" #: ../quodlibet/qltk/quodlibetwindow.py:1007 msgid "_Add a Location…" msgstr "Προσθήκη _Τοποθεσίας" #: ../quodlibet/qltk/quodlibetwindow.py:1036 msgid "Edit Bookmarks…" msgstr "Επεξεργασία Σελιδοδεικτών…" #: ../quodlibet/qltk/quodlibetwindow.py:1056 msgid "Stop After This Song" msgstr "Σταμάτησε μετά από αυτό το τραγούδι" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Βοήθεια στο Διαδίκτυο" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Αναζήτηση στη Βοήθεια" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Προσθήκη Τοποθεσίας" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Εισάγετε την τοποθεσία ενός αρχείου ήχου:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Αδυναμία προσθήκης τοποθεσίας" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, python-format msgid "%s is not a valid location." msgstr "Το %s δεν είναι έγκυρη τοποθεσία." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Προσθήκη Μουσικής" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "Προσθήκη _Φακέλου…" #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Αναπαραγωγή Μουσικής" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Προσθήκη _Αρχείου…" #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Σίγουρα θέλετε να αλλάξετε βαθμολογία και στα %d τραγούδια;" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "Οι αποθηκευμένες βαθμολογίες θα διαγραφούν" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Η βαθμολογία όλων των επιλεγμένων τραγουδιών θα αλλαχθεί σε '%s'" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 msgid "_Remove Rating" msgstr "_Διαγραφή Βαθμολογίας" #: ../quodlibet/qltk/ratingsmenu.py:98 msgid "Change _Rating" msgstr "Αλλαγή _Βαθμολογίας" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Αντικατάσταση κενών με _κάτω παύλες" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Αφαίρεση χαρακτήρων μη συμβατών με τα _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Αφαίρεση _διακριτικών συμβόλων" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Αφαίρεση μη-_ASCII χαρακτήρων" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Χρήση μόνο πε_ζών γραμμάτων" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Μετονομασία Αρχείων" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Πρότυπα Διαδρομών" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 msgid "Edit saved patterns…" msgstr "Επεξεργασία αποθηκευμένων προτύπων…" #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Προεπισκόπηση" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Νέο Όνομα" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Αδυναμία μετονομασίας αρχείου" #: ../quodlibet/qltk/renamefiles.py:256 #, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Η μετονομασία του <b>%(old-name)s</b> σε <b>%(new-name)s</b> απέτυχε. " "Πιθανότατα το αρχείο προορισμού υπάρχει ήδη, ή δεν έχετε δικαιώματα " "δημιουργίας νέου αρχείου ή διαγραφής του παλιού." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Αγνόηση Όλων των Σ_φαλμάτων" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "Συνέ_χεια" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Η διαδρομή αρχείου δεν είναι απόλυτη" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Το πρότυπο\n" "\t<b>%s</b>\n" "περιέχει το / μα δεν ξεκινά από τη βάση του συστήματος αρχείων. Για να " "αποφύγετε λάθος ονομασμένους φακέλους, ξεκινήστε το πρότυπό σας με / ή ~/." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Τραγούδια από τους εμφανιζόμενους φακέλους θα προστεθούν στην μουσικοθήκη " "σας μετά από ανανέωση" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Επιλεγμένοι Κατάλογοι" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Αποθηκευμένες Αναζητήσεις" #: ../quodlibet/qltk/searchbar.py:53 msgid "Edit saved searches…" msgstr "Επεξεργασία αποθηκευμένων αναζητήσεων…" #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" "Αναζήτηση στην μουσικοθήκη σας, με χρήση ελεύθερου κειμένου ή ερωτημάτων QL" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Αναζήτηση με την _πληκτρολόγηση" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" "Εμφάνισε τα αποτελέσματα αναζήτησης αφού ο χρήστης σταματήσει την " "πληκτρολόγηση" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "Ό_ριο:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Βαρύτητα" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Προβολή χρόνου που υπολείπεται" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Παράθυρο Στίχων" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Εστίαση του εκτελούμενου αναπαραγωγέα" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Αναζήτηση στο αναπαραγόμενο τραγούδι" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Αδυναμία διαγραφής τραγουδιών" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Αδυναμία διαγραφής τραγουδιών" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 #, fuzzy msgid "Expands the element" msgstr "_Επέκταση Στήλης" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Φίλτρο στο %s" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "Όλες οι Κε_φαλίδες" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Κεφαλίδες _Κομματιών" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Κεφαλίδες Ά_λμπουμ" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Κεφαλίδες _Συντελεστών" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Κεφαλίδες _Ημερομηνιών" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Κεφαλίδες Αρ_χείων" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Κεφαλίδες Παρα_γωγής" #: ../quodlibet/qltk/songlist.py:1115 msgid "_Customize Headers…" msgstr "Προσαρμογή _Κεφαλίδων…" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "_Επέκταση Στήλης" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "Εκτέλεση του πρόσθετου \"%(name)s\" σε %(count)d τραγούδι;" msgstr[1] "Εκτέλεση του πρόσθετου \"%(name)s\" σε %(count)d τραγούδια;" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "Εκτέλεση του πρόσθετου \"%(name)s\" σε %(count)d άλμπουμ;" msgstr[1] "Εκτέλεση του πρόσθετου \"%(name)s\" σε %(count)d άλμπουμ;" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Επεξεργασία αναζητήσεων…" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Προσθήκη στην _Ουρά" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "Αντιγραφή στην _Συσκευή" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "Α_φαίρεση από την μουσικοθήκη" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Αντικατάσταση _κάτω παύλων με κενά" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Κάντε _Κεφαλαία Τα Πρώτα Γράμματα Κάθε Λέξης Στις Ετικέτες" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Διαχωρισμός σε πο_λλαπλές τιμές" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Ετικέτες από την Διαδρομή Αρχείου" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Οι ετικέτες αντικαθιστούν τις ήδη υπάρχουσες" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Οι ετικέτες προστίθενται στις ήδη υπάρχουσες" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "Αποθήκευση" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Το πρότυπο\n" "\t<b>%s</b>\n" "δεν είναι έγκυρο. Πιθανότατα περιέχει την ίδια ετικέτα δύο φορές ή έχει μη " "ισορροπημένες γωνιακές αγκύλες (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Μη έγκυρες ετικέτες" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Μη έγκυρες ετικέτες <b>%s</b>\n" "\n" "Τα επιλεγμένα αρχεία δεν υποστηρίζουν την επεξεργασία αυτών των ετικετών." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Το πρότυπο που εισάγατε δεν ήταν έγκυρο. Βεβαιωθείτε πως εισάγετε τα < " "και > ως \\< και \\> και πως οι ετικέτες σας είναι ισορροπημένες.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Επεξεργασία Προβολής" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Αριθμοί Κομματιών" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Αρ_χή από:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "Συνολικός αριθμός κομματιών:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Αναπαραγωγή/Παύση" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Προηγούμενο" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "και %d ακόμη…" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Αποθήκευση των τραγουδιών που επεξεργαστήκατε" #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d τραγούδια αποθηκεύτηκαν\n" "(%(remaining)s απομένουν)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "%(current)d από %(all)d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Έλεγχος σημείων προσάρτησης" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "Σύνδεση" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Υπάρχει ήδη λίστα αναπαραγωγής με το όνομα %s." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Επαναφόρτωση ε_ξώφυλλου του άλμπουμ" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "Χρήση ενσωματωμένων εξώφυλλων άλμπουμ." #: ../quodlibet/util/cover/built_in.py:49 msgid "Filesystem cover" msgstr "Εξώφυλλο άλμπουμ από το σύστημα αρχείων" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "Χρήση εικόνων που βρίσκονται στον κατάλογο μαζί με το τραγούδι" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Προβολή σύντομων πληροφοριών χρήσης" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Προβολή έκδοσης και πνευματικών δικαιωμάτων" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Χρήση: %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[επιλογές]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Η επιλογή %r δεν αναγνωρίστηκε" #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Η επιλογή %r χρειάζεται ένα όρισμα" #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "Το %r δεν είναι μοναδικά ταυτοποιήσιμο πρόθεμα" #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d δευτερόλεπτο" msgstr[1] "%d δευτερόλεπτα" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Χωρίς πληροφορίες χρόνου" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d δευτερόλεπτο" msgstr[1] "%d δευτερόλεπτα" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d λεπτό" msgstr[1] "%d λεπτά" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d ώρα" msgstr[1] "%d ώρες" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d ημέρα" msgstr[1] "%d ημέρες" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d χρόνος" msgstr[1] "%d χρόνια" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 msgctxt "check" msgid "titlecase?" msgstr "" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Η ημερομηνία πρέπει να εισαχθεί με μορφή 'ΧΧΧΧ', 'ΧΧΧΧ-ΜΜ-ΗΗ' ή 'ΧΧΧΧ-ΜΜ-ΗΗ " "ΩΩ:ΛΛ:ΔΔ'." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Οι ενισχύσεις του Replay Gain πρέπει να εισαχθούν με μορφή 'x.yy dB'." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Οι μέγιστες κορυφές Replay Gain πρέπει να εισαχθούν σε μορφή 'x.yy'." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "Οι ταυτότητες του MusicBrainz πρέπει να είναι σε μορφή UUID." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Η κατάσταση κυκλοφορίας του MusicBrainz πρέπει να είναι 'επίσημη', " "'διαφημιστική' ή 'πειρατική'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Η γλώσσα πρέπει να είναι σε μορφή κώδικα τριών γραμμάτων ISO 639-2" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Αδυναμία επεξεργασίας τραγουδιού" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Η αποθήκευση του <b>%s</b> απέτυχε. Το αρχείο ίσως είναι μόνο για ανάγνωση, " "κατεστραμμένο, ή δεν έχετε δικαιώματα επεξεργασίας του." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Μη έγκυρη Κωδικοποίηση]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "άλμπουμ" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "διευθετών" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "διευθετώντες" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "διευθέτηση" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "συγγραφέας" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "συγγραφείς" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "συνθέτης" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "συνθέτες" #: ../quodlibet/util/tags.py:78 msgid "composition" msgstr "σύνθεση" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "διευθυντής ορχήστρας" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "διευθυντές ορχήστρας" #: ../quodlibet/util/tags.py:80 msgid "conducting" msgstr "διεύθυνση ορχήστρας" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "σύνδεσμος" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "πνευματική ιδιοκτησία" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "ημερομηνία" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "περιγραφή" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "είδος" #: ../quodlibet/util/tags.py:85 msgid "genres" msgstr "είδη" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "εκτελεστής" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "ομαδοποίηση" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "γλώσσα" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "άδεια" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "τοποθεσία" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "στιχουργός" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "στιχουργοί" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "στιχουργός" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "οργάνωση" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "τίτλος" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "έκδοση" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "ιστοσελίδα" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "καλλιτέχνης άλμπουμ" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "ρυθμός (BPM - διακροτήματα ανά λεπτό)" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "υπότιτλος δίσκου" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "δίσκος" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "κομμάτι" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "δισκογραφική ταυτότητα" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "ημερομηνία αρχικής κυκλοφορίας" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "αρχικό άλμπουμ" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "αρχικός καλλιτέχνης" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "ημερομηνία ηχογράφησης" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "χώρα κυκλοφορίας" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz recording ID" msgstr "Ταυτότητα ηχογράφησης MusicBrainz" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz release track ID" msgstr "Ταυτότητα κυκλοφορίας κομματιού MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "Ταυτότητα κυκλοφορίας MusicBrainz" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz artist ID" msgstr "Ταυτότητα καλλιτέχνη MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz release artist ID" msgstr "Ταυτότητα καλλιτέχνη κυκλοφορίας MusicBrainz" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "Ταυτότητα TRM MusicBrainz" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "Ταυτότητα PUID MusicBrainz" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "Κατάσταση κυκλοφορίας άλμπουμ MusicBrainz" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Τύπος άλμπουμ MusicBrainz" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "Ταυτότητα κυκλοφορίας MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "ενίσχυση κομματιού" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "ηχητική κορυφή κομματιού" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "ενίσχυση άλμπουμ" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "ηχητική κορυφή άλμπουμ" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "ηχητική ένταση αναφοράς" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "δίσκοι" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "κομμάτια" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "τελευταία εκκίνηση αναπαραγωγής" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "πλήρες όνομα" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "σημείο προσάρτησης" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "συντελεστές" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "έτος" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "έτος αρχικής κυκλοφορίας" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "σελιδοδείκτης" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "τύπος αρχείου" #: ../quodlibet/util/tags.py:165 msgid "playlists" msgstr "λίστες αναπαραγωγής" #: ../quodlibet/util/tags.py:166 #, fuzzy msgid "channel count" msgstr "Λογαριασμός" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "ταξινόμηση" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "ρόλοι" #, fuzzy #~ msgid "browsers" #~ msgstr "Περιηγητές" #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "" #~ "Δεν μπόρεσα να εισάγω τη λειτουργία %s, ο περιηγητής ροών ήχου " #~ "απενεργοποιήθηκε." #~ msgid "Controls the tone of your music with an equalizer." #~ msgstr "Έλεγχος της χροιάς της μουσικής σας με χρήση αντισταθμιστή." #~ msgid "Event Logging" #~ msgstr "Καταγραφή Συμβάντων" #~ msgid "Sends song events to the Zeitgeist event logging service." #~ msgstr "Αποστολή συμβάντων αναπαραγωγής στην υπηρεσία καταγραφής Zeitgeist." #~ msgid "Audio Backend Failed to Load" #~ msgstr "Αδυναμία Φόρτωσης Ηχητικού Συστήματος" #~ msgid "" #~ "Loading the audio backend '%(name)s' failed. Audio playback will be " #~ "disabled." #~ msgstr "" #~ "Η φόρτωση του ηχητικού συστήματος '%(name)s' απέτυχε. Η αναπαραγωγή ήχου " #~ "θα απενεργοποιηθεί." #~ msgid "_Open" #~ msgstr "Άν_οιγμα" #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Σημειώθηκε μια εξαίρεση στον Quod Libet. Ένα αρχείο καταγραφής σώθηκε στο " #~ "<b>%(dump-path)s</b> που θα βοηθήσει στην επίλυση του σφάλματος. Παρακαλώ " #~ "καταχωρήστε μια αναφορά στο %(new-issue-url)s και συμπεριλάβετε αυτό το " #~ "αρχείο. Αυτό το αρχείο ίσως περιέχει στοιχεία που προσωποποιούν εσάς ή το " #~ "σύστημά σας, π.χ. η λίστα των πρόσφατα παιγμένων αρχείων σας. Αν αυτό δεν " #~ "είναι επιθυμητό στείλτε το αρχείο <b>%(mini-dump-path)s</b> μαζί με μια " #~ "περιγραφή του τι κάνατε." #~ msgid "" #~ "Quod Libet may now be unstable. Closing it and restarting is recommended. " #~ "Your library will be saved." #~ msgstr "" #~ "Ο Quod Libet ίσως είναι ασταθής. Συνίσταται επανεκκίνησή του. Η " #~ "μουσικοθήκη σας θα αποθηκευθεί." #~ msgid "Unable to download lyrics." #~ msgstr "Αδυναμία λήψης στίχων." #~ msgid "Remove all songs from the queue" #~ msgstr "Αφαίρεση όλων των τραγουδιών από τη ουρά" #~ msgid "Watch this folder for new songs" #~ msgstr "Παρακολούθηση αυτού του φακέλου για νέα τραγούδια" #~ msgid "Set or toggle the playback order" #~ msgstr "Καθορισμός ή εναλλαγή της σειράς αναπαραγωγής" #~ msgid "Uninitialized iPod" #~ msgstr "Μη αρχικοποιημένο iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Θέλεις να δημιουργήσεις μια άδεια βάση δεδομένων σε αυτό το iPod;" #~ msgid "_Create Database" #~ msgstr "_Δημιουργία βάσης δεδομένων" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Αύξηση Ήχου (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Συνδύασε ετικέτες με _πολλαπλές τιμές" #~ msgid "Model:" #~ msgstr "Μοντέλο:" #~ msgid "Capacity:" #~ msgstr "Χωρητικότητα:" #~ msgid "Firmware:" #~ msgstr "Έκδοση Υλικολογισμικού:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Removing orphaned iPod track" #~ msgid "Saving iPod database…" #~ msgstr "Αποθήκευση της βάσης δεδομένων του iPod…" #~ msgid "Unable to save iPod database" #~ msgstr "Αδυναμία αποθήκευσης της βάσης δεδομένων του iPod" #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "Δεν βρέθηκε το libgpod, η υποστήριξη iPod απενεργοποιήθηκε." #~ msgid "Playback follows your selection." #~ msgstr "Αναπαραγωγή επιλεγμένων τραγουδιών." #~ msgid "Track Repeat" #~ msgstr "Επανάληψη Κομματιού" #~ msgid "Shuffle" #~ msgstr "Ανακάτεμα" #~ msgid "Weighted" #~ msgstr "Με τη Βαρύτητα" #~ msgid "_Weighted" #~ msgstr "Με τη _Βαρύτητα" #~ msgid "_One Song" #~ msgstr "Ένα _Τραγούδι" #~ msgid "Restart the playlist when finished" #~ msgstr "Εκκίνηση ξανά της λίστας αναπαραγωγής όταν φτάσει στο τέλος" #~ msgid "Disable Browser" #~ msgstr "Απενεργοποίηση Περιηγητή" #~ msgid "_Disable Browser" #~ msgstr "_Απενεργοποίηση Περιηγητή" #~ msgid "Use header bars" #~ msgstr "Χρήση επικεφαλίδων παραθύρων GNOME" #~ msgid "Force Write" #~ msgstr "Υποχρεωτική Αποθήκευση" #~ msgid "Filter on _Genre" #~ msgstr "Φίλτρο στο _Είδος" #~ msgid "Filter on _Artist" #~ msgstr "Φίλτρο στον _Καλλιτέχνη" #~ msgid "Filter on Al_bum" #~ msgstr "Φίλτρο στο Ά_λμπουμ" #~ msgid "_Music" #~ msgstr "_Μουσική" #~ msgid "Add Bookmark" #~ msgstr "Προσθήκη Σελιδοδείκτη" #~ msgid "Song _List" #~ msgstr "_Λίστα Τραγουδιών" #, fuzzy #~ msgid "Rate the selected songs with 0-4 stars" #~ msgstr "Εξαγωγή της λίστας επιλεγμένων τραγουδιών σε HTML." #~ msgid "Embed cover" #~ msgstr "Ενσωμάτωσε το εξωφύλλο άλμπουμ" #~ msgid "D:" #~ msgstr "Α:" #~ msgid "W:" #~ msgstr "Π:" #~ msgid "E:" #~ msgstr "Σ:" #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "Ο τροχός του ποντικιού αλλάζει τραγούδια\n" #~ "Ο τροχός με πατημένο το Shift αυξομειώνει την ένταση" #~ msgid "Stop _after this song" #~ msgstr "Σταμάτησε _μετά από αυτό το τραγούδι" #~ msgid "_Release:" #~ msgstr "_Κυκλοφορία:" #~ msgid "%d _release:" #~ msgid_plural "%d _releases:" #~ msgstr[0] "%d _κυκλοφορία:" #~ msgstr[1] "%d _κυκλοφορίες:" #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "Βρέθηκε %d αποτέλεσμα." #~ msgstr[1] "Βρέθηκαν %d αποτελέσματα." #~ msgid "Split _disc from album" #~ msgstr "_Διαχωρισμός του δίσκου από το άλμπουμ" #~ msgid "Split _featured performers from track" #~ msgstr "Διαχωρισμός των εμφανιζόμενων (_featured) εκτελεστών από το κομμάτι" #~ msgid "Write _labelid tag (fixes multi-disc albums)" #~ msgstr "Εγγραφή ετικέτας _labelid (διορθώνει άλμπουμ με πολλαπλούς δίσκους)" #~ msgid "CDDB Lookup" #~ msgstr "Αναζήτηση σε CDDB" #~ msgid "Looks up album information in FreeDB. Requires CDDB.py." #~ msgstr "Εύρεση πληροφοριών άλμπουμ στο FreeDB. Χρειάζεται το CDDB.py." #~ msgid "Timeout" #~ msgstr "Χρονικό όριο" #~ msgid "Query could not be executed, connection timed out" #~ msgstr "Η αναζήτηση απέτυχε, υπέρβαση χρονικού ορίου" #~ msgid "Select an album" #~ msgstr "Επιλέξτε ένα άλμπουμ" #~ msgid "Select the album you wish to retrieve." #~ msgstr "Επιλέξτε το άλμπουμ που θέλετε να ανακτήσετε." #~ msgid "CDDB lookup failed (%s)" #~ msgstr "Η αναζήτηση στο CDDB απέτυχε (%s)" #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s και %(count)d ακόμη…" #~ msgstr[1] "%(title)s και %(count)d ακόμη…" #~ msgid "Send To…" #~ msgstr "Αποστολή Σε…" #~ msgid "Generic file-opening plugin." #~ msgstr "Γενικό πρόσθετο ανοίγματος αρχείων." #~ msgid "Playlist Export" #~ msgstr "Εξαγωγή Λίστας Αναπαραγωγής" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "_Χρήση στρογγυλεμένων γωνιών στις εικόνες επισκόπησης" #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "Στρογγύλεψε τις γωνίες των μικρογραφιών των εξώφυλλων άλμπουμ." #~ msgid "Re_fresh Library" #~ msgstr "_Ανανέωση Μουσικοθήκης" #~ msgid "_Remove rating" #~ msgstr "_Διαγραφή βαθμολογίας" #~ msgid "Unable to open input files" #~ msgstr "Αδυναμία ανοίγματος αρχείων" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "Το GStreamer δεν έχει κάποιο στοιχείο για να χειριστεί την ανάγνωση " #~ "αρχείων. Ελέγξτε τις ρυθμίσεις εγκατάστασης του GStreamer." #~ msgid "Invalid audio backend" #~ msgstr "Μη έγκυρο ηχητικό σύστημα υποστήριξης" #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "" #~ "Δεν ήταν δυνατό να φορτωθεί η υποστήριξη ηχητικού συστήματος '%(backend-" #~ "name)s'." #~ msgid "Print all tags to stdout" #~ msgstr "Εκτύπωση όλων των ετικετών στην κανονική έξοδο" #~ msgid "Load tags dumped with 'dump'" #~ msgstr "Φόρτωση ετικετών από προηγούμενη εκτύπωση στην έξοδο" #~ msgid "command|filename" #~ msgstr "εντολή|όνομα αρχείου" #~ msgid "command|tag" #~ msgstr "εντολή|ετικέτα" #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: Δεν βρέθηκε το 'libudev'." #, fuzzy #~ msgid "<i>Searching…</i>" #~ msgstr "<i>Αναζητείται…</i>" #~ msgid "" #~ "You can access the following objects by default:\\n '%s' (SongWrapper " #~ "objects)\\n '%s' (Song dictionaries)\\n '%s' (Filename list)\\n " #~ "'%s' (Application instance)" #~ msgstr "" #~ "Έχετε πρόσβαση σε αυτά τα αντικείμενα εξ' ορισμού:\n" #~ " '%s' (SongWrapper objects)\n" #~ " '%s' (Song dictionaries)\n" #~ " '%s' (Filename list)\n" #~ " '%s' (Application instance)" #~ msgid "" #~ "\n" #~ "\n" #~ "<i>Fingerprints:</i> %d/%d" #~ msgstr "" #~ "\n" #~ "\n" #~ "\n" #~ "<i>Αποτυπώματα:</i> %d/%d" #~ msgid "heading|Search" #~ msgstr "Αναζήτηση" #~ msgid "%d of %d" #~ msgstr "%d από %d" #~ msgid "Usage: %s %s\n" #~ msgstr "Χρήση: %s %s\n" #~ msgid "_Download..." #~ msgstr "_Κατέβασμα" #~ msgid "_New Station..." #~ msgstr "_Νέος Σταθμός..." #~ msgid "_New Playlist..." #~ msgstr "_Νέα Λίστα Αναπαραγωγής..." #~ msgid "Use LastFM database to fetch covers" #~ msgstr "Χρήση της βάσης δεδομένων του LastFM για την λήψη εξώφυλλων" #~ msgid "_Convert Encoding..." #~ msgstr "_Μετατροπή Κωδικοποίησης..." #~ msgid "A simple play order plugin that plays songs in reverse order." #~ msgstr "" #~ "Ένα απλό πρόσθετο σειράς αναπαραγωγής που παίζει τα τραγούδια σε " #~ "αντίστροφη σειρά." #~ msgid "" #~ "\n" #~ "<small>from <i>%s</i></small>" #~ msgstr "" #~ "\n" #~ "<small>από <i>%s</i></small>" #~ msgid "_Edit Bookmarks..." #~ msgstr "_Επεξεργασία Σελιδοδεικτών..." #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s και %(count)d ακόμη..." #~ msgstr[1] "%(title)s και %(count)d ακόμη..." #~ msgid "_New Folder..." #~ msgstr "_Νέος Φάκελος..." #~ msgid "_Edit Display..." #~ msgstr "_Επεξεργασία Εμφάνισης..." #~ msgid "Output Log" #~ msgstr "Καταγραφή Εξόδου" #~ msgid "_Add a Location..." #~ msgstr "Προσθήκη _Τοποθεσίας" #~ msgid "_Output Log" #~ msgstr "_Καταγραφή Εξόδου" #~ msgid "Warnings" #~ msgstr "Προειδοποιήσεις" #~ msgid "Errors" #~ msgstr "Σφάλματα" #~ msgid "General" #~ msgstr "Γενικά" #~ msgid "No log available." #~ msgstr "Δεν υπάρχει διαθέσιμη καταγραφή" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Αντικατάσταση του <b>%s</b>;" #~ msgid "Output Error" #~ msgstr "Σφάλμα Εξόδου" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "Η διασωλήνωση εξόδου του GStreamer δεν μπόρεσε να αρχικοποιηθεί. Ίσως να " #~ "μην είναι έγκυρη ή η συσκευή να είναι απασχολημένη. Ελέγξτε τις " #~ "προτιμήσεις." #~ msgid "Quod Libet is already running." #~ msgstr "Ο Quod Libet εκτελείται ήδη." #~ msgid "No song is currently playing." #~ msgstr "Κανένα τραγούδι δεν αναπαράγεται αυτή τη στιγμή." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Αδυναμία εγγραφής στο %s. Αφαίρεσή του." #~ msgid "_Add to Playlist" #~ msgstr "Προσθήκη στην _Λίστα Αναπαραγωγής" #~ msgid "%(song_count)d songs" #~ msgstr "%(song_count)d τραγούδια" #~ msgid "Are you sure?" #~ msgstr "Είστε σίγουρη/ος;" #~ msgid "Invalid command %r received." #~ msgstr "Ελήφθη μη έγκυρη εντολή %r." #~ msgid "Unknown browser %r." #~ msgstr "Άγνωστος περιηγητής %r." #~ msgid "Custom _Sort..." #~ msgstr "Προσαρμοσμένη _Ταξινόμηση..." #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "Σίγουρα θέλετε να τρέξετε το πρόσθετο \"%s\" σε %d τραγούδι;" #~ msgstr[1] "Σίγουρα θέλετε να τρέξετε το πρόσθετο \"%s\" σε %d τραγούδια;" #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "Σίγουρα θέλετε να τρέξετε το πρόσθετο \"%s\" σε %d άλμπουμ;" #~ msgstr[1] "Σίγουρα θέλετε να τρέξετε το πρόσθετο \"%s\" σε %d άλμπουμ;" #~ msgid "Track Headers" #~ msgstr "Κεφαλίδες Κομματιών" #~ msgid "People Headers" #~ msgstr "Κεφαλίδες Συντελεστών" #~ msgid "Album Headers" #~ msgstr "Κεφαλίδες Άλμπουμ" #~ msgid "Date Headers" #~ msgstr "Κεφαλίδες Ημερομηνιών" #~ msgid "File Headers" #~ msgstr "Κεφαλίδες Αρχείων" #~ msgid "Production Headers" #~ msgstr "Κεφαλίδες Παραγωγής" #~ msgid "Tag:" #~ msgstr "Ετικέτα:" #~ msgid "Descending" #~ msgstr "Φθήνουσα" #~ msgid "Too Many Errors" #~ msgstr "Υπερβολικά Πολλά Σφάλματα" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Σταματά η αναπαραγωγή διότι υπήρξαν %d συνεχόμενα σφάλματα." #~ msgid "album artist (sort)" #~ msgstr "καλλιτέχνης άλμπουμ (ταξινόμηση)" #~ msgid "artist (sort)" #~ msgstr "καλλιτέχνης (ταξινόμηση)" #~ msgid "album (sort)" #~ msgstr "άλμπουμ (ταξινόμηση)" #~ msgid "performer (sort)" #~ msgstr "εκτελεστής (ταξινόμηση)" #~ msgid "performers (sort)" #~ msgstr "εκτελεστές (ταξινόμηση)" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz Ταυτότητα καλλιτέχνη άλμπουμ" #~ msgid "errors" #~ msgstr "σφάλματα" #~ msgid "" #~ "Extract embedded images to <destination>/<filename>-<index>.(jpeg|png|..)" #~ msgstr "" #~ "Εξαγωγή των ενσωματωμένων εικόνων στο αρχείο <προορισμός>/<όνομα>-" #~ "<δείκτης>.(jpeg|png|..)" #~ msgid "Refresh Library" #~ msgstr "Ανανέωση της Μουσικοθήκης" #~ msgid "_Cause an Error" #~ msgstr "Πρόκληση _Λάθους" #~ msgid "Failed reading album art \"%s\"" #~ msgstr "Αποτυχία ανάγνωσης εξώφυλλου \"%s\"" #~ msgid "Permanently delete this file?" #~ msgstr "Μόνιμη διαγραφή αυτού του αρχείου;" #~ msgid "Permanently delete these files?" #~ msgstr "Μόνιμη διαγραφή αυτών των αρχείων;" #~ msgid "Version:" #~ msgstr "Έκδοση:" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "Το %s δεν μπόρεσε να προστεθεί στην μουσικοθήκη σας.\n" #~ "\n" #~ msgid "Error running command %r, caused by: %r." #~ msgstr "Σφάλμα κατά την εκτέλεση της εντολής %r, προκλήθηκε από: %r." #~ msgid "Do you wish to continue?" #~ msgstr "Θέλεις να συνεχίσεις;" #~ msgid "Confirm duplicates removal" #~ msgstr "Επιβεβαίωση αφαίρεσης διπλότυπων" #~ msgid "No eject command found." #~ msgstr "Δεν βρέθηκε εντολή εξαγωγής." #~ msgid "Unable to start web browser" #~ msgstr "Αδυναμία εκκίνησης περιηγητή διαδικτύου" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Δεν βρέθηκε περιηγητής διαδικτύου. Παρακαλώ καθορίστε την μεταβλητή " #~ "%BROWSER, ή βεβαιωθείτε πως το /usr/bin/sensible-browser υπάρχει." #~ msgid "" #~ "Cannot save library contents to %s (it's a directory). Please remove it " #~ "and try again." #~ msgstr "" #~ "Δεν μπορώ να αποθηκεύσω τα περιεχόμενα της μουσικοθήκης στο %s (είναι " #~ "κατάλογος). Παρακαλώ διαγράψτε το και προσπαθήστε ξανά." #~ msgid "Library Error" #~ msgstr "Σφάλμα Μουσικοθήκης" #~ msgid "_Output device:" #~ msgstr "_Συσκευή Εξόδου:" #~ msgid "translator-credits" #~ msgstr "Δημήτρης Παπαγεωργίου <dipap@gmx.com>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Άλλες στήλες για εμφάνιση, διαχωρισμένες με κενά" #~ msgid "_Edit and Continue" #~ msgstr "Επεξεργασία και Συνέχεια" #~ msgid "You are about to change the rating of %d song." #~ msgid_plural "You are about to change the rating of %d songs." #~ msgstr[0] "Πρόκειται να αλλάξεις τη βαθμολογία %d τραγουδιού." #~ msgstr[1] "Πρόκειται να αλλάξεις τη βαθμολογία %d τραγουδιών." #~ msgid "Confirm rating" #~ msgstr "Επιβεβαίωση βαθμολογίας" #~ msgid "Search your library" #~ msgstr "Αναζήτηση στην μουσικοθήκη σας" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Πνευματική ιδιοκτησία {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgid "%r doesn't contain any browsers." #~ msgstr "Το %r δεν περιέχει περιηγητές" #~ msgid "%r doesn't contain any devices." #~ msgstr "Το %r δεν περιέχει συσκευές." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: Δεν βρέθηκε το media-player-info." #~ msgid "Unkown" #~ msgstr "Άγνωστο" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/ru.po����������������������������������������������������������������������������0000644�0001750�0001750�00000663662�13115512745�015375� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Russian translation of Quod Libet # Copyright (C) 2005 THE quodlibet'S COPYRIGHT HOLDER # This file is distributed under the same license as the Quod Libet package. # Andrey Fedoseev <andrey.fedoseev@gmail.com>, 2005, 2006. # Sergey Fedoseev <fedoseev.sergey@gmail.com>, 2005, 2006. # Nikolai Prokoschenko <nikolai@prokoschenko.de>, 2005. # Russian L10N Team <debian-l10n-russian@lists.debian.org>, 2005. # # msgid "" msgstr "" "Project-Id-Version: Quod Libet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2015-01-05 14:45+0800\n" "Last-Translator: Anton Shestakov <engored@ya.ru>\n" "Language-Team: Russian\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.6.10\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Программа для редактирования тегов аудиофайлов" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Редактор тегов аудиофайлов" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Программа для прослушивания и управления фонотекой" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Музыкальный проигрыватель" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "_Название" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Исполнитель" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Дата" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "_Жанр" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "О_ценка" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 msgid "Sort _by…" msgstr "Сортировать _по…" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Настройки" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Список альбомов" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Список _альбомов" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Все альбомы" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d альбом" msgstr[1] "%d альбома" msgstr[2] "%d альбомов" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Обновить _обложку альбома" msgstr[1] "Обновить _обложки альбомов" msgstr[2] "Обновить _обложки альбомов" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Композиции, не входящие в альбомы" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d дорожка" msgstr[1] "%d дорожки" msgstr[2] "%d дорожек" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d диск" msgstr[1] "%d диска" msgstr[2] "%d дисков" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 msgid "An Example Album" msgstr "Наглядный пример" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Настройка списка альбомов" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Показывать обложки _альбомов" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "При быстром поиске _искать также исполнителей" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 msgid "Options" msgstr "Параметры" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Список альбомов" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Неизвестно" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Новая лента" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Введите адрес ленты аудиофайлов:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Ленты аудиофайлов" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Ленты аудиофайлов" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 msgid "_Download…" msgstr "_Загрузить…" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Загрузить файлы" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "Со_хранить" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Загрузить файл" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "С_оздать" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Не удалось добавить ленту" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "Не удалось добавить %s. Возможно, указанный сервер не работает или адрес не " "является лентой аудиофайлов." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 msgid "_Refresh" msgstr "Об_новить" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "_Удалить файлы" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Используемая система аудиовывода не поддерживает адреса URL. Поддержка лент " "аудиофайлов отключена." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Окно просмотра фонотеки" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d композиция" msgstr[1] "%d композиции" msgstr[2] "%d композиций" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Некорректный шаблон" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Коллекция альбомов" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "_Коллекция альбомов" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "Неизвестный %s" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "Несколько значений %s" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Особые" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Удалить оценку" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Тег" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Группировать" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Настройка коллекции альбомов" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Общий размер:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Общий размер:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Параметры просмотра" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Показывать обложки _альбомов" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Все альбомы" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "_Показать уведомление" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Файловая система" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Файловая система" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Не удалось скопировать композиции" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Выбранные файлы не могут быть скопированы в другой список воспроизведения " "или очередь." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Добавить в фонотеку" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Неподдерживаемый тип файла" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Списки станций могут содержать только местоположения станций, но не списки " "станций или списки воспроизведения. Не удалось загрузить следующие станции:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Не удалось добавить станцию" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Интернет-радио" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Загрузка списка станций" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Новая станция" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Введите адрес интернет-радиостанции:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "Загрузить список популярных радиостанций?" #: ../quodlibet/browsers/iradio.py:455 msgid "_Load Stations" msgstr "_Обновить список станций" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Интернет-радио" #: ../quodlibet/browsers/iradio.py:538 msgid "_New Station…" msgstr "_Новая станция…" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "_Обновить список станций" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Все станции" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Избранное" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Без категории" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Станций не найдено" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "По адресу %s интернет-радиостанций не найдено." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Все указанные станции уже находятся в фонотеке." #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "Добавить в избранное" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Удалить из избранного" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d станция" msgstr[1] "%(count)d станции" msgstr[2] "%(count)d станций" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Свойства устройства" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Устройство:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Не подключено" #: ../quodlibet/browsers/media.py:55 msgid "Mount point:" msgstr "Точка монтирования:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Имя:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Аудиоустройства" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "Аудио_устройства" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Извлечь" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Свойства" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "Пере_именовать" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%s использовано, %s доступно" #: ../quodlibet/browsers/media.py:479 #, python-format msgid "%s is not connected." msgstr "%s не присоединён." #: ../quodlibet/browsers/media.py:499 #, python-format msgid "Copying %(song)s" msgstr "Копирование %(song)s" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Не удалось скопировать композицию" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Недостаточно места для данной композиции." #: ../quodlibet/browsers/media.py:526 #, python-format msgid "%s could not be copied." msgstr "Не удалось скопировать %s." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Не удалось удалить композиции" #: ../quodlibet/browsers/media.py:557 #, python-format msgid "Deleting %(song)s" msgstr "Удаление %(song)s" #: ../quodlibet/browsers/media.py:575 #, python-format msgid "%s could not be deleted." msgstr "Не удалось удалить %s." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Не удалось удалить композицию" #: ../quodlibet/browsers/media.py:594 #, python-format msgid "Ejecting %s failed." msgstr "Не удалось извлечь %s." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Не удалось извлечь устройство" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" "Система поддержки устройств не найдена, просмотр аудиоустройств отключён." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Обзор фонотеки" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Обзор фонотеки" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "В_ыбрать всё" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Все" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "_Широкий режим" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Параметры просмотра" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Списки воспроизведения" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "Списки _воспроизведения" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Удалить из _списка воспроизведения" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Импортировать" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Новый список воспроизведения" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Не удалось импортировать список воспроизведения" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet может импортировать списки воспроизведения только в форматах M3U " "и PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Не удалось переименовать список воспроизведения" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Импортировать список воспроизведения" #: ../quodlibet/browsers/playlists/menu.py:25 msgid "_New Playlist…" msgstr "_Новый список воспроизведения…" #: ../quodlibet/browsers/playlists/menu.py:86 #, fuzzy, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Изменить оценку %d композиций?" msgstr[1] "Изменить оценку %d композиций?" msgstr[2] "Изменить оценку %d композиций?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Подтвердите действие для списка воспроизведения «%s»" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Новый список воспроизведения" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Параметры просмотра" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Списки воспроизведения" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Удалить список воспроизведения «%s»?" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "Список воспроизведения будет удалён безвозвратно." #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Введите название нового списка воспроизведения:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Импортируется список воспроизведения.\n" "\n" "%(current)d/%(total)d композиций добавлено." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Ограничить результаты" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Поиск по фонотеке" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Поиск по фонотеке" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Обзор фонотеки" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Найти" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "Соединение" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet не запущен." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "музыкальный проигрыватель и фонотека" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[параметр]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Вывести название текущей композиции и выйти" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Сразу начать воспроизведение" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Перейти к следующей композиции" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "Перейти к предыдущей композиции или в начало текущей" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Перейти к предыдущей композиции" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Начать воспроизведение" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Приостановить воспроизведение" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Переключить режим воспроизведения/паузы" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Остановить воспроизведение" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Увеличить громкость" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Уменьшить громкость" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Вывести состояние воспроизведения" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Скрыть главное окно" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Показать главное окно" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Показать/скрыть главное окно" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Поместить фокус на окно Quod Libet" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Снять текущие фильтры режимов просмотра" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Обновить фонотеку" #: ../quodlibet/cli.py:110 msgid "List available browsers" msgstr "Вывести список режимов просмотра" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Вывести текущий список воспроизведения" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Вывести содержимое очереди" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Вывести содержимое очереди" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Отключить расширения" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet не запущен." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Выйти из Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Навигация по воспроизводимой композиции" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][ЧЧ:]ММ:СС" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Переключить режим воспроизведения/паузы" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Включить/выключить режим повторения композиций" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Установить громкость" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Найти в фонотеке" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "запрос" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Воспроизвести файл" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "имя файла" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Оценить воспроизводимую композицию" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Установить режим просмотра фонотеки" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Оценить воспроизводимую композицию" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Открыть новый режим просмотра" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Показать/скрыть/переключить очередь" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Показать/скрыть список композиций" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Фильтровать по случайному параметру" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Тег" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Фильтровать по значению тега" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "тег=значение" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Добавить в очередь файл или результат запроса" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Добавить в очередь несколько файлов" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "имя файла" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Вывести полученные имена файлов на экран (stdout)" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Удалить из очереди файл или результат запроса" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Недопустимый аргумент для «%s»." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Попробуйте %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Неизвестное устройство" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" "Не удалось импортировать %s, который необходим для поддержки устройств." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "Устройство «%r» не поддерживается." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: не удалось найти %s." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Инициализация системы поддержки устройств." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Проверка «%s»" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Не удалось подключиться к системе поддержки устройств." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Система поддержки устройств запущена." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Шаблон имени файла:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Копировать обложки _альбомов" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Удалить неиспользуемые обложки и папки" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Произошла ошибка" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 #, fuzzy msgid "Quit Program" msgstr "_Приложение:" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "_Пропустить все ошибки" #: ../quodlibet/errorreport/ui.py:80 #, fuzzy msgid "Error details:" msgstr "_Подробности" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "описание" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "редактор тегов аудиофайлов" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "папка" #: ../quodlibet/ext/covers/artwork_url.py:19 #, fuzzy msgid "Artwork URL Cover Source" msgstr "Источник обложек Last.fm" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "Источник обложек Last.fm" #: ../quodlibet/ext/covers/discogs.py:26 #, fuzzy msgid "Downloads covers from Discogs." msgstr "Загружает обложки альбомов с различных веб-сайтов." #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "Источник обложек Last.fm" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Загружает обложки из архива Last.fm." #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "MusicBrainz Cover Source" msgstr "Источник обложек MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Загружает обложки из архива MusicBrainz." #: ../quodlibet/ext/editing/iconv.py:26 msgid "Convert Encodings" msgstr "Выбор кодировки" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "Позволяет выбрать подходящую кодировку в редакторе тегов." #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "_Изменить кодировку…" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "Не удалось найти «Kanji Kana Simple Inverter» (kakasi)." #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "Замена по регулярному выражению" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Позволяет использовать регулярные выражения для замены (s///) при получении " "тегов из имени файла или переименования файла по тегам." #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title Case" msgstr "Капитализация" #: ../quodlibet/ext/editing/titlecase.py:21 msgid "Title-cases tag values in the tag editor." msgstr "Позволяет применять правила капитализации к полям в редакторе тегов." #: ../quodlibet/ext/editing/titlecase.py:40 msgid "Title-_case Value" msgstr "_Применить правила капитализации" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "_Пропускать слова, написанные только заглавными буквами" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "_Соблюдать правила английского языка" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Следовать общим правилам изменения регистра букв, принятым в английском " "языке, например, «Dark Night of the Soul»" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Параметры просмотра" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "Анимированные уведомления" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "Показывает на экране информацию при смене композиции." #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "Вверху экрана" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "Посередине экрана" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "Внизу экрана" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "_Положение:" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Общий размер:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 msgid "Display" msgstr "Вид" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "_Шрифт:" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "По левому краю" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "По центру" #: ../quodlibet/ext/events/animosd/prefs.py:197 msgid "Right" msgstr "По правому краю" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "_Выравнивание:" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "Текст" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "_Текст:" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "За_ливка:" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "Цвета" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "Т_ени" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "_Контуры" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "З_акруглённые углы" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "За_держка:" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "Эффекты" #: ../quodlibet/ext/events/animosd/prefs.py:270 msgid "Ed_it Display Pattern…" msgstr "_Изменить шаблон…" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 msgid "Preview" msgstr "Предварительный просмотр" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "Автообновление фонотеки" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "Автоматически обновляет фонотеку с помощью inotify. Требует %s." #: ../quodlibet/ext/events/automask.py:22 #, fuzzy msgid "Automatic Masking" msgstr "Авто_матически" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "Автоматическая оценка" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" "Автоматически оценивает композиции в зависимости от того, будут ли они " "воспроизведены полностью или пропущены. Использует «ускоренный» алгоритм из " "vux за авторством Брайана Нельсона." #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "Будильник" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "Включает громкую музыку в заданное время." #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "Колыбельная" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "Постепенно убавляет громкость и приостанавливает воспроизведение." #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "Эквалайзер" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" "Используемая система аудиовывода не поддерживает коррекцию аудиосигнала." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "%.1f кГц" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "%d Гц" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, python-format msgid "%.1f dB" msgstr "%.1f дБ" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Особые" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "_Очистить ошибки" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "Предотвращает активацию хранителя экрана GNOME при воспроизведении." #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Музыкальный проигрыватель" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "Internet Radio Log" msgstr "Журнал Интернет-радио" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" "Запоминает и отображает 10 последних композиций радиостанций в контекстном " "меню навигации по воспроизводимой композиции." #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "О_ценка" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "По умолчанию" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "%d композиция" #: ../quodlibet/ext/events/lyricswindow.py:215 msgid "No lyrics found" msgstr "Слова песни не найдены" #: ../quodlibet/ext/events/lyricswindow.py:227 msgid "Lyrics:" msgstr "Текст песни:" #: ../quodlibet/ext/events/lyricswindow.py:284 #, fuzzy msgid "_Zoom level:" msgstr "_Уровень:" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 #, fuzzy msgid "Revert to default" msgstr "Сбросить на шаблон по умолчанию" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Очистить поле поиска" #: ../quodlibet/ext/events/lyricswindow.py:347 msgid "Lyrics Window" msgstr "Окно с текстом песни" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "Позволяет открыть отдельное окно с текстом песни." #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "Сервер MPD" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" "Позволяет управлять Quod Libet удалённо с использованием клиента MPD. " "Потоковое вещание и управление фонотекой и списками воспроизведения не " "поддерживается." #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "_Порт:" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "_Локальный IP:" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 #, fuzzy msgid "P_assword:" msgstr "Пароль:" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 msgid "Connection" msgstr "Соединение" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "Проверенные клиенты" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "Скрывать главное окно при закрытии" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Параметры" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Сохранённые шаблоны" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Сохранённые шаблоны" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d композиция" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Параметры воспроизведения" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "Состояние" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Не удалось подключиться к %s" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "Ошибка соединения" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "Текст уведомления" #: ../quodlibet/ext/events/notify.py:88 msgid "_Title:" msgstr "З_аголовок:" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "Сбросить на шаблон по умолчанию" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "_Тело:" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "_Показать уведомление" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "Показывать уведомления" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "При смене композиции <i>_вручную</i>" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "При <i>авто_матической</i> смене композиции" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "При <i>_любой</i> смене композиции" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "Только когда _фокус не на главном окне" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "Ошибка соединения" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "Не удалось подключиться к системе уведомлений." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "Системные уведомления" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "Показывает системное уведомление при смене композиции." #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Следующая композиция" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" "Необходимо настроить расширение для скробблинга в окне расширений. До этого " "отправка композиций не сможет осуществляться." #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "Не удалось соединиться с сервисом «%s»." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "Аутентификация не удалась: неверно указан URL." #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "Аутентификация не удалась: неверное имя пользователя (%s) или пароль." #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "Клиент заблокирован. Свяжитесь с автором." #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "Скробблинг" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "Клиент для скробблинга на Last.fm, Libre.fm и других сервисах." #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "Аутентификация прошла успешно." #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "_Сервис:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "User_name:" msgstr "_Имя пользователя:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "_Пароль:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 msgid "Other…" msgstr "Другой…" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "_Проверить учётную запись" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "Учётная запись" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Исполнитель" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Шаблон имени файла:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "_Автономный режим (ничего не отправлять)" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "Отправка" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "_Случайный альбом" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "альбомы" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 msgid "Weights" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "избегать" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "предпочитать" #: ../quodlibet/ext/events/randomalbum.py:201 msgid "Random Album" msgstr "Случайный альбом" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Импортировать список воспроизведения" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "Импорт из Rhythmbox" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "Импорт оценок и статистики из Rhythmbox." #: ../quodlibet/ext/events/rbimport.py:132 msgid "Start Import" msgstr "Начать импорт" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" "Приостанавливает воспроизведение, когда хранитель экрана GNOME активен." #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "Позволяет GNOME Shell искать по фонотеке." #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Текст песни" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 #, fuzzy msgid "Text:" msgstr "_Текст:" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 #, fuzzy msgid "Font" msgstr "_Шрифт:" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Остановлен" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d композиция" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "Сохранённые шаблоны" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "Тема оформления" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "Позволяет сменить используемую тему GTK+." #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "_Тема:" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "Тема по умолчанию" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "Предпочитать тёмную версию темы" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Остановлен" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "Значок в трее" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "Позволяет управлять Quod Libet из системного лотка." #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "Списки _воспроизведения" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Воспроизведение/Пауза" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "Предыдущая композиция" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 #, fuzzy msgid "_Next" msgstr "Следующая композиция" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Случайно" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Повторять" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Остановиться после этой композиции" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 msgid "Open _Browser" msgstr "П_росмотр в новом окне" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Изменить _теги" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 #, fuzzy msgid "_Information" msgstr "Информация" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 msgid "Play_lists" msgstr "_Списки воспроизведения" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Поведение" #: ../quodlibet/ext/events/trayicon/prefs.py:42 #, fuzzy msgid "Scroll wheel adjusts volume" msgstr "" "Прокрутка колёсиком меняет громкость\n" "Shift и прокрутка колёсиком меняет композицию" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "_Колёсико мыши" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Содержание подсказки" #: ../quodlibet/ext/events/viewlyrics.py:23 msgid "View Lyrics" msgstr "Текст песни" #: ../quodlibet/ext/events/viewlyrics.py:24 #, fuzzy msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "Показывает текст песни под списком композиций." #: ../quodlibet/ext/events/viewlyrics.py:29 msgid "_Lyrics" msgstr "_Текст песни" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 msgid "Error" msgstr "Ошибка" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "Сохраняет обложку текущей композиции в файл." #: ../quodlibet/ext/events/write_cover.py:66 msgid "File:" msgstr "Файл:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "_Порог:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "Пороговое значение амплитуды, выше которой сигнал будет ослабляться" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "_Коэффициент:" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "Коэффициент компрессии аудиосигнала" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "Компрессор" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" "Изменяет амплитуду сигнала, превышающего определённое значение, с указанным " "коэффициентом." #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Предварительный просмотр" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Фильтровать по _исполнителю" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "По умолчанию" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "Расширенная сортировка" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "Filter _band:" msgstr "_Частота фильтра:" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "Filter _width:" msgstr "_Диапазон фильтра:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "_Уровень:" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "Интенсивность эффекта" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "Караоке" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "Убирает вокал из аудио." #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "_Темп:" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "_Высота:" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Ленты аудиофайлов" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Введите адрес ленты аудиофайлов:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Импортировать список воспроизведения" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Импортировать" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Станций не найдено" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Шаблон имени файла:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Шаблон имени файла:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 msgid "Remove Playlist Duplicates" msgstr "Удалить повторы" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "Позволяет удалять повторные композиции из списков воспроизведения.." #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Удалить %d повтор?" msgstr[1] "Удалить %d повтора?" msgstr[2] "Удалить %d повторов?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" "Из списка воспроизведения «%s» будут удалены все повторяющиеся композиции." #: ../quodlibet/ext/playlist/shuffle.py:15 msgid "Shuffle Playlist" msgstr "Перемешать список воспроизведения" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "Переставляет композиции в списке воспроизведения в случайном порядке." #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "Следовать за курсором" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 #, fuzzy msgid "Playcount Equalizer" msgstr "Эквалайзер" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "последнее воспроизведение" #: ../quodlibet/ext/playorder/queue.py:19 msgid "Queue Only" msgstr "Только очередь" #: ../quodlibet/ext/playorder/queue.py:21 #, fuzzy msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" "Только композиции в очереди будут воспроизведены. Добавить любую композицию " "в очередь можно двойным щелчком." #: ../quodlibet/ext/playorder/reverse.py:14 msgid "Reverse" msgstr "В обратном порядке" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "Воспроизводит композиции в обратном порядке." #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Нет композиций" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" "Воспроизводит композиции в случайном порядке, но повторяет каждую заданное " "количество раз." #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "Сколько раз воспроизводить каждую композицию:" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 #, fuzzy msgid "Python Query" msgstr "Консоль Python" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Сохранённые запросы" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "Не удалось подключиться к %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "Имя машины:" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "Порт:" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 msgid "Username:" msgstr "Имя пользователя:" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "Пароль:" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 msgid "Library path:" msgstr "Путь к фонотеке:" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "_Проверить настройки" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 #, fuzzy msgid "Squeezebox Server" msgstr "<b>Сервер Squeezebox</b>" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Отладка" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "_Масштаб по размеру окна" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "_Приложение:" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "Из_менить изображение после сохранения" #: ../quodlibet/ext/songsmenu/albumart.py:345 msgid "File_name:" msgstr "_Имя файла:" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "Сохранить не удалось" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, python-format msgid "Unable to save \"%s\"." msgstr "Не удалось сохранить «%s»." #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 msgid "Album Art Downloader" msgstr "Поиск обложек" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "с %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "Разрешение: %s" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, python-format msgid "Size: %s" msgstr "Размер: %s" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Найти:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 msgid "Searching…" msgstr "Поиск…" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "Готово" #: ../quodlibet/ext/songsmenu/albumart.py:922 msgid "Download Album Art" msgstr "Загрузка обложек" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "Загружает обложки альбомов с различных веб-сайтов." #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "Источники" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "APEv2 в ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "Перейти к закладке…" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 #, fuzzy msgid "Manages bookmarks in the selected files." msgstr "Позволяет перейти к любой закладке в выделенных файлах." #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 msgid "_Edit Bookmarks…" msgstr "_Изменить закладки…" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 msgid "No Bookmarks" msgstr "Нет закладок" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 msgid "MusicBrainz Lookup" msgstr "Поиск на MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Позволяет найти альбом на MusicBrainz и записать найденные теги." #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "Записывать _стандартные теги MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Имя файла" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Диск" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Дорожка" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 msgid "Title" msgstr "Название" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Исполнитель" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 msgid "MusicBrainz lookup" msgstr "Поиск на MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 msgid "_Query:" msgstr "_Запрос:" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 msgid "S_earch" msgstr "_Найти" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "Результаты <i>(порядок можно изменить перетаскиванием)</i>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 #, fuzzy msgid "Please enter a query." msgstr "<b>Введите запрос.</b>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 #, fuzzy msgid "Loading result…" msgstr "<i>Загрузка данных…</i>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 msgid "No results found." msgstr "Ничего не найдено." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 msgid "Browse Folders" msgstr "Просмотр папок" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "Позволяет открывать папки с композициями в файловом менеджере." #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Unable to open folders" msgstr "Не удалось открыть папки" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "Не найдено приложение, способное открывать папки." #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "Консоль Python" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "Интерактивная консоль Python." #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "Текущий рабочий каталог:" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "Команда" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "name" msgstr "название" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "Название этой команды" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "команда" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "параметр" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "шаблон" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 #, fuzzy msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" "Шаблон, который будет использован для получения аргументов к этой команде " "(например, <~filename>)" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" "Наибольшее количество аргументов, которое будет передано приложению за один " "раз (аналогично xargs)" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 msgid "Input value" msgstr "Введите значение" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "Значение %s?" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 msgid "Custom Commands" msgstr "Пользовательские команды" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Позволяет выполнять пользовательские команды над композициями (в пакетном " "режиме, если требуется), используя любые теги в качестве аргументов." #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "Изменить команды" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 #, fuzzy msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" "Поддерживает шаблоны,\n" "например, <tt><~artist~title></tt>" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, python-format msgid "Unable to run custom command %s" msgstr "Не удалось выполнить пользовательскую команду %s" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "%d группа повторов" msgstr[1] "%d группы повторов" msgstr[2] "%d групп повторов" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "Свернуть/развернуть всё" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Выражение для поиска повторов: «%s»" #: ../quodlibet/ext/songsmenu/duplicates.py:372 msgid "Duplicates Browser" msgstr "Поиск повторов" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "Поиск и просмотр композиций с похожими тегами." #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" "Поддерживает выражения с тегами, например, <tt>~artist~title</tt> или " "<tt>musicbrainz_track_id</tt>" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "_Группировать повторы по:" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "Выражение для поиска" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "Удалить _пробелы" #: ../quodlibet/ext/songsmenu/duplicates.py:424 msgid "Remove _Diacritics" msgstr "Удалить _диакритические знаки" #: ../quodlibet/ext/songsmenu/duplicates.py:425 msgid "Remove _Punctuation" msgstr "Удалить п_унктуацию" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "_Игнорировать регистр" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "Настройки сравнения" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Изменить внешний вид" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "Изменить внедрённые изображения" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "Позволяет удалять или заменять внедрённые изображения." #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "_Удалить все изображения" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "_Внедрить текущее изображение" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "Точная оценка" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "Возможность ввести точную оценку композиции в виде числа." #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "Введите оценку в виде числа от 0.0 до 1.0" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Filter on Any Tag" msgstr "Фильтр по любому тегу" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "Позволяет создавать поисковые запросы по тегам выбранных композиций." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 msgid "Filter on Directory" msgstr "Фильтр по папке" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "Фильтр по папке в новом окне." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "Поиск по акустическому отпечатку" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "Поиск информации о композициях по их акустическим отпечаткам." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "Отправка акустических отпечатков" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Позволяет создавать акустические отпечатки композиций, используя " "chromaprint, и отправлять их на acoustid.org." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "Требуется ключ API" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" "Перед тем, как отправлять отпечатки, необходимо указать ключ API acoustid." "org в настройках расширения." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "Запросить ключ" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "_Ключ API:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "Веб-сервис AcoustID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "В очереди" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "Анализ" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "Поиск" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Записать" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "Состояние" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "Выпуск" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 msgid "Write MusicBrainz tags" msgstr "Записать теги MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 msgid "Group by directory" msgstr "Группировать по папке" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "Album Mode" msgstr "Режим альбома" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" "Записывать альбомные теги и пытаться сократить число различных выпусков " "альбома" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "Создание отпечатков:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "_Подробности" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "_Отправить" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" "У композиций должен быть либо тег <i><b>musicbrainz_trackid</b></i>, либо " "теги <i><b>artist</b></i> / <i><b>title</b></i> / <i><b>album</b></i>." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 #, fuzzy msgid "Fingerprints:" msgstr "Создание отпечатков:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 #, fuzzy msgid "Songs with MBIDs:" msgstr "" "\n" "<i>Композиций с идентификаторами MBID:</i> %d/%d" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 #, fuzzy msgid "Songs with sufficient tags:" msgstr "" "\n" "<i>Композиций с заполненными тегами:</i> %d/%d" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 #, fuzzy msgid "Songs to submit:" msgstr "" "\n" "<i>Композиций для отправки:</i> %d/%d" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, fuzzy, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Готово. %d/%d композиций для отправки." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "Отправка отпечатков:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "Отправка…" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Обновить список станций" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "Экспорт в HTML" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "Экспорт выбранного списка композиций в HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "Отправить на iFP" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "Загружает композиции на устройства iRiver iFP." #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "Экспорт метаданных" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "Экспорт метаданных выбранных композиций в файл .tags." #: ../quodlibet/ext/songsmenu/importexport.py:92 msgid "Import Metadata" msgstr "Импорт метаданных" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "Импорт метаданных выбранных композиций из файла .tags." #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "Запись CD" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Записывает CD с помощью K3b, Brasero или xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "Обновление списка чартов." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "Не требует обновления." #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "Загрузка чарта за неделю от %s." #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "Синхронизация завершена." #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "Произошла ошибка синхронизации" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "Синхронизация с Last.fm" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "Дополняет статистику фонотеки данными из профиля на Last.fm." #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 msgid "_Username:" msgstr "_Имя пользователя:" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Экспорт метаданных" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Информация" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Импортировать список воспроизведения" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "Экспорт композиций в файл M3U или PLS." #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "Использовать относительные пути" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "Использовать абсолютные пути" #: ../quodlibet/ext/songsmenu/playlist.py:132 msgid "Unable to export playlist" msgstr "Не удалось экспортировать список воспроизведения" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Не удалось записать в <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Скрытые композиции" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Обновление композиций" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "Анализ ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "Прогресс" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "Усиление" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "Пик" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, fuzzy, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "Обновляется <b>%d</b> альбом (из %d)" msgstr[1] "Обновляется <b>%d</b> альбома (из %d)" msgstr[2] "Обновляется <b>%d</b> альбомов (из %d)" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "Анализ ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" "Анализирует и обновляет информацию ReplayGain с помощью GStreamer, группируя " "композиции по альбомам." #: ../quodlibet/ext/songsmenu/replaygain.py:617 #, fuzzy msgid "always" msgstr "<b>всегда</b>" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "Если <b>какие-либо</b> теги ReplayGain отсутствуют" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "Если <b>альбомные</b> теги ReplayGain отсутствуют" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "О_брабатывать альбомы:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "<b>Если теги уже есть</b>" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Изменить теги" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Все альбомы" #: ../quodlibet/ext/songsmenu/splitting.py:57 #, fuzzy msgid "Split out disc number." msgstr "Выделить «_disc» из «album»" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Предварительный просмотр" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Тег" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Не удалось удалить композиции" #: ../quodlibet/ext/songsmenu/website_search.py:35 msgid "Website Search" msgstr "Поиск в Интернете" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" "Позволяет искать на любых выбранных веб-сайтах по любым тегам.\n" "Поддерживает шаблоны, например: %(pattern-example)s." #: ../quodlibet/ext/songsmenu/website_search.py:78 msgid "Search URL patterns" msgstr "Шаблоны URL для поиска" #: ../quodlibet/ext/songsmenu/website_search.py:88 msgid "Edit search URLs" msgstr "Изменить поисковые шаблоны" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Настройки поиска…" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "Искать на %(website)s" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "Поиск исполнителя на Википедии" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "Позволяет открыть веб-браузер со статьёй об исполнителе на Википедии." #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "Поиск альбома на Википедии" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "Позволяет открыть веб-браузер со статьёй об альбоме на Википедии." #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Фонотека" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Проверка точек монтирования" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Сканирование фонотеки" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Сканирование %s" #: ../quodlibet/library/libraries.py:745 #, fuzzy msgid "Loading files" msgstr "Сохранить не удалось" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Не удалось загрузить файл: %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Вывести теги" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "_Показывать программные теги" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Недостаточно аргументов" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "Слишком много аргументов" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "Описание" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Значение" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Вывести все общие теги" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Копировать теги из одного файла в другой" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 msgid "Edit tags in a text editor" msgstr "Изменить теги в текстовом редакторе" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "Изменение прервано" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Не удалось запустить текстовый редактор «%(editor-name)s»." #: ../quodlibet/operon/commands.py:260 msgid "No changes detected" msgstr "Изменения не найдены" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Не удалось установить %r" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "Удалить теги" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "Удалить все теги" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "Удалить значение тега" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "Добавить значение тега" #: ../quodlibet/operon/commands.py:456 msgid "List file information" msgstr "Вывести информацию о файле" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, python-format msgid "Failed to load image file: %r" msgstr "Не удалось загрузить файл: %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" "Изменение изображения %(file_name)s (%(file_format)s) не поддерживается" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "Удалить все внедрённые изображения" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Извлечь внедрённые изображения в %(filepath)s" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Файл" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 msgid "Display help information" msgstr "Вывести справку" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> не является корректным адресом." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Неизвестно" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "По порядку" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_По порядку" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Случайно" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Случайно" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Повторять" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Одна композиция" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Поток" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Буферизация" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "Не удалось создать конвейер GStreamer" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "Не найден элемент GStreamer для обработки формата мультимедиа" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "Формат мультимедиа: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "Не удалось инициализировать расширение GStreamer «%(name)s»" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "Конвейер GStreamer для воспроизведения. Пустое поле соответствует конвейеру " "по умолчанию. Если будет указано устройство вывода, оно будет использовано " "вместо устройства по умолчанию." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Конвейер воспроизведения:" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f секунд" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "_Размер буфера:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "_Отключить воспроизведение без пауз" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" "Отключение воспроизведения без пауз (gapless) может помочь решить проблемы " "при смене композиций с некоторыми версиями GStreamer." #: ../quodlibet/player/gstbe/util.py:93 msgid "No GStreamer audio sink found" msgstr "Не найдено ни одного устройства аудиовывода GStreamer" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "Некорректный конвейер GStreamer для воспроизведения" #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Не удалось создать аудиовыход" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Аудиоустройство %r не найдено. Проверьте настройки Xine в ~/.quodlibet/" "config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" "Не удалось найти модуль «{module}». Возможно, нужно установить " "соответствующий пакет." #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Не удалось найти элемент GStreamer: «{element}»." #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Расширения" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Поддерживаемые форматы: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Аудиоустройство: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Начало" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "Н/Д" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Время" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Имя закладки" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "ММ:СС" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Закладки" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Фильтры" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "Недавно _прослушанные" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Недавно _добавленные" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 _лучших" #: ../quodlibet/qltk/browser.py:63 msgid "All _Songs" msgstr "_Все композиции" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Случайный _жанр" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "_Случайный исполнитель" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "_Случайный альбом" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 композиций, которые воспроизводились большее количество раз, чем " "остальные (может быть выбрано больше 40, если есть композиции, " "воспроизводившиеся равное количество раз)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Значение:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Сохранённые значения" #: ../quodlibet/qltk/cbes.py:263 msgid "Edit saved values…" msgstr "Изменить сохранённые значения…" #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Авто_матически" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "Режим _дорожки" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "Режим _альбома" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Анализ ReplayGain" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 msgid "(unknown)" msgstr "(неизвестно)" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Введите новое значение" #: ../quodlibet/qltk/delete.py:37 msgid "Files:" msgstr "Файлы:" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" "Все выбранные композиции будут удалены из фонотеки, а их файлы будут удалены " "с диска." #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "Выбранные файлы будут удалены с диска." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "Удалить %(file_count)d файл безвозвратно?" msgstr[1] "Удалить %(file_count)d файла безвозвратно?" msgstr[2] "Удалить %(file_count)d файлов безвозвратно?" #: ../quodlibet/qltk/delete.py:91 msgid "_Delete Files" msgstr "_Удалить файлы" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "Все выбранные композиции будут удалены из фонотеки, а их файлы будут " "перемещены в корзину." #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "Выбранные файлы будут перемещены в корзину." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "Переместить %(file_count)d файл в корзину?" msgstr[1] "Переместить %(file_count)d файла в корзину?" msgstr[2] "Переместить %(file_count)d файлов в корзину?" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Переместить в корзину" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Перемещение %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Не удалось переместить файлы в корзину" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 msgid "Moving one or more files to the trash failed." msgstr "Не удалось переместить в корзину некоторые файлы." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Удаление %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 msgid "Unable to delete files" msgstr "Не удалось удалить файлы" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 msgid "Deleting one or more files failed." msgstr "Не удалось удалить некоторые файлы." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Загрузки" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Размер" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "отсутствует у %d композиции" msgstr[1] "отсутствует у %d композиций" msgstr[2] "отсутствует у %d композиций" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "разное у %d композиции" msgstr[1] "разное у %d композиций" msgstr[2] "разное у %d композиций" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "_Разделить на несколько значений" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Выделить «_disc» из «album»" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Выделить «_version» из «title»" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Выделить «_arranger» из «artist»" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Выделить «_performer» из «artist»" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "Выделить «_performer» из «title»" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "Выделить «_originalartist» из «title»" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Добавить тег" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "Т_ег:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Изменить теги" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "_Показывать программные теги" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Показывать все теги, включая созданные программно, как например теги " "MusicBrainz или Replay Gain" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "В обратном порядке" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 #, fuzzy msgctxt "edittags" msgid "_Save" msgstr "Со_хранить" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Не удалось добавить тег" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Не удалось добавить композицию" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Не удалось добавить <b>%s</b>\n" "\n" "Выбранные файлы не поддерживают множественные значения <b>%s</b>." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Недопустимый тег" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Недопустимый тег <b>%s</b>\n" "\n" "Выбранные файлы не поддерживают изменение этого тега." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Недопустимое значение" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Некорректное значение: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Тег может быть неверным" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "%(file-name)s был изменён сторонней программой. Сохранение файла без " "обновления фонотеки может привести к перезаписи других изменений." #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Не удалось сохранить композицию" #: ../quodlibet/qltk/_editutils.py:50 #, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Не удалось сохранить %(file-name)s. Возможно, файл доступен только для " "чтения, испорчен, или вы не имеете прав для его изменения." #: ../quodlibet/qltk/_editutils.py:142 msgid "_More options…" msgstr "_Дополнительные параметры…" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Расширения" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s и ещё %(count)d композиция" msgstr[1] "%(title)s и ещё %(count)d композиции" msgstr[2] "%(title)s и ещё %(count)d композиций" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Настройки Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "_Разделять по:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Редактор тегов" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Папки" #: ../quodlibet/qltk/filesel.py:253 msgid "_New Folder…" msgstr "_Создать папку…" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "В_ыбрать все вложенные папки" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Создание папки" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Введите имя новой папки:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Не удалось создать папку" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Не удалось удалить папку" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Композиции" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "в исполнении %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Диск %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Дорожка %s" #: ../quodlibet/qltk/info.py:108 msgid "_Edit Display…" msgstr "_Изменить внешний вид…" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Не выбрана ни одна композиция." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Нет композиций" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Информация" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Текст песни" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Продюсер: %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "исполнитель" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "исполнители" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "исполнители" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Никогда" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d раз" msgstr[1] "%(n)d раза" msgstr[2] "%(n)d раз" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "добавлен" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "последнее воспроизведение" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "количество воспроизведений" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "пропущено" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "оценка" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "время" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Информация" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "По возрастанию" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "битрейт" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "размер" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "изменён" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d выбрано" msgstr[1] "%d выбрано" msgstr[2] "%d выбрано" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Дорожка недоступна" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Список композиций" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d композиция с неуказанным альбомом" msgstr[1] "%d композиции с неуказанным альбомом" msgstr[2] "%d композиций с неуказанным альбомом" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Выбранные альбомы" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d композиция с неуказанным исполнителем" msgstr[1] "%d композиции с неуказанным исполнителем" msgstr[2] "%d композиций с неуказанным исполнителем" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "альбомы" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Общая продолжительность:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Общий размер:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Файлы" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Загрузить" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Изменить…" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Не удалось найти текст этой композиции." #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "Идёт поиск текста песни…" #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "Удалить все композиции?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "Выбранные композиции будут удалены из фонотеки." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "Восстановить" #: ../quodlibet/qltk/maskedbox.py:86 #, fuzzy msgid "_Unhide" msgstr "Восстановить" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Забыть изменения тегов?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Теги были изменены, но изменения не были сохранены. Сохранить файлы или " "забыть изменения?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "В обратном порядке" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Файл существует" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "Заменить %(file-name)s?" #: ../quodlibet/qltk/msg.py:94 msgid "_Replace File" msgstr "_Заменить файл" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Активные задачи" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d задач активно" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Переключить режим воспроизведения/паузы" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Переключить режим воспроизведения/паузы" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Ошибки расширений" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Включённые" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Отключённые" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Без категории" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "О_черёдность" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Редактор тегов" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Общий размер:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Расширения не найдены." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Расширения" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "_Ошибки" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Диск" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Номер дорожки" #: ../quodlibet/qltk/prefs.py:47 msgid "Grou_ping" msgstr "_Классификация" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "_Альбом" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Имя _файла" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "Вре_мя" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Автоматически переходить к воспроизводимой композиции" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Когда воспроизведение переходит к другой композиции, переходить к ней в " "списке воспроизведения" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "Д_ругие:" #: ../quodlibet/qltk/prefs.py:88 msgid "_Edit…" msgstr "_Изменить…" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Добавить или удалить дополнительные столбцы" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Отображаемые столбцы" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Название содержит _версию" #: ../quodlibet/qltk/prefs.py:106 msgid "Artist includes all _people" msgstr "Исполнитель содержит всех _людей" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Альбом содержит _раздел диска" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Имя файла содержит _путь" #: ../quodlibet/qltk/prefs.py:123 msgid "Column Preferences" msgstr "Параметры столбцов" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "Применить текущие параметры к списку, добавив новые столбцы в конец" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Список композиций" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Дополнительные столбцы" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Общий фильтр:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" "В дополнение к остальным, всегда будет выполняться и этот поисковый запрос" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Найти" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Режимы отображения" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "_Запрашивать подтверждение при множественном изменении оценок" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Запрашивать подтверждение, прежде чем сменить оценку сразу нескольким " "композициям" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "О_ценивать композицию одним щелчком" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "Изменять оценку композиции при щелчке в соответствующем столбце" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Оценка композиций" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "_Предпочитать внедрённую обложку" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "Предпочитать изображение, внедрённое в аудиофайл, если таковое имеется" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "_Только с указанным именем:" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "Будут использоваться файлы только с указанным именем" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "Будут использоваться файлы только с указанным именем" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Обложки" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Воспроизведение" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Параметры воспроизведения" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Если информация Replay Gain для композиции отсутствует, изменять уровень " "громкости на это значение" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "_Усиление по умолчанию (дБ):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Изменять уровень громкости всех композиций на данное значение, если это не " "приводит к потере качества" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "_Базовое усиление громкости (дБ):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "Корректировка _громкости Replay Gain" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Настройка Replay Gain" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "_Оценка по умолчанию:" #: ../quodlibet/qltk/prefs.py:493 msgid "Rating _scale:" msgstr "_Шкала оценок:" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Со_хранять оценки и счётчик воспроизведений" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Электронная почта:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "Оценки и счётчики воспроизведений будут привязаны к этому адресу электронной " "почты" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Сохранять изменения тегов автоматически" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Сохранять изменения тегов без подтверждения при редактировании нескольких " "файлов" #: ../quodlibet/qltk/prefs.py:587 #, fuzzy msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Список разделителей (через пробел), которые будут использоваться для " "разделения тегов" #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Теги" #: ../quodlibet/qltk/prefs.py:631 msgid "Updating for new ratings" msgstr "Обновление оценок" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "_Обновлять фонотеку при запуске" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Поиск по фонотеке" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Проверить наличие изменений в фонотеке" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Пере_загрузить фонотеку" #: ../quodlibet/qltk/prefs.py:661 msgid "Reload all songs in your library. This can take a long time." msgstr "" "Перезагрузить все композиции в фонотеке. Это может занять много времени." #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "Сканировать папки" #: ../quodlibet/qltk/prefs.py:677 msgid "Hidden Songs" msgstr "Скрытые композиции" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s и ещё %(count)d композиция" msgstr[1] "%(title)s и ещё %(count)d композиции" msgstr[2] "%(title)s и ещё %(count)d композиций" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Свойства" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Очередь" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Очистить ошибки" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d композиция (%(time)s)" msgstr[1] "%(count)d композиции (%(time)s)" msgstr[2] "%(count)d композиций (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "Про_смотр фонотеки" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Показать/скрыть главное окно" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "Ошибка воспроизведения" #: ../quodlibet/qltk/quodlibetwindow.py:524 msgid "Set up library directories?" msgstr "Выбрать расположение фонотеки?" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "Расположение фонотеки ещё не выбрано. Сделать это сейчас?" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "_Не сейчас" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "_Выбрать" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Не удалось добавить композиции" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s использует неподдерживаемый протокол." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "Перейти _к воспроизводимой композиции" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Файл" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Композиции" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Вид" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Режимы отображения" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Управление" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Справка" #: ../quodlibet/qltk/quodlibetwindow.py:997 msgid "_Add a Folder…" msgstr "Добавить _каталог…" #: ../quodlibet/qltk/quodlibetwindow.py:1002 msgid "_Add a File…" msgstr "Добавить _файл…" #: ../quodlibet/qltk/quodlibetwindow.py:1007 msgid "_Add a Location…" msgstr "Добавить _адрес…" #: ../quodlibet/qltk/quodlibetwindow.py:1036 msgid "Edit Bookmarks…" msgstr "Изменить закладки…" #: ../quodlibet/qltk/quodlibetwindow.py:1056 msgid "Stop After This Song" msgstr "Остановиться после этой композиции" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Справка в сети" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Справка по поисковым запросам" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Добавление адреса" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Введите адрес аудиофайла:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Не удалось добавить адрес" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, python-format msgid "%s is not a valid location." msgstr "%s не является корректным адресом." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Добавление музыки" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "Добавить _каталог…" #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Музыкальный проигрыватель" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Добавить _файл…" #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Изменить оценку %d композиций?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "Установленные оценки будут удалены" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Оценка всех композиций будет установлена в «%s»." #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Удалить оценку" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "О_ценка" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "_Заменить пробел подчёркиванием" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Заменить _Windows-несовместимые символы" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "_Удалить диакритические знаки" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Заменить не-_ASCII символы" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "_Только строчные символы" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Переименовать файлы" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Сохранённые шаблоны" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 msgid "Edit saved patterns…" msgstr "Сохранённые шаблоны…" #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Предварительный просмотр" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Новое имя файла" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Не удалось переименовать файл" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Не удалось переименовать <b>%s</b> в <b>%s</b>. Возможно, целевой файл уже " "существует, или вы не имеете прав для создания нового или удаления старого " "файла." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "_Пропустить все ошибки" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Продолжить" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Неабсолютный путь" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Шаблон\n" "\t<b>%s</b>\n" "содержит «/», но начинается не с корневого каталога. Чтобы избежать ошибки в " "названиях папок, начните шаблон с «/» или «~/»." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "Композиции, расположенные в этих папках, будут добавлены в фонотеку" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Выбор папок" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Сохранённые запросы" #: ../quodlibet/qltk/searchbar.py:53 msgid "Edit saved searches…" msgstr "Сохранённые запросы…" #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" "Поиск по фонотеке (текст в свободной форме или поисковый запрос Quod Libet)" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "_Производить поиск по окончании ввода" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Производить поиск сразу после прекращения ввода." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Ограничение:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "По _оценкам" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Отображать оставшееся время" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Окно с текстом песни" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Поместить фокус на окно Quod Libet" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Навигация по воспроизводимой композиции" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Не удалось удалить композиции" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Не удалось удалить композиции" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 #, fuzzy msgid "Expands the element" msgstr "_Расширять столбец" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Фильтровать по %s" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "_Все заголовки" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Д_орожка" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Альбом" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Люди" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Дата" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_Файл" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Производство" #: ../quodlibet/qltk/songlist.py:1115 msgid "_Customize Headers…" msgstr "_Настроить заголовки…" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "_Расширять столбец" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Настройки поиска…" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Добавить в _очередь" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Копировать на устройство" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "Удалить из _фонотеки" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "_Заменить подчёркивание пробелом" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "З_аменить первую букву каждого слова заглавной" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "_Разделить на несколько значений" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Теги из имени файла" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Теги заменят существующие" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Теги будут добавлены к существующим" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 #, fuzzy msgid "Save" msgstr "Со_хранить" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Шаблон\n" "\t<b>%s</b>\n" "недопустим. Возможно, он содержит незакрытые скобки (< / >) или один и " "тот же тег дважды." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Недопустимые теги" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Недопустимый теги <b>%s</b>\n" "\n" "Выбранные файлы не поддерживают изменение этих тегов." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Введённый шаблон некорректен. Убедитесь, что вы ввели < и > как \\< " "и \\> и закрыли все открытые теги.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Изменить внешний вид" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Номера дорожек" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "_Начинать с:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "Всего _дорожек:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Воспроизведение/Пауза" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Предыдущая композиция" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "и ещё %d…" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Сохранение изменений." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d композиций сохранено\n" "(осталось %(remaining)s)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Перемещение %(current)d/%(total)d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Проверка точек монтирования" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "Соединение" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Список воспроизведения с названием «%s» уже существует." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Обновить _обложку альбома" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "Показывает обложки, внедрённые в аудиофайлы." #: ../quodlibet/util/cover/built_in.py:49 msgid "Filesystem cover" msgstr "Обложки из отдельных файлов" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Вывести краткую информацию об использовании" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Вывести версию и информацию об авторских правах" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[параметры]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Неопознанный параметр «%r»." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Для параметра «%r» требуется аргумент." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r — не уникальный префикс." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d Кбит/с" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d секунда" msgstr[1] "%d секунды" msgstr[2] "%d секунд" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Нет информации о времени" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d секунда" msgstr[1] "%d секунды" msgstr[2] "%d секунд" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d минута" msgstr[1] "%d минуты" msgstr[2] "%d минут" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d час" msgstr[1] "%d часа" msgstr[2] "%d часов" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d день" msgstr[1] "%d дня" msgstr[2] "%d дней" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d год" msgstr[1] "%d года" msgstr[2] "%d лет" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "firstcapital" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Дата должна быть введена в формате 'ГГГГ', 'ГГГГ-ММ-ДД' или 'ГГГГ-ММ-ДД ЧЧ:" "ММ:СС'." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Значения усилений Replay Gain должны быть введены в формате «x.yy dB»." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Значения пиков Replay Gain должны быть введены в формате «x.yy»." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "" "Идентификаторы MusicBrainz должны быть в формате UUID (уникальный " "идентификатор)." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Статус выпуска MusicBrainz должен быть «official», «promotional», либо " "«bootleg»." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Не удалось изменить композицию" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Не удалось сохранить <b>%s</b>. Возможно, файл доступен только для чтения, " "испорчен, или вы не имеете прав для его изменения." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Неверная кодировка]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "альбом" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "аранжировщик" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "аранжировщики" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "аранжировка" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "автор" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "авторы" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "композитор" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "композиторы" #: ../quodlibet/util/tags.py:78 msgid "composition" msgstr "" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "дирижёр" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "дирижёры" #: ../quodlibet/util/tags.py:80 msgid "conducting" msgstr "дирижирование" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "контакты" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "авторское право" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "дата" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "описание" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "жанр" #: ../quodlibet/util/tags.py:85 msgid "genres" msgstr "жанры" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "исполнитель" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "классификация" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "язык" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "лицензия" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "место записи" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "автор слов" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "авторы слов" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "автор слов" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "организация" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "название" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "версия" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "веб-сайт" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "автор обложки" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "ударов в минуту" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "раздел диска" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "диск" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "дорожка" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "ID издателя" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "дата первоначального выпуска" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "первоначальный альбом" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "первоначальный исполнитель" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "дата записи" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "страна выпуска" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz recording ID" msgstr "MusicBrainz ID записи" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz release track ID" msgstr "MusicBrainz ID дорожки выпуска" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "MusicBrainz ID выпуска" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz artist ID" msgstr "MusicBrainz ID исполнителя" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz release artist ID" msgstr "MusicBrainz ID исполнителя выпуска" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "Статус альбома MusicBrainz" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Тип альбома MusicBrainz" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz ID выпуска" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "усиление дорожки" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "пик дорожки" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "усиление альбома" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "пик альбома" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "эталонная громкость" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "диски" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "дорожки" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "запущено последний раз" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "полное имя" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "точка монтирования" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "люди" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "год" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "год первоначального выпуска" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "закладка" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "формат файла" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Списки воспроизведения" #: ../quodlibet/util/tags.py:166 #, fuzzy msgid "channel count" msgstr "Учётная запись" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "сортировка" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "роли" #, fuzzy #~ msgid "browsers" #~ msgstr "Режимы отображения" #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "Не удалось импортировать %s, поддержка лент аудиофайлов отключена." #~ msgid "Controls the tone of your music with an equalizer." #~ msgstr "Позволяет менять оттенок звучания музыки." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "В Quod Libet произошло исключение. Дамп памяти был сохранён в файл <b>%s</" #~ "b>, который поможет нам при диагностике. Отправьте отчёт об ошибке на " #~ "http://code.google.com/p/quodlibet/issues/list и прикрепите данный файл. " #~ "В файле могут присутствовать такие персональные данные, как информация о " #~ "системе и список недавно воспроизведённых файлов. Если вы не хотите " #~ "распространять эту информацию, вместо этого файла прикрепите <b>%s</b> с " #~ "описанием ваших действий до ошибки." #~ msgid "" #~ "Quod Libet may now be unstable. Closing it and restarting is recommended. " #~ "Your library will be saved." #~ msgstr "" #~ "Quod Libet может работать некорректно. Рекомендуется перезапустить " #~ "программу. Фонотека будет сохранена." #~ msgid "Unable to download lyrics." #~ msgstr "Не удалось загрузить текст песни." #~ msgid "Remove all songs from the queue" #~ msgstr "Удалить все композиции из очереди" #~ msgid "Watch this folder for new songs" #~ msgstr "Следить за появлением новых файлов в этой папке" #~ msgid "Set or toggle the playback order" #~ msgstr "Переключить порядок воспроизведения" #~ msgid "Uninitialized iPod" #~ msgstr "iPod отключён" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Создать новую базу данных на этом iPod?" #~ msgid "_Create Database" #~ msgstr "_Создать базу данных" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Усиление громкости (дБ):" #~ msgid "Combine tags with _multiple values" #~ msgstr "_Объединить теги с разными значениями" #~ msgid "Model:" #~ msgstr "Модель:" #~ msgid "Capacity:" #~ msgstr "Ёмкость:" #~ msgid "Firmware:" #~ msgstr "Микропрограмма:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Удаление лишней дорожки с iPod" #~ msgid "Saving iPod database…" #~ msgstr "Сохранение базы данных iPod…" #~ msgid "Unable to save iPod database" #~ msgstr "Не удалось сохранить базу данных iPod" #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "Не удалось найти libgpod, поддержка iPod отключена." #~ msgid "Playback follows your selection." #~ msgstr "Воспроизведение следует за выделением." #~ msgid "Track Repeat" #~ msgstr "Повтор композиции" #~ msgid "Shuffle" #~ msgstr "Случайно" #~ msgid "Weighted" #~ msgstr "По оценкам" #~ msgid "_Weighted" #~ msgstr "_По оценкам" #~ msgid "_One Song" #~ msgstr "_Одна композиция" #~ msgid "Restart the playlist when finished" #~ msgstr "По окончании списка воспроизведения начать его заново" #~ msgid "Disable Browser" #~ msgstr "Без просмотра" #~ msgid "_Disable Browser" #~ msgstr "_Без просмотра" #, fuzzy #~ msgid "Use header bars" #~ msgstr "Использовать относительные пути" #~ msgid "Filter on _Genre" #~ msgstr "Фильтровать по _жанру" #~ msgid "Filter on _Artist" #~ msgstr "Фильтровать по _исполнителю" #~ msgid "Filter on Al_bum" #~ msgstr "Фильтровать по _альбому" #~ msgid "_Music" #~ msgstr "_Музыка" #~ msgid "Add Bookmark" #~ msgstr "Добавить закладку" #~ msgid "Song _List" #~ msgstr "_Список композиций" #, fuzzy #~ msgid "Rate the selected songs with 0-4 stars" #~ msgstr "Экспорт выбранного списка композиций в HTML." #~ msgid "Embed cover" #~ msgstr "Внедрённые обложки" #, fuzzy #~ msgid "D:" #~ msgstr "D: " #, fuzzy #~ msgid "W:" #~ msgstr "W: " #, fuzzy #~ msgid "E:" #~ msgstr "E: " #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "Прокрутка колёсиком меняет композицию\n" #~ "Shift и прокрутка колёсиком меняет громкость" #~ msgid "Stop _after this song" #~ msgstr "_Остановиться после этой композиции" #~ msgid "_Release:" #~ msgstr "_Выпуск:" #~ msgid "%d _release:" #~ msgid_plural "%d _releases:" #~ msgstr[0] "%d _выпуск:" #~ msgstr[1] "%d _выпуска:" #~ msgstr[2] "%d _выпусков:" #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "Найден %d результат." #~ msgstr[1] "Найдено %d результата." #~ msgstr[2] "Найдено %d результатов." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Выделить «_disc» из «album»" #~ msgid "CDDB Lookup" #~ msgstr "Поиск по CDDB" #~ msgid "Looks up album information in FreeDB. Requires CDDB.py." #~ msgstr "Поиск информации об альбоме на FreeDB. Требует CDDB.py." #~ msgid "Timeout" #~ msgstr "Время ожидания истекло" #~ msgid "Query could not be executed, connection timed out" #~ msgstr "Не удалось выполнить запрос, превышено время ожидания соединения" #~ msgid "Select an album" #~ msgstr "Выберите альбом" #~ msgid "Select the album you wish to retrieve." #~ msgstr "Выберите альбом, который нужно загрузить." #~ msgid "CDDB lookup failed (%s)" #~ msgstr "В CDDB ничего не найдено (%s)" #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s и ещё %(count)d…" #~ msgstr[1] "%(title)s и ещё %(count)d…" #~ msgstr[2] "%(title)s и ещё %(count)d…" #~ msgid "Send To…" #~ msgstr "Отправить…" #~ msgid "Playlist Export" #~ msgstr "Экспорт списка воспроизведения" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "_Закруглять углы обложек альбомов" #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "Закруглять углы миниатюр обложек альбомов." #~ msgid "Re_fresh Library" #~ msgstr "_Обновить фонотеку" #~ msgid "_Remove rating" #~ msgstr "_Удалить оценку" #~ msgid "Unable to open input files" #~ msgstr "Не удалось открыть входные файлы" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "Элемент GStreamer для чтения файлов отсутствует. Проверьте параметры " #~ "установки GStreamer." #~ msgid "Invalid audio backend" #~ msgstr "Некорректная система аудиовывода" #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "Не удалось загрузить систему аудиовывода «%(backend-name)s»." #~ msgid "Print all tags to stdout" #~ msgstr "Вывести все теги на экран (stdout)" #~ msgid "command|filename" #~ msgstr "имя файла" #~ msgid "command|tag" #~ msgstr "тег" #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: не удалось найти «libudev»." #~ msgid "<i>Searching…</i>" #~ msgstr "<i>Поиск…</i>" #~ msgid "" #~ "You can access the following objects by default:\\n '%s' (SongWrapper " #~ "objects)\\n '%s' (Song dictionaries)\\n '%s' (Filename list)\\n " #~ "'%s' (Application instance)" #~ msgstr "" #~ "По умолчанию доступны следующие объекты:\\n '%s' (объекты " #~ "SongWrapper)\\n '%s' (словари Song)\\n '%s' (список Filename)\\n " #~ "'%s' (экземпляр Application)" #~ msgid "" #~ "\n" #~ "\n" #~ "<i>Fingerprints:</i> %d/%d" #~ msgstr "" #~ "\n" #~ "\n" #~ "<i>Отпечатков:</i> %d/%d" #~ msgid "heading|Search" #~ msgstr "Поиск" #~ msgid "%d of %d" #~ msgstr "%d из %d" #~ msgid "Usage: %s %s\n" #~ msgstr "Использование: %s %s\n" #~ msgid "Output Log" #~ msgstr "Журнал" #~ msgid "_Output Log" #~ msgstr "_Журнал" #~ msgid "Warnings" #~ msgstr "Предупреждения" #~ msgid "Errors" #~ msgstr "Ошибки" #~ msgid "General" #~ msgstr "Сообщения" #~ msgid "No log available." #~ msgstr "В журнале нет записей." #~ msgid "Use Last.fm database to fetch covers." #~ msgstr "Позволяет использовать Last.fm для загрузки обложек." #~ msgid "A simple play order plugin that plays songs in reverse order." #~ msgstr "Композиции будут воспроизведены в обратном порядке." #~ msgid "_Download..." #~ msgstr "_Загрузить..." #~ msgid "_New Station..." #~ msgstr "_Новая станция..." #~ msgid "_New Playlist..." #~ msgstr "_Новый список воспроизведения..." #~ msgid "_Convert Encoding..." #~ msgstr "_Изменить кодировку..." #~ msgid "" #~ "\n" #~ "<small>from <i>%s</i></small>" #~ msgstr "" #~ "\n" #~ "<small>с <i>%s</i></small>" #~ msgid "_Edit Bookmarks..." #~ msgstr "_Изменить закладки..." #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s и ещё %(count)d композиция..." #~ msgstr[1] "%(title)s и ещё %(count)d композиции..." #~ msgstr[2] "%(title)s и ещё %(count)d композиций..." #~ msgid "_New Folder..." #~ msgstr "_Создать папку..." #~ msgid "_Edit Display..." #~ msgstr "_Изменить внешний вид..." #~ msgid "_Add a Location..." #~ msgstr "Добавить _адрес..." #~ msgid "Edit Bookmarks..." #~ msgstr "Изменить закладки..." #~ msgid "No song is currently playing." #~ msgstr "Не проигрывает на данный момент." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Не удалось записать в %s, файл будет удалён." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet уже запущен." #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Перезаписать <b>%s</b>?" #~ msgid "" #~ "The file <b>%s</b> already exists.\n" #~ "\n" #~ "Overwrite?" #~ msgstr "" #~ "Файл <b>%s</b> уже существует.\n" #~ "\n" #~ "Перезаписать?" #~ msgid "album artist (sort)" #~ msgstr "исполнитель альбома (сортировка)" #~ msgid "artist (sort)" #~ msgstr "исполнитель (сортировка)" #~ msgid "album (sort)" #~ msgstr "альбом (сортировка)" #~ msgid "performer (sort)" #~ msgstr "исполнитель (сортировка)" #~ msgid "performers (sort)" #~ msgstr "исполнители (сортировка)" #~ msgid "errors" #~ msgstr "ошибки" #, fuzzy #~ msgid "Couldn't talk to %s" #~ msgstr "Не удалось найти модуль %s." #, fuzzy #~ msgid "_Remove image(s)" #~ msgstr "Удалить повторы" #, fuzzy #~ msgid "%d songs" #~ msgstr "%d композиция" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d станция" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "Изменить оценку %d композиций?" #~ msgstr[1] "Изменить оценку %d композиций?" #~ msgstr[2] "Изменить оценку %d композиций?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "Удалить %d повтор?" #~ msgstr[1] "Удалить %d повтора?" #~ msgstr[2] "Удалить %d повторов?" #~ msgid "Output Error" #~ msgstr "Ошибка воспроизведения" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "Не удалось инициализировать конвейер GStreamer. Конвейер может быть " #~ "некорректным или устройство может быть занято. Проверьте настройки " #~ "проигрывателя." #~ msgid "_Add to Playlist" #~ msgstr "Добавить в _список воспроизведения" #~ msgid "Invalid command %r received." #~ msgstr "Получена некорректная команда %r." #~ msgid "Unknown browser %r." #~ msgstr "Неизвестный режим просмотра %r." #~ msgid "Custom _Sort..." #~ msgstr "_Расширенная сортировка..." #~ msgid "Track Headers" #~ msgstr "Дорожка" #~ msgid "People Headers" #~ msgstr "Люди" #~ msgid "Album Headers" #~ msgstr "Альбом" #~ msgid "Date Headers" #~ msgstr "Дата" #~ msgid "File Headers" #~ msgstr "Файл" #~ msgid "Production Headers" #~ msgstr "Производство" #~ msgid "Tag:" #~ msgstr "Заголовок:" #~ msgid "Descending" #~ msgstr "По убыванию" #~ msgid "Too Many Errors" #~ msgstr "Слишком много ошибок" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Воспроизведение остановлено из-за %d ошибок подряд." #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz ID исполнителя альбома" #~ msgid "Failed reading album art \"%s\"" #~ msgstr "Не удалось прочитать обложку «%s»" #~ msgid "Permanently delete this file?" #~ msgstr "Навсегда удалить этот файл?" #~ msgid "Permanently delete these files?" #~ msgstr "Навсегда удалить эти файлы?" #~ msgid "Version:" #~ msgstr "Версия:" #~ msgid "_Cause an Error" #~ msgstr "_Вызвать ошибку" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "Не удалось добавить %s в фонотеку.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Команда «извлечь» не найдена." #~ msgid "Unable to start web browser" #~ msgstr "Не удалось запустить веб-браузер" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Не удалось найти веб-браузер. Присвойте значение переменной $BROWSER или " #~ "убедитесь, что /usr/bin/sensible-browser существует." #~ msgid "" #~ "Cannot save library contents to %s (it's a directory). Please remove it " #~ "and try again." #~ msgstr "" #~ "Не удалось сохранить данные в %s (это директория). Удалите директорию и " #~ "попробуйте снова." #~ msgid "Library Error" #~ msgstr "Ошибка фонотеки" #~ msgid "_Output device:" #~ msgstr "_Устройство воспроизведения:" #~ msgid "translator-credits" #~ msgstr "" #~ "Андрей Федосеев <andrey.fedoseev@gmail.com>\n" #~ "Сергей Федосеев <fedoseev.sergey@gmail.com>\n" #~ "Николай Прокошенко <nikolai@prokoschenko.de>\n" #~ "Anton Shestakov <engored@ya.ru>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Перечислите через пробел другие столбцы для отображения" #~ msgid "_Edit and Continue" #~ msgstr "_Изменить и продолжить" #~ msgid "Search your library" #~ msgstr "Найти в фонотеке" #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Авторские права {dates}\t{authors}\n" #~ "\n" #~ "Это свободное программное обеспечение; условия его распространения\n" #~ "приведены в исходных кодах.\n" #~ "Распространяется БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ,\n" #~ "ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ\n" #~ "ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ КОММЕРЧЕСКОЙ ЦЕННОСТИ\n" #~ "И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.\n" #~ msgid "Do you wish to continue?" #~ msgstr "Продолжить?" #~ msgid "Confirm duplicates removal" #~ msgstr "Подтвердите удаление дубликатов" #~ msgid "You are about to change the rating of %d song." #~ msgid_plural "You are about to change the rating of %d songs." #~ msgstr[0] "Будет изменена оценка %d композиции." #~ msgstr[1] "Будет изменена оценка %d композиций." #~ msgstr[2] "Будет изменена оценка %d композиций." #~ msgid "Confirm rating" #~ msgstr "Подтверждение оценки" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r не содержит режимов просмотра." #~ msgid "Total size unknown" #~ msgstr "Общий размер неизвестен" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r не содержит устройств." #~ msgid "%s: Could not import ctypes." #~ msgstr "%s: не удалось импортировать ctypes." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: не удалось найти media-player-info." #~ msgid "Quod Libet Plugins" #~ msgstr "Расширения Quod Libet" #~ msgid "Color _search terms" #~ msgstr "_Выделять цветом критерий поиска" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Выделять простой поиск синим цветом, расширенный — зелёным, неправильный " #~ "— красным" #~ msgid "_Select" #~ msgstr "_Выбрать" #~ msgid "Separators for splitting tags" #~ msgstr "Символы, по которым будут разделяться теги" #~ msgid "Quod Libet Preferences" #~ msgstr "Настройка Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Не воспроизводившиеся _сегодня" #~ msgid "Not Played in a _Week" #~ msgstr "Не воспроизводившиеся _неделю" #~ msgid "Not Played in a _Month" #~ msgstr "Не воспроизводившиеся _месяц" #~ msgid "B_ottom 40" #~ msgstr "40 _худших" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "40 композиций, которые воспроизводились меньшее количество раз, чем " #~ "остальные (может быть выбрано больше 40, если есть композиции, " #~ "воспроизводившиеся равное количество раз)" #~ msgid "gtk-media-next" #~ msgstr "gtk-media-next" #~ msgid "gtk-media-previous" #~ msgstr "gtk-media-previous" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "Choose New Stations" #~ msgstr "Выберите новые станции" #~ msgid "Add" #~ msgstr "Добавить" #~ msgid "Bitrate" #~ msgstr "Битрейт" #~ msgid "Genre" #~ msgstr "Жанр" #~ msgid "_Stations..." #~ msgstr "_Станции..." #~ msgid "Date" #~ msgstr "Дата" #~ msgid "Quod Libet" #~ msgstr "Quod Libet" #~ msgid "Initializing audio backend (%s)" #~ msgstr "Инициализация системы аудиовывода (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "Инициализация фонотеки (%s)" #~ msgid "Unable to save library" #~ msgstr "Не удалось сохранить фонотеку" ������������������������������������������������������������������������������quodlibet-3.9.1/po/lt.po����������������������������������������������������������������������������0000644�0001750�0001750�00000550626�13115512745�015361� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jonas <jonas.slivka@gmail.com>, 2006, Naglis Jonaitis <njonaitis@gmail.com>, 2011. msgid "" msgstr "" "Project-Id-Version: Quod Libet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2012-12-07 17:22+0300\n" "Last-Translator: Naglis Jonaitis <njonaitis@gmail.com>\n" "Language-Team: Lithuanian (http://www.transifex.net/projects/p/quodlibet/" "team/lt/)\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2)\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Redaguoti Jūsų garso failų žymes" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Garso žymių redaktorius" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Klausykite, naršykite ar redaguokite savo muzikos kolekciją" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Muzikos grotuvas" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "Pa_vadinimas" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Atlikėjas" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "_Žanras" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "Į_vertis" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Rikiuoti _pagal..." #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Nuostatos" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Albumų sąrašas" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Albumų sąrašas" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Visi albumai" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d albumas" msgstr[1] "%d albumai" msgstr[2] "%d albumų" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Atnaujinti albumo _viršelį" msgstr[1] "Atnaujinti albumų _viršelius" msgstr[2] "Atnaujinti albumų _viršelius" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Dainos nėra albume" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d takelis" msgstr[1] "%d takeliai" msgstr[2] "%d takelių" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d diskas" msgstr[1] "%d diskai" msgstr[2] "%d diskų" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Visi albumai" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Albumų sąrašo nuostatos" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Rodyti albumų _viršelius" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Į paiešką įtraukti atlikėju_s" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[pasirinktys]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Albumo vaizdas" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Nežinoma" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Naujas kanalas" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Įveskite garso kanalo vietą:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Audio kanalai" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Audio kanalai" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Atsisiųsti" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Atsiųsti failus" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Atsiųsti failą" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Negalima pridėti kanalo" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> negali būti pridėta. Serveris gali neveikti arba nurodyta vieta " "nėra garso kanalas." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "Atnaujinti biblioteką" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Ištrinti failus" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Dabartinė garso posistemė nepalaiko URL adresų. Audio kanalų naršyklė " "išjungta." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Bibliotekos naršyklė" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d daina" msgstr[1] "%d dainos" msgstr[2] "%d dainų" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Netaisyklingas šablonas" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Albumų kolekcija" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "Albumų _kolekcija" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "Nežinoma (-s) %s" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "Kelios lauko %s reikšmės" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Individualus" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Žymė" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Sulieti" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Albumų sąrašo nuostatos" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Visas dydis:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Visas dydis:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Langų naršyklės nuostatos" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Rodyti albumų _viršelius" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Visi albumai" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "organizacija" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Failų sistema" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Failų sistema" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Negalima kopijuoti dainų" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Failai, kuriuos pasirinkote, negali būti nukopijuoti į kitą dainų sąrašą ar " "eilę." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Pridėti į biblioteką" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Nepalaikomas failo tipas" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Stočių sąrašuose gali būti tik stočių vietos, ne kiti stočių sąrašai ar " "grojaraščiai. Šios vietos negali būti įkeltos:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Negalima pridėti stoties" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Interneto radijas" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Atsiunčiamas stočių sąrašas" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Nauja stotis" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Įveskite Interneto radijo stočių adresą:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Elektroninė" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "Hiphopas / Repas" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Senesnė muzika" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japonų" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "Indų" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Religinė" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Topai" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Turkų" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Regis / „Šokių salės“ regis" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "Lotynų" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "Koledžų radijo stotys" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Pokalbiai / Žinios" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambientinė" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Džiazas" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Klasikinė" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternatyvioji" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metalas" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Kantri" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Žinios" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Šlageriai" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Fank" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Bliuzas" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Pank" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Regetonas" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Slavų" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Graikų" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gotikinė" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rokas" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Atnaujinti stotis" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Interneto radijas" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Nauja stotis" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "_Atnaujinti stotis" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Visos stotys" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Mėgstamiausios" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Be kategorijos" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Nerasta stočių" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Jokių Interneto radijo stočių nerasta %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Visos šios stotys jau yra Jūsų bibliotekoje." #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "Pridėti prie Mėgstamiausių" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Pašalinti iš Mėgstamiausių" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d stotis" msgstr[1] "%(count)d stotys" msgstr[2] "%(count)d stočių" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Įrenginio savybės" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Įrenginys:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Neprijungtas" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Prijungimo taškas:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Vardas:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Medijos įrenginiai" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Medijos įrenginiai" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "At_jungti" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Savybės" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "Per_vadinti" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> naudojama, <b>%s</b> prieinama" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nėra prijungtas." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopijuojama <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Negalima kopijuoti dainos" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Šiai dainai nepakanka laisvos vietos." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nepavyko nukopijuoti." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Negalima ištrinti dainų" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Nepavyko ištrinti <b>%(song)s</b>." #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "Nepavyko ištrinti „<b>%s</b>“." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Negalima ištrinti dainos" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Nepavyko atjungti <b>%s</b>." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Negalima atjungti įrenginio" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" "Nerasta jokių įrenginių posistemių, įvairialypės terpės naršyklė išjungta." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Langų naršyklė" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Langų naršyklė" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "P_asirinkti viską" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Viskas" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Langų naršyklės nuostatos" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Grojaraščiai" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Grojaraščiai" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Pašalinti iš grojaraščio" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importuoti" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Naujas grojaraštis" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Negalima importuoti grojaraščio" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet gali importuoti tik M3U ir PLS formato grojaraščius." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Negalima pervadinti grojaraščio" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importuoti grojaraštį" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Naujas grojaraštis" #: ../quodlibet/browsers/playlists/menu.py:86 #, fuzzy, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Ar tikrai norite pakeisti visų %d dainų įvertį?" msgstr[1] "Ar tikrai norite pakeisti visų %d dainų įvertį?" msgstr[2] "Ar tikrai norite pakeisti visų %d dainų įvertį?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Naujas grojaraštis" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Langų naršyklės nuostatos" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Grojaraščiai" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Ar tikrai norite ištrinti grojaraštį '%s'?" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Visa pažymėto grojaraščio informacija bus ištrinta be atkūrimo galimybės." #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Įveskite naujo grojaraščio pavadinimą:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importuojamas grojaraštis.\n" "\n" "%(current)d/%(total)d dainų pridėta." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "Ap_riboti rezultatus" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Paieška bibliotekoje" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "Pa_ieška bibliotekoje" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Langų naršyklė" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Ieškoti" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "vieta" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet nėra paleistas." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "muzikos biblioteka ir grotuvas" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[pasirinktis]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Parašyti dabar grojamos dainos pavadinimą ir išeiti" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Iškart pradėti groti" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Peršokti į kitą dainą" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" "Peršokti į praėjusią dainą arba groti esamą dainą iš naujo, jei netoli " "pradžios" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Peršokti į praėjusią dainą" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Pradėti grojimą" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pristabdyti grojimą" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Perjungti grojimo/pauzės režimą" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Sustabdyti grojimą" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Pagarsinti" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Pritildyti" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Parašyti apie grotuvo būseną" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Slėpti pagrindinį langą" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Rodyti pagrindinį langą" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Perjungti pagrindinio lango matomumą" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Fokusuoti grojantį grotuvą" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Naikinti aktyvius naršyklių filtrus" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Atnaujinti biblioteką" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Išjungti naršyklę" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Parašyti dabartinį grojaraštį" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Parašyti eilės turinį" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Parašyti eilės turinį" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Paleisti be įskiepių" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet nėra paleistas." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Išjungti Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Peršokti grojamoje dainoje" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Perjungti grojimo/pauzės režimą" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Išjungti/įjungti kartojimo veikseną" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Nustatyti garsumą" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Ieškoti jūsų garsų bibliotekoje" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "užklausa" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Groti failą" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "failo vardas" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Įvertinti grojamą dainą" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Nustatyti dabartinę naršyklę" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Įvertinti grojamą dainą" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Atverti naują naršyklę" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Rodyti ar slepti eilę" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Rodyti ar slėpti pagrindinį dainų sąrašą" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtruoti pagal atsitiktinę reikšmę" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Žymė" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtruoti pagal žymės reikšmę" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "žymė=reikšmė" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Pridėti į eilę failą ar užklausą" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Pridėti į eilę kableliu atskirtus failus" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "failo vardas" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Spausdinti užklausų rezultatų failų vardus į standartinę išvestį" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Pašalinti iš eilės failą ar užklausą" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Netaisyklingas „%s“ argumentas." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Pamėginkite „%s“ --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Nežinomas įrenginys" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "Nepavyko įkelti %s, kuri yra būtina įrenginio palaikymui." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "„%r“ nėra palaikomas įrenginys." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Nepavyko rasti %s." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Inicijuojama garso posistemė." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Bandoma '%s'" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Nepavyko prisijungti prie įrenginio posistemės." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Įrenginio posistemė inicijuota." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Failo _vardo šablonas:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopijuoti albumų _viršelius" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "Šalinti nenaudojamus vi_ršelius bei aplankus" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Įvyko klaida" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Ignoruoti vis_as klaidas" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "aprašymas" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "audio žymių redaktorius" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "aplankas" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "„MusicBrainz“ takelio ID" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "„MusicBrainz“ takelio ID" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Netaisyklinga koduotė]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Pa_vadinimas" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Garso žymių redaktorius" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "Žymes pradėti iš _didžiosios raidės" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 #, fuzzy msgid "_Human title case" msgstr "Įjungti žmonėms tinkamą pavadinimų tvarkymą" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Naudoti bendrines anglų kalbos taisykles pavadinimams, pvz. \"Dark Night of " "the Soul\"" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Langų naršyklės nuostatos" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Visas dydis:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Redaguoti rodymą" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Svoris" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 #, fuzzy msgid "_Outline" msgstr "_Išvestis:" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Redaguoti rodomą informaciją" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "Perž_iūra" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 #, fuzzy msgid "Automatic Masking" msgstr "Auto_matinis" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 #, fuzzy msgid "Automatic Rating" msgstr "Auto_matinis" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 #, fuzzy msgid "Reggae" msgstr "Regetonas" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 #, fuzzy msgid "Soft Rock" msgstr "Rokas" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "Dabartinė garso posistemė nepalaiko URL adresų. Audio kanalų naršyklė " "išjungta." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%.1f sekundė" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Individualus" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "Valyti _klaidas" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Muzikos grotuvas" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Interneto radijas" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "Į_vertis" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "Numatytasis" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Negalima išsaugoti dainos" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Nerasta priedų." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Dainos žodžiai" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Išvalyti paiešką" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Dainos žodžiai" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "vieta" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Slėpti pagrindinį langą" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Nuostatos" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Kelio šablonai" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Kelio šablonai" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d daina" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Išvesties sąranka" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "Kelio šablonai" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Nepavyko prisijungti prie įrenginio posistemės." #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "vieta" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Pa_vadinimas" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Nepavyko prisijungti prie įrenginio posistemės." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Kita" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, fuzzy, python-format msgid "Could not contact service '%s'." msgstr "Nepavyko prisijungti prie įrenginio posistemės." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Įrenginys:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Vardas:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Kita:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Atlikėjas" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "Failo _vardo šablonas:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Atsitiktinis a_lbumas" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "albumai" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Svoris" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Atsitiktinis a_lbumas" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Importuoti grojaraštį" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importuoti" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 #, fuzzy msgid "Alternative Seek Bar" msgstr "Alternatyvioji" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Dainos žodžiai" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Negrojama" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d daina" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "Kelio šablonai" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Negrojama" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "_Grojaraščiai" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Groti/Pristabdyti" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "Ankstesnė" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 #, fuzzy msgid "_Next" msgstr "Kita" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Išmaišytai" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Kartoti" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Po šios dainos sustabdyti" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Atverti naują naršyklę" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "_Redaguoti žymes" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 #, fuzzy msgid "_Information" msgstr "Informacija" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Grojaraščiai" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Elgsena" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Redaguoti rodomą informaciją" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Dainos žodžiai" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Dainos žodžiai" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Klaidos" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 #, fuzzy msgid "Waveform Seek Bar" msgstr "Alternatyvioji" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Failų" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "Perž_iūra" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Filtras _atlikėjui" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 #, fuzzy msgid "Default" msgstr "Numatytasis" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "Individualizuotas rikiavimas" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Filtras _žanrui" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Filtras _atlikėjui" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio kanalai" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Įveskite garso kanalo vietą:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Importuoti grojaraštį" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importuoti" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Nerasta stočių" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "Failo _vardo šablonas:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "Failo _vardo šablonas:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, fuzzy, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Ar tikrai norite pašalinti %d pasikartojančią dainą?" msgstr[1] "Ar tikrai norite pašalinti %d pasikartojančią dainą?" msgstr[2] "Ar tikrai norite pašalinti %d pasikartojančią dainą?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "Pasikartojančios dainos bus pašalintos iš grojaraščio '%s'." #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Naujas grojaraštis" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "paskutinį kartą grota" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "Eilėje" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Niekada" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Nėra dainų" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Išsaugotos paieškos reikšmės" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Nepavyko prisijungti prie įrenginio posistemės." #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "Per_vadinti" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Biblioteka" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Derinimas" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Slėpti pagrindinį langą" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Failo vardas" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Negalima išsaugoti dainos" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Albumų viršeliai" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Dydis" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Paieška:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Ieškoti" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Albumų viršeliai" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "Redaguoti _žymes..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "Redaguoti _žymes..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Žymės" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "„MusicBrainz“ albumo tipas" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Failo vardas" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Diskas" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Takelis" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Pa_vadinimas" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Atlikėjas" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "„MusicBrainz“ albumo tipas" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "užklausa" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Ieškoti" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Nerasta priedų." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Naršyklės" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Negalima sukurti aplanko" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "žymė" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "Per_vadinti" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "žymė" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Netaisyklingas šablonas" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Netaisyklinga reikšmė" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "Individualizuotas rikiavimas" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Negalima kopijuoti dainų" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Išjungti naršyklę" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Duplicate Key" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Redaguoti rodomą informaciją" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtruoti pagal žymės reikšmę" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Filtras _žanrui" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Eilėje" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Įrašyti" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "„MusicBrainz“ takelio ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "aplankas" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "_Albumo režimas" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Atnaujinti stotis" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Importuoti grojaraštį" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 #, fuzzy msgid "Error during sync" msgstr "Klaida įkeliant %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "Per_vadinti" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Importuoti grojaraštį" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Informacija" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Importuoti grojaraštį" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Negalima importuoti grojaraščio" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Nepavyko atjungti <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Atnaujinti biblioteką" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Atnaujinti biblioteką" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Redaguoti žymes" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Redaguoti žymes" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Visi albumai" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "Perž_iūra" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Žymė" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Negalima ištrinti dainų" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Ieškoti" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "Kelio šablonai" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Redaguoti išsaugotas paieškos reikšmes..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Nus_palvinti paieškos žodžius" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Biblioteka" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Tikrinami prijungimo taškai" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Peržvelgiama biblioteka" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Peržvelgiama %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Rodyti su_generuotas programines žymes" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 #, fuzzy msgid "Too many arguments" msgstr "Per daug klaidų" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "aprašymas" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Reikšmė" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Garso žymių redaktorius" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Nepasirinkta jokių dainų." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Filtruoti pagal žymės reikšmę" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Filtruoti pagal žymės reikšmę" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Nėra laiko informacijos" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Negalima pervadinti failo" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Failas" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Rodyti bendrą vartojimo informaciją" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> nėra tinkama vieta." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "Nežinoma" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Iš eilės" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "Iš _eilės" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Atsitiktine tvarka" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Atsitiktine tvarka" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Kartoti" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Viena daina" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Srautas" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Buferizuojama" #: ../quodlibet/player/gstbe/player.py:319 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "Nepavyko sukurti GStreamer išvesties." #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 #, fuzzy msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "GStreamer išvestis naudojama grojimui, pvz. 'alsasink device=default'. " "Palikie tuščią, jei norite naudoti numatytąją išvestį." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Išvestis:" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f sekundė" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "_Buferizavimo trukmė:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nerasta stočių" #: ../quodlibet/player/gstbe/util.py:112 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "Netaisyklinga GStreamer išvestis, bandoma naudoti numatytąją." #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Negalima sukurti garso išvesties" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Garso įrenginys %r nerastas. Patikrinkite Xine nuostatas ~/.quodlibet/config " "faile." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, fuzzy, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Nepavyko susieti GStreamer išvesties: '%s'" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Priedai" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Palaikomi formatai: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Garso įrenginys: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Pradžia" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/D" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Laikas" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Žymės vardas" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Žymės" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtrai" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "_Neseniai grota" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Neseniai _pridėta" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 _geriausių" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Visos stotys" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Atsitiktinis žanras" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Atsitiktinis _atlikėjas" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Atsitiktinis a_lbumas" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 dažniausiai grotų dainų (gali būti parinkta daugiau nei 40, jei kai " "kurios bus grotos tiek pat kartų)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Reikšmė:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Išsaugotos reikšmės" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Redaguoti išsaugotas reikšmes..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_matinis" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "_Takelio režimas" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "_Albumo režimas" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Garsumo derinimas (Replay Gain)" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Nežinoma" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Filtruoti pagal žymės reikšmę" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Failų" #: ../quodlibet/qltk/delete.py:63 #, fuzzy msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "Pasikartojančios dainos bus pašalintos iš grojaraščio '%s'." #: ../quodlibet/qltk/delete.py:72 #, fuzzy msgid "The selected files will be deleted from disk." msgstr "Pasikartojančios dainos bus pašalintos iš grojaraščio '%s'." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Ištrinti failus" #: ../quodlibet/qltk/delete.py:106 #, fuzzy msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "Pasikartojančios dainos bus pašalintos iš grojaraščio '%s'." #: ../quodlibet/qltk/delete.py:115 #, fuzzy msgid "The selected files will be moved to the trash." msgstr "Pasikartojančios dainos bus pašalintos iš grojaraščio '%s'." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Perkelti į šiukšlinę" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Perkeliama %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Nepavyko perkelti į šiukšlinę" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Nepavyko perkelti <b>%s</b> į šiukšlinę." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Ištrinama %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Negalima ištrinti failo" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Nepavyko ištrinti <b>%s</b>." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Atsiuntimai" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Dydis" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "trūksta iš %d dainos" msgstr[1] "trūksta iš %d dainų" msgstr[2] "trūksta iš %d dainų" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "skirtinga tarp %d dainos" msgstr[1] "skirtinga tarp %d dainų" msgstr[2] "skirtinga tarp %d dainų" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Iš_skaidyti į keletą reikšmių" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Išskaidyti diską iš _albumo" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Išskaidyti _versiją iš pavadinimo" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Išskaidyti aranžuotoją iš a_tlikėjo" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Išskaidyti muzikantą iš atlikėjo" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "Išskaidyti _Muzikantą iš Pavadinimo žymės" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "Išskaidyti _Originalo atlikėją iš Pavadinimo žymės" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Pridėti žymę" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "Žy_mė:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Redaguoti žymes" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Rodyti su_generuotas programines žymes" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Prieiti prie visų žymių, įskaitant kompiuterio sugeneruotas, pvz. " "MusicBrainz ar ReplayGain žymes" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Niekada" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Negalima pridėti žymės" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Negalima pridėti dainos" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Negalima pridėti <b>%s</b>\n" "\n" "Failai, kuriuos pasirinkote, nepalaiko kelių reikšmių redagavimo." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Netaisyklinga žymė" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Netaisyklinga žymė <b>%s</b>\n" "\n" "Failai, kuriuos pasirinkote, nepalaiko šios žymės redagavimo." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Netaisyklinga reikšmė" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Netaisyklinga reikšmė: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Žymė gali būti netiksli" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> buvo pakeista, kol veikė programa. Išsaugojimas neatnaujinus " "bibliotekos gali panaikinti kitus dainos pakeitimus.\n" "\n" "Ar vistiek išsaugoti šią dainą?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Negalima išsaugoti dainos" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Nepavyko išsaugoti <b>%s</b>. Failas gali būti apsaugotas nuo rašymo, " "sugadintas arba neturite teisių jo redaguoti." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Daugiau pasirinkčių..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Priedai" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s bei dar %(count)d" msgstr[1] "%(title)s bei dar %(count)d" msgstr[2] "%(title)s bei dar %(count)d" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso nuostatos" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "At_skirti ties:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Žymių redagavimas" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Aplankai" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Naujas aplankas" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Pasirinkti visus poaplankius" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Naujas aplankas" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Įveskite naujo aplanko vardą:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Negalima sukurti aplanko" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Negalima ištrinti aplanko" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Dainos" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "atliko %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Diskas %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Takelis %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Redaguoti rodomą informaciją" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Nepasirinkta jokių dainų." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Nėra dainų" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informacija" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Dainos žodžiai" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Prodiusavo %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "atlikėjas" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "atlikėjai" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "muzikantai" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Niekada" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d kartą" msgstr[1] "%(n)d kartus" msgstr[2] "%(n)d kartų" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "pridėta" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "paskutinį kartą grota" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "grota" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "praleista" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "įvertis" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "trukmė" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Informacija" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "Didėjančia tvarka" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitų dažnis" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "failo dydis" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "paskutinį kartą pakeista" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d pasirinkta" msgstr[1] "%d pasirinkta" msgstr[2] "%d pasirinkta" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Takelis neprieinamas" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Takelių sąrašas" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d daina be jokio albumo" msgstr[1] "%d dainos be jokio albumo" msgstr[2] "%d dainų be jokio albumo" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Pasirinkta diskografija" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d daina be jokio atlikėjo" msgstr[1] "%d dainos be jokio atlikėjo" msgstr[2] "%d dainų be jokio atlikėjo" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albumai" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Visa trukmė:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Visas dydis:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Failų" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Atsisiųsti" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Redaguoti vaizdą..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Nerasta dainos žodžių šiai dainai." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Ieškoma dainos žodžių..." #: ../quodlibet/qltk/maskedbox.py:20 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "Ar tikrai norite pašalinti %d pasikartojančią dainą?" #: ../quodlibet/qltk/maskedbox.py:21 #, fuzzy msgid "The selected songs will be removed from the library." msgstr "Pasikartojančios dainos bus pašalintos iš grojaraščio '%s'." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Atšaukti žymių pakeitimus?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Žymės buvo pakeistos, bet neišsaugotos. Išsaugoti šiuos failus, atkurti " "buvusias reikšmes ar atsisakyti pakeitimų?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Niekada" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Failas egzistuoja" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Pervadinti failus" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Aktyvios užduotys" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d užduotys vykdomos" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Perjungti grojimo/pauzės režimą" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Perjungti grojimo/pauzės režimą" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Priedų klaidos" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Įjungta" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Išjungta" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Be kategorijos" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Tvarka:" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Žymių redagavimas" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Visas dydis:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Nerasta priedų." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Priedai" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Rodyti klaidas" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Diskas" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Takelio nr." #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "grupavimas" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bumas" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Failo _vardas" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "T_rukmė" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Automatiškai peršokti prie grojamos dainos" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Kai pasikeičia grojama daina, perškoti ties ja dainų sąraše" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Kita:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Redaguoti vaizdą..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Matomi stulpeliai" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Pavadinime yra dainos versija" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Į paiešką įtraukti atlikėju_s" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Albumo pavadinime yra disko _dalis" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Failo varde yra _aplanko vardas" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Nuostatos" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Dainų sąrašas" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Matomi stulpeliai" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Bendras filtras:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Taikyti šią užklausą kartu su kitomis" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Ieškoti" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Naršyklės" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Patvirtinti su_dėtinius įverčius" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "Prašyti patvirtinimo prieš pakeičiant kelių dainų įvertį vienu metu" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Įjungti vien_o paspaudimo įverčius" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "Įjungti įverčių keitimą spragtelėjus įverčio stulpelyje dainų sąraše" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Įverčiai" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Pageidautina naudoti į_terptinius albumų viršelius" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Pasirinkite, jei norite, kad pirmenybė būtų teikiama į audio failus " "įterptiems albumų viršeliams (kai prieinama)" #: ../quodlibet/qltk/prefs.py:319 #, fuzzy msgid "_Fixed image filename:" msgstr "_Priverstinai naudotino paveikslėlio failo vardas:" #: ../quodlibet/qltk/prefs.py:321 #, fuzzy msgid "The single image filename to use if selected" msgstr "" "Naudotino albumo viršelio paveikslėlio failo vardas (esant keliems galimiems " "variantams)" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" "Naudotino albumo viršelio paveikslėlio failo vardas (esant keliems galimiems " "variantams)" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Albumų viršeliai" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Grojimas" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Išvesties sąranka" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Jei Replay Gain garso derinimo informacija dainai neprieinama, pakoreguoti " "garsumo lygį šia reikšme" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "_Numatytasis derinimas (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Pakoreguoti garsumo lygį visoms dainoms šia reikšme, kol neatsiras iškraipymų" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "_Pirminis derinimas (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "Įjungti Replay Gain garso d_erinimą" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Garsumo derinimas (Replay Gain)" #: ../quodlibet/qltk/prefs.py:450 #, fuzzy msgid "_Default rating:" msgstr "Numatytasis" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "Įverčiai" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Saugoti įverčius bei grojimo _kartų vertes" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_El. paštas:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "Įverčiai bei grojimo kartų vertės bus susietos su šiuo el. pašto adresu" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Automatiškai išsaugoti žymių pakeitimus" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "Redaguojant keletą failų išsaugoti žymių pakeitimus be patvirtinimo" #: ../quodlibet/qltk/prefs.py:587 #, fuzzy msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Skyriklių, naudojamų žymių reikšmių išskaidymui, sąrašas. Skyrikliai " "atskirti tarpais" #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Žymės" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Atnaujinti stotis" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "At_naujinti biblioteką paleidus programą" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "Pa_ieška bibliotekoje" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Ieškoti pasikeitimų bibliotekoje" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Iš naujo įkelti _biblioteką" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Iš naujo įkelti dainas į biblioteką (tai gali užtrukti)" #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "Peržvelgiami aplankai" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Nėra dainų" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s bei dar %(count)d" msgstr[1] "%(title)s bei dar %(count)d" msgstr[2] "%(title)s bei dar %(count)d" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Savybės" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Eilė" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "Valyti _klaidas" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d daina (%(time)s)" msgstr[1] "%(count)d dainos (%(time)s)" msgstr[2] "%(count)d dainų (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Naršyti bibliotekoje" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Perjungti pagrindinio lango matomumą" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Grojimas" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Pasirinkti aplankus" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Negalima pridėti dainų" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> naudoja nepalaikomą protokolą." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Peršokti ties grojama daina" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Failas" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Dainos" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Rodymas" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Naršyklės" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Valdymas" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Pagalba" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "_Pridėti aplanką..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "_Pridėti failą..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Pridėti vietą" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "Redaguoti _žymes..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Po šios dainos sustabdyti" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Pagalba Internete" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Paieškos bibliotekoje pagalba" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Pridėti vietą" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Įveskite garso failo vietą:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Negalima pridėti vietos" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nėra tinkama vieta." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Pridėti muziką" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Pridėti aplanką..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Muzikos grotuvas" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Pridėti failą..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Ar tikrai norite pakeisti visų %d dainų įvertį?" #: ../quodlibet/qltk/ratingsmenu.py:26 #, fuzzy msgid "The saved ratings will be removed" msgstr "Pasikartojančios dainos bus pašalintos iš grojaraščio '%s'." #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Pažymėtų dainų įvertis bus pakeistas į '%s'" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "Pašalinti pasikartojančias dainas" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "Į_vertis" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Pakeisti tarpus „_“ simboliu" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Pašalinti su _Windows nesuderinamus simbolius" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Pašalinti _diakritinius ženklus" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Pašalinti ne _ASCII simbolius" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Naudoti tik _mažąsias raides" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Pervadinti failus" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Kelio šablonai" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Redaguoti išsaugotus šablonus..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "Perž_iūra" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Naujas vardas" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Negalima pervadinti failo" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Pervadinimas iš <b>%s</b> į <b>%s</b> nepavyko. Greičiausiai paskirties " "failas jau egzistuoja arba neturite teisių sukurti naują ar pašalinti seną." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Ignoruoti vis_as klaidas" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Tęsti" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Kelias neabsoliutus" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Šablone\n" "\t<b>%s</b>\n" "yra „/“, bet jis neprasideda šaknimi. Siekdami išvengti netaisyklingų " "aplankų, nurodykite kelyje šaknį jį pradėdami „/“ arba „~/“." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Dainos, esančios šiuose aplankuose, bus pridėtos į Jūsų biblioteką jos " "atnaujinimo metu" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Pasirinkti aplankus" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Išsaugotos paieškos reikšmės" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Redaguoti išsaugotas paieškos reikšmes..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Ieško_ti bevedant užklausą" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Rodyti paieškos rezultatus vartotojui baigus įvesti užklausą." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Riba:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Svoris" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Rodyti, kiek liko laiko" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Dainos žodžiai" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Fokusuoti grojantį grotuvą" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Peršokti grojamoje dainoje" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Negalima ištrinti dainų" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Negalima ištrinti dainų" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtras laukui „%s“" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "_Visos antraštės" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Takelio antraštės" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Albumo antraštės" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "A_tlikėjų antraštės" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Dat_os antraštės" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_Failo antraštės" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Produkcijos antraštės" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Individualizuoti antraštes..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Nus_palvinti paieškos žodžius" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Pridėti į _eilę" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Kopijuoti į įrenginį" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Pašalinti iš bibliotekos" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Pakeisti simbolius „_“ tarpo simboliais" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Žymes pradėti iš _didžiosios raidės" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Išskaidyti į keletą _reikšmių" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Žymės pagal kelią" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Žymės pakeičia jau esamas" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Žymės pridedamos prie esamų" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Šablonas\n" "\t<b>%s</b>\n" "yra netaisyklingas. Greičiausiai jame yra kelios tos pačios žymės ar " "netvarkingi skliausteliai (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Netaisyklingos žymės" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Netaisyklingos žymės <b>%s</b>\n" "\n" "Failai, kuriuos pasirinkote, nepalaiko šių žymų redagavimo." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Šablonas, kurį įvedėte, netaisyklingas. Įsitikinkite, kad įvedėte < ir " "> kaip \\< ir \\> ir kad Jūsų žymės suderintos.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Redaguoti rodomą informaciją" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Takelių numeriai" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Pradėti _nuo:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "Iš _viso takelių:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Groti/Pristabdyti" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Ankstesnė" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "ir %d daugiau..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Išsaugomos dainos, kurias pakeitėte." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d dainų išsaugota\n" "(%(remaining)s liko)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Perkeliama %(current)d/%(total)d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Tikrinami prijungimo taškai" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "vieta" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Grojaraštis vardu %s jau egzistuoja." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Atnaujinti albumo _viršelį" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Failų sistema" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Rodyti bendrą vartojimo informaciją" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Rodyti versijos numerį ir autorių teises" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[pasirinktys]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Pasirinkimas „%r“ neatpažintas." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Pasirinkimas „%r“ reikalauja argumento." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "„%r“ nėra unikalus priešdėlis." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d sekundė" msgstr[1] "%d sekundės" msgstr[2] "%d sekundžių" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Nėra laiko informacijos" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekundė" msgstr[1] "%d sekundės" msgstr[2] "%d sekundžių" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minutė" msgstr[1] "%d minutės" msgstr[2] "%d minučių" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d valanda" msgstr[1] "%d valandos" msgstr[2] "%d valandų" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d diena" msgstr[1] "%d dienos" msgstr[2] "%d dienų" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d metai" msgstr[1] "%d metai" msgstr[2] "%d metų" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "nereikia" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Data turi būti įvesta tokiais formatais: „YYYY“, „YYYY-MM-DD“ arba „YYYY-MM-" "DD HH:MM:SS“." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "ReplayGain garso pokyčiai turi būti įvesti „x.yy dB“ formatu." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "ReplayGain garso maksimumai turi būti įvesti „x.yy“ formatu." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz ID turi būti UUID formato." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz leidimo statusas privalo būti 'official', 'promotional' arba " "'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Kalba privalo būti ISO 639-2 trijų raidžių kodas" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Negalima redaguoti dainos" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Nepavyko išsaugoti <b>%s</b>. Failas gali būti apsaugotas nuo rašymo, " "sugadintas arba neturite teisių jo redaguoti." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Netaisyklinga koduotė]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "albumas" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "aranžuotojas" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "aranžuotojai" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "aranžuotojas" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "autorius" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "autoriai" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "kompozitorius" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "kompozitoriai" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "kompozitorius" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "dirigentas" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "dirigentai" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "dirigentas" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "kontaktai" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "autorių teisės" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "aprašymas" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "žanras" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "žanras" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "muzikantas" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "grupavimas" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "kalba" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licencija" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "vieta" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "dainos ž. autorius" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "dainos ž. autoriai" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "dainos ž. autorius" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organizacija" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "pavadinimas" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versija" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "tinklalapis" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "albumo atlikėjas" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "disko dalis" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "diskas" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "takelio nr." #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "leidinio ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "originalo išleidimo data" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "originalus albumas" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "originalus atlikėjas" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "įrašymo data" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "išleidimo šalis" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "„MusicBrainz“ takelio ID" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "„MusicBrainz“ leidimo ID" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "„MusicBrainz“ leidimo ID" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "„MusicBrainz“ atlikėjo ID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "„MusicBrainz“ leidimo ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "„MusicBrainz“ TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "„MusicIP“ PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "„MusicBrainz“ albumo statusas" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "„MusicBrainz“ albumo tipas" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "„MusicBrainz“ leidimo ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "takelio garso lygis" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "takelio maks. garsumo lygis" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "albumo garso lygis" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "albumo maks. garsumo lygis" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "garsumo etalonas" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "diskai" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "takeliai" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "paskutinį kartą grota" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "pilnas vardas" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "prijungimo taškas" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "atlikėjai" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "metai" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "originalo išleidimo metai" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "žymė" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "failo formatas" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Grojaraščiai" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Naršyklės" #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "Nepavyko įkelti %s. Audio kanalų naršyklė išjungta." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Quod Libet programoje aptikta nenumatyta išimtis. Išimties informacija " #~ "išsaugota faile <b>%s</b>, kuri padės mums derinti programą. Prašome " #~ "užpildyti pranešimą apie klaidą tinklalapyje http://code.google.com/p/" #~ "quodlibet/issues/list ir prisegti šį failą arba tekste įterptį jo turinį. " #~ "Šiame faile gali būti šiek tiek informacijos apie Jus ar Jūsų kompiuterį, " #~ "pvz. neseniai klausytų dainų sąrašas. Jei Jums tai nepriimtina, vietoje " #~ "to atsiųskite failą <b>%s</b> su veiksmų, kuriuos atlikote prieš " #~ "įvykstant klaidai, aprašymu.\n" #~ "\n" #~ "Quod Libet dabar gali būti nestabilus. Patartina išeiti iš programos ir " #~ "paleisti ją iš naujo. Jūsų biblioteka bus išsaugota." #~ msgid "Unable to download lyrics." #~ msgstr "Negalima atsiųsti dainos žodžių." #~ msgid "Remove all songs from the queue" #~ msgstr "Iš eilės pašalinti visas dainas" #~ msgid "Watch this folder for new songs" #~ msgstr "Stebėti šį aplanką dėl naujų dainų" #~ msgid "Set or toggle the playback order" #~ msgstr "Įjungti ar perjungti grojimo tvarką" #~ msgid "Uninitialized iPod" #~ msgstr "Neinicijuotas iPod grotuvas" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Ar norite sukurti tuščią duomenų bazę šiame iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "Ga_rsumo derinimas (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Sujungti žymes su keletu _reikšmių" #~ msgid "Model:" #~ msgstr "Modelis:" #~ msgid "Capacity:" #~ msgstr "Talpa:" #~ msgid "Firmware:" #~ msgstr "Programinė įranga:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Šalinamas vienišas takelis iPod grotuve" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Negalima išsaugoti iPod duomenų bazės" #~ msgid "Unable to save iPod database" #~ msgstr "Negalima išsaugoti iPod duomenų bazės" #, fuzzy #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "Nepavyko įkelti python-gpod, iPod palaikymas išjungtas." #, fuzzy #~ msgid "Track Repeat" #~ msgstr "takelio maks. garsumo lygis" #~ msgid "Shuffle" #~ msgstr "Išmaišytai" #~ msgid "Weighted" #~ msgstr "Svertinai" #~ msgid "_Weighted" #~ msgstr "_Svertinai" #~ msgid "_One Song" #~ msgstr "_Viena daina" #~ msgid "Restart the playlist when finished" #~ msgstr "Iš naujo pradėti grojaraštį jam pasibaigus" #~ msgid "Disable Browser" #~ msgstr "Išjungti naršyklę" #~ msgid "_Disable Browser" #~ msgstr "_Išjungti naršyklę" #, fuzzy #~ msgid "Force Write" #~ msgstr "Įrašyti" #~ msgid "Filter on _Genre" #~ msgstr "Filtras _žanrui" #~ msgid "Filter on _Artist" #~ msgstr "Filtras _atlikėjui" #~ msgid "Filter on Al_bum" #~ msgstr "FIltras a_lbumui" #~ msgid "_Music" #~ msgstr "_Muzika" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Žymės" #~ msgid "Song _List" #~ msgstr "Dainų _sąrašas" #, fuzzy #~ msgid "D:" #~ msgstr "Der:" #, fuzzy #~ msgid "W:" #~ msgstr "Įsp:" #, fuzzy #~ msgid "E:" #~ msgstr "Kl:" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Po šios dainos sustabdyti" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "ir %d daugiau..." #~ msgstr[1] "ir %d daugiau..." #~ msgstr[2] "ir %d daugiau..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Išskaidyti diską iš _albumo" #, fuzzy #~ msgid "Timeout" #~ msgstr "Laikas" #, fuzzy #~ msgid "Select an album" #~ msgstr "P_asirinkti viską" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s bei dar %(count)d" #~ msgstr[1] "%(title)s bei dar %(count)d" #~ msgstr[2] "%(title)s bei dar %(count)d" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Grojaraščiai" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "Apvalinti miniatiūrų kamp_us" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "Apvalinti albumų viršelių miniatiūrų paveikslėlių kampus. Gali tekti " #~ "paleisti programą iš naujo, kad pakeitimai įsigaliotų." #~ msgid "Re_fresh Library" #~ msgstr "At_naujinti biblioteką" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "Pašalinti pasikartojančias dainas" #~ msgid "Unable to open input files" #~ msgstr "Negalima atverti įvesties failų" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "GStreamer neturi elemento, skirto failų skaitymui. Patikrinkite GStreamer " #~ "įdiegties nuostatas." #~ msgid "Invalid audio backend" #~ msgstr "Netaisyklinga garso posistemė" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "Garso posistemė „%r“ neįdiegta." #~ msgid "ql-save" #~ msgstr "ql-save" #~ msgid "ql-revert" #~ msgstr "ql-revert" #~ msgid "command|filename" #~ msgstr "failo_vardas" #~ msgid "command|tag" #~ msgstr "žymė" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: Nepavyko rasti %s." #~ msgid "heading|Search" #~ msgstr "heading|Paieška" #~ msgid "%d of %d" #~ msgstr "%d iš %d" #~ msgid "Usage: %s %s\n" #~ msgstr "Naudojimas: %s %s\n" #~ msgid "_Download..." #~ msgstr "_Atsiųsti..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Nauja stotis" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Perrašyti <b>%s</b>?" #~ msgid "Output Error" #~ msgstr "Išvesties klaida" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "GStreamer išvesties inicijuoti nepavyko. Gali būti, jog išvestis " #~ "netaisyklinga arba įrenginys šiuo metu naudojamas. Patikrinkite grotuvo " #~ "nuostatas." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet jau paleistas." #~ msgid "No song is currently playing." #~ msgstr "Negroja jokia daina." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Negalima rašyti į %s. Pašalinama." #~ msgid "_Edit Bookmarks..." #~ msgstr "Redaguoti _žymes..." #~ msgid "_New Folder..." #~ msgstr "_Naujas aplankas..." #~ msgid "_Add to Playlist" #~ msgstr "_Pridėti į grojaraštį" #~ msgid "_Edit Display..." #~ msgstr "_Redaguoti vaizdą..." #~ msgid "Output Log" #~ msgstr "Išvesties žurnalas" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d stotis" #~ msgid "_Add a Location..." #~ msgstr "_Pridėti vietą..." #~ msgid "_Output Log" #~ msgstr "Išvesties _žurnalas" #~ msgid "Invalid command %r received." #~ msgstr "Gauta netaisyklinga komanda %r." #~ msgid "Unknown browser %r." #~ msgstr "Nežinoma naršyklė %r." #~ msgid "Custom _Sort..." #~ msgstr "Individualizuotas _rikiavimas..." #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "Ar tikrai norite pakeisti visų %d dainų įvertį?" #~ msgstr[1] "Ar tikrai norite pakeisti visų %d dainų įvertį?" #~ msgstr[2] "Ar tikrai norite pakeisti visų %d dainų įvertį?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "Ar tikrai norite pašalinti %d pasikartojančią dainą?" #~ msgstr[1] "Ar tikrai norite pašalinti %d pasikartojančias dainas?" #~ msgstr[2] "Ar tikrai norite pašalinti %d pasikartojančių dainų?" #~ msgid "Track Headers" #~ msgstr "_Takelio antraštės" #~ msgid "People Headers" #~ msgstr "Atlikėjų antraštės" #~ msgid "Album Headers" #~ msgstr "Albumo antraštės" #~ msgid "Date Headers" #~ msgstr "Datos antraštės" #~ msgid "File Headers" #~ msgstr "Failo antraštės" #~ msgid "Production Headers" #~ msgstr "Produkcijos antraštės" #~ msgid "Tag:" #~ msgstr "Žymė:" #~ msgid "Descending" #~ msgstr "Mažėjančia tvarka" #~ msgid "Too Many Errors" #~ msgstr "Per daug klaidų" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Stabdomas grojimas, nes įvyko %d klaidos iš eilės." #~ msgid "Warnings" #~ msgstr "Įspėjimai" #~ msgid "General" #~ msgstr "Bendrasis" #~ msgid "No log available." #~ msgstr "Nėra prieinamo vedamo žurnalo." #~ msgid "album artist (sort)" #~ msgstr "albumo atlikėjas (rikiuojamas)" #~ msgid "artist (sort)" #~ msgstr "atlikėjas (rikiuojamas)" #~ msgid "album (sort)" #~ msgstr "albumas (rikiuojamas)" #~ msgid "performer (sort)" #~ msgstr "muzikantas (rikiuojamas)" #~ msgid "performers (sort)" #~ msgstr "muzikantai (rikiuojamas)" #~ msgid "MusicBrainz album artist ID" #~ msgstr "„MusicBrainz“ albumo atlikėjo ID" #~ msgid "errors" #~ msgstr "klaidos" #~ msgid "Failed reading album art \"%s\"" #~ msgstr "Nepavyko perskaityti albumo viršelio \"%s\"" #~ msgid "Permanently delete this file?" #~ msgstr "Ar negrįžtamai ištrinti šį failą?" #~ msgid "Permanently delete these files?" #~ msgstr "Ar negrįžtamai ištrinti šiuos failus?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s ir %(count)d daugiau..." #~ msgstr[1] "%(title)s ir %(count)d daugiau..." #~ msgstr[2] "%(title)s ir %(count)d daugiau..." #~ msgid "Version:" #~ msgstr "Versija:" #~ msgid "_Cause an Error" #~ msgstr "Suke_lta klaida" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s negali būti pridėta į Jūsų biblioteką.\n" #~ "\n" #~ msgid "Error running command %r, caused by: %r." #~ msgstr "Klaida vykdant komandą %r, sukėlėjas: %r." #~ msgid "No eject command found." #~ msgstr "Nerasta atjungimo komanda." #~ msgid "Unable to start web browser" #~ msgstr "Negalima įkelti Interneto naršyklės" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Nerasta Interneto naršyklė. Nustatykite $BROWSER kintamąjį arba " #~ "įsitikinkite, ar /usr/bin/sensible-browser egzistuoja." #~ msgid "" #~ "Cannot save library contents to %s (it's a directory). Please remove it " #~ "and try again." #~ msgstr "" #~ "Negalima išsaugoti bibliotekos turinio į '%s' (tai aplankas). Pašalinkite " #~ "jį ir bandykite dar kartą." #~ msgid "Library Error" #~ msgstr "Bibliotekos klaida" #~ msgid "_Output device:" #~ msgstr "Išvesties įren_ginys:" #~ msgid "translator-credits" #~ msgstr "" #~ "Jonas Slivka <jonas.slivka@gmail.com>,\n" #~ "Naglis Jonaitis <njonaitis@gmail.com>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Rodyti kitus stulpelius, atskirtus tarpais" #~ msgid "_Edit and Continue" #~ msgstr "R_edaguoti ir tęsti" #~ msgid "Search your library" #~ msgstr "Ieškoti bibliotekoje" #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Autorinės teisės {dates}\t{authors}\n" #~ "\n" #~ "Tai nemokama programinė įranga, kopijavimo sąlygų ieškokite išeities " #~ "tekstuose. Nesuteikiama JOKIŲ \n" #~ "garantijų.\n" #, fuzzy #~ msgid "You are about to change the rating of %d song." #~ msgid_plural "You are about to change the rating of %d songs." #~ msgstr[0] "" #~ "Ketinate pakeisti %d dainų reitingą.\n" #~ "Ar norite tęsti?" #~ msgstr[1] "" #~ "Ketinate pakeisti %d dainų reitingą.\n" #~ "Ar norite tęsti?" #~ msgstr[2] "" #~ "Ketinate pakeisti %d dainų reitingą.\n" #~ "Ar norite tęsti?" #~ msgid "Confirm rating" #~ msgstr "Patvirtinti reitingą" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r nėra naršyklių." #~ msgid "Total size unknown" #~ msgstr "Visas dydis nežinomas" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r nėra jokių įrenginių." #~ msgid "%s: Could not import ctypes." #~ msgstr "%s: Nepavyko įkelti ctypes." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: Nepavyko rasti media-player-info." #, fuzzy #~ msgid "Couldn't find module %s." #~ msgstr "%s: Nepavyko rasti libudev." #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet priedai" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Rodyti paprastą paiešką mėlynai, sudėtingesnę žaliai ir netaisyklingą - " #~ "raudonai" #~ msgid "_Select" #~ msgstr "_Pasirinkti" #~ msgid "Separators for splitting tags" #~ msgstr "Atskyrikliai žymėms atskirti" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet pasirinktys" #~ msgid "Not Played To_day" #~ msgstr "Šiandien ne_grota" #~ msgid "Not Played in a _Week" #~ msgstr "_Savaitę negrota" #~ msgid "Not Played in a _Month" #~ msgstr "_Mėnesį negrota" #~ msgid "B_ottom 40" #~ msgstr "40 _blogiausių" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "40 rečiausiai grotų dainų (gali būti parinkta daugiau nei 40, jei kai " #~ "kurių bus grota tiek pat kartų)" #~ msgid "gtk-media-next" #~ msgstr "Kita" #~ msgid "gtk-media-previous" #~ msgstr "Ankstesnė" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #~ msgid "Date" #~ msgstr "Data" #~ msgid "Choose New Stations" #~ msgstr "Pasirinkite naujas stotis" #~ msgid "Add" #~ msgstr "Pridėti" #~ msgid "Bitrate" #~ msgstr "Bitų dažnis" #~ msgid "_Stations..." #~ msgstr "_Stotys..." #~ msgid "Quod Libet" #~ msgstr "Quod Libet" #~ msgid "Initializing audio backend (%s)" #~ msgstr "Inicijuojama garso posistemė (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "Inicijuojama pagrindinė biblioteka (%s)" #~ msgid "Unable to save library" #~ msgstr "Negalima išsaugoti bibliotekos" #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Negalima išvesti klaidos žurnalo, Jums labai nepasisekė." ����������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/it.po����������������������������������������������������������������������������0000644�0001750�0001750�00000547146�13115512745�015361� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # felipe <filippo@email.it>, 2005. msgid "" msgstr "" "Project-Id-Version: Quod Libet 0.22\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-10-17 12:18+0100\n" "Last-Translator: Luca Baraldi <luca.baraldi+quodlibet@gmail.com>\n" "Language-Team: Italian\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Modifica i tag dei file audio." #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Editor di tag audio" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Ascolta, sfoglia o modifica la collezione audio" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Riproduttore" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Titolo" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "Genere" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Giudizio" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Ordina _per:" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Preferenze" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Lista degli Album" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Lista degli _Album" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Tutti gli Album" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d album" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Ricarica le _Copertine dell'album" msgstr[1] "Ricarica le _Copertine degli album" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Brani non in un album" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d traccia" msgstr[1] "%d tracce" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disco" msgstr[1] "%d dischi" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Tutti gli Album" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Preferenze della lista album" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Mostra le _Cover degli album" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "La ricerca inline include le persone" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[opzioni]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Mostra Album" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Sconosciuto" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Nuovo Feed" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Inserire la posizione di un feed audio." #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Feed Audio" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "Feed _Audio" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "S_carica" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Scarica i file" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Scarica il file" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Impossibile aggiungere il feed" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> non è stato aggiunto. Il server potrebbe essere irraggiungibile, o " "potrebbe non contenere un feed audio." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "A_ggiorna la Libreria" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Elimina i File" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "L'attuale audio backend non supporta gli URL, il navigatore degli Audio Feed " "è disabilitato." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Esplora la Libreria" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d brano" msgstr[1] "%d brani" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Modello non valido" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Sconosciuto" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Separa in valori _multipli" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Personalizzato" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Rimuovi Stazione" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Preferenze della lista album" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Dimensioni totali:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Dimensioni totali:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Preferenze del catalogo con filtri" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Mostra le _Cover degli album" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Tutti gli Album" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "Nessuna nuova stazione" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Computer" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Computer" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Impossibile copiare i brani" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "I Brani selezionati non possono essere copiati ad altre liste o alla coda" #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Aggiungi alla Libreria" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Tipo di file non supportato" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Le liste di stazioni possono contenere solo indirizzi di stazioni, non altre " "liste di stazioni o scalette. I seguenti indirizzi non sono stati aggiunti.\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Impossibile aggiungere la stazione" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internet Radio" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Scarica i file" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Nuova Stazione" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Inserire l'indirizzo di una stazione Internet radio " #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "giudizio" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Nuova Stazione" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Internet Radio" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Nuova Stazione" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_Nuova Stazione" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Nuova Stazione" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 #, fuzzy msgid "No Category" msgstr "Nessuna categoria" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Nessuna stazione trovata." #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Nessuna stazione radio in %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Tutte le stazioni elencate sono già nella libreria." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "Metti in _Scaletta" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "_Rimuovi dalla Scaletta" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d stazione" msgstr[1] "%(count)d stazioni" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Proprietà del dispositivo" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Dispositivo:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Non montato" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Punto di mount:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Nome:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Dispositivo multimediale" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "Dispositivo_Multimediale" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Espelli" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Proprietà" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Rinomina" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> utilizzato, <b>%s</b> disponibile" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> non è connesso." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Sto copiando <b>%(song)s</b>." #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Impossibile copiare il brano" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Non c'è abbastanza spazio libero per questa canzone." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> non può essere copiato." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Impossibile eliminare i brani" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Elimino <b>%(song)s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> non può essere eliminato." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Impossibile eliminare il brano" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Esplusione di <b>%s</b>fallita." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Impossibile espellere il dispositivo" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" "Nessun dispositivo di backend, il navigatore dei dispositivi multimediali è " "disabilitato." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Catalogo con Filtri" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Catalogo con Filtri" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "_Seleziona Tutto" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Tutti" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Preferenze del catalogo con filtri" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Scalette" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Scalette" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Rimuovi dalla Scaletta" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importa" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Nuova Scaletta" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Impossibile importare la scaletta" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "I formati supportati per le scalette sono solo M3U e PLS" #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Impossibile rinominare la scaletta" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importa una scaletta" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Nuova Scaletta" #: ../quodlibet/browsers/playlists/menu.py:86 #, fuzzy, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" "Stai per modificare il voto di %d tracce.\n" "Desideri proseguire?" msgstr[1] "" "Stai per modificare il voto di %d tracce.\n" "Desideri proseguire?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Nuova Scaletta" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Preferenze del catalogo con filtri" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Scalette" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Inserisci un nome per la nuova cartella:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Sto importando la scaletta.\n" "\n" "%(current)d/%(total)d brani aggiunti." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Limita i Risultati" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Cerca nella Libreria" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Cerca nella Libreria" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Catalogo con Filtri" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Cerca" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "posizione" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet non è in esecuzione" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "una libreria musicale e player" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[opzione]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Mostra il brano in esecuzione ed esci" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Comincia a riprodurre immediatamente" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Salta al prossimo brano" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Salta al precedente brano" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Avvia l'esecuzione" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Metti in pausa" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Commuta play/pausa" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Avvia l'esecuzione" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Aumenta il volume" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Abbassa il volume" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Mostra lo stato attuale" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Nascondi la finestra" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Mostra la finestra" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Commuta la visibilità della finestra" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Dai il focus al riproduttore" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Rimuovi i filtri attivi dal navigatore" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Aggiorna e ricarica la libreria" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Disattiva il Catalogo" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Stampa la scaletta attuale" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Stampa il contenuto della coda" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Stampa il contenuto della coda" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet non è in esecuzione" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Chiudi Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Cerca nel brano in esecuzione" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Commuta play/pausa" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Commuta o disattiva la ripetizione" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Imposta il volume" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Cerca nella libreria audio" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "ricerca" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Riproduci un brano" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "nome del file" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Dai un giudizio al brano in esecuzione" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Imposta il browser" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Dai un giudizio al brano in esecuzione" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Apri un nuovo browser" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Mostra o nascondi la coda" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Mostra o nascondi la lista di brani" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtro su un valore casuale" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tag" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtro su un tag" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=valore" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Codifica un file o ricerca" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Accoda i file separati dalla virgola" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "nome del file" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Stampa i nomi dei file ottenuti dalla query sullo standard output" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Rimuovi dalla coda un file o una ricerca" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Argomento non valido per '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Prova %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Dispositivo sconosciuto" #: ../quodlibet/devices/__init__.py:32 #, fuzzy, python-format msgid "Could not import %s, which is needed for device support." msgstr "" "Non riesco a imporare dbus-python, che è necessario per leggere il " "dispositivo." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "'%r' non è un dispositivo supportato." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Non trovo libudev." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Annullo l'inizializzazione del dispositivo di backend." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Provo '%s'" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Non riesco a connettermi al backend del dispositivo" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Backend del dispositivo inizializzato" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "Schema per il nome del file" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Copia le copertine degli _album" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Rimuovi le immagini e le directory inutilizzate" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "E' avvenuto un errore" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Ignora _Tutti gli Errori" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "descrizione" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "un editor di tag audio" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "cartella" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Codifica non valida]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Titolo" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor di tag audio" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_Prima lettera maiuscola" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 #, fuzzy msgid "_Human title case" msgstr "Abilita un case del titolo _umano" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Usa le comuni regole Inglesi per le maiuscole nel titolo, come \"Dark Night " "of the Soul\"" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Preferenze del catalogo con filtri" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Dimensioni totali:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Modifica Display" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "In base al _Giudizio" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 #, fuzzy msgid "_Outline" msgstr "_Output pipeline:" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Modifica Display" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Anteprima" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 #, fuzzy msgid "Automatic Masking" msgstr "Auto_matic" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 #, fuzzy msgid "Automatic Rating" msgstr "Auto_matic" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "L'attuale audio backend non supporta gli URL, il navigatore degli Audio Feed " "è disabilitato." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d secondo" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Personalizzato" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "_Pulisci gli Errori" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Riproduttore" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Internet Radio" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Giudizio" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Impossibile salvare il brano" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Nessun plugin trovato." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Testi" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Pulisci la ricerca" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Testi" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "posizione" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Nascondi la finestra" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Preferenze" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Modello del Percorso" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Modello del Percorso" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d brano" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Output Log" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "Modello del Percorso" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Non riesco a connettermi al backend del dispositivo" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "posizione" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Titolo" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 #, fuzzy msgid "Show notifications" msgstr "Nessuna nuova stazione" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Non riesco a connettermi al backend del dispositivo" #: ../quodlibet/ext/events/notify.py:251 #, fuzzy msgid "Song Notifications" msgstr "Nessuna nuova stazione" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, fuzzy, python-format msgid "Could not contact service '%s'." msgstr "Non riesco a connettermi al backend del dispositivo" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Dispositivo:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Nome:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "Altr_o:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "Schema per il nome del file" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Al_bum casuale" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "album" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "In base al _Giudizio" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Al_bum casuale" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Importa una scaletta" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Importa" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Testi" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Non in esecuzione" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d brano" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "Modello del Percorso" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Non in esecuzione" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "_Scalette" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Player" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_Anteprima" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Casuale" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Ripeti" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Ferma dopo questo brano" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Apri un nuovo browser" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Modifica _Tag" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informazioni" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Scalette" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Modifica Display" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Testi" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Testi" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Errori" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "File" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Anteprima" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Filtro sull'_artista" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Personalizzato" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Filtro sul _genere" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Filtro sull'_artista" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Feed Audio" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Inserire la posizione di un feed audio." #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Importa una scaletta" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importa" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Nessuna stazione trovata." #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "Schema per il nome del file" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "Schema per il nome del file" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "_Rimuovi dalla Scaletta" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, fuzzy, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" "Stai per modificare il voto di %d tracce.\n" "Desideri proseguire?" msgstr[1] "" "Stai per modificare il voto di %d tracce.\n" "Desideri proseguire?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Nuova Scaletta" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "ultimo passaggio" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "Accodato" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Mai" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Nessun Brano" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Ricerche Salvate" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Non riesco a connettermi al backend del dispositivo" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Rinomina" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Libreria" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Nascondi la finestra" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Nome del file" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Impossibile salvare il brano" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Lista degli Album" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Dimensioni" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Cerca:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Cerca" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Lista degli Album" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Modifica Segnalibri..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Modifica Segnalibri..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Segnalibri" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Tipo di album MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Nome del file" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Disco" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Traccia" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Titolo" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Artista" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "Tipo di album MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "ricerca" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Cerca" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Nessun plugin trovato." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Catalogo" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Impossibile creare la cartella" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Rinomina" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Modello non valido" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Valore non valido" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Personalizzato" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Impossibile copiare i brani" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Disattiva il Catalogo" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Modifica Display" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "_Rimuovi Stazione" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Filtro su un tag" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer non è stato in grado di caricare il brano selezionato" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Filtro sul _genere" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Accodato" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Scrivi" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "cartella" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "Modalità _Album" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Nuova Stazione" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Importa una scaletta" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 #, fuzzy msgid "Error during sync" msgstr "Errore mentre carico %r" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Rinomina" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Importa una scaletta" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Informazioni" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Importa una scaletta" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Impossibile importare la scaletta" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Esplusione di <b>%s</b>fallita." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "A_ggiorna la Libreria" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "A_ggiorna la Libreria" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Modifica Tag" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Modifica Tag" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Tutti gli Album" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Anteprima" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Tag" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Impossibile eliminare i brani" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Cerca" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "Modello del Percorso" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Modifica le ricerche salvate..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "_Colora il termini cercati" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Libreria" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Controllo i punti di mount" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Scansiono la libreria" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Scansiono %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Mostra _commenti" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 #, fuzzy msgid "Too many arguments" msgstr "Troppo errori" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "descrizione" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Valore" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor di tag audio" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Nessun brano selezionato." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "_Rimuovi Stazione" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "_Rimuovi Stazione" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Filtro su un tag" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Filtro su un tag" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Nessuna informazione sul tempo" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Impossibile rinominare il file" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "_Rimuovi Stazione" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "File" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Mostra brevi informazioni sull'utilizzo" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> non è una posizione valida" #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Sconosciuto" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "In Ordine" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_In Ordine" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "Ca_suale" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "Ca_suale" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Ripeti" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Un Brano" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 #, fuzzy msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "GStreamer output pipeline utilizzato per la riproduzione, esempio 'alsasink " "device=default'. Lascia vuoto per il default pipeline." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Output pipeline:" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d secondo" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nessuna stazione trovata." #: ../quodlibet/player/gstbe/util.py:112 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "GStreamer output pipeline invalido, provo con il default." #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Impossibile creare l'uscita audio." #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Il dispositivo audio %r non è stato trovato. Controlla le tue configurazioni " "di Xine in ~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Plugin" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Formati supportati: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Dispositivo audio: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Inizio" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/D" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Tempo" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Nome del Segnalibro" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Segnalibri" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtri" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "M_ai ascoltati" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Primi 40" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Nuova Stazione" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "_Genere casuale" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "_Artista casuale" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Al_bum casuale" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "I 40 brani più ascoltati" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Valore:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Valori salvati" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Modifica i valori salvati..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_matic" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "Modalità _Traccia" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "Modalità _Album" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ripeti la Modifica al Volume di Uscita" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Sconosciuto" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Filtro su un tag" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "File" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Elimina i File" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Sposta nel Cestino" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Sto spostando %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Impossibile sposare nel cestino" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Non riesco a spostare <b>%s</b> nel cestino." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Sto cancellando %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Impossibile eliminare il file" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Non è stato possibile eliminare <b>%s</b>." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Scaricati" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Dimensioni" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "mancante da %d brano" msgstr[1] "mancante da %d brani" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "differente in %d brano" msgstr[1] "differente in %d brani" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Separa in valori _multipli" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Separa i dischi dell'_album" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Separa la _Versione dal titolo" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Separa l'arrangiatore dall'ar_tista" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Separa l'e_secutore dall'artista" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Separa l'e_secutore dall'artista" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Separa la _Versione dal titolo" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Aggiungi un Tag" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Modifica Tag" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Mostra _commenti" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Mai" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Impossibile aggiungere tag" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Impossibile aggiungere il brano" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Impossibile aggiungere <b>%s</b>\n" "\n" "I file attualmente selezionati non supportano valori multipli." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Tag non valido" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Tag <b>%s</b> non valido\n" "\n" "I file attualmente selezionati non supportano la modifica su questo tag." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Valore non valido" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Valore non valido: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Il tag potrebbe non essere accurato" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> è cambiato mentre il programma era in esecuzione. Salvare senza " "aggiornare la libreria potrebbe sovrascrivere altri cambiamenti nel brano.\n" "\n" "Salvare il brano comunque?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Impossibile salvare il brano" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Salvataggio di <b>%s</b> fallito. Il file potrebbe essere in sola lettura " "oppure non si hanno sufficienti permessi per modificarlo." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Più opzioni.." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Plugin" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s e %(count)d altro" msgstr[1] "%(title)s e altri %(count)d" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Preferenze di Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Dividi _a:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Modifica dei Tag" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Cartelle" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Nuova Cartella" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Seleziona Tutte le Sottocartelle" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Nuova Cartella" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Inserire un nome per la nuova cartella:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Impossibile creare la cartella" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Impossibile eliminare la cartella" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Brani" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "di %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disco %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Traccia %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Modifica Display" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Nessun brano selezionato." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Nessun Brano" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informazioni" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Testi" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Prodotto da %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artisti" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "esecutori" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Mai" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d volta" msgstr[1] "%(n)d volte" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "aggiunto" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "ultimo passaggio" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "riproduzioni" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "saltato" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "giudizio" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "lunghezza" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Informazioni" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[Codifica non valida]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "dimensioni" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "modificato" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d selezionato" msgstr[1] "%d selezionati" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Traccia non disponibile" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Lista delle Tracce" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d brano senza album" msgstr[1] "%d brani senza album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Disografia Selezionata" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d brano senza artista" msgstr[1] "%d brani senza artista" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "album" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Lunghezza totale:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Dimensioni totali:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "File" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "S_carica" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Modifica Display..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Nessun testo trovato per questo brano." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Ricerca di testo..." #: ../quodlibet/qltk/maskedbox.py:20 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "" "Stai per modificare il voto di %d tracce.\n" "Desideri proseguire?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Tralasciare le modifiche ai tag?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "I tag modificati non sono stati salvati. Salvare i file, o tralasciare i " "cambiamenti?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Mai" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Il file esiste" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Rinomina i File" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Operazioni attive" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d operazioni in esecuzione" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Commuta play/pausa" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Commuta play/pausa" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Errori dei plugin" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Attivo" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Disattivato" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Nessuna categoria" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "In _Ordine" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Modifica dei Tag" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Dimensioni totali:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Nessun plugin trovato." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Plugin" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Mostra _Errori" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disco" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Traccia" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "raggruppamento" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Nome del _file" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Lunghezza" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Salta automaticamente al brano in esecuzione" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Scorri nella lista dei brani fino a quello in esecuzione" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "Altr_o:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Modifica Display..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Colonne Visibili" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Il Titolo include la _versione" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "La ricerca inline include le persone" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "L'album include il sottotitolo del _disco" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Il nome del file include la _cartella" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Preferenze" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Lista dei Brani" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Colonne Visibili" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "Filtro _Globale:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Cerca" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Catalogo" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Conferma voti _multipli" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "Chiedi conferma prima di cambiare il voto di più canzoni assieme" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Abilita voti con un click" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Abilita il giudizio cliccando sulla colonna del voto della lista dei brani" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Giudizi" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Lista degli Album" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Metti in pausa" #: ../quodlibet/qltk/prefs.py:362 #, fuzzy msgid "Output Configuration" msgstr "Output Log" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Se non è disponibile l'informazione per Ripetere il Volume di una traccia, " "scala il volume a questo valore " #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Volume di Fall-back (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Scala il volume di tutti i brani a questo valore, finché il risultato non " "clippa " #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Volume Pre-amp (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "_Abilita la possibilità di Ripetere la modifica al volume di Uscita" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Ripeti la Modifica al Volume di Uscita" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "Giudizi" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Salva i giudizi e il _numero di riproduzioni" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "Giudizi e numero dei passaggi saranno impostati per questo indirizzo email" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Tralasciare le modifiche ai tag?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Modifica Tag" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Nuova Stazione" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "_Aggiorna il catalogo all'avvio" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Cerca nella Libreria" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Controlla cambiamenti effettuati sulla libreria" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Ri_carica la Libreria" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Ricarica tutti i brani nella libreria (può richiedere molto tempo)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Esamina le _Cartelle" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Nessun Brano" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s e %(count)d altro" msgstr[1] "%(title)s e altri %(count)d" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Proprietà" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "Co_da" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Pulisci gli Errori" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d brano (%(time)s)" msgstr[1] "%(count)d brani (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Esplora la Libreria" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Commuta la visibilità della finestra" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Metti in pausa" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Selezionare le Cartelle" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Impossibile aggiungere i brani" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> usa un protocollo non supportato." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Salta al brano in esecuzione" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "File" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Brani" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Visualizza" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Catalogo" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "Con_trolli" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "A_iuto" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "_Aggiungi una Cartella..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "_Aggiungi un File..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Aggiungi una Posizione" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Modifica Segnalibri..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Ferma dopo questo brano" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Cerca" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Aggiungi una Posizione" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Inserire la posizione di un file audio." #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Impossibile aggiungere la stazione" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> non è una posizione valida" #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Aggiungi Musica" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Aggiungi una Cartella..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Riproduttore" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Aggiungi un File..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, fuzzy, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" "Stai per modificare il voto di %d tracce.\n" "Desideri proseguire?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Rimuovi Stazione" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Giudizio" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Sostituisci gli spazi con _underscore" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Elimina i caratteri incompatibili con _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Elimina i segni _diacritici" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Elimina i caratteri non-_ASCII" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Usa solo caratteri _minuscoli" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Rinomina i File" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Modello del Percorso" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Modifica i modelli salvati..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Anteprima" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nuovo Nome" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Impossibile rinominare il file" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "La rinomina di <b>%s</b> in <b>%s</b> è fallita. Porbabilmente il file " "esiste già, o non si hanno sufficienti permessi per creare un nuovo file o " "eliminarne uno vecchio." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Ignora _Tutti gli Errori" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Continua" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Il percorso non è assoluto" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Il modello\n" "\t<b>%s</b>\n" "contiene / ma non parte dalla cartella root. Per evitare cartelle mal " "nominate, bisogna far partire i modelli con / o con ~/" #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "I brani in queste cartelle (separati da ':') saranno aggiunti alla libreria" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Selezionare le Cartelle" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Ricerche Salvate" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Modifica le ricerche salvate..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Cerca dopo aver digitato" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Mostra i risultati della ricerca dopo che l'utente smette di scrivere" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limita:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "In base al _Giudizio" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Mostra il tempo rimanente" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Testi" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Dai il focus al riproduttore" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Cerca nel brano in esecuzione" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Impossibile eliminare i brani" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Impossibile eliminare i brani" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtro su %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "Headers degli _Album" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Headers delle _Tracce" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Headers degli _Album" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Headers della _Gente" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Headers della _Data" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Headers dei _File" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Headers della _Produzione " #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Personalizza gli Headers..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "_Colora il termini cercati" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Metti in _Coda" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "Copia sul dispositivo" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Rimuovi dalla Scaletta" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Sostituisci _underscore con spazi" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Prima lettera maiuscola" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Separa in _valori multipli" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tag dal File" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "I tag rimpiazzano quelli esistenti" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "i tag sono aggiunti a quelli esistenti" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Il modello\n" "\t<b>%s</b>\n" "non è valido. Probabilmente contiene lo stesso tag due volte o ha parentesi " "non valide (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Tag non validi" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "tags <b>%s</b> non validi\n" "\n" "I file attualmente selezionati non supportano la modifica di questi tag." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Il modello inserito non è valido. Fare attenzione ad inserire < e > " "come \\< e \\> e che i tag sono bilanciati.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Modifica Display" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Numeri delle Tracce" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Parti _da:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Totale tracce:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Player" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_Anteprima" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "e altri %d ..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Salvataggio dei brani modificati." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d tracce salvate\n" "(%(remaining)s rimanenti)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Sto spostando %(current)d/%(total)d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Controllo i punti di mount" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "posizione" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Esiste già una scaletta chiamata %s." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Ricarica le _Copertine dell'album" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Computer" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Mostra brevi informazioni sull'utilizzo" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Mostra versione e copyright" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[opzioni]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Opzione '%s' non riconosciuta." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "L'opzione '%s' richiede un argomento." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "'%s' non è un prefisso unico." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d secondo" msgstr[1] "%d secondi" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Nessuna informazione sul tempo" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d secondo" msgstr[1] "%d secondi" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minuti" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d ora" msgstr[1] "%d ore" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d giorno" msgstr[1] "%d giorni" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d anno" msgstr[1] "%d anni" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Usare titoli maiuscoli?" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "I formati corretti sono: AAAA, AAAA-MM-GG oppuure AAAA-MM-GG HH:MM:SS." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "I valori di ReplayGain devono essere nel formato 'x.yy dB'." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "I valori di picco di ReplayGain devono essere nel formato 'x.yy'." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "l'ID MusicBrainz della traccia deve essere nel formato UUID." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Lo stato del rilascio di MusicBrainz deve essere 'ufficiale', " "'promozionale', o 'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Impossibile modificare il brano" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Salvataggio di <b>%s</b> fallito. Il file potrebbe essere in sola lettura " "oppure non si hanno sufficienti permessi per modificarlo." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Codifica non valida]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arrangiatore" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arrangiatori" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "arrangiatore" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "autore" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "autori" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "compositore" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "compositori" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "compositore" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "direttore" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "direttori" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "direttore" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "contatto" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "descrizione" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "genere" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "genere" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "esecutore" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "raggruppamento" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "lingua" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licenza" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "posizione" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "paroliere" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "parolieri" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "paroliere" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "etichetta discografica" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "titolo" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versione" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "sito web" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "artista dell'album" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "Sottotitolo" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disco" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "traccia" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "numero di catalogo" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "data d'uscita originale" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "album originale" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "artista originale" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "data di registrazione" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "Stato di rilascio" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "ID MusicBrainz dell'artista" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "ID MusicBrainz della traccia" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "ID TRM MusicBrainz" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "Stato dell'album MusicBrainz" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Tipo di album MusicBrainz" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "ID MusicBrainz della traccia" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "volume della traccia" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "picco della traccia" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "volume dell'album" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "picco dell'album" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "volume di riferimento" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "dischi" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "tracce" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "ultima riproduzione" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "nome e percorso" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "Punto di mount" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "gente" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "anno" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "data d'uscita originale" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "segnalibri" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "formato file" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Scalette" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Catalogo" #, fuzzy #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "" #~ "Non posso importare il python-feedparser, il navigatore degli Audio Feed " #~ "è disabilitato." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Un eccezione è occorsa in Quod Libet. E' stato salvato un file di dump in " #~ "<b>%s</b> che ci potrebbe aiutare a debuggare il crash. Per cortesia apri " #~ "un nuovo problema su http://code.google.com/p/quodlibet/issues/list ed " #~ "allega questo file o includi il suo contenuto. Questo file può contenere " #~ "alcune informazioni di identificazione circa te o il tuo sistema, come la " #~ "lista dei file recentemente ascoltati. Se questo è inaccettabile, invia " #~ "<b>%s</b> con una descrizione di quello che stavi facendo.\n" #~ "\n" #~ "Quod Libet può ora essere instabile. Si raccomanda di chiuderlo e " #~ "riavviarlo. La tua libreria sarà salvata." #~ msgid "Unable to download lyrics." #~ msgstr "Impossibile scaricare i testi" #~ msgid "Remove all songs from the queue" #~ msgstr "Rimuovi tutti i brani dalla coda" #~ msgid "Watch this folder for new songs" #~ msgstr "Controlla la presenza di nuovi brani in questa cartella" #~ msgid "Set or toggle the playback order" #~ msgstr "Imposta o commuta l'ordine d'esecuzione" #~ msgid "Uninitialized iPod" #~ msgstr "Inizializzazione di iPod annullata" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Vuoi creare un database vuoto su questo iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Volume (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Combina i tag con valori _multipli" #~ msgid "Model:" #~ msgstr "Modello:" #~ msgid "Capacity:" #~ msgstr "Capienza:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Sto rimuovendo le tracce iPod orfane" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Non riesco a salvare il database iPod" #~ msgid "Unable to save iPod database" #~ msgstr "Non riesco a salvare il database iPod" #, fuzzy #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "Non posso importare python-gpod, il supporto a iPod è disabilitato." #, fuzzy #~ msgid "Track Repeat" #~ msgstr "picco della traccia" #~ msgid "Shuffle" #~ msgstr "Casuale" #~ msgid "Weighted" #~ msgstr "In base al Giudizio" #~ msgid "_Weighted" #~ msgstr "In base al _Giudizio" #~ msgid "_One Song" #~ msgstr "_Un Brano" #~ msgid "Restart the playlist when finished" #~ msgstr "Ricomincia la scaletta una volta finito" #~ msgid "Disable Browser" #~ msgstr "Disattiva il Catalogo" #~ msgid "_Disable Browser" #~ msgstr "_Disattiva il Catalogo" #, fuzzy #~ msgid "Force Write" #~ msgstr "Scrivi" #~ msgid "Filter on _Genre" #~ msgstr "Filtro sul _genere" #~ msgid "Filter on _Artist" #~ msgstr "Filtro sull'_artista" #~ msgid "Filter on Al_bum" #~ msgstr "Filtro sull'al_bum" #~ msgid "_Music" #~ msgstr "_Musica" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Segnalibri" #~ msgid "Song _List" #~ msgstr "_Lista dei Brani" #, fuzzy #~ msgid "D:" #~ msgstr "W: " #, fuzzy #~ msgid "W:" #~ msgstr "W: " #, fuzzy #~ msgid "E:" #~ msgstr "E: " #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Ferma dopo questo brano" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "e altri %d ..." #~ msgstr[1] "e altri %d ..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Separa i dischi dell'_album" #, fuzzy #~ msgid "Timeout" #~ msgstr "Tempo" #, fuzzy #~ msgid "Select an album" #~ msgstr "_Seleziona Tutto" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s e %(count)d altro" #~ msgstr[1] "%(title)s e altri %(count)d" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Scalette" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "_Usa angoli arrotondati nelle anteprime" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "Arrotonda gli angoli delle anteprime delle immagini degli album. Richiede " #~ "il riavvio per avere effetto." #~ msgid "Re_fresh Library" #~ msgstr "A_ggiorna la Libreria" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Rimuovi Stazione" #~ msgid "Unable to open input files" #~ msgstr "Impossibile aprire i file di input" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "GStreamer non ha l'elemento per gestire i file in lettura. Controlla i " #~ "settaggi della tua installazione di GStreamer." #~ msgid "Invalid audio backend" #~ msgstr "Audio backend invalido" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "L'audio backend %r non è installato." #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "command|filename" #~ msgstr "nome del file" #~ msgid "command|tag" #~ msgstr "tag" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: Non trovo libudev." #, fuzzy #~ msgid "heading|Search" #~ msgstr "Cerca" #~ msgid "%d of %d" #~ msgstr "%d di %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Utilizzo: %s %s" #~ msgid "_Download..." #~ msgstr "_Scarica..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Nuova Stazione" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Sovrascrivere <b>%s</b>?" #~ msgid "Output Error" #~ msgstr "Output Error" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "Il GStreamer output pipeline non può essere inizializzato. Il pipeline " #~ "può essere invalido, o il dispositivo può essere in uso. Controlla le " #~ "preferenze del lettore multimediale." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet è già in esecuzione." #~ msgid "No song is currently playing." #~ msgstr "Nessun brano è attualmente in esecuzione" #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Impossibile scrivere su %s. Rimosso." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Modifica Segnalibri..." #~ msgid "_New Folder..." #~ msgstr "_Nuova Cartella..." #~ msgid "_Add to Playlist" #~ msgstr "Metti in _Scaletta" #~ msgid "_Edit Display..." #~ msgstr "_Modifica Display..." #~ msgid "Output Log" #~ msgstr "Output Log" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d stazione" #~ msgid "_Add a Location..." #~ msgstr "_Aggiungi una Posizione..." #~ msgid "_Output Log" #~ msgstr "_Output Log" #~ msgid "Invalid command %r received." #~ msgstr "Ricevuto il commando invalido %r." #~ msgid "Unknown browser %r." #~ msgstr "Browser sconosciuto %r." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Personalizza gli Headers..." #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "" #~ "Stai per modificare il voto di %d tracce.\n" #~ "Desideri proseguire?" #~ msgstr[1] "" #~ "Stai per modificare il voto di %d tracce.\n" #~ "Desideri proseguire?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "" #~ "Stai per modificare il voto di %d tracce.\n" #~ "Desideri proseguire?" #~ msgstr[1] "" #~ "Stai per modificare il voto di %d tracce.\n" #~ "Desideri proseguire?" #, fuzzy #~ msgid "Track Headers" #~ msgstr "Headers delle _Tracce" #, fuzzy #~ msgid "People Headers" #~ msgstr "Headers della _Gente" #, fuzzy #~ msgid "Album Headers" #~ msgstr "Headers degli _Album" #, fuzzy #~ msgid "Date Headers" #~ msgstr "Headers della _Data" #, fuzzy #~ msgid "File Headers" #~ msgstr "Headers dei _File" #, fuzzy #~ msgid "Production Headers" #~ msgstr "Headers della _Produzione " #, fuzzy #~ msgid "Tag:" #~ msgstr "_Tag:" #~ msgid "Too Many Errors" #~ msgstr "Troppo errori" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Riproduzione arrestata poiché vi sono stati %d errori consecutivi." #~ msgid "Warnings" #~ msgstr "Avvertimenti" #~ msgid "General" #~ msgstr "Generale" #~ msgid "No log available." #~ msgstr "Nessun log disponibile." #~ msgid "album artist (sort)" #~ msgstr "artista dell'album" #~ msgid "artist (sort)" #~ msgstr "artista" #~ msgid "album (sort)" #~ msgstr "album" #~ msgid "performer (sort)" #~ msgstr "esecutore" #~ msgid "performers (sort)" #~ msgstr "esecutori" #~ msgid "MusicBrainz album artist ID" #~ msgstr "ID MusicBrainz dell'artista dell'album" #~ msgid "errors" #~ msgstr "errori" #~ msgid "Permanently delete this file?" #~ msgstr "Eliminare permanentemente questo file?" #~ msgid "Permanently delete these files?" #~ msgstr "Eliminare permanentemente questi file?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s e altri %(count)d..." #~ msgstr[1] "%(title)s e altri %(count)d..." #~ msgid "Version:" #~ msgstr "Versione:" #~ msgid "_Cause an Error" #~ msgstr "_Causa un Errore" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "Non è stato possibile aggiungere %s alla libreria\n" #, fuzzy #~ msgid "Error running command %r, caused by: %r." #~ msgstr "Errore mentre eseguo il comando %r, causato da: %r)." #~ msgid "No eject command found." #~ msgstr "Nessun comando di espulsione trovato" #~ msgid "Unable to start web browser" #~ msgstr "Impossibile avviare un browser web" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Non è stato trovato alcun browser web. Impostare la variabile $BROWSER, o " #~ "verificare l'esistenza di /usr/bin/sensible-browser." #, fuzzy #~ msgid "Library Error" #~ msgstr "Esplora la Libreria" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Output pipeline:" #~ msgid "translator-credits" #~ msgstr "Filippo Pappalardo <filippo@email.it>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Altre intestazioni da mostrare, separate da spazi" #~ msgid "_Edit and Continue" #~ msgstr "_Modifica e Continua" #, fuzzy #~ msgid "You are about to change the rating of %d song." #~ msgid_plural "You are about to change the rating of %d songs." #~ msgstr[0] "" #~ "Stai per modificare il voto di %d tracce.\n" #~ "Desideri proseguire?" #~ msgstr[1] "" #~ "Stai per modificare il voto di %d tracce.\n" #~ "Desideri proseguire?" #~ msgid "Confirm rating" #~ msgstr "Chiedi conferma del voto" #~ msgid "Search your library" #~ msgstr "Cerca nella libreria audio" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quod-libet-development@googlegroups.com>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, e altri\n" #~ "\n" #~ "Questo è software libero; vedi il codice sorgente per le condizioni di " #~ "copia. Non c'è\n" #~ "garanzia; neppure per la COMMERCIALIZZAZIONE o per L'ADEGUATEZZA AD UNO " #~ "SCOPO PARTICOLARE.\n" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r non contiene alcun browser." #~ msgid "Total size unknown" #~ msgstr "Dimensione totale sconosciuta" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r non contiene alcun dispositivo." #~ msgid "%s: Could not import ctypes." #~ msgstr "%s: Non riesco a importare i ctypes." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: Non trovo le informazioni di media-player." #, fuzzy #~ msgid "Couldn't find module %s." #~ msgstr "%s: Non trovo libudev." #~ msgid "Quod Libet Plugins" #~ msgstr "Plugin di Quod Libet" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Colora le stringhe di ricerca semplici in blu, avanzate in verde, non " #~ "valide in rosso" #~ msgid "_Select" #~ msgstr "_Seleziona" #~ msgid "Separators for splitting tags" #~ msgstr "Separatori per dividere i tag" #~ msgid "Quod Libet Preferences" #~ msgstr "Preferenze di Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Non ascoltati o_ggi" #~ msgid "Not Played in a _Week" #~ msgstr "Non ascoltati da una _settimana" #~ msgid "Not Played in a _Month" #~ msgstr "Non ascoltati da un _mese" #~ msgid "B_ottom 40" #~ msgstr "_Ultimi 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "I 40 brani meno ascoltati" #~ msgid "gtk-media-next" #~ msgstr "gtk-media-next" #~ msgid "gtk-media-previous" #~ msgstr "gtk-media-previous" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "Date" #~ msgstr "Data" #~ msgid "Choose New Stations" #~ msgstr "Scegli Nuove Stazioni" #~ msgid "Add" #~ msgstr "Aggiungi" #~ msgid "Bitrate" #~ msgstr "Bitrate" #~ msgid "_Stations..." #~ msgstr "_Stazioni..." #~ msgid "Quod Libet" #~ msgstr "Quod Libet" #~ msgid "Initializing audio backend (%s)" #~ msgstr "Sto inizializzando l'audio backend (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "Sto inizializzando la libreria principale (%s)" #~ msgid "Unable to save library" #~ msgstr "Impossibile salvare la libreria" #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Impossibile esportare i log, sei bloccato." #~ msgid "" #~ "The audio output pipeline %r could not be created. Check your GStreamer " #~ "settings in ~/.quodlibet/config." #~ msgstr "" #~ "L'audio output pipeline %r non può essere creato. Controlla le tue " #~ "impostazioni di GStreamer in ~/.quodlibet/config." #~ msgid "Sort by title" #~ msgstr "Ordina per titolo" #~ msgid "Sort by artist" #~ msgstr "Ordina per artista" #~ msgid "Lyrics provided by %s." #~ msgstr "Testi forniti da %s" #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Nessun testo trovato.\n" #~ "\n" #~ "Si può cliccare sul pulsante Scarica per cercare testi online.E' " #~ "possibile anche inserire manualmente il testo e salvarlo." #~ msgid "part" #~ msgstr "parte" #~ msgid "Opening audio device." #~ msgstr "Apertura del dispositivo audio." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d brani modificati" #~ msgid "MusicBrainz album ID" #~ msgstr "ID MusicBrainz dell'album" #~ msgid "Loaded song library." #~ msgstr "Libreria audio caricata." #~ msgid "Unable to open audio device" #~ msgstr "Impossibile accedere al dispositivo audio" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet ha cercato di accedere ai driver 'autosink' e '%(sink)s' ma " #~ "senza successo. Imposta le preferenze di GStreamer cambiando il valore\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "in ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet non è riuscito a trovare l'elemento GStreamer " #~ "'filesrc.'Controlla l'installazione di GStreamer." #, fuzzy #~ msgid "C_opy album covers" #~ msgstr "Mostra le _Cover degli album" #~ msgid "Unable to retag multiple values" #~ msgstr "Impossibile rietichettare valori multipli" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "Cambiare il nome di un tag con valori multipli non è supportato." #~ msgid "W: %s is not a QL song database." #~ msgstr "W. %s non è un database di QL" #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "Per brano (\"Radio\")" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "Per album (\"Audiofilo\")" #~ msgid "_Volume Normalization" #~ msgstr "Normalizzazione del _Volume" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "Quod Libet sta aggiornando la libreria. Possono volerci alcuni minuti.\n" #~ "\n" #~ "%d brani ricaricati\n" #~ "%d brani rimossi" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "Quod Libet sta rilevando nuovi brani da aggiungere alla libreria.\n" #~ "\n" #~ "%d brani aggiunti" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "Le scalette M3U non possono essere caricate." #~ msgid "This station is already in your library." #~ msgstr "Questa stazione è già nella libreria" #~ msgid "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgstr "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "di <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disco <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Traccia <tracknumber>>>" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/cs.po����������������������������������������������������������������������������0000644�0001750�0001750�00000604103�13115512746�015336� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Honza Hejzl <honza.hejzl@gmail.com>, 2011. msgid "" msgstr "" "Project-Id-Version: Quod Libet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2017-01-26 12:24+0100\n" "Last-Translator: Honza Hejzl <honza.hejzl@gmail.com>\n" "Language-Team: Czech (Czech Republic)\n" "Language: cs_CZ\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Poedit 1.8.8\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Editovat tagy skladeb" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" "Ex Falso je editor tagů s uživatelským rozhraním stejným jako editor tagů v " "Quod Libet. Umožňuje zobrazit a upravovat jakékoli tagy v souboru, a to pro " "všechny podporované formáty." #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" "Podporované formáty souborů jsou Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/" "XM/IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Editor tagů" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Poslouchejte, procházejte nebo upravujte svou hudební sbírku" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" "Quod Libet je program pro správu hudby (audia obecně). Nabízí mnoho způsobů " "zobrazení hudební sbírky stejně jako podporu interenetových rádií a " "audiostreamů. Zároveň je skvěle vybaven pro úpravy metadat a jejich " "prohledávání." #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Přehrávač hudby" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "_Název" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Umělec" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Datum" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "_Žánr" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Hodnocení" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 msgid "Sort _by…" msgstr "Řadit _podle…" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Nastavení" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Seznam alb" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Seznam alb" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Všechna alba" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d alba" msgstr[2] "%d alb" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Znovu _načíst přebal" msgstr[1] "Znovu _načíst přebaly" msgstr[2] "Znovu načíst přebaly" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Skladby neobsažené v albu" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d skladba" msgstr[1] "%d skladeb" msgstr[2] "%d skladby" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disk" msgstr[1] "%d disky" msgstr[2] "%d disky" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 msgid "An Example Album" msgstr "Příklad alba" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Nastavení seznamu skladeb" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Zobrazovat _přebaly alb" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "_Hledání obsahuje osoby" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 msgid "Options" msgstr "Možnosti" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Zobrazení alba" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "_Zavřít" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Neznámé" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Nový zdroj" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Zadejte umístění audio zdroje:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "_Přidat" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Audio zdroje" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Audio zdroje" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 msgid "_Download…" msgstr "_Stahování…" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Stáhnout soubory" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "_Uložit" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Stáhnout soubor" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "_Nový" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Nelze přidat zdroj" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "%s nemůže být přidán. Server může mít problémy, nebo na zadaném místě nemusí " "být platný audio zdroj." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 msgid "_Refresh" msgstr "_Obnovit" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 msgid "_Delete" msgstr "_Smazat" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Současná obslužná aplikace nepodporuje URL, prohlížeč audio zdrojů je " "zakázán." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Prohlížeč sbírky" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d skladba" msgstr[1] "%d skladby" msgstr[2] "%d skladby" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Neplatné zadání" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Sbírka alb" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "Sbírka _Alb" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "Neznámé %s" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "Více %s hodnot" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Vlastní" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 msgid "_Remove" msgstr "Odstranit" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Sloučit" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Nastavení sbírky alb" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "_Použít" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "_Zrušit" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "_Velikost přebalu:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "_Velikost přebalu:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Pokročilá nastavení" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Zobrazovat _přebaly alb" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Všechna alba" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "_Zobrazit notifikaci" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Systém souborů" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Systém souborů" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Nelze kopírovat skladby" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Vybrané soubory nelze zkopírovat do jiných seznamů skladeb nebo do fronty." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Přidat do sbírky" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Nepodporovaný formát souboru" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Seznamy stanic mohou obsahovat pouze umístění stanic, nemohou obsahovat " "seznamy stanic nebo plylisty. Následující umístění nelze nahrát:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Nelze přidat stanici" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internetová rádia" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Stahování seznamu stanic" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Nová stanice" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Zadejte umístění stanice internetového rádia:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Elektronika" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "Hip Hop / Rap" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Oldies" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japonská" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "Indická" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Náboženská" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Sborová" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Turecká" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Reggae / Taneční" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "Latinskoamerické" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "College rádio" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Rozhovory / Zprávy" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambient" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Jazz" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Klasická" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternativní" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metal" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Country" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Zprávy" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Šlágry" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Funky" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Blues" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Punk" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Reggaeton" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Slovanská" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Řecká" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gotická" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rock" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "Přejete si načíst seznam oblíbených radiostanic?" #: ../quodlibet/browsers/iradio.py:455 msgid "_Load Stations" msgstr "_Načíst stanice" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Internetová rádia" #: ../quodlibet/browsers/iradio.py:538 msgid "_New Station…" msgstr "_Nová stanice…" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "_Aktualizace stanic" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Všechny stanice" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Oblíbené" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Žádná kategorie" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Nenalezeny žádné stanice" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Na %s nebyly nalezeny žádné stanice." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Všechny stanice na seznamu jsou už ve sbírce." #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "Přidat do oblíbených" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Odstranit z oblíbených" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d stanice" msgstr[1] "%(count)d stanice" msgstr[2] "%(count)d stanic" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Vlastnosti zařízení" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Zařízení:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Není připojeno" #: ../quodlibet/browsers/media.py:55 msgid "Mount point:" msgstr "Přípojný bod:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Jméno:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Zařízení s médii" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Zařízení s médii" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Vysunout" #: ../quodlibet/browsers/media.py:360 msgid "_Properties" msgstr "_Vlastnosti" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Přejmenovat" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%(used-size)s je využito,%(free-size)s je k dispozici" #: ../quodlibet/browsers/media.py:479 #, python-format msgid "%s is not connected." msgstr "%s není připojeno." #: ../quodlibet/browsers/media.py:499 #, python-format msgid "Copying %(song)s" msgstr "Kopírování %(song)s " #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Skladbu nelze kopírovat" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Pro tuto skladbu již není dost místa." #: ../quodlibet/browsers/media.py:526 #, python-format msgid "%s could not be copied." msgstr "%s nelze zkopírovat." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Skladby nelze smazat" #: ../quodlibet/browsers/media.py:557 #, python-format msgid "Deleting %(song)s" msgstr "Odstraňování %(song)s" #: ../quodlibet/browsers/media.py:575 #, python-format msgid "%s could not be deleted." msgstr "%s nelze odstranit." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Skladbu nelze smazat" #: ../quodlibet/browsers/media.py:594 #, python-format msgid "Ejecting %s failed." msgstr "Vysunutí %s selhalo." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Zařízení nelze vysunout" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "Nenalezena obslužná aplikace, prohlížeč mediálních zařízení zakázán." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Prohlížeč s panely" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Prohlížeč s panely" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Vybrat _vše" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Vše" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" "Vzor tagu s volitelným značením, např. <tt>composer</tt> nebo\n" "<tt>%s</tt>" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "Ši_roký mód" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Nastavení prohlížeče s panely" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Seznamy skladeb" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Seznamy skladeb" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Odstranit ze seznamu" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importovat" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Nový seznam skladeb" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Seznam skladeb nelze importovat" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet umí importovat jen seznamy ve formátu M3U a PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Seznam skladeb nelze přejmenovat" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importovat seznam skladeb" #: ../quodlibet/browsers/playlists/menu.py:25 msgid "_New Playlist…" msgstr "_Nový seznam skladeb…" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Co si přejete udělat s touto %d skladbou?" msgstr[1] "Co si přejete udělat s těmito %d skladbami?" msgstr[2] "Co si přejete udělat s těmito %d skladbami?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Potvrdit akci pro seznam skladeb ‚%s‘" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "prázdný" #: ../quodlibet/browsers/playlists/prefs.py:39 msgid "Example Playlist" msgstr "Příklad seznamu skladeb" #: ../quodlibet/browsers/playlists/prefs.py:47 msgid "Playlist Browser Preferences" msgstr "Nastavení prohlížeče seznamu skladeb" #: ../quodlibet/browsers/playlists/prefs.py:52 msgid "Playlist display" msgstr "Zobrazení seznamu skladeb" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Jste si jistí, že chcete smazat seznam skladeb ‚%s‘?" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Všechny informace o vybraných seznamech skladeb budou smazány a nebude je " "možné obnovit." #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Zadejte jméno nového seznamu:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importování seznamu skladeb.\n" "\n" "%(current)d/%(total)d skladeb přidáno." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Omezit výsledky" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Prohledávat sbírku" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Hledat ve sbírce" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Prohlížeč s panely" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Hledání" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "Spojení" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet neběží (pro spuštění přidejte '--run')" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "hudební sbírka a přehrávač" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[volba]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Vypsat přehrávanou skladbu a skončit." #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Ihned začít přehrávat" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Další skladba" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" "Skočit na předchozí skladbu nebo začít znovu, pokud je přehrávání na začátku" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Předchozí skladba" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Přehrávat" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pauza" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Prohodit režim přehrávání/pauza" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Přehrávat" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Zesílit hlasitost" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Snížit hlasitost" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Zobrazit stav přehrávače" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Skrýt hlavní okno" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Obnovit hlavní okno" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Přepnout viditelnost hlavního okna" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Zaměřit běžící přehrávač" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Odstranit aktivní fiiltry procházení" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Obnovit a znovu načíst sbírku" #: ../quodlibet/cli.py:110 msgid "List available browsers" msgstr "Seznam dostupných prohlížečů" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Zobrazit současný seznam skladeb" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Zobrazit obsah fronty" #: ../quodlibet/cli.py:113 msgid "Print the active text query" msgstr "Tisk aktivního dotazu" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Start bez zásuvných modulů" #: ../quodlibet/cli.py:115 msgid "Start Quod Libet if it isn't running" msgstr "Spustit Quod Libet jestliže už neběží" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Ukončit Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Vyhledávat v přehrávané skladbě" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][ HH:] MM: SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Prohodit mód promíchání" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Vypnout/zapnout či přepnout opakování" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Nastavit hlasitost" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Procházet sbírku skladeb" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "dotaz" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Přehrát soubor" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 msgctxt "command" msgid "filename" msgstr "název souboru" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Ohodnotit přehrávanou skladbu" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Nastavit aktuální prohlížeč" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Ohodnotit přehrávanou skladbu" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Otevřít nový prohlížeč" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Zobrazit nebo skrýt frontu" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Zobrazit nebo skrýt hlavní seznam skladeb" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filtr s náhodnou hodnotou" #: ../quodlibet/cli.py:134 msgctxt "command" msgid "tag" msgstr "tag" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filtr na hodnotu tagu" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=hodnota" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Zařadit do fronty soubor nebo dotaz" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Vyřadit z fronty soubory oddělené čárkou" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "název souboru" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Zobrazit jména souborů z výsledku hledání na standardní výstup" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Vyřadit z fronty soubor nebo dotaz" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Neplatný argument pro ‚%s‘." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Zkuste %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Neznámé zařízení" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "Nemohu importovat %s, což je třeba pro podporu zařízení." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r není podporované zařízení." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "‚%s‘ nelze nalézt." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Načítání zařízení." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Zkoušení ‚%s‘" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Nelze se připojit k obslužné aplikaci zařízení." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Zařízení načteno." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Vzor názvu souborů:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopírovat _obaly alb" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Odstranit nepoužívané přebaly a složky" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Vyskytla se chyba" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 #, fuzzy msgid "Quit Program" msgstr "_Program:" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Ignorovat _všechny chyby" #: ../quodlibet/errorreport/ui.py:80 #, fuzzy msgid "Error details:" msgstr "Podrobnosti o chybě" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "popis" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "editor tagů " #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "složka" #: ../quodlibet/ext/covers/artwork_url.py:19 #, fuzzy msgid "Artwork URL Cover Source" msgstr "Přebaly alb z Last.fm" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "Přebaly alb z Last.fm" #: ../quodlibet/ext/covers/discogs.py:26 #, fuzzy msgid "Downloads covers from Discogs." msgstr "Stahování přebalů alb z různých zdrojů." #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "Přebaly alb z Last.fm" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Stahují se přebaly z archivu Last.fm." #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "MusicBrainz Cover Source" msgstr "Zdroj přebalů MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Stažení přebalů z archivu MusicBrainz." #: ../quodlibet/ext/editing/iconv.py:26 msgid "Convert Encodings" msgstr "Převést kódování" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "Opravuje špatné kódování hodnoty tagu v editoru tagů." #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "_Převést kódování…" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "Kana/Kanji inverze" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "Převést kana/kanji na latinku." #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "_Japonský text na latinku" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "Nelze najít 'Kanji Kana Simple Inventer' (kakasi)." #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "Náhrada regulárním výrazem" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Umožňuje libovolné náhrady regulárními výrazy (s///) při úpravách tagů nebo " "přejmenovávání souborů." #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title Case" msgstr "Velikost písmen u názvů" #: ../quodlibet/ext/editing/titlecase.py:21 msgid "Title-cases tag values in the tag editor." msgstr "Velikosti písmen názvů v editoru." #: ../quodlibet/ext/editing/titlecase.py:40 msgid "Title-_case Value" msgstr "Velikost _písmen v názvech" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "Povolit _Všechna velká u tagů" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "_Běžná velká malá písmena" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Pro velká/malá písmena použít základní pravidla z angličtiny (např. „Dark " "Night of the Soul“)" #: ../quodlibet/ext/events/advanced_preferences.py:69 msgid "Advanced Preferences" msgstr "Pokročilá nastavení" #: ../quodlibet/ext/events/advanced_preferences.py:70 #, fuzzy msgid "Allow editing of advanced config settings." msgstr "Povolit dolazení pokročilých nastavení." #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "Animovaná obrazovka" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "Zobrazení informací o skladbě, pokud se tato změní." #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "Nahoru" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "Uprostřed" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "Dolů" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "_Poloha:" #: ../quodlibet/ext/events/animosd/prefs.py:171 msgid "_Cover size:" msgstr "_Velikost přebalu:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 msgid "Display" msgstr "Zobrazení" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "_Písmo:" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "Vlevo" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "Na střed" #: ../quodlibet/ext/events/animosd/prefs.py:197 msgid "Right" msgstr "Pravá" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "_Zarovnat text:" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "Text" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "_Text:" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "_Vyplnit:" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "Barvy" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "_Stíny" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "_Obrysy" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "O_blé rohy" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "_Zpoždění:" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "Efekty" #: ../quodlibet/ext/events/animosd/prefs.py:270 msgid "Ed_it Display Pattern…" msgstr "U_pravit vzor zobrazení…" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 msgid "Preview" msgstr "Náhled" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "Automatické obnovení spírky" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "Udržovat sbírku aktuální pomocí inotify. Vyžaduje %s." #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "Automatické maskování" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" "Automatické použití mask a umask u disků, které jsou připojeny a odpojeny." #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "Automatické hodnocení" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" "Automatické hodnocení skladeb, které jsou přeskočeny nebo přehrány. Používá " "se ‚urychlený‘ algorytmus z vux od Briana Nelsona." #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "Budík" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "Probuzení hlasitou hudbou." #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "Ukolébavka" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "Ztlumí a pozastaví přehrávání." #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "Byt" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "Naživo" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "Plný bas i výšky" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "Klub" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "Velká hala" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "Párty" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "Jemně" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "Bohaté hloubky" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "Reggae" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "Sluchátka" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "Soft Rock" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "Plné výšky" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "Taneční" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "Techno" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "Ska" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "Notebook" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "Ekvalizér" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "Současná obslužná aplikace na pozadí nepodporuje ekvalizér." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "%.1f kHz" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "%d Hz" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, python-format msgid "%.1f dB" msgstr "%.1f dB" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom" msgstr "Vlastní" #: ../quodlibet/ext/events/equalizer.py:199 msgid "_Clear" msgstr "_Vyčistit" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "Gajim status" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "Změna statusu pro Gajim podle toho, co se zrovna přehrává." #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "Zastaveno" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" "Vypsat účty, oddělené čárkou, pro změnu statusu. Není-li žádný účet vybrán, " "změní se status pro všechny účty." #: ../quodlibet/ext/events/gajim_status.py:160 #, fuzzy msgid "Add '[paused]'" msgstr "Zastaveno" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" "Je-li zaškrtnuto, ke zprávě statusu bude při zastavení přehrávání přidáno " "‚[paused]‘." #: ../quodlibet/ext/events/gajim_status.py:187 #, fuzzy msgid "Statuses for which message will be changed" msgstr "Statusy, pro které bude změněna zpráva." #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "Zastavit přehrávání při odpojení sluchátek" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" "Zastavení přehrávání, pokud jsou odpojena sluchátka, pokud jsou opět " "připojena, přehrávání se znovu spustí." #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "Potlačit spořič obrazovky" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "Zabraňuje spořiči GNOME v aktivování pokud se přehrává skladba." #: ../quodlibet/ext/events/inhibit.py:51 msgid "Music is playing" msgstr "Přehrává se" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "Internet Radio Log" msgstr "Log internetových rádií" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" "Nahrání posledních 10 skladeb hradných v rádiích a jejich uložení do " "kontextového menu vyhledávání." #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "JEP-118" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "Uloží soubor Jabber User Tunes do ~/.quodlibet/jabber." #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "Změnit _hodnocení" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "Výchozí" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 msgid "No active song" msgstr "Žádné aktivní skladby" #: ../quodlibet/ext/events/lyricswindow.py:215 msgid "No lyrics found" msgstr "Žádné texty nenalezeny" #: ../quodlibet/ext/events/lyricswindow.py:227 msgid "Lyrics:" msgstr "Texty:" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "_Úroveň přiblížení:" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "URL:" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "Vrátit na základní hodnotu" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "Hledat přes uvedené URL, jestliže nelze texty dohledat na LyricsWikia." #: ../quodlibet/ext/events/lyricswindow.py:339 msgid "Alternate search" msgstr "Alternativní hledání" #: ../quodlibet/ext/events/lyricswindow.py:347 msgid "Lyrics Window" msgstr "Okno textů" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "Zobrazení okna s textem právě přehrávané skladby." #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "UPnP AV Mediální Server" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" "Zpřístupnění všech alb pro Rygel UPnP Media Server přes MediaServer2 D-Bus " "rozhraní." #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "MPD Server" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" "Povolit vzdálenou kontrolu přehrávače Quod Libet klientem MPD. Streaming, " "správa seznamu skladeb ani knihovny nejsou podporovány." #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "_Port:" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "Lokální _IP adresa:" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "H_eslo:" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 msgid "Connection" msgstr "Spojení" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "Otestované klienty" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "MPRIS D-Bus podpora" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" "Umožňuje kontrolu Quod Libet s použitím MPRIS 1.0/2.0 D-Bus specifikace " "rozhraní." #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "Skrýt hlavní okno při zavření" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Nastavení" #: ../quodlibet/ext/events/mqtt.py:50 #, fuzzy, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" "Text statusu, když je přehrávání pozastaveno. Je možné použít QL vzory jako " "např. %s." #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Vzory cesty" #: ../quodlibet/ext/events/mqtt.py:130 #, fuzzy msgid "Status text when a song is started." msgstr "" "Text statusu při začátku přehrávání. Je možné použít QL vzory jako např. %s." #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Vzory statusu" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "Žádná skladba:" #: ../quodlibet/ext/events/mqtt.py:138 #, fuzzy msgid "Plain text for when there is no current song" msgstr "Text pro status, pokud není dostupná informace o aktuální skladbě" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Nastavení výstupu" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "Status" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Nelze se připojit k %s" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "Chyba připojení" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "Oznamovací text" #: ../quodlibet/ext/events/notify.py:88 msgid "_Title:" msgstr "_Název:" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "Zpět na základní hodnotu" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "_Tělo:" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "_Zobrazit notifikaci" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "Zobrazovat notifikace" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "Pouze při <i>_ručních</i>změnách skladby" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "Pouze při <i>_automatických</i> změnách skladeb" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "Při změně <i>_všech</i> skladeb" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "Pouze když není _aktivní hlavní okno" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "Chyba připojení" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "Nelze se připojit k oznamovacímu daemonu." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "Oznamování skladeb" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "Zobrazení informace při změně skladby." #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Další" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" "Pro nastavení QLSCrobbleru otevřete okno Zásuvních modulů. Do té doby " "nebudou informace o skladbách odesílány." #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "Nelze se připojit ke službě ‚%s‘." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "Autentizace selhala: neplatné URL." #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "Autentizace selhala: neplatné jméno uživatele ‚%s‘ nebo heslo." #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "Klient je zakázán, kontaktujte autora." #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" "Vypadá to, že je nastaven špatný systémový čas. Informace o přehrávaných " "skladbách se možná nebudou odesílat, dokud nebude čas nastaven správně." #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "Zasílání dat přes AudioScrobbler" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "AudioScrobbler, klient pro Last.fm, Libre.fm a ostatní služby." #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "Autentizace proběhla úspěšně." #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "_Služba:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "_URL:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "User_name:" msgstr "_Jméno:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "_Heslo:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 msgid "Other…" msgstr "Ostatní…" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "_Ověřit účet" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "Účet" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Artist pattern:" msgstr "_Vzor pro umělce:" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Title pattern:" msgstr "_Vzor názvu skladeb:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "Vyloučit _filtr:" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" "Vzor používaný pro formátování jména umělce při odesílání informací. " "Ponechte prázdné pro výchozí hodnotu." #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" "Vzor používaný k zformátování názvu pro odesílání. Ponechte prázdné pro " "výchozí hodnotu." #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" "Informace o skladbách odpovídajících zadanému filtru nebudou odesílány." #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "_Offline mód (neodesílat žádné informace)" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "Odeslání" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "Ztlumit reklamy rádií" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" "Ztlumení výstupu během vysílání reklam v rádiích.\n" "Stanice: di.fm." #: ../quodlibet/ext/events/randomalbum.py:27 msgid "Random Album Playback" msgstr "Přehrávání náhodného alba" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" "Začít přehrávat náhodné album, když přehrávání seznamu skladeb dosáhne " "konce. Je nutné nastavit v prohlížeči možnost filtrování podle alba." #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "Hodnoceno lépe" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "Přehráváno častěji" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "Přeskočeno častěji" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "Přehráváno nedávno" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "Spuštěno nedávno" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "Přidáno nedávno" #: ../quodlibet/ext/events/randomalbum.py:44 msgid "Longer albums" msgstr "Delší alba" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "vteřiny před začátkem přehrávání alba" #: ../quodlibet/ext/events/randomalbum.py:87 msgid "Weights" msgstr "Rovnováha" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "Přehrávat některá alba častěji než jiná" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "raději ne" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "upřednostnit" #: ../quodlibet/ext/events/randomalbum.py:201 msgid "Random Album" msgstr "Náhodné album" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "Čekání na začátek %s" #: ../quodlibet/ext/events/rbimport.py:114 msgid "Import Failed" msgstr "Import selhal" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "Import hodnocení a statistik %d skladeb byl úspěšný." #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "Import z Rhythmboxu" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "Import hodnocení a statistik skladeb z Rhythmboxu." #: ../quodlibet/ext/events/rbimport.py:132 msgid "Start Import" msgstr "Spustit import" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "Zastavení spořiče obrazovky" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "Zastavení přehrávání při aktivním spořiči obrazovky (GNOME)." #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "Pro Quod Libet není instalován žádný vyhledávač přes GNOME Shell." #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "Poskytovatel prohledávání GNOME" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "Povolit prohledávání sbírky přes GNOME Shell." #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "Alternativní lišta prohledávání" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" "Alternativní řádek prohledávání. Je vždy viditelný a zabírá vždy celou šíři " "okna." #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "Synchronizace se Squeezboxem" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" "Logitech Squeezebox jako zrcadlo Quod Libet, obojí načítáno ze stejné sbírky." #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "Chyba při hledání Squeezebox serveru" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "Chyba při hledání %s. Zkontrolujte, prosím, nastavení." #: ../quodlibet/ext/events/synchronizedlyrics.py:34 msgid "Synchronized Lyrics" msgstr "Synchronizované texty" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" "Zobrazení synchronizovaných textů z .lrc souboru s názvem stejným, jako je " "název skladby." #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "Text:" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "Pozadí:" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "Písmo" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "Velikost (px):" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "Status zprávy pro Telepathy" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" "Aktualizace všech účtů založených na messengeru Telepathy (Empathy apod.) " "statusem se zprávou o právě přehrávané skladbě." #: ../quodlibet/ext/events/telepathy_status.py:122 msgid "Playing:" msgstr "Přehrává se:" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" "Text statusu při začátku přehrávání. Je možné použít QL vzory jako např. %s." #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "Zastaveno:" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" "Text statusu, když je přehrávání pozastaveno. Je možné použít QL vzory jako " "např. %s." #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "Text pro status, pokud není dostupná informace o aktuální skladbě" #: ../quodlibet/ext/events/telepathy_status.py:157 msgid "No song:" msgstr "Žádná skladba:" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 msgid "Status Patterns" msgstr "Vzory statusu" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "Změna tématu" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "Změna GTK+ tématu." #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "_Téma:" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "Základní téma" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "Upřednostit tmavou variantu" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Nepřehrává se" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "Ikona v oznamovací oblasti" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "Ovládá Quod Libet ze systémové lišty." #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "_Zobrazit %(application-name)s" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 msgid "_Play" msgstr "_Přehrávat" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 msgid "P_ause" msgstr "P_auza" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 msgid "Pre_vious" msgstr "_Předchozí" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "_Další" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Promíchat" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Opakovat" #: ../quodlibet/ext/events/trayicon/menu.py:86 msgid "Stop _After This Song" msgstr "Po této skladbě _zastavit přehrávání" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 msgid "Open _Browser" msgstr "Otevřít _prohlížeč" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Editovat _Tagy" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informace" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 msgid "Play_lists" msgstr "Seznamy _skladeb" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "_Zavřít" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Chování" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "Ovládat hlasitost kolečkem myši" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "Přechod na další skladbu kolečkem myši" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "_Kolečko myši" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Zobrazení tipů" #: ../quodlibet/ext/events/viewlyrics.py:23 msgid "View Lyrics" msgstr "Zobrazit texty" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "Automatické zobrazení textů pod seznamem skladeb v hlavním okně." #: ../quodlibet/ext/events/viewlyrics.py:29 msgid "_Lyrics" msgstr "_Texty" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 msgid "Error" msgstr "Chyba" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 #, fuzzy msgid "Waveform Seek Bar" msgstr "Alternativní lišta prohledávání" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "Ukládání obrázků" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "Uložení obrázku přebalu do vybraného souboru skladby." #: ../quodlibet/ext/events/write_cover.py:66 msgid "File:" msgstr "Soubor:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "_Práh:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "Práh dokud je aktivován filtr" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "P_oměr:" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "Poměr komprese" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "%d %%" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "Kompresor" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" "Změnit amplitudu všech vzorků nad určitý práh na základě určitého poměru." #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "_Preset:" msgstr "_Přednastavení:" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "Filter preset" msgstr "Přednastavení filtru" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "_Ořez frekvence:" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "Low-pass filtr frekvence" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "Úroveň _kanálu:" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "Úroveň kanálu" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "Výchozí" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "Umístění nejblíže k virtuálnímu reproduktoru (30°, 3 metry)" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "Chu Moy" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "Podobné směšovači Chu Moye (oblíbené)" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "Jan Meier" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "Přiblížit CORDA zesilovačům Jana Meiera (malá změna)" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom settings" msgstr "Vlastní nastavení" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "Směšování kanálů" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" "Směšování levého a pravého kanálu způsobem, který napodobuje nastavení " "vhodné pro poslech ve sluchátkách nebo vyrovnává nastavení nejstarších " "stereo nahrávek, kde jsou kanály příliš oddělené." #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "Filter _band:" msgstr "Filtrovat podle _skupiny:" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "Frekvenční pásmo filtru" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "Filter _width:" msgstr "Šíře _filtru:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "Šíre frekvence filtru" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "_Úroveň:" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "Úroveň efektu" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "Karaoke" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "Odstranění hlavních vokálů." #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "Sloučení kanálů (mono)" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "Sloučí oba kanály sterea do jednoho (mono)." #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "_Hodnotit:" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "_Tempo:" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "_Zpomalení:" #: ../quodlibet/ext/gstreamer/pitch.py:89 msgid "Audio Pitch / Speed" msgstr "Audio zpomalení / rychlost" #: ../quodlibet/ext/gstreamer/pitch.py:90 msgid "Controls the pitch of an audio stream." msgstr "Kontrola rychlosti přehrávání streamu." #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Exportovat seznam skladeb do Squeezeboxu" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importovat" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Nenalezeny žádné stanice" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Vzor názvu souborů:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Vzor názvu souborů:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "Export pro Squeezbox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 #, fuzzy msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" "Dynamický export seznamu skladeb pro Logitech Squeezbox se sdílením " "struktury složek. Sdílení konfigurace se zásuvným modulem pro Squeezbox." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "Exportovat seznam skladeb do Squeezeboxu" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "Jméno seznamu skladeb (přepíše již existující)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "Exportovat seznam skladeb pro Squeezebox" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 msgid "Remove Playlist Duplicates" msgstr "Odstranit duplicity ze seznamu skladeb" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "Odstraní duplicity ze seznamu skladeb." #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Jste si jistí, že chcete odstranit %d duplicitní skladbu?" msgstr[1] "Jste si jistí, že chcete odstranit %d duplicitní skladby?" msgstr[2] "Jste si jistí, že chcete odstranit %d duplicitních skladeb?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "Duplikátní skladby budou ze seznamu skladeb ‚%s‘ odstraněny." #: ../quodlibet/ext/playlist/shuffle.py:15 msgid "Shuffle Playlist" msgstr "Zamíchat seznam skladeb" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "Náhodně zamíchat seznam skladeb." #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "Zaměřit kurzor" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 #, fuzzy msgid "Playcount Equalizer" msgstr "Ekvalizér" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "naposledy hrané" #: ../quodlibet/ext/playorder/queue.py:19 msgid "Queue Only" msgstr "Pouze fronta" #: ../quodlibet/ext/playorder/queue.py:21 #, fuzzy msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" "Omezení přehrávání skladeb ve frontě. Skladbu je možné zařadit do fronty " "dvojklikem." #: ../quodlibet/ext/playorder/reverse.py:14 msgid "Reverse" msgstr "Opačně" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "Inverze (převrácení) pořadí přehrávání skladeb" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Přeskočit počet" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "Zamíchat skladby, ale opakovat každou z nich podle nastaveného počtu." #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "Počet přehrání pro každou skladbu:" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "Podmíněný dotaz" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" "Výběr dotazu hledání založený na podmíněném dotazu. Syntaxe je '@(if: " "condition, then, else)'." #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "Dotaz v Pythonu" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" "V dotazech používejte syntaxi z Pythonu. Syntaxe je '@(python: expression)', " "přičemž proměnná 's' je název skladby." #: ../quodlibet/ext/query/savedsearch.py:19 msgid "Include Saved Search" msgstr "Použít uložené hledání" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" "Zahrnout výsledky uloženého hledání jako část jiného dotazu. Syntaxe je " "'@(saved: hledaný výraz)'." #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "Squeezbox OK. Používá se přehrávač (%s)." #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "Nelze se připojit k %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "Hostname:" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "Port:" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 msgid "Username:" msgstr "Uživatel:" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "Heslo:" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "Složka sbírky, ke které se server připojuje." #: ../quodlibet/ext/_shared/squeezebox/base.py:132 msgid "Library path:" msgstr "Cesta ke sbírce:" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "O_věřit nastavení" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "Squeezebox server" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Ladit" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Squeezbox server na {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "neidentifikován server Squeezbox" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "neindentifikován přehrávač pro Squeezbox: %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "Vybrat přehrávač pro Squeezbox" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "_OK" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Nalezen Squeezbox server.\n" "Vyberte, prosím, přehrávač" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "Přizpůsobit obrázek _oknu" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "_Program:" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "_Upravit obrázek po uložení" #: ../quodlibet/ext/songsmenu/albumart.py:345 msgid "File_name:" msgstr "Náze_v souboru" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "Ukládání selhalo" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, python-format msgid "Unable to save \"%s\"." msgstr "Nelze uložit ‚%s‘." #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] HTTP chyba: %s" #: ../quodlibet/ext/songsmenu/albumart.py:613 msgid "Album Art Downloader" msgstr "Klient stahování přebalů" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "z %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "Rozlišení: %s" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, python-format msgid "Size: %s" msgstr "Velikost: %s" #: ../quodlibet/ext/songsmenu/albumart.py:690 msgid "_Search" msgstr "_Hledat" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 msgid "Searching…" msgstr "Hledání…" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "Hotovo" #: ../quodlibet/ext/songsmenu/albumart.py:922 msgid "Download Album Art" msgstr "Stáhnout přebal" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "Stahování přebalů alb z různých zdrojů." #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "Zdroje" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "Z APEv2 na ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" "Převedení APEv2 tagů na ID3v2 tagy. Po převodu budou původní APEv2 tagy " "smazány." #: ../quodlibet/ext/songsmenu/bookmarks.py:23 msgid "Go to Bookmark" msgstr "Přejít na záložku" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "Úprava záložek u vybraných souborů." #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 msgid "_Edit Bookmarks…" msgstr "_Upravit záložky..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 msgid "No Bookmarks" msgstr "Žádné záložky" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 msgid "MusicBrainz Lookup" msgstr "Vyhledávání na MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Přetagovat album na základě vyhledávání v MusicBrainz." #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "Pro „date“ tag pužít pouze rok" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "Zapsat „_albumartist“, pokud bude třeba" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "Zapsat tagy pro třídění umělců" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "Zapsat _standardní tagy MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Název souboru" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 msgid "Disc" msgstr "Disk" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Skladba" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 msgid "Title" msgstr "Název" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Umělec" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 msgid "MusicBrainz lookup" msgstr "MusicBrainz vyhledávání" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 msgid "_Query:" msgstr "_Dotaz:" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 msgid "S_earch" msgstr "Vyhl_edávání" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "Výsledky <i>(přetáhnout a změnit pořadí)</i>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "Vložte prosím dotaz." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "Objevila se chyba. Zkuste to, prosím, znovu." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "Načítání výsledků…" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 msgid "No results found." msgstr "Žádné výsledky nenalezeny." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 msgid "Browse Folders" msgstr "Procházet složky" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "Otevření složky umístění skladby ve správci složek." #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Unable to open folders" msgstr "Složky nelze otevřít" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "Pro otevírání složek není dostupný žádný program." #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "Konzole Pythonu" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "Interaktivní konzole pro Python" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "Jako základ můžete použít následující objekty:" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "Aktuální pracovní složka:" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "Příkaz" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "name" msgstr "jméno" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "Jméno příkazu" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "příkaz" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "Spustit příkaz v syntaxi shellu" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "parametr" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" "Je-li specifikováno,výskyty parametru v příkazu budou nahrazeny uživatelem " "zadanou hodnotou, např. při použití 'PARAM' budou všechny výskyty '{PARAM}' " "v příkazu nahrazeny hodnotou, na kterou bude uživatel dotázán při spuštění." #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "vzor" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" "QL vzor jako např. <~filename> pro použití k výpočtu hodnoty příkazu. Pro " "seznamy skladeb je možné použít virtuální tagy <~playlistname> a " "<~#playlistindex>." #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "unikátní" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" "Pokud je nastaveno, duplicitní vypočtené hodnoty budou ze vzoru odstraněny." #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "max args" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "Nejvyšší počet argumentů k předání příkazu najednou (jako xargs)." #: ../quodlibet/ext/songsmenu/custom_commands.py:91 msgid "Input value" msgstr "Vstupní hodnota" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "Hodnota %s?" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 msgid "Custom Commands" msgstr "Vlastní příkazy" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Spuštění uživatelských příkazů (možno v dávkách) nad skladbami s použitím " "tagů." #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "Upravit uživatelský příkazy" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 #, fuzzy msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" "Podpora QL vzorů\n" "\vnapř. <tt><~artist~title></tt>" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, python-format msgid "Unable to run custom command %s" msgstr "Nelze spustit příkaz %s" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "%d duplicitní skupina" msgstr[1] "%d duplicitní skupiny" msgstr[2] "%d duplicitních skupin" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "Sbalit / Rozbalit vše" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Duplicitní klíčový výraz je ‚%s‘" #: ../quodlibet/ext/songsmenu/duplicates.py:372 msgid "Duplicates Browser" msgstr "Duplikuje prohlížeč" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "Hledání a zobrazení všech podobně otagovaných verzí skladeb." #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" "Akceptuje výrazy QL tagů jako např. <tt>~artist~title</tt> nebo " "<tt>musicbrainz_track_id</tt>." #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "_Seskupit duplicity podle:" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "Duplicitní klíč" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "Odstranit _bílé znaky" #: ../quodlibet/ext/songsmenu/duplicates.py:424 msgid "Remove _Diacritics" msgstr "Odstranit _diakritiku" #: ../quodlibet/ext/songsmenu/duplicates.py:425 msgid "Remove _Punctuation" msgstr "Odstranit interpunkci" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "Nezohledňovat _velikost písmen" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "Souhlasící možnosti" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 msgid "Edit Playcount" msgstr "Upravit počet přehání" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" "Editovat ~#playcount a ~#skipcount skladby.\n" "\n" "Je-li vybráno více skladeb, počet bude pouze zvýšen, ne znovu nastaven.\n" "\n" "Je-li nastaven ~#playcount na 0, údaje ~#lastplayed a ~#laststarted budou " "resetovány. V případě, že bude nastaveno 0-play skladby na pozitivní " "hodnotu, neovlivní to délku časů přehrávání." #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "Počet přehrání" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "Přeskočit počet" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "Upravit vložené obrázky" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "Odstranit nebo nahradit vložené obrázky." #: ../quodlibet/ext/songsmenu/embedded.py:78 msgid "_Remove all Images" msgstr "_Odstranit všechny obrázky" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "_Vložit aktuální obrázek" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "Nastavit přesné hodnocení" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "Povolit nastavení hodnocení skladeb číslem." #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "Použijte prosím hodnocení na škále od 0.0 do 1.0." #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Filter on Any Tag" msgstr "Nastavit filtr" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "Vytvoření dotazu hledání na základě tagů vybraných skladeb" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 msgid "Filter on Directory" msgstr "Filtrovat složku" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "Filtrovat adresář v novém okně prohlížeče." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "Vyhledávání prstokladu pro akustiku" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "Vyhledávání metadat skladby podle přiřazených prstokladů." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "Potvrdit prstoklady pro akustiku" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Generování prstokladů s použitím chromaprintu a odeslání výsledku na " "acoustid.org." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "Chybí API klíč" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" "Před schválením prstokladů je třeba mít v nastavení zásuvného modulu uveden " "API klíč pro acousticid.org." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "Vyžádání API klíče" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "API _klíč:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "Webová služba AcoustID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Zařazeno do fronty" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "Vyhodnocování" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "Vyhledat" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Zapsat" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "Status" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "Vydání" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 msgid "Write MusicBrainz tags" msgstr "Zapsat tagy MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 msgid "Group by directory" msgstr "Seskupit podle složek" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "Album Mode" msgstr "Režim alba" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "Zapsat tagy a pokusit se redukovat počet různých vydání alba." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "Generování prstokladů:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "_Pordobnosti" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "_Provést" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" "Pro pokračování jsou vyžadovány u skladeb některé z tagů: " "<i><b>musicbrainz_trackid</b></i>, nebo <i><b>artist</b></i> / <i><b>title</" "b></i> / <i><b>album</b></i>." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "Prstoklady:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "Skladby s MusicBrainz ID:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "Skladby s dostatečnými tagy:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "Skladby ke schválení:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Hotovo. %(to-send)d/%(all)d skladby k potvrzení." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "Potvrzování prstokladů:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "Potvrzování…" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Aktualizace stanic" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 #, fuzzy msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" "Uložit soubory znovu. Ve výsledku budou aktualizována i všechna hodnocení a " "počet přehrání." #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "Exportovat do HTML" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "Exportovat seznam vybraných skladeb do HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "Opravit trvání MP3" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" "Odstranění TLEN rámců z ID3 tagů, mohou být důvodem špatného údaje o trvání " "skladeb." #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "Poslat do iFP" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "Nahrát skladby do zařízení iRiver iFP." #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "Exportovat metadata" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "Export metadata vybraných skladeb jako soubor .tags." #: ../quodlibet/ext/songsmenu/importexport.py:92 msgid "Import Metadata" msgstr "Importovat metadata" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "Import metadat ze souboru .tags pro vybrané skladby." #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "Vypálit CD" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Vypálení CD s K3b, Braserem nebo xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "Aktualizace seznamu grafů." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "Není co aktualizovat." #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "Získávání grafu pro týden z %s." #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "Synchronizace dokončena." #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "Chyba během synchronizace" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "Synchronizace s Last.fm" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "Aktualizace statistik sbírky z profilu na Last.fm." #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 msgid "_Username:" msgstr "_Uživatel:" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "Vytvořit tagy pro třídění" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "Převod názvu alba a umělce do jmen pro třídění, volně." #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Exportovat metadata" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Informace" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 msgid "Export as Playlist" msgstr "Exportovat jako seznam skladeb" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "Export skladeb do M3U nebo PLS." #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "Použít relativní cesty" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "Použít absolutní cesty" #: ../quodlibet/ext/songsmenu/playlist.py:132 msgid "Unable to export playlist" msgstr "Seznam skladeb nelze exportovat" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Zápis do <b>%s</b> selhal." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 msgid "Rescan Songs" msgstr "Znovu načíst skladby" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" "Sledování změn a podle potřeby znovunačtení nebo smazání souborů skladeb." #: ../quodlibet/ext/songsmenu/refresh.py:31 msgid "Rescan songs" msgstr "Znovu načíst skladby" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "ReplayGain analyzér" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "Průběh" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "Gain" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "Peak" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, fuzzy, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "Je zde <b>%(to-process)d</b> album k aktualizaci (of %(all)d)." msgstr[1] "Jsou zde <b>%(to-process)d</b> alba k aktualizaci (of %(all)d)l." msgstr[2] "Je zde <b>%(to-process)d</b> alb k aktualizaci (of %(all)d)." #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "Replay gain" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" "Analýza a aktualizace informací metodou ReplayGain (s pomocí GStreameru). " "Výsledky jsou slučovány podle alba." #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "vždy" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "pokud <b>jakékoli</b> RG tagy chybí" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "pokud chybí RG tagy pro <b>album</b>" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "_Zpracovat alba:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 msgid "Existing Tags" msgstr "Stávající tagy" #: ../quodlibet/ext/songsmenu/splitting.py:31 msgid "Split Tags" msgstr "Rozdělit tagy" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "Oddělit současně číslo disku od alba a verzi od názvu." #: ../quodlibet/ext/songsmenu/splitting.py:56 msgid "Split Album" msgstr "Rozdělit album" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "Oddělit číslo disku." #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Přednastavení:" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Tag" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Otevřít editor tagů pro vybrané skladby" #: ../quodlibet/ext/songsmenu/website_search.py:35 msgid "Website Search" msgstr "Vyhledávání na webu" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" "Prohledávání zvolených stránek s použitím jakýchkoli tagů skladeb.\n" "Podporovány jsou vzory, např. %(pattern-example)s." #: ../quodlibet/ext/songsmenu/website_search.py:78 msgid "Search URL patterns" msgstr "Vyhledat URL vzory" #: ../quodlibet/ext/songsmenu/website_search.py:88 msgid "Edit search URLs" msgstr "Upravit URL" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 msgid "Configure Searches…" msgstr "Konfigurovat vyhledávání…" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "Hledat na %(website)s" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "Vyhledat umělce na Wikipedii" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" "Otevřít okno prohlížeče a zobrazit článek o umělci přehrávané skladby na " "Wikipedii." #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "Vyhledat album na Wikipedii" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "Otevřít okno prohlížeče a zobrazit stránku o albu na Wikipedii." #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Sbírka" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Kontrola přípojných bodů" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Načítání sbírky" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Načítání %s" #: ../quodlibet/library/libraries.py:745 #, fuzzy msgid "Loading files" msgstr "Ukládání selhalo" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Selhalo načítání souboru: %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Seznam tagů" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Tisk stručného výpisu" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Sloupce k zobrazení a seřazení ve zkráceném režimu (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "Zobrazit také programovací tagy" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Málo parametrů" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "Příliš mnoho parametrů" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "Popis" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Hodnota" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Vypsat všechny společné tagy" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Zkopírovat tagy z jednoho souboru do druhého" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Náhled změn, zatím neprovádět" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Přeskočit tagy, které nemohou být zapsány" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Nelze zkopírovat tag %r do souboru: %r" #: ../quodlibet/operon/commands.py:157 msgid "Edit tags in a text editor" msgstr "Editovat tagy v textovém editoru" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "Editace zrušena" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Spuštění editoru '%(editor-name)s' selhalo." #: ../quodlibet/operon/commands.py:260 msgid "No changes detected" msgstr "Žáčné změny nenalezeny" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Nastavit tag a přepsat původní hodnoty" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Nelze nastavit %r" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "Odstranit tagy" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "Hodnota je regulární výraz" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "Odstranit všechny tagy" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "Nelze kombinovat '--all' s '--regexp'" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "Nelze odstranit %r z %r" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "Odstranit hodnotu" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "Přidat hodnotu" #: ../quodlibet/operon/commands.py:456 msgid "List file information" msgstr "Zobrazit informace o souboru" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" "Nastavit vybraný obrázek jako primární vložený obrázek a odstranit všechny " "ostatní vložené obrázky." #: ../quodlibet/operon/commands.py:515 #, python-format msgid "Failed to load image file: %r" msgstr "Načítání souboru %r selhalo" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" "Upravování obrázků není pro %(file_name)s (%(file_format)s) podporováno." #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "Odstranit všechny vložené obrázky" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Extrahovat z vložené obrázky do %(filepath)s" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" "Cesta ke složce, kam se budou ukládat obrázky (defaultně do pracovního " "adresáře)" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Přejmenovat soubory podle tagů" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Vyplnit tagy podle cest k souborům" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Soubor" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Vyplnit čísla skladeb u všech souborů" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Vytisknout tagy podle zadaného vzoru" #: ../quodlibet/operon/commands.py:768 msgid "Display help information" msgstr "Zobrazit informace o pomoci" #: ../quodlibet/operon/util.py:40 #, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "'%(column-id)s' není platné jméno sloupce (%(all-column-ids)s)." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Neznámé" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "V pořadí" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_V pořadí" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Náhodně" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Náhodně" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Opakovat" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Jedna skladba" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Načítání do vyrovnávací paměti" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "Nelze vytvořit rouru GStreameru" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "Pro obsluhu tohoto formátu nebyl nalezen žádný element GStreameru" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "Formát média: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "Zásuvný modul GStreameru '%(name)s' se nepodařilo inicializovat." #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "Roura výstupu GStreameru používaná pro přehrávání. Nechte prázdné pro " "použití výchozí roury. Pokud roura obsahuje sink, bude použit místo " "defaultního." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Výstupní roura:" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f vteřin" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "_Délka mezipaměti:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "Zakázat přehrávání _bez mezer" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" "Zakázání přehrávání bez mezer může s některými verzemi GStreameru předejít " "problémům s přechody mezi skladbami." #: ../quodlibet/player/gstbe/util.py:93 msgid "No GStreamer audio sink found" msgstr "GStreamer audio sink nenalezen" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "Neplatná výstupní roura GStreameru." #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Nelze vytvořit audio výstup." #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Zařízení %r nenalezeno. Zkontrolujte nastavení Xine v ~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "Nelze najít modul '{module}'. Možná bude nutné doinstalovat balík." #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Nelze najít element '{element}' GStreameru." #: ../quodlibet/plugins/playlist.py:30 #, fuzzy, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "Spustit zásuvný modul „%(name)s“ pro %(count)d seznam skladeb?" msgstr[1] "Spustit zásuvný modul „%(name)s“ pro %(count)d seznamy skladeb?" msgstr[2] "Spustit zásuvný modul „%(name)s“ pro %(count)d seznamů skladeb?" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 msgid "_Run Plugin" msgstr "_Spuarir zásuvný modul" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Podporované formáty: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Zvukové zařízení: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Začátek" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Čas" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Název záložky" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Záložky" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtry" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "_Nedávno hrané" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Nedávno _Přidané" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 msgid "All _Songs" msgstr "Všechny _skladby" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Náhodný _Žánr" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Náhodný Umělec" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Náhodné al_bum" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 skladeb, které jste poslouchali nejvíc (více než 40 jich může být vybráno " "také)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Hodnota:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Uložené hodnoty" #: ../quodlibet/qltk/cbes.py:263 msgid "Edit saved values…" msgstr "Upravit uložené hodnoty..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_maticky" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "_Režim skladby" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "_Režim alba" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "_Ztlumit" #: ../quodlibet/qltk/controls.py:128 msgid "_Replay Gain Mode" msgstr "_Replay Gain mód" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "Nový %s" #: ../quodlibet/qltk/data_editors.py:218 msgid "(unknown)" msgstr "(neznámé)" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "Výraz tagu" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "Výraz tagu, např. people:real nebo ~album~year." #: ../quodlibet/qltk/data_editors.py:383 msgid "Enter new tag" msgstr "Vložit nový tag" #: ../quodlibet/qltk/delete.py:37 msgid "Files:" msgstr "Soubory:" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "Vybrané skladby budou odstraněny ze sbírky a smazány z disku." #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "Vybrané soubory budou smazány z disku." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "Smazat %(file_count)d soubor navždy?" msgstr[1] "Smazat %(file_count)d soubory navždy?" msgstr[2] "Smazat %(file_count)d souborů navždy?" #: ../quodlibet/qltk/delete.py:91 msgid "_Delete Files" msgstr "_Smazat soubory" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "Vybrané skladby budou odstraněny ze sbírky a jejich soubory budou odstraněny " "do koše." #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "Vybrané soubory budou přesunuty do koše." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "Přesunout %(file_count)d soubor do koše?" msgstr[1] "Přesunout %(file_count)d soubory do koše?" msgstr[2] "Přesunout %(file_count)d souborů do koše?" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Přesunout do koše" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Přesouvání %(current)d/%(total).d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Nelze přesunout do koše" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 msgid "Moving one or more files to the trash failed." msgstr "Přesouvání jednoho nebo více souborů do koše selhalo." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Mazání %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 msgid "Unable to delete files" msgstr "Soubory nezle smazat" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 msgid "Deleting one or more files failed." msgstr "Odstraňování jednoho nebo více souborů selhalo." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Stažené" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Velikost" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "_Stop" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "chybí u %d skladby" msgstr[1] "chybí u %d skladeb" msgstr[2] "chybí u %d skladeb" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "liší se u %d skladby" msgstr[1] "liší se u %d skladeb" msgstr[2] "liší se u %d skladeb" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Rozdělit do _Více položek" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Oddělit disk od _Alba" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Oddělit _Verzi od názvu" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Oddělit aranžmá od Umělce" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Oddělit _Interpreta od umělce" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "Oddělit _Interpreta od názvu" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "Oddalit _Původního umělce od názvu" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Přidat tag" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Upravit tagy" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Ukázat _" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Používat všechny tagy včetně strojově generovaných, jako jsou např. " "MusicBrainz tegy nebo tagy Úpravy hlasitosti" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 msgctxt "edittags" msgid "_Revert" msgstr "_Obrátit pořadí" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "_Uložit" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Tag nelze přidat" #: ../quodlibet/qltk/edittags.py:660 #, python-format msgid "Unable to add <b>%s</b>" msgstr "Nelze přidat <b>%s</b>" #: ../quodlibet/qltk/edittags.py:662 #, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "Vybrané soubory nepodporují zadávání více položek pro <b>%s</b>." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Neplatný tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Neplatný tag %s\n" "\n" "Vybrané soubory nepodporují označení tímto tagem." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Neplatná hodnota" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Neplatná hodnota: %(value)s\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Tag nemusí být správně" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "%(file-name)s se za běhu programu změnily. Uložení bez obnovení sbírky " "(refresh) by mohlo přepsat jiné změny." #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Skladbu nelze uložit" #: ../quodlibet/qltk/_editutils.py:50 #, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Ukládání%(file-name)s selhalo. Soubor může být jen pro čtení, poškozený, " "nebo nemáte právo ho měnit." #: ../quodlibet/qltk/_editutils.py:142 msgid "_More options…" msgstr "_Více možností..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "_Krok zpět" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "_Znovu provést změny" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "_O Quod Libet" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Zásuvné moduly" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s a %(count)d více" msgstr[1] "%(title)s a %(count)d více" msgstr[2] "%(title)s a %(count)d více" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Nastavení Ex Falsa" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Rozdělit _v:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Úprava tagů" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Složky" #: ../quodlibet/qltk/filesel.py:253 msgid "_New Folder…" msgstr "_Nová složka…" #: ../quodlibet/qltk/filesel.py:262 msgid "_Select all Sub-Folders" msgstr "_Vybrat všechny podsložky" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Nová složka" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Jméno nové složky:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Složku nelze vytvořit" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Složku nelze smazat" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Skladby" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "podle %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disk %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Skladba %s" #: ../quodlibet/qltk/info.py:108 msgid "_Edit Display…" msgstr "_Upravit zobrazení…" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Nejsou vybrány žádné skladby." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Žádné skladby." #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informace" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Texty" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Vydáno %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "umělec" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "umělci" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "interpreti" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Nikdy" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)dkrát" msgstr[1] "%(n)dkrát" msgstr[2] "%(n)dkrát" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "přidáno" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "naposledy hrané" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "přehrání" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "přeskočení" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "hodnocení" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "délka" #: ../quodlibet/qltk/information.py:289 msgid "format" msgstr "formát" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "kodek" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 msgid "encoding" msgstr "kódování" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "velikost souboru" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "naposledy změněno" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d vybrána" msgstr[1] "%d vybrány" msgstr[2] "%d vybráno" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Skladba je nedostupná" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Seznam skladeb" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d skladba mimo alba" msgstr[1] "%d skladby mimo alba" msgstr[2] "%d skladeb mimo alba" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Vybraná diskografie" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d skladba bez umělce" msgstr[1] "%d skladby bez umělce" msgstr[2] "%d skladeb bez umělce" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "alba" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Celková delka:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Celková velikost" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Soubory" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Stahování" #: ../quodlibet/qltk/lyrics.py:40 msgid "_Edit" msgstr "_Upravit" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Ke skladbě nebyly nalezeny žádné texty." #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "Hledání textů..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "Jste si jistí, že chcete odstranit všecny skladby?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "Vybrané soubory budou odstraněny ze sbírky." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "Odkrýt" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "_Odkrýt" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Zahodit změny v tagu?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tagy byly změněny, ale nebyly uloženy. Přejete si změny uložit, nebo zahodit?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 msgid "_Revert" msgstr "_Obrátit" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Soubor existuje" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "Nahradit %(file-name)s?" #: ../quodlibet/qltk/msg.py:94 msgid "_Replace File" msgstr "_Nahradit soubor" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Aktivní úlohy" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d úlohy běží" #: ../quodlibet/qltk/playorder.py:254 msgid "Toggle shuffle mode" msgstr "Prohodit mód promíchání" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Prohodit mód promíchání" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Chyby zásuvného modulu" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Povoleno" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Zakázáno" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Žádná kategorie" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Pořadí:" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Úprava tagů" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "_Velikost přebalu:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Nebyly nalezeny žádné zásuvné moduly." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Zásuvné moduly" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Ukázat _Chyby" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disk" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Skladba" #: ../quodlibet/qltk/prefs.py:47 msgid "Grou_ping" msgstr "_Sloučit" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Název souboru" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Délka" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Rovnou automaticky přehrávat skladbu" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Když se přehrávaná skladba změní, najet na ni v přehledu skladeb" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Ostatní:" #: ../quodlibet/qltk/prefs.py:88 msgid "_Edit…" msgstr "_Upravit..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Přidat nebo odstranit hlavičky sloupců" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Viditelné položky" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Název obsahuje _verzi" #: ../quodlibet/qltk/prefs.py:106 msgid "Artist includes all _people" msgstr "Umělec obsahuje všechny tvůrce" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Album obsahuje podnázev _disku" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Název souboru obsahuje_složku" #: ../quodlibet/qltk/prefs.py:123 msgid "Column Preferences" msgstr "Nastavení sloupce" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "Použít coučasné nastavení pro seznam skladeb, nové sloupce na konec" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Seznam skladeb" #: ../quodlibet/qltk/prefs.py:222 msgid "Edit Columns" msgstr "Upravit sloupce" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Globální filtr:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Použít tento dotaz spolu s ostatními" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 msgctxt "heading" msgid "Search" msgstr "Vyhledávání" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Prohlížeče" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Potvrdit _hromadné hodnocení" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "Zeptat se na souhlas před změnou hodnocení u více skladeb najednou" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Povolit hodnocení _jedním klikem" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "Povolit hodnocení kliknutím na kolonku hodnocení v seznamu skladeb" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Hodnocení" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Upřednostnit _vložené grafiky alb" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Upřednostit náhledy přebalů vložené přímo do souborů (pokud lze) před " "ostatními zdroji" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "_Fixní název souboru obrázku:" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "Použít jméno obrázku, pokud je vybrán" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "Použít soubor grafiky alba vynuceně" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Přebaly alb" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Přehrávání" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Nastavení výstupu" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Jestliže není informace o úpravě hlasitosti pro tuto skladbu dostupná, " "upravit hlasitost na tuto hodnotu" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "_Vyrovnání hlasitosti (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Upravit hlasitost podle této hodnoty pro všechny skladby, pokud nedojde ke " "snížení kvality." #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "_Předzesílení (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "_Povolit úpravu hlasitosti" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Úprava hlasitosti" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "_Výchozí hodnocení:" #: ../quodlibet/qltk/prefs.py:493 msgid "Rating _scale:" msgstr "Stupnice h_odnocení:" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Faktor Bayesovského průměru (C) pro sčítaná hodnocení.\n" "0 znamená běžný průměr, vyšší hodnoty pak znamenají, že album s méně " "skladbami bude mít menší, hladší odchylky v hodnocení.\n" "Změna této hodnoty spustí přepočítávání pro všechna alba!" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "Hodnota _Bayesovského průměru:" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Uložit hodnocení a _počet přehrání" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Hodnocení a počet přehrání budou nastaveny pro tuto emailovou adresu" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Automaticky ukládat změny tagů" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "Uložit změny tagů bez potvrzení v případě úpravy více tagů najednou" #: ../quodlibet/qltk/prefs.py:587 #, fuzzy msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Seznam oddělovačů pro rozdělování hodnot tagů. Položky jsou odděleny mezerou." #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Tagy" #: ../quodlibet/qltk/prefs.py:631 msgid "Updating for new ratings" msgstr "Aktualizace nových hodnocení" #: ../quodlibet/qltk/prefs.py:641 msgid "Scan library _on start" msgstr "Načíst sbírku vždy při _startu" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 msgid "_Scan Library" msgstr "_Načíst sbírku" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Zkontrolovat změny ve sbírce" #: ../quodlibet/qltk/prefs.py:658 msgid "Re_build Library" msgstr "_Znovu načíst sbírku" #: ../quodlibet/qltk/prefs.py:661 msgid "Reload all songs in your library. This can take a long time." msgstr "Znovu načíst všechny skladby ve sbírce (může to trvat pár minut)." #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "Pohledávat složky" #: ../quodlibet/qltk/prefs.py:677 msgid "Hidden Songs" msgstr "Skryté skladby" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s a %(count)d více" msgstr[1] "%(title)s a %(count)d více" msgstr[2] "%(title)s a %(count)d více" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Vlastnosti" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Fronta" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Vyčistit" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d skladba (%(time)s)" msgstr[1] "%(count)d skladby (%(time)s)" msgstr[2] "%(count)d skladeb (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Procházet sbírku" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Přepnout viditelnost hlavního okna" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "Chyba přehrávání" #: ../quodlibet/qltk/quodlibetwindow.py:524 msgid "Set up library directories?" msgstr "Nastavit složky sbírky?" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" "Zatím nemáte nastavenu žádnou hudební sbírku. Přejete si ji nastavit teď?" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "_Ne teď" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "_Nastavení" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Nelze přidat skladby" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s používá nepodporovaný protokol." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Skočit na přehrávanou skladbu" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Soubor" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Skladby" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Zobrazení" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Prohlížeče" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Ovládání" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Pomoc" #: ../quodlibet/qltk/quodlibetwindow.py:997 msgid "_Add a Folder…" msgstr "_Přidat složku..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 msgid "_Add a File…" msgstr "_Přidat soubor..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 msgid "_Add a Location…" msgstr "_Přidat umístění…" #: ../quodlibet/qltk/quodlibetwindow.py:1036 msgid "Edit Bookmarks…" msgstr "Upravit záložky..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 msgid "Stop After This Song" msgstr "Po této skladbě zastavit přehrávání" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "_Klávesové zkratky" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Online pomoc" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Hledat pomoc" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Přidat umístění" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Zadejte umístění zvukového souboru:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Umístění nelze přidat" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, python-format msgid "%s is not a valid location." msgstr "%s není platné umístění." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Přidat hudbu" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Přidat složku..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Přehrávač hudby" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Přidat soubor..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Jste si jistí, že chcete změnit hodnocení u všech %d skladeb?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "Uložená hodnocení budou odstraněna" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Hodnocení u všech vybraných skladeb bude změněno na ‚%s‘" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 msgid "_Remove Rating" msgstr "_Odstranit hodnocení" #: ../quodlibet/qltk/ratingsmenu.py:98 msgid "Change _Rating" msgstr "Změnit _hodnocení" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Nahradit mezery _podtržítky" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Nahradit znaky nekompatibilní s _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Nahradit _diakritiku" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Nahradit ne-_ASCII znaky" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Použít jen _malá písmena" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Přejmenovat soubory" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Vzory cesty" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 msgid "Edit saved patterns…" msgstr "Upravit uložené vzory..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Náhled" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nový název" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Soubor nelze přejmenovat" #: ../quodlibet/qltk/renamefiles.py:256 #, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Přejmenovávání <b>%(old-name)s</b> na <b>%(new-name)s</b> selhalo. Cílový " "soubor už možná existuje, nebo nemáte právo soubory vytvářet ani měnit." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Ignorovat _všechny chyby" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Pokračovat" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Uvedená cesta není absolutní" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Vzor\n" "\t%s\n" "obsahuje / , ale nezačíná od kořene (root). Pro vyhnutí se nepojmenovaným " "složkám upravte vzor root tak, aby začínal / nebo ~/." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Skladby v uvedených složkách budou přidány do sbírky při obnově (refresh)" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Vybrané složky" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Uložené hodnoty" #: ../quodlibet/qltk/searchbar.py:53 msgid "Edit saved searches…" msgstr "Upravit uložená vyhledávání…" #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "Prohledávání sbírky s použitím čistého textu nebo QL dotazů" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Hledat po _psaní" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Ukázat výsledky hledání až když uživatel přestane psát." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limit:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Váha" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Zobrazit zbývající čas" #: ../quodlibet/qltk/shortcuts.py:16 msgid "Main Window" msgstr "Hlavní okno" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "Procházet zpět po 10 vteřinách" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "Procházet vpřed po 10 vteřinách" #: ../quodlibet/qltk/shortcuts.py:19 msgid "Focus the search entry" msgstr "Zaměřit na vyhledávané" #: ../quodlibet/qltk/shortcuts.py:22 msgid "Reset filters and jump to the playing song" msgstr "Resetovat filtry a přejít na přehrávanou skladbu" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "Otevřít informační okno k vybraným skladbám." #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "Otevřít editor tagů pro vybrané skladby" #: ../quodlibet/qltk/shortcuts.py:28 msgid "Queue the selected songs" msgstr "Zařadit vybrané skladby do fronty" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Zařadit vybrané skladby do fronty" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "Zobrazit hodnotu řádkového hledání" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "Levý klik na hlavičku sloupce" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "Přidat sloupec do seznamu sloupců k setřídění" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "Struktura složek" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "Sbalí prvek nebo vybere prvek rodičovský" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "Rozbalí element" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "Texty" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "Znovu provést změnu" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "Vybrat všechny skladby ve všech panelech." #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filtr na %s" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "Všechny _Hlavičky" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Hlavičky _Skladeb" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Hlavičky _Alb" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Hlavičky _Lidí" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Hlavičky _Dat" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Hlavičky _Souborů" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Hlavičky _Produkce" #: ../quodlibet/qltk/songlist.py:1115 msgid "_Customize Headers…" msgstr "_Upravit hlavičky..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "_Rozšířit sloupec" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "Spustit zásuvný modul \"%(name)s\" pro %(count)d skladbu?" msgstr[1] "Spustit zásuvný modul \"%(name)s\" pro %(count)d skladby?" msgstr[2] "Spustit zásuvný modul \"%(name)s\" pro %(count)d skladeb?" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "Spustit modul \"%(name)s\" pro %(count)d album?" msgstr[1] "Spustit modul \"%(name)s\" pro %(count)d alba?" msgstr[2] "Spustit modul \"%(name)s\" pro %(count)d alb?" #: ../quodlibet/qltk/songsmenu.py:149 msgid "Configure Plugins…" msgstr "Nastavit zásuvné moduly…" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Přidat do _Fronty" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Kopírovat do zařízení" #: ../quodlibet/qltk/songsmenu.py:378 msgid "_Remove from Library" msgstr "_Odstranit ze sbírky" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Nahradit _podtržítka mezerami" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Tagy Kapitálkami" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Rozdělit do více _hodnot" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tagy z cesty" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Nahradit existující tagy" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Tagy jsou přidány k již existujícím" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "Uložit" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Vzor\n" "\t%s\n" "je neplatný. Možná obsahuje duplicitní tag nebo nemá uzavřené závorky " "(< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Neplatné tagy" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Neplatné tagy %s\n" "\n" "Vybrané položky nepodporují vkládání těchto tagů." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Zadaný vzor je neplatný. Ujistětě se, že vkládáte < a > jako \\< a " "\\> a že jsou vaše tagy v pořádku.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Upravit zobrazení" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Čísla skladeb" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Začít _od:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Celkem skladeb:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Přehrávat/Pauza" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Předchozí" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "a %d více..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Ukládání změněných skladeb." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d skladeb uloženo\n" "(%(remaining)s zbývá)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "%(current)d z %(all)d" #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Kontrola přípojných bodů" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "Spojení" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "Seznam skladeb musí mít jméno" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Seznam skladeb s názvem %s již existuje." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Znovu _načíst přebal" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "Používají se přebaly alb vložené přímo do souborů." #: ../quodlibet/util/cover/built_in.py:49 msgid "Filesystem cover" msgstr "Přebal ze systému souborů" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" "Použití tradičně pojmenovaných souborů obrázků nalezených v adresářích " "uvnitř adresářů alb." #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Zobrazit stručné info o využití" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Zobrazit verzi a copyright" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Využití: %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[možnosti]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Volba %r nerozpoznána." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Volba %r vyžaduje parametry." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r není jedinečný prefix." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d vteřina" msgstr[1] "%d vteřiny" msgstr[2] "%d vteřin" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Informace o čase nejsou dostupné" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d vteřina" msgstr[1] "%d vteřiny" msgstr[2] "%d vteřin" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuta" msgstr[1] "%d minuty" msgstr[2] "%d minut" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hodina" msgstr[1] "%d hodiny" msgstr[2] "%d hodin" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d den" msgstr[1] "%d dny" msgstr[2] "%d dnů" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d rok" msgstr[1] "%d roky" msgstr[2] "%d let" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 msgctxt "check" msgid "titlecase?" msgstr "Všude první velké?" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Datum musí být vloženo ve formátu 'YYYY', 'YYYY-MM-DD' nebo 'YYYY-MM-DD HH:" "MM:SS'." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Úprava hlasitosti musí být zadána ve formátu 'x.yy dB'." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Nejvyšší hodnoty úpravy hlasitosti musí být zadány ve formátu 'x.yy'." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "ID MusicBrainzu musí být ve formátu UUID." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "Status MusicBrainz musí být 'official', 'promotional', nebo 'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Jazyk musí být ISO 639-2 trojpísmenný kód" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Skladbu nelze upravit" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Ukládání %s selhalo. Soubor může být jen pro čtení, poškozený, nebo nemáte " "právo ho měnit." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Neplatné kódování]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "aranžmá" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "aranžmá" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "uspořádání" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "autoři" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "skladatel" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "skladatelé" #: ../quodlibet/util/tags.py:78 msgid "composition" msgstr "skladatel" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "dirigenti" #: ../quodlibet/util/tags.py:80 msgid "conducting" msgstr "dirigent" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "rok" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "popis" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "žánr" #: ../quodlibet/util/tags.py:85 msgid "genres" msgstr "žánry" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "interpret" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "slučování" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "jazyk" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licence" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "místo" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "texty" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "textaři" #: ../quodlibet/util/tags.py:91 msgid "lyrics" msgstr "texty" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organizace" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "název" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "verze" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "webová stránka" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "umělec alba" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "podnázev disku" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disk" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "skladba" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "ID labelu" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "datum původního vydání" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "původní album" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "původní umělec" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "datum nahrávání" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "země vydání" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz recording ID" msgstr "ID skladby na MusicBrainz" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz release track ID" msgstr "ID vydání na MusicBrainz" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "ID vydání na MusicBrainz" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz artist ID" msgstr "ID umělce na MusicBrainz" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz release artist ID" msgstr "ID umělce vydání na MusicBrainz" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "ID TRM na MusicBrainz" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "PUID MusicIP" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "Status alba na MusicBrainz" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Typ alba na MusicBrainz" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "ID vydání na MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "úprava hlasitosti skladby" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "nejvyšší hodnota u skladby" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "úprava hlasitosti alba" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "nejvyšší hodnota u alba" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "určující hlasitost" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "disky" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "skladby" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "poslední start" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "celé jméno" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "přípojný bod" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "lidé" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "rok" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "rok původního vydání" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "záložka" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "formát souboru" #: ../quodlibet/util/tags.py:165 msgid "playlists" msgstr "Seznamy skladeb" #: ../quodlibet/util/tags.py:166 #, fuzzy msgid "channel count" msgstr "Účet" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "řadit" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "role" #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "Nelze importovat %s. Prohlížeč zdrojů zakázán." #~ msgid "Audio Backend Failed to Load" #~ msgstr "Načtení obslužné aplikace na pozadí selhalo" #~ msgid "" #~ "Loading the audio backend '%(name)s' failed. Audio playback will be " #~ "disabled." #~ msgstr "" #~ "Načítání obslužných aplikací '%(name)s' na pozadí selhalo. Přehrávání " #~ "audia nebude fungovat." #~ msgid "_Open" #~ msgstr "_Otevřít" #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "V aplikaci Quod Libet došlo k výjimce. Zpráva o ní byla uložena do<b >" #~ "%(dump-path)s</b>, může pomoci závadu odstranit. Prosíme, ohlašte ji na " #~ "%(new-issue-url)s a uvedenou zprávu přiložte, nebo vložte přímo její " #~ "obsah. Soubor se zprávou může obsahovat informace o vás nebo vašem " #~ "systému, jako například seznam naposled hraných skladeb. Pokud je to pro " #~ "vás nepřijatelné, pošlete místo toho <b>%(mini-dump-path)s</b> s popisem, " #~ "co jste právě dělali." #~ msgid "" #~ "Quod Libet may now be unstable. Closing it and restarting is recommended. " #~ "Your library will be saved." #~ msgstr "" #~ "Quod Libet může být nyní nestabilní. Doporučujeme jej restartovat. Vaše " #~ "sbírka bude uložena." #~ msgid "Remove all songs from the queue" #~ msgstr "Odstranit všechny skladby z fronty" #~ msgid "Watch this folder for new songs" #~ msgstr "Hledat ve složce nové skladby" #~ msgid "Disable Browser" #~ msgstr "Zakázat prohlížeč" #~ msgid "_Disable Browser" #~ msgstr "_Zakázat prohlížeč" #~ msgid "Set or toggle the playback order" #~ msgstr "Nastavit nebo přepnout pořadí přehrávání" #~ msgid "Uninitialized iPod" #~ msgstr "Nenačtený iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Chcete vytvořit pro tento iPod prázdnou databázi?" #~ msgid "_Create Database" #~ msgstr "_Vytvořit databázi" #~ msgid "_Volume Gain (dB):" #~ msgstr "Úprava _Hlasitosti (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "_Kombinovat tagy s více hodnotami" #~ msgid "Model:" #~ msgstr "Model:" #~ msgid "Capacity:" #~ msgstr "Kapacita:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Odstraňování nezařazené skladby z iPodu" #~ msgid "Saving iPod database…" #~ msgstr "Ukládání iPod databáze…" #~ msgid "Unable to save iPod database" #~ msgstr "Nelze uložit iPod dazabázi" #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "Nelze najít libgpod, podpora iPodu zakázána." #~ msgid "Controls the tone of your music with an equalizer." #~ msgstr "Kontroluje zabarvení hudby ekvalizérem." #~ msgid "Use header bars" #~ msgstr "Použít hlavičky" #~ msgid "tooltip" #~ msgstr "tooltip" #~ msgid "Event Logging" #~ msgstr "Záznam o události" #~ msgid "Sends song events to the Zeitgeist event logging service." #~ msgstr "Zasílání události skladeb do logovací služby Zeitgeist." #~ msgid "Playback follows your selection." #~ msgstr "Přehrávání následuje výběr." #~ msgid "Track Repeat" #~ msgstr "Opakovat skladbu" #~ msgid "Force Write" #~ msgstr "Vynutit zápis" #~ msgid "Filter on _Genre" #~ msgstr "Filtrovat podle _Žánru" #~ msgid "Filter on _Artist" #~ msgstr "Filtrovat podle _Umělce" #~ msgid "Filter on Al_bum" #~ msgstr "Filtrovat podle alba" #~ msgid "Unable to download lyrics." #~ msgstr "Nelze stáhnout texty skladby." #~ msgid "Shuffle" #~ msgstr "Zamíchat" #~ msgid "Weighted" #~ msgstr "Vyváženo" #~ msgid "_Weighted" #~ msgstr "_Vyváženo" #~ msgid "_One Song" #~ msgstr "_Jedna skladba" #~ msgid "Restart the playlist when finished" #~ msgstr "Začít znovu přehrávat po přehrání seznamu skladeb" #~ msgid "_Music" #~ msgstr "_Hudba" #~ msgid "Add Bookmark" #~ msgstr "Přidat záložku" #~ msgid "Song _List" #~ msgstr "Se_znam skladeb" #~ msgid "Rate the selected songs with 0-4 stars" #~ msgstr "Hodnotit vybrané skladby 0–4 hvězdičkami" #~ msgid "Embed cover" #~ msgstr "Přiložit přebal" #~ msgid "D:" #~ msgstr "D:" #~ msgid "W:" #~ msgstr "W:" #~ msgid "E:" #~ msgstr "E:" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Po této skladbě zastavit přehrávání" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "a %d více..." #~ msgstr[1] "a %d více..." #~ msgstr[2] "a %d více..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Oddělit disk od _Alba" #, fuzzy #~ msgid "Timeout" #~ msgstr "Čas" #, fuzzy #~ msgid "Select an album" #~ msgstr "Vybrat _vše" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s a %(count)d více" #~ msgstr[1] "%(title)s a %(count)d více" #~ msgstr[2] "%(title)s a %(count)d více" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Seznamy skladeb" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "_Použít v náhledech zaoblené rohy" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "Zakulacení rohů u náhledů přebalů. Může to vyžadovat restart přehrávače." #~ msgid "Re_fresh Library" #~ msgstr "Obnovit sbírku" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "Odstranění duplicit" #~ msgid "Unable to open input files" #~ msgstr "Nelze otevřít vstupní data" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "GStreamer nemá parametr pro čtení souborů. Zkontrolujte nastavení " #~ "instalace." #~ msgid "Invalid audio backend" #~ msgstr "Neplatná oblužná aplikace" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "Obslužná aplikace %r není nainstalována." #~ msgid "command|filename" #~ msgstr "příkaz | název souboru" #~ msgid "command|tag" #~ msgstr "příkaz | tag" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: %s nelze nalézt." #, fuzzy #~ msgid "heading|Search" #~ msgstr "heading|Vyhledávání" #~ msgid "%d of %d" #~ msgstr "%d z %d" #~ msgid "Usage: %s %s\n" #~ msgstr "Využití: %s %s\n" #~ msgid "_Download..." #~ msgstr "_Stahování ..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Nová stanice" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Přepsat <b>%s</b>?" #~ msgid "Output Error" #~ msgstr "Chyba výstupu" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "Výstupní roura GStreameru nemohla být načtena. Roura je možná neplatná, " #~ "nebo může být zařízení používáno. Zkontrolujte nastavení přehrávače." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet už běží." #~ msgid "No song is currently playing." #~ msgstr "Nyní se nic nepřehrává." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Nelze zapisovat do %s. Odstraňuji." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Upravit záložky..." #~ msgid "_New Folder..." #~ msgstr "_Nová složka..." #~ msgid "_Add to Playlist" #~ msgstr "_Přidat do seznamu skladeb" #~ msgid "_Edit Display..." #~ msgstr "_Upravit zobrazení..." #~ msgid "Output Log" #~ msgstr "Log výstupu" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d stanice" #~ msgid "_Add a Location..." #~ msgstr "_Přidat umístění..." #~ msgid "_Output Log" #~ msgstr "_Log z výstupu" #~ msgid "Invalid command %r received." #~ msgstr "Zadán neplatný příkaz %r." #~ msgid "Unknown browser %r." #~ msgstr "Neznámý prohlížeč %r." #~ msgid "Custom _Sort..." #~ msgstr "Vlastní _Třídění..." #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "Jste si jistí, že chcete změnit hodnocení u všech %d skladeb?" #~ msgstr[1] "Jste si jistí, že chcete změnit hodnocení u všech %d skladeb?" #~ msgstr[2] "Jste si jistí, že chcete změnit hodnocení u všech %d skladeb?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "Jste si jistí, že chcete odstranit %d duplikátní skladbu?" #~ msgstr[1] "Jste si jistí, že chcete odstranit %d duplikátní skladby?" #~ msgstr[2] "Jste si jistí, že chcete odstranit %d duplikátních skladeb?" #~ msgid "Track Headers" #~ msgstr "Hlavičky skladeb" #~ msgid "People Headers" #~ msgstr "Hlavičky lidí" #~ msgid "Album Headers" #~ msgstr "Seznam alb" #~ msgid "Date Headers" #~ msgstr "Hlavičky dat" #~ msgid "File Headers" #~ msgstr "Složky" #~ msgid "Production Headers" #~ msgstr "Hlavičky produkce" #~ msgid "Tag:" #~ msgstr "_Tag:" #~ msgid "Descending" #~ msgstr "Klesání" #~ msgid "Too Many Errors" #~ msgstr "Příliš mnoho chyb." #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Zastavuji přehrávání, protože se vyskytlo %d chyb za sebou." #~ msgid "Warnings" #~ msgstr "Varování" #~ msgid "General" #~ msgstr "Obecné" #~ msgid "No log available." #~ msgstr "Není dostupný žádný výstup." #~ msgid "album artist (sort)" #~ msgstr "umělec alba (setříděno)" #~ msgid "artist (sort)" #~ msgstr "umělec (setříděno)" #~ msgid "album (sort)" #~ msgstr "album (setříděno)" #~ msgid "performer (sort)" #~ msgstr "performer (setříděno)" #~ msgid "performers (sort)" #~ msgstr "performeři (setříděno)" #~ msgid "MusicBrainz album artist ID" #~ msgstr "ID umělce alba na MusicBrainz" #~ msgid "errors" #~ msgstr "chyby" #~ msgid "Failed reading album art \"%s\"" #~ msgstr "Načítání přebalu alba \"%s\" selhalo" #~ msgid "Permanently delete this file?" #~ msgstr "Skutečně navždy odstranit soubor?" #~ msgid "Permanently delete these files?" #~ msgstr "Skutečně chce navždy smazat tyto soubory?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s a %(count)d více..." #~ msgstr[1] "%(title)s a %(count)d více..." #~ msgstr[2] "%(title)s a %(count)d více..." #~ msgid "Version:" #~ msgstr "Verze:" #~ msgid "_Cause an Error" #~ msgstr "_Způsobuje chybu" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s by neměly být přídány do sbírky.\n" #~ "\n" #~ msgid "Error running command %r, caused by: %r." #~ msgstr "Při provádění příkazu %r se vyskytla chyba způsobená %r." #~ msgid "" #~ "Cannot save library contents to %s (it's a directory). Please remove it " #~ "and try again." #~ msgstr "" #~ "Nelze uložit obsah sbírky do %s (je to adresář). Prosím, odstraňte jej a " #~ "zkuste to znovu." #~ msgid "Library Error" #~ msgstr "Prohlížeč sbírky" #~ msgid "_Output device:" #~ msgstr "_Výstupní zařízení:" #~ msgid "translator-credits" #~ msgstr "Honza Hejzl (honza.hejzl@gmail.com)[připomínky velmi vítány!]" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Zobrazení dalších sloupců (oddělených mezerami)" #~ msgid "_Edit and Continue" #~ msgstr "_Upravit a pokračovat" #~ msgid "Search your library" #~ msgstr "Hledat ve sbírce" #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "Toto je volně šiřitelný software; ve zdroji jsou k nahlédnutí podmínky " #~ "kopírování. Použití na vlastní zodpovědnost.\n" #~ msgid "No eject command found." #~ msgstr "Příkaz k vysunutí nenalezen." #~ msgid "Unable to start web browser" #~ msgstr "Nelze spustit prohlížeč webu" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Prohlížeč webu nelze najít. Nastavte prosím svou $BROWSER proměnnou, nebo " #~ "se ujistěte, že existuje /usr/bin/nějaký prohlížeč." #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Celková velikost neznámá" #, fuzzy #~ msgid "Not Played To_day" #~ msgstr "Dnes nehrané" #, fuzzy #~ msgid "Not Played in a _Week" #~ msgstr "Nehrané v posledním týdnu" #, fuzzy #~ msgid "Not Played in a _Month" #~ msgstr "Nehrané za poslední měsíc" #, fuzzy #~ msgid "Date" #~ msgstr "Datum" #, fuzzy #~ msgid "Choose New Stations" #~ msgstr "Vybrat nové stanice" #, fuzzy #~ msgid "Add" #~ msgstr "Přidat" #, fuzzy #~ msgid "Bitrate" #~ msgstr "Bitrate" #, fuzzy #~ msgid "_Stations..." #~ msgstr "_Stanice..." �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/zh_CN.po�������������������������������������������������������������������������0000644�0001750�0001750�00000503016�13115512746�015733� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Simplified Chinese (zh_CN) translation of Quod Libet. # Copyright (C) 2006 THE quodlibet'S COPYRIGHT HOLDER # This file is distributed under the same license as the Quod Libet package. # Emfox Zhou <EmfoxZhou@gmail.com>, 2006. # msgid "" msgstr "" "Project-Id-Version: Quod Libet 0.21\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:33+0100\n" "Last-Translator: Emfox Zhou <EmfoxZhou@gmail.com>\n" "Language-Team: Emfox Zhou <EmfoxZhou@gmail.com>\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=n<0;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "编辑您的音频文件里的标签" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "音频标签编辑器" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "听、浏览或者编辑您的音频收藏" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "音乐播放器" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "标题" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "歌手(_A)" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "日期(_D)" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "流派" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "评分(_R)" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "按日期排序" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "专辑列表" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "专辑列表(_A)" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "所有专辑" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "显示专辑封面(_C)" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "不在专辑里的曲目" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d 音轨" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d 唱片" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "所有专辑" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "专辑列表首选项" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "显示专辑封面(_C)" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[选项]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "专辑显示" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "未知" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "新的源" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "输入音频源的位置:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 #, fuzzy msgid "Audio Feeds" msgstr "音频设备:%s" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "下载(_D)" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "下载文件" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "下载文件" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "无法加入源" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "刷新库(_F)" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "删除文件" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "库浏览器" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "非法参数" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "未知" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "自定义(_C)" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "删除站点(_R)" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "标签" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "专辑列表首选项" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "总大小:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "总大小:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "显示专辑封面(_C)" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "所有专辑" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "没有新的站点" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "文件系统" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "文件系统(_F)" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "无法复制曲目" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "被选定的文件无法被复制到其它曲目列表或队列。" #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "加入到库(_A)" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "不支持的文件类型" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "站点列表只能包含站点的位置,不能包括其它的站点列表或播放列表。以下位置无法导" "入:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "无法加入站点" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "网上广播" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "下载文件" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "新站点" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "输入网上广播站点的位置:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "评分" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "新站点(_N)" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "网上广播(_I)" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "新站点" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "新站点(_N)" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "新站点" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "没有发现站点" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "没有发现网上广播站点 %s" #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "所有列出的站点都已经在您的库里。" #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "加入到播放列表(_A)" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "从播放列表里删除(_R)" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "" #: ../quodlibet/browsers/media.py:36 #, fuzzy msgid "Device Properties" msgstr "属性" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "挂载点" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "名字(_N):" #: ../quodlibet/browsers/media.py:135 #, fuzzy msgid "Media Devices" msgstr "音频设备:%s" #: ../quodlibet/browsers/media.py:136 #, fuzzy msgid "_Media Devices" msgstr "音频设备:%s" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 #, fuzzy msgid "_Eject" msgstr "选择(_S)" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "属性" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "重命名(_R)" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> 不是合法的位置。" #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "删除 <b>%s</b> 失败。" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 #, fuzzy msgid "Unable to copy song" msgstr "无法复制曲目" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "" #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> 不是合法的位置。" #: ../quodlibet/browsers/media.py:545 #, fuzzy msgid "Unable to delete songs" msgstr "无法添加曲目信息" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "删除 <b>%s</b> 失败。" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> 不是合法的位置。" #: ../quodlibet/browsers/media.py:579 #, fuzzy msgid "Unable to delete song" msgstr "无法编辑曲目" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "删除 <b>%s</b> 失败。" #: ../quodlibet/browsers/media.py:597 #, fuzzy msgid "Unable to eject device" msgstr "无法删除文件" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 #, fuzzy msgid "Paned Browser" msgstr "关掉浏览器" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "全选(_A)" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "所有" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "播放列表" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "播放列表(_P)" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "从播放列表里删除(_R)" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "导入(_I)" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "新播放列表" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "无法导入播放列表" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet 只能导入 M3U 或者 PLS 格式的播放列表" #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "无法重命名播放列表" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "导入播放列表" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "新播放列表(_N)" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "新播放列表" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "播放列表" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "输入新文件夹的名字:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "正在导入播放列表。\n" "\n" "已经添加 %d/%d 首曲目。" #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "限制结果(_L)" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "搜索库" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "搜索库(_S)" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "关掉浏览器" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "搜索" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "位置" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet 没有在运行。" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "音乐库和播放器" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[选项]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "显示正在播放的曲目并退出" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "立即开始播放" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "跳到下一首曲目" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "跳到前一首曲目" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "开放回放" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "暂停回放" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "切换播放/暂停模式" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "开放回放" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "加大音量" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "减小音量" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "显示播放器状态" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "隐藏主窗口" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "显示主窗口" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "切换主窗口可见性" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "焦点移到运行中的播放器" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "刷新库(_F)" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "关掉浏览器" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "显示当前播放列表" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "显示队列内容" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "显示队列内容" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet 没有在运行。" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "退出 Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "在正在播放的曲目中定位" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "切换播放/暂停模式" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "开、关或切换重复播放" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "设定音量" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "搜索您的音频库" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "查询" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "播放文件" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "文件名" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "评估正在播放的曲目" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "设定当前浏览器" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "评估正在播放的曲目" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "打开新的浏览器" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "显示或隐藏队列" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "显示或隐藏主曲目列表" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "以随机值过滤" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "标签" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "以标签值过滤" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "文件名" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "错误:%s 的非法参数。" #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "错误:试试 %s --help。" #: ../quodlibet/devices/_base.py:65 #, fuzzy msgid "Unknown Device" msgstr "未知" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "" #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "非法的值" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "文件名(_F)" #: ../quodlibet/devices/storage.py:61 #, fuzzy msgid "Copy _album covers" msgstr "显示专辑封面(_C)" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "显示错误(_E)" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "描述" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "音频标签编辑器" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "目录" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[非法编码]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "标题" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "音频标签编辑器" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "标题大小写标签(_T)" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "总大小:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "编辑显示" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "权重(_W)" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "编辑显示" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "预览(_P)" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d 秒" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "自定义(_C)" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "插件错误" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "音乐播放器" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "网上广播" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "评分(_R)" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "无法保存曲目" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "没有找到插件。" #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "歌词" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "清空搜索" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "歌词" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "位置" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "隐藏主窗口" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "参数" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "参数" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 msgid "No-song Text" msgstr "" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "信息" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "参数" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "位置" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "标题" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 #, fuzzy msgid "Show notifications" msgstr "没有新的站点" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 #, fuzzy msgid "Song Notifications" msgstr "没有新的站点" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "名字(_N):" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "其它(_O):" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "歌手(_A)" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "文件名(_F)" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "随机专辑(_B)" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "专辑" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "权重(_W)" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "随机专辑(_B)" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "导入播放列表" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "导入(_I)" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "歌词" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 msgid "Playing:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 msgid "No song:" msgstr "" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "参数" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:53 #, fuzzy msgid "Tray Icon" msgstr "系统托盘图标首选项" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "播放列表(_P)" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "播放器" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "预览(_P)" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "重复(_R)" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "这首曲目放完后就停止" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "打开新的浏览器" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "编辑标签(_T)" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "信息(_I)" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "播放列表" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "编辑显示" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "歌词" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "歌词" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "显示错误(_E)" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "文件" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "预览(_P)" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "以歌手过滤(_A)" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "自定义(_C)" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "以流派过滤(_G)" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "以歌手过滤(_A)" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "音频设备:%s" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "输入音频源的位置:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "导入播放列表" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "导入(_I)" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "没有发现站点" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "文件名(_F)" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "文件名(_F)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "从播放列表里删除(_R)" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "新播放列表" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "最近一次播放" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "队列(_Q)" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "从来没有" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "没有曲目" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "已保存值" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "重命名(_R)" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "库" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "隐藏主窗口" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "文件名" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "无法保存曲目" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "专辑列表" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "大小" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "搜索(_S):" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "搜索" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "专辑列表" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "编辑书签(_E)..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "编辑书签(_E)..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "书签" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz 专辑 ID" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "文件名" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "唱片(_D)" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "音轨" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "标题" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "歌手(_A)" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz 专辑 ID" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "查询" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "搜索" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "没有找到插件。" #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "浏览器" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "无法创建文件夹" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "重命名(_R)" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "文件名" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "非法参数" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "非法的值" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "自定义(_C)" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "无法复制曲目" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "关掉浏览器" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "编辑显示" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "删除站点(_R)" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "以标签值过滤" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer 无法导入选定的曲目。" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "以流派过滤(_G)" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "队列(_Q)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "写入" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "目录" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "专辑列表(_A)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "新站点(_N)" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "导入播放列表" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "重命名(_R)" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "导入播放列表" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "信息" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "导入播放列表" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "无法导入播放列表" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "删除 <b>%s</b> 失败。" #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "刷新库(_F)" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "刷新库(_F)" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "编辑标签" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "编辑标签" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "所有专辑" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "预览(_P)" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "标签" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "无法添加曲目信息" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "搜索" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "参数" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "编辑已保存的值..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "给搜索条件着色(_S)" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "库" #: ../quodlibet/library/libraries.py:650 #, fuzzy msgid "Checking mount points" msgstr "挂载点" #: ../quodlibet/library/libraries.py:660 #, fuzzy msgid "Scanning library" msgstr "已导入曲目库。" #: ../quodlibet/library/libraries.py:725 #, fuzzy, python-format msgid "Scanning %s" msgstr "正在检查 %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "描述" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "值" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "音频标签编辑器" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "没有选中曲目。" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "删除站点(_R)" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "删除站点(_R)" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "以标签值过滤" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "以标签值过滤" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "没有时间信息" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "无法重命名文件" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "删除站点(_R)" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "文件" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "没有时间信息" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> 不是合法的位置。" #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "未知" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "顺序" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "顺序(_I)" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "随机(_R)" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "随机(_R)" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "重复(_R)" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "单曲" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d 秒" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "没有发现站点" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "无法创建文件夹" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "插件(_P)" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "支持的格式: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "音频设备:%s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "开头" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "无" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "时间" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "书签名" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "书签" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "过滤器(_F)" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "从来没有播放过(_N)" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "前40(_T)" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "新站点" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "随机流派(_G)" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "随机歌手(_A)" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "随机专辑(_B)" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "40首您播放得最多的歌(如果有绑定的话,可能会多于40首)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "值(_V):" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "已保存值" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "编辑已保存的值..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "音轨号" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "专辑列表(_A)" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "无音量调整" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "未知" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "以标签值过滤" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "文件" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "删除文件" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "移到回收站(_M)" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "正在移动 %d/%d" #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "无法保存库" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "删除 <b>%s</b> 失败。" #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "正在删除 %d/%d" #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "无法删除文件" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "删除 <b>%s</b> 失败。" #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "下载" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "大小" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "增加一个标签" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "标签(_T):" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "编辑标签" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "从来没有" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "无法增加标签" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "无法添加曲目" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "非法标签<b>%s</b>\n" "当前被选定的文件不支持编辑这个标签。" #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "非法标签" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "非法标签<b>%s</b>\n" "当前被选定的文件不支持编辑这个标签。" #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "非法的值" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "标签可能不准确" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "无法保存曲目" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "保存<b>%s</b>失败。该文件可能是只读的,损坏了,或者您并没有权限编辑它。" #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "更多选项(_M)..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "插件(_P)" #: ../quodlibet/qltk/exfalsowindow.py:267 #, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "标签编辑" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "文件夹" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "新文件夹" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "全选(_A)" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "新文件夹" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "输入新文件夹的名字:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "无法创建文件夹" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "无法删除文件夹" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "曲目" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "唱片 %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "音轨 %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "编辑显示" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "没有选中曲目。" #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "没有曲目" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "信息" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "歌词" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "%s 制造" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "歌手" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "歌手" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "演员" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "从来没有" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d 时间" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "加入" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "最近一次播放" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "评分" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "长度" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "信息" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[非法编码]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "比特率" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "文件大小" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "修改" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d 选中" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "音轨不可用" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "音轨列表" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d 首曲目没有专辑信息" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "专辑" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "总长度:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "总大小:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "文件" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "下载(_D)" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "编辑书签(_E)..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "" #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "" #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "从来没有" #: ../quodlibet/qltk/msg.py:86 #, fuzzy msgid "File exists" msgstr "文件系统" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "重命名文件" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "切换播放/暂停模式" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "切换播放/暂停模式" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "插件错误" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "关掉浏览器" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "播放次序(_O)" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "标签编辑" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "总大小:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "没有找到插件。" #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "插件(_P)" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "显示错误(_E)" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "唱片(_D)" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "音轨(_T)" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "组合" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "专辑(_B)" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "文件名(_F)" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "长度(_L)" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "自动跳到正在播放的曲目" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "当正在播放的曲目改变的时候,在曲目列表里相应跳过去" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "其它(_O):" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "编辑书签(_E)..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "可见的栏" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "标题包含版本(_V)" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "标题包含版本(_V)" #: ../quodlibet/qltk/prefs.py:108 #, fuzzy msgid "Album includes _disc subtitle" msgstr "专辑包含部分(_P)" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "文件名包含文件夹(_F)" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Ex Falso 首选项" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "曲目列表" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "可见的栏" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "全局过滤器:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "搜索" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "浏览器" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "当正在播放的曲目改变的时候,在曲目列表里相应跳过去" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "评分(_R)" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "专辑列表" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "暂停回放" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "无音量调整" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "无音量调整" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "评分(_R)" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "编辑标签" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "新站点(_N)" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "刷新库(_F)" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "搜索库(_S)" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "检查您的库的更改" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "重新导入库(_L)" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "重新导入您的库里的所有曲目(可能会花费较长时间)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "扫描目录(_D)" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "没有曲目" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "属性" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "队列(_Q)" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "插件错误" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "浏览库(_B)" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "切换主窗口可见性" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "暂停回放" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "选择目录" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "无法添加曲目信息" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b>使用不支持的协议。" #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "跳到正在播放的曲目(_J)" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "文件" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "曲目" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "查看(_V)" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "浏览器" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "控制(_C)" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "帮助(_H)" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "加入文件夹(_A)..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "加入文件(_A)..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "加入位置" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "编辑书签(_E)..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "这首曲目放完后就停止" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "搜索" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "加入位置" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "输入音频文件的位置:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "无法添加位置" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> 不是合法的位置。" #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "添加音乐" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "加入文件夹(_A)..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "音乐播放器" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "加入文件(_A)..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "删除站点(_R)" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "评分(_R)" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "重命名文件" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "参数" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "编辑已保存的值..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "预览(_P)" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "新的名字" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "无法重命名文件" #: ../quodlibet/qltk/renamefiles.py:256 #, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "显示错误(_E)" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "继续(_C)" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "路径不是绝对的" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "这些文件夹里的曲目(由“:”分隔)将会被加入到您的库里" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "选择目录" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "已保存值" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "编辑已保存的值..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "这首曲目放完后就停止" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "限制(_L):" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "权重(_W)" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "显示剩下的时间" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "歌词" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "焦点移到运行中的播放器" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "在正在播放的曲目中定位" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "无法添加曲目信息" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "无法添加曲目信息" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "以 %s 过滤(_F)" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "专辑列表(_A)" #: ../quodlibet/qltk/songlist.py:1095 #, fuzzy msgid "_Track Headers" msgstr "音轨号" #: ../quodlibet/qltk/songlist.py:1096 #, fuzzy msgid "_Album Headers" msgstr "专辑列表(_A)" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1099 #, fuzzy msgid "_File Headers" msgstr "过滤器(_F)" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "过滤器(_F)" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "给搜索条件着色(_S)" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "加入到队列(_Q)" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "从播放列表里删除(_R)" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "用空格替换下划线(_U)" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "标题大小写标签(_T)" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "非法标签" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "编辑显示" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "音轨号" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "开始于(_M):" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "总音轨数:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "播放器" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "预览(_P)" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "正在保存改变过的曲目。" #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "正在移动 %d/%d" #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "挂载点" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "位置" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "名为 %s 的播放列表已经存在" #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "显示专辑封面(_C)" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "文件系统" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "显示版本和版权" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[选项]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "" #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "" #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "" #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d 秒" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "没有时间信息" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d 秒" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d 分" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d 小时" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d 天" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d 年" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "标题" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "" #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "" #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "无法编辑曲目" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "保存<b>%s</b>失败。该文件可能是只读的,损坏了,或者您并没有权限编辑它。" #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[非法编码]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "专辑" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "作者" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "作者" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "作曲" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "作曲" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "作曲" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "执导" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "执导" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "执导" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "版权" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "日期" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "描述" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "流派" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "流派" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "表演" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "组合" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "语言" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "许可" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "位置" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "作词" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "作词" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "作词" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "组织" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "标题" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "版本" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "网站" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "专辑歌手" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "唱片" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "音轨" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "原始发行日期" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "原始专辑" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "原始歌手" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "录制日期" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz 歌手 ID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz 音轨 ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "" #: ../quodlibet/util/tags.py:127 #, fuzzy msgid "MusicBrainz album status" msgstr "MusicBrainz 专辑歌手 ID" #: ../quodlibet/util/tags.py:128 #, fuzzy msgid "MusicBrainz album type" msgstr "MusicBrainz 专辑 ID" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz 音轨 ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "音轨调整" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "专辑调整" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "唱片" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "音轨" #: ../quodlibet/util/tags.py:145 #, fuzzy msgid "last started" msgstr "最近一次播放" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "全名" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "挂载点" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "年份" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "原始发行日期" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "书签" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "格式" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "播放列表" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "浏览器" #~ msgid "Remove all songs from the queue" #~ msgstr "删除队列里的所有曲目" #~ msgid "Watch this folder for new songs" #~ msgstr "监视这个文件夹的新曲目" #~ msgid "Set or toggle the playback order" #~ msgstr "设定或切换回放顺序" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "无法保存库" #, fuzzy #~ msgid "Unable to save iPod database" #~ msgstr "无法保存库" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "音轨号" #~ msgid "Shuffle" #~ msgstr "Shuffle" #~ msgid "Weighted" #~ msgstr "权重" #~ msgid "_Weighted" #~ msgstr "权重(_W)" #~ msgid "_One Song" #~ msgstr "单曲(_O)" #~ msgid "Restart the playlist when finished" #~ msgstr "完成后重新开始播放列表" #~ msgid "Disable Browser" #~ msgstr "关掉浏览器" #~ msgid "_Disable Browser" #~ msgstr "关掉浏览器" #, fuzzy #~ msgid "Force Write" #~ msgstr "写入" #~ msgid "Filter on _Genre" #~ msgstr "以流派过滤(_G)" #~ msgid "Filter on _Artist" #~ msgstr "以歌手过滤(_A)" #~ msgid "Filter on Al_bum" #~ msgstr "以专辑过滤(_B)" #~ msgid "_Music" #~ msgstr "音乐(_M)" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "书签" #~ msgid "Song _List" #~ msgstr "曲目列表(_L)" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "这首曲目放完后就停止" #, fuzzy #~ msgid "Timeout" #~ msgstr "时间" #, fuzzy #~ msgid "Select an album" #~ msgstr "全选(_A)" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "播放列表" #~ msgid "Re_fresh Library" #~ msgstr "刷新库(_F)" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "删除站点(_R)" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "无法打开文件" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "非法的值" #, fuzzy #~ msgid "ql-revert" #~ msgstr "移除" #, fuzzy #~ msgid "command|filename" #~ msgstr "文件名" #, fuzzy #~ msgid "heading|Search" #~ msgstr "搜索" #~ msgid "_Download..." #~ msgstr "下载(_D)..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "新站点(_N)" #, fuzzy #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "删除 <b>%s</b> 失败。" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet 已经在运行。" #~ msgid "No song is currently playing." #~ msgstr "当前没有曲目在播放。" #~ msgid "Unable to write to %s. Removing it." #~ msgstr "无法写入到 %s。正在删除。" #~ msgid "_Edit Bookmarks..." #~ msgstr "编辑书签(_E)..." #, fuzzy #~ msgid "_New Folder..." #~ msgstr "新文件夹..." #~ msgid "_Add to Playlist" #~ msgstr "加入到播放列表(_A)" #~ msgid "_Order:" #~ msgstr "顺序(_O):" #~ msgid "_Add a Location..." #~ msgstr "加入位置(_A)..." #, fuzzy #~ msgid "People Headers" #~ msgstr "过滤器(_F)" #, fuzzy #~ msgid "Album Headers" #~ msgstr "专辑列表(_A)" #, fuzzy #~ msgid "Date Headers" #~ msgstr "过滤器(_F)" #, fuzzy #~ msgid "File Headers" #~ msgstr "过滤器(_F)" #, fuzzy #~ msgid "Production Headers" #~ msgstr "音轨号" #, fuzzy #~ msgid "Tag:" #~ msgstr "标签(_T):" #, fuzzy #~ msgid "Warnings" #~ msgstr "评分(_R)" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "专辑歌手" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "歌手" #, fuzzy #~ msgid "album (sort)" #~ msgstr "专辑歌手" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "演员" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "演员" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz 专辑歌手 ID" #, fuzzy #~ msgid "errors" #~ msgstr "演员" #~ msgid "Permanently delete this file?" #~ msgstr "永远删除这个文件?" #~ msgid "Permanently delete these files?" #~ msgstr "永远删除这些文件?" #, fuzzy #~ msgid "Version:" #~ msgstr "版本" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "插件错误" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s 无法添加到您的库。\n" #~ "\n" #, fuzzy #~ msgid "No eject command found." #~ msgstr "没有发现站点" #~ msgid "Unable to start web browser" #~ msgstr "无法启动网页浏览器" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "无法找到网页浏览器。请设定好您的 $BROWSER 变量,或者确保存在 /usr/bin/" #~ "sensible-browser。" #, fuzzy #~ msgid "Library Error" #~ msgstr "库浏览器" #~ msgid "translator-credits" #~ msgstr "Emfox Zhou <EmfoxZhou@gmail.com>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "其它要显示的栏,以空格分隔" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "继续(_C)" #~ msgid "Search your library" #~ msgstr "搜索您的库" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "总大小:" #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet 插件" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "简单搜索显示成蓝色,高级搜索绿色,非法搜索则是红色" #~ msgid "_Select" #~ msgstr "选择(_S)" #~ msgid "Separators for splitting tags" #~ msgstr "切分标签的分隔符" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet 首选项" #~ msgid "Not Played To_day" #~ msgstr "今天没有播放过(_D)" #~ msgid "Not Played in a _Week" #~ msgstr "一星期没有播放过(_W)" #~ msgid "Not Played in a _Month" #~ msgstr "一个月没有播放过(_M)" #~ msgid "B_ottom 40" #~ msgstr "后40(_O)" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "40首您播放得最少的歌(如果有绑定的话,可能会多于40首)" #, fuzzy #~ msgid "Date" #~ msgstr "日期(_D)" #~ msgid "Choose New Stations" #~ msgstr "选择新的站点" #~ msgid "Add" #~ msgstr "加入" #, fuzzy #~ msgid "Bitrate" #~ msgstr "比特率" #~ msgid "_Stations..." #~ msgstr "站点(_S)..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "退出 Quod Libet" #~ msgid "Unable to save library" #~ msgstr "无法保存库" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "无法播放曲目" #~ msgid "Sort by title" #~ msgstr "按标题排序" #~ msgid "Sort by artist" #~ msgstr "按歌手排序" #~ msgid "Lyrics provided by %s." #~ msgstr "由 %s 提供的歌词。" #~ msgid "part" #~ msgstr "部分" #~ msgid "Opening audio device." #~ msgstr "正在打开音频设备。" #~ msgid "%d/%d songs saved" #~ msgstr "已保存 %d/%d 首曲目" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz 专辑 ID" #~ msgid "Loaded song library." #~ msgstr "已导入曲目库。" #~ msgid "Unable to open audio device" #~ msgstr "无法打开音频设备" #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet 无法找到 Gstreamer 元素“filesrc”。检查您的 GStreamer 安装。" #, fuzzy #~ msgid "C_opy album covers" #~ msgstr "显示专辑封面(_C)" #~ msgid "W: %s is not a QL song database." #~ msgstr "警告:%s 不是 QL 的曲目数据库。" #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "单曲(“广播”)音量调整" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "专辑(“Audiophile”)音量调整" #~ msgid "_Volume Normalization" #~ msgstr "音量整定" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "正在扫描您的库。这可能要进行数分钟。\n" #~ "\n" #~ "重新导入了%d首曲目\n" #~ "删除了%d首曲目" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "扫描新曲目并把它们添加到您的库里。\n" #~ "\n" #~ "加入了%d首曲目" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "M3U 播放列表无法导入。" #~ msgid "This station is already in your library." #~ msgstr "这个站点已经在您的库里。" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/nl.po����������������������������������������������������������������������������0000644�0001750�0001750�00000604021�13115512746�015341� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# translation of nl.po to Nederlands # English translation of Quod Libet. # Copyright (C) 2005 THE Quod Libet'S COPYRIGHT HOLDER # This file is distributed under the same license as the Quod Libet package. # # dok <dok@xs4all.nl>, 2005. # Hans van Dok <dok@xs4all.nl>, 2005, 2006, 2007. msgid "" msgstr "" "Project-Id-Version: nl\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2016-01-14 15:39+0100\n" "Last-Translator: Nathan Follens <nthn@unseen.is>\n" "Language-Team: Nederlands <en@li.org>\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.5\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Bewerk tags in je audiobestanden" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" "Ex Falso is een tagbewerker met dezelfde tagbewerkingsinterface als Quod " "Libet. Het laat je eender welke tags in het bestand weergeven en bewerken " "voor alle ondersteunde bestandsindelingen." #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" "Ondersteunde bestandsindelingen zijn onder andere Ogg Vorbis/Opus/Speex/" "FLAC, MP3, FLAC, MOD/XM/IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, " "WMA, SPC, MIDI." #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Audiotagbewerker" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Luister naar, doorzoek, of bewerk je audioverzameling" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" "Quod Libet is een programma voor het beheren van je muziek. Het biedt " "verschillende manieren om je audiobibliotheek te bekijken en ondersteunt " "internetradio en audiofeeds. Het heeft zeer flexibele mogelijkheden om " "metadata tags te bewerken en je bibliotheek te doorzoeken." #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Muziekspeler" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "_Titel" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artiest" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Datum" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "Beoo_rdeling" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 msgid "Sort _by…" msgstr "Sorteren o_p…" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Voorkeuren" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Albumlijst" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Albumlijst" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Alle albums" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albums" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Album_hoes herladen" msgstr[1] "Album_hoezen herladen" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Nummers niet in een album" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d nummer" msgstr[1] "%d nummers" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disc" msgstr[1] "%d discs" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 msgid "An Example Album" msgstr "Een voorbeeldalbum" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Albumlijstvoorkeuren" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Toon album_hoezen" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Inline _zoeken zoekt ook personen" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 msgid "Options" msgstr "Opties" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Albumweergave" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "_Sluit" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Onbekend" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Nieuwe feed" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Voer de locatie van een audiofeed in:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "_Toevoegen" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Audiofeeds" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Audiofeeds" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 msgid "_Download…" msgstr "_Download…" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Download bestanden" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "Op_slaan" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Download bestand" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "_Nieuw" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Kan feed niet toevoegen" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "%s kon niet worden toegevoegd. De server is misschien plat, of de locatie is " "geen audiofeed." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 msgid "_Refresh" msgstr "Ve_rvers" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 msgid "_Delete" msgstr "Verwij_deren" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "De huidige audio-backend biedt geen ondersteuning voor URL's. " "Audiofeedsbrowser uitgeschakeld." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Bibliotheekbrowser" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d nummer" msgstr[1] "%d nummers" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Ongeldig patroon" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Albumverzameling" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "Album_verzameling" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "Onbekende %s" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "Meerdere %s waarden" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Aangepast" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 msgid "_Remove" msgstr "Ve_rwijderen" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Voeg samen" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Albumverzamelingsvoorkeuren" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "_Toepassen" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "Ann_uleren" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "_Hoesgrootte:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "_Hoesgrootte:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Geavanceerde voorkeuren" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Toon album_hoezen" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Alle albums" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "Too_n melding" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Bestandssysteem" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Bestandssysteem" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Kan nummers niet kopiëren" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "De geselecteerde bestanden kunnen niet worden gekopieerd naar andere " "songlijsten of de wachtrij." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Voeg toe aan bibliotheek" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Bestandstype wordt niet ondersteund" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Zenderlijsten kunnen alleen locaties van zenders bevatten, geen andere " "zenderlijsten of speellijsten. De volgende locaties kunnen niet worden " "geladen:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Kan zender niet toevoegen" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internetradio" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Zenderlijst wordt gedownload" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Nieuwe zender" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Voer de locatie van een internetradiozender in:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Elektronisch" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "Hip Hop / Rap" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Oldies" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japans" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "Indisch" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Religieus" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Hitlijsten" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Turks" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Reggae / Dancehall" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "Latin" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "College Radio" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Praatprogramma's / Nieuws" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambient" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Jazz" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Klassiek" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternatief" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metal" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Country" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Nieuws" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Schlager" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Funk" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Blues" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Punk" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Reggaeton" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Slavisch" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Grieks" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gothic" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rock" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "Wil je een lijst van populaire radiozenders laden?" #: ../quodlibet/browsers/iradio.py:455 msgid "_Load Stations" msgstr "Zenders _laden" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Internetradio" #: ../quodlibet/browsers/iradio.py:538 msgid "_New Station…" msgstr "_Nieuwe zender…" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "_Zenders bijwerken" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Alle zenders" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Favorieten" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Geen categorie" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Geen zenders gevonden" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Geen internetradiozenders werden gevonden op %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Alle vermelde zenders staan al in je bibliotheek." #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "Toevoegen aan favorieten" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Verwijder uit favorieten" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d zender" msgstr[1] "%(count)d zenders" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Apparaateigenschappen" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Apparaat" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Niet gekoppeld" #: ../quodlibet/browsers/media.py:55 msgid "Mount point:" msgstr "Koppelpunt:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Naam:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Media-apparaten" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Media-apparaten" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "Uitwerp_en" #: ../quodlibet/browsers/media.py:360 msgid "_Properties" msgstr "Eigenscha_ppen" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "He_rnoem" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%(used-size)s gebruikt, %(free-size)s beschikbaar" #: ../quodlibet/browsers/media.py:479 #, python-format msgid "%s is not connected." msgstr "%s is niet aangesloten." #: ../quodlibet/browsers/media.py:499 #, python-format msgid "Copying %(song)s" msgstr "Kopiëren van %(song)s" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Kan nummer niet kopiëren" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Er is onvoldoende beschikbare ruimte voor dit nummer." #: ../quodlibet/browsers/media.py:526 #, python-format msgid "%s could not be copied." msgstr "%s kon niet worden gekopieerd." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Kan nummers niet verwijderen" #: ../quodlibet/browsers/media.py:557 #, python-format msgid "Deleting %(song)s" msgstr "Verwijderen van %(song)s" #: ../quodlibet/browsers/media.py:575 #, python-format msgid "%s could not be deleted." msgstr "%s kon niet worden verwijderd." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Kan nummer niet verwijderen" #: ../quodlibet/browsers/media.py:594 #, python-format msgid "Ejecting %s failed." msgstr "Uitwerpen van %s mislukt." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Kan apparaat niet uitwerpen" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "Geen apparaatsbackend, media-apparatenbrowser uitgeschakeld." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Paneelbrowser" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Paneelbrowser" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Selecteer _alles" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Alles" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "_Wijde modus" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Paneelbrowser-voorkeuren" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Speellijsten" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Speellijsten" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Verwijder uit speellijst" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importeer" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Nieuwe speellijst" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Kan speellijst niet importeren" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet kan alleen speellijsten in de M3U en PLS-formaten importeren." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Kan speellijst niet hernoemen" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importeer speellijst" #: ../quodlibet/browsers/playlists/menu.py:25 msgid "_New Playlist…" msgstr "_Nieuwe speellijst…" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Wat wil je doen met dat %d nummer?" msgstr[1] "Wat wil je doen met die %d nummers?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Bevestig actie voor speellijst \"%s\"" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Nieuwe speellijst" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Paneelbrowser-voorkeuren" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Speellijsten" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Ben je zeker dat je de speellijst '%s' wil verwijderen?" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Alle informatie over de geselecteerde speellijst zal worden verwijderd en " "kan niet worden hersteld." #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Voer een naam in voor de nieuwe speellijst:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Speellijst wordt geïmporteerd.\n" "\n" "%(current)d/%(total)d songs toegevoegd." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "Beperk resu_ltaten" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Doorzoek bibliotheek" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Doorzoek bibliotheek" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Paneelbrowser" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Zoek" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "Verbinding" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet draait niet (voeg '--run' toe om het te starten)." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "een muziekbibliotheek en -speler" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[optie]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Print het spelende nummer en sluit af" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Begin afspelen onmiddellijk" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Ga naar het volgend nummer" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" "Spring naar vorig nummer of begin afspelen opnieuw indien dichtbij begin" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Ga naar het vorig nummer" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Begin afspelen" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pauzeer afspelen" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Wissel tussen afspelen en pauzeren" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Afspelen stoppen" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Verhoog volume" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Verlaag volume" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Geef status van speler weer" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Verberg hoofdvenster" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Toon hoofdvenster" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Wissel zichtbaarheid van hoofdvenster" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Focus de spelende speler" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Verwijder actieve browserfilters" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Ververs en scan bibliotheek opnieuw" #: ../quodlibet/cli.py:110 msgid "List available browsers" msgstr "Lijst van beschikbare browsers" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Print de huidige speellijst" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Print de inhoud van de wachtrij" #: ../quodlibet/cli.py:113 msgid "Print the active text query" msgstr "Print de actieve tekstzoekopdracht" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Start zonder plugins" #: ../quodlibet/cli.py:115 msgid "Start Quod Libet if it isn't running" msgstr "Start Quod Libet als het niet draait." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Sluit Quod Libet af" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Zoek in spelend nummer" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][UU:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Wissel tussen afspelen en pauzeren" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Zet repeat uit, aan of wissel ze" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Bepaal volume" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Zoek in je audiobibliotheek" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "zoekopdracht" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Speel een bestand" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 msgctxt "command" msgid "filename" msgstr "bestandsnaam" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Beoordeel het spelende nummer" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Stel de huidige browser in" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Beoordeel het spelende nummer" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Open een nieuwe browser" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Toon of verberg de wachtrij" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Hoofdsonglijst tonen of verbergen" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filter op een willekeurige waarde" #: ../quodlibet/cli.py:134 msgctxt "command" msgid "tag" msgstr "tag" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filter op een tagwaarde" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=waarde" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Zet bestand of zoekopdracht in wachtrij" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Plaats door komma's gescheiden bestanden in wachtrij" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "bestandsnaam" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Print bestandsnamen van zoekresultaten naar stdout" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Haal bestand of zoekopdracht uit wachtrij" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Ongeldig argument voor '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Probeer %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Onbekend apparaat" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "Kon %s niet importeren, wat nodig is voor apparaatsondersteuning." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r is geen ondersteund apparaat." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "Kon '%s' niet vinden." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Apparaatsbackend wordt geïnitialiseerd." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "'%s' proberen" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Kon niet verbinden met een apparaatsbackend." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Apparaatsbackend geïnitialiseerd." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "_Bestandsnaampatroon:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopieer _albumhoezen" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Verwijder ongebruikte covers en mappen" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Er trad een fout op" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 #, fuzzy msgid "Quit Program" msgstr "_Programma:" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "_Alle fouten negeren" #: ../quodlibet/errorreport/ui.py:80 #, fuzzy msgid "Error details:" msgstr "Fout-details" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "beschrijving" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "een audiotagbewerker" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "directory" #: ../quodlibet/ext/covers/artwork_url.py:19 #, fuzzy msgid "Artwork URL Cover Source" msgstr "Last.fm albumhoesbron" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "Last.fm albumhoesbron" #: ../quodlibet/ext/covers/discogs.py:26 #, fuzzy msgid "Downloads covers from Discogs." msgstr "Downloadt albumhoezen van verscheidene websites." #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "Last.fm albumhoesbron" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Downloadt albumhoezen van Last.fm's albumhoesarchief." #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "MusicBrainz Cover Source" msgstr "MusicBrainz albumhoesbron" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Downloadt albumhoezen van Musicbrainz's albumhoesarchief." #: ../quodlibet/ext/editing/iconv.py:26 msgid "Convert Encodings" msgstr "Coderingen converteren" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" "Verbetert verkeerde geïnterpreteerd tagwaardecoderingen in de tagbewerker." #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "Codering _converteren…" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "Kana/kanji eenvoudige omvormer" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "Converteert kana/kanji naar romaji voor hernoemen." #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "Romaniseer _Japanse tekst" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "Kon de 'Kana/kanji eenvoudige omvormer' (kakasi) niet vinden." #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "Regex-substitutie" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Laat arbitraire regex-substituties toe (s///) bij taggen of hernoemen van " "bestanden." #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title Case" msgstr "Hoofdletters" #: ../quodlibet/ext/editing/titlecase.py:21 msgid "Title-cases tag values in the tag editor." msgstr "Geeft hoofdletters aan tagwaarden in de tagbewerker." #: ../quodlibet/ext/editing/titlecase.py:40 msgid "Title-_case Value" msgstr "Hoof_dletterwaarde" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "Laat ALLEEN-HOOFDLETTERS in tags toe" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "Begin_hoofdletters" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Gebruikt gangbare Engelse regels voor hoofdlettergebruik, zoals in \"Dark " "Night of the Soul\"" #: ../quodlibet/ext/events/advanced_preferences.py:69 msgid "Advanced Preferences" msgstr "Geavanceerde voorkeuren" #: ../quodlibet/ext/events/advanced_preferences.py:70 #, fuzzy msgid "Allow editing of advanced config settings." msgstr "Laat toe geavanceerde configuratie-instellingen te wijzigen" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "Geanimeerde weergave op scherm" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "Toont informatie over het nummer op je scherm wanneer het verandert." #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "Bovenkant van scherm" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "Midden van scherm" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "Onderkant van scherm" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "_Positie:" #: ../quodlibet/ext/events/animosd/prefs.py:171 msgid "_Cover size:" msgstr "_Hoesgrootte:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 msgid "Display" msgstr "Weergave" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "_Lettertype:" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "Links" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "Midden" #: ../quodlibet/ext/events/animosd/prefs.py:197 msgid "Right" msgstr "Recht" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "Tekst _uitlijnen:" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "Tekst" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "_Tekst:" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "_Vullen:" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "Kleuren" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "_Schaduwen" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "C_ontour" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "Ro_nde hoeken" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "Ver_traging:" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "Effecten" #: ../quodlibet/ext/events/animosd/prefs.py:270 msgid "Ed_it Display Pattern…" msgstr "Weergavepa_troon bewerken…" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 msgid "Preview" msgstr "Vooruitblik" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "Bibliotheek automatisch bijwerken" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "Houdt je bibliotheek automatisch actueel met inotify. Vereist %s." #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "Automatisch verbergen" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" "Verbergt schijven of maakt ze automatisch weer zichtbaar wanneer ze worden " "los- of aangekoppeld." #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "Automatische beoordeling" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" "Geeft nummers automatisch een beoordeling wanneer ze worden afgespeeld of " "overgeslagen. Dit gebruikt het 'accelerated'-algoritme van vux door Brian " "Nelson." #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "Wekker" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "Maakt je wakker met luide muziek." #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "Slaapliedje" # betere vertaling dan 'vervagen' nodig #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "Vervaagt en pauzeert je muziek." #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "Flat" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "Live" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "Volle bas & treble" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "Club" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "Large Hall" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "Feest" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "Zacht" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "Volle bas" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "Reggae" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "Hoofdtelefoon" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "Zachte rock" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "Volle treble" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "Dance" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "Techno" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "Ska" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "Laptop" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "Equalizer" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "De huidige backend biedt geen ondersteuning voor equalizing." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "%.1f kHz" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "%d Hz" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, python-format msgid "%.1f dB" msgstr "%.1f dB" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom" msgstr "Aangepast" #: ../quodlibet/ext/events/equalizer.py:199 msgid "_Clear" msgstr "W_issen" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "Gajim statusbericht" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "Verandert Gajim-statusbericht op basis van waar je naar luistert." #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "gepauzeerd" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" "Lijst van accounts, gescheiden door spaties, voor veranderen van " "statusbericht. Indien geen opgegeven zal statusbericht van alle accounts " "veranderd worden." #: ../quodlibet/ext/events/gajim_status.py:160 #, fuzzy msgid "Add '[paused]'" msgstr "gepauzeerd" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" "Indien aangevinkt wordt '[gepauzeerd]' toegevoegd aan het statusbericht " "wanneer het nummer gepauzeerd is." #: ../quodlibet/ext/events/gajim_status.py:187 #, fuzzy msgid "Statuses for which message will be changed" msgstr "" "Statussen waarvoor statusbericht\n" "veranderd zal worden" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "Schermbeveiliging verhinderen" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" "Voorkomt activatie van de GNOME-schermbeveiliging wanneer een liedje wordt " "afgespeeld." #: ../quodlibet/ext/events/inhibit.py:51 msgid "Music is playing" msgstr "Muziek wordt afgespeeld" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "Internet Radio Log" msgstr "Internetradiolog" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" "Houdt de laatste 10 via radiozenders afgespeelde nummers bij en geeft ze " "weer in het contextzoekmenu." #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "JEP-118" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "Schrijft een Jabber User Tunes-bestand naar ~/.quodlibet/jabber." #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "Waa_rdering veranderen" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "Standaard" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 msgid "No active song" msgstr "Geen liedje actief" #: ../quodlibet/ext/events/lyricswindow.py:215 msgid "No lyrics found" msgstr "Geen teksten gevonden" #: ../quodlibet/ext/events/lyricswindow.py:227 msgid "Lyrics:" msgstr "Teksten:" #: ../quodlibet/ext/events/lyricswindow.py:284 #, fuzzy msgid "_Zoom level:" msgstr "_Niveau:" #: ../quodlibet/ext/events/lyricswindow.py:302 #, fuzzy msgid "URL:" msgstr "_URL:" #: ../quodlibet/ext/events/lyricswindow.py:307 #, fuzzy msgid "Revert to default" msgstr "Terug naar standaardpatroon" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Wis zoekopdracht" #: ../quodlibet/ext/events/lyricswindow.py:347 msgid "Lyrics Window" msgstr "Tekstvenster" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "Toont een venster met teksten van het huidige nummer." #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "UPnP AV mediaserver" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" "Beschrijft alle albums aan de Rygel UPnP mediaserver via de MediaServer2 D-" "Bus-interface." #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "MPD-server" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" "Laat bediening op afstand van Quod Libet met een MPD-cliënt toe. Streamen, " "speellijst-en bibliotheekbeheer worden niet ondersteund." #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "_Poort:" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "Lokaal _IP-adres:" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 #, fuzzy msgid "P_assword:" msgstr "Wachtwoord:" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 msgid "Connection" msgstr "Verbinding" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "Geteste cliënten" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "MPRIS D-Bus-ondersteuning" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" "Laat bediening van Quod Libet met behulp van de MPRIS 1.0/2.0 D-Bus " "Interface specificatie toe." #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "Verberg hoofdvenster bij sluiten" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Voorkeuren" #: ../quodlibet/ext/events/mqtt.py:50 #, fuzzy, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" "Statustekst wanneer een liedje is gepauzeerd. Quod Libet-patronen zoals %s " "worden aanvaard." #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Padpatronen" #: ../quodlibet/ext/events/mqtt.py:130 #, fuzzy msgid "Status text when a song is started." msgstr "" "Statustekst wanneer een liedje wordt gestart. Quod Libet-patronen zoals %s " "worden aanvaard." #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Statuspatronen" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "Geen nummer:" #: ../quodlibet/ext/events/mqtt.py:138 #, fuzzy msgid "Plain text for when there is no current song" msgstr "Platte tekst voor status wanneer er geen liedje wordt afgespeeld" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Uitvoerconfiguratie" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "Status" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Kon niet verbinden met %s" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "Verbindingsfout" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "Meldingstekst" #: ../quodlibet/ext/events/notify.py:88 msgid "_Title:" msgstr "_Titel:" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "Terug naar standaardpatroon" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "_Lichaam:" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "Too_n melding" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "Toon meldingen" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "Enkel bij <i>hand_matige</i> songwijzigingen" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "Enkel bij <i>_automatische</i> songwijzigingen" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "Bij <i>a_lle</i> songwijzigingen" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "Enkel wanneer _focus niet op het hoofdvenster staat" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "Verbindingsfout" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "Kon niet verbinden met meldingsdaemon." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "Songmeldingen" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "Toont een melding wanneer het liedje verandert." #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Volgende" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" "Ga naar het Plugins-scherm om QLScrobbler in te stellen. Tot dan zullen " "nummers niet worden ingediend." #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "Kon dienst '%s' niet bereiken." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "Authenticatie mislukt: ongeldige URL." #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" "Authenticatie mislukt: ongeldige gebruikersnaam '%s' of slecht wachtwoord." #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "Cliënt is verbannen. Contacteer de auteur." #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" "Verkeerde systeemtijd. Indieningen kunnen mislukken tot dit is verbeterd." #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "AudioScrobbler-indiening" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" "AudioScrobbler-cliënt voor Last.fm, Libre.fm en andere AudioScrobbler-" "diensten." #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "Authenticatie geslaagd." #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "_Dienst:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "_URL:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "User_name:" msgstr "Gebruikers_naam:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "_Wachtwoord:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 msgid "Other…" msgstr "Overige…" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "_Verifieer accountgegevens" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "Account" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Artist pattern:" msgstr "_Artiestpatroon:" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Title pattern:" msgstr "_Titelpatroon:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "_Filter uitsluiten:" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" "Het patroon om de artiestnaam op te maken voor indienen. Laat leeg voor " "standaardinstelling." #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" "Het patroon om de titel op te maken voor indienen. Laat leeg voor " "standaardinstelling." #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "Nummers die overeenkomen met deze filter zullen niet worden ingediend." #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "_Offlinemodus (niets indienen)" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "Indiening" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "Reclame op radio dempen" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" "Dempt uitvoer wanneer reclame op de radio wordt afgespeeld.\n" "Zenders: di.fm." #: ../quodlibet/ext/events/randomalbum.py:27 msgid "Random Album Playback" msgstr "Willekeurig album afspelen" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" "Start een willekeurig album wanneer je speellijst zijn einde bereikt. " "Vereist dat je actieve browser filteren op albums ondersteunt." #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "Hoger gewaardeerd" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "Meer afgespeeld" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "Meer overgeslagen" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "Meer recent afgespeeld" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "Meer recent gestart" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "Meer recent toegevoegd" #: ../quodlibet/ext/events/randomalbum.py:44 msgid "Longer albums" msgstr "Langere albums" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "seconden voor volgend album wordt gestart" #: ../quodlibet/ext/events/randomalbum.py:87 msgid "Weights" msgstr "Gewichten" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "Speel sommige albums meer dan andere" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "vermijden" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "verkiezen" #: ../quodlibet/ext/events/randomalbum.py:201 msgid "Random Album" msgstr "Willekeurig album" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "Wachten om %s te starten" #: ../quodlibet/ext/events/rbimport.py:114 msgid "Import Failed" msgstr "Importeren mislukt" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "Importeren van waarderingen en statistieken voor %d nummers geslaagd" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "Rhythmbox-import" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "Importeert waarderingen en songstatistieken van Rhythmbox." #: ../quodlibet/ext/events/rbimport.py:132 msgid "Start Import" msgstr "Start importeren" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "Schermbeveiligingspauze" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "Pauzeert afspelen wanneer de GNOME-schermbeveiliging actief is." #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "Geen GNOME Shell-zoekmachine voor Quod Libet geïnstalleerd." #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "GNOME zoekmachine" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "Laat GNOME Shell toe de bibliotheek te doorzoeken." #: ../quodlibet/ext/events/seekbar.py:122 #, fuzzy msgid "Alternative Seek Bar" msgstr "Alternatief" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "Squeezebox-synchronisatie" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" "Laat Logitech Squeezebox de uitvoer van Quod Libet nabootsen, zolang beide " "van een identieke bibliotheek lezen." #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "Fout bij zoeken naar Squeezebox-server" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "Fout bij zoeken naar %s. Controleer de instellingen" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Bekijk teksten" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 #, fuzzy msgid "Text:" msgstr "_Tekst:" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 #, fuzzy msgid "Font" msgstr "_Lettertype:" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "Telepathy statusberichten" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" "Werkt alle IM-accounts gebaseerd op Telepathy (zoals ingesteld in Empathy, " "enz.) bij met een statusbericht gebaseerd op het huidige liedje." #: ../quodlibet/ext/events/telepathy_status.py:122 msgid "Playing:" msgstr "Wordt afgespeeld:" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" "Statustekst wanneer een liedje wordt gestart. Quod Libet-patronen zoals %s " "worden aanvaard." #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "Gepauzeerd:" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" "Statustekst wanneer een liedje is gepauzeerd. Quod Libet-patronen zoals %s " "worden aanvaard." #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "Platte tekst voor status wanneer er geen liedje wordt afgespeeld" #: ../quodlibet/ext/events/telepathy_status.py:157 msgid "No song:" msgstr "Geen nummer:" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 msgid "Status Patterns" msgstr "Statuspatronen" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "Themawisselaar" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "Verandert het actieve GTK+-thema." #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "_Thema:" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "Standaardthema" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "Verkies donkere versie van thema" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Speelt niet" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "Systeemvakpictogram" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "Bestuur Quod Libet vanuit het systeemvak." #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 msgid "_Play" msgstr "Afs_pelen" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 msgid "P_ause" msgstr "P_auzeren" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 msgid "Pre_vious" msgstr "_Vorige" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "Volge_nde" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Shuffle" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "He_rhaal" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Stop na deze song" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 msgid "Open _Browser" msgstr "_Browser openen" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Bewerk _tags" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informatie" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 msgid "Play_lists" msgstr "Speel_lijsten" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "_Afsluiten" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Gedrag" #: ../quodlibet/ext/events/trayicon/prefs.py:42 #, fuzzy msgid "Scroll wheel adjusts volume" msgstr "" "Scrollwiel verandert volume\n" "Shift en scrollwiel verandert liedje" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Scroll_wiel" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Knopinfo-weergave" #: ../quodlibet/ext/events/viewlyrics.py:23 msgid "View Lyrics" msgstr "Bekijk teksten" #: ../quodlibet/ext/events/viewlyrics.py:24 #, fuzzy msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "Toont songteksten onder songlijst." #: ../quodlibet/ext/events/viewlyrics.py:29 msgid "_Lyrics" msgstr "Te_ksten" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 msgid "Error" msgstr "Fout" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 #, fuzzy msgid "Waveform Seek Bar" msgstr "Alternatief" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "Foto-opslager" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "Slaat de albumhoes van het huidige liedje op naar een bestand." #: ../quodlibet/ext/events/write_cover.py:66 msgid "File:" msgstr "Bestand:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "_Drempel:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "Drempel vooraleer filter wordt geactiveerd" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "Verho_uding:" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "Compressieverhouding" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "%d %%" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "Audiocompressor" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" "Verandert de amplitude van alle samples boven een bepaalde drempel met een " "specifieke verhouding." #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "_Preset:" msgstr "_Voorinstelling:" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "Filter preset" msgstr "Filter-voorinstelling" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "_Frequentie-cutoff:" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "Low-pass filter-cutoff-frequentie" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "Feed_niveau:" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "Feedniveau" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "Standaard" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "Dichtst bij virtuele luidsprekerplaatsing (30°, 3 meter)" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "Chu Moy" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "Dichtbij Chu Moys crossfeeder (populair)" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "Jan Meier" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "Dichtbij Jan Meiers CORDA-versterkers (weinig verandering)" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom settings" msgstr "Aangepaste instellingen" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "Crossfeed" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" "Mengt het linkse en het rechtse kanaal op een manier die een " "luidsprekerinstelling simuleert bij het gebruik van een hoofdtelefoon, of om " "aan te passen voor vroege stereo-opnamen." #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "Filter _band:" msgstr "Filter op _band:" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "De frequentieband van de filter" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "Filter _width:" msgstr "Filter op bree_dte:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "De frequentiebreedte van de filter" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "_Niveau:" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "Niveau van het effect" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "Karaoke" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "Verwijdert belangrijkste zang van audio." #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "Mono downmix" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "Downmixt audiokanalen naar mono." #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "Verho_uding:" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "_Tempo:" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "Toon_hoogte:" #: ../quodlibet/ext/gstreamer/pitch.py:89 msgid "Audio Pitch / Speed" msgstr "Audio-toonhoogte / snelheid" #: ../quodlibet/ext/gstreamer/pitch.py:90 msgid "Controls the pitch of an audio stream." msgstr "Bepaalt de toonhoogte van een audiostream." #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Speellijst exporteren naar Squeezebox" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Importeer" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Geen zenders gevonden" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Bestandsnaampatroon:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Bestandsnaampatroon:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 #, fuzzy msgid "Export to Squeezebox" msgstr "Exporteren naar Squeezebox…" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 #, fuzzy msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" "Exporteert dynamisch een speellijst naar een Logitech Squeezebox speellijst, " "mits beiden een directorystructuur delen. Deelt configuratie met Squeezebox " "Sync-plugin." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "Speellijst exporteren naar Squeezebox" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "Naam van speellijst (bestaande naam wordt overschreven)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "Exporteren naar Squeezebox-speellijst" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 msgid "Remove Playlist Duplicates" msgstr "Verwijder duplicaten uit speellijst" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "Verwijdert dubbele items in een speellijst." #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Weet je zeker dat je %d dubbel liedje wil verwijderen?" msgstr[1] "Weet je zeker dat je %d dubbele liedjes wil verwijderen?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "De dubbele liedjes zullen worden verwijderd van de speellijst '%s'." #: ../quodlibet/ext/playlist/shuffle.py:15 msgid "Shuffle Playlist" msgstr "Speellijst schudden" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "Schudt een speellijst willekeurig." #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "Volg aanwijzer" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 #, fuzzy msgid "Playcount Equalizer" msgstr "Equalizer" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "laatst gespeeld" #: ../quodlibet/ext/playorder/queue.py:19 msgid "Queue Only" msgstr "Enkel wachtrij" #: ../quodlibet/ext/playorder/queue.py:21 #, fuzzy msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" "Beperkt afspelen tot nummers in de wachtrij. Dubbelklik op een nummer om het " "in de wachtrij te plaatsen." #: ../quodlibet/ext/playorder/reverse.py:14 msgid "Reverse" msgstr "Omkeren" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "Keert de afspeelvolgorde van de nummers om." #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Aantal keer overgeslagen" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "Schud nummers, maar herhaal elk nummer een bepaald aantal keer." #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "Aantal keer dat elk nummer afgespeeld moet worden::" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 #, fuzzy msgid "Python Query" msgstr "Python-console" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Opgeslagen zoekopdrachten" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "Squeezebox oké. De enige speler wordt gebruikt (%s)." #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "Kon niet verbinden met %s" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "Hostnaam:" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "Poort:" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 msgid "Username:" msgstr "Gebruikersnaam:" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "Wachtwoord:" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "Bibliotheekdirectory waarmee de server verbindt." #: ../quodlibet/ext/_shared/squeezebox/base.py:132 msgid "Library path:" msgstr "Bibliotheekpad" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "Instellingen _verifiëren" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "Squeezebox-server" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Debuggen" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Squeezebox-server op {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "niet-geïdentificeerde Squeezebox-server" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "niet-geïdentificeerde Squeezebox-speler: %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "Kies Squeezebox-speler" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "_Oké" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Squeezebox-server gevonden.\n" "Kies de speler" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "Pas afbeeldingsgrootte aan aan _venster" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "_Programma:" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "B_ewerk afbeelding na opslaan" #: ../quodlibet/ext/songsmenu/albumart.py:345 msgid "File_name:" msgstr "Bestands_naam" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "Opslaan mislukt" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, python-format msgid "Unable to save \"%s\"." msgstr "Kan \"%s\" niet opslaan." #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] HTTP-fout: %s" #: ../quodlibet/ext/songsmenu/albumart.py:613 msgid "Album Art Downloader" msgstr "Albumhoesdownloader" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "van %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "Resolutie: %s" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, python-format msgid "Size: %s" msgstr "Grootte: %s" #: ../quodlibet/ext/songsmenu/albumart.py:690 msgid "_Search" msgstr "_Zoeken" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 msgid "Searching…" msgstr "Bezig met zoeken…" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "Klaar" #: ../quodlibet/ext/songsmenu/albumart.py:922 msgid "Download Album Art" msgstr "Download albumhoes" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "Downloadt albumhoezen van verscheidene websites." #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "Bronnen" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "APEv2 naar ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" "Converteert je APEv2-tags naar ID3v2-tags. De APEv2-tags zullen na het " "converteren worden verwijderd." #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "Ga naar bladwijzer…" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 #, fuzzy msgid "Manages bookmarks in the selected files." msgstr "Lijst van alle bladwijzers in de geselecteerde bestanden." #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 msgid "_Edit Bookmarks…" msgstr "B_ewerk bladwijzers…" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 msgid "No Bookmarks" msgstr "Geen bladwijzers" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 msgid "MusicBrainz Lookup" msgstr "MusicBrainz opzoeken" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Hertagt een album gebaseerd op een MusicBrainz-zoekopdracht." #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "Gebruik enkel jaar voor \"datum\"-tag" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "Schrijf \"_albumartist\" indien nodig" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "Schrijf sorteertags voor artiestnamen" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "Schrijf _standaard-MusicBrainz-tags" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Bestandsnaam" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Disc" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Nummer" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 msgid "Title" msgstr "Titel" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Artiest" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 msgid "MusicBrainz lookup" msgstr "MusicBrainz opzoeken" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 msgid "_Query:" msgstr "Zoe_kopdracht:" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 msgid "S_earch" msgstr "Zo_ek" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "Resultaten <i>(versleep om rangschikking te wijzigen)</i>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "Voer een zoekopdracht in." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "Er trad een fout op, probeer opnieuw." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "Resultaten worden geladen…" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 msgid "No results found." msgstr "Geen resultaten gevonden." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 msgid "Browse Folders" msgstr "Bladeren door mappen" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "Opent de mappen van de nummers in een bestandsbeheerder." #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Unable to open folders" msgstr "Kan mappen niet openen" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "Geen programma beschikbaar voor het openen van mappen." #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "Python-console" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "Interactieve Python-console." #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "Je hebt standaard toegang tot de volgende objecten:" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "Je huidige werkdirectory is:" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "Commando" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "name" msgstr "naam" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "De naam van dit commando" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "commando" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "De uit te voeren shellcommandosyntax" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "parameter" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" "Indien opgegeven: een parameter waarvan de verschijningen in het commando " "vervangen zullen worden door een waarde opgegeven door de gebruiker, bv. " "door 'PARAM' te gebruiken zullen alle voorkomens van '{PARAM}' in je " "commando de opgegeven waarde hebben wanneer het commando wordt uitgevoerd" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "patroon" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 #, fuzzy msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" "Het te gebruiken QL-patroon, bv. <~filename>, voor het berekenen van een " "waarde van het commando" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "uniek" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" "Indien ingesteld zal dit dubbele berekende waarden van het patroon " "verwijderen" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "maximum argumenten" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" "Het maximum aantal argumenten dat tegelijk aan het commando kan worden " "doorgegeven (zoals xargs)" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 msgid "Input value" msgstr "Invoerwaarde" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "Waarde voor %s?" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 msgid "Custom Commands" msgstr "Aangepaste commando's" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Voert aangepaste commando's uit op nummers (in bulk indien nodig) op basis " "van eender welke van hun tags." #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "Aangepaste commando's bewerken" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 #, fuzzy msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" "Biedt ondersteuning voor QL-patronen\n" "bv. <tt><~artist~title></tt>" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, python-format msgid "Unable to run custom command %s" msgstr "Kan aangepast commando %s niet uitvoeren" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "%d dubbele groep" msgstr[1] "%d dubbele groepen" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "Alles samenvouwen / uitvouwen" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Dubbele sleutelexpressie is '%s'" #: ../quodlibet/ext/songsmenu/duplicates.py:372 msgid "Duplicates Browser" msgstr "Duplicatenbrowser" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "Zoekt en toont gelijkaardig getagde versies van nummers." #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" "QL tag-expressies zoals <tt>~artist~title</tt> of <tt>musicbrainz_track_id</" "tt> worden aanvaard" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "Duplicaten _groeperen op:" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "Dubbele sleutel" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "_Witruimte verwijderen" #: ../quodlibet/ext/songsmenu/duplicates.py:424 msgid "Remove _Diacritics" msgstr "_Diakritische tekens verwijderen" #: ../quodlibet/ext/songsmenu/duplicates.py:425 msgid "Remove _Punctuation" msgstr "_Leestekens verwijderen" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "N_iet hoofdlettergevoelig" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "Bijpassende opties" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 msgid "Edit Playcount" msgstr "Aantal keer afgespeeld bewerken" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" "Bewerk de ~#playcount en ~#skipcount van een nummer.\n" "\n" "Wanneer meerdere nummers geselecteerd zijn zullen de tellers verhoogd worden " "ipv ingesteld.\n" "\n" "Wanneer de ~#playcount van een nummer op 0 wordt gezet zullen de " "~#lastplayed ~#laststarted items gewist worden. Wanneer echter een nummer " "dat nog nooit is afgespeeld een 'playcount' boven nul wordt gegeven zullen " "geen speeltijden worden aangemaakt. However, when setting a 0-play song to a " "positive play count, no play times will be created." #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "Aantal keer afgespeeld" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "Aantal keer overgeslagen" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "Ingebedde afbeeldingen bewerken" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "Verwijdert of vervangt ingebedde afbeeldingen." #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "Alle afbeeldingen ve_rwijderen" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "Huidige afbeeldingen inb_edden" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "Exacte waardering instellen" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "Laat toe liedjes te waarderen met een nummer." #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "Geef je gewenste waardering op een schaal van 0.0 tot 1.0" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Filter on Any Tag" msgstr "Filter op eender welke tag" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "Maakt een zoekopdracht op basis van tags van de geselecteerde nummers." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 msgid "Filter on Directory" msgstr "Filter op Directory" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "Filtert op directory in een nieuw browservenster." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "Akoestische vingerafdruk opzoeken" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" "Zoekt metadata van nummers op op basis van akoestische vingerafdrukken." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "Akoestische vingerafdrukken indienen" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Maakt akoestische vingerafdrukken op basis van chromaprint en dient ze in op " "acoustid.org." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "API-sleutel ontbreekt" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" "Je moet een acoustid.org API-sleutel opgeven in de pluginvoorkeuren " "vooraleer je vingerafdrukken kan indienen." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "API-sleutel aanvragen" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "API-_sleutel:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "AcoustID-webdienst" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "In wachtrij" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "Analyseren" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "Opzoeken" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Schrijf" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "Status" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "Release" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 msgid "Write MusicBrainz tags" msgstr "Schrijf MusicBrainz-tags" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 msgid "Group by directory" msgstr "Groeperen op directory" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "Album Mode" msgstr "Albummodus" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" "Schrijf albumgerelateerde tags en probeer het aantal verschillende " "albumreleases te verminderen" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "Aanmaken van vingerafdrukken:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "_Details" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "In_dienen" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" "Nummers hebben ofwel een <i><b>musicbrainz_trackid</b></i>, of <i><b>artist</" "b></i> / <i><b>title</b></i> / <i><b>album</b></i>-tags nodig om ze te " "kunnen indienen." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "Vingerafdrukken:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "Nummers met MBID's:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "Nummers met voldoende tags:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "In te dienen nummers:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Klaar. %(to-send)d/%(all)d nummers in te dienen." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "Indienen van vingerafdrukken:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "Indienen…" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Zenders bijwerken" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 #, fuzzy msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" "Slaat de bestanden opnieuw op. Dit zorgt ervoor dat speeltellingen en " "waarderingen actueel zijn." #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "Exporteren naar HTML" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "Exporteert de gekozen songlijst naar HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "Corrigeer MP3-duur" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" "Verwijdert TLEN-frames van ID3-tags die kunnen leiden tot het onjuist " "weergeven van de duur van nummers." #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "Sturen naar iFP" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "Uploadt nummer naar een iRiver iFP-apparaat." #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "Metadata exporteren" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "Exporteer metadata van gekozen nummers als een .tags-bestand." #: ../quodlibet/ext/songsmenu/importexport.py:92 msgid "Import Metadata" msgstr "Metadata importeren" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "Importeert metadata van gekozen nummers van een .tags-bestand." #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "CD branden" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Brandt CD's met K3b, Brasero of xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "Hitlijsten worden bijgewerkt." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "Reeds actueel." #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "Hitlijst voor week van %s wordt opgehaald." #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "Synchronisatie voltooid." #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "Fout tijdens synchronisatie" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "Last.fm-synchronisatie" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "Werkt je bibliotheekstatistieken bij van je Last.fm-profiel." #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 msgid "_Username:" msgstr "Gebr_uikersnaam:" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "Sorteertags aanmaken" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "Converteert album- en artiestnames in sorteernamen, slecht." #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Metadata exporteren" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Informatie" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Importeer speellijst" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "Exporteert nummers naar een M3U- of PLS-speellijst." #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "Gebruik relatieve paden" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "Gebruik absolute paden" #: ../quodlibet/ext/songsmenu/playlist.py:132 msgid "Unable to export playlist" msgstr "Kan speellijst niet exporteren" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Schrijven naar <b>%s</b> mislukt." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Ververs nummers" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" "Controleert op bestandswijzigingen en herlaadt / verwijdert de nummers " "indien nodig." #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Ververs nummers" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "ReplayGain-analyzer" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "Voortgang" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "Gain" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "Piek" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, fuzzy, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "Er is <b>%(to-process)d</b> album bij te werken (van %(all)d)" msgstr[1] "Er zijn <b>%(to-process)d</b> albums bij te werken (van %(all)d)" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "ReplayGain" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" "Analyseert en werkt ReplayGain-informatie bij met GStreamer. Resultaten " "worden gegroepeerd per album." #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "altijd" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "indien <b>enige</b> RG tags ontbreken" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "indien <b>album</b> RG tags ontbreken" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "Te verwerken al_bums:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 msgid "Existing Tags" msgstr "Bestaande tags" #: ../quodlibet/ext/songsmenu/splitting.py:31 msgid "Split Tags" msgstr "Tags splitsen" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "Splitst zowel het discnummer uit het album als de versie uit de titel." #: ../quodlibet/ext/songsmenu/splitting.py:56 msgid "Split Album" msgstr "Album splitsen" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "Splits discnummer." #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Voorinstelling:" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Tag" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Kan nummers niet verwijderen" #: ../quodlibet/ext/songsmenu/website_search.py:35 msgid "Website Search" msgstr "Zoek op website" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" "Doorzoekt de door jou opgegeven website aan de hand van eender welke " "songtags.\n" "Patronen zoals %(pattern-example)s worden ondersteund." #: ../quodlibet/ext/songsmenu/website_search.py:78 msgid "Search URL patterns" msgstr "Zoek-URL patronen" #: ../quodlibet/ext/songsmenu/website_search.py:88 msgid "Edit search URLs" msgstr "Zoek-URLs bewerken" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Zoektermen instellen…" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "Zoeken op %(website)s" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "Zoek artiest op Wikipedia" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" "Opent een browservenster met het Wikipedia-artikel over de artiest waarvan " "een nummer wordt afgespeeld." #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "Zoek album op Wikipedia" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" "Opent een browservenster met het Wikipedia-artikel over album waarvan een " "nummer wordt afgespeeld." #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Bibliotheek" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Koppelpunten worden gecontroleerd" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Bibliotheek wordt gescand" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "%s wordt gescand" #: ../quodlibet/library/libraries.py:745 #, fuzzy msgid "Loading files" msgstr "Opslaan mislukt" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Laden van bestand mislukt: %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Lijst van tags" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Print beknopte uitvoer" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Kolommen weer te geven en te rangschikken in beknopte modus (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "Laat ook _programmatische tags zien" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Niet genoeg argumenten" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "Te veel argumenten" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "Beschrijving" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Waarde" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Lijst van veelgebruikte tags" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Kopieer tags van een bestand naar een ander" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Toon veranderingen, pas ze niet toe" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Sla tags die niet geschreven kunnen worden over" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Kan tag %r niet kopiëren naar bestand: %r" #: ../quodlibet/operon/commands.py:157 msgid "Edit tags in a text editor" msgstr "Tags bewerken in een tekstverwerker" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "Bewerken geannuleerd" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Starten van tekstverwerker '%(editor-name)s' mislukt." #: ../quodlibet/operon/commands.py:260 msgid "No changes detected" msgstr "Geen wijzigingen gevonden" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Stel een tag in en verwijder bestaande waarden" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Kan %r niet instellen" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "Verwijder tags" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "Waarde is een reguliere expressie" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "Verwijder alle tags" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "Kan '--all' niet met '--regexp' combineren" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "Kan %r niet verwijderen van %r" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "Een tagwaarde verwijderen" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "Een tagwaarde toevoegen" #: ../quodlibet/operon/commands.py:456 msgid "List file information" msgstr "Bestandsinformatie weergeven" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" "Stel de opgegeven afbeelding in als primaire ingebedde afbeelding en " "verwijder alle andere ingebedde afbeeldingen" #: ../quodlibet/operon/commands.py:515 #, python-format msgid "Failed to load image file: %r" msgstr "Laden van afbeeldingsbestand mislukt: %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" "Bewerken van afbeelding niet ondersteund voor %(file_name)s (%(file_format)s)" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "Verwijder alle ingebedde afbeeldingen" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Pak ingebedde afbeeldingen uit naar %(filepath)s" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" "Pad waar de afbeeldingen zullen worden opgeslagen (standaard is dit de " "werkdirectory)" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Hernoem bestanden op basis van tags" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Vul tags op basis van bestandspad" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Bestand" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Vul nummer-nummers voor alle bestanden" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Print tags op basis van gegeven patroon" #: ../quodlibet/operon/commands.py:768 msgid "Display help information" msgstr "Hulpinformatie tonen" #: ../quodlibet/operon/util.py:40 #, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "'%(column-id)s' is geen geldige kolomnaam (%(all-column-ids)s)." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Onbekend" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "In volgorde" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_In volgorde" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "Willekeu_rig" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "Willekeu_rig" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "He_rhaal" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Één nummer" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Bufferen" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "Kon GStreamer-pijplijn niet aanmaken" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "Geen GStreamer-element gevonden om mediaformaat te verwerken" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "Mediaformaat: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "GStreamer-plugin '%(name)s' kon niet geïnitialiseerd worden" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "De GStreamer-uitvoerpijplijn gebruikt voor afspelen. Laat leeg voor " "standaardpijplijn. Ingeval de pijplijn een sink bevat zal die gebruikt " "worden in plaats van de standaard." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "Uitv_oerpijplijn:" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f seconden" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "_Bufferduur:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "_Gapless afspelen uitschakelen" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" "Uitschakelen van gapless afspelen kan trackwisselproblemen bij sommige " "GStreamer-versies vermijden." #: ../quodlibet/player/gstbe/util.py:93 msgid "No GStreamer audio sink found" msgstr "Geen GStreamer-audiosink gevonden" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "Ongeldige GStreamer-uitvoerpijplijn" #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Kan audio-uitvoer niet aanmaken" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Het audio-apparaat %r is niet gevonden. Controleer je Xine-instellingen in " "~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" "Kon module '{module}' niet vinden. Misschien moet je het pakket installeren?" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Kon GStreamer-element '{element}' niet vinden." #: ../quodlibet/plugins/playlist.py:30 #, fuzzy, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "Plugin \"%(name)s\" uitvoeren op %(count)d speellijst?" msgstr[1] "Plugin \"%(name)s\" uitvoeren op %(count)d speellijsten?" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 msgid "_Run Plugin" msgstr "Plugin uitvoe_ren" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Ondersteunde formaten: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Audio-apparaat: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Begin" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/B" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Tijd" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Bladwijzernaam" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Bladwijzers" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filters" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "Recent afges_peeld" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Recent _toegevoegd" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 msgid "All _Songs" msgstr "Alle liedje_s" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Willekeurig _genre" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Willekeurige _artiest" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Willekeurig al_bum" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "De 40 nummers die je het meest hebt beluistered (meer dan 40 kunnen worden " "gekozen als bepaalde nummers even veel zijn afgespeeld)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Waarde:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Opgeslagen waarden" #: ../quodlibet/qltk/cbes.py:263 msgid "Edit saved values…" msgstr "Opgeslagen waarden bewerken…" #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_matisch" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "_Trackmodus" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "_Albummodus" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "De_mpen" #: ../quodlibet/qltk/controls.py:128 msgid "_Replay Gain Mode" msgstr "_ReplayGain-modus" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "Nieuw %s" #: ../quodlibet/qltk/data_editors.py:218 msgid "(unknown)" msgstr "(onbekend)" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "Tag-expressie" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "Tag-expressie, bv. personen:echt of ~album~jaar" #: ../quodlibet/qltk/data_editors.py:383 msgid "Enter new tag" msgstr "Voer nieuwe tag in" #: ../quodlibet/qltk/delete.py:37 msgid "Files:" msgstr "Bestanden:" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" "De geselecteerde nummers zullen worden verwijderd van de bibliotheek en hun " "bestanden verwijderd van de schijf." #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "De geselecteerde bestanden zullen worden verwijderd van de schijf." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "%(file_count)d bestand permanent verwijderen?" msgstr[1] "%(file_count)d bestanden permanent verwijderen?" #: ../quodlibet/qltk/delete.py:91 msgid "_Delete Files" msgstr "Verwij_der bestanden" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "De geselecteerde nummers zullen worden verwijderd van de bibliotheek en hun " "bestanden verplaatst naar de prullenbak." #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" "De geselecteerde bestanden zullen worden verplaatst naar de prullenbak." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "%(file_count)d bestand verplaatsen naar prullenbak?" msgstr[1] "%(file_count)d bestanden verplaatsen naar prullenbak?" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Verplaats naar vuilnisbak" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Verplaatsen van %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Kan niet verplaatsen naar prullenbak" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 msgid "Moving one or more files to the trash failed." msgstr "Verplaatsen van een of meerdere bestanden naar prullenbak mislukt." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Verwijderen van %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 msgid "Unable to delete files" msgstr "Kan bestanden niet verwijderen" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 msgid "Deleting one or more files failed." msgstr "Verwijderen van een of meerdere bestanden mislukt." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Downloads" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Grootte" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "_Stoppen" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "ontbreekt in %d nummer" msgstr[1] "ontbreekt in %d nummers" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "verschilt over %d nummer" msgstr[1] "verschilt over %d nummers" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Splits in _meerdere waarden" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Splits disc van _album" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Splits _versie uit titel" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Splits arrangeerder van ar_tiest" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Splits _uitvoerende van artiest" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "Splits _uitvoerende uit titel" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "Splits _oorspronkelijke artiest uit titel" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Voeg een tag toe" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Bewerk tags" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Toon _programmatische tags" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Toegang tot alle tags, inclusief door de computer aangemaakte tags zoals " "MusicBrainz- of ReplayGain-tags" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 msgctxt "edittags" msgid "_Revert" msgstr "Onge_daan maken" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "Op_slaan" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Kan tag niet toevoegen" #: ../quodlibet/qltk/edittags.py:660 #, python-format msgid "Unable to add <b>%s</b>" msgstr "Kan <b>%s</b> niet toevoegen" #: ../quodlibet/qltk/edittags.py:662 #, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "De geselecteerde bestanden ondersteunen meerdere waarden voor <b>%s</b> niet." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Ongeldige tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Ongeldige tag <b>%s</b>\n" "\n" "De geselecteerde bestanden ondersteunen het bewerken van deze tag niet." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Ongeldige waarde" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Ongeldige waarde: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Tag is mogelijk niet juist" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "%(file-name)s is veranderd terwijl Quod Libet aanstond. Opslaan zonder je " "bibliotheek te verversen zou mogelijke andere wijzigingen in het nummer " "kunnen overschrijven." #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Kan nummer niet opslaan" #: ../quodlibet/qltk/_editutils.py:50 #, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Opslaan van %(file-name)s mislukt. Het bestand is alleen-lezen, corrupt, of " "je hebt geen permissies om het aan te passen." #: ../quodlibet/qltk/_editutils.py:142 msgid "_More options…" msgstr "_Meer opties…" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "O_ngedaan maken" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "_Opnieuw" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "Ov_er" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s en %(count)d meer" msgstr[1] "%(title)s en %(count)d meer" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso voorkeuren" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Splits _op:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Tagbewerken" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Mappen" #: ../quodlibet/qltk/filesel.py:253 msgid "_New Folder…" msgstr "_Nieuwe map…" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Selecteer alle submappen" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Nieuwe map" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Voer een naam in voor de nieuwe map:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Kan map niet aanmaken" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Kan map niet verwijderen" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Nummers" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "door %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disc %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Nummer %s" #: ../quodlibet/qltk/info.py:108 msgid "_Edit Display…" msgstr "Weergave b_ewerken…" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Er zijn geen nummers geselecteerd." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Geen nummers" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informatie" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Tekst" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Geproduceerd door %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artiest" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artiesten" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "uitvoerenden" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Nooit" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d keer" msgstr[1] "%(n)d keer" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "toegevoegd" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "laatst gespeeld" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "speelt" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "slaat over" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "beoordeling" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "lengte" #: ../quodlibet/qltk/information.py:289 msgid "format" msgstr "formaat" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "codec" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 msgid "encoding" msgstr "codering" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "bestandsgrootte" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "gewijzigd" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d geselecteerd" msgstr[1] "%d geselecteerd" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Nummer niet beschikbaar" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Nummerlijst" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d nummer zonder album" msgstr[1] "%d nummers zonder album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Selectieve discografie" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d nummer zonder artiest" msgstr[1] "%d nummers zonder artiest" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albums" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Totale lengte:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Totale grootte:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Bestanden" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:40 msgid "_Edit" msgstr "B_ewerken" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Geen tekst gevonden voor dit nummer." #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "Zoeken naar tekst…" #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "Ben je zeker dat je alle nummers wil verwijderen?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "De geselecteerde nummers zullen worden verwijderd van de bibliotheek." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "Zichtbaar maken" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "Zicht_baar maken" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Gooi tagwijzigingen weg?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tags zijn gewijzigd maar niet opgeslagen. Deze bestanden opslaan, of " "teruggaan en wijzigingen weggooien?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 msgid "_Revert" msgstr "Onge_daan maken" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Bestand bestaat" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "%(file-name)s vervangen?" #: ../quodlibet/qltk/msg.py:94 msgid "_Replace File" msgstr "Bestand ve_rvangen" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Actieve taken" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d taken worden uitgevoerd" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Wissel tussen afspelen en pauzeren" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Wissel tussen afspelen en pauzeren" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Pluginfouten" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Ingeschakeld" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Uitgeschakeld" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Geen categorie" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "Afspeelv_olgorde" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Tagbewerken" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "_Hoesgrootte:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Geen plugins gevonden." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Plugins" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Toon fout_en" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disc" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Nummer" #: ../quodlibet/qltk/prefs.py:47 msgid "Grou_ping" msgstr "Groe_peren" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bum" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Bestandsnaam" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Lengte" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Ga automatisch naar nummer dat wordt afgespeeld" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Wanneer het nummer dat gespeeld wordt verandert, scroll er dan naar in de " "songlijst" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Overige:" #: ../quodlibet/qltk/prefs.py:88 msgid "_Edit…" msgstr "B_ewerken…" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Kolomhoofdingen toevoegen of verwijderen" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Zichtbare kolommen" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Titel bevat _versie" #: ../quodlibet/qltk/prefs.py:106 msgid "Artist includes all _people" msgstr "Artiest bevat alle _personen" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Album bevat _discondertitels" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Bestandsnaam bevat _map" #: ../quodlibet/qltk/prefs.py:123 msgid "Column Preferences" msgstr "Kolomvoorkeuren" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Huidige configuratie toepassen op songlijst, waarbij nieuwe kolommen aan het " "einde worden toegevoegd" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Songlijst" #: ../quodlibet/qltk/prefs.py:222 msgid "Edit Columns" msgstr "Kolommen bewerken" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Globale filter:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Deze opdracht toepassen bovenop alle anderen" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 msgctxt "heading" msgid "Search" msgstr "Zoek" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Browsers" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "_Meerdere waarderingen bevestigen" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Vraag voor bevestiging vooraleer de waardering van meerdere nummers tegelijk " "aan te passen" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Ee_n-klik-waarderingen inschakelen" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Waarderen door te klikken op de waardeerkolom in de songlijst inschakelen" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Waarderingen" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Verkies ing_ebedde hoes" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Gebruik de albumhoes ingebed in de audio (waar mogelijk) vóór andere bronnen" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "Vaste bestandsnaam voor a_fbeelding:" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "De te gebruiken bestandsnaam voor afbeeldingen indien geselecteerd" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "Het te gebruiken albumhoesbestand indien gedwongen" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Albumhoes" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Afspelen" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Uitvoerconfiguratie" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Schaal het volume van een nummer met deze waarde indien er geen ReplayGain-" "informatie voor aanwezig is" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "_Fall-back gain (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Schaal volume van alle nummers met deze waarde zolang er geen clipping " "optreedt bij het resultaat" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "_Pre-amp gain (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "ReplayGain volume-aanpassing inschak_elen" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "ReplayGain volume-aanpassing" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "Stan_daardbeoordeling:" #: ../quodlibet/qltk/prefs.py:493 msgid "Rating _scale:" msgstr "Waarderings_schaal:" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Bayesiaans gemiddelde-factor (C) voor geaggregeerde waarderingen.\n" "0 betekent een gebruikelijk gemiddelde, hogere waarden betekenen dat albums " "met weinig nummers minder extreme waarderingen zullen hebben. Wanneer je " "deze waarde aanpast wordt een herberekening voor alle albums uitgevoerd." #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "_Bayesiaans gemiddelde-waarde:" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Sla waarderingen en speeltellin_gen op" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_E-mail:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Beoordelingen en speeltellingen worden bewaard voor dit e-mailadres" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Tagwijzigingen automatisch opslaan" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Veranderingen aan tags opslaan zonder bevestiging bij bewerken van meerdere " "bestanden" #: ../quodlibet/qltk/prefs.py:587 #, fuzzy msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Een lijst van te gebruiken scheidingstekens bij splitsen van tagwaarden. De " "lijst wordt gescheiden door spaties" #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Tags" #: ../quodlibet/qltk/prefs.py:631 msgid "Updating for new ratings" msgstr "Bijwerken voor nieuwe waarderingen" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "Ve_rvers bibliotheek bij opstarten" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Doorzoek bibliotheek" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Controleer op wijzigingen in je bibliotheek" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Her_laad bibliotheek" #: ../quodlibet/qltk/prefs.py:661 msgid "Reload all songs in your library. This can take a long time." msgstr "Herlaad alle songs in je bibliotheek. Dit kan lang duren." #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "Scan directories" #: ../quodlibet/qltk/prefs.py:677 msgid "Hidden Songs" msgstr "Verborgen nummers" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s en %(count)d meer" msgstr[1] "%(title)s en %(count)d meer" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Eigenschappen" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Wachtrij" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "W_issen" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d nummer (%(time)s)" msgstr[1] "%(count)d nummers (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Doorzoek bibliotheek" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Wissel zichtbaarheid van hoofdvenster" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "Afspeelfout" #: ../quodlibet/qltk/quodlibetwindow.py:524 msgid "Set up library directories?" msgstr "Bibliotheekdirectories instellen?" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "Je hebt geen muziekbibliotheek ingesteld. Wil je dat nu doen?" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "_Niet nu" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "In_stellen" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Kan nummers niet toevoegen" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s gebruikt een protocol dat niet wordt ondersteund." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Ga naar spelend nummer" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Bestand" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Nummers" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Weergave" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Browsers" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Control" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Hulp" #: ../quodlibet/qltk/quodlibetwindow.py:997 msgid "_Add a Folder…" msgstr "_Een m_ap toevoegen…" #: ../quodlibet/qltk/quodlibetwindow.py:1002 msgid "_Add a File…" msgstr "Een best_and toevoegen…" #: ../quodlibet/qltk/quodlibetwindow.py:1007 msgid "_Add a Location…" msgstr "_Een loc_atie toevoegen…" #: ../quodlibet/qltk/quodlibetwindow.py:1036 msgid "Edit Bookmarks…" msgstr "Bewerk bladwijzers…" #: ../quodlibet/qltk/quodlibetwindow.py:1056 msgid "Stop After This Song" msgstr "Stop na deze song" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Online hulp" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Zoekhulp" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Voeg een locatie toe" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Voer de locatie van een audiobestand in:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Kan locatie niet toevoegen" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, python-format msgid "%s is not a valid location." msgstr "%s is geen geldige locatie." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Voeg muziek toe" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Een m_ap toevoegen…" #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Muziekspeler" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Een best_and toevoegen…" #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Ben je zeker dat je de beoordeling van alle %d nummers wil aanpassen?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "De opgeslagen beoordelingen zullen verwijderd worden" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" "De beoordeling van alle geselecteerde nummers zal veranderd worden naar '%s'" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 msgid "_Remove Rating" msgstr "Waardering ve_rwijderen" #: ../quodlibet/qltk/ratingsmenu.py:98 msgid "Change _Rating" msgstr "Waa_rdering veranderen" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Vervangen spaties door _underscores" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Verwijder _Windows-incompatibele tekens" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Verwijder _diakritische tekens" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Verwijder niet-_ASCII-tekens" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Gebruik enkel k_leine letters" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Hernoem bestanden" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Padpatronen" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 msgid "Edit saved patterns…" msgstr "Opgeslagen patronen bewerken…" #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Voorbeeld" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nieuwe naam" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Kan bestand niet hernoemen." #: ../quodlibet/qltk/renamefiles.py:256 #, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Hernoemen van <b>%(old-name)s</b> naar <b>%(new-name)s</b> mislukt. Mogelijk " "bestaat het doelbestand al of heb je geen toestemming om het nieuwe bestand " "aan te maken of het oude te verwijderen." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "_Alle fouten negeren" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Ga door" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Pad is niet absoluut" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Het patroon\n" "\t<b>%s</b>\n" "bevat / maar begint niet op root-niveau. Om verkeerd genaamde directories te " "voorkomen moet je het patroon rooten door te beginnen met de / of ~/ " "directory." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Nummers in de weergegeven mappen zullen toegevoegd worden aan je bibliotheek " "tijdens een verversen ervan" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Kies directories" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Opgeslagen zoekopdrachten" #: ../quodlibet/qltk/searchbar.py:53 msgid "Edit saved searches…" msgstr "Opgeslagen zoekopdrachten bewerken…" #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "Doorzoek je bibliotheek met vrije tekst of QL-zoekopdrachten" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Zoeken na _typen" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Toon zoekresultaten nadat de gebruiker stopt met typen." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limiet:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "Ge_wicht" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Geef resterende tijd weer" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Tekstvenster" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Focus de spelende speler" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Zoek in spelend nummer" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Kan nummers niet verwijderen" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Kan nummers niet verwijderen" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 #, fuzzy msgid "Expands the element" msgstr "Kolom uitvouw_en" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filter op %s" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "Alle _hoofdingen" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Nummerhoofdingen" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Albumhoofdingen" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Persoonhoofdingen" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Datumhoofdingen" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_Bestandshoofdingen" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Productiehoofdingen" #: ../quodlibet/qltk/songlist.py:1115 msgid "_Customize Headers…" msgstr "Hoofdin_gen aanpassen…" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "Kolom uitvouw_en" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "Plugin \"%(name)s\" uitvoeren op %(count)d nummer?" msgstr[1] "Plugin \"%(name)s\" uitvoeren op %(count)d nummers?" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "Plugin \"%(name)s\" uitvoeren op %(count)d album?" msgstr[1] "Plugin \"%(name)s\" uitvoeren op %(count)d albums?" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Zoektermen instellen…" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Voeg toe aan _wachtrij" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Kopieer naar apparaat" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "Ve_rwijder uit bibliotheek" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Vervang _underscores door spaties" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Tags met hoofdletters" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Splits in meerdere _waarden" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tags vanuit pad" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Tags vervangen bestaande tags" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Tags worden toegevoegd aan de bestaande tags" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "Opslaan" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Het patroon\n" "\t<b>%s</b>\n" "is ongeldig. Mogelijk bevat het dezelfde tag twee keer of heeft het " "ongebalanceerde haakjes (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Ongeldige tags" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Ongeldige tags <b>%s</b>\n" "\n" "De geselecteerde bestanden ondersteunen het bewerken van deze tags niet." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Het patroon dat je hebt ingevoerd is onjuist. Verifïeer dat je < en > " "hebt ingevoerd als \\< en \\> en dat de tags gebalanceerd zijn.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Bewerk weergave" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Nummer-nummers" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Begin va_n:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Totaal aantal nummers:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Afspelen/pauzeren" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Vorige" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "en %d meer…" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Slaat aangepaste songs op." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d liedjes opgeslagen\n" "(%(remaining)s resterend)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "%(current)d van %(all)d" #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Koppelpunten worden gecontroleerd" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "Verbinding" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Een speellijst genaamd %s bestaat al." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Album_hoes herladen" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "Gebruikt albumhoezen ingebed in audiobestanden." #: ../quodlibet/util/cover/built_in.py:49 msgid "Filesystem cover" msgstr "Bestandssysteemhoes" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" "Gebruikt afbeeldingen die vaak worden gebruikt in dezelfde map als het " "liedje als albumhoes." #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Toon korte gebruikersinformatie" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Toon versie en auteursrecht" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Gebruik: %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[opties]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Optie %r niet herkend." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Optie %r vereist een argument." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r is geen uniek prefix." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d seconde" msgstr[1] "%d seconden" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Geen tijdsinformatie" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d seconde" msgstr[1] "%d seconden" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuut" msgstr[1] "%d minuten" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d uur" msgstr[1] "%d uur" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d dag" msgstr[1] "%d dagen" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d jaar" msgstr[1] "%d jaren" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 msgctxt "check" msgid "titlecase?" msgstr "hoofdletters?" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "De datum moet ingevoerd worden in 'JJJJ', 'JJJJ-MM-DD' of 'JJJJ-MM-DD UU:MM:" "SS' formaat." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Replay Gain gains moeten worden ingevoerd in 'x.yy dB'-formaat." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Replay Gain peaks moeten worden ingevoerd in 'x.yy'-formaat." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz ID's moeten in UUID-formaat zijn." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz release status moet zijn: 'official', 'promotional', of " "'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Taal moet een ISO 639-2 drielettercode zijn" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Kan nummer niet aanpassen" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Opslaan van <b>%s</b> mislukt. Het bestand is read-only, corrupt, of je hebt " "geen toestemming om het aan te passen." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Ongeldige codering]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "arrangeur" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "arrangeurs" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "arrangement" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "auteur" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "auteurs" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "componist" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "componisten" #: ../quodlibet/util/tags.py:78 msgid "composition" msgstr "compositie" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "dirigenten" #: ../quodlibet/util/tags.py:80 msgid "conducting" msgstr "uitvoeren" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "contact" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "auteursrecht" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "datum" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "beschrijving" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "genre" #: ../quodlibet/util/tags.py:85 msgid "genres" msgstr "genres" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "uitvoerende" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "groeperen" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "taal" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licentie" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "locatie" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "tekstschrijver" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "tekstschrijvers" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "tekstschrijver" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organisatie" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "titel" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versie" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "website" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "albumartiest" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "discondertitel" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disc" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "nummer" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "label-ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "originele releasedatum" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "origineel album" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "originele artiest" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "opnamedatum" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "release land" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz recording ID" msgstr "MusicBrainz opname-ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz release track ID" msgstr "MusicBrainz release track-ID" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "MusicBrainz release-ID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz artist ID" msgstr "MusicBrainz artiest-ID" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz release artist ID" msgstr "MusicBrainz release artiest-ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz albumstatus" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz albumtype" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz release-ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "nummer gain" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "nummer peak" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "album gain" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "album peak" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "indicatieve geluidssterkte" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "discs" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "nummers" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "laatst gestart" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "volledige naam" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "koppelpunt" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "personen" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "jaar" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "originele release datum" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "bladwijzer" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "bestandsformaat" #: ../quodlibet/util/tags.py:165 msgid "playlists" msgstr "speellijsten" #: ../quodlibet/util/tags.py:166 #, fuzzy msgid "channel count" msgstr "Account" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "sorteren" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "rollen" #, fuzzy #~ msgid "browsers" #~ msgstr "Browsers" #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "Kon %s niet importeren. Audiofeedsbrowser uitgeschakeld." #~ msgid "Controls the tone of your music with an equalizer." #~ msgstr "Bepaalt de toon van je muziek met een equalizer." #~ msgid "Event Logging" #~ msgstr "Evenementloggen" #~ msgid "Sends song events to the Zeitgeist event logging service." #~ msgstr "Stuurt songevenementen naar de Zeitgeist evenementlogdienst." #~ msgid "Audio Backend Failed to Load" #~ msgstr "Kon de audio-backend niet laden" #~ msgid "" #~ "Loading the audio backend '%(name)s' failed. Audio playback will be " #~ "disabled." #~ msgstr "" #~ "Laden van audio-backend '%(name)s' mislukt. Afspelen van audio zal worden " #~ "uitgeschakeld." #~ msgid "_Open" #~ msgstr "_Openen" #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Een fout is opgetreden in Quod Libet. Een dumpbestand is opgeslagen in <b " #~ ">%(dump-path)s</b> dat ons zal helpen de crash te analyseren. Gelieve het " #~ "probleem te melden op %(new-issue-url)s en voeg dit bestand of de inhoud " #~ "ervan toe. Dit bestand kan identificeerbare informatie over jou of je " #~ "systeem bevatten, zoals een lijst van recent gespeelde bestanden. Als dit " #~ "niet aanvaardbaar is voor je, kan je <b>%(mini-dump-path)s</b> sturen met " #~ "een beschrijving van wat je deed toen de fout optrad." #~ msgid "" #~ "Quod Libet may now be unstable. Closing it and restarting is recommended. " #~ "Your library will be saved." #~ msgstr "" #~ "Quod Libet kan nu onstabiel zijn, het opnieuw opstarten is aangeraden. Je " #~ "bibliotheek zal worden opgeslagen." #~ msgid "Unable to download lyrics." #~ msgstr "Kan tekst niet downloaden." #~ msgid "Remove all songs from the queue" #~ msgstr "Verwijder alle nummers uit de wachtrij" #~ msgid "Watch this folder for new songs" #~ msgstr "Controleer deze map op nieuwe nummers" #~ msgid "Set or toggle the playback order" #~ msgstr "Stel de afspeelvolgorde in of wissel ze" #~ msgid "Uninitialized iPod" #~ msgstr "Ongeïnitialiseerde iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Wil je een lege database aanmaken op deze iPod?" #~ msgid "_Create Database" #~ msgstr "Database aanma_ken" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Volume gain (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Combineer tags met _meerdere waarden" #~ msgid "Model:" #~ msgstr "Model:" #~ msgid "Capacity:" #~ msgstr "Capaciteit:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Verweesd iPodnummer wordt verwijderd" #~ msgid "Saving iPod database…" #~ msgstr "iPod-database wordt opgeslagen…" #~ msgid "Unable to save iPod database" #~ msgstr "Kan iPod-database niet opslaan" #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "Kon libgpod niet vinden, iPod-ondersteuning uitgeschakeld." #~ msgid "Playback follows your selection." #~ msgstr "Afspelen volgt je selectie" #~ msgid "Track Repeat" #~ msgstr "Track herhalen" #~ msgid "Shuffle" #~ msgstr "Shuffle" #~ msgid "Weighted" #~ msgstr "Gewogen" #~ msgid "_Weighted" #~ msgstr "Ge_wogen" #~ msgid "_One Song" #~ msgstr "_Één nummer" #~ msgid "Restart the playlist when finished" #~ msgstr "Start de speellijst opnieuw nadat alle nummers gespeeld zijn" #~ msgid "Disable Browser" #~ msgstr "Zet browser uit" #~ msgid "_Disable Browser" #~ msgstr "_Zet browser uit" #~ msgid "Use header bars" #~ msgstr "Gebruik headerbars" #~ msgid "Force Write" #~ msgstr "Schrijven dwingen" #~ msgid "Filter on _Genre" #~ msgstr "Filter op _genre" #~ msgid "Filter on _Artist" #~ msgstr "Filter op _artiest" #~ msgid "Filter on Al_bum" #~ msgstr "Filter op al_bum" #~ msgid "_Music" #~ msgstr "_Muziek" #~ msgid "Add Bookmark" #~ msgstr "Bladwijzer toevoegen" #~ msgid "Song _List" #~ msgstr "Song_lijst" #, fuzzy #~ msgid "Rate the selected songs with 0-4 stars" #~ msgstr "Exporteert de gekozen songlijst naar HTML." #~ msgid "Embed cover" #~ msgstr "Albumhoes inbedden" #~ msgid "D:" #~ msgstr "D:" #~ msgid "W:" #~ msgstr "W:" #~ msgid "E:" #~ msgstr "E:" #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "Scrollwiel verandert liedje\n" #~ "Shift en scrollwiel verandert volume" #~ msgid "Stop _after this song" #~ msgstr "Stop n_a deze song" #~ msgid "_Release:" #~ msgstr "_Release:" #~ msgid "%d _release:" #~ msgid_plural "%d _releases:" #~ msgstr[0] "%d _release:" #~ msgstr[1] "%d _releases:" #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "%d resultaat gevonden." #~ msgstr[1] "%d resultaten gevonden." #~ msgid "Split _disc from album" #~ msgstr "Splits _disc van album" #~ msgid "Split _featured performers from track" #~ msgstr "Splits uit_voerenden uit track" #~ msgid "Write _labelid tag (fixes multi-disc albums)" #~ msgstr "Schrijf _labelid-tags (oplossing voor multi-disc albums)" #~ msgid "CDDB Lookup" #~ msgstr "CDDB opzoeken" #~ msgid "Looks up album information in FreeDB. Requires CDDB.py." #~ msgstr "Zoekt albuminformatie op FreeDB. Vereist CDDB.py." #~ msgid "Timeout" #~ msgstr "Time-out" #~ msgid "Query could not be executed, connection timed out" #~ msgstr "Zoekopdracht kon niet worden uitgevoerd, time-out bij verbinden" #~ msgid "Select an album" #~ msgstr "Kies een album" #~ msgid "Select the album you wish to retrieve." #~ msgstr "Kies het album dat je wil ophalen." #~ msgid "CDDB lookup failed (%s)" #~ msgstr "CDDB opzoeken mislukt (%s)" #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s en %(count)d meer…" #~ msgstr[1] "%(title)s en %(count)d meer…" #~ msgid "Send To…" #~ msgstr "Sturen naar…" #~ msgid "Generic file-opening plugin." #~ msgstr "Algemene plugin voor openen van bestanden." #~ msgid "Playlist Export" #~ msgstr "Speellijst exporteren" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "Gebr_uik ronde hoeken voor miniaturen" #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "Rondt de hoeken van albumhoezen in miniaturen af." #~ msgid "Re_fresh Library" #~ msgstr "Ver_vers bibliotheek" #~ msgid "_Remove rating" #~ msgstr "Waardering ve_rwijderen" #~ msgid "Unable to open input files" #~ msgstr "Kan invoerbestanden niet openen" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "GStreamer heeft geen element voor het lezen van bestanden. Controleer de " #~ "instellingen van je GStreamer-installatie." #~ msgid "Invalid audio backend" #~ msgstr "Ongeldige audio-backend" #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "De audio-backend '%(backend-name)s' kon niet geladen worden." #~ msgid "ql-save" #~ msgstr "ql-opslaan" #~ msgid "ql-revert" #~ msgstr "ql-omkeren" #~ msgid "command|filename" #~ msgstr "bestandsnaam" #~ msgid "command|tag" #~ msgstr "tag" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Zoek" #~ msgid "%d of %d" #~ msgstr "%d van %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Gebruik: %s %s" #~ msgid "_Download..." #~ msgstr "_Download..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Nieuw Station" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "<b>%s</b> overschrijven?" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet draait al" #~ msgid "No song is currently playing." #~ msgstr "Momenteel wordt geen song gespeelt." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Niet in staat om naar %s te schrijven." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Bewerk Bookmarks..." #~ msgid "_New Folder..." #~ msgstr "_Nieuwe Folder..." #~ msgid "_Add to Playlist" #~ msgstr "_Voeg Toe Aan Speellijst" #~ msgid "_Edit Display..." #~ msgstr "_Bewerk Weergave..." #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d station" #~ msgid "_Add a Location..." #~ msgstr "_Voeg Locatie Toe..." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Pas Headers Aan" #, fuzzy #~ msgid "Track Headers" #~ msgstr "_Trackheaders" #, fuzzy #~ msgid "People Headers" #~ msgstr "_Mensenheaders" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Albumheaders" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Datumheaders" #, fuzzy #~ msgid "File Headers" #~ msgstr "_Bestandsheaders" #, fuzzy #~ msgid "Production Headers" #~ msgstr "_Productieheaders" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Tag:" #, fuzzy #~ msgid "Warnings" #~ msgstr "_Cijfer" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "albumartiest" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "artiesten" #, fuzzy #~ msgid "album (sort)" #~ msgstr "albumartiest" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "uitvoerenden" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "uitvoerenden" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz album artiest ID" #~ msgid "errors" #~ msgstr "errors" #~ msgid "Permanently delete this file?" #~ msgstr "Permanent dit bestand verwijderen?" #~ msgid "Permanently delete these files?" #~ msgstr "Permanent deze bestanden verwijderen?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s en %(count)d meer..." #~ msgstr[1] "%(title)s en %(count)d meer..." #, fuzzy #~ msgid "Version:" #~ msgstr "versie" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "_Schoon Fouten" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s kon niet worden toegevoegd aan je collectie.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Geen verwijder commando gevonden." #~ msgid "Unable to start web browser" #~ msgstr "Niet in staat om een webbrowser te starten" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Een web browser kon niet niet gevonden worden Stel alstublieft uw " #~ "$BROWSER variabele in, of controleer that /usr/bin/sensibe-browser " #~ "bestaat." #, fuzzy #~ msgid "Library Error" #~ msgstr "Bibliotheek Browser" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Kopiëer naar device " #~ msgid "translator-credits" #~ msgstr "Hans van Dok" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Andere kopjes om weer te geven, gescheiden door spaties" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "_Ga door" #, fuzzy #~ msgid "Confirm rating" #~ msgstr "Informatie" #~ msgid "Search your library" #~ msgstr "Zoek in je audio collectie" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, en anderen\n" #~ "\n" #~ "Dit is vrije software; zie de broncode voor kopieer-voorwaarder. Er is " #~ "GEEN\n" #~ "garantie; zelfs niet voor VERKOOPBAARHEID of NUT VOOR EEN GEGEVEN DOEL.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "totale grootte:" #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet Plugins" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Geef eenvoudige zoekopdrachten weer in blauw, ingewikkelde in groen, en " #~ "ongeldige in rood" #~ msgid "_Select" #~ msgstr "_Selecteer" #~ msgid "Separators for splitting tags" #~ msgstr "Seperatoren om tags the splitsen" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet Voorkeuren" #~ msgid "Not Played To_day" #~ msgstr "Vandaag Niet Ge_speeld" #~ msgid "Not Played in a _Week" #~ msgstr "Een _Week Niet Gespeeld" #~ msgid "Not Played in a _Month" #~ msgstr "Een _Maand Niet Gespeeld" #~ msgid "B_ottom 40" #~ msgstr "_Onderste 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "De 40 songs die je het minst heb beluisterd (meer dan 40 kunnen worden " #~ "gekozen als er sprake is van gelijkspel)" #~ msgid "gtk-media-next" #~ msgstr "gtk-media-next" #~ msgid "gtk-media-previous" #~ msgstr "gtk-media-previous" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-spelend | controle ]" #, fuzzy #~ msgid "Date" #~ msgstr "Dat_um" #~ msgid "Choose New Stations" #~ msgstr "Kies Nieuwe Stations" #~ msgid "Add" #~ msgstr "Voeg toe" #, fuzzy #~ msgid "Bitrate" #~ msgstr "bitrate" #~ msgid "_Stations..." #~ msgstr "_Stations..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Verlaat Quod Libet" #~ msgid "Unable to save library" #~ msgstr "Niet in staat om collectie op te slaan" #~ msgid "Sort by title" #~ msgstr "Sorteer op titel" #~ msgid "Sort by artist" #~ msgstr "Sorteer op artiest" #~ msgid "Lyrics provided by %s." #~ msgstr "Tekst gegeven door %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Geen tekst gevonden.\n" #~ "\n" #~ "Je kunt clicken op de Download knop om Quod Libet online te laten zoeken " #~ "naar de tekst. Je kunt ze ook zelf invoeren en op save clicken. " #~ msgid "part" #~ msgstr "deel" #~ msgid "Opening audio device." #~ msgstr "Opent audio device" #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d songs opgeslagen" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz album ID" #~ msgid "Loaded song library." #~ msgstr "geladen song collectie" #~ msgid "Unable to open audio device" #~ msgstr "Niet in staat om audio device te openen" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet probeerde toegang the krijgen tot de 'autosink' en '%(sink)s' " #~ "drivers maar kon ze niet openen. Set je GStreamer pipeline door de regel\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "aan te passen in ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet kon het 'filesrc' GStreamer element niet vinden. Check je " #~ "GStreamer installatie." ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/uk.po����������������������������������������������������������������������������0000644�0001750�0001750�00000561276�13115512746�015365� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Ukrainian translation of Quod Libet # Copyright (C) 2007'S THE quodlibet'S COPYRIGHT HOLDER # This file is distributed under the same license as the Quod Libet package. # Mykola Lynnyk <pydefiner@gmail.com>, 2007. # msgid "" msgstr "" "Project-Id-Version: Quod Libet 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:33+0100\n" "Last-Translator: Mykola Lynnyk <pydefiner@gmail.com>\n" "Language-Team: Ukrainian\n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Програма для редагування тегів аудіо-файлів" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Редактор аудіо-тегів" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Програма для прослуховування і керування аудіо-колекцією" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Музичний програвач" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Назва" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Виконавець" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Дата" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "жанр" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Рейтинг" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "За датою" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Налаштування" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Список альбомів" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Список _альбомів" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Всі альбоми" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d альбом" msgstr[1] "%d альбомb" msgstr[2] "%d альбомів" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Показувати _обкладинки альбомів" msgstr[1] "Показувати _обкладинки альбомів" msgstr[2] "Показувати _обкладинки альбомів" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Пісні, що не входять в альбом" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d трек" msgstr[1] "%d треки" msgstr[2] "%d треків" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d диск" msgstr[1] "%d диски" msgstr[2] "%d дисків" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Всі альбоми" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Налаштування списку альбомів" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Показувати _обкладинки альбомів" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[параметри]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Перегляд альбомів" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Невідомо" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Новий фід" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Введіть адресу аудіо-фіду" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Аудіо-фіди" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Аудіо-фіди" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Завантажити" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Завантажити файли" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Завантажити файл" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Не вдалося додати фід" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "Не вдається додати <b>%s</b>. Можливо, вказаний сервер не працює, або адреса " "не є аудіо-фідом." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "_Оновити бібліотеку" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Видалення фалів" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Перегляд бібліотеки" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d пісня" msgstr[1] "%d пісні" msgstr[2] "%d пісень" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Неправильний шаблон" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Невідомо" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "_Розділити на кілька значень" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Інший" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Рейтинг" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Тег" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Налаштування списку альбомів" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Загальний розмір:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Загальний розмір:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Налаштування 'Вибору пісень''" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Показувати _обкладинки альбомів" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Всі альбоми" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "організація" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Файлова система" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Файлова система" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Не вдалося скопіювати пісню" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Вибрані файли не можуть бути скопійовані до іншого списку пісень або черги." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Додати до бібліотеки" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Непідтримуваний тип файлу" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Списки станцій можуть містити лише адреси станцій, але не списки станцій або " "списки програвання. Не вдалося завантажити такі станції:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Не вдалося додати станцію" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Інтернет-радіо" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Завантажити файли" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Нова станція" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Введіть адресу інтернет-радіостанції:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "рейтинг" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Нова станція" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Інтернет-радіо" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Нова станція" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_Нова станція" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Нова станція" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Станцій не знайдено" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "За адресою %s інтернет-радіостанцій не знайдено" #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Всі перелічені станції вже є в бібліотеці." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "_Додати до списку програвання" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "_Вилучити зі cписку програвання" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d станція" msgstr[1] "%(count)d станції" msgstr[2] "%(count)d станцій" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Властивості пристрою" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Пристрій:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Не змонтовано" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Точка монтування:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Назва:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Медіа-пристрої:" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Медіа-пристрої" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Витягнути" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Властивості" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Перейменувати" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> використано, <b>%s</b> наявно" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> не під'єднано" #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Копіювання <b>%s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Не вдалося скопіювати пісню" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Недостатньо вільного місця для цієї пісні." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> не може бути скопійовано." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Не вдалося видалити пісні" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Видалення <b>%s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> не може бути видалений." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Не вдалося видалити пісню" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Не вдалося витягнути <b>%s</b>." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Не вдалося витягнути пристрій" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Вибір пісень" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "В_ибір пісень" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Вибрати _все" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Всі" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Налаштування 'Вибору пісень''" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Списки програвання" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Списки програвання" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Вилучити зі cписку програвання" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Імпортувати" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Новий список програвання" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Не вдалося імпортувати список програвання" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet здатне імпортувати списки програвання тільки у форматах M3U та " "PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Не вдалося перейменувати список програвання" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Імпортувати список програвання" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Новий список програвання" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Новий список програвання" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Налаштування 'Вибору пісень''" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Списки програвання" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Введіть назву нового каталоги" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Імпортується список програвання.\n" "\n" "%d/%d пісень додано." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Обмежити результати" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Пошук в бібліотеці" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Пошук бібліотекою" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Вибір пісень" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Пошук" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "місце запису" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet не запущено." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "музична бібліотека та програвач" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[параметри]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Показати, яка пісня програється, і вийти" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Відразу почати програвання" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Перейти до наступної пісні" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Перейти до попередньої пісні" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Почати програвання" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Призупинити програвання" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Перемикнути режим програвання/паузи" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Почати програвання" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Збільшити гучність" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Зменшити гучність" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Показати стан програвача" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Сховати головне вікно" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Показати головне вікно" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Показати/сховати головне вікно" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Помістити фокус на вікно Quod Libet" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Видалити фільтри активного переглядача" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "_Оновити бібліотеку" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Вимкнути переглядач" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Показати поточний список програвання" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Показати вміст черги" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Показати вміст черги" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet не запущено." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Вийти з Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Переміститись всередині відтворюваної пісні" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][ГГ:]ХХ:СС" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Перемикнути режим програвання/паузи" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Увімкнути/вимкнути/перемикнути повторення" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Встановити гучність" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Шукати в бібліотеці" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "запит" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Відтворити файл" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "назва файлу" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Оцінити відтворювану пісню" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Встановити режим перегляду бібліотеки" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Оцінити відтворювану пісню" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Відкрити новий переглядач" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Показати/сховати чергу" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Показати/сховати список пісень" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Фільтрувати за випадковим параметром" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Тег" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Фільтрувати за тегом" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "тег=значення" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Додати в чергу файл або результат пошуку" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "назва файлу" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Видалити з черги файл або результат пошуку" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Неправильний аргумент для '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Спробуйте %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Невідомий пристрій" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s' неоднозначний" #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "Неправильне значення" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Шаблон назви файлу:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Копіювати обкладинки _альбомів" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Видалити невикористовувані обкладинки та каталоги" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "_Помилки" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "опис" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "програма для редагування аудіо-тегів" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "каталог" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Неправильне кодування]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Назва" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Редактор аудіо-тегів" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "Замінити першу букву кожного слова великою" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Налаштування 'Вибору пісень''" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Загальний розмір:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "За _оцінками" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Попередній перегляд" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d секунда" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Інший" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "_Очистити помилки" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Музичний програвач" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Інтернет-радіо" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Рейтинг" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Не вдалося зберегти пісню" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Розширень не знайдено" #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Текст пісні" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Очистити поле пошуку" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Текст пісні" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "місце запису" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Сховати головне вікно" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Налаштування" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "шаблон" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "шаблон" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d пісня" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Інформація" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "шаблон" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "місце запису" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Назва" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Пристрій:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Назва:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Інші:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Виконавець" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Шаблон назви файлу:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Випадковий _альбом" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "альбоми" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "За _оцінками" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Випадковий _альбом" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Імпортувати список програвання" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Імпортувати" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Текст пісні" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Не грає" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d пісня" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "шаблон" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Не грає" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "_Списки програвання" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Програвач" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_Попередній перегляд" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Випадково" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Повторювати" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Зупинитись після цієї пісні" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Відкрити новий переглядач" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Редагувати _теги" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Інформація" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Списки програвання" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Текст пісні" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Текст пісні" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Помилки" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Файли" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Попередній перегляд" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Фільтрувати за _виконавцем" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Інший" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Фільтрувати за _жанром" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Фільтрувати за _виконавцем" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Аудіо-фіди" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Введіть адресу аудіо-фіду" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Імпортувати список програвання" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Імпортувати" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Станцій не знайдено" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Шаблон назви файлу:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Шаблон назви файлу:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "_Вилучити зі cписку програвання" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Новий список програвання" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "востаннє відтворено" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "_Черга" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Ніколи" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Немає пісень" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Збережені значення" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Перейменувати" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Бібліотека" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Сховати головне вікно" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Назва файлу" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Не вдалося зберегти пісню" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Список альбомів" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Розмір" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Пошук" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Пошук" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Список альбомів" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Редагувати закладки..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Редагувати закладки..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Закладки" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "Тип альбому MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Назва файлу" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Диск" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Трек" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Назва" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "_Виконавець" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "Тип альбому MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "запит" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Пошук" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Розширень не знайдено" #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Вибір пісень" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Не вдалося створити каталог" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "команда|тег" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Перейменувати" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "команда|тег" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Неправильний шаблон" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Неправильне значення" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Інший" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Не вдалося скопіювати пісню" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Вимкнути переглядач" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "_Рейтинг" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_Рейтинг" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "_Рейтинг" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Фільтрувати за тегом" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Фільтрувати за _жанром" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Черга" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Записати" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "каталог" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "_Альбом" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Нова станція" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Імпортувати список програвання" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Перейменувати" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Імпортувати список програвання" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Інформація" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Імпортувати список програвання" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Не вдалося імпортувати список програвання" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Не вдалося витягнути <b>%s</b>." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "_Оновити бібліотеку" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "_Оновити бібліотеку" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Редагувати теги" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Редагувати теги" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Всі альбоми" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Попередній перегляд" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Тег" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Не вдалося видалити пісні" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Пошук" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "шаблон" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Редагувати збережені параметри..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "_Виділяти кольором критерій пошуку" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Бібліотека" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Перевірка точок монтування" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Сканування бібліотеки" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Сканування %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Показувати _програмні теги" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "опис" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Значення" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Редактор аудіо-тегів" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Не вибрано жодної пісні" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Фільтрувати за тегом" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Фільтрувати за тегом" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Немає інформації про час" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Не вдалося перейменувати файл" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Файл" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Вивести коротку інформацію з користування" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> не є правильною адресою." #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "Невідомо" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "По порядку" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_По порядку" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Випадково" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Випадково" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Повторювати" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Одна пісня" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d секунда" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Станцій не знайдено" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "Не вдалося створити каталог" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Розширення" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Підтримуються формати: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Аудіо-пристрій: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Початок" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "Немає" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Час" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Назва закладки" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "ХХ:СС" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Закладки" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Фільтри" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "Що _ніколи не відтворювались" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 _кращих" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Нова станція" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Випадковий _жанр" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Випадковий _виконавець" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Випадковий _альбом" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 пісень, що відтворювались найчастіше (може бути вибрано більше 40,якщо є " "пісні, що відтворювались однакову кількість разів)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Значення:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Збережені значення" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Редагувати збережені параметри..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "_Трек" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "_Альбом" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Корегування гучності Replay Gain" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Невідомо" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Фільтрувати за тегом" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Файли" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Видалення фалів" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Перемістити в Trash" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Перенесення %d/%d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "Не вдалося зберегти базу iPod" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Не вдалося витягнути <b>%s</b>." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Видалення %d/%d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Не вдалося видалити файл" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Не вдалося видалити <b>%s</b>." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Завантаження" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Розмір" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "відсутнє у %d пісні" msgstr[1] "відсутнє у %d пісень" msgstr[2] "відсутнє у %d пісень" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "різне у %d пісні" msgstr[1] "різне у %d пісень" msgstr[2] "різне у %d пісень" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "_Розділити на кілька значень" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Відділити номер диску від альбому" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Відділити _версію від назви" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Відділити аранжувальника від _виконавця" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Відділити поле \"виконавець \" від поля \"артист\"" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Відділити поле \"виконавець \" від поля \"артист\"" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Відділити _версію від назви" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Додати тег" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Тег" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Редагувати теги" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Показувати _програмні теги" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Ніколи" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Не вдалося додати тег" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Не вдалося додати пісню" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Не вдалося додати <b>%s</b>\n" "\n" "Вибрані файли не підтримують множинні значення." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Неправильний тег" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Неправильний тег <b>%s</b>\n" "\n" "Вибрані файли не підтримують редагування цього тега." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Неправильне значення" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Неправильне значення: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Тег може бути невірним" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> змінився, поки ви працювали. Збереження змін без оновлення " "бібліотеки може призвести до перезапису інших змін. \n" "\n" "Зберегти пісню незважаючи на це?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Не вдалося зберегти пісню" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Не вдалося зберегти <b>%s</b>. Можливо, файл відкритий тільки для читання, " "зіпсовано, або у вас недостатньо прав на його зміну." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Додаткові параметри..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Розширення" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s та %(count)d інших" msgstr[1] "%(title)s та %(count)d інших" msgstr[2] "%(title)s та %(count)d інших" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Налаштування Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "_Розділяти по:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Редагування тегів" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Каталоги" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Створення каталогу" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Вибрати всі підкаталоги" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Створення каталогу" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Введіть назву нового каталоги" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Не вдалося створити каталог" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Не вдалося видалити каталог" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Пісні" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "%s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Диск %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Трек %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Не вибрано жодної пісні" #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Немає пісень" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Інформація" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Текст пісні" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Продюсер: %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "артист" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "виконавці" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "виконавці" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Ніколи" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d раз" msgstr[1] "%d рази" msgstr[2] "%d разів" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "доданий" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "востаннє відтворено" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "відтворень" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "перервано" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "рейтинг" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "тривалість" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Інформація" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[Неправильне кодування]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "бітрейт" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "розмір файлу" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "змінено" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d вибрано" msgstr[1] "%d вибрано" msgstr[2] "%d вибрано" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Трек недоступний" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Список треків" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d пісня з невказаним альбомом" msgstr[1] "%d пісні з невказаним альбомом" msgstr[2] "%d пісень з невказаним альбомом" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Вибрані альбоми" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d пісня з невказаним виконавцем" msgstr[1] "%d пісні з невказаним виконавцем" msgstr[2] "%d пісень з невказаним виконавцем" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "альбоми" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Загальна тривалість:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Загальний розмір:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Файли" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Завантажити" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Змінити зовнішній вигляд..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Для цієї пісні текст не знайдено." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Пошук тексту пісні..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Скасувати зміни в тегу?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Теги було змінено, але зміни не були збережені. Зберегти їх чи повернути " "зміни?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Ніколи" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Файл існує" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Перейменувати файли" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Перемикнути режим програвання/паузи" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Перемикнути режим програвання/паузи" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Помилки розширень" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "Вимкнути переглядач" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Порядок:" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Редагування тегів" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Загальний розмір:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Розширень не знайдено" #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Розширення" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "_Помилки" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Диск" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Номер треку" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "групування" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "_Альбом" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Назва _файлу" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Тривалість" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "" "Автоматично переходити _до відтворюваної \n" "пісні" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "При зміні пісні переходити до неї в списку програвання" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Інші:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Змінити зовнішній вигляд..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Стовпець" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Назва включає _версію" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Назва включає _версію" #: ../quodlibet/qltk/prefs.py:108 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Альбом включає _частину" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Назва файлу включає _каталог" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Налаштування" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Список пісень" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Стовпець" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Загальний фільтр" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Пошук" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Вибір пісень" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "При зміні пісні переходити до неї в списку програвання" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "_Рейтинг" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Список альбомів" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Призупинити програвання" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Приріст гучності (дБ):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Приріст гучності (дБ):" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "Корегування гучності Replay Gain" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "Корегування гучності Replay Gain" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "_Рейтинг" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "Зберігати рейтинги та лічильники програвань" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Електронна пошта:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Рейтинги та лічильники програвань будуть прив'язані до цієї адреси" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Скасувати зміни в тегу?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Редагувати теги" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Нова станція" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "_Оновити бібліотеку" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Пошук бібліотекою" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Перевірити наявність змін в бібліотеці" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "_Перезавантажити бібліотеку" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Перезавантажити всі пісні в бібліотеці (це може зайняти багато часу)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "_Сканувати каталоги" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Немає пісень" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, fuzzy, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s та %(count)d інших" msgstr[1] "%(title)s та %(count)d інших" msgstr[2] "%(title)s та %(count)d інших" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Властивості" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Черга" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Очистити помилки" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d пісня (%(time)s)" msgstr[1] "%(count)d пісні (%(time)s)" msgstr[2] "%(count)d пісень (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Переглянути бібліотеку" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Показати/сховати головне вікно" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Призупинити програвання" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Вибір каталогів" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Не вдається додати пісні" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> використовує протокол, що не підтримується." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Перейти до відтворюваної пісні" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Файл" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Пісні" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Вигляд" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Вибір пісень" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Керування" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Довідка" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "_Додати каталог..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "_Додати файл..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Додати адресу" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Редагувати закладки..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Зупинитись після цієї пісні" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Пошук" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Додати адресу" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Введіть адресу аудіо-файлу:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Не вдалося додати адресу" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> не є правильною адресою." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Додати музику" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Додати каталог..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Музичний програвач" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Додати файл..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Рейтинг" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Рейтинг" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Замінити пробіли на підкреслення" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Замінити _Windows-несумісні символи" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Замінити _діакритичні знаки" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Замінити не-_ASCII символи" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Перейменувати файли" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "шаблон" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Редагувати збережені параметри..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Попередній перегляд" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Нова назва" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Не вдалося перейменувати файл" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Не вдалося перейменувати <b>%s</b> на <b>%s</b>. Можливо, цільовий файл вже " "існує, або ви не маєте прав для створення нового чи видалення старого файлу." #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "_Помилки" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Продовжити" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Неабсолютний шлях" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Шаблон\n" "\t<b>%s</b>\n" "містить /, але починається не з кореневого каталогу. Для запобігання помилок " "в назвах каталогів, почніть шаблон з кореневого каталогу." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Пісні, розташовані в цих каталогах (розділені ':'), будуть додані до " "бібліотеки" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Вибір каталогів" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Збережені значення" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Редагувати збережені параметри..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "Зупинитись після цієї пісні" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Обмеження:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "За _оцінками" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Відображати час, що лишився" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Текст пісні" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Помістити фокус на вікно Quod Libet" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Переміститись всередині відтворюваної пісні" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Не вдалося видалити пісні" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Не вдалося видалити пісні" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Фільтрувати по %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "_Альбом" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Трек" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Альбом" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Люди" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Дата" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_Файл" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Виробництво" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Налаштувати заголовки..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "_Виділяти кольором критерій пошуку" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Додати до _черги" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Копіювати до пристрою" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Вилучити зі cписку програвання" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Замінити підкреслення на пробіл" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Замінити першу букву кожного слова великою" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "_Розділити на кілька значень" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Теги з імен файлів" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Теги замінять існуючі" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Теги будуть додані до існуючих" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Шаблон\n" "\t<b>%s</b>\n" "є недопустимим. Можливо, він містить незакриті лапки (< / >) або " "повторений двічі тег." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Неправильні теги" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Недопустимі теги <b>%s</b>\n" "\n" "Вибрані файли не підтримують редагування цих тегів." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Введений вами шаблон є невірним. Переконайтесь, що ви ввели < та > як " "\\< и \\>, а також що відкриті теги вже закриті.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Змінити зовнішній вигляд" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Номери треків" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Починати _з:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Всього треків:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Програвач" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_Попередній перегляд" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "%d інших..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Збереження змінених вами пісень." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Перенесення %d/%d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Перевірка точок монтування" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "місце запису" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Список програвання %s вже існує." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Показувати _обкладинки альбомів" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Файлова система" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Вивести коротку інформацію з користування" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Вивести версію та інформацію про авторські права" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[параметри]" #: ../quodlibet/util/__init__.py:182 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: Невідомий параметр '%s'" #: ../quodlibet/util/__init__.py:185 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: Параметр '%s' вимагає аргументу." #: ../quodlibet/util/__init__.py:188 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: '%s' неоднозначний" #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d Кбіт/с" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d секунда" msgstr[1] "%d секунди" msgstr[2] "%d секунд" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Немає інформації про час" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d секунда" msgstr[1] "%d секунди" msgstr[2] "%d секунд" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d хвилина" msgstr[1] "%d хвилини" msgstr[2] "%d хвилин" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d година" msgstr[1] "%d години" msgstr[2] "%d годин" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d день" msgstr[1] "%d дні" msgstr[2] "%d днів" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d рік" msgstr[1] "%d роки" msgstr[2] "%d років" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Дату слід вводити в форматі 'РРРР', 'РРРР-ММ-ДД' або 'РРРР-ММ-ДД ГГ:ХХ:СС'" #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Підсилення Replay Gain слід вводити в форматі 'x.yy dB'." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Піки Replay Gain слід вводити в форматі 'x.yy'" #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "" "Ідентифікатори MusicBrainz повинні бути в форматі UUID (унікальний " "ідентифікатор)." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Статус випуску MusicBrainz повинен бути 'official', 'promotional', або ж " "'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Не вдалося редагувати пісню" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Не вдалося зберегти <b>%s</b>. Можливо, файл відкритий тільки для читання, " "зіпсовано, або у вас недостатньо прав на його зміну." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Неправильне кодування]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "альбом" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "аранжувальник" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "аранжувальники" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "аранжувальник" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "автор" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "автори" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "композитор" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "композитори" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "композитор" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "диригент" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "диригенти" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "диригент" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "зв'язок" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "авторське право" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "дата" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "опис" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "жанр" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "жанр" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "виконавець" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "групування" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "мова" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "ліцензія" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "місце запису" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "автор слів" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "автори слів" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "автор слів" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "організація" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "назва" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "версія" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "веб-сайт" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "автор альбому" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "ударів на хвилину" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "диск" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "трек" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "ID видавця" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "оригінальна дата випуску" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "оригінальний альбом" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "оригінальний виконавець" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "дата запису" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "країна випуску" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "Ідентифікатор виконавця MusicBrainz" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "Ідентифікатор треку MusicBrainz" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "Ідентифікатор TRM MusicBrainz" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "Статус альбому MusicBrainz" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "Тип альбому MusicBrainz" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "Ідентифікатор треку MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "підсилення треку" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "пік треку" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "підсилення альбому" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "пік альбому" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Налаштування" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "диски" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "треки" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "востаннє запущено" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "повна назва" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "точка монтування" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "люди" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "рік" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "оригінальна дата випуску" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "Закладки" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "формат" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Списки програвання" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Вибір пісень" #~ msgid "Unable to download lyrics." #~ msgstr "Не вдалося завантажити текст пісні." #~ msgid "Remove all songs from the queue" #~ msgstr "Видалити всі пісні з черги" #~ msgid "Watch this folder for new songs" #~ msgstr "Слідкувати за появою нових пісень в цьому каталозі" #~ msgid "Set or toggle the playback order" #~ msgstr "Перемикнути порядок програвання" #~ msgid "Uninitialized iPod" #~ msgstr "Неініціалізований iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Бажаєте створити порожню базу на цьому iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "Приріст гучності (дБ):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Комбінувати теги з _різними значеннями" #~ msgid "Model:" #~ msgstr "Модель:" #~ msgid "Capacity:" #~ msgstr "Ємність:" #~ msgid "Firmware:" #~ msgstr "Мікропрограми:" #, fuzzy #~ msgid "Removing orphaned iPod track" #~ msgstr "W: видалення 'самотнього' треку iPod" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Не вдалося зберегти базу iPod" #~ msgid "Unable to save iPod database" #~ msgstr "Не вдалося зберегти базу iPod" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "пік треку" #~ msgid "Shuffle" #~ msgstr "Випадково" #~ msgid "Weighted" #~ msgstr "За оцінками" #~ msgid "_Weighted" #~ msgstr "_За оцінками" #~ msgid "_One Song" #~ msgstr "_Одна пісня" #~ msgid "Restart the playlist when finished" #~ msgstr "Почати спочатку після програвання всіх пісень" #~ msgid "Disable Browser" #~ msgstr "Вимкнути переглядач" #~ msgid "_Disable Browser" #~ msgstr "_Вимкнути переглядач" #, fuzzy #~ msgid "Force Write" #~ msgstr "Записати" #~ msgid "Filter on _Genre" #~ msgstr "Фільтрувати за _жанром" #~ msgid "Filter on _Artist" #~ msgstr "Фільтрувати за _виконавцем" #~ msgid "Filter on Al_bum" #~ msgstr "Фільтрувати за _альбомом" #~ msgid "_Music" #~ msgstr "_Музика" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Закладки" #~ msgid "Song _List" #~ msgstr "Список пісень" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Зупинитись після цієї пісні" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "%d інших..." #~ msgstr[1] "%d інших..." #~ msgstr[2] "%d інших..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Відділити номер диску від альбому" #, fuzzy #~ msgid "Timeout" #~ msgstr "Час" #, fuzzy #~ msgid "Select an album" #~ msgstr "Вибрати _все" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s та %(count)d інших" #~ msgstr[1] "%(title)s та %(count)d інших" #~ msgstr[2] "%(title)s та %(count)d інших" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Списки програвання" #~ msgid "Re_fresh Library" #~ msgstr "_Оновити бібліотеку" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Рейтинг" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Не вдалося відкрити файл" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Неправильне значення" #, fuzzy #~ msgid "ql-revert" #~ msgstr "_Видалити з бібліотеки" #~ msgid "command|filename" #~ msgstr "команда|назва файлу" #~ msgid "command|tag" #~ msgstr "команда|тег" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Пошук" #~ msgid "%d of %d" #~ msgstr "%d з %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Використання: %s %s" #~ msgid "_Download..." #~ msgstr "_Завантажити..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Нова станція" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Перезаписати <b>%s</b>?" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet вже запущено." #~ msgid "No song is currently playing." #~ msgstr "На даний момент програвання не відбувається." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Запис в %s не є можливим, файл буде видалено." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Редагувати закладки..." #~ msgid "_New Folder..." #~ msgstr "_Створити каталог..." #~ msgid "_Add to Playlist" #~ msgstr "_Додати до списку програвання" #~ msgid "_Edit Display..." #~ msgstr "_Змінити зовнішній вигляд..." #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d станція" #~ msgid "_Add a Location..." #~ msgstr "_Додати адресу..." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Налаштувати заголовки..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "_Трек" #, fuzzy #~ msgid "People Headers" #~ msgstr "_Люди" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Альбом" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Дата" #, fuzzy #~ msgid "File Headers" #~ msgstr "_Файл" #, fuzzy #~ msgid "Production Headers" #~ msgstr "_Виробництво" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Тег" #, fuzzy #~ msgid "Warnings" #~ msgstr "_Рейтинг" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "автор альбому" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "виконавці" #, fuzzy #~ msgid "album (sort)" #~ msgstr "автор альбому" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "виконавці" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "виконавці" #~ msgid "MusicBrainz album artist ID" #~ msgstr "Ідентифікатор альбому MusicBrainz" #~ msgid "errors" #~ msgstr "помилки" #~ msgid "Permanently delete this file?" #~ msgstr "Назавжди видалити цей файл?" #~ msgid "Permanently delete these files?" #~ msgstr "Назавжди видалити ці файли?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s та %(count)d інших..." #~ msgstr[1] "%(title)s та %(count)d інших..." #~ msgstr[2] "%(title)s та %(count)d інших..." #, fuzzy #~ msgid "Version:" #~ msgstr "версія" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "_Очистити помилки" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "Не вдалося додати %s в бібліотеку.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Не знайдено команди для витягування" #~ msgid "Unable to start web browser" #~ msgstr "Не вдалося запустити веб-бровзер" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Не вдалося знайти веб-бровзер. Присвойте змінній $BROWSER значення,або " #~ "переконайтесь, що /usr/bin/sensible-browser існує." #, fuzzy #~ msgid "Library Error" #~ msgstr "Перегляд бібліотеки" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Копіювати до пристрою" #~ msgid "translator-credits" #~ msgstr "Микола 'Cthulhu' Линник <pydefiner@gmail.com>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Інші стовпці до відображення, через пробіл" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "_Продовжити" #~ msgid "Search your library" #~ msgstr "Шукати в бібліотеці" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Загальний розмір:" #~ msgid "Quod Libet Plugins" #~ msgstr "Розширення Quod Libet" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Виділяти простий пошук синім кольором, розширений - зеленим, неправильний " #~ "- червоним" #~ msgid "_Select" #~ msgstr "_Вибрати" #~ msgid "Separators for splitting tags" #~ msgstr "Символи розділення тегів" #~ msgid "Quod Libet Preferences" #~ msgstr "Налаштування Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Що не відтворювались _сьогодні" #~ msgid "Not Played in a _Week" #~ msgstr "Що не відтворювались _тиждень" #~ msgid "Not Played in a _Month" #~ msgstr "Що не відтворювались _місяць" #~ msgid "B_ottom 40" #~ msgstr "40 _гірших" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "40 пісень, що відтворювались найрідше (може бути вибрано більше 40,якщо є " #~ "пісні, що відтворювались однакову кількість разів)" #, fuzzy #~ msgid "Date" #~ msgstr "_Дата" #~ msgid "Choose New Stations" #~ msgstr "Виберіть нові станції" #~ msgid "Add" #~ msgstr "Додати" #, fuzzy #~ msgid "Bitrate" #~ msgstr "бітрейт" #~ msgid "_Stations..." #~ msgstr "_Станції..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Вийти з Quod Libet" #~ msgid "Unable to save library" #~ msgstr "Не вдалося зберегти бібліотеку" #~ msgid "Sort by title" #~ msgstr "За назвою" #~ msgid "Sort by artist" #~ msgstr "За виконавцем" #~ msgid "Lyrics provided by %s." #~ msgstr "Текст пісні наданий %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Текст пісні не знайдено.\n" #~ "\n" #~ "Ви можете натиснути кнопку Завантажити, щоб Quod Libet спробував знайти " #~ "текст пісні в Інтернеті. Також ви можете ввести текст самостійно, і потім " #~ "натиснути Зберегти." #~ msgid "part" #~ msgstr "частина" #~ msgid "Opening audio device." #~ msgstr "Відкриваю аудіо-пристрій" #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d пісень збережено" #~ msgid "MusicBrainz album ID" #~ msgstr "Ідентифікатор альбому MusicBrainz" #~ msgid "Loaded song library." #~ msgstr "Бібліотеку пісень завантажено" #~ msgid "Unable to open audio device" #~ msgstr "Не вдалося відкрити аудіо-пристрої" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet спробував отримати доступ до драйверів 'autosink' та " #~ "'%(sink)s', але не зміг відкрити їх. Встановіть GStreamer pipeline, " #~ "змінивши рядок\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "в in ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet не зміг знайти елемент 'filesrc' GStramer. Перевірте вашу " #~ "інсталяцію GStramer." ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/he.po����������������������������������������������������������������������������0000644�0001750�0001750�00000541636�13115512746�015340� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Hebrew translation of QuodLibet. # Copyright (C) 2005 THE QuodLibet'S COPYRIGHT HOLDER # This file is distributed under the same license as the QuodLibet package. # johnny5 <johnny5@hde.co.il>, 2005. # # msgid "" msgstr "" "Project-Id-Version: Quod Libet 0.16\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:34+0100\n" "Last-Translator: \n" "Language-Team: Hebrew\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "הכנס את כתובת האינטנרט של קובץ המוסיקה" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "עורך תגיות שירים" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "האזן, עיין וערוך את אוסף המוסיקה שלך" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "נגן מוסיקה" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "שם" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "א_מן" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "ת_אריך" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "סגנון" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "ד_ירוג" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "מיין לפי תאריך" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "מאפיינים" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "רשימת אלבומים" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "רשימת א_לבומים" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "כל האלבומים" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d אלבום" msgstr[1] "%d אלבומים" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "ה_צג עטיפות אלבומים" msgstr[1] "ה_צג עטיפות אלבומים" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "שירים ללא אלבום" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d רצועה" msgstr[1] "%d רצועות" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d תקליטור" msgstr[1] "%d תקליטורים" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "כל האלבומים" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "מאפייני רשימת אלבומים" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "ה_צג עטיפות אלבומים" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "מיקום" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "תצוגת אלבום" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "לא ידוע" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "ערוץ חדש" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "הכנס את הכתובת אינטנרט של ערוץ השמע" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "ערוצי שמע" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_ערוצי שמע" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "הורד_" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "הורד קבצים" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "הורד קובץ" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "לא ניתן להוסיף את הערוץ המבוקש" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "לא ניתן היה לוסיף את <b>%s</b>. יתכן שהשרת לא זמין כעת או שהנתיב אינו נתיב " "לערוץ שמע" #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "_רענן ספרית שירים" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "מחק קבצים" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "דפדפן הספריה" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "שיר %d" msgstr[1] "%d שירים" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "תבנית שגויה" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "לא ידוע" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "פצל ל_ערכים נפרדים" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_חופשי" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_הסר תחנה" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "תגית" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "מאפייני רשימת אלבומים" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "גודל כללי:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "גודל כללי:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "מאפייני דיפדוף חלוניות" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "ה_צג עטיפות אלבומים" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "כל האלבומים" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "אין תחנות חדשות" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "מערכת קבצים" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_מערכת קבצים" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "לא ניתן להעתיק את השיר" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "לא ניתן להעביר את השירים שנבחרו לרשימת ניגון או לסדר ההשמעה." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_הוסף לספרית השירים" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "תסדיר זה אינו נתמך" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "רשימות תחנות יכולות להכיל רק תחנות ולא רשימת תחנות אחרת או רשימת השמעה. " "הנתיבים הבאים אינם יכולים להיטען: /n%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "לא ניתן להוסיף תחנה" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "רדיו אינטרנט" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "הורד קבצים" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "תחנה חדשה" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "הכנס את הכתובת אינטנרט של התחנה" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "דירוג" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_תחנה חדשה" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "רדיו _אינטרנט" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "תחנה חדשה" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_תחנה חדשה" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "תחנה חדשה" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "לא נמצאו תחנות" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "לא נמצאו תחנות ב %s" #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "כל התחנות שנבחרו כבר נמצאות בספריה שלך" #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "הוסף לרשימת _ניגון" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "ה_סר מרשימת הניגון" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d תחנה" msgstr[1] "%(count)d תחנות" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "מאפייני התקן" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "התקן:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "לא מעוגן" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "נקודת עגינה:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "ש_ם:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "התקני שמע" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "התקני _שמע" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_נתק" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "מאפיינים" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_שנה שם" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "נפח בשימוש <b>%s</b>, פנוי <b>%s</b>" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "ההתקן <b>%s</b> אינו מחובר" #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "מעתיק את <b>%s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "לא ניתן להעתיק את השיר" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "אין מספיק מקום פנוי על מנת להעביר את השיר" #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "לא ניתן להעתיק את <b>%s</b>" #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "לא ניתן למחוק את השיר" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "מוחק את <b>%s</b> " #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "לא ניתן למחוק את <b>%s</b>" #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "לא ניתן למחוק את השיר" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "ניתוק <b>%s</b> נכשל" #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "לא ניתן לנתק את ההתקן" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "תצוגת חלוניות" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_תצוגת חלוניות" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "ב_חר הכל" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "הכל" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "מאפייני דיפדוף חלוניות" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "רשימות ניגון" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_רשימות ניגון" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "ה_סר מרשימת הניגון" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "יי_בא" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "רשימת ניגון חדשה" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "לא ניתן לייבא את רשימת הניגון" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet מסוגל לייבא רק רשימון ניגון מסוג M3U או PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "לא ניתן לשנות שם לרשימת הניגון" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "ייבא רשימת ניגון" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_רשימת ניגון חדשה" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "רשימת ניגון חדשה" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "מאפייני דיפדוף חלוניות" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "רשימות ניגון" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "הזן שם עבור התיקיה החדשה:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "מייבא רשימת ניגון\n" "עד כה נוספו %d/%d שירים" #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "ה_גבל תוצאות" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "חפש בספרית השירים" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_חפש בספרית השירים" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "תצוגת חלוניות" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "חפש" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "מיקום" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "" # If not in command line # msgstr "לא ניתן לכתוב אל %s ולכן הוא הוסר" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "מיקום" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "_רענן ספרית שירים" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "הסתר דפדפן שירים" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "" #: ../quodlibet/cli.py:113 msgid "Print the active text query" msgstr "" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 msgid "Start Quod Libet if it isn't running" msgstr "" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "" #: ../quodlibet/cli.py:122 msgid "Set or toggle shuffle mode" msgstr "" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "שם קובץ" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "עצור לאחר השיר הנוכחי" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "" #: ../quodlibet/cli.py:133 msgid "Show or hide the main song list (deprecated)" msgstr "" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "תגית" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "שם קובץ" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "" #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "" #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "התקן לא ידוע" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "" #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "ערך שגוי" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_תבנית שם קובץ:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "ה_עתק עטיפות אלבומים" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "ה_סר תיקיות ועטיפות אלבום שאינן בשימוש" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "הצג שגיא_ות" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "תיאור" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "עורך תגיות שירים" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "ספריה" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[קידוד לא נתמך]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "שם" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "עורך תגיות שירים" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_שנה לאות גדולה ראשונה בכל מילה" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "מאפייני דיפדוף חלוניות" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "גודל כללי:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "תצוגת עריכה" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "לפי _דירוג" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "תצוגת עריכה" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_תצוגה מקדימה" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d שניה" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_חופשי" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "שגיאות בהרחבות" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "נגן מוסיקה" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "רדיו אינטרנט" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "ד_ירוג" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "לא ניתן לשמור שיר" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "לא נמצאו הרחבות" #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "מילים" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "נקה חיפוש" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "מילים" #: ../quodlibet/ext/events/lyricswindow.py:348 #, fuzzy msgid "Shows a window containing lyrics of the playing song." msgstr "הצג וערוך תגיות בשיר נוכחי" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "מיקום" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "מאפיינים" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "תבנית" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "תבנית" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "שיר %d" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "מידע" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "תבנית" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "מיקום" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "שם" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 #, fuzzy msgid "Show notifications" msgstr "אין תחנות חדשות" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 #, fuzzy msgid "Song Notifications" msgstr "אין תחנות חדשות" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "התקן:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "ש_ם:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "אח_רים" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "א_מן" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_תבנית שם קובץ:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "אל_בום אקראי" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "אלבומים" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "לפי _דירוג" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "אל_בום אקראי" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "ייבא רשימת ניגון" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "יי_בא" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "מילים" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "לא מנגן" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "שיר %d" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "תבנית" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "לא מנגן" #: ../quodlibet/ext/events/trayicon/__init__.py:53 #, fuzzy msgid "Tray Icon" msgstr "מאפייני צלמית מגש המערכת" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "_רשימות ניגון" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "נגן" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_תצוגה מקדימה" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_מעורבב" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_חזור" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "עצור לאחר השיר הנוכחי" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "תצוגת חלוניות" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "ע_רוך תגיות" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "מי_דע" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "רשימות ניגון" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 #, fuzzy msgid "Scroll wheel adjusts volume" msgstr "" "השתמש בגלילת העכבר לשינוי עוצמת הקול\n" "לחיצה על Shift וגלילת עכבר יחד להחלפת שיר" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 #, fuzzy msgid "Scroll _Wheel" msgstr "גלילת עכבר" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "תצוגת בלון" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "מילים" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "מילים" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "הצג שגיא_ות" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "קבצים" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_תצוגה מקדימה" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "סנן לפי _אמן" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_חופשי" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "סנן לפי _סגנון" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "סנן לפי _אמן" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "ערוצי שמע" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "הכנס את הכתובת אינטנרט של ערוץ השמע" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "ייבא רשימת ניגון" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "יי_בא" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "לא נמצאו תחנות" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_תבנית שם קובץ:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_תבנית שם קובץ:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "רשימת ניגון חדשה" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "הושמע לאחרונה" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "_סדר השמעה" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "מעולם לא" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "ללא שירים" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "ערכים שמורים" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_שנה שם" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "ספריה" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "שם קובץ" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "לא ניתן לשמור שיר" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "רשימת אלבומים" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "גודל" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "חפש:_" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "חפש" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "רשימת אלבומים" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_ערוך סימניות" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_ערוך סימניות" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "סימניות" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "סימון סוג אלבום של MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "שם קובץ" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_תקליטור" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "רצועה" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "שם" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "א_מן" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "סימון סוג אלבום של MusicBrainz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "_סדר השמעה" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "חפש" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "לא נמצאו הרחבות" #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "דפדפנים" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "לא ניתן ליצור תיקיה חדשה" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_שנה שם" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "תבנית שגויה" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "ערך שגוי" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_חופשי" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "לא ניתן להעתיק את השיר" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "הסתר דפדפן שירים" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Duplicate Key" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_הסר תחנה" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "תצוגת עריכה" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "הסר תגית נבחרת" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "סנן לפי א_לבום" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "לא ניתן לטעון את השיר המבוקש" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "סנן לפי _סגנון" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_סדר השמעה" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "שמור" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "ספריה" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "כ_ותרות אלבומים" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_תחנה חדשה" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "ייבא רשימת ניגון" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_שנה שם" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "ייבא רשימת ניגון" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "מידע" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "ייבא רשימת ניגון" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "לא ניתן לייבא את רשימת הניגון" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "ניתוק <b>%s</b> נכשל" #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "_רענן ספרית שירים" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "_רענן ספרית שירים" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "ערוך תגיות" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "ערוך תגיות" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "כל האלבומים" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_תצוגה מקדימה" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "תגית" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "לא ניתן למחוק את השיר" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "חפש" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "תבנית" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "ערוך ערכים שמורים" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "_צבע תנאי חיפוש" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "ספריה" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "בודק מחיצות מעוגנות" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "סורק את ספרית השירים" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "סורק %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "_הצג תגיות תיכנותיות" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "תיאור" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "ערך" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "עורך תגיות שירים" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "לא נבחרו שירים" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "_הסר תחנה" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "הסר תגית נבחרת" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "הוסף תגית" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "נתוני זמן חסרים" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "לא ניתן לשנות שם קובץ" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "הסר תגית נבחרת" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "קובץ" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "נתוני זמן חסרים" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "הנתיב <b>%s</b> אינו נתיב חוקי" #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "לא ידוע" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "לפי הסדר" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "לפי _הסדר" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_נגן בסדר אקראי" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_נגן בסדר אקראי" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_חזור" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "שיר בודד" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d שניה" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "לא נמצאו תחנות" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "לא ניתן ליצור תיקיה חדשה" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "הר_חבות" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "התקן שמע: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "התחלה" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "לא זמין" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "זמן" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "שם סימניה" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "סימניות" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "מ_סננים" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "לא נוגנו מ_עולם" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 ה_פופולארים" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "תחנה חדשה" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "ס_גנון אקראי" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "א_מן אקראי" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "אל_בום אקראי" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 השירים שהושמעו מספר הפעמים הרב ביותר (ניתן לבחור יותר מ 40 שירים אם ישנם " "קשרים בינם)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_ערך:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "ערכים שמורים" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "ערוך ערכים שמורים" #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "_כותרות רצועות" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "כ_ותרות אלבומים" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "יי_צוב עוצמה של Replay Gain" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "לא ידוע" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "הוסף תגית חדשה" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "קבצים" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "מחק קבצים" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "העבר ל_אשפה" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "מעביר %d/%d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "לא ניתן לשמור את מסד הנתונים של ה iPod" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "ניתוק <b>%s</b> נכשל" #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "מוחק %d/%d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "לא ניתן למחוק קובץ" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "מחיקת הקובץ <b>%s</b> נכשלה" #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "הורדות" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "גודל" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "חסר לשיר %d" msgstr[1] "חסר ל %d שירים" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "שונה בשיר %d" msgstr[1] "חסר ל %d שירים" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "פצל ל_ערכים נפרדים" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "פצל תקליטור מתוך _אלבום" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "פצל _גרסה מתוך שם" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "פצל _מעבד מתוך אמן" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "פצל מ_בצע מתוך אמן" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "פצל מ_בצע מתוך אמן" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "פצל _גרסה מתוך שם" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "הוסף תגית" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_תגית:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "ערוך תגיות" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "_הצג תגיות תיכנותיות" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "מעולם לא" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "לא ניתן להוסיף תגית" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "לא ניתן להוסיף שיר" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "לא ניתן להוסיף את <b>%s</b>\n" "\n" "הקבצים שנבחרו אינם תומכים בתגיות כפולות" #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "תגית שגויה" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "תגית שגויה <b>%s</b>\n" "\n" "הקבצים שנבחרו אינם תומכים בעריכת התגית הזו" #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "ערך שגוי" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "יתכן שהתגית לא תהייה מדוייקת" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> שונה בזמן שהתוכנה עבדה. שמירה ללא ריענון סיפרית השירים עלולה למחוק " "את השינויים שנעשו לשיר\n" "\n" "האם ברצונך לשמור את השיר?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "לא ניתן לשמור שיר" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "השמירה של <b>%s</b> נכשלה. יתכן שהקובץ אינו קיים או שאין לך הרשאות מתאימות" #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_אפשרויות נוספות..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "הר_חבות" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s ו %(count)d עוד" msgstr[1] "%(title)s ו %(count)d עוד" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "מאפייני Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "_פצל ב:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "עריכת תגיות שיר" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "תיקיות" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "תיקיה חדשה" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "בח_ר הכל את כל תתי התיקיות" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "תיקיה חדשה" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "הזן שם עבור התיקיה החדשה:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "לא ניתן ליצור תיקיה חדשה" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "לא ניתן למחוק תיקיה" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "שירים" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "בביצוע %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "תקליטור %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "רצועה %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "תצוגת עריכה" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "לא נבחרו שירים" #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "ללא שירים" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "מידע" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "מילים" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "הופק על ידי %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "אמן" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "אמנים" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "מבצעים" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "מעולם לא" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "פעם %d" msgstr[1] "%d פעמים" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "נוסף" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "הושמע לאחרונה" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "נוגן" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "דולג" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "דירוג" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "משך השיר" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "מידע" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[קידוד לא נתמך]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "איכות" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "גודל קובץ" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "שונה לאחרונה" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d נבחר" msgstr[1] "%d נבחרו" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "רצועה לא זמינה" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "רשימת רצועות" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "שיר %d ללא אלבום" msgstr[1] "%d שירים ללא אלבום" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "דיסקוגרפיה נבחרת" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "שיר %d ללא אמן" msgstr[1] "%d שירים ללא אמן" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "אלבומים" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "משך כללי:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "גודל כללי:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "קבצים" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "הורד_" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "תצוגת _עריכה..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "לא נמצאו מילים לשיר" #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "מחפש מילים לשירים..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "התעלם משינויים בתגיות?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "תגיות שונו אך לא נשמרו. לשמור את השינויים או לחזור למקור תוך התעלמות " "מהשינויים?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "מעולם לא" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "הקובץ קיים" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "שינוי שמות קבצים" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 msgid "Toggle shuffle mode" msgstr "" #: ../quodlibet/qltk/playorder.py:270 msgid "Toggle repeat mode" msgstr "" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "שגיאות בהרחבות" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "הסתר דפדפן שירים" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_סדר השמעה" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "עריכת תגיות שיר" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "גודל כללי:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "לא נמצאו הרחבות" #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "הר_חבות" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "הצג שגיא_ות" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_תקליטור" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_רצועה" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "איגוד" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "אל_בום" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_שם קובץ" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "מש_ך" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_דלג לשיר המושמע באופן אוטומטי" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "כאשר מתחלף שיר מושמע, הצג אותו ברשימת השירים" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "אח_רים" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "תצוגת _עריכה..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "עמודות מוצגות" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "כלול _גרסה בשם" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "כלול _גרסה בשם" #: ../quodlibet/qltk/prefs.py:108 #, fuzzy msgid "Album includes _disc subtitle" msgstr "כלול חל_ק באלבום" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "כלול _נתיב בשם הקובץ" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "מאפיינים" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "רשימת שירים" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "עמודות מוצגות" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "מ_סנן כללי" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "חפש" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "דפדפנים" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "כאשר מתחלף שיר מושמע, הצג אותו ברשימת השירים" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "ד_ירוג" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "רשימת אלבומים" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "הגבר עוצמה (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "הגבר עוצמה (dB):" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "יי_צוב עוצמה של Replay Gain" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "יי_צוב עוצמה של Replay Gain" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "ד_ירוג" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "שמור דירוגים וספירות השמעה" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_דואר אלקטרוני" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "הדירוגים וספירות ההשמעה ישויכו לכותבת הדואר האלקטרוני המופיעה כאן" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "התעלם משינויים בתגיות?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "ערוך תגיות" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_תחנה חדשה" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "_רענן ספרית שירים" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_חפש בספרית השירים" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "בדוק אם נעשו שינויים בספרית השירים" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "_טען מחדש את ספרית השירים" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "טען את כל השירים בספרית השירים (פעולה זו עלולה לקחת משך זמן ארוך)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "סר_וק ספריות" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "ללא שירים" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, fuzzy, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s ו %(count)d עוד" msgstr[1] "%(title)s ו %(count)d עוד" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "מאפיינים" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_סדר השמעה" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "שגיאות בהרחבות" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "שיר %(count)d (%(time)s)" msgstr[1] "%(count)d שירים (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_עיין בספרית השירים" #: ../quodlibet/qltk/quodlibetwindow.py:395 msgid "Toggle queue visibility" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "בחר ספריות" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "לא ניתן להוסיף שיר או שירים" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "ב <b>%s</b> מתבצע שימוש בתסדיר אשר אינו נתמך" #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_דלג לשיר מושמע" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "קובץ" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "שירים" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_תצוגה" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "דפדפנים" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_בקרה" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_עזרה" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "הוסף _תיקיה..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "ה_וסף קובץ..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "הוסף כתובת" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_ערוך סימניות" #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "עצור לאחר השיר הנוכחי" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "חפש" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "הוסף כתובת" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "הכנס את הכתובת אינטנרט של קובץ המוסיקה:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "לא ניתן להוסיף את הנתיב שצוין" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "הנתיב <b>%s</b> אינו נתיב חוקי" #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "הוסף מוסיקה" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "הוסף _תיקיה..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "נגן מוסיקה" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "ה_וסף קובץ..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_הסר תחנה" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "ד_ירוג" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "החלף _רווחים בקווים תחתיים" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "הסר תווים שאינם נתמכים ב_חלונות" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "הסר תווי _הטייה" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "ה_סר תווים שאינם תווי ASCII" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "שינוי שמות קבצים" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "תבנית" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "ערוך ערכים שמורים" #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_תצוגה מקדימה" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "שם חדש" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "לא ניתן לשנות שם קובץ" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "שינוי השם של <b>%s</b> ל <b>%s</b> נכשל. יתכן ששם היעד קיים כבר או שאין לך " "הרשאות מתאימות ליצור או למחוק קובץ קודם." #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "הצג שגיא_ות" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "המ_שך" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "הנתיב אינו מלא" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "התבנית\n" "\t<b>%s</b>\n" "מכילה / אך אינה מתחילה מספרית השורש. על מנת למנוע שמות תיקיות שגויות על " "התבנית להתחיל מ / או מ /~." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "שירים בספריות אלו (מופרדות ב ':') יוספו לספרית השירים שלך" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "בחר ספריות" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "ערכים שמורים" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "ערוך ערכים שמורים" #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "עצור לאחר השיר הנוכחי" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_גבול:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "לפי _דירוג" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "הצג זמן שנשאר לנגן" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "מילים" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 msgid "Focus the search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:22 msgid "Reset filters and jump to the playing song" msgstr "" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "לא ניתן למחוק את השיר" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "לא ניתן למחוק את השיר" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_מיין לפי %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "כ_ותרות אלבומים" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_כותרות רצועות" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "כ_ותרות אלבומים" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "כותרות _מבצעים" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "כותרות ת_אריך" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "כו_תרות קבצים" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "כות_רות הפקה" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "כותרות _מותאמות אישית..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "_צבע תנאי חיפוש" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "הו_סף לסדר ההשמעה" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "ה_עתק להתקן שמע חיצוני" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "ה_סר מרשימת הניגון" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "החלף _קווים תחתיים ברווחים" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_שנה לאות גדולה ראשונה בכל מילה" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "פצל ל_תגיות נפרדות" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "תגיות משם הקובץ" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "תגיות מחליפות תגיות קיימות" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "תגיות נוספות לתגיות קיימות" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "התבנית\n" "\t<b>%s</b>\n" "שגוייה. יתכן והיא מכילה את אותה תגית פעמיים או שהיא אינה סגורה עם " "מרכאות(< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "תגיות שגויות" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "תגיות שגויה <b>%s</b>\n" "\n" "הקבצים שנבחרו אינם תומכים בעריכת התגיות האלו" #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "התבנית שהוזנה שגוייה, וודא כי < ו > הוזנו כ \\< ו \\> וכי התגיות " "מאוזנות.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "תצוגת עריכה" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "מספרי רצועות" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "התחל _מ:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_סך הכל רצועות:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "נגן" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_תצוגה מקדימה" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "%d נותרו..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "שומר שירים שבוצעו בהם שינויים..." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "מעביר %d/%d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "בודק מחיצות מעוגנות" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "מיקום" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "רשימת ניגון בשם %s כבר קיימת" #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "ה_צג עטיפות אלבומים" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "מערכת קבצים" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "" #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "" #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "" #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d שניה" msgstr[1] "%d שניות" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "נתוני זמן חסרים" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d שניה" msgstr[1] "%d שניות" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d דקה" msgstr[1] "%d דקות" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d שעה" msgstr[1] "%d שעות" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d יממה" msgstr[1] "%d יממות" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d שנה" msgstr[1] "%d שנים" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "לא_רלוונטי_בעברית" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "על תאריך להיות מוזן בתצורת YYYY, YYYY-MM-DD או YYYY-MM-DD HH:MM:SS" #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "על הגברת העוצמה של Replay Gain להיות מוזנת בתצורה 'x.yy dB'" #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "על העוצמת המירבית של Replay Gain להיות מוזנת בתצורה 'x.yy dB'" #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "רצועות בעלות סימול של MusicBrainz חייבות להיות בתסדיר UUID" #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "סטטוס של MusicBrainz יכול להיות 'official' (רשמי), 'promotional' (לצרכי " "קידום) או 'bootleg' (לא רשמי)." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "לא ניתן לערוך שיר" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "השמירה של <b>%s</b> נכשלה. יתכן שהקובץ אינו קיים או שאין לך הרשאות מתאימות" #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[קידוד לא נתמך]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "אלבום" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "עיבוד" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "עיבוד" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "עיבוד" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "מחבר" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "מחברים" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "מלחין" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "מלחינים" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "מלחין" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "מנצח" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "מנצחים" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "מנצח" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "איש קשר" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "זכויות יוצרים" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "תאריך" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "תיאור" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "סגנון" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "סגנון" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "מבצע" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "איגוד" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "שפה" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "רישוי" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "מיקום" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "מילים" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "מילים" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "מילים" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "ארגון" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "שם" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "גרסה" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "אתר אינטרנט" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "אמן האלבום" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "תקליטור" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "רצועה" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "זיהוי תגית" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "תאריך הפצה מקורי" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "אלבום מקורי" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "אמן מקורי" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "הוקלט" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "ארץ מקור" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "סימון אמן של MusicBrainz" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "סימון רצועה של MusicBrainz" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "סימון TRM של MusicBrainz" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "סימון PUID של MusicIP" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "סימון MusicBrainz של מצב אלבום " #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "סימון סוג אלבום של MusicBrainz" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "סימון רצועה של MusicBrainz" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "הגברת רצועה" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "עוצמת רצועה מקסימלית" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "הגברת אלבום" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "עוצמת אלבום מקסימלית" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "מאפיינים" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "תקליטורים" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "רצועות" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "נוגן לאחרונה" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "שם מלא" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "נקודת עגינה" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "יוצרים" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "שנה" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "תאריך הפצה מקורי" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "סימניות" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "תסדיר" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "רשימות ניגון" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "דפדפנים" #~ msgid "Unable to download lyrics." #~ msgstr "לא ניתן להוריד מילים לשיר" #~ msgid "Remove all songs from the queue" #~ msgstr "הסר את כל השירים מסדר ההשמעה" #~ msgid "Watch this folder for new songs" #~ msgstr "עקוב אחר שירים חדשים בתיקייה זו" #~ msgid "Uninitialized iPod" #~ msgstr "התקן ה iPod אינו מאותחל" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "האם ברצונך ליצור מסד נתונים ריק ב iPod?" #~ msgid "_Volume Gain (dB):" #~ msgstr "הגבר עוצמה (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "מזג תגיות עם ערכים מרובים" #~ msgid "Model:" #~ msgstr "מודל:" #~ msgid "Capacity:" #~ msgstr "קיבולת:" #~ msgid "Firmware:" #~ msgstr "קושחה:" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "לא ניתן לשמור את מסד הנתונים של ה iPod" #~ msgid "Unable to save iPod database" #~ msgstr "לא ניתן לשמור את מסד הנתונים של ה iPod" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "עוצמת רצועה מקסימלית" #~ msgid "Shuffle" #~ msgstr "מעורבב" #~ msgid "Weighted" #~ msgstr "לפי דירוג" #~ msgid "_Weighted" #~ msgstr "לפי _דירוג" #~ msgid "_One Song" #~ msgstr "_שיר בודד" #~ msgid "Restart the playlist when finished" #~ msgstr "התחל מחדש את רשימת הניגון בהגיעה לסופה" #~ msgid "Disable Browser" #~ msgstr "הסתר דפדפן שירים" #~ msgid "_Disable Browser" #~ msgstr "_הסתר דפדפן שירים" #, fuzzy #~ msgid "Force Write" #~ msgstr "שמור" #~ msgid "Filter on _Genre" #~ msgstr "סנן לפי _סגנון" #~ msgid "Filter on _Artist" #~ msgstr "סנן לפי _אמן" #~ msgid "Filter on Al_bum" #~ msgstr "סנן לפי א_לבום" #~ msgid "_Music" #~ msgstr "_מוסיקה" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "סימניות" #~ msgid "Song _List" #~ msgstr "רשימת _שירים" #~ msgid "" #~ "Scroll wheel changes song\n" #~ "Shift and scroll wheel adjusts volume" #~ msgstr "" #~ "השתמש בגלילת העכבר להחלפת שירים\n" #~ "לחיצה על Shift וגלילת עכבר יחד לשינוי עוצמת הקול" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "%d נותרו..." #~ msgstr[1] "%d נותרו..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "פצל תקליטור מתוך _אלבום" #, fuzzy #~ msgid "Timeout" #~ msgstr "זמן" #, fuzzy #~ msgid "Select an album" #~ msgstr "ב_חר הכל" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s ו %(count)d עוד" #~ msgstr[1] "%(title)s ו %(count)d עוד" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "רשימות ניגון" #~ msgid "Re_fresh Library" #~ msgstr "_רענן ספרית שירים" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_הסר תחנה" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "לא ניתן לפתוח את הקבצים" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "ערך שגוי" #, fuzzy #~ msgid "ql-revert" #~ msgstr "_הסר" #, fuzzy #~ msgid "heading|Search" #~ msgstr "חפש" #~ msgid "_Download..." #~ msgstr "_הורדה..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_תחנה חדשה" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "האם לשכתב את <b>%s</b> ?" #~ msgid "_Edit Bookmarks..." #~ msgstr "_ערוך סימניות" #~ msgid "_New Folder..." #~ msgstr "_תיקיה חדשה..." #~ msgid "_Add to Playlist" #~ msgstr "הוסף לרשימת _ניגון" #~ msgid "_Edit Display..." #~ msgstr "תצוגת _עריכה..." #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d תחנה" #~ msgid "_Order:" #~ msgstr "_אופן השמעה:" #~ msgid "_Add a Location..." #~ msgstr "הוסף _נתיב לקובץ..." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "כותרות _מותאמות אישית..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "_כותרות רצועות" #, fuzzy #~ msgid "People Headers" #~ msgstr "כותרות _מבצעים" #, fuzzy #~ msgid "Album Headers" #~ msgstr "כ_ותרות אלבומים" #, fuzzy #~ msgid "Date Headers" #~ msgstr "כותרות ת_אריך" #, fuzzy #~ msgid "File Headers" #~ msgstr "כו_תרות קבצים" #, fuzzy #~ msgid "Production Headers" #~ msgstr "כות_רות הפקה" #, fuzzy #~ msgid "Tag:" #~ msgstr "_תגית:" #, fuzzy #~ msgid "Warnings" #~ msgstr "ד_ירוג" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "אמן האלבום" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "אמנים" #, fuzzy #~ msgid "album (sort)" #~ msgstr "אמן האלבום" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "מבצעים" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "מבצעים" #~ msgid "MusicBrainz album artist ID" #~ msgstr "סימון MusicBrainz של אלבום אמן" #, fuzzy #~ msgid "errors" #~ msgstr "מבצעים" #~ msgid "Permanently delete this file?" #~ msgstr "האם למחוק קובץ זה צמיתות?" #~ msgid "Permanently delete these files?" #~ msgstr "האם למחוק קבצים אלו לצמיתות?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s ו %(count)d נותרו..." #~ msgstr[1] "%(title)s ו %(count)d נותרו..." #, fuzzy #~ msgid "Version:" #~ msgstr "גרסה" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "שגיאות בהרחבות" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "לא ניתן להוסיף את %s לספריה שלך\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "לא נמצאה פקודת ניתוק" #~ msgid "Unable to start web browser" #~ msgstr "לא ניתן להפעיל את דפדפן האינטרנט שלך" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "לא נמצא דפדפן אינטנרט. כוון את הערך $BROWSER או וודא שהקובץ/usr/bin/" #~ "sensible-browser קיים." #, fuzzy #~ msgid "Library Error" #~ msgstr "דפדפן הספריה" #, fuzzy #~ msgid "_Output device:" #~ msgstr "ה_עתק להתקן שמע חיצוני" #~ msgid "translator-credits" #~ msgstr "Roee Haimovich, johnny5@i12.com" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "תגיות אחרות שיוצגו, מופרדות ברווחים" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "המ_שך" #~ msgid "Search your library" #~ msgstr "חפש בספרית השירים" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "גודל כללי:" #~ msgid "Quod Libet Plugins" #~ msgstr "הרחבות ל Quod Libet" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "הצג חיפושים פשוטים בכחול, חיפושים מורכבים בירוק וחיפושים שגויים באדום" #~ msgid "_Select" #~ msgstr "_עיין" #~ msgid "Separators for splitting tags" #~ msgstr "סימנים מפרידים להפרדת תגיות" #~ msgid "Quod Libet Preferences" #~ msgstr "מאפייני Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "לא נוגנו ה_יום" #~ msgid "Not Played in a _Week" #~ msgstr "לא נוגנו ב_שבוע האחרון" #~ msgid "Not Played in a _Month" #~ msgstr "לא נוגנו ב_חודש האחרון" #~ msgid "B_ottom 40" #~ msgstr "40 _הלא פופלארים" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "40 השירים שהושמעו מספר הפעמים המועט ביותר (ניתן לבחור יותר מ 40 שירים אם " #~ "ישנם קשרים בינם)" #~ msgid "gtk-media-next" #~ msgstr "ה_בא" #~ msgid "gtk-media-previous" #~ msgstr "ה_קודם" #~ msgid "gtk-media-play" #~ msgstr "_נגן" #~ msgid "gtk-media-pause" #~ msgstr "_השהה" #, fuzzy #~ msgid "Date" #~ msgstr "ת_אריך" #~ msgid "Choose New Stations" #~ msgstr "בתר תחנות חדשות" #~ msgid "Add" #~ msgstr "הוסף" #, fuzzy #~ msgid "Bitrate" #~ msgstr "איכות" #~ msgid "_Stations..." #~ msgstr "ת_חנות..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "הרחבות ל Quod Libet" #~ msgid "Unable to save library" #~ msgstr "לא ניתן לשמור את ספרית השירים" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "לא ניתן להוסיף שיר" #~ msgid "Sort by title" #~ msgstr "מיין לפי שם" #~ msgid "Sort by artist" #~ msgstr "מיין לפי אמן" #~ msgid "Lyrics provided by %s." #~ msgstr "מילות השיר סופקו על ידי %s" #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "לא נמצאו מילים לשיר.\n" #~ "\n" #~ "באפשרותך להקיש על הורד ולתת ל Quod Libet לחפש מילים לשיר באינטרנט או " #~ "שניתן לכתוב את המילים בעצמך ולשמור אותם על ידי הקשה על שמור" #~ msgid "part" #~ msgstr "חלק" #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d שירים נשמרו" #~ msgid "MusicBrainz album ID" #~ msgstr "סימון אלבום של MusicBrainz" #~ msgid "Unable to open audio device" #~ msgstr "לא ניתן לפתוח את התקן הקול שלך" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet ניסה לגשת לצינורות השמע alsasink, osssink ול %(sink)s אך נכשל " #~ "בגישה לכל אחד מהם.יש לכוון את צינור השמע המתאים של GStremer על ידי שינוי " #~ "השורה <b>pipeline = %(sink)s</b>\n" #~ "בקובץ ההגדרות ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "לא ניתן היה למצוא את ישום ה GStreamer מסוג filesrc.בדוק אם התקנת " #~ "GStreamer שלך תקינה" #, fuzzy #~ msgid "C_opy album covers" #~ msgstr "ה_צג עטיפות אלבומים" #~ msgid "Unable to retag multiple values" #~ msgstr "לא ניתן לערוך ערכים כפולים" #~ msgid "" #~ "Scanning your library. This may take several minutes.\n" #~ "\n" #~ "%d songs reloaded\n" #~ "%d songs removed" #~ msgstr "" #~ "Quod Libet סורק את ספרית השירים שלך. תהליך זה יכול להימשך מספר דקות.\n" #~ "\n" #~ "%d שירים הוטענו\n" #~ "%d שירים הוסרו" #~ msgid "" #~ "Scanning for new songs and adding them to your library.\n" #~ "\n" #~ "%d songs added" #~ msgstr "" #~ "Quod Libet סורק למציאת שירים חדשים ומוסיף אותם לספרית השירים שלך.\n" #~ "\n" #~ "%d שירים נוספו" #~ msgid "M3U playlists cannot be loaded." #~ msgstr "לא ניתן לטעון רשימת M3U" #, fuzzy #~ msgid "<b>%s</b> is already in your library." #~ msgstr "תחנה זו כבר נמצאת בספריה שלך" #~ msgid "Per-song (\"Radio\") volume adjustment" #~ msgstr "ייצוב עוצמה לפי שיר (רדיו)" #~ msgid "Per-album (\"Audiophile\") volume adjustment" #~ msgstr "ייצוב עוצמה לפי אלבום (אודיופיל)" #~ msgid "_Volume Normalization" #~ msgstr "_ייצוב עוצמת קול" #~ msgid "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "by <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - Disc <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - Track <tracknumber>>>" #~ msgstr "" #~ "\\<span weight='bold' size='large'\\><title>\\</span\\><~length| " #~ "(<~length>)><version|\n" #~ "\\<small\\>\\<b\\><version>\\</b\\>\\</small\\>><~people|\n" #~ "בביצוע <~people>><album|\n" #~ "\\<b\\><album>\\</b\\><discnumber| - תקליטור <discnumber>><part| - \\<b" #~ "\\><part>\\</b\\>><tracknumber| - רצועה <tracknumber>>>" #~ msgid "Loading, scanning, and saving your library." #~ msgstr "טוען, סורק ושמור את ספרית השירים שלך" #~ msgid "" #~ "It looks like you are running Quod Libet right now. If you edit songs " #~ "also in Quod Libet's library while it is running, you may need to refresh " #~ "or re-add them.\n" #~ "\n" #~ "If you are not running Quod Libet, or are editing songs outside of its " #~ "library, you may ignore this warning." #~ msgstr "" #~ "נראה כי Quod Libet עובד כרגע. באם יערכו שירים בספרית השירים של Quod Libet " #~ "כאשר הוא פעיל, יתכן ויהיה צורך לטעון אותה מחדש או להוסיף את השירים שוב\n" #~ "\n" #~ "אם Quod Liet איננה עובדת כרגע או שיערכו שירים שאינם בספרית השירים שלה אז " #~ "ניתן להתעלם מהודעה זו" #~ msgid "GStreamer status %r != %r" #~ msgstr "סטטוס GStreamer %r != %r" #~ msgid "_Pane %d:" #~ msgstr "_חלונית: %d" #~ msgid "Double-click a tag value to change it, right-click for other options" #~ msgstr "הקש פעמים על מנת לשנות ערך, מקש ימני לאפשרויות נוספות" #~ msgid "Tag by Filename" #~ msgstr "תגית לפי שם קובץ" #~ msgid "The first letter of each word will be capitalized" #~ msgstr "האות הראשונה של כל מילה תהייה אות גדולה" #~ msgid "" #~ "Characters not allowed in Windows filenames (\\:?;\"<>|) will be replaced " #~ "by underscores" #~ msgstr "התווים (\\:?;\"<>|) אינם מורשים בחלונות ולכן יוחלפו בקווים תחתיים" #~ msgid "" #~ "Characters outside of the ASCII set (A-Z, a-z, 0-9, and punctuation) will " #~ "be replaced by underscores" #~ msgstr "" #~ "תווים שאינם בטווח תווי ה ASCII כדוגמת (A-Z, a-z, 0-9, וסימני פיסוק) " #~ "יוחלפו בקווים תחתיים" #~ msgid "Apply to these _files..." #~ msgstr "יישם עבור הקבצים הבאים..." #~ msgid "Path" #~ msgstr "נתיב" #~ msgid "Tray Preferences - Quod Libet" #~ msgstr "הגדרות מגש המערכת - Quod Libet" ��������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/ko.po����������������������������������������������������������������������������0000644�0001750�0001750�00000521644�13115512747�015353� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Korean translation of Quod Libet # ChangBom Yoon <changbom.yoon@gmail.com>, 2006 # Byung-Hee HWANG <bh@izb.knu.ac.kr>, 2006 # $LUG: projects/quodlibet/ql_0_23_ko.po,v 1.2 2006/08/09 08:35:52 bh Exp $ # msgid "" msgstr "" "Project-Id-Version: Quod Libet 0.23\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:35+0100\n" "Last-Translator: ChangBom Yoon <changbom.yoon@gmail.com>\n" "Language-Team: The FreeBSD Korean Documentation Project <doc@kr.FreeBSD." "org>\n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "오디오 파일 태그 편집" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "오디오 태그 편집기" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "듣기, 검색 및 오디오 모음 편집" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "음악 재생기" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "제목" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "아티스트" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "날짜" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "장르" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "재생율" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "날짜 순 정렬" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "설정" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "앨범 목록" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "앨범 목록" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "모든 앨범" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d 앨범" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "앨범 표지 보이기" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "앨범에 없는 노래" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d 트랙" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d 디스크" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "모든 앨범" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "앨범 목록 설정" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "앨범 표지 보이기" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[옵션]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "앨범 표시" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Unknown" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "새 피드" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "오디오 피드의 주소를 입력하십시오:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "오디오 피드" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "오디오 피드" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "내려받기" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "파일 내려받기" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "파일 내려받기" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "피드를 추가할 수 없습니다" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> 는 추가할 수 없습니다. 서버가 죽었거나 입력한 주소는오디오 피드가 " "아닙니다." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "라이브러리 새로고침" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "파일 지우기" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "라이브러리 브라우저" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d 곡" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "유효하지 않은 양식" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Unknown" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Split into _Multiple Values" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Custom" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "재생율" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "태그" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "앨범 목록 설정" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "총 크기:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "총 크기:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Paned Browser 설정" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "앨범 표지 보이기" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "모든 앨범" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "조직" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "파일 시스템" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "파일 시스템" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "노래를 복사할 수 없습니다" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "선택한 파일은 다른 노래 목록이나 대기열로 복사 할 수 없습니다." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "라이브러리 추가" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "지원하지 않는 파일 형식" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "방송국 목록은 방송국의 주소만 포함되어야 합니다. 다음 주소는 추가할수 없습니" "다:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "방송국을 추가할 수 없습니다" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "인터넷 라디오" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "파일 내려받기" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "새방송국" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "인터넷 라디오 방송국의 주소를 입력하십시오:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "재생율" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "새 방송국" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "인터넷 라디오" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "새방송국" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "새 방송국" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "새방송국" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "발견된 방송국이 없습니다" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "%s 에서 발견된 인터넷 라디오 방송국이 없습니다." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "목록에 있는 모든 방송국은 이미 라이브러리에 존재합니다." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "재생목록 추가" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "재생목록으로부터 제거" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d station" #: ../quodlibet/browsers/media.py:36 #, fuzzy msgid "Device Properties" msgstr "등록정보" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "마운트 지점" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "이름:" #: ../quodlibet/browsers/media.py:135 #, fuzzy msgid "Media Devices" msgstr "오디오 장치: %s" #: ../quodlibet/browsers/media.py:136 #, fuzzy msgid "_Media Devices" msgstr "오디오 장치: %s" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 #, fuzzy msgid "_Eject" msgstr "선택" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "등록정보" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "이름 바꾸기" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> 는 유효하지 않은 주소입니다." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>%s</b> 삭제 실패." #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 #, fuzzy msgid "Unable to copy song" msgstr "노래를 복사할 수 없습니다" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "" #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> 는 유효하지 않은 주소입니다." #: ../quodlibet/browsers/media.py:545 #, fuzzy msgid "Unable to delete songs" msgstr "노래를 추가할 수 없습니다" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>%s</b> 삭제 실패." #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> 는 유효하지 않은 주소입니다." #: ../quodlibet/browsers/media.py:579 #, fuzzy msgid "Unable to delete song" msgstr "노래를 편집할 수 없습니다" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>%s</b> 삭제 실패." #: ../quodlibet/browsers/media.py:597 #, fuzzy msgid "Unable to eject device" msgstr "파일 삭제에 실패했습니다" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Paned Browser" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Paned Browser" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "모두 선택" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "All" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Paned Browser 설정" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "재생목록" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "재생목록" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "재생목록으로부터 제거" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "가져오기" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "새 재생목록" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "재생목록을 가져올 수 없습니다" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet 은 M3U 와 PLS 포맷에서만 재생목록을 가져올 수 있습니다." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "재생목록 이름을 바꿀 수 없습니다" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "재생목록 가져오기" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "새 재생목록" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "새 재생목록" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Paned Browser 설정" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "재생목록" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "새 폴더 이름을 입력하십시오:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "재생목록을 가져옵니다.\n" "\n" "%d/%d 곡을 추가했습니다." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "결과 제한" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "라이브러리 검색" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "라이브러리 검색" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Paned Browser" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "검색" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "주소" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet 이 실행중이 아닙니다." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "음악 라이브러리 및 재생기" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[옵션]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "재생중인 노래 표시 후 마침" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "곧 노래 시작" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "다음 노래로 가기" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "이전 노래로 가기" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "연주 시작" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "연주 일시정지" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "재생/일시정지 토글(Toggle) 모드" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "연주 시작" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "음량 증가" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "음량 감소" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "재생기 상태 표시" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "메인 창 숨기기" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "메인 창 보이기" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "메인 창 표시 토글(Toggle)" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "실행중인 재생기 강조" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "라이브러리 새로고침" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "브라우저 비활성" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "현재 재생목록 표시" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "대기열 내용 표시" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "대기열 내용 표시" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet 이 실행중이 아닙니다." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Quod Libet 마침" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "재생중인 노래에서 탐색" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "재생/일시정지 토글(Toggle) 모드" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "반복 끄기, 켜기, 토글(Toggle)" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "음량 설정" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "오디오 라이브러리 검색" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "쿼리" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "파일 재생" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "파일이름" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "재생율" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "현재 브라우저 지정" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "재생율" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "새 브라우저 열기" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "대기열 보이기 및 숨기기" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "메인 노래 목록 보이기 및 숨기기" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "임의의 값으로 필터" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "태그" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "태그 값으로 필터" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=value" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Enqueue a file or query" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "파일이름" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 #, fuzzy msgid "Unqueue a file or query" msgstr "Enqueue a file or query" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "에러: '%s' 에 유효하지 않은 인자." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "에러: %s --help 를 시도해 보십시오." #: ../quodlibet/devices/_base.py:65 #, fuzzy msgid "Unknown Device" msgstr "Unknown" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "에러: '%s' 는 유일한 prefix 가 아닙니다." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "유효하지 않은 값" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "파일이름" #: ../quodlibet/devices/storage.py:61 #, fuzzy msgid "Copy _album covers" msgstr "앨범 표지 보이기" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "에러 보이기" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "설명" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "오디오 태그 편집기" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "디렉토리" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[유효하지 않은 인코딩]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "제목" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "오디오 태그 편집기" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_Title-case tags" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Paned Browser 설정" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "총 크기:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Edit Display" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "무게" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Edit Display" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "미리보기" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d 초" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Custom" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "플러그인 에러" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "음악 재생기" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "인터넷 라디오" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "재생율" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "노래를 저장할 수 없습니다" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "발견된 플러그인이 없습니다" #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "가사" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "검색 초기화" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "가사" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "주소" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "메인 창 숨기기" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "설정" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "양식" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "양식" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d 곡" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "정보" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "양식" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "주소" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "제목" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "이름:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Others:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "아티스트" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "파일이름" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "임의의 앨범" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "앨범" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "무게" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "임의의 앨범" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "재생목록 가져오기" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "가져오기" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "가사" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Not playing" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d 곡" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "양식" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Not playing" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "재생목록" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "재생기" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "미리보기" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "섞어서" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "반복" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "이 노래 후 정지" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "새 브라우저 열기" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "태그 편집" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "정보" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "재생목록" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Edit Display" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "가사" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "가사" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "에러 보이기" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "파일" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "미리보기" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "아티스트 필터" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Custom" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "장르 필터" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "아티스트 필터" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "오디오 피드" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "오디오 피드의 주소를 입력하십시오:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "재생목록 가져오기" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "가져오기" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "발견된 방송국이 없습니다" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "파일이름" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "파일이름" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "재생목록으로부터 제거" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "새 재생목록" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "마지막 재생" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "대기열" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Never" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "No Songs" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "저장된 값" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "이름 바꾸기" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "라이브러리" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "메인 창 숨기기" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "파일이름" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "노래를 저장할 수 없습니다" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "앨범 목록" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "크기" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "검색:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "검색" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "앨범 목록" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "북마크 편집" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "북마크 편집" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "북마크" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album type" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "파일이름" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "디스크" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "트랙" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "제목" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "아티스트" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album type" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "쿼리" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "검색" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "발견된 플러그인이 없습니다" #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "브라우저" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "폴더를 생성할 수 없습니다" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "command|tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "이름 바꾸기" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "command|tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "유효하지 않은 양식" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "유효하지 않은 값" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Custom" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "노래를 복사할 수 없습니다" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "브라우저 비활성" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "재생율" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "재생율" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Edit Display" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "재생율" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "태그 값으로 필터" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer 는 선택한 노래를 불러올 수 없습니다." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "장르 필터" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "대기열" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "쓰기" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz track ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "디렉토리" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "_Album Headers" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "새 방송국" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "재생목록 가져오기" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "이름 바꾸기" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "재생목록 가져오기" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "정보" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "재생목록 가져오기" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "재생목록을 가져올 수 없습니다" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "<b>%s</b> 삭제 실패." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "라이브러리 새로고침" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "라이브러리 새로고침" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "태그 편집:" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "태그 편집:" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "모든 앨범" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "미리보기" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "태그" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "노래를 추가할 수 없습니다" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "검색" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "양식" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "저장된 값 편집..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "검색 용어에 색깔" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "라이브러리" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "마운트 지점 확인" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "라이브러리 스캐닝" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "스캐닝 %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Show _programmatic tags" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "설명" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "값" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "오디오 태그 편집기" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "선택한 노래가 없습니다." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "태그 값으로 필터" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "태그 값으로 필터" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "정보에 시간이 없습니다" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "파일이름 변경을 할 수 없습니다" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "파일" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "사용 정보 개요 표시" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> 는 유효하지 않은 주소입니다." #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "Unknown" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "순서대로" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "순서대로" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "임의로" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "임의로" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "반복" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "선택한 노래" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d 초" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "발견된 방송국이 없습니다" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "폴더를 생성할 수 없습니다" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "플러그인" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "지원 포맷: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "오디오 장치: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "시작" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "시간" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "북마크 이름" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "북마크" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "필터" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "_Never Played" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "새방송국" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "임의의 장르" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "임의의 아티스트" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "임의의 앨범" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "최대 40 곡이 재생되었습니다" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "값:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "저장된 값" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "저장된 값 편집..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "_Track Headers" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "_Album Headers" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "_Replay Gain volume adjustment" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Unknown" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "태그 값으로 필터" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "파일" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "파일 지우기" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "휴지통으로 이동" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "%d/%d 이동" #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "라이브러리를 저장할 수 없습니다" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "<b>%s</b> 삭제 실패." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "%d/%d 삭제" #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "파일 삭제에 실패했습니다" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "<b>%s</b> 삭제 실패." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "내려받기" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "크기" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "missing from %d song" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "different across %d song" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Split into _Multiple Values" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Split Disc out of _Album" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Split Arranger out of Ar_tist" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Split _Performer out of Artist" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Split _Version out of Title" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "태그 추가" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "태그:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "태그 편집:" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Show _programmatic tags" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Never" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "태그를 추가할 수 없습니다" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "노래를 추가할 수 없습니다" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "<b>%s</b> 태그를 추가할 수 없습니다\n" "\n" "지금 선택한 파일은 복수값을 지원하지 않습니다." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "유효하지 않은 태그" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "유효하지 않은 태그 <b>%s</b>\n" "\n" "지금 선택한 파일은 이러한 태그의 편집을 지원하지 않습니다." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "유효하지 않은 값" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "태그에 결함이 있습니다" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> 는 프로그램이 실행되는 동안 변경되었습니다. 새로고침없이라이브러리" "를 저장하면 그 노래에 변경사항을 덮어씁니다.\n" "어쨌든 이 노래를저장할까요?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "노래를 저장할 수 없습니다" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "<b>%s</b> 저장을 할 수 없습니다. 읽기-전용 파일이거나, 변조된파일입니다. 또" "는 파일에 접근 권한이 없습니다." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "좀 더 많은 옵션..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "플러그인" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s and %(count)d more" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso 설정" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Split _on:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "태그 편집" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "폴더" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "새 폴더" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "하위폴더 모두 선택" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "새 폴더" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "새 폴더 이름을 입력하십시오:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "폴더를 생성할 수 없습니다" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "폴더를 지울 수 없습니다" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "노래" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "아티스트: %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "%s 디스크" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "%s 트랙" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Edit Display" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "선택한 노래가 없습니다." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "No Songs" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "정보" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "가사" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "기획: %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "아티스트" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "아티스트" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "연주" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Never" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d 회" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "추가" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "마지막 재생" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "재생" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "통과" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "재생율" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "길이" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "정보" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[유효하지 않은 인코딩]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "비트율" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "파일 크기" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "수정" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d 선택" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "트랙을 이용할 수 없습니다" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "트랙 목록" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "앨범이 없는 노래 %d 곡" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Selected Discography" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "아티스트가 없는 노래 %d 곡" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "앨범" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "총 길이:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "총 크기:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "파일" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "내려받기" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Edit Display..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "이 노래를 위한 가사가 없습니다" #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "가사 검색중..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "변경된 태그를 버릴까요?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "태그가 변경되었으나 저장되지 않았습니다. 이 파일을 저장할까요? 아니면 변경사" "항을 무시하고 이전으로 되돌릴까요?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Never" #: ../quodlibet/qltk/msg.py:86 #, fuzzy msgid "File exists" msgstr "파일 시스템" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "파일이름 바꾸기" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "재생/일시정지 토글(Toggle) 모드" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "재생/일시정지 토글(Toggle) 모드" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "플러그인 에러" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "브라우저 비활성" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "재생순서:" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "태그 편집" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "총 크기:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "발견된 플러그인이 없습니다" #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "플러그인" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "에러 보이기" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "디스크" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "트랙" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "그룹" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "앨범" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "파일이름" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "길이" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "자동으로 현재 재생중인 노래로 가기" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "When the playing song changes, scroll to it in the song list" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Others:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Edit Display..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "칼럼 표시" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "버전을 포함하는 제목" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "버전을 포함하는 제목" #: ../quodlibet/qltk/prefs.py:108 #, fuzzy msgid "Album includes _disc subtitle" msgstr "파트(part)를 포함하는 앨범" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "폴더를 포함하는 파일이름" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "설정" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "노래 목록" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "칼럼 표시" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "전역 필터:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "검색" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "브라우저" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "When the playing song changes, scroll to it in the song list" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "재생율" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "앨범 목록" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "연주 일시정지" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "_Replay Gain volume adjustment" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "_Replay Gain volume adjustment" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "재생율" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "Save ratings and play counts" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "전자메일:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Ratings and play counts will be set for this email address" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "변경된 태그를 버릴까요?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "태그 편집:" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "새 방송국" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "라이브러리 새로고침" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "라이브러리 검색" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "라이브러리 변경 체크" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "라이브러리 새로불러오기" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "라이브러리의 모든 노래를 새로불러오기" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "디렉토리 스캔" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "No Songs" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, fuzzy, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s and %(count)d more" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "등록정보" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "대기열" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "플러그인 에러" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d song (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "라이브러리 브라우저" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "메인 창 표시 토글(Toggle)" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "연주 일시정지" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "디렉토리 선택" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "노래를 추가할 수 없습니다" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> 는 지원하지 않는 프로토콜을 사용하고 있습니다." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "현재 재생중인 노래로 가기" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "파일" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "노래" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "보기" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "브라우저" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "조정" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "도움말" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "폴더 추가..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "파일 추가..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "주소 추가" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "북마크 편집" #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "이 노래 후 정지" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "검색" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "주소 추가" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "오디오 파일의 주소를 입력하십시오:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "주소를 추가할 수 없습니다" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> 는 유효하지 않은 주소입니다." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "음악 추가" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "폴더 추가..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "음악 재생기" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "파일 추가..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "재생율" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "재생율" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Replace spaces with _underscores" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Strip _Windows-incompatible characters" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Strip _diacritical marks" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Strip non-_ASCII characters" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "파일이름 바꾸기" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "양식" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "저장된 값 편집..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "미리보기" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "새 이름" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "파일이름 변경을 할 수 없습니다" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "<b>%s</b> 를 <b>%s</b> 로 이름 변경을 할 수 없습니다. 변경하려는목적지 파일" "이 이미 존재하거나 파일로의 접근이 거부되었습니다." #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "에러 보이기" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "계속" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "절대경로가 아닙니다" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "아래 양식\n" "\t<b>%s</b>\n" "는 root 에서 시작하지않은 / 를포함하고 있습니다.폴더의 잘못된 이름을 피하려" "면, / 또는 ~/ 으로 시작하는 양식을취하십시오." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Songs placed in these folders (separated by ':') will be added to your " "library" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "디렉토리 선택" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "저장된 값" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "저장된 값 편집..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "이 노래 후 정지" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "제한:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "무게" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "남은 시간 표시" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "가사" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "실행중인 재생기 강조" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "재생중인 노래에서 탐색" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "노래를 추가할 수 없습니다" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "노래를 추가할 수 없습니다" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filter on %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Track Headers" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Album Headers" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_People Headers" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Date Headers" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_File Headers" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Production Headers" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Customize Headers..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "검색 용어에 색깔" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "대기열 추가" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "재생목록으로부터 제거" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Replace _underscores with spaces" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Title-case tags" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Split into multiple _values" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tags From Path" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Tags replace existing ones" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Tags are added to existing ones" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "유효하지 않은 태그" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "유효하지 않은 태그 <b>%s</b>\n" "\n" "지금 선택한 파일은 이러한 태그의 편집을 지원하지 않습니다." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Edit Display" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "트랙 번호" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "시작:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "총 트랙:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "재생기" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "미리보기" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "and %d more..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "변경한 노래 저장" #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "%d/%d 이동" #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "마운트 지점 확인" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "주소" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "%s 재생목록은 이미 존재합니다." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "앨범 표지 보이기" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "파일 시스템" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "사용 정보 개요 표시" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "버전 및 저작권 표시" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[옵션]" #: ../quodlibet/util/__init__.py:182 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "에러: '%s' 는 알 수 없는 옵션입니다." #: ../quodlibet/util/__init__.py:185 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "에러: '%s' 는 인자를 요구하는 옵션입니다." #: ../quodlibet/util/__init__.py:188 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "에러: '%s' 는 유일한 prefix 가 아닙니다." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d 초" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "정보에 시간이 없습니다" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d 초" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d 분" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d 시간" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d 일" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d 년" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "날짜는 반드시 'YYYY', 'YYYY-MM-DD' 또는 'YYYY-MM-DD HH:MM:SS' 형식으로 입력해" "야 합니다." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Replay Gain gains must be entered in 'x.yy dB' format." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Replay Gain peaks must be entered in 'x.yy' format." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz IDs must be in UUID format." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "노래를 편집할 수 없습니다" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "<b>%s</b> 저장을 할 수 없습니다. 읽기-전용 파일이거나, 변조된파일입니다. 또" "는 파일에 접근 권한이 없습니다." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[유효하지 않은 인코딩]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "앨범" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "편곡" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "편곡" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "편곡" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "작가" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "작가" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "작곡" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "작곡" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "작곡" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "지휘" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "지휘" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "지휘" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "연락" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "저작권" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "날짜" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "설명" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "장르" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "장르" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "연주" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "그룹" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "언어" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "라이센스" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "주소" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "작사" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "작사" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "작사" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "조직" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "제목" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "버전" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "웹사이트" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "앨범 아티스트" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "디스크" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "트랙" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "라벨 ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "오리지널 출시 날짜" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "오리지널 앨범" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "오리지널 아티스트" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "녹음 날짜" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "출시 국가" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist ID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz track ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz album status" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz album type" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz track ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "track gain" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "track peak" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "album gain" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "album peak" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "설정" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "디스크" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "트랙" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "마지막 시작" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "성명(FullName)" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "마운트 지점" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "가수" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "년" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "오리지널 출시 날짜" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "북마크" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "포맷" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "재생목록" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "브라우저" #~ msgid "Unable to download lyrics." #~ msgstr "가사를 내려받을 수 없습니다" #~ msgid "Remove all songs from the queue" #~ msgstr "대기열의 모든 노래 지우기" #~ msgid "Watch this folder for new songs" #~ msgstr "새 노래를 위해 이 폴더 감시" #~ msgid "Set or toggle the playback order" #~ msgstr "연주 순서 지정 또는 토글(Toggle)" #, fuzzy #~ msgid "Combine tags with _multiple values" #~ msgstr "Split into multiple _values" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "라이브러리를 저장할 수 없습니다" #, fuzzy #~ msgid "Unable to save iPod database" #~ msgstr "라이브러리를 저장할 수 없습니다" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "track peak" #~ msgid "Shuffle" #~ msgstr "섞어서" #~ msgid "Weighted" #~ msgstr "무거운거로" #~ msgid "_Weighted" #~ msgstr "무거운거로" #~ msgid "_One Song" #~ msgstr "선택한 노래" #~ msgid "Restart the playlist when finished" #~ msgstr "완료후 재생목록 재시작" #~ msgid "Disable Browser" #~ msgstr "브라우저 비활성" #~ msgid "_Disable Browser" #~ msgstr "브라우저 비활성" #, fuzzy #~ msgid "Force Write" #~ msgstr "쓰기" #~ msgid "Filter on _Genre" #~ msgstr "장르 필터" #~ msgid "Filter on _Artist" #~ msgstr "아티스트 필터" #~ msgid "Filter on Al_bum" #~ msgstr "앨범 필터" #~ msgid "_Music" #~ msgstr "음악" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "북마크" #~ msgid "Song _List" #~ msgstr "노래 목록" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "이 노래 후 정지" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "and %d more..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Split Disc out of _Album" #, fuzzy #~ msgid "Timeout" #~ msgstr "시간" #, fuzzy #~ msgid "Select an album" #~ msgstr "모두 선택" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s and %(count)d more" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "재생목록" #~ msgid "Re_fresh Library" #~ msgstr "라이브러리 새로고침" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "재생율" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "파일을 열 수 없습니다" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "유효하지 않은 값" #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "command|filename" #~ msgstr "command|filename" #~ msgid "command|tag" #~ msgstr "command|tag" #, fuzzy #~ msgid "heading|Search" #~ msgstr "검색" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "사용법: %s %s" #~ msgid "_Download..." #~ msgstr "내려받기..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "새 방송국" #, fuzzy #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "<b>%s</b> 삭제 실패." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet 이 이미 실행중입니다." #~ msgid "No song is currently playing." #~ msgstr "현재 재생중인 노래가 없습니다." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "%s 에 쓸 수 없음. 제거합니다." #~ msgid "_Edit Bookmarks..." #~ msgstr "북마크 편집" #~ msgid "_New Folder..." #~ msgstr "새 폴더" #~ msgid "_Add to Playlist" #~ msgstr "재생목록 추가" #~ msgid "_Edit Display..." #~ msgstr "_Edit Display..." #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d station" #~ msgid "_Add a Location..." #~ msgstr "주소 추가..." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Customize Headers..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "_Track Headers" #, fuzzy #~ msgid "People Headers" #~ msgstr "_People Headers" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Album Headers" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Date Headers" #, fuzzy #~ msgid "File Headers" #~ msgstr "_File Headers" #, fuzzy #~ msgid "Production Headers" #~ msgstr "_Production Headers" #, fuzzy #~ msgid "Tag:" #~ msgstr "태그:" #, fuzzy #~ msgid "Warnings" #~ msgstr "재생율" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "앨범 아티스트" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "아티스트" #, fuzzy #~ msgid "album (sort)" #~ msgstr "앨범 아티스트" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "연주" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "연주" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz album artist ID" #, fuzzy #~ msgid "errors" #~ msgstr "연주" #~ msgid "Permanently delete this file?" #~ msgstr "이 파일을 영구히 지울까요?" #~ msgid "Permanently delete these files?" #~ msgstr "이 파일을 영구히 지울까요?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s and %(count)d more..." #, fuzzy #~ msgid "Version:" #~ msgstr "버전" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "플러그인 에러" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s 는 라이브러리에 추가할 수 없습니다.\n" #~ "\n" #, fuzzy #~ msgid "No eject command found." #~ msgstr "발견된 방송국이 없습니다" #~ msgid "Unable to start web browser" #~ msgstr "웹브라우저를 시작할 수 없습니다" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "웹브라우저를 찾을 수 없습니다. $BROWSER 환경변수를 지정하거나 경로에 웹브" #~ "라우저의 실행파일이 걸려있는지 확인하십시오." #, fuzzy #~ msgid "Library Error" #~ msgstr "라이브러리 브라우저" #~ msgid "translator-credits" #~ msgstr "" #~ "ChangBom Yoon <changbom.yoon@gmail.com>\n" #~ "Byung-Hee HWANG <bh@izb.knu.ac.kr>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Other columns to display, separated by spaces" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "계속" #~ msgid "Search your library" #~ msgstr "라이브러리 검색" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "총 크기:" #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet 플러그인" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "파랑색은 간단한 검색, 초록색은 복잡한 검색, 빨강색은 유효하지 않은검색" #~ msgid "_Select" #~ msgstr "선택" #~ msgid "Separators for splitting tags" #~ msgstr "Separators for splitting tags" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet 설정" #~ msgid "Not Played To_day" #~ msgstr "Not Played To_day" #~ msgid "Not Played in a _Week" #~ msgstr "Not Played in a _Week" #~ msgid "Not Played in a _Month" #~ msgstr "Not Played in a _Month" #~ msgid "B_ottom 40" #~ msgstr "B_ottom 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "최소 40 곡이 재생되었습니다" #~ msgid "gtk-media-next" #~ msgstr "gtk-media-next" #~ msgid "gtk-media-previous" #~ msgstr "gtk-media-previous" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #, fuzzy #~ msgid "Date" #~ msgstr "날짜" #~ msgid "Choose New Stations" #~ msgstr "새 방송국을 선택하십시오" #~ msgid "Add" #~ msgstr "추가" #, fuzzy #~ msgid "Bitrate" #~ msgstr "비트율" #~ msgid "_Stations..." #~ msgstr "방송국..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Quod Libet 마침" #~ msgid "Unable to save library" #~ msgstr "라이브러리를 저장할 수 없습니다" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "노래를 실행할 수 없습니다" #~ msgid "Sort by title" #~ msgstr "제목 순 정렬" #~ msgid "Sort by artist" #~ msgstr "아티스트 순 정렬" #~ msgid "Lyrics provided by %s." #~ msgstr "가사 제공: %s" #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "발견된 가사 없음.\n" #~ "\n" #~ "Quod Libet 검색을 통해 찾은 온라인 가사를 내려받기 버튼을또는 직접 입력하" #~ "셔도 됩니다. 그리고 저장을 클릭하십시오." #~ msgid "part" #~ msgstr "파트(part)" #~ msgid "Opening audio device." #~ msgstr "오디오 장치 열기" #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d 곡을 저장했습니다" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz album ID" #~ msgid "Loaded song library." #~ msgstr "라이브러리 불러오기" #~ msgid "Unable to open audio device" #~ msgstr "오디오 장치를 열 수 없습니다" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet 이 'alsasink', 'osssink', '%(sink)s' 장치 접근을시도했지만 그것" #~ "들중 어느것도 열 수 없었습니다. ~/.quodlibet/config 파일에서GStreamer " #~ "pipeline 을 찾아 아래처럼 설정을 해주십시오:\n" #~ "\t<b>pipeline = %(sink)s</b>" #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet 이 'filesrc' GStreamer 요소를 찾지 못 합니다. GStreamer 가 설치" #~ "되었는지 확인해보십시오." #, fuzzy #~ msgid "C_opy album covers" #~ msgstr "앨범 표지 보이기" #~ msgid "Unable to retag multiple values" #~ msgstr "Unable to retag multiple values" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "Changing the name of a tag with multiple values is not supported." ��������������������������������������������������������������������������������������������quodlibet-3.9.1/po/fi.po����������������������������������������������������������������������������0000644�0001750�0001750�00000524005�13115512747�015332� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Finnish translation of Quod Libet. # Copyright (C) 2005-2007 Joe Wreschnig, Michael Urman & others # This file is distributed under the same license as the Quod Libet package. # Jari Rahkonen <jari.rahkonen@pp1.inet.fi>, 2005-2007. # # msgid "" msgstr "" "Project-Id-Version: quodlibet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2007-04-28 16:55+0300\n" "Last-Translator: Jari Rahkonen <jari.rahkonen@pp1.inet.fi>\n" "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Muokkaa äänitiedostojesi tunnisteita" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Äänitiedostojen tunniste-editori" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Kuuntele, selaa tai muokkaa äänikokoelmaasi" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Musiikkisoitin" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Nimi" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artisti" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Päivämäärä" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "tyylilaji" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "Ar_vosana" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Järjestys: päivämäärä" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Asetukset" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Albumilista" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Albumilista" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Kaikki albumit" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d albumi" msgstr[1] "%d albumia" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Näytä albumien _kannet" msgstr[1] "Näytä albumien _kannet" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Kappaleet, jotka eivät ole millään albumilla" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d raita" msgstr[1] "%d raitaa" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d levy" msgstr[1] "%d levyä" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Kaikki albumit" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Albumilistan asetukset" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Näytä albumien _kannet" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[valitsimet]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Albuminäkymä" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Tuntematon" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Uusi syöte" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Syötä äänisyötteen sijainti:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Äänisyötteet" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "Äänis_yötteet" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Lataa" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Lataa tiedostoja" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Lataa tiedosto" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Syötettä ei voitu lisätä" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "Sijainnin <b>%s</b> lisääminen ei onnistunut. Ehkä palvelin ei ole linjoilla " "tai sijainti ei ole äänisyöte." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "_Virkistä kirjasto" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Poista tiedostot" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Kirjaston selain" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d kappale" msgstr[1] "%d kappaletta" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Virheellinen hakukaava" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Tuntematon" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Jaa _useammaksi arvoksi" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Mukautettu" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "Ar_vosana" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tunniste" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Albumilistan asetukset" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Koko yhteensä:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Koko yhteensä:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Paneeliselaimen asetukset" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Näytä albumien _kannet" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Kaikki albumit" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "organisaatio" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Tiedostojärjestelmä" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "Tie_dostojärjestelmä" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Kappaleiden kopiointi epäonnistui" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Valittuja tiedostoja ei voi kopioida toisiin soittolistoihin tai jonoon." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Lisää kirjastoon" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Tiedostomuotoa ei tueta" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Kanavalistat voivat sisältää ainoastaan kanavien sijainteja, ei toisia " "kanavalistoja tai soittolistoja. Seuraavien sijaintien avaaminen ei " "onnistunut:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Kanavaa ei voitu lisätä" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internetradio" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Lataa tiedostoja" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Uusi kanava" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Syötä internetradiokanavan sijainti:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "arvosana" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Uusi kanava" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "I_nternetradio" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Uusi kanava" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_Uusi kanava" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Uusi kanava" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Kanavia ei löytynyt." #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Internetradiokanavia ei löytynyt sijainnista %s." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Kaikki luetellut kanavat ovat jo kirjastossasi." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "_Lisää soittolistaan" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "_Poista Soittolistalta" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d kanava" msgstr[1] "%(count)d kanavaa" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Laitteen ominaisuudet" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Laite:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Ei liitetty" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Liitoskohta:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Nimi:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Medialaitteet" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Medialaitteet" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Irrota laite" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Ominaisuudet" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Nimeä" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> käytössä, <b>%s</b> vapaana" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> ei ole yhdistetty." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopioidaan <b>%s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Kappaletta ei voi kopioida" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Kappaleelle ei ole riittävästi tilaa." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "Kohdetta <b>%s</b> ei voitu kopioida." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Kappaleita ei voi poistaa" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Poistetaan <b>%s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "Kohdetta <b>%s</b> ei voitu poistaa." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Kappaletta ei voi poistaa" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Laitteen <b>%s</b> irrottaminen epäonnistui." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Laitetta ei voi irrottaa" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Paneeliselain" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Paneeliselain" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Valitse _Kaikki" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Kaikki" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Paneeliselaimen asetukset" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Soittolistat" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Soittolistat" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Poista Soittolistalta" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Tuo" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Uusi soittolista" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Soittolistan tuonti ei onnistu" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet voi tuoda vain M3U- ja PLS-muotoisia soittolistoja." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Soittolistan nimeäminen ei onnistu" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Tuo soittolista" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Uusi soittolista" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Uusi soittolista" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Paneeliselaimen asetukset" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Soittolistat" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Anna uuden kansion nimi:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Tuodaan soittolista.\n" "\n" "%d/%d kappaletta lisätty." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "Tulosten _määrä" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Hae kirjastosta" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Hae kirjastosta" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Paneeliselain" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Hae" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "sijainti" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet ei ole käynnissä." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "musiikkikirjasto ja soitin" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[valitsimet]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Tulosta soiva kappale ja poistu" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Aloita soitto välittömästi" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Hyppää seuraavaan kappaleeseen" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Hyppää edelliseen kappaleeseen" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Aloita soitto" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Keskeytä soitto" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Keskeytä soitto tai jatka sitä" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Aloita soitto" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Lisää äänenvoimakkuutta" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Vähennä äänenvoimakkuutta" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Tulosta soittimen tila" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Piilota pääikkuna" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Näytä pääikkuna" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Piilota tai näytä pääikkuna" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Kohdista käynnissä olevaan soittimeen" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Poista aktiiviset selainsuodattimet" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "_Virkistä kirjasto" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Sulje selain" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Tulosta nykyinen soittolista" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Tulosta jonon sisältö" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Tulosta jonon sisältö" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet ei ole käynnissä." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Poistu Quod Libetistä" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Siirry soitettavassa kappaleessa" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Keskeytä soitto tai jatka sitä" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "" "Aseta soitontoisto päälle, pois, tai vaihda\n" " sen tilaa" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Aseta äänenvoimakkuus" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Hae äänikirjastostasi" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "kysely" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Soita tiedosto" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "tiedostonimi" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Arvostele soiva kappale" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Valitse nykyinen selain" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Arvostele soiva kappale" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Avaa uusi selain" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Näytä tai piilota jono" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Näytä tai piilota soittolista" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Suodata satunnaisen arvon perusteella" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tunniste" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Suodata tunnisteen arvon perusteella" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tunniste=arvo" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Lisää tiedosto tai kysely jonoon" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "tiedostonimi" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Poista tiedosto tai kysely jonosta" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "VIRHE: Virheellinen argumentti valitsimelle \"%s\"" #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "VIRHE: Kokeile kirjoittaa %s --help" #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Tuntematon laite" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "VIRHE: '%s' ei ole ainutkertainen etuliite." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "Virheellinen arvo" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Tiedoston hakukuvio:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopioi _albumien kannet" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Poista käyttämättömät kannet ja hakemistot" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Näytä _Virheet" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "kuvaus" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "äänitiedostojen tunniste-editori" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "hakemisto" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Virheellinen koodaus]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Nimi" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Äänitiedostojen tunniste-editori" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_Isot alkukirjaimet tunnisteisiin" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Paneeliselaimen asetukset" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Koko yhteensä:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Muokkaa näkymää" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Painoarvo" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Muokkaa näkymää" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Esikatsele" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d sekunti" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Mukautettu" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "Tyhje_nnä virheet" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Musiikkisoitin" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Internetradio" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "Ar_vosana" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Kappaletta ei voi tallentaa" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Liitännäisiä ei löytynyt." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Sanat" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Tyhjennä haku" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Sanat" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "sijainti" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Piilota pääikkuna" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Asetukset" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "hakukaava" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "hakukaava" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d kappale" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Tiedot" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "hakukaava" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "sijainti" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Nimi" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Laite:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Nimi:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "M_uut:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Artisti" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Tiedoston hakukuvio:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Satunnainen alb_umi" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "albumit" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Painoarvo" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Satunnainen alb_umi" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Tuo soittolista" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Tuo" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Sanat" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Soitto katkaistu" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d kappale" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "hakukaava" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Soitto katkaistu" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "_Soittolistat" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Soitin" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_Esikatsele" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Sekoita" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "Soiton_toisto" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Pysäytä tämän kappaleen jälkeen" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Avaa uusi selain" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Muokkaa t_unnisteita" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "T_iedot" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Soittolistat" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Muokkaa näkymää" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Sanat" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Sanat" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Virheet" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Tiedostot" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Esikatsele" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Suodata _artistin perusteella" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Mukautettu" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Suodata t_yylilajin perusteella" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Suodata _artistin perusteella" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Äänisyötteet" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Syötä äänisyötteen sijainti:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Tuo soittolista" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Tuo" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Kanavia ei löytynyt." #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Tiedoston hakukuvio:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Tiedoston hakukuvio:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "_Poista Soittolistalta" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Uusi soittolista" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "soitettu" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "J_ono" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Ei koskaan" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Ei kappaleita" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Tallennetut arvot" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Nimeä" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Kirjasto" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Piilota pääikkuna" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Tiedostonimi" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Kappaletta ei voi tallentaa" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Albumilista" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Koko" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Hae:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Hae" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Albumilista" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Muokkaa kirjanmerkkejä..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Muokkaa kirjanmerkkejä..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Kirjanmerkit" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz albumin tyyppi" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Tiedostonimi" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Levy" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Raita" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Nimi" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "_Artisti" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz albumin tyyppi" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "kysely" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Hae" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Liitännäisiä ei löytynyt." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Selaimet" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Kansiota ei voi luoda" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "tunniste" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Nimeä" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "tunniste" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Virheellinen hakukaava" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Virheellinen arvo" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Mukautettu" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Kappaleiden kopiointi epäonnistui" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Sulje selain" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "Ar_vosana" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "Ar_vosana" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Muokkaa näkymää" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "Ar_vosana" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Suodata tunnisteen arvon perusteella" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer ei voinut avata valittua kappaletta." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Suodata t_yylilajin perusteella" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "J_ono" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Kirjoita" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "hakemisto" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "_Albumiotsakkeet" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Uusi kanava" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Tuo soittolista" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Nimeä" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Tuo soittolista" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Tiedot" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Tuo soittolista" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Soittolistan tuonti ei onnistu" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Laitteen <b>%s</b> irrottaminen epäonnistui." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "_Virkistä kirjasto" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "_Virkistä kirjasto" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Muokkaa tunnisteita" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Muokkaa tunnisteita" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Kaikki albumit" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Esikatsele" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Tunniste" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Kappaleita ei voi poistaa" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Hae" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "hakukaava" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Muokkaa tallennettuja arvoja..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Väritä _hakuehdot" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Kirjasto" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Tarkistetaan liitoskohdat" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Luetaan musiikkikirjastoa" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Luetaan kohdetta %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Näytä _ohjelmalliset tunnisteet" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "kuvaus" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Arvo" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Äänitiedostojen tunniste-editori" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Ei kappaleita valittuna" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Suodata tunnisteen arvon perusteella" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Suodata tunnisteen arvon perusteella" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Ei aikatietoa" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Tiedoston nimeäminen ei onnistu" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Tiedosto" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Näytä lyhyt käyttöohje" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> ei ole kelvollinen sijainti." #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "Tuntematon" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Järjestyksessä" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_Järjestyksessä" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "Satunnainen al_bumi" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "Satunnainen al_bumi" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "Soiton_toisto" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Yksi kappale" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d sekunti" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Kanavia ei löytynyt." #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "Kansiota ei voi luoda" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "Liitä_nnäiset" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Tuetut tiedostomuodot: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Äänilaite: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Alku" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "-" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Aika" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Kirjanmerkin nimi" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Kirjanmerkit" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "S_uodattimet" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "_Ei soitettu koskaan" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Uusi kanava" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Satunnainen _tyylilaji" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Satunnainen a_rtisti" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Satunnainen alb_umi" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "40 eniten soittamaasi kappaletta (tasapelitilanteissa saatetaan valita " "enemmän kuin 40)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Arvo:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Tallennetut arvot" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Muokkaa tallennettuja arvoja..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "_Raitaotsakkeet" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "_Albumiotsakkeet" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "_Replay Gain äänenvoimakkuuden säätö" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Tuntematon" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Suodata tunnisteen arvon perusteella" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Tiedostot" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Poista tiedostot" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Siirrä roskakoriin" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Siirretään %d/%d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "iPod-tietokantaa ei voi tallentaa" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Laitteen <b>%s</b> irrottaminen epäonnistui." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Poistetaan %d/%d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Tiedoston poistaminen epäonnistui" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Kohteen <b>%s</b> poistaminen epäonnistui." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Lataukset" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Koko" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "puuttuu %d kappaleesta" msgstr[1] "puuttuu %d kappaleesta" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "eri %d kappaleessa" msgstr[1] "eri %d kappaleessa" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Jaa _useammaksi arvoksi" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Erota levyn numero _albumin nimestä" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Erota _versio kappaleen nimestä" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Erota sovittaja ar_tistin nimestä" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Erota _esittäjä artistin nimestä" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Erota _esittäjä artistin nimestä" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Erota _versio kappaleen nimestä" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Lisää tunniste" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tunniste:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Muokkaa tunnisteita" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Näytä _ohjelmalliset tunnisteet" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Ei koskaan" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Tunnistetta ei voi lisätä" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Kappaletta ei voitu lisätä" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Tunnistetta <b>%s</b> ei voi lisätä\n" "\n" "Valitut tiedostot eivät tue useita arvoja samalle tunnisteelle." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Virheellinen tunniste" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Tunniste <b>%s</b> ei kelpaa\n" "\n" "Valitut tiedostot eivät tue tämän tunnisteen muokkaamista." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Virheellinen arvo" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Arvo ei kelpaa: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Tunniste saattaa olla epätarkka" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> muuttui ohjelman ollessa käynnissä. Jos tallennat virkistämättä " "kirjastoa, saatat korvata muita kappaleeseen tehtyjä muutoksia.\n" "\n" "Tallennetaanko kappale siitä huolimatta?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Kappaletta ei voi tallentaa" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Kappaleen <b>%s</b> tallentaminen epäonnistui. Tiedosto saattaa olla vain " "luku -muodossa, viallinen, tai sinulla ei ole oikeuksia sen muokkaamiseen." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Lisäasetukset" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "Liitä_nnäiset" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s ja %(count)d muuta" msgstr[1] "%(title)s ja %(count)d muuta" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falson Asetukset" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "_Erotin:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Tunnisteiden muokkaus" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Kansiot" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Uusi kansio" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Valitse alihakemistot" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Uusi kansio" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Anna uuden kansion nimi:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Kansiota ei voi luoda" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Kansiota ei voi poistaa" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Kappaleet" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "%s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Levy %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Raita %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Muokkaa näkymää" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Ei kappaleita valittuna" #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Ei kappaleita" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Tiedot" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Sanat" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Tuottanut %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artisti" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artistit" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "esittäjää" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Ei koskaan" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d kerran" msgstr[1] "%d kertaa" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "lisätty" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "soitettu" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "soittokertoja" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "ohituksia" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "arvosana" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "kesto" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Tiedot" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[Virheellinen koodaus]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bittinopeus" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "tiedostokoko" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "muokattu" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d valittu" msgstr[1] "%d valittu" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Raita ei ole käytettävissä" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Kappaleet" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d albumiton kappale" msgstr[1] "%d albumitonta kappaletta" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Valittu diskografia" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d kappale, jonka artisti tuntematon" msgstr[1] "%d kappaletta, joiden artisti tuntematon" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albumit" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Kesto yhteensä:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Koko yhteensä:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Tiedostot" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Lataa" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Muokkaa näkymää..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Kappaleelle ei löydy sanoja." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Etsitään laulun sanoja..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Hylkää muutokset tunnisteisiin?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tunnisteita on muutettu, mutta ei tallennettu. Tallennetaanko tiedostot, vai " "hylätäänkö muutokset?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Ei koskaan" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Tiedosto on olemassa" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Nimeä tiedostot" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Keskeytä soitto tai jatka sitä" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Keskeytä soitto tai jatka sitä" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Liitännäisten virheet" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "Sulje selain" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Soittotapa:" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Tunnisteiden muokkaus" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Koko yhteensä:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Liitännäisiä ei löytynyt." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "Liitä_nnäiset" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Näytä _Virheet" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Levy" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Raita" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "ryhmittely" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_bumi" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Tie_dostonimi" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Kesto" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Hyppää soivaan kappaleeseen automaattisesti" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Kun soitettava kappale vaihtuu, vieritä soittolistaa sen kohdalle" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "M_uut:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Muokkaa näkymää..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Näytettävät sarakkeet" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Nimi sisältää v_ersion" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Nimi sisältää v_ersion" #: ../quodlibet/qltk/prefs.py:108 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Albumi sisältää _osan" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Tiedostonimi sisältää hake_miston" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Asetukset" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Kappalelista" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Näytettävät sarakkeet" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Yleissuodatin:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Hae" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Selaimet" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "Kun soitettava kappale vaihtuu, vieritä soittolistaa sen kohdalle" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "Ar_vosana" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Albumilista" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Keskeytä soitto" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "_Äänen vahvistus (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "_Äänen vahvistus (dB):" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "_Replay Gain äänenvoimakkuuden säätö" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "_Replay Gain äänenvoimakkuuden säätö" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "Ar_vosana" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "Tallenna arvosanat ja soittomäärät" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Sähköposti:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Arvosanat ja soittomäärät asetetaan tälle osoitteelle" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Hylkää muutokset tunnisteisiin?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Muokkaa tunnisteita" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Uusi kanava" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "_Virkistä kirjasto" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Hae kirjastosta" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Etsi muutoksia kirjastostasi" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Lataa kirjasto _uudelleen" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Lataa kaikki kirjaston kappaleet uudelleen (tämä saattaa kestää kauan)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Käy läpi _hakemistot" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Ei kappaleita" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, fuzzy, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s ja %(count)d muuta" msgstr[1] "%(title)s ja %(count)d muuta" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Ominaisuudet" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "J_ono" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "Tyhje_nnä virheet" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d kappale (%(time)s)" msgstr[1] "%(count)d kappaletta (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Selaa kirjastoa" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Piilota tai näytä pääikkuna" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Keskeytä soitto" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Valitse hakemistot" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Kappaleita ei voi lisätä" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "Kohteen <b>%s</b> käyttämää protokollaa ei tueta." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Hyppää soivaan kappaleeseen" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Tiedosto" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Kappaleet" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Näytä" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Selaimet" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "O_hjaus" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Ohje" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "Lisää _kansio..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "Lisää _tiedosto..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Lisää sijainti" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Muokkaa kirjanmerkkejä..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Pysäytä tämän kappaleen jälkeen" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Hae" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Lisää sijainti" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Syötä äänitiedoston sijainti:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Sijaintia ei voi lisätä" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> ei ole kelvollinen sijainti." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Lisää musiikkia" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "Lisää _kansio..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Musiikkisoitin" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Lisää _tiedosto..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "Ar_vosana" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "Ar_vosana" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Korvaa _välilyönnit alaviivoilla" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Poista _Windows-yhteensopimattomat merkit" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Poista ta_rkkeet" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Poista _ASCII:hin kuulumattomat merkit" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Nimeä tiedostot" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "hakukaava" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Muokkaa tallennettuja arvoja..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Esikatsele" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Uusi nimi" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Tiedoston nimeäminen ei onnistu" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Nimeäminen lähteestä <b>%s</b> kohteeseen <b>%s</b> ei onnistu. " "Kohdetiedosto on mahdollisesti jo olemassa, tai sinulla ei ole oikeuksia " "uuden tiedoston luomiseen tai vanhan poistamiseen." #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "Näytä _Virheet" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Jatka" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Polku ei ole absoluuttinen" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Kaava\n" "\t<b>%s</b>\n" "sisältää merkin /, mutta ei ala juurihakemistosta. Välttääksesi hakemistojen " "väärinnimeämistä, aloita kaavasi merkeillä / tai ~/." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Näissä (kaksoispisteellä erotetuissa) hakemistoissa olevat kappaleet " "lisätään kirjastoosi" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Valitse hakemistot" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Tallennetut arvot" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Muokkaa tallennettuja arvoja..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "Pysäytä tämän kappaleen jälkeen" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Rajoite:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Painoarvo" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Näytä jäljellä oleva aika" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Sanat" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Kohdista käynnissä olevaan soittimeen" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Siirry soitettavassa kappaleessa" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Kappaleita ei voi poistaa" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Kappaleita ei voi poistaa" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Suodata sarakkeen \"%s\" perusteella" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "_Albumiotsakkeet" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "_Raitaotsakkeet" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Albumiotsakkeet" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Tekijäotsakkeet" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Ai_kaotsakkeet" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Tie_dosto-otsakkeet" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "T_uotanto-otsakkeet" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Mukauta otsakkeita..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Väritä _hakuehdot" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Lisää _jonoon" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Kopioi laitteeseen" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Poista Soittolistalta" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Korvaa alaviivat _välilyönneillä" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Isot alkukirjaimet tunnisteisiin" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Jaa _useampaan arvoon" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tunnisteet polusta" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Tunnisteet korvaavat olemassaolevat" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Tunnisteet lisätään olemassaoleviin" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Kaava\n" "\t<b>%s</b>\n" "on virheellinen. Se saattaa sisältää saman tunnisteen kahdesti tai " "parittomia pienemmyys/suuremmuusmerkkejä (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Tunnisteet eivät kelpaa" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Tunnisteet <b>%s</b> eivät kelpaa\n" "\n" "Valitut tiedostot eivät tue näiden tunnisteiden muokkaamista." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Syöttämäsi hakukaava ei kelpaa. Varmista, että syötät merkit < ja > " "muodossa \\< ja \\> ja että tunnisteita ei jää sulkematta.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Muokkaa näkymää" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Raitanumerot" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Aloitus_kohta:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "Raitoja _yhteensä:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Soitin" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_Esikatsele" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "ja %d muuta..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Tallennetaan muuttamasi kappaleet." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Siirretään %d/%d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Tarkistetaan liitoskohdat" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "sijainti" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Soittolista on jo olemassa nimellä %s." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Näytä albumien _kannet" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Tiedostojärjestelmä" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Näytä lyhyt käyttöohje" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Näytä versio ja tekijänoikeustiedot" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[valitsimet]" #: ../quodlibet/util/__init__.py:182 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "VIRHE: Valitsin '%s' ei kelpaa." #: ../quodlibet/util/__init__.py:185 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "VIRHE: Valitsin '%s' vaatii argumentin." #: ../quodlibet/util/__init__.py:188 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "VIRHE: '%s' ei ole ainutkertainen etuliite." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kb/s" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d sekunti" msgstr[1] "%d sekuntia" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Ei aikatietoa" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekunti" msgstr[1] "%d sekuntia" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minuutti" msgstr[1] "%d minuuttia" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d tunti" msgstr[1] "%d tuntia" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d päivä" msgstr[1] "%d päivää" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d vuosi" msgstr[1] "%d vuotta" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "no" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Päivämäärä täytyy syöttää muodossa 'VVVV', 'VVVV-KK-PP' tai 'VVVV-KK-PP HH:" "MM:SS'." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Replay Gainin vahvistukset syötetään muodossa 'x.yy dB'." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Replay Gainin huiput syötetään muodossa 'x.yy'." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz-kappaletunnisteiden on oltava UUID-muodossa." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz-julkaisun tilaksi kelpaa 'official', 'promotional' tai 'bootleg'." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Kappaleen muokkaaminen epäonnistui" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Kappaleen <b>%s</b> tallentaminen epäonnistui. Tiedosto saattaa olla vain " "luku -muodossa, viallinen, tai sinulla ei ole oikeuksia sen muokkaamiseen." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Virheellinen koodaus]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "albumi" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "sovittaja" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "sovittajaa" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "sovittaja" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "kirjoittaja" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "kirjoittajaa" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "säveltäjä" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "säveltäjää" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "säveltäjä" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "kapellimestari" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "orkesterinjohtajaa" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "kapellimestari" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "yhteys" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "tekijänoikeus" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "päivämäärä" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "kuvaus" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "tyylilaji" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "tyylilaji" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "esittäjä" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "ryhmittely" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "kieli" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "lisenssi" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "sijainti" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "sanoittaja" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "sanoittajaa" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "sanoittaja" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organisaatio" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "nimi" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versio" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "web-sivusto" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "albumin artisti" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "levy" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "raita" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "nimikkeen tunniste" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "alkuperäinen julkaisupvm" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "alkuperäinen albumi" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "alkuperäinen artisti" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "nauhoituspäivämäärä" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "Julkaisumaa" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artistin tunniste" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz raidan tunniste" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM-tunniste" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz albumin tila" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz albumin tyyppi" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz raidan tunniste" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "raidan vahvistus" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "raidan huippu" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "albumin vahvistus" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "albumin huippu" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Asetukset" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "levyt" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "raidat" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "soitto aloitettu" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "täydellinen nimi" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "liitoskohta" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "henkilöt" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "vuosi" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "alkuperäinen julkaisupvm" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "Kirjanmerkit" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "muoto" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Soittolistat" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Selaimet" #~ msgid "Unable to download lyrics." #~ msgstr "Laulun sanojen lataaminen ei onnistu" #~ msgid "Remove all songs from the queue" #~ msgstr "Poista kaikki kappaleet jonosta" #~ msgid "Watch this folder for new songs" #~ msgstr "Tarkkaile tätä kansiota uusien kappaleitten varalta" #~ msgid "Set or toggle the playback order" #~ msgstr "Aseta tai vaihda soittojärjestystä" #~ msgid "Uninitialized iPod" #~ msgstr "Alustamaton iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Haluatko luoda iPodiin tyhjän tietokannan?" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Äänen vahvistus (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Yhdistä _moniarvoiset tunnisteet" #~ msgid "Model:" #~ msgstr "Malli:" #~ msgid "Capacity:" #~ msgstr "Tallennustila:" #~ msgid "Firmware:" #~ msgstr "Laiteohjelmisto:" #, fuzzy #~ msgid "Removing orphaned iPod track" #~ msgstr "VAROITUS: poistetaan orvoksi jäänyt iPod-kappale" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "iPod-tietokantaa ei voi tallentaa" #~ msgid "Unable to save iPod database" #~ msgstr "iPod-tietokantaa ei voi tallentaa" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "raidan huippu" #~ msgid "Shuffle" #~ msgstr "Sekoitettu" #~ msgid "Weighted" #~ msgstr "Painotettu" #~ msgid "_Weighted" #~ msgstr "_Painotettu" #~ msgid "_One Song" #~ msgstr "_Yksi kappale" #~ msgid "Restart the playlist when finished" #~ msgstr "Aloita soittolista alusta, kun kaikki kappaleet on soitettu" #~ msgid "Disable Browser" #~ msgstr "Sulje selain" #~ msgid "_Disable Browser" #~ msgstr "S_ulje selain" #, fuzzy #~ msgid "Force Write" #~ msgstr "Kirjoita" #~ msgid "Filter on _Genre" #~ msgstr "Suodata t_yylilajin perusteella" #~ msgid "Filter on _Artist" #~ msgstr "Suodata _artistin perusteella" #~ msgid "Filter on Al_bum" #~ msgstr "Suodata al_bumin perusteella" #~ msgid "_Music" #~ msgstr "_Musiikki" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Kirjanmerkit" #~ msgid "Song _List" #~ msgstr "_Kappalelista" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Pysäytä tämän kappaleen jälkeen" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "ja %d muuta..." #~ msgstr[1] "ja %d muuta..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Erota levyn numero _albumin nimestä" #, fuzzy #~ msgid "Timeout" #~ msgstr "Aika" #, fuzzy #~ msgid "Select an album" #~ msgstr "Valitse _Kaikki" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s ja %(count)d muuta" #~ msgstr[1] "%(title)s ja %(count)d muuta" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Soittolistat" #~ msgid "Re_fresh Library" #~ msgstr "_Virkistä kirjasto" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "Ar_vosana" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Tiedostojen avaaminen ei onnistu" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Virheellinen arvo" #, fuzzy #~ msgid "ql-revert" #~ msgstr "P_oista kirjastosta" #~ msgid "command|filename" #~ msgstr "tiedostonimi" #~ msgid "command|tag" #~ msgstr "tunniste" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Hae" #~ msgid "%d of %d" #~ msgstr "%d/%d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Käyttö: %s %s" #~ msgid "_Download..." #~ msgstr "_Lataa..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Uusi kanava" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Korvataanko <b>%s</b>?" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet on jo käynnissä" #~ msgid "No song is currently playing." #~ msgstr "Ei kappaletta soitossa." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Kohteeseen %s ei voi kirjoittaa. Poistetaan." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Muokkaa kirjanmerkkejä..." #~ msgid "_New Folder..." #~ msgstr "_Uusi kansio..." #~ msgid "_Add to Playlist" #~ msgstr "_Lisää soittolistaan" #~ msgid "_Edit Display..." #~ msgstr "_Muokkaa näkymää..." #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d kanava" #~ msgid "_Add a Location..." #~ msgstr "Lisää s_ijainti..." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Mukauta otsakkeita..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "_Raitaotsakkeet" #, fuzzy #~ msgid "People Headers" #~ msgstr "_Tekijäotsakkeet" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Albumiotsakkeet" #, fuzzy #~ msgid "Date Headers" #~ msgstr "Ai_kaotsakkeet" #, fuzzy #~ msgid "File Headers" #~ msgstr "Tie_dosto-otsakkeet" #, fuzzy #~ msgid "Production Headers" #~ msgstr "T_uotanto-otsakkeet" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Tunniste:" #, fuzzy #~ msgid "Warnings" #~ msgstr "Ar_vosana" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "albumin artisti" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "artistit" #, fuzzy #~ msgid "album (sort)" #~ msgstr "albumin artisti" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "esittäjää" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "esittäjää" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz albumin artistin tunniste" #~ msgid "errors" #~ msgstr "virheet" #~ msgid "Permanently delete this file?" #~ msgstr "Poistetaanko tiedosto lopullisesti?" #~ msgid "Permanently delete these files?" #~ msgstr "Poistetaanko tiedostot lopullisesti?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s ja %(count)d muu..." #~ msgstr[1] "%(title)s ja %(count)d muuta..." #, fuzzy #~ msgid "Version:" #~ msgstr "versio" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "Tyhje_nnä virheet" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "Kohdetta %s ei voitu lisätä kirjastoosi.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Irrotuskomentoa ei löytynyt." #~ msgid "Unable to start web browser" #~ msgstr "Web-selainta ei voi käynnistää" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Web-selainta ei löydy. Aseta $BROWSER-muuttujasi, tai varmista, että /usr/" #~ "bin/sensible-browser on olemassa." #, fuzzy #~ msgid "Library Error" #~ msgstr "Kirjaston selain" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Kopioi laitteeseen" #~ msgid "translator-credits" #~ msgstr "Jari Rahkonen <jari.rahkonen@pp1.inet.fi>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Muut näytettävät sarakkeet välilyönneillä erotettuna" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "_Jatka" #~ msgid "Search your library" #~ msgstr "Hae kirjastostasi" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, ja muut\n" #~ "\n" #~ "Tämä on vapaa ohjelma; kopiointiehdot löydät lähdekoodista. " #~ "Minkäänlaista\n" #~ "takuuta EI ole; ei edes koskien KAUPPAKELPOISUUTTA tai TIETTYYN " #~ "TEHTÄVÄÄN\n" #~ "SOVELTUVUUTTA.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Koko yhteensä:" #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libetin liitännäiset" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Näytä yksinkertaiset haut sinisinä, erityishaut vihreinä ja virheelliset " #~ "haut punaisina" #~ msgid "_Select" #~ msgstr "_Valitse" #~ msgid "Separators for splitting tags" #~ msgstr "Erottimet tunnisteiden katkaisemiseen" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libetin asetukset" #~ msgid "Not Played To_day" #~ msgstr "Ei soitettu _tänään" #~ msgid "Not Played in a _Week" #~ msgstr "Ei soitettu _viikkoon" #~ msgid "Not Played in a _Month" #~ msgstr "Ei soitettu _kuukauteen" #~ msgid "B_ottom 40" #~ msgstr "_Viimeiset 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "40 vähiten soittamaasi kappaletta (tasapelitilanteissa saatetaan valita " #~ "enemmän kuin 40)" #~ msgid "gtk-media-next" #~ msgstr "S_euraava" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #, fuzzy #~ msgid "Date" #~ msgstr "_Päivämäärä" #~ msgid "Choose New Stations" #~ msgstr "Valitse uusia kanavia" #~ msgid "Add" #~ msgstr "Lisää" #, fuzzy #~ msgid "Bitrate" #~ msgstr "bittinopeus" #~ msgid "_Stations..." #~ msgstr "_Kanavat..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Poistu Quod Libetistä" #~ msgid "Unable to save library" #~ msgstr "Kirjastoa ei voi tallentaa" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Kappaletta ei voi soittaa" #~ msgid "Sort by title" #~ msgstr "Järjestys: nimi" #~ msgid "Sort by artist" #~ msgstr "Järjestys: artisti" #~ msgid "Lyrics provided by %s." #~ msgstr "Laulun sanat tarjoaa %s" #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Laulun sanoja ei löytynyt.\n" #~ "\n" #~ "Voit pyytää Quod Libetiä etsimään sanoja verkosta Lataa-painikeella. Voit " #~ "myös syöttää ne itse ja klikata sitten tallennuspainiketta." #~ msgid "part" #~ msgstr "osa" #~ msgid "Opening audio device." #~ msgstr "Avataan äänilaite." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d kappaletta tallennettu" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz albumin tunniste" #~ msgid "Loaded song library." #~ msgstr "Musiikkikirjasto ladattu." #~ msgid "Unable to open audio device" #~ msgstr "Äänilaitetta ei voi avata" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet yritti käyttää ajureita 'autosink' ja '%(sink)s', mutta niiden " #~ "avaaminen ei onnistunut. Aseta GStreamerin pipeline rivillä\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "tiedostossa ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet ei löytänyt GStreamerin 'filesrc' -elementtiä. Tarkista " #~ "GStreamer-asennuksesi." ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/tr.po����������������������������������������������������������������������������0000644�0001750�0001750�00000526600�13115512747�015364� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Language po/tr translations for PACKAGE package. # Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # genel <turerkan@gmail.com>, 2009. # msgid "" msgstr "" "Project-Id-Version: Quod Libet 2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:32+0100\n" "Last-Translator: Turerkan <turerkan@gmail.com>\n" "Language-Team: Turerkan <turerkan@gmail.com>\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Ses dosyalarınızdaki etiketleri düzenler" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Müzik etiketleri düzenleyici" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Müzik arşivinizi gezin, dinleyin, düzenleyin" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Müzik Çalar" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Ad" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Sanatçı" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Tarih" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "Tür" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Puan" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Tarihe göre sırala" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Ayarlar" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Albüm Listesi" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Albüm Listesi" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Tüm albümler" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d albüm" msgstr[1] "%d albüm" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Albüm _kapaklarını göster" msgstr[1] "Albüm _kapaklarını göster" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Bir albümde olmayan şarkılar" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d şarkı" msgstr[1] "%d şarkı" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disk" msgstr[1] "%d disk" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Tüm albümler" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Albüm listesi ayarları" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Albüm _kapaklarını göster" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "_Arama kişileri de içerir" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[ayarlar]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Albüm Görünümü" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Bilinmeyen" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Yeni Bildirim" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Ses bildiriminin yerini girin:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Ses bildirimleri" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Ses Bildirimleri" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_İndir" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Dosyaları İndir" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Dosyayı İndir" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Bildirim eklenemiyor" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> eklenemedi. Sunucu çalışmıyor olabilir, veya adreste bir ses " "bildirimi olmayabilir." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "Arşivi _Yenile" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Dosyaları Sil" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Arşiv Gezici" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d şarkı" msgstr[1] "%d şarkı" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Geçersiz süzgeç" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Bilinmeyen" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Birden fazla değelere _böl" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Özel" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Puan" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Etiket" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Albüm listesi ayarları" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Toplam boyut:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Toplam boyut:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Panelli Gezici Ayarları" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Albüm _kapaklarını göster" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Tüm albümler" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "organizasyon" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Dosya Sistemi" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Dosya Sistemi" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Şarkılar kopyalanamıyor" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Seçilen şarkılar başka çalma listelerine veya çalma kuyruğuna kopyalanamıyor." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Arşive Ekle" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Dosya türü desteklenmiyor" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Kanal listesi sadece kanal adresi içerebilir. Diğer kanal listelerini veya " "çalma listelerini içeremez. Bu adres yüklenemedi:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Kanal eklenemedi" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "İnternet Radyosu" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Dosyaları İndir" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Yeni Kanal" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "İnternet radyo kanalı adresi girin:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "puan" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Yeni Kanal" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_İnternet Radyosu" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Yeni Kanal" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_Yeni Kanal" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Yeni Kanal" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Kanal bulunamadı" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "%s adresinde İnternet radyo kanalı bulunamadı." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Listelenen tüm radyolar zaten arşivinizde." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "Çalma Listesine _Ekle" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "Çalma Listesinden _Çıkar" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d kanal" msgstr[1] "%(count)d kanal" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Aygıt Özellikleri" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Aygıt:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Bağlanmamış" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Bağlama Yeri:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_İsim:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Ortam Aygıtları" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Ortam Aygıtları" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Çıkart" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Özellikler" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Yeniden Adlandır" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> kullanılmış, <b>%s</b> boş" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> takılı değil." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>%(song)s</b> Kopyalanıyor" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Şarkı kopyalanamadı" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Bu şarkı için yeterli boş yer yok." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> kopyalanamadı." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Şarkılar silinemiyor" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>%(song)s</b> siliniyor" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> silinemedi." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Şarkı silinemedi" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>%s</b> çıkartılamadı." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Aygıt çıkartılamadı" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Panelli Gezici" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Panelli Gezici" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Hepsini _Seç" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Hepsi" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Panelli Gezici Ayarları" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Çalma Listeleri" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Çalma Listeleri" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Çalma Listesinden _Çıkar" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "İçe _Aktar" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Yeni Çalma Listesi" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Çalma listesi içe aktarılamadı" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet sadece M3u ve PLS biçimli çalma listelerini içe aktarabilir." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Çalma Listesinin adı değiştirilemedi" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Çalma Listesi İçe Aktar" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Yeni Çalma Listesi" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Yeni Çalma Listesi" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Panelli Gezici Ayarları" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Çalma Listeleri" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Yeni dizin için isim girin:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Şarkı listesi içe aktarılıyor.\n" "\n" "%(current)d/%(total)d şarkı eklendi." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "Sonuçları _Sınırla" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Arşivde Ara" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "Arşivde _Ara" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Panelli Gezici" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Ara" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "konum" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet çalışmıyor." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "bir müzik arşivleyici ve çalıcı" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[ayarlar]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Çalan şarkıyı göster ve çık" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Hemen çalmaya başla" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Sonraki şarkıya atla" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Önceki şarkıya atla" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Çalmaya başla" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Çalmayı duraklat" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "çalma/duraklama durumunu değiştir" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Çalmaya başla" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Sesi aç" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Sesi kıs" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Durum bilgisini göster" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Ana pencereyi gizle" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Ana pencereyi göster" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Ana pencere görünürlüğünü değiştir" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Çalışan müzikçalara odaklan" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Geçerli gezici süzgeçlerini kaldır" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Arşivi yenile ve tekrar tara" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Geziciyi Gizle" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Şu anki çalma listesini göster" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Çalma kuyruğunu göster" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Çalma kuyruğunu göster" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet çalışmıyor." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Quod Libet'ten çık" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Şarkı içinde ileri/geri git" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][SS:]DD:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "çalma/duraklama durumunu değiştir" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Başa dönmeyi aç, kapat veya değiştir" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Ses yüksekliğini değiştir" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Müzik arşivinde arama yap" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "sorgu" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Bir ses dosyası çal" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "dosya adı" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Çalan şarkıya puan ver" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Geziciyi değiştir" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Çalan şarkıya puan ver" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Yeni bir gezici aç" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Çalma kuyruğunu göster veya sakla" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Şarkı listesini göster veya sakla" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Rastgele bir değerle süz" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Etiket" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Bir etiket değerine göre süz" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "etiket=değer" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "bir dosya veya sorguyu çalma kuyruğuna koy" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "dosya adı" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "bir dosya veya sorguyu çalma kuyruğundan çıkar" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "'%s' için geçersiz parametre." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Yardım için %s --help komutunu deneyin." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Bilinmeyen Aygıt" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r desteklenen bir aygıt değil." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "Ses altsistemi yükleniyor (%s)" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 #, fuzzy msgid "Device backend initialized." msgstr "%r ses altsistemi kurulu değil." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Dosya Adı Süzgeci:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Albüm kapaklarını kopyala" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "Kullanılmayan albüm kapakları ve dizinleri _sil" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Hata Oldu" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "_Hataları Göster" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "açıklama" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "bir müzik etiketleyicisi" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "dizin" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz şarkı ID'si" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz şarkı ID'si" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[kodlama Hatası]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Ad" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Müzik etiketleri düzenleyici" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "Etiketlerde _büyük/küçük harfleri düzelt" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Panelli Gezici Ayarları" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Toplam boyut:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Görünümü Değiştir" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Ağırlık" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Görünümü Değiştir" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Önizleme" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d saniye" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Özel" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "Hataları _Sil" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Müzik Çalar" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "İnternet Radyosu" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Puan" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Şarkı kaydedilemedi" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Eklenti bulunamadı." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Sözler" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Aramayı temizle" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Sözler" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "konum" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Ana pencereyi gizle" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Ayarlar" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "süzgeç" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "süzgeç" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d şarkı" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Çıktı Kaydı" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "süzgeç" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "konum" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Ad" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Aygıt:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_İsim:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Diğerleri:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Sanatçı" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Dosya Adı Süzgeci:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "_Rastgele Albüm" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "albümler" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Ağırlık" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "_Rastgele Albüm" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Çalma Listesi İçe Aktar" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "İçe _Aktar" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Sözler" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Çalmıyor" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d şarkı" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "süzgeç" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Çalmıyor" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "_Çalma Listeleri" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Çalıcı" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_Önizleme" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Rastgele" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Başa dön" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Bu şarkıdan sonra dur" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Yeni bir gezici aç" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "_Etiketleri Değiştir" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Bilgi" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Çalma Listeleri" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Görünümü Değiştir" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Sözler" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Sözler" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Hatalar" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Dosyalar" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Önizleme" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "_Sanatçıya göre süz" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Özel" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "_Türe göre süz" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "_Sanatçıya göre süz" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Ses bildirimleri" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Ses bildiriminin yerini girin:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Çalma Listesi İçe Aktar" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "İçe _Aktar" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Kanal bulunamadı" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Dosya Adı Süzgeci:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Dosya Adı Süzgeci:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Çalma Listesinden _Çıkar" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Yeni Çalma Listesi" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "en son çalındı" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "Çalma _Kuyruğu" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Hiçbir Zaman" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Şarkı yok" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Kayıtlı Değerler" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Yeniden Adlandır" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Arşiv" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Ana pencereyi gizle" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Dosya Adı" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Şarkı kaydedilemedi" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Albüm Listesi" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Boyut" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Ara:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Ara" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Albüm Listesi" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "Yer imlerini _değiştir" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "Yer imlerini _değiştir" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Yer imleri" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz albüm türü" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Dosya Adı" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Disk" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Şarkı" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Ad" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "_Sanatçı" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz albüm türü" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "sorgu" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Ara" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Eklenti bulunamadı." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Geziciler" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Dizin yaratılamadı" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "etiket" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Yeniden Adlandır" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "etiket" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Geçersiz süzgeç" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Geçersiz değer" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Özel" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Şarkılar kopyalanamıyor" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Geziciyi Gizle" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "_Puan" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_Puan" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Görünümü Değiştir" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "_Puan" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Bir etiket değerine göre süz" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "_Türe göre süz" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "Çalma _Kuyruğu" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Yaz" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz şarkı ID'si" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "dizin" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "_Albüm Etiketleri" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Yeni Kanal" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Çalma Listesi İçe Aktar" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 #, fuzzy msgid "Error during sync" msgstr "%r yüklenemedi." #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Yeniden Adlandır" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Çalma Listesi İçe Aktar" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Bilgi" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Çalma Listesi İçe Aktar" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Çalma listesi içe aktarılamadı" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "<b>%s</b> çıkartılamadı." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "Arşivi _Yenile" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "Arşivi _Yenile" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Etiketleri değiştir" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Etiketleri değiştir" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Tüm albümler" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Önizleme" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Etiket" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Şarkılar silinemiyor" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Ara" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "süzgeç" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Kayıtlı değerleri değiştir..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Arama kriterlerini _renklendir" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Arşiv" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Bağlama yerleri denetleniyor" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Arşiv taranıyor" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "%s taranıyor" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "_Programatik etiketleri göster" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 #, fuzzy msgid "Too many arguments" msgstr "Çok Fazla Hata" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "açıklama" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Değer" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Müzik etiketleri düzenleyici" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Seçili şarkı yok." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Bir etiket değerine göre süz" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Bir etiket değerine göre süz" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Süre bilgisi yok" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Dosya yeniden adlandırılamadı" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Dosya" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Özet kullanım bilgisi göster" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> geçerli bir adres değil." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Bilinmeyen" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Sırayla" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_Sırayla" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Rastgele" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Rastgele" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Başa dön" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Bir Şarkı" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d saniye" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Kanal bulunamadı" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Ses çıkışı yaratılamadı." #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Ses aygıtı %r bulunamadı. ~/.quodlibet/config dosyasındaki Xine ayarlarınızı " "kontrol edin." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Eklentiler" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Desteklenen biçimler: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Ses aygıtı: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Baş" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "Yok" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Süre" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Yer İmi Adı" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "DD:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Yer imleri" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Süzgeçler" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "_Hiç çalınmadı" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Tepe 40" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Yeni Kanal" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Rastgele Müzik _Türü" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Rastgele _Sanatçı" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "_Rastgele Albüm" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "En çok çaldığınız 40 şarkı (eşitlik varsa 40'tan fazla olabilir)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Değer:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Kayıtlı Değerler" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Kayıtlı değerleri değiştir..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "Şarkı _Numarası Etiketleri" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "_Albüm Etiketleri" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Ses Düzeyi Düzeltmesi" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Bilinmeyen" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Bir etiket değerine göre süz" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Dosyalar" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Dosyaları Sil" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Çöpe Taşı" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "%(current)d/%(total)d Taşınıyor." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "iPod veritabanı kaydedilemedi" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "<b>%s</b> çıkartılamadı." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "%(current)d/%(total)d Siliniyor." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Dosya silinemedi" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "<b>%s</b> silinemedi." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "İndirilenler" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Boyut" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "%d şarkıda eksik" msgstr[1] "%d şarkıda eksik" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "%d şarkıda farklı" msgstr[1] "%d şarkıda farklı" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Birden fazla değelere _böl" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Diski _Albümden ayır" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "_Versiyonu İsimden ayır" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Aranjörü _Sanatçıdan ayır" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Seslendireni Sanatçıdan ayır" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Seslendireni Sanatçıdan ayır" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "_Versiyonu İsimden ayır" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Etiket ekle" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Etiket:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Etiketleri değiştir" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "_Programatik etiketleri göster" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Hiçbir Zaman" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Etiket eklenemedi" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Şarkı eklenemedi" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "<b>%s</b> eklenemedi\n" "\n" "Seçili dosyalar birden fazla değeri desteklemiyor." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Geçersiz etiket" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "<b>%s</b> geçersiz bir etiket\n" "\n" "Seçili dosyalar bu etiketi değiştirmeyi desteklemiyor." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Geçersiz değer" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Geçersiz değer: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Etiket doğru olmayabilir" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> program çalışıyorken değişti. Arşivi yenilemeden kaydetmek arada " "yapılan değişiklikleri yokedebilir.\n" "\n" "Yine de kaydedilsin mi?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Şarkı kaydedilemedi" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "<b>%s</b> kaydedilemedi. Dosya salt okunur olabilir veya sizin dosyayı " "değiştirme izniniz olmayabilir." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Daha çok seçenek..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Eklentiler" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s ve %(count)d tane daha" msgstr[1] "%(title)s ve %(count)d tane daha" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso Ayarları" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Buna göre _ayır:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Etiket değiştirme" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Dizinler" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Yeni Dizin" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Tüm Alt Dizinleri Seç" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Yeni Dizin" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Yeni dizin için isim girin:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Dizin yaratılamadı" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Dizin silinemedi" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Şarkılar" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "%s eseri" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disk %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Şarkı %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Görünümü Değiştir" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Seçili şarkı yok." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Şarkı yok" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Bilgi" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Sözler" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Yapımcı %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "sanatçı" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "sanatçılar" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "seslendirenler" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Hiçbir Zaman" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d defa" msgstr[1] "%d defa" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "eklendi" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "en son çalındı" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "defa çalındı" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "defa geçildi" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "puan" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "uzunluk" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Bilgi" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[kodlama Hatası]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bit oranı" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "dosya boyutu" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "değiştirildi" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d tane seçili" msgstr[1] "%d tane seçili" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Şarkı yok" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Şarkı Listesi" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d tane albümsüz şarkı" msgstr[1] "%d tane albümsüz şarkı" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Seçili Diskografi" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d sanatçısız şarkı" msgstr[1] "%d sanatçısız şarkı" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albümler" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Toplam uzunluk:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Toplam boyut:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Dosyalar" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_İndir" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Görünümü düzenle..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Bu şarkının sözleri bulunamadı." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Şarkı sözleri aranıyor..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Etiket değişikliklerini gözardı et?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Etiketler değiştirildi ama kaydedilmedi. Dosyaları kaydetmek mi yoksa " "değişiklikleri gözardı etmek mi istersiniz?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Hiçbir Zaman" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Dosya zaten var" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Yeniden Adlandır" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "çalma/duraklama durumunu değiştir" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "çalma/duraklama durumunu değiştir" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Eklenti Hataları" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "Geziciyi Gizle" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Sıralama:" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Etiket değiştirme" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Toplam boyut:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Eklenti bulunamadı." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Eklentiler" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "_Hataları Göster" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disk" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "Şarkı _No" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "grup" #: ../quodlibet/qltk/prefs.py:50 #, fuzzy msgid "Al_bum" msgstr "_Albüm" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Dosya Adı" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Uzunluk" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "Çalan şarkıya otomatik olarak _atla" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Çalan şarkı değişince listede yeni şarkıya git" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Diğerleri:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Görünümü düzenle..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Görünen Sütunlar" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "İsim _versiyonları içersin" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "_Arama kişileri de içerir" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Albüm _disk altyazısını içersin" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Dosya adı _dizinleri içersin" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Ayarlar" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Şarkı Listesi" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Görünen Sütunlar" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Evrensel süzgeç:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Ara" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Geziciler" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "Çalan şarkı değişince listede yeni şarkıya git" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "_Puan" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Albüm Listesi" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Çalmayı duraklat" #: ../quodlibet/qltk/prefs.py:362 #, fuzzy msgid "Output Configuration" msgstr "Çıktı Kaydı" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "Ses Düzeyi Düzeltmesi bilgisi yoksa, sesi buna ayarla" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Öntanımlı ses (dB):" #: ../quodlibet/qltk/prefs.py:387 #, fuzzy msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "Kesilme olmadığı sürece bütün şarkıların ses düzeyini buna ayarla" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Pre-amp düzeyi (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "Ses Düzeyi Düzeltmesini etkinleştir (Replay Gain)" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Ses Düzeyi Düzeltmesi" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "_Puan" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "_Puan ve çalma seferlerini kaydet" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_E-posta:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Puan ve çalma seferleri bu posta adresi için kaydedilecek" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Etiket değişikliklerini gözardı et?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Etiketleri değiştir" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Yeni Kanal" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "Başlangıçta arşivi _yenile" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "Arşivde _Ara" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Arşivinizdeki değişiklikleri denetle" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Arşivi _Baştan Yükle" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Arşivi baştan yükle (uzun sürebilir)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "_Dizinleri tara" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Şarkı yok" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s ve %(count)d tane daha" msgstr[1] "%(title)s ve %(count)d tane daha" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Özellikler" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "Çalma _Kuyruğu" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "Hataları _Sil" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d şarkı (%(time)s)" msgstr[1] "%(count)d şarkı (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "Arşivi _Gez" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Ana pencere görünürlüğünü değiştir" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Çalmayı duraklat" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Dizin Seç" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Şarkılar eklenemedi" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> desteklenmeyen bir protokol kullanıyor." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "Çalan Şarkıya _Atla" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Dosya" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Şarkılar" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Görünüm" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Geziciler" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Kontrol" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Yardım" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "Dizin _Ekle..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "Dosya _Ekle..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Adres Ekle" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "Yer imlerini _değiştir" #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Bu şarkıdan sonra dur" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Ara" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Adres Ekle" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Ses dosyasının yerini gir:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Adres eklenemedi" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> geçerli bir adres değil." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Şarkı Ekle" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "Dizin _Ekle..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Müzik Çalar" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Dosya _Ekle..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Puan" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Puan" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Boşlukları _altçizgi ile değiştir" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "_Windows'la uyumsuz karakterleri çıkart" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "_Düzeltme işaretlerini çıkart" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "_ASCII olmayan karakterleri çıkart" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Yeniden Adlandır" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "süzgeç" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Kayıtlı değerleri değiştir..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Önizleme" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Yeni İsim" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Dosya yeniden adlandırılamadı" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "<b>%s</b>, <b>%s</b> olarak yeniden adlandırılamadı. Yeni isimle zaten bir " "dosya olabilir, yeni bir dosya yaratmak veya eskisini silmek için izniniz " "olmayabilir." #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "_Hataları Göster" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Devam" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Yol mutlak değil" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Girdiğiniz bu süzgeç;\n" "\t<b>%s</b>\n" "/ karakteri içermekle beraber kök dizininden başlamıyor. Hatalı " "isimlendirmelerden sakınmak için süzgeçinize / veya ~/ şeklinde bir kök " "verin." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "Bu (':' ile ayrılmış) dizinlerdeki şarkılar arşivinize eklenecek" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Dizin Seç" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Kayıtlı Değerler" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Kayıtlı değerleri değiştir..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "Bu şarkıdan sonra dur" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Sınır:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Ağırlık" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Kalan süreyi göster" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Sözler" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Çalışan müzikçalara odaklan" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Şarkı içinde ileri/geri git" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Şarkılar silinemiyor" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Şarkılar silinemiyor" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "%s etiketine göre süz" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "_Albüm Etiketleri" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Şarkı _Numarası Etiketleri" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Albüm Etiketleri" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Kişi Etiketleri" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Tarih Etiketleri" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_Dosya Etiketleri" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "_Yapımcı Etiketleri" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Etiketleri Özelleştir..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Arama kriterlerini _renklendir" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Çalma _Kuyruğuna Ekle" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "Aygıta _Kopyala" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "Çalma Listesinden _Çıkar" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "_Altçizgileri boşlukla değiştir" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Etiketlerde _büyük/küçük harfleri düzelt" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Birden fazla değere _ayır" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Dosya Yolundan Etiket" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Yeni etiketler eskilerin yerine geçsin" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Yeni etiketler eskilerine eklensin" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Girdiğiniz bu süzgeç;\n" "\t<b>%s</b>\n" "geçersiz. Aynı etiketi iki defa içeriyor olabilir veya parantezleri hatalı " "olabilir (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Geçersiz etiketler" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "<b>%s</b> etiketleri geçersiz\n" "\n" "Seçili dosyalar bu etiketleri değiştirmeyi desteklemiyor." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Girdiğiniz süzgeç geçersiz. \\< ve \\> yerine < ve > kullanmaya " "ve parantez sayılarına dikkat edin.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Görünümü Değiştir" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Şarkı Numaraları" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "_Başlangıç:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Toplam Şarkı:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Çalıcı" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_Önizleme" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "ve %d tane daha..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Değişiklik yapılan dosyalar kaydediliyor." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d şarkı kaydedildi.\n" "(%(remaining)s kaldı)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "%(current)d/%(total)d Taşınıyor." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Bağlama yerleri denetleniyor" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "konum" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "%s adında bir çalma listesi zaten var." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Albüm _kapaklarını göster" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Dosya Sistemi" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Özet kullanım bilgisi göster" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Versiyon ve telif haklarını göster" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[ayarlar]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "%r parametresi anlaşılmadı." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "%r için bir parametre vermelisiniz." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r eşsiz bir önek değil." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kb/s" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d saniye" msgstr[1] "%d saniye" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Süre bilgisi yok" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d saniye" msgstr[1] "%d saniye" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d dakika" msgstr[1] "%d dakika" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d saat" msgstr[1] "%d saat" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d gün" msgstr[1] "%d gün" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d yıl" msgstr[1] "%d yıl" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Ad" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Tarih şu biçimlerin birinde girilmelidir: 'YYYY', 'YYYY-AA-GG' veya 'YYYY-AA-" "GG SS:DD:SS'." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" "Ses Düzeyi Düzeltmesi (Replay Gain) değeri 'x.yy dB' biçminde girilmelidir." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "" "Ses Düzeyi Düzeltmesi (Replay Gain) tepe değerleri 'x.yy' biçminde " "girilmelidir." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz ID'leri UUID biçminde girilmelidir." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz'de yayın durumu 'official', 'promotional' veya 'bootleg' " "olmalıdır." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Şarkı değiştirilemedi" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "<b>%s</b> kaydedilemedi. Dosya salt okunur olabilir veya sizin dosyayı " "değiştirme izniniz olmayabilir." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[kodlama Hatası]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "albüm" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "aranjör" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "aranjörler" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "aranjör" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "yazar" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "yazarlar" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "besteci" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "besteciler" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "besteci" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "orkestra şefi" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "orkestra şefleri" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "orkestra şefi" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "iletişim" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "telif hakkı" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "tarih" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "açıklama" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "tür" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "tür" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "seslendiren" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "grup" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "dil" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "lisans" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "konum" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "söz yazarı" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "söz yazarları" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "söz yazarı" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organizasyon" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "isim" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "versiyon" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "web" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "albüm sanatçısı" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "disk altyazısı" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disk" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "şarkı no" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "yapımcı ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "asıl yayım tarihi" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "asıl albüm" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "asıl sanatçı" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "kayıt tarihi" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "yayımlandığı ülke" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz şarkı ID'si" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz yayın ID'si" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "MusicBrainz yayın ID'si" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz sanatçı ID'si" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz yayın ID'si" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID'si" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz albüm durumu" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz albüm türü" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz yayın ID'si" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "şarkı ses seviyesi" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "şarkı tepe ses seviyesi" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "albüm ses seviyesi" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "albüm tepe ses seviyesi" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Ayarlar" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "diskler" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "şarkılar" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "son başlatılan" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "tam isim" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "bağlama yeri" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "kişiler" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "yıl" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "asıl yayım tarihi" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "yer imi" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "Süre bilgisi yok" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Çalma Listeleri" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Geziciler" #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Quod Libet'te beklenmedik bir durum oluştu. Durumu çözümlememize yardımcı " #~ "olmak için <b>%s</b> adında bir döküm dosyası oluşturuldu. Lütfen http://" #~ "code.google.com/p/quodlibet/issues/list adresine döküm dosyasıyla beraber " #~ "bildirimde bulunun. Bu dosya son dinlediğiniz şarkılar gibi hakkınızda " #~ "bazı bilgiler içerebilir. Bunu uygun bulmuyorsanız yerine <b>%s</b> " #~ "dosyasını o anda ne yaptığınızın bir anlatımıyla beraber " #~ "gönderebilirsiniz.\n" #~ "\n" #~ "Quod Libet şimdi kararlı durumda olmayabilir. Kapatıp tekrar başlatmanız " #~ "Tavsiye edilir. Arşiviniz kaydedilecektir." #~ msgid "Unable to download lyrics." #~ msgstr "Şarkı sözleri indirilemedi." #~ msgid "Remove all songs from the queue" #~ msgstr "Kuyruğu temizle" #~ msgid "Watch this folder for new songs" #~ msgstr "Bu dizini yeni şarkılar için denetle" #~ msgid "Set or toggle the playback order" #~ msgstr "Çalma sıralamasını değiştir" #~ msgid "Uninitialized iPod" #~ msgstr "iPod'la bağlantı kurulmamış" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Bu iPod'da boş bir veritabanı yaratmak istiyor musunuz?" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Ses Düzeyi (dB)" #~ msgid "Combine tags with _multiple values" #~ msgstr "Birden _çok değeri olan etiketleri birleştir" #~ msgid "Model:" #~ msgstr "Model:" #~ msgid "Capacity:" #~ msgstr "Kapasite:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Boşta kalan iPod parçası silindi" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "iPod veritabanı kaydedilemedi" #~ msgid "Unable to save iPod database" #~ msgstr "iPod veritabanı kaydedilemedi" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "şarkı tepe ses seviyesi" #~ msgid "Shuffle" #~ msgstr "Rastgele" #~ msgid "Weighted" #~ msgstr "Ağırlıklı" #~ msgid "_Weighted" #~ msgstr "_Ağırlıklı" #~ msgid "_One Song" #~ msgstr "_Bir Şarkı" #~ msgid "Restart the playlist when finished" #~ msgstr "Çalma listesi bitince başa dön" #~ msgid "Disable Browser" #~ msgstr "Geziciyi Gizle" #~ msgid "_Disable Browser" #~ msgstr "Geziciyi _Gizle" #, fuzzy #~ msgid "Force Write" #~ msgstr "Yaz" #~ msgid "Filter on _Genre" #~ msgstr "_Türe göre süz" #~ msgid "Filter on _Artist" #~ msgstr "_Sanatçıya göre süz" #~ msgid "Filter on Al_bum" #~ msgstr "_Albüme göre süz" #~ msgid "_Music" #~ msgstr "_Müzik" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Yer imleri" #~ msgid "Song _List" #~ msgstr "Şarkı _Listesi" #, fuzzy #~ msgid "D:" #~ msgstr "U:" #, fuzzy #~ msgid "W:" #~ msgstr "U:" #, fuzzy #~ msgid "E:" #~ msgstr "H:" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Bu şarkıdan sonra dur" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "ve %d tane daha..." #~ msgstr[1] "ve %d tane daha..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Diski _Albümden ayır" #, fuzzy #~ msgid "Timeout" #~ msgstr "Süre" #, fuzzy #~ msgid "Select an album" #~ msgstr "Hepsini _Seç" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s ve %(count)d tane daha" #~ msgstr[1] "%(title)s ve %(count)d tane daha" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Çalma Listeleri" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "Önizlemelerde _yuvarlatılmış köşeler kullan" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "albüm kapat resimlerinin kenarlarını yuvarlat. Tekrar başlatmayı " #~ "gerektirebilir." #~ msgid "Re_fresh Library" #~ msgstr "Arşivi _Yenile" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Puan" #~ msgid "Unable to open input files" #~ msgstr "Giriş dosyaları açılamadı" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "Gstreamer'da dosya okumayı sağlayacak bileşen yok. Gstreamer kurulum " #~ "ayarlarınızı kontrol edin." #~ msgid "Invalid audio backend" #~ msgstr "Geçersiz ses altsistemi" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "%r ses altsistemi kurulu değil." #, fuzzy #~ msgid "ql-revert" #~ msgstr "Arşivden _Çıkart" #~ msgid "command|filename" #~ msgstr "dosya adı" #~ msgid "command|tag" #~ msgstr "etiket" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Ara" #~ msgid "%d of %d" #~ msgstr "%d taneden %d tanesi" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Kullanım: %s %s" #~ msgid "_Download..." #~ msgstr "_İndir..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Yeni Kanal" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "<b>%s</b> dosyasının üstüne yazılsın mı?" #, fuzzy #~ msgid "Output Error" #~ msgstr "Çıktı Kaydı" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet zaten çalışıyor." #~ msgid "No song is currently playing." #~ msgstr "Şu anda çalmıyor." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Yazılamayan %s kaldırıldı." #~ msgid "_Edit Bookmarks..." #~ msgstr "Yer imlerini _değiştir" #~ msgid "_New Folder..." #~ msgstr "_Yeni Dizin..." #~ msgid "_Add to Playlist" #~ msgstr "Çalma Listesine _Ekle" #~ msgid "_Edit Display..." #~ msgstr "_Görünümü düzenle..." #~ msgid "Output Log" #~ msgstr "Çıktı Kaydı" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d kanal" #~ msgid "_Add a Location..." #~ msgstr "Adres _Ekle..." #~ msgid "_Output Log" #~ msgstr "_Çıktı Kayıtları" #~ msgid "Invalid command %r received." #~ msgstr "Geçersiz bir komut olan %r alındı." #~ msgid "Unknown browser %r." #~ msgstr "%r gezicisi bilinmiyor." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Etiketleri Özelleştir..." #, fuzzy #~ msgid "Track Headers" #~ msgstr "Şarkı _Numarası Etiketleri" #, fuzzy #~ msgid "People Headers" #~ msgstr "_Kişi Etiketleri" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Albüm Etiketleri" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Tarih Etiketleri" #, fuzzy #~ msgid "File Headers" #~ msgstr "_Dosya Etiketleri" #, fuzzy #~ msgid "Production Headers" #~ msgstr "_Yapımcı Etiketleri" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Etiket:" #~ msgid "Too Many Errors" #~ msgstr "Çok Fazla Hata" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Arka arkaya %d hata olduğu için çalma durduruldu." #, fuzzy #~ msgid "Warnings" #~ msgstr "_Puan" #~ msgid "album artist (sort)" #~ msgstr "albüm sanatçısı (sıralama)" #~ msgid "artist (sort)" #~ msgstr "sanatçı (sıralama)" #~ msgid "album (sort)" #~ msgstr "albüm (sıralama)" #~ msgid "performer (sort)" #~ msgstr "seslendiren (sıralama)" #~ msgid "performers (sort)" #~ msgstr "seslendirenler (sıralama)" #~ msgid "errors" #~ msgstr "hatalar" #~ msgid "Permanently delete this file?" #~ msgstr "Dosya geri dönüşü olmayacak şekilde silinsin mi?" #~ msgid "Permanently delete these files?" #~ msgstr "Dosyalar geri dönüşü olmayacak şekilde silinsin mi?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s ve %(count)d tane daha..." #~ msgstr[1] "%(title)s ve %(count)d tane daha..." #, fuzzy #~ msgid "Version:" #~ msgstr "versiyon" #~ msgid "_Cause an Error" #~ msgstr "Hata _Yüzünden" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s arşive eklenemedi.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Çıkartma komutu bulunamadı." #~ msgid "Unable to start web browser" #~ msgstr "İnternet gezicisi başlatılamadı" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Bir internet gezicisi bulunamadı. Lütfen $BROWSER değişkenini ayarlayın " #~ "veya /usr/bin/sensible-browser dosyasının var olduğundan emin olun." #, fuzzy #~ msgid "Library Error" #~ msgstr "Arşiv Gezici" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Çıktı Kayıtları" #~ msgid "translator-credits" #~ msgstr "Türerkan İnce (turerkan@gmail.com)" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Diğer gösterilecek sütunlar, boşluklarla ayrılmış olarak" #~ msgid "_Edit and Continue" #~ msgstr "_Düzenle ve Devam Et" #, fuzzy #~ msgid "Confirm rating" #~ msgstr "Bilgi" #~ msgid "Search your library" #~ msgstr "Arşivinizde arama yapın" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quod-libet-development@googlegroups.com>\n" #~ "Telif Hakkı 2004-2005 Joe Wreschnig, Michael Urman ve diğerleri\n" #~ "\n" #~ "Bu yazılım ücretsizdir; kopyalama koşulları için kaynak koda başvurun. " #~ "There is NO\n" #~ "Yazılımın hiçbir şekilde GARANTİSİ YOKTUR. Buna herhangi bir amaç için " #~ "kullanılabilirlik bile dahildir.\n" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r hiçbir gezici içermiyor." #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Toplam boyut:" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r hiçbir aygıt içermiyor." #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet Eklentileri" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "basit aramalar mavi, gelişmiş aramalar yeşil, geçersiz aramalar kırmızı" #~ msgid "_Select" #~ msgstr "_Seç" #~ msgid "Separators for splitting tags" #~ msgstr "etiketler ayırıcıları" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet Ayarları" #~ msgid "Not Played To_day" #~ msgstr "_Bugün çalınmadı" #~ msgid "Not Played in a _Week" #~ msgstr "Bir _haftadır çalınmadı" #~ msgid "Not Played in a _Month" #~ msgstr "Bir _aydır çalınmadı" #~ msgid "B_ottom 40" #~ msgstr "_Dip 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "En az çaldığınız 40 şarkı (eşitlik varsa 40'tan fazla olabilir)" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #, fuzzy #~ msgid "Date" #~ msgstr "_Tarih" #~ msgid "Choose New Stations" #~ msgstr "Yeni Kanal Seç" #~ msgid "Add" #~ msgstr "Ekle" #~ msgid "Bitrate" #~ msgstr "Bit oranı" #~ msgid "_Stations..." #~ msgstr "_Kanallar..." #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Quod Libet'ten çık" #~ msgid "Initializing audio backend (%s)" #~ msgstr "Ses altsistemi yükleniyor (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "Ana kitaplık yükleniyor (%s)" #~ msgid "Unable to save library" #~ msgstr "Arşiv kaydedilemedi" #~ msgid "" #~ "The audio output pipeline %r could not be created. Check your GStreamer " #~ "settings in ~/.quodlibet/config." #~ msgstr "" #~ "Ses çıkış hattı %r yaratılamadı. ~/.quodlibet/config dosyasındaki " #~ "Gstreamer ayarlarınızı kontrol ediniz." #~ msgid "Sort by title" #~ msgstr "İsime göre sırala" #~ msgid "Sort by artist" #~ msgstr "Sanatçıya göre sırala" #~ msgid "Lyrics provided by %s." #~ msgstr "Şarkı sözleri %s tarafından sağlanmıştır." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Şarkı sözleri bulunamadı.\n" #~ "\n" #~ "İndir'e basarak arama yaptırabilirsiniz veya kendinizi yazıp Kaydet'e " #~ "basabilirsiniz." ��������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/POTFILES.in����������������������������������������������������������������������0000644�0001750�0001750�00000015544�13112005742�016141� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������data/exfalso.appdata.xml.in data/exfalso.desktop.in data/quodlibet.appdata.xml.in data/quodlibet.desktop.in quodlibet/browsers/albums/main.py quodlibet/browsers/albums/prefs.py quodlibet/browsers/audiofeeds.py quodlibet/browsers/_base.py quodlibet/browsers/collection/main.py quodlibet/browsers/collection/models.py quodlibet/browsers/collection/prefs.py quodlibet/browsers/covergrid/main.py quodlibet/browsers/covergrid/prefs.py quodlibet/browsers/filesystem.py quodlibet/browsers/__init__.py quodlibet/browsers/iradio.py quodlibet/browsers/media.py quodlibet/browsers/paned/main.py quodlibet/browsers/paned/models.py quodlibet/browsers/paned/prefs.py quodlibet/browsers/playlists/main.py quodlibet/browsers/playlists/menu.py quodlibet/browsers/playlists/prefs.py quodlibet/browsers/playlists/util.py quodlibet/browsers/search.py quodlibet/browsers/soundcloud/main.py quodlibet/browsers/soundcloud/util.py quodlibet/cli.py quodlibet/devices/_base.py quodlibet/devices/__init__.py quodlibet/devices/storage.py quodlibet/errorreport/ui.py quodlibet/exfalso.py quodlibet/ext/covers/artwork_url.py quodlibet/ext/covers/discogs.py quodlibet/ext/covers/lastfm.py quodlibet/ext/covers/musicbrainz.py quodlibet/ext/editing/iconv.py quodlibet/ext/editing/kakasi.py quodlibet/ext/editing/resub.py quodlibet/ext/editing/titlecase.py quodlibet/ext/events/advanced_preferences.py quodlibet/ext/events/animosd/main.py quodlibet/ext/events/animosd/prefs.py quodlibet/ext/events/auto_library_update.py quodlibet/ext/events/automask.py quodlibet/ext/events/autorating.py quodlibet/ext/events/clock.py quodlibet/ext/events/equalizer.py quodlibet/ext/events/gajim_status.py quodlibet/ext/events/headphonemon.py quodlibet/ext/events/inhibit.py quodlibet/ext/events/iradiolog.py quodlibet/ext/events/jep118.py quodlibet/ext/events/language.py quodlibet/ext/events/lyricswindow.py quodlibet/ext/events/mediaserver.py quodlibet/ext/events/mpdserver/__init__.py quodlibet/ext/events/mpris/__init__.py quodlibet/ext/events/mqtt.py quodlibet/ext/events/notify.py quodlibet/ext/events/qlscrobbler.py quodlibet/ext/events/radioadmute.py quodlibet/ext/events/randomalbum.py quodlibet/ext/events/rbimport.py quodlibet/ext/events/screensaver.py quodlibet/ext/events/searchprovider.py quodlibet/ext/events/seekbar.py quodlibet/ext/events/squeezebox_sync.py quodlibet/ext/events/synchronizedlyrics.py quodlibet/ext/events/telepathy_status.py quodlibet/ext/events/themeswitcher.py quodlibet/ext/events/toggle_menu.py quodlibet/ext/events/trayicon/appindicator.py quodlibet/ext/events/trayicon/__init__.py quodlibet/ext/events/trayicon/menu.py quodlibet/ext/events/trayicon/prefs.py quodlibet/ext/events/trayicon/systemtray.py quodlibet/ext/events/viewlyrics.py quodlibet/ext/events/visualisations.py quodlibet/ext/events/waveformseekbar.py quodlibet/ext/events/write_cover.py quodlibet/ext/gstreamer/compressor.py quodlibet/ext/gstreamer/crossfeed.py quodlibet/ext/gstreamer/karaoke.py quodlibet/ext/gstreamer/mono.py quodlibet/ext/gstreamer/pitch.py quodlibet/ext/playlist/export_to_folder.py quodlibet/ext/playlist/export_to_squeezebox.py quodlibet/ext/playlist/remove_duplicates.py quodlibet/ext/playlist/shuffle.py quodlibet/ext/playorder/follow.py quodlibet/ext/playorder/playcounteq.py quodlibet/ext/playorder/queue.py quodlibet/ext/playorder/reverse.py quodlibet/ext/playorder/skip_songs.py quodlibet/ext/playorder/track_repeat.py quodlibet/ext/query/conditional.py quodlibet/ext/query/pythonexpression.py quodlibet/ext/query/savedsearch.py quodlibet/ext/_shared/squeezebox/base.py quodlibet/ext/_shared/squeezebox/server.py quodlibet/ext/_shared/squeezebox/util.py quodlibet/ext/songsmenu/albumart.py quodlibet/ext/songsmenu/ape2id3.py quodlibet/ext/songsmenu/bookmarks.py quodlibet/ext/songsmenu/brainz/__init__.py quodlibet/ext/songsmenu/brainz/widgets.py quodlibet/ext/songsmenu/browsefolders.py quodlibet/ext/songsmenu/console.py quodlibet/ext/songsmenu/custom_commands.py quodlibet/ext/songsmenu/duplicates.py quodlibet/ext/songsmenu/editplaycount.py quodlibet/ext/songsmenu/embedded.py quodlibet/ext/songsmenu/exact_rating.py quodlibet/ext/songsmenu/filterall.py quodlibet/ext/songsmenu/filterbrowser.py quodlibet/ext/songsmenu/fingerprint/__init__.py quodlibet/ext/songsmenu/fingerprint/search.py quodlibet/ext/songsmenu/fingerprint/submit.py quodlibet/ext/songsmenu/forcewrite.py quodlibet/ext/songsmenu/html.py quodlibet/ext/songsmenu/id3tlen.py quodlibet/ext/songsmenu/ifp.py quodlibet/ext/songsmenu/importexport.py quodlibet/ext/songsmenu/k3b.py quodlibet/ext/songsmenu/lastfmsync.py quodlibet/ext/songsmenu/makesorttags.py quodlibet/ext/songsmenu/migratemetadata.py quodlibet/ext/songsmenu/playlist.py quodlibet/ext/songsmenu/refresh.py quodlibet/ext/songsmenu/replaygain.py quodlibet/ext/songsmenu/splitting.py quodlibet/ext/songsmenu/tapbpm.py quodlibet/ext/songsmenu/website_search.py quodlibet/ext/songsmenu/wikipedia.py quodlibet/formats/_audio.py quodlibet/formats/__init__.py quodlibet/__init__.py quodlibet/library/__init__.py quodlibet/library/libraries.py quodlibet/main.py quodlibet/operon/base.py quodlibet/operon/commands.py quodlibet/operon/main.py quodlibet/operon/util.py quodlibet/order/__init__.py quodlibet/order/reorder.py quodlibet/order/repeat.py quodlibet/player/gstbe/player.py quodlibet/player/gstbe/plugins.py quodlibet/player/gstbe/prefs.py quodlibet/player/gstbe/util.py quodlibet/player/__init__.py quodlibet/player/xinebe/player.py quodlibet/plugins/__init__.py quodlibet/plugins/playlist.py quodlibet.py quodlibet/qltk/about.py quodlibet/qltk/bookmarks.py quodlibet/qltk/browser.py quodlibet/qltk/cbes.py quodlibet/qltk/chooser.py quodlibet/qltk/controls.py quodlibet/qltk/data_editors.py quodlibet/qltk/delete.py quodlibet/qltk/downloader.py quodlibet/qltk/edittags.py quodlibet/qltk/_editutils.py quodlibet/qltk/entry.py quodlibet/qltk/exfalsowindow.py quodlibet/qltk/filesel.py quodlibet/qltk/getstring.py quodlibet/qltk/info.py quodlibet/qltk/information.py quodlibet/qltk/lyrics.py quodlibet/qltk/maskedbox.py quodlibet/qltk/msg.py quodlibet/qltk/notif.py quodlibet/qltk/playorder.py quodlibet/qltk/pluginwin.py quodlibet/qltk/prefs.py quodlibet/qltk/properties.py quodlibet/qltk/queue.py quodlibet/qltk/quodlibetwindow.py quodlibet/qltk/ratingsmenu.py quodlibet/qltk/renamefiles.py quodlibet/qltk/scanbox.py quodlibet/qltk/searchbar.py quodlibet/qltk/seekbutton.py quodlibet/qltk/shortcuts.py quodlibet/qltk/songlistcolumns.py quodlibet/qltk/songlist.py quodlibet/qltk/songsmenu.py quodlibet/qltk/tagsfrompath.py quodlibet/qltk/textedit.py quodlibet/qltk/tracker.py quodlibet/qltk/tracknumbers.py quodlibet/qltk/unity.py quodlibet/qltk/views.py quodlibet/qltk/wlw.py quodlibet/qltk/x.py quodlibet/update.py quodlibet/util/collection.py quodlibet/util/cover/built_in.py quodlibet/util/dprint.py quodlibet/util/__init__.py quodlibet/util/library.py quodlibet/util/logging.py quodlibet/util/massagers.py quodlibet/util/songwrapper.py quodlibet/util/string/__init__.py quodlibet/util/tags.py ������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/zh_TW.po�������������������������������������������������������������������������0000644�0001750�0001750�00000517373�13115512747�016001� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Traditional Chinese (zh_TW) translations for Quod Libet. # Copyright (C) 2006 THE Quod Libet'S COPYRIGHT HOLDER # This file is distributed under the same license as the Quod Libet package. # Hsin-lin Cheng <lancetw@gmail.com>, 2006. # msgid "" msgstr "" "Project-Id-Version: Quod Libet 0.24\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2013-07-20 22:36+0100\n" "Last-Translator: Hsin-lin Cheng <lancetw@gmail.com>\n" "Language-Team: Hsin-lin Cheng <lancetw@gmail.com>\n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.4\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "編輯您的音訊標籤" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "音效標籤編輯器" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "收聽、瀏覽,或編輯您的音訊收藏" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "音樂播放器" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "標題" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "演出者 (_A)" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "日期 (_D)" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "風格" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "評等 (_R)" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "依日期排序" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "偏好設定" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "專輯清單" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "專輯清單 (_A)" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "所有專輯" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d 專輯" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "顯示專輯封面 (_C)" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "專輯中沒有曲目" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d 音軌" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d 唱片" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "所有專輯" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "專輯清單偏好設定" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "顯示專輯封面 (_C)" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[選項]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "專輯顯示" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "未知" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "新的饋流" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "輸入音訊檔案饋流位置:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "音訊饋流" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "音訊饋流 (_A)" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "下載 (_D)" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "下載檔案" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "下載檔案" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "無法加入饋流" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "<b>%s</b> 不能被加入。伺服器可能關機中,或者這位置可能不是音訊饋流。" #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "刪除檔案" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "資料庫瀏覽器" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d 曲目" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "無效的格式" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "未知" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "多重設定值分割 (_M)" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "自訂 (_C)" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "評等 (_R)" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "標籤" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "專輯清單偏好設定" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "合計大小:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "合計大小:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "窗格瀏覽器偏好設定" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "顯示專輯封面 (_C)" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "所有專輯" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "團體" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "檔案系統" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "檔案系統 (_F)" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "無法複製曲目" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "選取的檔案不能被複製到其他曲目清單或佇列。" #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "加入資料庫 (_A)" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "未支援的檔案格式" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "站台清單僅能是站台位置,而不能是其他站台清單或播放清單。以下的位置不能被載" "入:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "無法加入站台" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "網路電台" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "下載檔案" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "新站台" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "輸入網路電台位置:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "曲目評等" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "新的站台 (_N)" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "網路電台 (_I)" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "新站台" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "新的站台 (_N)" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "新站台" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "未發現站台" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "%s 沒有網路電台被發現。" #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "所有列出的站台已經在您的資料庫當中了。" #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "加入播放清單 (_A)" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "從播放清單中移除 (_R)" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d 站台" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "裝置屬性" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "裝置:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "未掛載" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "掛載點:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "名稱:(_N)" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "媒體裝置" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "媒體裝置 (_M)" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "退出 (_E)" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "屬性" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "重新命名 (_R)" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> 已使用,<b>%s</b> 可用" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> 未連線。" #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "正在複製 <b>%s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "無法複製曲目" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "沒有足夠的空間給這首曲目。" #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "無法複製 <b>%s</b>。" #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "無法刪除曲目" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "正在刪除 <b>%s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "無法刪除 <b>%s</b>。" #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "無法刪除曲目" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "退出 <b>%s</b> 失敗。" #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "無法退出裝置" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "窗格瀏覽器" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "窗格瀏覽器 (_P)" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "全選 (_A)" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "全部" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "窗格瀏覽器偏好設定" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "播放清單" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "播放清單 (_P)" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "從播放清單中移除 (_R)" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "匯入 (_I)" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "新的播放清單" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "無法匯入播放清單" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet 僅不能匯入 M3U 或 PLS 格式的播放清單。" #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "無法重新命名播放清單" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "匯入播放清單" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "新的播放清單 (_N)" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "新的播放清單" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "窗格瀏覽器偏好設定" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "播放清單" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "輸入新資料夾的名稱:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "正在匯入播放清單。\n" "\n" "%d/%d 曲目已加入。" #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "設定搜尋結果上限 (_L)" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "搜尋資料庫" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "搜尋資料庫 (_S)" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "窗格瀏覽器" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "搜尋" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "位置" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet 並未執行。" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "一個音樂資料庫與播放器" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[選項]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "顯示播放中的曲目並離開" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "立即開始播放" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "跳到下一個曲目" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "跳到上一個曲目" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "開始播放" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "暫停播放" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "切換 播放/暫停 模式" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "開始播放" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "調高音量" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "調低音量" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "顯示播放器狀態" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "隱藏主視窗" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "顯示主視窗" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "切換主視窗可見性" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "焦點移到執行中的播放器" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "停用瀏覽器" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "顯示當前的播放清單" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "顯示佇列的內容" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "顯示佇列的內容" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet 並未執行。" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "離開 Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "在其中找尋播放中的曲目" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "切換 播放/暫停 模式" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "關掉、打開或切換重新播放" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "設定音量" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "搜尋您的音訊資料庫" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "查詢" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "播放檔案" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "檔名" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "評等播放中的曲目" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "設定當前的瀏覽器" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "評等播放中的曲目" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "開啟新的瀏覽器" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "顯示或隱藏佇列" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "顯示或隱藏主要曲目清單" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "以亂數篩選" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "標籤" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "以標籤值篩選" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=value" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "佇列檔案或查詢" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "檔名" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 #, fuzzy msgid "Unqueue a file or query" msgstr "佇列檔案或查詢" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "錯誤:無效的參數:「%s」。" #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "錯誤:試試 %s --help。" #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "未知的裝置" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "錯誤:「%s」不是一個獨特的前綴 (prefix)。" #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "無效的設定值" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "檔名型態 (_F)" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "複製專輯封面 (_A)" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "移除不在使用的專輯封面與目錄 (_R)" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "顯示錯誤 (_E)" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "描述" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "一個音訊標籤編輯器" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "目錄" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[無效的編碼]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "標題" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "音效標籤編輯器" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "標籤英文首字大寫 (_T)" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "窗格瀏覽器偏好設定" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "合計大小:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "編輯顯示" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "加權 (_W)" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "編輯顯示" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "預覽 (_P)" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d 秒" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "自訂 (_C)" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "外掛程式錯誤" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "音樂播放器" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "網路電台" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "評等 (_R)" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "無法儲存曲目" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "找不到外掛。" #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "歌詞" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "清除搜尋紀錄" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "歌詞" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "位置" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "隱藏主視窗" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "偏好設定" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "模式" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "模式" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d 曲目" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "資訊" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "模式" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "位置" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "標題" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "裝置:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "名稱:(_N)" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "其他:(_O)" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "演出者 (_A)" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "檔名型態 (_F)" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "隨機專輯 (_B)" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "專輯" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "加權 (_W)" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "隨機專輯 (_B)" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "匯入播放清單" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "匯入 (_I)" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "歌詞" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "尚未播放" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d 曲目" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "模式" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "尚未播放" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "播放清單 (_P)" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "播放器" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "預覽 (_P)" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "洗牌 (_S)" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "重覆播放 (_R)" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "在這首歌之後停止" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "開啟新的瀏覽器" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "編輯標籤 (_T)" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "資訊 (_I)" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "播放清單" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "編輯顯示" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "歌詞" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "歌詞" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "顯示錯誤 (_E)" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "檔案" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "預覽 (_P)" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "依演出者篩選 (_A)" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "自訂 (_C)" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "依風格篩選 (_G)" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "依演出者篩選 (_A)" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "音訊饋流" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "輸入音訊檔案饋流位置:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "匯入播放清單" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "匯入 (_I)" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "未發現站台" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "檔名型態 (_F)" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "檔名型態 (_F)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "從播放清單中移除 (_R)" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "新的播放清單" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "上次播放" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "佇列 (_Q)" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "從未" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "無曲目" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "已儲存設定值" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "重新命名 (_R)" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "資料庫" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "隱藏主視窗" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "檔案名稱" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "無法儲存曲目" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "專輯清單" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "大小" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "搜尋:(_S)" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "搜尋" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "專輯清單" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "編輯書籤... (_E)" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "編輯書籤... (_E)" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "書籤" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz 專輯類型" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "檔案名稱" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "唱片 (_D)" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "音軌" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "標題" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "演出者 (_A)" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz 專輯類型" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "查詢" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "搜尋" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "找不到外掛。" #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "瀏覽器" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "無法建立資料夾" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "command|tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "重新命名 (_R)" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "command|tag" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "無效的格式" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "無效的設定值" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "自訂 (_C)" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "無法複製曲目" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "停用瀏覽器" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "評等 (_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "評等 (_R)" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "編輯顯示" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "評等 (_R)" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "以標籤值篩選" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer 無法載入被選取的曲目。" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "依風格篩選 (_G)" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "佇列 (_Q)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "寫入" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "目錄" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "專輯檔頭 (_A)" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "新的站台 (_N)" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "匯入播放清單" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "重新命名 (_R)" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "匯入播放清單" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "資訊" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "匯入播放清單" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "無法匯入播放清單" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "退出 <b>%s</b> 失敗。" #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "編輯標籤" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "編輯標籤" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "所有專輯" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "預覽 (_P)" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "標籤" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "無法刪除曲目" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "搜尋" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "模式" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "編輯儲存設定值..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "以顏色標示搜尋項目 (_S)" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "資料庫" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "正在檢查掛載點" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "正在掃瞄資料庫" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "正在掃瞄 %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "顯示標題音樂 (programmatic) 標籤 (_p)" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "描述" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "設定值" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "音效標籤編輯器" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "無曲目被選取。" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "以標籤值篩選" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "以標籤值篩選" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "無時間資訊" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "無法重新命名檔案" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "檔案" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "顯示基本的使用方法" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> 不是有效的位置。" #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "未知" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "順序" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "順序 (_I)" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "隨機 (_R)" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "隨機 (_R)" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "重覆播放 (_R)" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "單曲" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d 秒" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "未發現站台" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "無法建立資料夾" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "外掛 (_P)" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "支援格式:%s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "音訊裝置:%s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "開頭" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "時間" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "書籤名稱" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "書籤" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "篩選 (_F)" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "從未播放過 (_N)" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "前 40 名 (_T)" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "新站台" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "隨機風格 (_G)" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "隨機演出者 (_A)" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "隨機專輯 (_B)" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "這是您播放最多次的 40 首曲目 (排名平手的話或許會超出 40 首)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "設定值:(_V)" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "已儲存設定值" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "編輯儲存設定值..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "音軌檔頭 (_T)" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "專輯檔頭 (_A)" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "回放增益音量修正 (_R)" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "未知" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "以標籤值篩選" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "檔案" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "刪除檔案" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "移到回收筒 (_M)" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "正在移動 %d/%d。" #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "無法儲存 iPod 資料庫" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "退出 <b>%s</b> 失敗。" #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "正在刪除 %d/%d。" #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "無法刪除檔案" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "刪除 <b>%s</b> 失敗。" #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "下載" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "大小" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "%d 曲目遺失" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "%d 首曲目有差異" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "多重設定值分割 (_M)" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "從專輯分離唱片 (_A)" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "從標題分離版本 (_V)" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "從演出者分離組織者 (_T)" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "從演出者分離演奏者 (_P)" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "從演出者分離演奏者 (_P)" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "從標題分離版本 (_V)" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "加入標籤" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "標籤:(_T)" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "編輯標籤" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "顯示標題音樂 (programmatic) 標籤 (_p)" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "從未" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "無法加入標籤" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "無法加入曲目" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "無法加入 <b>%s</b>\n" "\n" "當前選取的檔案不支援多重設定值。" #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "無效的標籤" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "無效的標籤 <b>%s</b>\n" "\n" "當前選取的檔案不支援標籤編輯。" #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "無效的設定值" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "無效的設定值:<b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "標籤可能不正確" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "當程式執行時 <b>%s</b> 已經被改變了。 沒有更新您的資料庫就儲存可能會複寫這首" "曲目其他的變更。\n" "\n" "無論如何都要儲存這首曲目?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "無法儲存曲目" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "儲存 <b>%s</b> 時發生錯誤。這個檔案可能唯讀、損壞或是您沒有編輯權限。" #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "更多選項... (_M)" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "外掛 (_P)" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s 與其他 %(count)d 首..." #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso 偏好設定" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "分隔標記 (_O)" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "標籤編輯" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "資料夾" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "新資料夾" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "選取所有子資料夾 (_S)" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "新資料夾" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "輸入新資料夾的名稱:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "無法建立資料夾" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "無法刪除資料夾" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "曲目" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "演出者:%s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "唱片 %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "音軌 %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "編輯顯示" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "無曲目被選取。" #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "無曲目" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "資訊" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "歌詞" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "由 %s 創作" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "演出者" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "演出者" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "表演者" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "從未" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d 次" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "加入時間" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "上次播放" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "播放次數" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "跳過次數" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "曲目評等" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "長度" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "資訊" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[無效的編碼]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "位元率" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "檔案大小" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "修改時間" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d 已選取" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "無效的音軌" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "音軌清單" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d 曲目沒有專輯資訊" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "已選擇音樂唱片分類" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d 曲目沒有演出者資訊" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "專輯" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "總計長度:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "合計大小:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "檔案" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "下載 (_D)" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "編輯顯示... (_E)" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "找不到這首曲目的歌詞。" #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "正在搜尋歌詞..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "要放棄標籤的變更?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "標籤已被改變但尚未儲存。要儲存這些檔案或者是放棄變更?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "從未" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "檔案已存在" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "重新命名檔案" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "切換 播放/暫停 模式" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "切換 播放/暫停 模式" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "外掛程式錯誤" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "停用瀏覽器" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "排序:(_O)" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "標籤編輯" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "合計大小:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "找不到外掛。" #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "外掛 (_P)" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "顯示錯誤 (_E)" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "唱片 (_D)" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "音軌 (_T)" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "組合" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "專輯 (_B)" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "檔名 (_F)" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "長度 (_L)" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "自動跳到播放中的曲目 (_J)" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "當變更播放中的曲目時,捲動清單到該曲目位置" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "其他:(_O)" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "編輯顯示... (_E)" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "可視欄位" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "標題包含版本 (_V)" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "標題包含版本 (_V)" #: ../quodlibet/qltk/prefs.py:108 #, fuzzy msgid "Album includes _disc subtitle" msgstr "專輯包含部份 (_P)" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "檔名包含資料夾 (_F)" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "偏好設定" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "曲目清單" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "可視欄位" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "通用篩選:(_G)" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "搜尋" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "瀏覽器" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "當變更播放中的曲目時,捲動清單到該曲目位置" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "評等 (_R)" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "專輯清單" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "暫停播放" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "音量增益 (dB):(_V)" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "音量增益 (dB):(_V)" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "回放增益音量修正 (_R)" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "回放增益音量修正 (_R)" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "評等 (_R)" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "儲存評等與播放次數" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "電子郵件:(_E)" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "評等和播放次數將會被設定到這個電子郵件地址" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "要放棄標籤的變更?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "編輯標籤" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "新的站台 (_N)" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "重新整理資料庫 (_F)" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "搜尋資料庫 (_S)" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "檢查您的資料庫變動" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "重新載入資料庫 (_L)" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "重新載入您的資料庫中所有曲目 (這可能會花一些時間)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "掃瞄目錄 (_D)" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "無曲目" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, fuzzy, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s 與其他 %(count)d 首..." #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "屬性" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "佇列 (_Q)" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "外掛程式錯誤" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d 曲目 (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "瀏覽資料庫 (_B)" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "切換主視窗可見性" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "暫停播放" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "選取目錄" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "無法加入曲目" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> 使用了未支援的通訊協定。" #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "跳到播放中的曲目 (_J)" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "檔案" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "曲目" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "檢視 (_V)" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "瀏覽器" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "控制 (_C)" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "說明 (_H)" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "加入資料夾... (_A)" #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "加入檔案... (_A)" #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "加入位置" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "編輯書籤... (_E)" #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "在這首歌之後停止" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "搜尋" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "加入位置" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "輸入音訊檔案位置:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "無法加入位置" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> 不是有效的位置。" #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "加入音樂" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "加入資料夾... (_A)" #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "音樂播放器" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "加入檔案... (_A)" #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "評等 (_R)" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "評等 (_R)" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "以底線替換空白 (_U)" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "刪除不相容 Windows 的字元 (_W)" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "刪除發音標記 (_D)" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "刪除非 ASCII 字元 (_A)" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "重新命名檔案" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "模式" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "編輯儲存設定值..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "預覽 (_P)" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "新的名稱" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "無法重新命名檔案" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "重新命名 <b>%s</b> 成 <b>%s</b> 時失敗。可能目標檔案已存在,或者是您沒有足夠" "的權限來建立新檔案或移除舊檔案。" #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "顯示錯誤 (_E)" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "繼續 (_C)" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "不是絕對路徑" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "這個模式\n" "\t<b>%s</b>\n" "包含 / 但不是以根目錄為起始。要避免呼叫錯誤的資料夾,您的起始目錄格式應為 / " "或 ~/。" #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "這些資料夾 (以「:」隔開) 中所放置的曲目將會被加入到您的資料庫中" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "選取目錄" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "已儲存設定值" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "編輯儲存設定值..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "在這首歌之後停止" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "限制 (_L):" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "加權 (_W)" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "顯示剩餘時間" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "歌詞" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "焦點移到執行中的播放器" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "在其中找尋播放中的曲目" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "無法刪除曲目" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "無法刪除曲目" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "以 %s 篩選 (_F)" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "專輯檔頭 (_A)" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "音軌檔頭 (_T)" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "專輯檔頭 (_A)" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "個人或團體檔頭 (_P)" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "日期檔頭 (_D)" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "檔案檔頭 (_F)" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "出版檔頭 (_P)" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "設置檔頭... (_C)" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "以顏色標示搜尋項目 (_S)" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "加入佇列 (_A)" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "複製到裝置 (_C)" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "從播放清單中移除 (_R)" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "以空白替換底線 (_U)" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "標籤英文首字大寫 (_T)" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "分割多重設定值" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "從路徑名設定標籤" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "替換現存的標籤" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "加入現存的標籤" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "格式\n" "\t<b>%s</b>\n" "無效。可能是包含兩次同樣的標籤或是括號不平衡 (< / >)。" #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "無效的標籤" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "無效的標籤 <b>%s</b>\n" "\n" "當前選取的檔案不支援標籤編輯。" #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "您所輸入的格式無效。確定您輸入 < 和 > 代替 \\< 和 \\>;並且您輸入" "的標籤都對稱。\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "編輯顯示" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "音軌編號" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "起始編號:(_m)" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "總計音軌數:(_T)" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "播放器" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "預覽 (_P)" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "與其他 %d 首..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "正在儲存曲目變更。" #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "正在移動 %d/%d。" #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "正在檢查掛載點" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "位置" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "叫作 %s 的播放清單已經存在了。" #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "顯示專輯封面 (_C)" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "檔案系統" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "顯示基本的使用方法" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "顯示版本與著作權" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[選項]" #: ../quodlibet/util/__init__.py:182 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "錯誤:選項「%s」未被辨識。" #: ../quodlibet/util/__init__.py:185 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "錯誤:選項「%s」需要一個參數。" #: ../quodlibet/util/__init__.py:188 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "錯誤:「%s」不是一個獨特的前綴 (prefix)。" #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d 秒" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "無時間資訊" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d 秒" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d 分" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d 時" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d 日" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d 年" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "check|titlecase?" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "日期必須以「YYYY」、「YYYY-MM-DD」或是「YYYY-MM-DD HH:MM:SS」格式輸入。" #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "回放增益增益必須以「x.yy dB」格式輸入。" #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "回放增益高峰值必須以「x.yy」格式輸入。" #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz IDs 必須是 UUID 格式。" #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz 釋出狀態應當是「official」、「promotional」或者是「bootleg」。" #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "無法編輯曲目" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "儲存 <b>%s</b> 時發生錯誤。這個檔案可能唯讀、損壞或是您沒有編輯權限。" #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[無效的編碼]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "專輯" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "組織者" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "組織者" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "組織者" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "作者" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "作者" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "作曲" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "作曲" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "作曲" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "指揮" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "指揮" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "指揮" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "聯絡" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "著作權" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "日期" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "描述" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "風格" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "風格" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "表演者" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "組合" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "語言" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "許可" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "位置" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "作詞" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "作詞" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "作詞" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "團體" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "標題" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "版本" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "網站" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "專輯演出者" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "唱片" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "音軌" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "標籤 ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "最初發行日期" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "原作專輯" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "原作" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "錄製日期" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "發行國家" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz 演出者 ID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz 音軌 ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz 專輯狀態" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz 專輯類型" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz 音軌 ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "音軌增益" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "音軌高峰值" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "專輯增益" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "專輯高峰值" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "偏好設定" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "唱片" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "音軌" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "上次開始" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "全名" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "掛載點" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "個人或團體" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "年份" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "最初發行日期" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "書籤" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "格式" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "播放清單" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "瀏覽器" #~ msgid "Unable to download lyrics." #~ msgstr "無法下載歌詞。" #~ msgid "Remove all songs from the queue" #~ msgstr "移除佇列中所有曲目" #~ msgid "Watch this folder for new songs" #~ msgstr "監視這個資料夾中的新曲目" #~ msgid "Set or toggle the playback order" #~ msgstr "設定或切換播放順序" #~ msgid "Uninitialized iPod" #~ msgstr "iPod 尚未初始化" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "您是否要在這 iPod 上建立一個空的資料庫?" #~ msgid "_Volume Gain (dB):" #~ msgstr "音量增益 (dB):(_V)" #~ msgid "Combine tags with _multiple values" #~ msgstr "以多個設定值合併標籤" #~ msgid "Model:" #~ msgstr "模式;" #~ msgid "Capacity:" #~ msgstr "容量:" #~ msgid "Firmware:" #~ msgstr "韌體" #, fuzzy #~ msgid "Removing orphaned iPod track" #~ msgstr "警告:正在移除孤立的 iPod 音軌" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "無法儲存 iPod 資料庫" #~ msgid "Unable to save iPod database" #~ msgstr "無法儲存 iPod 資料庫" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "音軌高峰值" #~ msgid "Shuffle" #~ msgstr "洗牌" #~ msgid "Weighted" #~ msgstr "加權" #~ msgid "_Weighted" #~ msgstr "加權 (_W)" #~ msgid "_One Song" #~ msgstr "單曲 (_O)" #~ msgid "Restart the playlist when finished" #~ msgstr "當結束時重新開始這個播放清單" #~ msgid "Disable Browser" #~ msgstr "停用瀏覽器" #~ msgid "_Disable Browser" #~ msgstr "停用瀏覽器 (_D)" #, fuzzy #~ msgid "Force Write" #~ msgstr "寫入" #~ msgid "Filter on _Genre" #~ msgstr "依風格篩選 (_G)" #~ msgid "Filter on _Artist" #~ msgstr "依演出者篩選 (_A)" #~ msgid "Filter on Al_bum" #~ msgstr "依專輯篩選 (_B)" #~ msgid "_Music" #~ msgstr "音樂 (_M)" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "書籤" #~ msgid "Song _List" #~ msgstr "曲目排序 (_L)" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "在這首歌之後停止" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "與其他 %d 首..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "從專輯分離唱片 (_A)" #, fuzzy #~ msgid "Timeout" #~ msgstr "時間" #, fuzzy #~ msgid "Select an album" #~ msgstr "全選 (_A)" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s 與其他 %(count)d 首..." #, fuzzy #~ msgid "Playlist Export" #~ msgstr "播放清單" #~ msgid "Re_fresh Library" #~ msgstr "重新整理資料庫 (_F)" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "評等 (_R)" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "無法開啟檔案" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "無效的設定值" #, fuzzy #~ msgid "ql-revert" #~ msgstr "ql-remove" #~ msgid "command|filename" #~ msgstr "command|filename" #~ msgid "command|tag" #~ msgstr "command|tag" #, fuzzy #~ msgid "heading|Search" #~ msgstr "搜尋" #~ msgid "%d of %d" #~ msgstr "%d 之 %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "使用方法:%s %s" #~ msgid "_Download..." #~ msgstr "下載... (_D)" #, fuzzy #~ msgid "_New Station..." #~ msgstr "新的站台 (_N)" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "是否複寫 <b>%s</b>?" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet 已經在執行了。" #~ msgid "No song is currently playing." #~ msgstr "當前沒有播放中的曲目。" #~ msgid "Unable to write to %s. Removing it." #~ msgstr "無法寫入 %s。正在移除。" #~ msgid "_Edit Bookmarks..." #~ msgstr "編輯書籤... (_E)" #~ msgid "_New Folder..." #~ msgstr "新資料夾... (_N)" #~ msgid "_Add to Playlist" #~ msgstr "加入播放清單 (_A)" #~ msgid "_Edit Display..." #~ msgstr "編輯顯示... (_E)" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d 站台" #~ msgid "_Add a Location..." #~ msgstr "加入位置... (_A)" #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "設置檔頭... (_C)" #, fuzzy #~ msgid "Track Headers" #~ msgstr "音軌檔頭 (_T)" #, fuzzy #~ msgid "People Headers" #~ msgstr "個人或團體檔頭 (_P)" #, fuzzy #~ msgid "Album Headers" #~ msgstr "專輯檔頭 (_A)" #, fuzzy #~ msgid "Date Headers" #~ msgstr "日期檔頭 (_D)" #, fuzzy #~ msgid "File Headers" #~ msgstr "檔案檔頭 (_F)" #, fuzzy #~ msgid "Production Headers" #~ msgstr "出版檔頭 (_P)" #, fuzzy #~ msgid "Tag:" #~ msgstr "標籤:(_T)" #, fuzzy #~ msgid "Warnings" #~ msgstr "評等 (_R)" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "專輯演出者" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "演出者" #, fuzzy #~ msgid "album (sort)" #~ msgstr "專輯演出者" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "表演者" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "表演者" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz 專輯演出者 ID" #, fuzzy #~ msgid "errors" #~ msgstr "表演者" #~ msgid "Permanently delete this file?" #~ msgstr "永久刪除這個檔案?" #~ msgid "Permanently delete these files?" #~ msgstr "永久刪除這些檔案?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s 與其他 %(count)d 首..." #, fuzzy #~ msgid "Version:" #~ msgstr "版本" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "外掛程式錯誤" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s 不能被加到您的資料庫。\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "未發現退出(裝置)指令。" #~ msgid "Unable to start web browser" #~ msgstr "無法啟動網頁瀏覽器" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "無法找到網頁瀏覽器。請設定您的 $BROWSER 變數,或是確定/usr/bin/sensible-" #~ "browser 是否存在。" #, fuzzy #~ msgid "Library Error" #~ msgstr "資料庫瀏覽器" #, fuzzy #~ msgid "_Output device:" #~ msgstr "複製到裝置 (_C)" #~ msgid "translator-credits" #~ msgstr "" #~ "翻譯者資訊\n" #~ "繁體中文翻譯:\n" #~ "Hsin-lin Cheng <lancetw@gmail.com>\n" #~ "若有任何關於本軟體的繁體中文翻譯問題,歡迎不吝指教。" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "顯示其他欄位,以空白隔開" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "繼續 (_C)" #~ msgid "Search your library" #~ msgstr "搜尋您的資料庫" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, and others\n" #~ "\n" #~ "This is free softwae; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "合計大小:" #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet 外掛" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "用藍色顯示簡單的搜尋,用綠色顯示進階搜尋,用紅色顯示無效的搜尋。" #~ msgid "_Select" #~ msgstr "選取 (_S)" #~ msgid "Separators for splitting tags" #~ msgstr "以分隔符號分開標籤" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet 偏好設定" #~ msgid "Not Played To_day" #~ msgstr "本日沒有播放紀錄 (_D)" #~ msgid "Not Played in a _Week" #~ msgstr "本星期沒有播放紀錄 (_W)" #~ msgid "Not Played in a _Month" #~ msgstr "本月沒有播放紀錄 (_M)" #~ msgid "B_ottom 40" #~ msgstr "倒數 40 名 (_O)" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "這是您播放最少次的 40 首曲目 (排名平手的話或許會超出 40 首)" #~ msgid "gtk-media-next" #~ msgstr "gtk-media-next" #~ msgid "gtk-media-previous" #~ msgstr "gtk-media-previous" #~ msgid "gtk-media-play" #~ msgstr "gtk-media-play" #~ msgid "gtk-media-pause" #~ msgstr "gtk-media-pause" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | control ]" #, fuzzy #~ msgid "Date" #~ msgstr "日期 (_D)" #~ msgid "Choose New Stations" #~ msgstr "選擇新站台" #~ msgid "Add" #~ msgstr "加入" #, fuzzy #~ msgid "Bitrate" #~ msgstr "位元率" #~ msgid "_Stations..." #~ msgstr "站台... (_S)" #, fuzzy #~ msgid "Quod Libet" #~ msgstr "離開 Quod Libet" #~ msgid "Unable to save library" #~ msgstr "無法儲存到資料庫" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "無法播放曲目" #~ msgid "Sort by title" #~ msgstr "依標題排序" #~ msgid "Sort by artist" #~ msgstr "依演出者排序" #~ msgid "Lyrics provided by %s." #~ msgstr "歌詞是由「%s」所提供。" #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "找不到歌詞。\n" #~ "\n" #~ "您可以按下載按鈕讓 Quod Libet 線上搜尋歌詞。您也可以自行輸入歌詞,然後按儲" #~ "存。" #~ msgid "part" #~ msgstr "部份" #~ msgid "Opening audio device." #~ msgstr "正在開啟音效裝置。" #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d 曲目已儲存" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz 專輯 ID" #~ msgid "Loaded song library." #~ msgstr "已載入曲目資料庫。" #~ msgid "Unable to open audio device" #~ msgstr "無法開啟音訊狀置" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet 已嘗試存取「autosink」與「%(sink)s」驅動但無法開啟。設定您的 " #~ "GStreamer 管線,修改 ~/.quodlibet/config 中的\n" #~ " <b>pipeline = %(sink)s</b> 這行。" #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet 不能找到 GStreamer 的元件「filesrc」。檢查您的 GStreamer 設置。" #~ msgid "Unable to retag multiple values" #~ msgstr "無法重新標籤多重設定值" #~ msgid "Changing the name of a tag with multiple values is not supported." #~ msgstr "不支援以多重設定值變更標籤名稱。" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/sk.po����������������������������������������������������������������������������0000644�0001750�0001750�00000522226�13115512747�015354� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Slovak translations for Quod Libet/Ex Falso # Lukáš Lalinský <lalinsky@gmail.com>, 2006. msgid "" msgstr "" "Project-Id-Version: sk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2006-11-08 19:59+0100\n" "Last-Translator: Lukáš Lalinský <lalinsky@gmail.com>\n" "Language-Team: Slovak <sk@li.org>\n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Upraviť tagy vo vašich audio súboroch" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Editor audio tagov" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Počúvajte, prehliadajte, alebo upravujte svoju hudobnú kolekciu" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Hudobný prehrávač" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Názov" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Interpret" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Dátum" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "žáner" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Hodnotenie" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Podľa dátumu" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Nastavenie" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Zoznam albumov" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "Zoznam _albumov" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Všetky albumy" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d album" msgstr[1] "%d albumy" msgstr[2] "%d albumov" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Zobraziť _obaly albumov" msgstr[1] "Zobraziť _obaly albumov" msgstr[2] "Zobraziť _obaly albumov" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Skladby bez albumu" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d skladba" msgstr[1] "%d skladby" msgstr[2] "%d skladieb" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d disk" msgstr[1] "%d disky" msgstr[2] "%d diskov" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Všetky albumy" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Nastavenie zoznamu albumov" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Zobraziť _obaly albumov" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[možnosti]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Zobrazenie albumov" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Neznáme" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Pridať kanál" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Vložte umiestnenie audio kanálu:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Audio kanály" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Audio kanály" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Sťahovanie" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Sťiahnuť súbory" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Sťiahnuť súbor" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Nepodarilo sa pridať kanál" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> nemôže byť pridané. The server may be down, or the location may " "not be an audio feed." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "O_bnoviť knižnicu" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Odstrániť súbory" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Prehliadať knižnice" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d skladba" msgstr[1] "%d skladby" msgstr[2] "%d skladieb" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Neplatná vzorka" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Neznáme" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Rozdeliť na _viacero hodnôt" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Vlastné" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "_Hodnotenie" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Nastavenie zoznamu albumov" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Celková veľkosť:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Celková veľkosť:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Nastavenie prehliadača" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Zobraziť _obaly albumov" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Všetky albumy" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "organizácia" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Súborový systém" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Súborový systém" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Nepodarilo sa skopírovať skladby" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Vybrané súbory nemôžu byť kopírované do iného zoznamu skladieb alebo fronty." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Pridať do knižnice" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Nepodporovaný typ súboru" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Nepodarilo sa pridať stanicu" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internetové rádio" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Sťiahnuť súbory" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Nová stanica" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Vložte umiestnenie Internetovej rádio stanice:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "hodnotenie" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Nová stanica" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Internetové rádio" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Nová stanica" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_Nová stanica" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Nová stanica" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Nenájdené žiadne stanice." #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Na %s nebola nájdená žiadna Internetová rádio stanica." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Všetky stanice už sú v knižnici." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "_Pridať do playlistu" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "_Odstrániť z playlistu" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d stanica" msgstr[1] "%(count)d stanice" msgstr[2] "%(count)d staníc" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Vlastnosti zariadenia" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Zariadenie:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Nepripojené" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Prípojný bod:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Názov:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Média zariadenia" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Média zariadenia" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Vysunúť" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Vlastnosti" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Premenovať" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> použité, <b>%s</b> dostupné" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> nie je pripojené." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "Kopírovanie <b>%s</b>" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Neporadilo sa kopírovať skladbu" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Na túto skladbu nie je dost voľného miesta" #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> nemôže byť skopírované." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Nepodarilo sa vymazať skladby" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "Odstraňovanie <b>%s</b>" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> nemôže byť odstránené." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Nedá sa odstrániť skladba" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "Vysúvanie <b>%s</b> zlyhalo." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Neporadilo sa vysunúť zariadenie" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Prehliadač" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Prehliadač" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Označiť _všetko:" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Všetko" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Nastavenie prehliadača" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Playlisty" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Playlisty" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Odstrániť z playlistu" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Import" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Nový playlist" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Nepodarilo sa importovať playlist" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "Quod Libet môže importovať iba playlist vo formáte M3U alebo PLS." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Neporadilo sa premenovať playlist" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Importovať playlist" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Nový playlist" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Nový playlist" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Nastavenie prehliadača" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Playlisty" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" #: ../quodlibet/browsers/playlists/util.py:51 #, fuzzy msgid "Enter a name for the new playlist:" msgstr "Vložte názov novej zložky:" #: ../quodlibet/browsers/playlists/util.py:102 #, fuzzy, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Importovanie playlistu.\n" "\n" "%d/%d skladieb pridaných." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Obmedziť výsledky" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Vyhľadávať v knižnici" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Vyhľadávať v knižnici" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Prehliadač" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Vyhľadávať" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "miesto" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet nie je spustený." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "hudobný prehrávač" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[možnosti]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Vypíše hrajúcu skladbu a skončí" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Začať prehrávanie okamžite" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Preskočiť na nasledujúcu skladbu" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Preskočiť na predchádzajúcu skladbu" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Spustiť prehrávanie" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Pozastaviť prehrávanie" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Prepnúť mód prehrávania/pauzy" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Spustiť prehrávanie" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Zvýšiť hlasitosť" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Znižiť hlasitosť" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Vypísať stav prehrávača" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Schovať hlavné okno" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Zobraziť hlavné okno" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Prepnúť viditelnosť hlavného okna" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "" #: ../quodlibet/cli.py:109 #, fuzzy msgid "Refresh and rescan library" msgstr "O_bnoviť knižnicu" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Vypnúť prehliadač" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Vypísať aktuálny playlist" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Vypísať obsah fronty" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Vypísať obsah fronty" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet nie je spustený." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Ukončiť Quod Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Presunúť pozíciu hrajúcej skladby" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Prepnúť mód prehrávania/pauzy" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Zapnúť alebo vypnúť opakovanie" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Nastaviť hlasitosť" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Vyhľadávať v hudobnej knižnici" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "dotaz" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Prehrať súbor" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "názov súboru" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Ohodnotiť hrajúcu skladbu" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Nastaviť aktuálny prehliadač" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Ohodnotiť hrajúcu skladbu" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Otvoriť nový prehrávač" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Zobraziť alebo skryť frontu" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Zobraziť alebo skryť hlavný zoznam skladieb" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Filter na náhodnej hodnote" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Tag" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Filter na hodnote tagu" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=hodnota" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Pridať do fronty" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "názov súboru" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "" #: ../quodlibet/cli.py:142 #, fuzzy msgid "Unqueue a file or query" msgstr "Pridať do fronty" #: ../quodlibet/cli.py:203 #, fuzzy, python-format msgid "Invalid argument for '%s'." msgstr "E: Neplatný argument pre '%s'." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, fuzzy, python-format msgid "Try %s --help." msgstr "E: Skúste %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Neznáme zariadenie" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" #: ../quodlibet/devices/__init__.py:153 #, fuzzy, python-format msgid "%r is not a supported device." msgstr "E: '%s' nie je unikátny prefix." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "" #: ../quodlibet/devices/__init__.py:450 #, fuzzy msgid "Initializing device backend." msgstr "Neplatná hodnota" #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "" #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "" #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Formát názvu súboru:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopírovať obaly _albumov" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Odstrániť nepoužívané obaly a adresáre" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Zobraziť _chyby" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "popis" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "editor audio tagov" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "adresár" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz ID skladby" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz ID skladby" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Neplatné kódovanie]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Názov" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Editor audio tagov" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_Každé slovo začína veľkým písmenom" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Nastavenie prehliadača" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Celková veľkosť:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Upraviť zobrazenie" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Váha" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Upraviť zobrazenie" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Náhľad" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "" #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "%d sekunda" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Vlastné" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "Chyby zásuvných modulov" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Hudobný prehrávač" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Internetové rádio" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Hodnotenie" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Nepodarilo sa uložiť skladbu" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Nenájdené žiadne zásuvné moduly." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Text" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Vyčistiť vyhľadávanie" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Text" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "miesto" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Schovať hlavné okno" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Nastavenie" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "vzorka" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "vzorka" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "%d skladba" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Informácie" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "vzorka" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "miesto" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Názov" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "" #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Zariadenie:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "_Názov:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Ostatné:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Interpret" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Formát názvu súboru:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Náhodný al_bum" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "albumy" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Váha" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Náhodný al_bum" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Importovať playlist" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Import" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Text" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Nehrá" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "%d skladba" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "vzorka" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Nehrá" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "_Playlisty" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Prehrávač" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_Náhľad" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Náhodne" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "_Opakovať" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Skončiť po tejto skladbe" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Otvoriť nový prehrávač" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Upraviť _tagy" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informácie" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Playlisty" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Upraviť zobrazenie" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Text" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Text" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Zobraziť _chyby" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Súbory" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Náhľad" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Filter na _interpreta" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Vlastné" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Filter na žá_ner" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Filter na _interpreta" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio kanály" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Vložte umiestnenie audio kanálu:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Importovať playlist" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Import" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Nenájdené žiadne stanice." #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Formát názvu súboru:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Formát názvu súboru:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "_Odstrániť z playlistu" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "" #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Nový playlist" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "naposledy prehrané" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "_Fronta" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Nikdy" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Žiadne skladby" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Uložené hodnoty" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "_Premenovať" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Knižnica" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Schovať hlavné okno" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Názov súboru" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Nepodarilo sa uložiť skladbu" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Zoznam albumov" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Veľkosť" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Vyhľadať:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Vyhľadávať" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Zoznam albumov" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Upraviť záložky..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Upraviť záložky..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Záložky" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz typ albumu" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Názov súboru" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Disk" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Skladba" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Názov" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 #, fuzzy msgid "Artist" msgstr "_Interpret" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz typ albumu" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "dotaz" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Vyhľadávať" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Nenájdené žiadne zásuvné moduly." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Prehliadače" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Nepodarilo sa vytvoriť zložku" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "_Premenovať" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Neplatná vzorka" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Neplatná hodnota" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Vlastné" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Nepodarilo sa skopírovať skladby" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Vypnúť prehliadač" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "_Hodnotenie" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "_Hodnotenie" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Upraviť zobrazenie" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "_Hodnotenie" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Filter na hodnote tagu" #: ../quodlibet/ext/songsmenu/filterall.py:81 #, fuzzy msgid "Creates a search query based on tags of the selected songs." msgstr "GStreamer nemohol načítať vybranú skladbu." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Filter na žá_ner" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 #, fuzzy msgid "Queued" msgstr "_Fronta" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Zapísať" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz ID skladby" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "adresár" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "Hlavičky _albumu" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Nová stanica" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Importovať playlist" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "_Premenovať" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Importovať playlist" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Informácie" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Importovať playlist" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Nepodarilo sa importovať playlist" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "Vysúvanie <b>%s</b> zlyhalo." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "O_bnoviť knižnicu" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "O_bnoviť knižnicu" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Upraviť tagy" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Upraviť tagy" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Všetky albumy" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Náhľad" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Tag" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Nepodarilo sa vymazať skladby" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Vyhľadávať" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "vzorka" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Upraviť uložené hodnoty..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Farebne označovať _vyhľadávanie" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Knižnica" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Kontrola prípojných bodov" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Skenovanie knižnice" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "Skenovanie %s" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Zobraziť _programové tagy" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "popis" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Hodnota" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Editor audio tagov" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Nie sú vybrané žiadne skladby." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Filter na hodnote tagu" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Filter na hodnote tagu" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Žiadna informácia o čase" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "Nepodarilo sa premenovať súbory" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Súbor" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Zobraziť krátku informáciu o použití" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> nie je platné umiestnenie." #: ../quodlibet/order/__init__.py:30 #, fuzzy msgid "_Unknown" msgstr "Neznáme" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "V poradí" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_V poradí" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Náhodne" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Náhodne" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "_Opakovať" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Jedna skladba" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "%d sekunda" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Nenájdené žiadne stanice." #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "" #: ../quodlibet/player/xinebe/player.py:90 #, fuzzy msgid "Unable to create audio output" msgstr "Nepodarilo sa vytvoriť zložku" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Zásuvné moduly" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Podporované formáty: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Audio zariadenie: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Začiatok" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "N/A" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Čas" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Názov záložky" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Záložky" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filtre" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "_Nehrané nikdy" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Nová stanica" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Náhodný žá_ner" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Náhodný int_erpret" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Náhodný al_bum" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "40 skladieb ktoré ste hrali najviac" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Hodnota:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Uložené hodnoty" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Upraviť uložené hodnoty..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "Hlavičky _skladby" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "Hlavičky _albumu" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "_Prispôsobiť hlasitosť podľa Replay Gain" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Neznáme" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Filter na hodnote tagu" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Súbory" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "" #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Odstrániť súbory" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "" #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Presunúť do koša" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, fuzzy, python-format msgid "Moving %(current)d/%(total)d." msgstr "Presúvanie %d/%d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "Neporadilo sa uložiť iPod databázu" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "Vysúvanie <b>%s</b> zlyhalo." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, fuzzy, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Odstraňovanie %d/%d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Nepodarilo sa odstrániť súbor" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Odstraňovanie <b>%s</b> zlyhalo." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Sťahovania" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Veľkosť" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "chýba v %d skladbe" msgstr[1] "chýba v %d skladbách" msgstr[2] "chýba v %d skladbách" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "rôzne v %d skladbe" msgstr[1] "rôzne v %d skladbách" msgstr[2] "rôzne v %d skladbách" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Rozdeliť na _viacero hodnôt" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Oddeliť disk z _albumu" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Oddeliť _verziu z názvu" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Oddeliť aranžéra z in_terpreta" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Oddeliť _hudobníka z interpreta" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Oddeliť _hudobníka z interpreta" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Oddeliť _verziu z názvu" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Pridať tag" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Upraviť tagy" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Zobraziť _programové tagy" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Nikdy" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Nepodarilo sa pridať tag" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Neporadilo sa pridať skladby" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Nepodarilo sa pridať <b>%s</b>\n" "\n" "The files currently selected do not support multiple values." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Neplatný tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Neplatný tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Neplatná hodnota" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Neplarná hodnota: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Tag môže byť nepresný" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> zmenené počas behu programu. Uloženie bez obnovenia knižnice môže " "prepísať zmeny v skladbe.\n" "\n" "Uložiť túto skladba aj tak?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Nepodarilo sa uložiť skladbu" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Ukladanie <b>%s</b> zlyhalo. Súbor je možno len pre čítanie alebo nemáte " "práva na jeho zmenu." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Viac možností..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Zásuvné moduly" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s a %(count)d viac" msgstr[1] "%(title)s a %(count)d viac" msgstr[2] "%(title)s a %(count)d viac" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Možnosti Ex Falso" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "R_ozdeliť na:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Editácia tagov" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Zložky" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Nová zložka" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "_Vybrať všetky podzložky..." #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Nová zložka" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Vložte názov novej zložky:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Nepodarilo sa vytvoriť zložku" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Nepodarilo sa odstrániť zložku" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Skladby" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "od %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "Disk %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Skladba %s" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Upraviť zobrazenie" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Nie sú vybrané žiadne skladby." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Žiadne skladby" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informácie" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Text" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Vytvorené v %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "interpret" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "interpreti" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "hudobníci" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Nikdy" #: ../quodlibet/qltk/information.py:236 #, fuzzy, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%d krát" msgstr[1] "%d krát" msgstr[2] "%d krát" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "pridané" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "naposledy prehrané" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "prehraní" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "preskočení" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "hodnotenie" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "dĺžka" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Informácie" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "[Neplatné kódovanie]" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bitrate" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "veľkosť súboru" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "upravené" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d vybraná" msgstr[1] "%d vybrané" msgstr[2] "%d vybraných" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Skladba nedostupná" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Zoznam skladieb" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d skladba bez albumu" msgstr[1] "%d skladby bez albumu" msgstr[2] "%d skladieb bez albumu" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Vybraná diskografia" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d skladba bez interpreta" msgstr[1] "%d skladby bez interpreta" msgstr[2] "%d skladieb bez interpreta" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "albumy" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Celková dľžka:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Celková veľkosť:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Súbory" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Sťahovanie" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Upraviť zobrazenie..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Nenájdený žiadny text pre túto skladbu." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Vyhľadávanie textov..." #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "" #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Zahodiť zmeny v tagoch?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tagy boli zmenéné ale nie uložené. Uložiť tieto súbory, alebo zahodiť zmeny?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Nikdy" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Súbor existuje" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Premenovať súbory" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Prepnúť mód prehrávania/pauzy" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Prepnúť mód prehrávania/pauzy" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Chyby zásuvných modulov" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "" #: ../quodlibet/qltk/pluginwin.py:125 #, fuzzy msgid "Disabled" msgstr "Vypnúť prehliadač" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Poradie:" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Editácia tagov" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Celková veľkosť:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Nenájdené žiadne zásuvné moduly." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Zásuvné moduly" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Zobraziť _chyby" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Disk" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Skladba" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "zoskupenie" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "_Album" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Názob _súboru" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Dľžka" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "Automaticky _preskočiť na hrajúcu skladbu" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Ostatné:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Upraviť zobrazenie..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Viditeľné stĺpce" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Názov obsahuje _verziu" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Názov obsahuje _verziu" #: ../quodlibet/qltk/prefs.py:108 #, fuzzy msgid "Album includes _disc subtitle" msgstr "Album obsahuje ča_sť" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Názov súboru obsahuje _zložku" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Nastavenie" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Zoznam skladieb" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Viditeľné stĺpce" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Globálny filter:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Vyhľadávať" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Prehliadače" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 #, fuzzy msgid "Ratings" msgstr "_Hodnotenie" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Zoznam albumov" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Pozastaviť prehrávanie" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "_Hlasitosť (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "_Hlasitosť (dB):" #: ../quodlibet/qltk/prefs.py:395 #, fuzzy msgid "_Enable Replay Gain volume adjustment" msgstr "_Prispôsobiť hlasitosť podľa Replay Gain" #: ../quodlibet/qltk/prefs.py:420 #, fuzzy msgid "Replay Gain Volume Adjustment" msgstr "_Prispôsobiť hlasitosť podľa Replay Gain" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "_Hodnotenie" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "" #: ../quodlibet/qltk/prefs.py:556 #, fuzzy msgid "Save ratings and play _counts" msgstr "Ukladať hodnotenia a počty hraní" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Email:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "Hodnotenia a počty hraní budú nastavené pre túto emailovú adresu" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Zahodiť zmeny v tagoch?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Upraviť tagy" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Nová stanica" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "O_bnoviť knižnicu" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Vyhľadávať v knižnici" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Skontrolovať zmeny v knižnici" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Z_novunačítať knižnicu" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Znovunačítať všetky skladby v knižnici (toto môže trvať dlho)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Prehľadávať _adresáre" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Žiadne skladby" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, fuzzy, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s a %(count)d viac" msgstr[1] "%(title)s a %(count)d viac" msgstr[2] "%(title)s a %(count)d viac" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Vlastnosti" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Fronta" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "Chyby zásuvných modulov" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d skladba (%(time)s)" msgstr[1] "%(count)d skladby (%(time)s)" msgstr[2] "%(count)d skladieb (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Prehliadať knižnicu" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Prepnúť viditelnosť hlavného okna" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Pozastaviť prehrávanie" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Vyberte adresáre" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Neporadilo sa pridať skladby" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b> používa nepodporovaný protokol." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Preskočiť na hrajúcu skladbu" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Súbor" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Skladby" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Zobraziť" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Prehliadače" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Ovládanie" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Pomocník" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "Pridať _zložku..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "Pridať _súbor..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Pridať umiestnenie" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Upraviť záložky..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Skončiť po tejto skladbe" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Vyhľadávať" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Pridať umiestnenie" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Vložte umiestnenie audio súboru:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Nepodarilo sa pridať umiestnenie" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> nie je platné umiestnenie." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Pridať hudbu" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "Pridať _zložku..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Hudobný prehrávač" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "Pridať _súbor..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "_Hodnotenie" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Hodnotenie" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Nahradiť medzery _podtržítkami" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Odstrániť znaky nekompatibilné s _Windows" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Odstrániť _diakritiku" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Odstrániť ne-_ASCII znaky" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Premenovať súbory" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 #, fuzzy msgid "Path Patterns" msgstr "vzorka" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Upraviť uložené hodnoty..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Náhľad" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Nový názov" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Nepodarilo sa premenovať súbory" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Premenovanie <b>%s</b> do <b>%s</b> zlyhalo. Možno cieľový súbor už existuje " "alebo nemáte právo vytvoriť nový súbor alebo odstrániť starý." #: ../quodlibet/qltk/renamefiles.py:264 #, fuzzy msgid "Ignore _All Errors" msgstr "Zobraziť _chyby" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Pokračovať" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Cesta nie je absolútna" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Skladby uložené v týchto zložkách (oddelené pomocou ':') budú pridané do " "Vašej knižnice" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Vyberte adresáre" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Uložené hodnoty" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Upraviť uložené hodnoty..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "" #: ../quodlibet/qltk/searchbar.py:129 #, fuzzy msgid "Search after _typing" msgstr "Skončiť po tejto skladbe" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limit:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Váha" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Zobraziť zostávajúci čas" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Text" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 msgid "Focus the search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Presunúť pozíciu hrajúcej skladby" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Nepodarilo sa vymazať skladby" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Nepodarilo sa vymazať skladby" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Filter na %s" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "Hlavičky _albumu" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Hlavičky _skladby" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Hlavičky _albumu" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Hlavičky ľ_udí" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Hlavičky _dátumu" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Hlavičky _súboru" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Hlavičky _produkcie" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Vlastné hlavičky..." #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Farebne označovať _vyhľadávanie" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Pridať do _fronty" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Kopírovať na zariadenie" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Odstrániť z playlistu" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Nahradiť _podržítko medzerami" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Každé slovo začína veľkým písmenom" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Rozdeliť na viacero hodnôt" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tagy z cesty" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Nahradiť pôvodné tagy" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Pridať k pôvodným tagom" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Neplatné tagy" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Upraviť zobrazenie" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Čísla skladieb" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Začať _od:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Celkový počet:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Prehrávač" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_Náhľad" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "a %d viac..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Ukladanie skladieb, ktoré ste zmenili." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Presúvanie %d/%d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Kontrola prípojných bodov" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "miesto" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Playlist s názvom %s už existuje." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Zobraziť _obaly albumov" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Súborový systém" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Zobraziť krátku informáciu o použití" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Zobraziť verziu a copyright" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[možnosti]" #: ../quodlibet/util/__init__.py:182 #, fuzzy, python-format msgid "Option %r not recognized." msgstr "E: Možnosť '%s' nerospoznaná." #: ../quodlibet/util/__init__.py:185 #, fuzzy, python-format msgid "Option %r requires an argument." msgstr "E: Možnosť '%s' vyžaduje parameter." #: ../quodlibet/util/__init__.py:188 #, fuzzy, python-format msgid "%r is not a unique prefix." msgstr "E: '%s' nie je unikátny prefix." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%d sekunda" msgstr[1] "%d sekundy" msgstr[2] "%d sekúnd" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Žiadna informácia o čase" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d sekunda" msgstr[1] "%d sekundy" msgstr[2] "%d sekúnd" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d minúta" msgstr[1] "%d minúty" msgstr[2] "%d minút" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d hodina" msgstr[1] "%d hodiny" msgstr[2] "%d hodín" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d deň" msgstr[1] "%d dni" msgstr[2] "%d dní" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d rok" msgstr[1] "%d roky" msgstr[2] "%d rokov" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "nope" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Dátum musí byť vo formáte 'RRRR', 'RRRR-MM-DD' alebo 'RRRR-MM-DD HH:MM:SS'." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "" #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz ID musia byť v UUID formáte." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz status albumu musí byť 'official', 'promotional', or 'bootleg'" #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Neporadilo sa editovať skladbu" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Ukladanie <b>%s</b> zlyhalo. Súbor je možno len pre čítanie alebo nemáte " "práva na jeho zmenu." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Neplatné kódovanie]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "aranžér" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "aranžéri" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "aranžér" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "autor" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "autori" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "skladateľ" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "skladatelia" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "skladateľ" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "dirigent" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "dirigenti" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "dirigent" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "kontakt" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "dátum" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "popis" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "žáner" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "žáner" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "hudobník" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "zoskupenie" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "jazyk" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "licencia" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "miesto" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "autor textu" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "autori textu" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "autor textu" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "organizácia" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "názov" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "verzia" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "webstránka" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "interpret albumu" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "disk" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "skladba" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "katalógové číslo" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "originálny dátum vydania" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "pôvodný album" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "pôvodný interpret" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "dátum nahrania" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "krajina vydania" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz ID skladby" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz ID skladby" #: ../quodlibet/util/tags.py:122 #, fuzzy msgid "MusicBrainz release ID" msgstr "MusicBrainz ID skladby" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "MusicBrainz artist ID" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz ID skladby" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz status albumu" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz typ albumu" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz ID skladby" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "" #: ../quodlibet/util/tags.py:137 #, fuzzy msgid "reference loudness" msgstr "Nastavenie" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "disky" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "skladby" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "naposledy spustené" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "celý názov" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "prípojný bod" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "ľudia" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "rok" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "originálny dátum vydania" #: ../quodlibet/util/tags.py:159 #, fuzzy msgid "bookmark" msgstr "Záložky" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "formát" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Playlisty" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Prehliadače" #~ msgid "Unable to download lyrics." #~ msgstr "Neporadilo sa stiahnuť text." #~ msgid "Remove all songs from the queue" #~ msgstr "Odstrániť všetky skladby z fronty" #~ msgid "Watch this folder for new songs" #~ msgstr "Sledovať túto zložku pre nové skladby" #~ msgid "Set or toggle the playback order" #~ msgstr "Nastaviť alebo prepnúť poradie prehrávania" #~ msgid "Uninitialized iPod" #~ msgstr "Neinicializovaný iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Chcete vytvoriť prázdnu databázu na tomto iPod-e?" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Hlasitosť (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Kombinovať tagy z _viacerých hodnôt" #~ msgid "Model:" #~ msgstr "Model:" #~ msgid "Capacity:" #~ msgstr "Kapacita:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #, fuzzy #~ msgid "Removing orphaned iPod track" #~ msgstr "W: odstraňovanie ositorené iPod skladby" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Neporadilo sa uložiť iPod databázu" #~ msgid "Unable to save iPod database" #~ msgstr "Neporadilo sa uložiť iPod databázu" #, fuzzy #~ msgid "Track Repeat" #~ msgstr "Hlavičky _skladby" #~ msgid "Shuffle" #~ msgstr "Náhodne" #~ msgid "Weighted" #~ msgstr "Podľa váhy" #~ msgid "_Weighted" #~ msgstr "_Podľa váhy" #~ msgid "_One Song" #~ msgstr "_Jedna skladba" #~ msgid "Restart the playlist when finished" #~ msgstr "Reštartovať playlist po skončení" #~ msgid "Disable Browser" #~ msgstr "Vypnúť prehliadač" #~ msgid "_Disable Browser" #~ msgstr "_Vypnúť prehliadač" #, fuzzy #~ msgid "Force Write" #~ msgstr "Zapísať" #~ msgid "Filter on _Genre" #~ msgstr "Filter na žá_ner" #~ msgid "Filter on _Artist" #~ msgstr "Filter na _interpreta" #~ msgid "Filter on Al_bum" #~ msgstr "Filter na _album" #~ msgid "_Music" #~ msgstr "_Hudba" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Záložky" #~ msgid "Song _List" #~ msgstr "_Zoznam skladieb" #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Skončiť po tejto skladbe" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "a %d viac..." #~ msgstr[1] "a %d viac..." #~ msgstr[2] "a %d viac..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Oddeliť disk z _albumu" #, fuzzy #~ msgid "Timeout" #~ msgstr "Čas" #, fuzzy #~ msgid "Select an album" #~ msgstr "Označiť _všetko:" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s a %(count)d viac" #~ msgstr[1] "%(title)s a %(count)d viac" #~ msgstr[2] "%(title)s a %(count)d viac" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Playlisty" #~ msgid "Re_fresh Library" #~ msgstr "O_bnoviť knižnicu" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "_Hodnotenie" #, fuzzy #~ msgid "Unable to open input files" #~ msgstr "Neporadilo sa otvoriť súbory" #, fuzzy #~ msgid "Invalid audio backend" #~ msgstr "Neplatná hodnota" #, fuzzy #~ msgid "ql-revert" #~ msgstr "_Odstrániť z knižnice" #, fuzzy #~ msgid "heading|Search" #~ msgstr "Vyhľadávať" #~ msgid "%d of %d" #~ msgstr "%d z %d" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Použitie: %s %s" #~ msgid "_Download..." #~ msgstr "_Sťahovania..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Nová stanica" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Prepísať <b>%s</b>?" #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet už beží." #~ msgid "No song is currently playing." #~ msgstr "Momentálne nehrá žiadna skladba." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Nepodarilo sa zapísať do %s. Odstraňujem to." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Upraviť záložky..." #~ msgid "_New Folder..." #~ msgstr "_Nová zložka..." #~ msgid "_Add to Playlist" #~ msgstr "_Pridať do playlistu" #~ msgid "_Edit Display..." #~ msgstr "_Upraviť zobrazenie..." #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d stanica" #~ msgid "_Add a Location..." #~ msgstr "Pridať _umiestnenie..." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Vlastné hlavičky..." #, fuzzy #~ msgid "People Headers" #~ msgstr "Hlavičky ľ_udí" #, fuzzy #~ msgid "Album Headers" #~ msgstr "Hlavičky _albumu" #, fuzzy #~ msgid "Date Headers" #~ msgstr "Hlavičky _dátumu" #, fuzzy #~ msgid "File Headers" #~ msgstr "Hlavičky _súboru" #, fuzzy #~ msgid "Production Headers" #~ msgstr "Hlavičky _produkcie" #, fuzzy #~ msgid "Tag:" #~ msgstr "_Tag:" #, fuzzy #~ msgid "Warnings" #~ msgstr "_Hodnotenie" #, fuzzy #~ msgid "album artist (sort)" #~ msgstr "interpret albumu" #, fuzzy #~ msgid "artist (sort)" #~ msgstr "interpreti" #, fuzzy #~ msgid "album (sort)" #~ msgstr "interpret albumu" #, fuzzy #~ msgid "performer (sort)" #~ msgstr "hudobníci" #, fuzzy #~ msgid "performers (sort)" #~ msgstr "hudobníci" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz album artist ID" #, fuzzy #~ msgid "errors" #~ msgstr "hudobníci" #~ msgid "Permanently delete this file?" #~ msgstr "Vymazať tento súbor natrvalo?" #~ msgid "Permanently delete these files?" #~ msgstr "Vymazať tieto súbory natrvalo?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s a %(count)d viac..." #~ msgstr[1] "%(title)s a %(count)d viac..." #~ msgstr[2] "%(title)s a %(count)d viac..." #, fuzzy #~ msgid "Version:" #~ msgstr "verzia" #, fuzzy #~ msgid "_Cause an Error" #~ msgstr "Chyby zásuvných modulov" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s nemôže byť pridané do knižnice.\n" #~ "\n" #~ msgid "No eject command found." #~ msgstr "Príkaz na vysunutie nenájdený." #~ msgid "Unable to start web browser" #~ msgstr "Neporadilo sa spustit webový prehliadač" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Nepodarilo sa nájst žiadny webový prehliadač. Nastavte prosím premennú " #~ "$BROWSER, alebo sa uistite že súbor /usr/bin/sensible-browser existuje." #, fuzzy #~ msgid "Library Error" #~ msgstr "Prehliadať knižnice" #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Kopírovať na zariadenie" #~ msgid "translator-credits" #~ msgstr "Lukáš Lalinský <lalinsky@gmail.com>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Ostatné stĺpce, oddelené medzerami" #, fuzzy #~ msgid "_Edit and Continue" #~ msgstr "_Pokračovať" #~ msgid "Search your library" #~ msgstr "Vyhľadávať v knižnici" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quodlibet@lists.sacredchao.net>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman a ďalší\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Celková veľkosť:" #~ msgid "Quod Libet Plugins" #~ msgstr "Zásuvné moduly Quod Libet" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Zobraziť jednoduche vyhľadávanie modro, rozšírené zeleno a neplatné " #~ "červeno" #~ msgid "_Select" #~ msgstr "_Výber" #~ msgid "Separators for splitting tags" #~ msgstr "Oddelovače na delenie tagov" #~ msgid "Quod Libet Preferences" #~ msgstr "Nastavenie Quod Libet" #~ msgid "Not Played To_day" #~ msgstr "Nehrané _dnes" #~ msgid "Not Played in a _Week" #~ msgstr "Nehrané za posledný _týždeň" #~ msgid "Not Played in a _Month" #~ msgstr "Nehrané za posledný _mesiac" #~ msgid "B_ottom 40" #~ msgstr "_Spodných 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "40 skladieb ktoré ste hrali najmenej" #~ msgid "gtk-media-next" #~ msgstr "_Nasledujúca" #~ msgid "gtk-media-previous" #~ msgstr "Pre_dchádzajúca" #, fuzzy #~ msgid "Date" #~ msgstr "_Dátum" #~ msgid "Choose New Stations" #~ msgstr "Zvoľte nové stanice" #~ msgid "Add" #~ msgstr "Pridať" #, fuzzy #~ msgid "Bitrate" #~ msgstr "bitrate" #~ msgid "_Stations..." #~ msgstr "_Stanice:" #, fuzzy #~ msgid "Quod Libet" #~ msgstr "Ukončiť Quod Libet" #~ msgid "Unable to save library" #~ msgstr "Neporadilo sa uložiť knižnicu" #, fuzzy #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Neporadilo sa prehrať skladbu" #~ msgid "Sort by title" #~ msgstr "Podľa názvu" #~ msgid "Sort by artist" #~ msgstr "Podľa interpreta" #~ msgid "Lyrics provided by %s." #~ msgstr "Text od %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Žiadny text nenájdený.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgid "part" #~ msgstr "časť" #~ msgid "Opening audio device." #~ msgstr "Otváranie audio zariadenia." #~ msgid "%d/%d songs saved" #~ msgstr "%d/%d skladieb uložených" #~ msgid "MusicBrainz album ID" #~ msgstr "MusicBrainz ID albumu" #~ msgid "Loaded song library." #~ msgstr "Načítaná knižnica skladieb." #~ msgid "Unable to open audio device" #~ msgstr "Neporadilo sa otvoriť audio zariadenie" #~ msgid "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgstr "" #~ "Quod Libet tried to access the 'autosink' and '%(sink)s' drivers but " #~ "could not open them. Set your GStreamer pipeline by changing the\n" #~ " <b>pipeline = %(sink)s</b>\n" #~ "line in ~/.quodlibet/config." #~ msgid "" #~ "Quod Libet could not find the 'filesrc' GStreamer element. Check your " #~ "GStreamer installation." #~ msgstr "" #~ "Quod Libet nenašiel GStreamer element 'filesrc'. Skontrolujte svoju " #~ "inštaláciu GStreameru." ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/de.po����������������������������������������������������������������������������0000644�0001750�0001750�00000616446�13115512747�015337� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# German translation of Quod Libet # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Avoid Injury or Death # Rüdiger Arp <ruediger@gmx.net>, 2011. # Till Berger <till@mellthas.de>, 2017. # msgid "" msgstr "" "Project-Id-Version: Quod Libet 3.9\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2017-05-18 19:03+0200\n" "Last-Translator: Till Berger <till@mellthas.de>\n" "Language-Team: GERMAN <LL@li.org>\n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Generator: Poedit 1.8.7.1\n" "X-Poedit-Basepath: .\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Metadaten in Audiodateien bearbeiten" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" "Ex Falso ist ein Editor für die Bearbeitung von Metadaten mit der " "Benutzeroberfläche von Quod Libet. Mit ihm können Audio-Tags in allen " "unterstützten Dateiformaten angezeigt und bearbeitet werden." #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" "Zu den unterstützten Dateiformaten gehören Ogg Vorbis/Opus/Speex/FLAC, MP3, " "FLAC, MOD/XM/IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, " "MIDI." #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Editor für Audio-Tags" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Anhören, Durchsuchen und Bearbeiten Ihrer Audiosammlung" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" "Quod Libet ist eine Anwendung zum Verwalten der Musiksammlung. Sie kann Ihre " "Audiobibliothek auf verschiedene Arten darstellen und unterstützt " "Internetradio sowie Audio-Feeds. Quod Libet enthält äußerst flexible " "Funktionen zur Metadaten-Bearbeitung und Suche." #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Audioplayer" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 msgid "_Title" msgstr "_Titel" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Künstler" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "Dat_um" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 msgid "_Genre" msgstr "_Genre" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Bewertung" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 msgid "Sort _by…" msgstr "Sortieren _nach …" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 msgid "_Preferences" msgstr "_Einstellungen" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Albenliste" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Albenliste" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Alle Alben" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "%d Album" msgstr[1] "%d Alben" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Album-_Cover neu laden" msgstr[1] "Album-_Cover neu laden" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Titel ohne Album" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "%d Titel" msgstr[1] "%d Titel" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "%d CD" msgstr[1] "%d CDs" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 msgid "An Example Album" msgstr "Ein Beispielalbum" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Einstellungen der Albenliste" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Album-_Cover anzeigen" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Die integrierte _Suchfunktion erfasst auch Mitwirkende" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 msgid "Options" msgstr "Optionen" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Alben-Anzeige" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "S_chließen" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Unbekannt" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Neuer Feed" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Geben Sie die URL des Audio-Feeds an:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "_Hinzufügen" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Audio-Feeds" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Audio-Feeds" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 msgid "_Download…" msgstr "_Download …" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Dateien herunterladen" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "_Speichern" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Datei herunterladen" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "_Neu" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Feed konnte nicht hinzugefügt werden" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "%s konnte nicht hinzugefügt werden. Möglicherweise ist der Server gerade " "außer Betrieb, oder die angegebene URL enthält keinen Audio-Feed." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 msgid "_Refresh" msgstr "_Aktualisieren" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 msgid "_Delete" msgstr "_Löschen" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Das aktuelle Audio-Backend unterstützt keine URLs, der Browser für Audio-" "Feeds wurde deaktiviert." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Bibliothek-Browser" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "%d Titel" msgstr[1] "%d Titel" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Ungültiges Muster" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Albensammlung" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "Alben_sammlung" #: ../quodlibet/browsers/collection/models.py:24 #, python-format msgid "Unknown %s" msgstr "%s ist unbekannt" #: ../quodlibet/browsers/collection/models.py:25 #, python-format msgid "Multiple %s Values" msgstr "Mehrere %s-Werte" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Benutzerdefiniert" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 msgid "_Remove" msgstr "_Entfernen" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Tag" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Zusammenführen" #: ../quodlibet/browsers/collection/prefs.py:188 msgid "Album Collection Preferences" msgstr "Einstellungen der Albensammlung" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "_Anwenden" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "_Abbrechen" #: ../quodlibet/browsers/covergrid/main.py:125 msgid "Cover Grid" msgstr "Albenraster" #: ../quodlibet/browsers/covergrid/main.py:126 msgid "_Cover Grid" msgstr "Alben_raster" #: ../quodlibet/browsers/covergrid/prefs.py:54 msgid "Cover Grid Preferences" msgstr "Einstellungen des Albenrasters" #: ../quodlibet/browsers/covergrid/prefs.py:64 msgid "Show album _text" msgstr "Album-_Text anzeigen" #: ../quodlibet/browsers/covergrid/prefs.py:71 msgid "Show \"All Albums\" Item" msgstr "Eintrag »Alle Alben« anzeigen" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "Vertikal unterteilen" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 msgid "Cover Magnification" msgstr "Cover-Skalierung" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Dateisystem" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "Dateis_ystem" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Titel konnten nicht kopiert werden" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "" "Die ausgewählten Dateien konnten nicht in die Wiedergabeliste oder " "Warteschlange kopiert werden." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Zur Bibliothek hinzufügen" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Dateityp wird nicht unterstützt" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Senderlisten dürfen nur Sender-URLs enthalten, nicht jedoch Sender- oder " "Wiedergabelisten. Die folgenden URLs können nicht geladen werden:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Sender konnte nicht hinzugefügt werden" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internet-Radio" #: ../quodlibet/browsers/iradio.py:243 msgid "Downloading station list" msgstr "Senderliste wird heruntergeladen" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Neuer Sender" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Bitte geben Sie die URL eines Internet-Radiosenders ein:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Electronic" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "HipHop / Rap" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Oldies" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japanisch" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "Indisch" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Religion" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Charts" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Türkisch" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Reggae / Dancehall" #: ../quodlibet/browsers/iradio.py:372 msgid "Latin" msgstr "Latin" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "Campusradio" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Talk / News" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambient" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Jazz" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Klassik" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternative" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metal" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Country" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "News" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Schlager" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Funk" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Blues" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Punk" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Reggaeton" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Slawisch" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Griechisch" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gothic" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rock" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "Möchten Sie eine Liste beliebter Radiosender laden?" #: ../quodlibet/browsers/iradio.py:455 msgid "_Load Stations" msgstr "Sender _laden" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "Internet-_Radio" #: ../quodlibet/browsers/iradio.py:538 msgid "_New Station…" msgstr "_Neuer Sender …" #: ../quodlibet/browsers/iradio.py:541 msgid "_Update Stations" msgstr "Sender akt_ualisieren" #: ../quodlibet/browsers/iradio.py:568 msgid "All Stations" msgstr "Alle Sender" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Favoriten" #: ../quodlibet/browsers/iradio.py:580 msgid "No Category" msgstr "Keine Kategorie" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Keine Sender gefunden" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Unter %s wurden keine Internet-Radiosender gefunden." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Alle aufgelisteten Sender befinden sich bereits in Ihrer Bibliothek." #: ../quodlibet/browsers/iradio.py:828 msgid "Add to Favorites" msgstr "Zu Favoriten hinzufügen" #: ../quodlibet/browsers/iradio.py:832 msgid "Remove from Favorites" msgstr "Aus Favoriten entfernen" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d Sender" msgstr[1] "%(count)d Sender" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Geräte-Eigenschaften" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Gerät:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Nicht eingebunden" #: ../quodlibet/browsers/media.py:55 msgid "Mount point:" msgstr "Einhängepunkt:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "_Name:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Mediaplayer" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Mediaplayer" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "Aus_werfen" #: ../quodlibet/browsers/media.py:360 msgid "_Properties" msgstr "_Eigenschaften" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "_Umbenennen" #: ../quodlibet/browsers/media.py:461 #, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "%(used-size)s verwendet, %(free-size)s verfügbar" #: ../quodlibet/browsers/media.py:479 #, python-format msgid "%s is not connected." msgstr "%s ist nicht verbunden." #: ../quodlibet/browsers/media.py:499 #, python-format msgid "Copying %(song)s" msgstr "Kopiere %(song)s" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Titel konnte nicht kopiert werden" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Für diesen Titel reicht der freie Speicherplatz nicht aus." #: ../quodlibet/browsers/media.py:526 #, python-format msgid "%s could not be copied." msgstr "%s konnte nicht kopiert werden." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Titel konnten nicht gelöscht werden" #: ../quodlibet/browsers/media.py:557 #, python-format msgid "Deleting %(song)s" msgstr "Lösche %(song)s" #: ../quodlibet/browsers/media.py:575 #, python-format msgid "%s could not be deleted." msgstr "%s konnte nicht gelöscht werden." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Der Titel konnte nicht gelöscht werden" #: ../quodlibet/browsers/media.py:594 #, python-format msgid "Ejecting %s failed." msgstr "Auswerfen von %s fehlgeschlagen." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Datenträger konnte nicht ausgeworfen werden" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "" "Kein Backend für Geräte gefunden, der Mediaplayer-Browser wurde deaktiviert." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Browser" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "Br_owser" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "A_lle auswählen" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Alle" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" "Tagmuster mit optionalem Markup, z.B. <tt>composer</tt> oder\n" "<tt>%s</tt>" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "_Breitbildmodus" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Einstellungen des Browsers" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "Gleichmäßige Leistenbreite" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Wiedergabelisten" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "Wieder_gabelisten" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "Aus der Wiede_rgabeliste entfernen" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Importieren" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Neue Wiedergabeliste" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Die Wiedergabeliste konnte nicht importiert werden" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet kann nur Wiedergabelisten in den Formaten M3U und PLS importieren." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Die Wiedergabeliste konnte nicht umbenannt werden" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Wiedergabeliste importieren" #: ../quodlibet/browsers/playlists/menu.py:25 msgid "_New Playlist…" msgstr "Wiedergabeliste a_nlegen …" #: ../quodlibet/browsers/playlists/menu.py:86 #, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "Was möchten Sie mit dem %d Titel tun?" msgstr[1] "Was möchten Sie mit den %d Titeln tun?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "Aktion für Wiedergabeliste »%s« bestätigen" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "leer" #: ../quodlibet/browsers/playlists/prefs.py:39 msgid "Example Playlist" msgstr "Beispiel-Wiedergabeliste" #: ../quodlibet/browsers/playlists/prefs.py:47 msgid "Playlist Browser Preferences" msgstr "Einstellungen des Wiedergabelisten-Browsers" #: ../quodlibet/browsers/playlists/prefs.py:52 msgid "Playlist display" msgstr "Wiedergabelisten-Anzeige" #: ../quodlibet/browsers/playlists/util.py:33 #, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "Sind Sie sicher, dass Sie die Wiedergabeliste »%s« löschen möchten?" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Alle Informationen zur ausgewählten Wiedergabeliste werden gelöscht und " "können nicht wiederhergestellt werden." #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Geben Sie einen Namen für die neue Wiedergabeliste ein:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Wiedergabeliste wird importiert.\n" "\n" "%(current)d/%(total)d Titel hinzugefügt." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "Er_gebnis weiter einschränken" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Bibliothek durchsuchen" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "Bibliothek d_urchsuchen" #: ../quodlibet/browsers/soundcloud/main.py:38 msgid "Soundcloud Browser" msgstr "Soundcloud-Browser" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "Sound_cloud" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Suchen" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "Zu %s gehen" #: ../quodlibet/browsers/soundcloud/main.py:380 msgid "Connected" msgstr "Verbunden" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "Quod Libet ist nun verbunden, <b>%s</b>!" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "Von %s abmelden" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "Code eingeben …" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "Zu %s anmelden" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "Soundcloud-Autorisierung" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "Geben Sie den Soundcloud-Autorisierungs-Code ein:" #: ../quodlibet/cli.py:50 msgid "Quod Libet is not running (add '--run' to start it)" msgstr "" "Quod Libet läuft momentan nicht (fügen Sie »--run« an, um es zu starten)" #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "Musik-Bibliothek und -Player" #: ../quodlibet/cli.py:86 msgid "[option]" msgstr "[Option]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Momentan gespielten Titel anzeigen" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Wiedergabe sofort starten" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "Keine Fenster beim Programmstart anzeigen" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Nächsten Titel abspielen" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "" "Zum vorherigen Titel oder – falls Titel noch nicht lange läuft – zum " "Titelanfang springen" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Vorherigen Titel abspielen" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Wiedergabe starten" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Wiedergabe pausieren" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Zwischen Wiedergabe/Pause umschalten" #: ../quodlibet/cli.py:100 msgid "Stop playback" msgstr "Wiedergabe stoppen" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Lautstärke erhöhen" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Lautstärke senken" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Wiedergabestatus anzeigen" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Hauptfenster verbergen" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Hauptfenster anzeigen" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Hauptfenster anzeigen/verbergen" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Fokus auf laufenden Player setzen" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Aktive Browserfilter entfernen" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Bibliothek aktualisieren und neu einlesen" #: ../quodlibet/cli.py:110 msgid "List available browsers" msgstr "Verfügbare Browser auflisten" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Aktuelle Wiedergabeliste anzeigen" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Aktuelle Warteschlange anzeigen" #: ../quodlibet/cli.py:113 msgid "Print the active text query" msgstr "Den aktuellen Abfragetext anzeigen" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Ohne Plugins starten" #: ../quodlibet/cli.py:115 msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet starten, wenn es nicht läuft" #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Quod Libet beenden" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Zu einer bestimmten Position im momentan abgespielten Titel gehen" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 msgid "Set or toggle shuffle mode" msgstr "Zufalls-Modus setzen oder umschalten" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Endlosschleife ein-, aus-, oder zwischen beiden Modi umschalten" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Lautstärke einstellen" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Audio-Bibliothek durchsuchen" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "Abfrage" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Datei abspielen" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 msgctxt "command" msgid "filename" msgstr "Dateiname" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Abgespielten Titel bewerten" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Aktuellen Browser einstellen" #: ../quodlibet/cli.py:129 msgid "Stop after the playing song" msgstr "Nach dem momentan gespielten Titel stoppen" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Neuen Browser öffnen" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Warteschlange anzeigen oder verbergen" #: ../quodlibet/cli.py:133 msgid "Show or hide the main song list (deprecated)" msgstr "Titelliste anzeigen oder verbergen (veraltet)" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Nach zufälligem Wert filtern" #: ../quodlibet/cli.py:134 msgctxt "command" msgid "tag" msgstr "Tag" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Nach Tag-Wert filtern" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "tag=Wert" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Eine Datei oder eine Abfrage zur Warteschlange hinzufügen" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "" "Mehrere Dateien – durch Kommata getrennt – zur Warteschlange hinzufügen" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "Dateiname" # Klingt genauso wackelig wie das Englische. Was meinst? #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Dateinamen von Abfrageergebnissen auf Standardausgabe ausgeben" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Eine Datei oder eine Abfrage aus Warteschlange entfernen" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Argument für »%s« ungültig." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Geben Sie »%s --help« ein." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Unbekanntes Gerät" #: ../quodlibet/devices/__init__.py:32 #, python-format msgid "Could not import %s, which is needed for device support." msgstr "" "»%s« konnte nicht importiert werden, wird jedoch für die Geräteunterstützung " "benötigt." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r ist kein unterstütztes Gerät." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, python-format msgid "Could not find '%s'." msgstr "»%s« konnte nicht gefunden werden." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Initialisiere Geräte-Backend." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "Versuche »%s«" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Konnte nicht mit einem Geräte-Backend verbinden." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Geräte-Backend initialisiert." #: ../quodlibet/devices/storage.py:57 msgid "_Filename pattern:" msgstr "Muster für _Dateinamen:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Alben-_Cover kopieren" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Ungenutzte Cover und Ordner entfernen" #: ../quodlibet/errorreport/ui.py:60 msgid "An Error Occurred" msgstr "Ein Fehler ist aufgetreten" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" "Sie können diesen Fehler ignorieren; allerdings läuft die Anwendung " "möglicherweise nicht mehr stabil, bis sie neugestartet wird. Das Einsenden " "eines Fehlerberichts nimmt nur einen kurzen Moment in Anspruch und hilft uns " "sehr." #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "Problembericht erstellen" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "Fehlerbericht einsenden" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "Programm beenden" #: ../quodlibet/errorreport/ui.py:76 msgid "Ignore Error" msgstr "Fehler ignorieren" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "Fehler-Details:" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" "Verschiedene den Fehler und Ihr System betreffende Details werden an einen " "Fremdservice gesendet (<a href='https://www.sentry.io'>www.sentry.io</a>). " "Sie können die Daten vor dem Senden unten überprüfen." #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" "(Optional) Bitte beschreiben Sie kurz, was passierte, als der Fehler auftrat:" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "Ab_senden" #: ../quodlibet/errorreport/ui.py:115 msgid "Short description…" msgstr "Kurze Beschreibung …" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "Daten, die gesendet werden:" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "Editor für Audio-Tags" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "Ordner" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "Grafik-URL-Cover-Quelle" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" "Lädt Cover, die über den Tag »artwork_url« verlinkt sind, herunter. " "Funktioniert mit dem Soundcloud-Browser." #: ../quodlibet/ext/covers/discogs.py:25 msgid "Discogs Cover Source" msgstr "Discogs-Cover-Quelle" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "Lädt Cover von Discogs herunter." #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "Last.fm-Cover-Quelle" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "Lädt Cover aus dem Cover-Art-Archiv von Last.fm herunter." #: ../quodlibet/ext/covers/musicbrainz.py:19 msgid "MusicBrainz Cover Source" msgstr "MusicBrainz-Cover-Quelle" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "Lädt Cover aus dem Cover-Art-Archiv von MusicBrainz herunter." #: ../quodlibet/ext/editing/iconv.py:26 msgid "Convert Encodings" msgstr "Kodierung umwandeln" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "Behebt fehlinterpretierte Tag-Wert-Kodierungen im Tag-Editor." #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "_Kodierung umwandeln …" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "Kana/Kanji Simple Inverter" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "Wandelt Kana/Kanji nach Rōmaji um vor dem Umbenennen." #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "_Japanischen Text romanisieren" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "»Kanji Kana Simple Inverter« (kakasi) wurde nicht gefunden." #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "Ersetzung mit regulären Ausdrücken" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" "Erlaubt beliebige Ersetzungen mit regulären Ausdrücken (s///) beim Taggen " "oder Umbenennen von Dateien." #: ../quodlibet/ext/editing/titlecase.py:20 msgid "Title Case" msgstr "Title case" #: ../quodlibet/ext/editing/titlecase.py:21 msgid "Title-cases tag values in the tag editor." msgstr "" "Gebräuchliche Groß-/Kleinschreibung von Titeln im Englischen auf Tag-Werte " "im Tag-Editor anwenden." #: ../quodlibet/ext/editing/titlecase.py:40 msgid "Title-_case Value" msgstr "Title _case anwenden" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "Tagwerte in GROSSBUCHST_ABEN erlauben" #: ../quodlibet/ext/editing/titlecase.py:52 msgid "_Human title case" msgstr "_Übliche Groß-/Kleinschreibung von Titeln verwenden" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Gebräuchliche englische Regeln für Groß-/Kleinschreibung von Titeln " "verwenden. Beispiel: “Dark Night of the Soul”" #: ../quodlibet/ext/events/advanced_preferences.py:69 msgid "Advanced Preferences" msgstr "Erweiterte Einstellungen" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "Erweiterte Konfigurationseinstellungen anpassen." #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "Ich weiß, was ich tue" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "Animierte On-screen-Anzeige" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "Zeigt Titelinformationen auf dem Bildschirm beim Titelwechsel an." #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "Oberer Teil des Bildschirms" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "Mitte des Bildschirms" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "Unterer Teil des Bildschirms" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "_Position:" #: ../quodlibet/ext/events/animosd/prefs.py:171 msgid "_Cover size:" msgstr "_Covergröße:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 msgid "Display" msgstr "Anzeige" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "Schri_ft:" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "Links" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "Zentriert" #: ../quodlibet/ext/events/animosd/prefs.py:197 msgid "Right" msgstr "Rechts" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "Text_ausrichtung:" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "Text" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "_Text:" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "_Füllung:" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "Farben" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "_Schatten" #: ../quodlibet/ext/events/animosd/prefs.py:241 msgid "_Outline" msgstr "_Umrandung" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "Abgeru_ndete Ecken" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "Ver_zögerung:" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "Effekte" #: ../quodlibet/ext/events/animosd/prefs.py:270 msgid "Ed_it Display Pattern…" msgstr "Anzeigemuster b_earbeiten …" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 msgid "Preview" msgstr "Vorschau" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "Automatische Bibliotheks-Aktualisierung" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "Hält die Bibliothek mit inotify aktuell. Benötigt %s." #: ../quodlibet/ext/events/automask.py:22 msgid "Automatic Masking" msgstr "Automatische Maskierung" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" "Maskiert und demaskiert Laufwerke automatisch, wenn sie aus- oder eingehängt " "werden." #: ../quodlibet/ext/events/autorating.py:15 msgid "Automatic Rating" msgstr "Automatische Bewertung" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" "Bewertet Titel automatisch, wenn sie abgespielt oder übersprungen werden. " "Benutzt den »beschleunigten« Algorithmus aus vux von Brian Nelson." #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "Wecker" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "Weckt mit lauter Musik." #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "Schlaflied" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "Blendet die Musik aus und pausiert sie." #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "Flach" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "Live" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "Voller Bass & volle Höhen" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "Club" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "Große Halle" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "Party" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "Weich" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "Voller Bass" #: ../quodlibet/ext/events/equalizer.py:48 msgid "Reggae" msgstr "Reggae" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "Kopfhörer" #: ../quodlibet/ext/events/equalizer.py:53 msgid "Soft Rock" msgstr "Soft Rock" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "Volle Höhen" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "Dance" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "Techno" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "Ska" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "Laptop" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "Equalizer" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" "Steuert den Klang der Musik mit einem Equalizer.\n" "Klicken oder die Tastatur zum Anpassen der Pegel verwenden (ein Rechtsklick " "setzt das Frequenzband zurück)." #: ../quodlibet/ext/events/equalizer.py:132 msgid "The current backend does not support equalization." msgstr "Das aktuelle Backend unterstützt keine Equalizer-Funktionalität." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "%.1f kHz" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "%d Hz" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, python-format msgid "%.1f dB" msgstr "%.1f dB" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom" msgstr "Benutzerdefiniert" #: ../quodlibet/ext/events/equalizer.py:199 msgid "_Clear" msgstr "L_eeren" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "online" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "offline" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "zum Chatten bereit" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "abwesend" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "länger abwesend" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "unsichtbar" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "Gajim-Statusnachricht" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" "Aktualisiert Ihre Gajim-Statusnachricht entsprechend dem gerade abgespielten " "Titel." #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "pausiert" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" "Geben Sie die Konten an, für die die Statusnachricht aktualisiert werden " "soll. Mehrere Konten werden durch Leerzeichen getrennt. Sind keine Konten " "angegeben, wird die Statusnachricht aller Konten aktualisiert." #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "»[paused]« anfügen" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" "Wenn gewählt, wird der Statusnachricht »[paused]« angefügt, während die " "Wiedergabe pausiert ist." #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "Status, für die die Statusnachricht aktualisiert wird" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "Pause bei Ausstecken der Kopfhörer" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" "Pausiert die Wiedergabe, wenn die Kopfhörer ausgesteckt werden, und setzt " "sie fort, wenn die Kopfhörer wieder eingesteckt werden." #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "Bildschirmschoner blockieren" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" "Verhindert die Aktivierung des GNOME-Bildschirmschoners während ein Titel " "wiedergegeben wird." #: ../quodlibet/ext/events/inhibit.py:51 msgid "Music is playing" msgstr "Musik wird wiedergegeben" #: ../quodlibet/ext/events/iradiolog.py:16 msgid "Internet Radio Log" msgstr "Internet-Radio-Log" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" "Zeichnet die letzten 10 Titel, die von Internet-Radio-Sendern gespielt " "wurden, auf. Die Titel werden im Titelpositions-Kontextmenü aufgelistet." #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "JEP-118" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "Speichert eine Jabber-User-Tunes-Datei in ~/.quodlibet/jabber." #: ../quodlibet/ext/events/language.py:21 msgid "Change Language" msgstr "Sprache ändern" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "Die Sprache der Benutzeroberfläche ändern." #: ../quodlibet/ext/events/language.py:43 msgid "System Default" msgstr "Systemvorgabe" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "Ein Neustart ist notwendig, damit Änderungen wirksam werden" #: ../quodlibet/ext/events/lyricswindow.py:199 msgid "No active song" msgstr "Kein aktiver Titel" #: ../quodlibet/ext/events/lyricswindow.py:215 msgid "No lyrics found" msgstr "Kein Liedtext gefunden" #: ../quodlibet/ext/events/lyricswindow.py:227 msgid "Lyrics:" msgstr "Liedtext:" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "_Vergößerungsfaktor:" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "URL:" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "Standard wiederherstellen" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" "Über die oben angegebene URL suchen, wenn der Liedtext nicht\n" "auf LyricsWikia gefunden werden kann." #: ../quodlibet/ext/events/lyricswindow.py:339 msgid "Alternate search" msgstr "Alternative Suche" #: ../quodlibet/ext/events/lyricswindow.py:347 msgid "Lyrics Window" msgstr "Liedtext-Fenster" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" "Zeigt ein Fenster mit dem Liedtext des aktuell wiedergegebenen Titels an." #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "UPnP-AV-Mediaserver" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" "Stellt alle Alben dem Rygel-UPnP-Mediaserver über das MediaServer2-D-Bus-" "Interface bereit." #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "MPD-Server" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" "Erlaubt die Fernsteuerung von Quod Libet über einen MPD-Client. Streaming, " "Wiedergabelisten- und Bibliotheksverwaltung werden nicht unterstützt." #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "_Port:" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "Lokale _IP:" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "P_asswort:" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 msgid "Connection" msgstr "Verbindung" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "Getestete Clients" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "MPRIS-D-Bus-Unterstützung" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" "Erlaubt die Steuerung von Quod Libet über die MPRIS-1.0/2.0-D-Bus-Interface-" "Spezifikation." #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 msgid "Hide main window on close" msgstr "Hauptfenster beim Schließen verbergen" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 msgid "Preferences" msgstr "Einstellungen" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "Akzeptiert QL-Muster, z.B. %s" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "MQTT-Publisher" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "Veröffentlicht Statusnachrichten an ein MQTT-Thema." #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "Broker-Hostname" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "Broker-Hostname / IP" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "Broker-Port" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "Broker-Port" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "Thema" #: ../quodlibet/ext/events/mqtt.py:128 msgid "Playing Pattern" msgstr "Muster für Wiedergabe" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" "Statustext für den Fall, dass die Wiedergabe eines Titels gestartet wird." #: ../quodlibet/ext/events/mqtt.py:132 msgid "Paused Pattern" msgstr "Muster für Pause" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "Statustext für den Fall, dass die Wiedergabe pausiert ist." #: ../quodlibet/ext/events/mqtt.py:136 msgid "No-song Text" msgstr "Text bei gestoppter Wiedergabe" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "Einfacher Text für den Fall, dass aktuell kein Titel abgespielt wird." #: ../quodlibet/ext/events/mqtt.py:149 msgid "MQTT Configuration" msgstr "MQTT-Konfiguration" #: ../quodlibet/ext/events/mqtt.py:153 msgid "Status Text" msgstr "Statustext" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "Verbunden mit Broker unter %(host)s:%(port)d" #: ../quodlibet/ext/events/mqtt.py:189 #, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Konnte nicht mit %(host)s:%(port)d verbinden (%(msg)s)" #: ../quodlibet/ext/events/mqtt.py:192 msgid "Connection error" msgstr "Verbindungsfehler" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "Benachrichtigungstext" #: ../quodlibet/ext/events/notify.py:88 msgid "_Title:" msgstr "_Titel:" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "Standardmuster wiederherstellen" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "_Inhalt:" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "_Benachrichtigung anzeigen" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "Benachrichtigungen anzeigen" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "Nur bei <i>_manuellem</i> Wechseln des Titels" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "Nur bei <i>_automatischem</i> Wechsel des Titels" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "Bei <i>_jedem</i> Wechsel des Titels" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "Nur, wenn das Hauptfenster nicht _fokussiert ist" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "»_Nächster«-Knopf anzeigen" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "Verbindungsfehler" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 msgid "Couldn't connect to notification daemon." msgstr "Konnte nicht mit dem Benachrichtigungs-Daemon verbinden." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "Wiedergabebenachrichtigungen" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" "Eine Benachrichtigung anzeigen, wenn der wiedergegebene Titel wechselt." #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Nächster" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" "Bitte rufen Sie das Plugin-Fenster auf, um QLScrobbler einzurichten. Solange " "werden keine Titel gesendet." #: ../quodlibet/ext/events/qlscrobbler.py:254 #, python-format msgid "Could not contact service '%s'." msgstr "Konnte den Service »%s« nicht kontaktieren." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "Authentifizierung fehlgeschlagen: Ungültige URL." #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" "Authentifizierung fehlgeschlagen: Ungültiger Benutzername »%s« oder falsches " "Passwort." #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "Client wurde verboten. Kontaktieren Sie den Autor." #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" "Falsche Systemzeit. Einsendungen schlagen möglicherweise fehl, bis das " "Problem behoben ist." #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "Audioscrobbler-Einsendung" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" "Audioscrobbler-Client für Last.fm, Libre.fm und andere Audioscrobbler-" "Services." #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "Authentifizierung erfolgreich." #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_Service:" msgstr "_Service:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "_URL:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "User_name:" msgstr "Benutzer_name:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "_Passwort:" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 msgid "Other…" msgstr "Anderer …" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "Kontodaten _verifizieren" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "Konto" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Artist pattern:" msgstr "_Künstler-Muster:" #: ../quodlibet/ext/events/qlscrobbler.py:530 msgid "_Title pattern:" msgstr "_Titel-Muster:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "Ausschluss_filter:" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" "Das Muster, das zur Formatierung des Künstlernamens für die Einsendung " "verwendet wird. Frei lassen für die Standardeinstellung." #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" "Das Muster, das zur Formatierung des Titels für die Einsendung verwendet " "wird. Frei lassen für die Standardeinstellung." #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "Titel, die diesem Filter entsprechen, werden nicht eingesendet." #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "_Offlinemodus (nichts einsenden)" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "Einsendung" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "Radio-Werbeanzeigen stummschalten" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" "Die Tonausgabe stummschalten während Werbeanzeigen im Radio abgespielt " "werden.\n" "Sender: di.fm." #: ../quodlibet/ext/events/randomalbum.py:27 msgid "Random Album Playback" msgstr "Zufälliges Album wiedergeben" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" "Startet die Wiedergabe eines zufälligen Albums, wenn die Wiedergabeliste ihr " "Ende erreicht. Setzt voraus, dass der aktive Browser das Filtern nach Album " "unterstützt." #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "Höher bewertet" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "Häufiger abgespielt" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "Häufiger übersprungen" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "Kürzlich abgespielt" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "Kürzlich angespielt" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "Kürzlich hinzugefügt" #: ../quodlibet/ext/events/randomalbum.py:44 msgid "Longer albums" msgstr "Längere Alben" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "Sekunden, bevor das nächste Album gestartet wird" #: ../quodlibet/ext/events/randomalbum.py:87 msgid "Weights" msgstr "Gewichte" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "Einige Alben häufiger als andere abspielen" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "vermeiden" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "bevorzugen" #: ../quodlibet/ext/events/randomalbum.py:201 msgid "Random Album" msgstr "Zufälliges Album" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "Warte bis zum Start von %s" #: ../quodlibet/ext/events/rbimport.py:114 msgid "Import Failed" msgstr "Import fehlgeschlagen" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "Bewertungen und Statistiken für %d Titel erfolgreich importiert" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "Rhythmbox-Import" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "Bewertungen und Titelstatistiken von Rhythmbox importieren." #: ../quodlibet/ext/events/rbimport.py:132 msgid "Start Import" msgstr "Import starten" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "Bildschirmschoner-Pause" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "Pausiert die Wiedergabe während der GNOME-Bildschirmschoner aktiv ist." #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "Kein GNOME-Shell-Suchprovider für Quod Libet installiert." #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "GNOME-Suchprovider" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "Erlaubt es GNOME Shell, die Bibliothek zu durchsuchen." #: ../quodlibet/ext/events/seekbar.py:122 msgid "Alternative Seek Bar" msgstr "Alternative Titelpositionsleiste" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" "Alternative Titelpositionsleiste, die immer sichtbar ist und die ganze " "Fensterbreite nutzt." #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "Squeezebox-Synchronisierung" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" "Sorgt dafür, dass Logitech Squeezebox die Ausgabe von Quod Libet spiegelt. " "Dafür müssen beide von derselben Bibliothek lesen." #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "Fehler beim Finden des Squeezebox-Servers" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "Fehler beim Finden von %s. Bitte überprüfen Sie die Einstellungen" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 msgid "Synchronized Lyrics" msgstr "Synchronisierte Liedtexte" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" "Zeigt Liedtexte aus einer .lrc-Datei mit demselben Namen wie der abgespielte " "Titel synchron an." #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "Text:" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "Hintergrund:" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "Schrift" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "Größe (px):" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "Telepathy-Statusnachrichten" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" "Aktualisiert alle Telepathy-basierten Instant-Messenger-Konten (wie in " "Empathy u.ä. konfiguriert) mit einer Statusnachricht, die auf dem aktuell " "abgespielten Titel basiert." #: ../quodlibet/ext/events/telepathy_status.py:122 msgid "Playing:" msgstr "Wiedergabe:" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" "Statustext für den Fall, dass die Wiedergabe eines Titels gestartet wird. " "Akzeptiert QL-Muster wie z.B. %s." #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "Pausiert:" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" "Statustext für den Fall, dass die Wiedergabe pausiert ist. Akzeptiert QL-" "Muster wie z.B. %s." #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "Einfacher Text für den Fall, dass aktuell kein Titel abgespielt wird." #: ../quodlibet/ext/events/telepathy_status.py:157 msgid "No song:" msgstr "Keine Wiedergabe:" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 msgid "Status Patterns" msgstr "Statusmuster" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "Erscheinungsbild-Wechsler" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "Ändert das aktive GTK+-Thema." #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "_Thema:" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "Standardthema" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "Die dunkle Themenvariante bevorzugen" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "Menüleiste anzeigen/verbergen" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "Die Menüleiste durch Drücken der Alt-Taste anzeigen oder verbergen." #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Keine Wiedergabe" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "Taskleistensymbol" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "Steuert Quod Libet von der System-Taskleiste aus." #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "%(application-name)s anz_eigen" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 msgid "_Play" msgstr "Abs_pielen" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 msgid "P_ause" msgstr "P_ause" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 msgid "Pre_vious" msgstr "_Vorheriger" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 msgid "_Next" msgstr "_Nächster" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Zufall" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "En_dlosschleife" #: ../quodlibet/ext/events/trayicon/menu.py:86 msgid "Stop _After This Song" msgstr "N_ach diesem Titel stoppen" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 msgid "Open _Browser" msgstr "_Browser öffnen" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "_Tags bearbeiten" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 msgid "_Information" msgstr "_Informationen" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 msgid "Play_lists" msgstr "Wieder_gabelisten" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "_Beenden" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Verhalten" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "Mausrad passt die Lautstärke an" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "Mausrad wechselt den wiedergegebenen Titel" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "Maus_rad" #: ../quodlibet/ext/events/trayicon/prefs.py:84 msgid "Tooltip Display" msgstr "Tooltip-Anzeige" #: ../quodlibet/ext/events/viewlyrics.py:23 msgid "View Lyrics" msgstr "Liedtext anzeigen" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "Zeigt Liedtexte automatisch unter der Titelliste im Hauptfenster an." #: ../quodlibet/ext/events/viewlyrics.py:29 msgid "_Lyrics" msgstr "_Liedtext" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "Visualisierungen starten" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "Externe Visualisierungen starten." #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "Visualisierungen konnten nicht mit »%s« ausgeführt werden" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 msgid "Error" msgstr "Fehler" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "Visualisierungsanwendung:" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "Neu laden" #: ../quodlibet/ext/events/waveformseekbar.py:410 msgid "Waveform Seek Bar" msgstr "Wellenform-Titelpositionsleiste" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" "Eine Titelpositionsleiste in der Gestalt der Wellenform des aktuell " "abgespielten Titels." #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "Vordergrund-Farbe überschreiben:" # »Grafiksicherer« oder »Grafikspeicherer« ist in meinen Augen weniger klar #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "Grafik speichern" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "Speichert das Coverbild des aktuell abgespielten Titels in eine Datei." #: ../quodlibet/ext/events/write_cover.py:66 msgid "File:" msgstr "Datei:" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "_Schwellenwert:" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "Schwellenwert, ab dem der Filter aktiviert wird" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "R_ate:" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "Kompressionsrate" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "%d %%" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "Audiokompressor" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" "Ändert die Amplitude aller Samples, die über einem spezifischen " "Schwellenwert liegen, mit einer spezifischen Kompressionsrate." #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "_Preset:" msgstr "_Vorgabe:" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 msgid "Filter preset" msgstr "Filtervorgabe" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "Grenz_frequenz:" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "Tiefpassfilter-Grenzfrequenz" # Ich weiß nicht, ob das eine treffende Übersetzung ist. Wenn jemand mehr Ahnung von der Materie hat, bitte verbessern #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "Einspeis_pegel:" # Ich weiß nicht, ob das eine treffende Übersetzung ist. Wenn jemand # mehr Ahnung von der Materie hat, bitte verbessern #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "Einspeispegel" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 msgid "Default" msgstr "Standard" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "Einer virtuellen Lautsprecher-Aufstellung am nächsten (30°, 3 Meter)" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "Chu Moy" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "Ähnlich zu Chu Moys Crossfeeder (beliebt)" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "Jan Meier" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "Ähnlich zu Jan Meiers CORDA-Verstärkern (wenig Änderung)" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 msgid "Custom settings" msgstr "Benutzerdefinierte Einstellungen" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "Crossfeed" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" "Mischt den linken und den rechten Kanal derart, dass ein Lautsprechersetup " "bei der Benutzung von Kopfhörern simuliert wird, oder um die Ausgabe für " "frühe Stereoaufnahmen anzupassen." #: ../quodlibet/ext/gstreamer/karaoke.py:20 msgid "Filter _band:" msgstr "Filter_band:" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "Das Frequenzband des Filters" #: ../quodlibet/ext/gstreamer/karaoke.py:22 msgid "Filter _width:" msgstr "Filterb_reite:" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "Die Frequenzbreite des Filters" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "_Grad:" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "Grad des Effekts" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "Karaoke" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "Entfernt die Hauptgesangsstimme aus dem Audiosignal." #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "Mono-Downmix" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "Mischt die Audiokanäle zu einem Monosignal." #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "R_ate:" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "_Tempo:" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "Ton_höhe:" #: ../quodlibet/ext/gstreamer/pitch.py:89 msgid "Audio Pitch / Speed" msgstr "Audio-Tonhöhe/-Geschwindigkeit" #: ../quodlibet/ext/gstreamer/pitch.py:90 msgid "Controls the pitch of an audio stream." msgstr "Steuert die Tonhöhe eines Audiostroms." #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 msgid "Export Playlist to Folder" msgstr "Wiedergabeliste in Ordner exportieren" #: ../quodlibet/ext/playlist/export_to_folder.py:38 msgid "_Export" msgstr "_Exportieren" #: ../quodlibet/ext/playlist/export_to_folder.py:43 msgid "Destination folder:" msgstr "Zielordner:" #: ../quodlibet/ext/playlist/export_to_folder.py:58 msgid "Filename pattern:" msgstr "Muster für Dateinamen:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" "Eine Wiedergabeliste exportieren, indem die Dateien in einen Ordner kopiert " "werden." #: ../quodlibet/ext/playlist/export_to_folder.py:156 msgid "Default filename pattern:" msgstr "Standardmuster für Dateinamen:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "Squeezebox-Export" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" "Exportiert dynamisch die Wiedergabeliste zu einer Logitech-Squeezebox-" "Wiedergabeliste. Dafür müssen beide dieselbe Verzeichnisstruktur teilen. " "Teilt die Konfiguration mit dem <a href=\"quodlibet:///prefs/plugins/" "Squeezebox Output\">Squeezebox-Synchronisierungs-Plugin</a>." #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "Wiedergabeliste zu Squeezebox exportieren" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "Name der Wiedergabeliste (wird den existierenden überschreiben)" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "Zu Squeezebox-Wiedergabeliste exportieren" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 msgid "Remove Playlist Duplicates" msgstr "Duplikate in Wiedergabelisten entfernen" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "Entfernt doppelte Einträge in einer Wiedergabeliste." #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "Sind Sie sicher, dass Sie %d Duplikat entfernen möchten?" msgstr[1] "Sind Sie sicher, dass Sie %d Duplikate entfernen möchten?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "Duplikate werden aus der Wiedergabeliste »%s« entfernt." #: ../quodlibet/ext/playlist/shuffle.py:15 msgid "Shuffle Playlist" msgstr "Wiedergabeliste durcheinanderwürfeln" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "Ordnet die Einträge einer Wiedergabeliste auf zufällige Weise neu an." #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "Cursor folgen" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" "Die Wiedergabe folgt der Auswahl. Ist die Auswahl erschöpft, wird der " "nächste Titel in der Liste wiedergegeben." #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "Wiedergabeanzahl ausgleichen" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" "Zufallsmodus, bei dem Titel bevorzugt werden, die seltener wiedergegeben " "wurden." #: ../quodlibet/ext/playorder/playcounteq.py:25 msgid "Prefer less played" msgstr "Seltener wiedergegebene bevorzugen" #: ../quodlibet/ext/playorder/queue.py:19 msgid "Queue Only" msgstr "Nur Warteschlange" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" "Beschränkt die Wiedergabe von Titeln auf die Warteschlange. Wenn diese " "Wiedergabereihenfolge im Hauptfenster gewählt ist, fügt ein Doppelklick auf " "einen beliebigen Titel diesen der Warteschlange hinzu, anstatt ihn " "wiederzugeben." #: ../quodlibet/ext/playorder/reverse.py:14 msgid "Reverse" msgstr "Umkehren" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "Kehrt die Wiedergabereihenfolge von Titeln um." #: ../quodlibet/ext/playorder/skip_songs.py:25 msgid "Skip Songs" msgstr "Titel überspringen" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" "Bei der Wiedergabe werden Titel, deren Bewertung gleich oder niedriger als " "ein festgelegter Schwellenwert ist, übersprungen." #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "Jeden Titel wiederholen" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" "Titel in zufälliger Reihenfolge wiedergeben, wobei jeder Titel eine feste " "Anzahl von Malen wiederholt wird." #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "Anzahl der Wiedergaben pro Titel:" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "Bedingte Abfrage" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" "Erlaubt es der Abfrage, Ergebnisse basierend auf einer Bedingungsabfrage zu " "finden. Die Syntax ist »@(if: Bedingung, dann, sonst)«." #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "Python-Abfrage" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" "Erlaubt es, Python-Ausdrücke in Abfragen zu benutzen. Die Syntax ist " "»@(python: Ausdruck)«. Die Variable »s« ist der Titel, auf dem die Abfrage " "aktuell arbeitet." #: ../quodlibet/ext/query/savedsearch.py:19 msgid "Include Saved Search" msgstr "Gespeicherten Suchlauf einschließen" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" "Die Ergebnisse eines gespeicherten Suchlaufs als Teil einer anderen Abfrage " "einschließen. Die Syntax ist »@(saved: Name des Suchlaufs)«." #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "Squeezebox okay. Nutze den einzigen Player (%s)." #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, python-format msgid "Couldn't connect to %s" msgstr "Konnte nicht mit %s verbinden" #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "Hostname:" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "Port:" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 msgid "Username:" msgstr "Benutzername:" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "Passwort:" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "Bibliotheksverzeichnis, mit dem sich der Server verbindet." #: ../quodlibet/ext/_shared/squeezebox/base.py:132 msgid "Library path:" msgstr "Bibliothekspfad:" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "Einstellungen _verifizieren" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "Squeezebox-Server" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "Squeezebox-Server unter {hostname}:{port}" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "Unidentifizierter Squeezebox-Server" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "Unidentifizierter Squeezebox-Player: %r" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "Squeezebox-Player auswählen" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "_OK" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" "Squeezebox-Server gefunden.\n" "Bitte wählen Sie den Player" #: ../quodlibet/ext/songsmenu/albumart.py:329 msgid "Fit image to _window" msgstr "Grafik an _Fenster anpassen" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "_Programm:" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "Bild nach Speichern b_earbeiten" #: ../quodlibet/ext/songsmenu/albumart.py:345 msgid "File_name:" msgstr "Datei_name:" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "Speichern fehlgeschlagen" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, python-format msgid "Unable to save \"%s\"." msgstr "»%s« konnte nicht gespeichert werden." #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "[albumart] HTTP-Fehler: %s" #: ../quodlibet/ext/songsmenu/albumart.py:613 msgid "Album Art Downloader" msgstr "Album-Cover-Downloader" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "von %(source)s" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "Auflösung: %s" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, python-format msgid "Size: %s" msgstr "Größe: %s" #: ../quodlibet/ext/songsmenu/albumart.py:690 msgid "_Search" msgstr "_Suche" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 msgid "Searching…" msgstr "Suche läuft …" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "Fertig" #: ../quodlibet/ext/songsmenu/albumart.py:922 msgid "Download Album Art" msgstr "Alben-Cover herunterladen" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "Alben-Cover von verschiedenen Websites herunterladen." #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "Quellen" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "APEv2 zu ID3v2" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" "Wandelt APEv2-Tags in ID3v2-Tags um. Löscht die APEv2-Tags nach der " "Umwandlung." #: ../quodlibet/ext/songsmenu/bookmarks.py:23 msgid "Go to Bookmark" msgstr "Zu Lesezeichen gehen" #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "Lesezeichen in den ausgewählten Dateien verwalten." #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 msgid "_Edit Bookmarks…" msgstr "_Lesezeichen bearbeiten …" #: ../quodlibet/ext/songsmenu/bookmarks.py:73 msgid "No Bookmarks" msgstr "Keine Lesezeichen" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 msgid "MusicBrainz Lookup" msgstr "MusicBrainz-Lookup" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "Taggt ein Album basierend auf einer MusicBrainz-Suche neu." #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "Nur das Jahr für den »date«-Tag benutzen" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "»_albumartist« schreiben, wenn nötig" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "Sortierungs-Tags für Künstlernamen schreiben" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "_Standard-MusicBrainz-Tags schreiben" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "»labelid«-Tag schreiben" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Dateiname" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 msgid "Disc" msgstr "CD" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Titel-Nr." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 msgid "Title" msgstr "Titel" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Künstler" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 msgid "MusicBrainz lookup" msgstr "MusicBrainz-Lookup" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 msgid "_Query:" msgstr "Ab_frage:" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 msgid "S_earch" msgstr "Such_en" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "Ergebnisse <i>(zum Ändern der Reihenfolge ziehen)</i>" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "Bitte geben Sie eine Abfrage ein." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut." #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "Lade Ergebnis …" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 msgid "No results found." msgstr "Keine Ergebnisse gefunden." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 msgid "Browse Folders" msgstr "Ordner durchsuchen" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "Die Ordner der ausgewählten Titel in einem Dateimanager öffnen." #: ../quodlibet/ext/songsmenu/browsefolders.py:172 msgid "Unable to open folders" msgstr "Konnte die Ordner nicht öffnen" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "Kein Programm zum Öffnen von Ordnern verfügbar." #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "Python-Konsole" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "Interaktive Python-Konsole." #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "Sie können standardmäßig auf die folgenden Objekte zugreifen:" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "Ihr aktuelles Arbeitsverzeichnis ist:" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 msgid "Command" msgstr "Befehl" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "name" msgstr "Name" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "Der Name dieses Befehls" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "command" msgstr "Befehl" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "Der Shellbefehl, der ausgeführt werden soll" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "Parameter" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" "Ein Parameter, dessen Vorkommen im Befehl mit einem benutzerspezifizierten " "Wert ersetzt werden. Beispiel: Ist der Feldwert »PARAM«, werden alle " "Vorkommen von »{PARAM}« im Befehl mit dem Wert ersetzt, den der Benutzer in " "einer Eingabeaufforderung eingibt." #: ../quodlibet/ext/songsmenu/custom_commands.py:55 msgid "pattern" msgstr "Muster" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" "Das QL-Muster, z.B. <~filename>, das benutzt werden soll, um einen Wert für " "den Befehl zu berechnen. Für Wiedergabelisten werden auch die virtuellen " "Tags <~playlistname> und <~#playlistindex> unterstützt." #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "Einzigartig" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" "Wenn gesetzt, werden Duplikate aus der Ergebnisliste des Musters entfernt" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "Maximale Argumente" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" "Die maximale Anzahl an Argumenten, die dem Befehl zur selben Zeit übergeben " "werden sollen (wie xargs)" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 msgid "Input value" msgstr "Eingabewert" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "Wert für %s?" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 msgid "Custom Commands" msgstr "Benutzerdefinierte Befehle" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" "Benutzerdefinierte Befehle auf Titel anwenden, wobei beliebige ihrer Tags " "benutzt werden können. Stapelverarbeitung ist bei Bedarf möglich." #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "Benutzerdefinierte Befehle bearbeiten" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" "Unterstützt QL-Muster\n" "z.B. <tt><~artist~title></tt>" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, python-format msgid "Unable to run custom command %s" msgstr "Der benutzerdefinierte Befehl %s konnte nicht ausgeführt werden" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "%d Duplikatgruppe" msgstr[1] "%d Duplikatgruppen" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "Alle einklappen/ausklappen" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "Schlüsselausdruck für Duplikate ist »%s«" #: ../quodlibet/ext/songsmenu/duplicates.py:372 msgid "Duplicates Browser" msgstr "Duplikatbrowser" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "Findet ähnlich getaggte Versionen von Titeln und zeigt diese an." #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" "Akzeptiert QL-Tagausdrücke wie <tt>~artist~title</tt> oder " "<tt>musicbrainz_track_id</tt>" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "Duplikate _gruppieren nach:" #: ../quodlibet/ext/songsmenu/duplicates.py:418 msgid "Duplicate Key" msgstr "Duplikatschlüssel" #: ../quodlibet/ext/songsmenu/duplicates.py:423 msgid "Remove _Whitespace" msgstr "_Leerräume entfernen" #: ../quodlibet/ext/songsmenu/duplicates.py:424 msgid "Remove _Diacritics" msgstr "_Diakritische Zeichen entfernen" #: ../quodlibet/ext/songsmenu/duplicates.py:425 msgid "Remove _Punctuation" msgstr "_Interpunktion entfernen" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "Groß-/Kleinschreibung _nicht beachten" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "Optionen für die Übereinstimmung" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 msgid "Edit Playcount" msgstr "Wiedergabeanzahl bearbeiten" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" "Bearbeitet die Anzahl der Wiedergaben und des Überspringens für einen Titel " "(~#playcount bzw. ~#skipcount).\n" "\n" "Sind mehrere Titel ausgewählt, werden die Anzahlen inkrementiert statt " "gesetzt.\n" "\n" "Wird ~#playcount für einen Titel auf 0 gesetzt, werden die Einträge " "~#lastplayed und ~#laststarted geleert. Wenn allerdings ein Titel mit 0 " "Wiedergaben auf eine positive Anzahl gesetzt wird, werden keine " "Wiedergabezeiten erzeugt." #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "Anzahl der Wiedergaben" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "Anzahl übersprungen" #: ../quodlibet/ext/songsmenu/embedded.py:24 msgid "Edit Embedded Images" msgstr "Eingebettete Bilder bearbeiten" #: ../quodlibet/ext/songsmenu/embedded.py:25 msgid "Removes or replaces embedded images." msgstr "Entfernt oder ersetzt eingebettete Bilder." #: ../quodlibet/ext/songsmenu/embedded.py:78 msgid "_Remove all Images" msgstr "Alle Bilder entfe_rnen" #: ../quodlibet/ext/songsmenu/embedded.py:82 msgid "_Embed Current Image" msgstr "Aktuelles Bild _einbetten" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "Exakte Bewertung setzen" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "Erlaubt es, die Bewertung eines Titels mit einer Zahl zu setzen." #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" "Bitte geben Sie die gewünschte Bewertung auf einer Skala von 0.0 bis 1.0 an" #: ../quodlibet/ext/songsmenu/filterall.py:80 msgid "Filter on Any Tag" msgstr "Nach beliebigem Tag filtern" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "Erzeugt eine Abfrage, die auf Tags des ausgewählten Titels basiert." #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 msgid "Filter on Directory" msgstr "Nach Verzeichnis filtern" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "Nach Verzeichnis in einem neuen Browser-Fenster filtern." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "Akustischer-Fingerabdruck-Lookup" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "Schlägt Titelmetadaten über den akustischen Fingerabdruck nach." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "Akustische Fingerabdrücke einsenden" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" "Generiert akustische Fingerabdrücke mit chromaprint und sendet diese an " "acoustid.org." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "API-Schlüssel fehlt" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" "Sie müssen einen acoustid.org-API-Schlüssel in den Plugin-Einstellungen " "angeben, bevor Sie Fingerabdrücke einsenden können." #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "API-Schlüssel anfordern" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "API-_Schlüssel:" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "AcoustID-Webservice" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Warteschlange" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "Analysiere" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "Nachschlagen" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Schreiben" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "Status" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "Veröffentlichung" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 msgid "Write MusicBrainz tags" msgstr "MusicBrainz-Tags schreiben" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 msgid "Group by directory" msgstr "Nach Verzeichnis gruppieren" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 msgid "Album Mode" msgstr "Album-Modus" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" "Albumbezogene Tags schreiben und versuchen, die Anzahl verschiedener " "Albumveröffentlichungen zu reduzieren" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "Generiere Fingerabdrücke:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "_Details" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "Ein_senden" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" "Titel brauchen entweder eine <i><b>musicbrainz_trackid</b></i>, oder " "<i><b>artist</b></i>-/<i><b>title</b></i>-/<i><b>album</b></i>-Tags, um " "eingesendet werden zu können." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "Fingerabdrücke:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "Titel mit MBIDs:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "Titel mit ausreichenden Tags:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "Einzusendende Titel:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "Fertig. %(to-send)d/%(all)d Titel einzusenden." #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "Sende Fingerabdrücke:" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "Sende ein …" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 msgid "Update Tags in Files" msgstr "Tags in Dateien aktualisieren" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" "Geänderte Tags in Dateien aktualisieren. Sorgt dafür, dass Wiedergabeanzahl " "und Bewertungen aktuell sind." #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "Nach HTML exportieren" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "Exportiert die ausgewählte Titelliste nach HTML." #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "MP3-Dauer reparieren" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" "Entfernt TLEN-Rahmen aus ID3-Tags. Diese können für ungültige Titellängen " "sorgen." #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "An iFP senden" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "Titel zu einem iRiver-iFP-Gerät hochladen." #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "Metadaten exportieren" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "Exportiert die Metadaten der ausgewählten Titel in eine .tags-Datei." #: ../quodlibet/ext/songsmenu/importexport.py:92 msgid "Import Metadata" msgstr "Metadaten importieren" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "Importiert Metadaten für die ausgewählten Titel von einer .tags-Datei." #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "CD brennen" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "Brennt CDs mit K3b, Brasero oder xfburn." #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "Aktualisiere die Aufstellungsliste." #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "Schon auf dem neusten Stand." #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "Rufe Aufstellung für die Woche vom %s ab." #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "Synchronisierung abgeschlossen." #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 msgid "Error during sync" msgstr "Fehler während der Synchronisierung" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "Last.fm-Synchronisierung" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "Aktualisiert die Statistiken der Bibliothek über Ihr Last.fm-Profil." #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 msgid "_Username:" msgstr "_Benutzername:" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "Sortierungstags erstellen" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" "Wandelt Album- und Künstlernamen auf dürftige Weise in Sortierungsnamen um." #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 msgid "Migrate Metadata" msgstr "Metadaten übertragen" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "Überträgt die Quod-Libet-spezifischen Metadaten zwischen Titeln." #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "_Kopieren" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "_Einfügen" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 msgid "Information to copy/paste" msgstr "Informationen, die kopiert/eingefügt werden sollen" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "Titel über CD- und Titelnummer zuordnen" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" "Wählen Sie diese Option aus, um die Metadaten von einem Album auf ein " "anderes zu übertragen, wobei die Titel über CD- und Titelnummer zugeordnet " "werden.\n" "\n" "<b>Hinweis:</b> Muss beim Kopieren von Metadaten ausgewählt sein, damit " "Titelinformationen gespeichert werden." #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "%d Titel ist gespeichert." msgstr[1] "%d Titel sind gespeichert." #: ../quodlibet/ext/songsmenu/playlist.py:31 msgid "Export as Playlist" msgstr "Als Wiedergabeliste exportieren" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "Exportiert Titel in eine M3U- oder PLS-Wiedergabeliste." #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "Relative Pfade benutzen" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "Absolute Pfade benutzen" #: ../quodlibet/ext/songsmenu/playlist.py:132 msgid "Unable to export playlist" msgstr "Die Wiedergabeliste konnte nicht exportiert werden" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, python-format msgid "Writing to <b>%s</b> failed." msgstr "Schreiben nach <b>%s</b> fehlgeschlagen." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 msgid "Rescan Songs" msgstr "Titel neu einlesen" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" "Prüft auf Dateiänderungen und lädt die Titel neu oder entfernt sie, wenn " "nötig." #: ../quodlibet/ext/songsmenu/refresh.py:31 msgid "Rescan songs" msgstr "Titel neu einlesen" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "ReplayGain-Analysator" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "Fortschritt" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "Verstärkung" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "Spitzenpegel" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "<b>%(to-process)s</b> Album zu aktualisieren (von %(all)s)" msgstr[1] "<b>%(to-process)s</b> Alben zu aktualisieren (von %(all)s)" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "ReplayGain-Lautstärkeanpassung" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" "Analysiert und aktualisiert ReplayGain-Informationen unter der Verwendung " "von GStreamer. Die Ergebnisse werden nach Album gruppiert." #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "immer" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "wenn <b>irgendwelche</b> RG-Tags fehlen" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "wenn <b>Album</b>-RG-Tags fehlen" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "Alben _verarbeiten:" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 msgid "Existing Tags" msgstr "Existierende Tags" #: ../quodlibet/ext/songsmenu/splitting.py:31 msgid "Split Tags" msgstr "Tags aufteilen" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" "Gleichzeitig die CD-Nummer vom Album und die Version vom Titel trennen." #: ../quodlibet/ext/songsmenu/splitting.py:56 msgid "Split Album" msgstr "Album aufteilen" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "CD-Nummer abtrennen." #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "BPM:" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "k.A." #: ../quodlibet/ext/songsmenu/tapbpm.py:36 msgid "Reset" msgstr "Zurücksetzen" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 msgid "Tap" msgstr "Klopfen" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "BPM klopfen" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 msgid "Tap BPM for the selected song." msgstr "Die Schläge pro Minute (BPM) für den ausgewählten Titel klopfen." #: ../quodlibet/ext/songsmenu/website_search.py:35 msgid "Website Search" msgstr "Websitesuche" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" "Durchsucht die ausgewählte Website mithilfe beliebiger Tags.\n" "Unterstützt Muster, z.B. %(pattern-example)s." #: ../quodlibet/ext/songsmenu/website_search.py:78 msgid "Search URL patterns" msgstr "Such-URL-Muster" #: ../quodlibet/ext/songsmenu/website_search.py:88 msgid "Edit search URLs" msgstr "Such-URLs bearbeiten" #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 msgid "Configure Searches…" msgstr "Suchen bearbeiten …" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "Suche auf %(website)s" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "Künstler auf Wikipedia suchen" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" "Öffnet ein Browserfenster mit dem Wikipedia-Artikel über den Künstler des " "aktuell abgespielten Titels." #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "Album auf Wikipedia suchen" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" "Öffnet ein Browserfenster mit dem Wikipedia-Artikel über das aktuell " "abgespielte Album." #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Bibliothek" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Prüfe Einhängepunkte" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Audio-Bibliothek wird eingelesen" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "%s wird eingelesen" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "Lade Dateien" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "Datei konnte nicht geladen werden: %r" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Tags auflisten" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Knappe Ausgabe anzeigen" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "" "Listenspalten, die im knappen Modus ausgegeben werden sollen, und deren " "Reihenfolge (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 msgid "Also list programmatic tags" msgstr "Auch programmatische Tags anzeigen" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Nicht genügend Argumente" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 msgid "Too many arguments" msgstr "Zu viele Argumente" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 msgid "Description" msgstr "Beschreibung" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Wert" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Alle allgemeinen Tags auflisten" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Tags von einer Datei in eine andere Datei kopieren" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Änderungen anzeigen, aber nicht anwenden" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Nicht schreibbare Tags überspringen" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Der Tag %r kann nicht in die Datei kopiert werden: %r" #: ../quodlibet/operon/commands.py:157 msgid "Edit tags in a text editor" msgstr "Audio-Tags in einem Texteditor bearbeiten" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "Bearbeitung abgebrochen" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "Starten des Texteditors »%(editor-name)s« fehlgeschlagen." #: ../quodlibet/operon/commands.py:260 msgid "No changes detected" msgstr "Keine Änderungen erkannt" #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Einen Tag setzen und existierende Werte entfernen" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "%r kann nicht gesetzt werden" #: ../quodlibet/operon/commands.py:319 msgid "Remove tags" msgstr "Tags entfernen" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "Wert ist ein regulärer Ausdruck" #: ../quodlibet/operon/commands.py:328 msgid "Remove all tags" msgstr "Alle Tags entfernen" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "»--all« kann nicht mit »--regexp« kombiniert werden" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "»%r« kann nicht aus »%r« entfernt werden" #: ../quodlibet/operon/commands.py:379 msgid "Remove a tag value" msgstr "Einen Tag-Wert entfernen" #: ../quodlibet/operon/commands.py:428 msgid "Add a tag value" msgstr "Einen Tag-Wert hinzufügen" #: ../quodlibet/operon/commands.py:456 msgid "List file information" msgstr "Dateiinformationen anzeigen" # Was genau bedeutet hier 'provided'? #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" "Bereitgestelltes Bild als Hauptbild einbetten und alle anderen eingebetteten " "Bilder entfernen " #: ../quodlibet/operon/commands.py:515 #, python-format msgid "Failed to load image file: %r" msgstr "Die Bilddatei konnte nicht geladen werden: %r" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" "Das Editieren von Bildern wird nicht unterstützt in %(file_name)s " "(%(file_format)s)" #: ../quodlibet/operon/commands.py:538 msgid "Remove all embedded images" msgstr "Alle eingebetteten Bilder entfernen" #: ../quodlibet/operon/commands.py:568 #, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Eingebettete Bilder nach %(filepath)s extrahieren" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" "Pfad, in den die Bilder gespeichert werden (Vorgabe ist das " "Arbeitsverzeichnis)" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Dateien anhand von Tags umbenennen" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Tags anhand des Dateipfads ausfüllen" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Datei" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Titelnummern in allen Dateien einfügen" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Tags basierend auf dem angegebenen Muster ausgeben" #: ../quodlibet/operon/commands.py:768 msgid "Display help information" msgstr "Hilfeinformationen anzeigen" #: ../quodlibet/operon/util.py:40 #, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "" "»%(column-id)s« ist kein gültiger Name für eine Spalte (%(all-column-ids)s)." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Unbekannt" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Normal" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_Normal" #: ../quodlibet/order/reorder.py:23 msgid "Random" msgstr "Zufall" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Zufall" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "Höher bewertete bevorzugen" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "Diesen Titel wiederholen" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 msgid "Repeat all" msgstr "Alle Titel wiederholen" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Einzelner Titel" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Puffer wird gefüllt" #: ../quodlibet/player/gstbe/player.py:319 msgid "Could not create GStreamer pipeline" msgstr "GStreamer-Pipeline konnte nicht angelegt werden" #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "Kein GStreamer-Element für das Medienformat gefunden" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "Medienformat: %(format-description)s" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "GStreamer-Plugin »%(name)s« konnte nicht initialisiert werden" #: ../quodlibet/player/gstbe/prefs.py:25 msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "Die Pipeline für die GStreamer-Audioausgabe. Leer lassen, um die " "Standardpipeline zu verwenden. Enthält die Pipeline eine Senke, wird diese " "anstelle der Standardsenke verwendet." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Audio-Pipeline:" #: ../quodlibet/player/gstbe/prefs.py:43 #, python-format msgid "%.1f seconds" msgstr "%.1f Sekunden" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "_Pufferdauer:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "Über_gangslose Wiedergabe deaktivieren" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" "Durch Deaktivieren der übergangslosen Wiedergabe können Probleme beim " "Titelwechsel, die in einigen GStreamer-Versionen auftreten, vermieden werden." #: ../quodlibet/player/gstbe/util.py:93 msgid "No GStreamer audio sink found" msgstr "Keine GStreamer-Audiosenke gefunden" #: ../quodlibet/player/gstbe/util.py:112 msgid "Invalid GStreamer output pipeline" msgstr "Ungültige GStreamer-Ausgabe-Pipeline" #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Der Audioausgang konnte nicht angelegt werden" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Das Audiogerät %r wurde nicht gefunden. Überprüfen Sie die Xine-" "Einstellungen in ~/.quodlibet/config." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "Das Modul »{module}« wurde nicht gefunden. Ist das Paket installiert?" # verknüpft? #: ../quodlibet/plugins/__init__.py:71 #, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Das GStreamer-Element »{element}« wurde nicht gefunden." #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "Das Plugin »%(name)s« auf %(count)s Wiedergabeliste anwenden?" msgstr[1] "Das Plugin »%(name)s« auf %(count)s Wiedergabelisten anwenden?" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 msgid "_Run Plugin" msgstr "Plugin ausfüh_ren" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Unterstützte Formate: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Audiogerät: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Titelanfang" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "k. A." #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Zeit" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Lesezeichenname" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Lesezeichen" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Filter" #: ../quodlibet/qltk/browser.py:57 msgid "Recently _Played" msgstr "Zuletzt _abgespielt" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Zuletzt _hinzugefügt" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "_Top 40" #: ../quodlibet/qltk/browser.py:63 msgid "All _Songs" msgstr "Alle _Titel" # Mit Plural wird der Menüeintrag sehr lang (etwa: Nach aktuellem Genre/aktuellen Genres). Ich denke, dass er auch ohne den Plural verständlich ist und außerdem schneller zu erkennen. #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "Nach aktuellem _Genre" # Siehe Kommentar für »On Current _Genre(s)« #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "Nach aktuellem _Künstler" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "Nach aktuellem Al_bum" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "G_enre zufällig auswählen" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Kü_nstler zufällig auswählen" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Alb_um zufällig auswählen" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "Die 40 meist gespielten Titel (bei Gleichstand werden mehr als 40 ausgewählt)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Wert:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Gespeicherte Werte" #: ../quodlibet/qltk/cbes.py:263 msgid "Edit saved values…" msgstr "Gespeicherte Werte bearbeiten …" #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Auto_matisch" #: ../quodlibet/qltk/controls.py:112 msgid "_Track Mode" msgstr "_Titel-Modus" #: ../quodlibet/qltk/controls.py:113 msgid "_Album Mode" msgstr "_Album-Modus" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "_Stumm" #: ../quodlibet/qltk/controls.py:128 msgid "_Replay Gain Mode" msgstr "_ReplayGain-Modus" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "Neuer %s" #: ../quodlibet/qltk/data_editors.py:218 msgid "(unknown)" msgstr "(unbekannt)" #: ../quodlibet/qltk/data_editors.py:355 msgid "Tag expression" msgstr "Tagausdruck" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "Tagausdruck, z.B. people:real oder ~album~year." #: ../quodlibet/qltk/data_editors.py:383 msgid "Enter new tag" msgstr "Neuen Tag eingeben" #: ../quodlibet/qltk/delete.py:37 msgid "Files:" msgstr "Dateien:" #: ../quodlibet/qltk/delete.py:63 msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "" "Die ausgewählten Titel werden aus der Bibliothek entfernt und die " "entsprechenden Dateien vom Datenträger gelöscht." #: ../quodlibet/qltk/delete.py:72 msgid "The selected files will be deleted from disk." msgstr "Die ausgewählten Dateien werden vom Datenträger gelöscht." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "%(file_count)d Datei unwiderruflich löschen?" msgstr[1] "%(file_count)d Dateien unwiderruflich löschen?" #: ../quodlibet/qltk/delete.py:91 msgid "_Delete Files" msgstr "_Dateien löschen" #: ../quodlibet/qltk/delete.py:106 msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "" "Die ausgewählten Titel werden aus der Bibliothek entfernt und die " "entsprechenden Dateien in den Papierkorb verschoben." #: ../quodlibet/qltk/delete.py:115 msgid "The selected files will be moved to the trash." msgstr "Die ausgewählten Dateien werden in den Papierkorb verschoben." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "%(file_count)d Datei in den Papierkorb verschieben?" msgstr[1] "%(file_count)d Dateien in den Papierkorb verschieben?" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_In den Papierkorb verschieben" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Verschiebe %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 msgid "Unable to move to trash" msgstr "Konnte nicht in den Müll verschieben" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 msgid "Moving one or more files to the trash failed." msgstr "" "Das Verschieben einer oder mehrerer Dateien in den Papierkorb ist " "fehlgeschlagen." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Lösche %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 msgid "Unable to delete files" msgstr "Dateien konnten nicht gelöscht werden" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 msgid "Deleting one or more files failed." msgstr "Löschen einer oder mehrerer Dateien fehlgeschlagen." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Downloads" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Größe" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "_Stop" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "fehlt in %d Titel" msgstr[1] "fehlt in %d Titeln" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "unterschiedlich in %d Titel" msgstr[1] "unterschiedlich in %d Titeln" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "In _mehrere Werte aufteilen" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "CD von _Album trennen" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "_Version von Titel trennen" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Arrangeur von Küns_tler trennen" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "_Interpret von Künstler trennen" #: ../quodlibet/qltk/edittags.py:270 msgid "Split _Performer out of Title" msgstr "_Interpret von Titel trennen" #: ../quodlibet/qltk/edittags.py:276 msgid "Split _Originalartist out of Title" msgstr "_Originalkünstler von Titel trennen" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Tag hinzufügen" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "_Tag:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Tags bearbeiten" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "_Programmatische Tags anzeigen" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Auf alle Tags zugreifen, auch auf solche, die z.B. durch MusicBrainz oder " "Replay Gain automatisch erstellt wurden" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 msgctxt "edittags" msgid "_Revert" msgstr "Zu_rücksetzen" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "_Speichern" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Tag konnte nicht hinzugefügt werden" #: ../quodlibet/qltk/edittags.py:660 #, python-format msgid "Unable to add <b>%s</b>" msgstr "<b>%s</b> konnte nicht hinzugefügt werden" #: ../quodlibet/qltk/edittags.py:662 #, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Die momentan ausgewählten Dateien unterstützen keine mehrfachen Werte für <b>" "%s</b>." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Ungültiger Tag" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "Ungültiger Tag <b>%s</b>\n" "\n" "Die ausgewählten Dateien unterstützen das Bearbeiten dieses Tags nicht." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Ungültiger Wert" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Ungültiger Wert: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Tag ist möglicherweise ungenau" #: ../quodlibet/qltk/_editutils.py:31 #, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "%(file-name)s wurde verändert, während das Programm lief. Wenn Sie " "speichern, ohne die Bibliothek zu aktualisieren, werden möglicherweise " "andere Änderungen an dem Titel überschrieben." #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Der Titel konnte nicht gespeichert werden" #: ../quodlibet/qltk/_editutils.py:50 #, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Speichern von %(file-name)s fehlgeschlagen. Die Datei ist möglicherweise nur " "lesbar, beschädigt, oder Sie haben keine ausreichenden Benutzerrechte zum " "Bearbeiten der Datei." #: ../quodlibet/qltk/_editutils.py:142 msgid "_More options…" msgstr "_Weitere Optionen …" #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "_Rückgängig" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "_Wiederholen" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "_Info" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "Nach Aktualisierungen _suchen …" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Plugins" #: ../quodlibet/qltk/exfalsowindow.py:267 #, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s und %(count)s weiterer" msgstr[1] "%(title)s und %(count)s weitere" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex-Falso-Einstellungen" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Trenne _nach:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Tags bearbeiten" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Ordner" #: ../quodlibet/qltk/filesel.py:253 msgid "_New Folder…" msgstr "_Neuer Ordner …" #: ../quodlibet/qltk/filesel.py:262 msgid "_Select all Sub-Folders" msgstr "Alle Unterordner au_swählen" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Neuer Ordner" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Geben Sie einen Namen für den neuen Ordner ein:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Ordner konnte nicht angelegt werden" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Ordner konnte nicht gelöscht werden" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Titel" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "von %s" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "CD %s" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "Titel %s" #: ../quodlibet/qltk/info.py:108 msgid "_Edit Display…" msgstr "Anzeige b_earbeiten …" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Keine Titel ausgewählt." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Keine Titel" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informationen" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Texte" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "Produziert von %s" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "Künstler" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "Künstler" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "Interpreten" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Nie" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d-mal" msgstr[1] "%(n)d-mal" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "Hinzugefügt" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "Letzte Wiedergabe" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "Wiedergegeben" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "Übersprungen" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "Bewertung" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "Pfad" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "Dauer" #: ../quodlibet/qltk/information.py:289 msgid "format" msgstr "Format" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "Codec" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 msgid "encoding" msgstr "Kodierung" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "Bitrate" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "Dateigröße" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "Geändert" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "Weiteres" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d ausgewählt" msgstr[1] "%d ausgewählt" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Titel nicht verfügbar" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Titel-Liste" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "%d Titel ohne Album" msgstr[1] "%d Titel ohne Album" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Ausgewählte Diskographie" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "%d Titel ohne Künstler" msgstr[1] "%d Titel ohne Künstler" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "Alben" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Gesamtdauer:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Gesamtgröße:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Dateien" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Download" #: ../quodlibet/qltk/lyrics.py:40 msgid "_Edit" msgstr "B_earbeiten" #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Für diesen Titel wurde kein Liedtext gefunden." #: ../quodlibet/qltk/lyrics.py:82 msgid "Searching for lyrics…" msgstr "Liedtext wird gesucht …" #: ../quodlibet/qltk/maskedbox.py:20 msgid "Are you sure you want to remove all songs?" msgstr "Sind Sie sicher, dass Sie alle Titel entfernen möchten?" #: ../quodlibet/qltk/maskedbox.py:21 msgid "The selected songs will be removed from the library." msgstr "Die ausgewählten Titel werden aus der Bibliothek entfernt." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "Einblenden" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "_Einblenden" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Änderungen an den Tags verwerfen?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Tags wurden verändert, aber noch nicht gespeichert. Sollen die Änderungen " "gespeichert oder verworfen werden?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 msgid "_Revert" msgstr "Zu_rücksetzen" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Datei existiert" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "»%(file-name)s« ersetzen?" #: ../quodlibet/qltk/msg.py:94 msgid "_Replace File" msgstr "Datei e_rsetzen" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Aktive Prozesse" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "%d aktive Prozesse" #: ../quodlibet/qltk/playorder.py:254 msgid "Toggle shuffle mode" msgstr "Zufallsmodus ein-/ausschalten" #: ../quodlibet/qltk/playorder.py:270 msgid "Toggle repeat mode" msgstr "Endlosschleife ein-/ausschalten" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Plugin-Fehler" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Aktiviert" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Deaktiviert" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Keine Kategorie" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "Ereignisse" #: ../quodlibet/qltk/pluginwin.py:170 msgid "Play Order" msgstr "Wiedergabereihenfolge" #: ../quodlibet/qltk/pluginwin.py:171 msgid "Editing" msgstr "Bearbeitung" #: ../quodlibet/qltk/pluginwin.py:173 msgid "Covers" msgstr "Cover" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Keine Plugins gefunden." #: ../quodlibet/qltk/pluginwin.py:358 msgid "Plugins" msgstr "Plugins" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "_Fehler anzeigen" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_CD" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Titel-Nr." #: ../quodlibet/qltk/prefs.py:47 msgid "Grou_ping" msgstr "Gru_ppieren" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "_Album" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "Datei_name" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "Dau_er" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "Automatisch zu aktuellem Titel _springen" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "Zu Titel in der Titelliste gehen, sobald dessen Wiedergabe beginnt" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Weitere:" #: ../quodlibet/qltk/prefs.py:88 msgid "_Edit…" msgstr "B_earbeiten …" #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Weitere Listenspalten hinzufügen oder entfernen" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Anzuzeigende Listenspalten" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Titel mit _Version" #: ../quodlibet/qltk/prefs.py:106 msgid "Artist includes all _people" msgstr "Künstler mit allen _Mitwirkenden" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Albu_m mit CD-Untertitel" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Dateiname mit _Pfad" #: ../quodlibet/qltk/prefs.py:123 msgid "Column Preferences" msgstr "Einstellungen für Listenspalten" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Aktuelle Konfiguration auf Titelliste anwenden. Neue Listenspalten werden am " "Ende hinzugefügt." #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Titelliste" #: ../quodlibet/qltk/prefs.py:222 msgid "Edit Columns" msgstr "Listenspalten bearbeiten" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "Gesamtdauer" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "_Globaler Filter:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Diese Abfrage zusätzlich zu allen anderen anwenden" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 msgctxt "heading" msgid "Search" msgstr "Suche" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Browser" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Gleichzeitiges Bewerten _mehrerer Titel bestätigen" #: ../quodlibet/qltk/prefs.py:295 msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "" "Um die Bewertungen mehrerer Titel gleichzeitig zu ändern, wird eine " "Bestätigung angefordert" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Bewertungen mit _einfachem Klick zulassen" #: ../quodlibet/qltk/prefs.py:300 msgid "Enable rating by clicking on the rating column in the song list" msgstr "" "Das Ändern von Bewertungen durch Klicken in der Spalte \"Bewertung\" zulassen" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Bewertungen" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "_Eingebettete Coverbilder bevorzugen" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "" "Falls verfügbar, immer die in Audiodateien eingebetteten Coverbilder " "verwenden" #: ../quodlibet/qltk/prefs.py:319 msgid "_Fixed image filename:" msgstr "_Festgelegter Dateiname für Bilddatei:" #: ../quodlibet/qltk/prefs.py:321 msgid "The single image filename to use if selected" msgstr "Der für die Bilddatei zu verwendende Dateiname" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "Die zwingend zu verwendende Bilddatei" #: ../quodlibet/qltk/prefs.py:336 msgid "Album Art" msgstr "Alben-Cover" #: ../quodlibet/qltk/prefs.py:357 msgid "Playback" msgstr "Wiedergabe" #: ../quodlibet/qltk/prefs.py:362 msgid "Output Configuration" msgstr "Konfiguration der Tonausgabe" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Lautstärke um diesen Wert skalieren, falls ein Titel keine ReplayGain-" "Informationen bietet" #: ../quodlibet/qltk/prefs.py:376 msgid "_Fall-back gain (dB):" msgstr "_Standardverstärkung (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Lautstärke aller Titel um diesen Wert skalieren, solange dadurch keine " "Übersteuerung auftritt" #: ../quodlibet/qltk/prefs.py:390 msgid "_Pre-amp gain (dB):" msgstr "_Vorverstärkung (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "ReplayGain-Lautstärkeanpassung _aktivieren" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "ReplayGain-Lautstärkeanpassung" #: ../quodlibet/qltk/prefs.py:450 msgid "_Default rating:" msgstr "_Standardbewertung:" #: ../quodlibet/qltk/prefs.py:493 msgid "Rating _scale:" msgstr "Bewertungs_skala:" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Bayes-Faktor (C) des Mittelwerts für aggregierte Bewertungen.\n" "»0« bedeutet einen herkömmlichen Mittelwert, höhere Werte bewirken, dass " "Alben mit wenigen Titeln schwächere Bewertungen erhalten. Eine Änderung " "dieses Wertes bewirkt eine Neubewertung aller Alben." #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "_Bayesscher Mittelwert:" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Bewertungen und Wiedergabe_anzahl speichern" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_E-Mail:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "Bewertungen und Angaben zur Wiedergabeanzahl werden dieser E-Mail-Adresse " "zugeordnet" #: ../quodlibet/qltk/prefs.py:577 msgid "Auto-save tag changes" msgstr "Änderungen an Tags automatisch speichern" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Änderungen an Tags beim Bearbeiten mehrerer Dateien automatisch speichern" #: ../quodlibet/qltk/prefs.py:587 msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Liste von Trennzeichen, die zum Aufteilen von Tag-Feldern im Tag-Editor " "verwendet werden. Einträge dieser Liste werden durch Leerzeichen voneinander " "getrennt" #: ../quodlibet/qltk/prefs.py:610 msgid "Tags" msgstr "Tags" #: ../quodlibet/qltk/prefs.py:631 msgid "Updating for new ratings" msgstr "Aktualisiere Bewertungen" #: ../quodlibet/qltk/prefs.py:641 msgid "Scan library _on start" msgstr "Bibliothek beim _Programmstart aktualisieren" # »Einlesen« würde nach einem aufwendigeren Vorgang klingen #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 msgid "_Scan Library" msgstr "Bibliothek aktuali_sieren" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Bibliothek auf Änderungen überprüfen" #: ../quodlibet/qltk/prefs.py:658 msgid "Re_build Library" msgstr "Bibliothek neu auf_bauen" #: ../quodlibet/qltk/prefs.py:661 msgid "Reload all songs in your library. This can take a long time." msgstr "" "Alle Titel in der Bibliothek neu laden. Dieser Vorgang dauert möglicherweise " "lange." #: ../quodlibet/qltk/prefs.py:671 msgid "Scan Directories" msgstr "Ordner einlesen" #: ../quodlibet/qltk/prefs.py:677 msgid "Hidden Songs" msgstr "Ausgeblendete Titel" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s und %(count)d weiterer" msgstr[1] "%(title)s und %(count)d weitere" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Eigenschaften" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Warteschlange" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "Stoppen, sobald leer" #: ../quodlibet/qltk/queue.py:129 msgid "_Clear Queue" msgstr "Warteschlange l_eeren" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "%(count)d Titel (%(time)s)" msgstr[1] "%(count)d Titel (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "Bibli_othek durchsuchen" #: ../quodlibet/qltk/quodlibetwindow.py:395 msgid "Toggle queue visibility" msgstr "Warteschlange anzeigen/verbergen" #: ../quodlibet/qltk/quodlibetwindow.py:516 msgid "Playback Error" msgstr "Wiedergabefehler" #: ../quodlibet/qltk/quodlibetwindow.py:524 msgid "Set up library directories?" msgstr "Ordner für Bibliothek einrichten?" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" "Sie haben noch keine Musikbibliothek eingerichtet. Möchten Sie das jetzt tun?" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "_Nicht jetzt" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "_Einrichten" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Titel konnten nicht hinzugefügt werden" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, python-format msgid "%s uses an unsupported protocol." msgstr "%s verwendet ein nicht unterstütztes Protokoll." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Zum abgespielten Titel springen" #: ../quodlibet/qltk/quodlibetwindow.py:986 msgid "_File" msgstr "_Datei" #: ../quodlibet/qltk/quodlibetwindow.py:987 msgid "_Song" msgstr "_Titel" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Ansicht" #: ../quodlibet/qltk/quodlibetwindow.py:989 msgid "_Browse" msgstr "D_urchsuchen" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Steuerung" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Hilfe" #: ../quodlibet/qltk/quodlibetwindow.py:997 msgid "_Add a Folder…" msgstr "_Ordner hinzufügen …" #: ../quodlibet/qltk/quodlibetwindow.py:1002 msgid "_Add a File…" msgstr "_Datei hinzufügen …" #: ../quodlibet/qltk/quodlibetwindow.py:1007 msgid "_Add a Location…" msgstr "_URL hinzufügen …" #: ../quodlibet/qltk/quodlibetwindow.py:1036 msgid "Edit Bookmarks…" msgstr "_Lesezeichen bearbeiten …" #: ../quodlibet/qltk/quodlibetwindow.py:1056 msgid "Stop After This Song" msgstr "Nach diesem Titel _stoppen" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "_Tastenkombinationen" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Online-Hilfe" #: ../quodlibet/qltk/quodlibetwindow.py:1080 msgid "Search Help" msgstr "Hilfe zu Sucheingaben" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "URL hinzufügen" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Geben Sie die URL einer Audio-Datei an:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Die URL konnte nicht hinzugefügt werden." #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, python-format msgid "%s is not a valid location." msgstr "%s ist keine gültige URL." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Musik hinzufügen" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 msgid "_Add Folders" msgstr "_Ordner hinzufügen" #: ../quodlibet/qltk/quodlibetwindow.py:1379 msgid "Music Files" msgstr "Musikdateien" #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "_Add Files" msgstr "_Dateien hinzufügen" #: ../quodlibet/qltk/ratingsmenu.py:24 #, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "Sind Sie sicher, dass Sie die Bewertung von %d Titeln ändern möchten?" #: ../quodlibet/qltk/ratingsmenu.py:26 msgid "The saved ratings will be removed" msgstr "Die gespeicherten Bewertungen werden entfernt" #: ../quodlibet/qltk/ratingsmenu.py:27 #, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Die Bewertung aller ausgewählten Titel wird geändert zu »%s«" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 msgid "_Remove Rating" msgstr "Bewertung entfe_rnen" #: ../quodlibet/qltk/ratingsmenu.py:98 msgid "Change _Rating" msgstr "Bewertung _ändern" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Leerzeichen durch _Unterstriche ersetzen" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Von MS _Windows nicht unterstützte Zeichen entfernen" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "_Diakritische Zeichen entfernen" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Nicht-_ASCII-Zeichen entfernen" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Nur _Kleinschreibung verwenden" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Dateien umbenennen" # Unter Tagging, 'Tags aus Pfad erzeugen'. # 'Pfad' gefällt mir nicht, 'Muster' ('Profil'?) auch nicht ;) # –> Mir gefiel 'Pfad' auch nicht. ;-) # Kann es sein, dass 'path' etwas unglücklich formuliert ist? Es handelt sich doch um den Dateinamen. Allerdings gibt es auch noch '_Filename Pattern:'. #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Muster für Dateipfade" # Für mich sieht das eher nach 'Profile' aus. # –> Jo, wesentlich besser. Global geändert. #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 msgid "Edit saved patterns…" msgstr "Gespeicherte Muster bearbeiten …" #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Voransicht" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Neuer Name" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Die Datei konnte nicht umbenannt werden" #: ../quodlibet/qltk/renamefiles.py:256 #, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Umbenennen von <b>%(old-name)s</b> nach <b>%(new-name)s</b> fehlgeschlagen. " "Möglicherweise existiert die Zieldatei bereits, oder Sie haben keine " "ausreichenden Benutzerrechte, um die neue Datei anzulegen oder die alte zu " "entfernen." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "_Alle Fehler ignorieren" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Fortfahren" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Der Pfad ist nicht absolut" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "Die Vorlage\n" "\t<b>%s</b>\n" "enthält »/«, startet aber nicht vom Stammverzeichnis. Um zu vermeiden, dass " "Ordner falsch benannt werden, sollte die Vorlage entweder mit »/« oder mit " "»~/« beginnen." #: ../quodlibet/qltk/scanbox.py:47 msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "In den aufgeführten Ordnern abgelegte Audiotitel werden Ihrer Bibliothek " "hinzugefügt, wenn diese aktualisiert wird." #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Ordner auswählen" #: ../quodlibet/qltk/searchbar.py:52 msgid "Saved Searches" msgstr "Gespeicherte Suchläufe" #: ../quodlibet/qltk/searchbar.py:53 msgid "Edit saved searches…" msgstr "Gespeicherte Suchläufe bearbeiten …" #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "Bibliothek mit Freitexteingaben oder QL-Abfragen durchsuchen" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Suche bei Eingabe _starten" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "Suchergebnisse umgehend nach Beenden der Eingabe anzeigen." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Limit:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Bewertung" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Verbleibende Abspieldauer anzeigen" #: ../quodlibet/qltk/shortcuts.py:16 msgid "Main Window" msgstr "Hauptfenster" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "Im aktuell abgespielten Titel um 10 Sekunden zurückspringen" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "Im aktuell abgespielten Titel um 10 Sekunden vorwärtsspringen" #: ../quodlibet/qltk/shortcuts.py:19 msgid "Focus the search entry" msgstr "Fokus auf den Sucheintrag setzen" #: ../quodlibet/qltk/shortcuts.py:22 msgid "Reset filters and jump to the playing song" msgstr "Filter zurücksetzen und zum aktuell abgespielten Titel springen" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "Informationsfenster für den ausgewählten Titel öffnen" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "Tag-Editor für den ausgewählten Titel öffnen" #: ../quodlibet/qltk/shortcuts.py:28 msgid "Queue the selected songs" msgstr "Die ausgewählten Titel zur Warteschlange hinzufügen" #: ../quodlibet/qltk/shortcuts.py:29 msgid "Delete the selected songs" msgstr "Den ausgewählten Titel löschen" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "Das Suchfeld für die Schnellsuche anzeigen" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "Linksklick auf einen Listenspaltenkopf" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" "Die Spalte der Liste der Spalten, nach denen sortiert werden soll, hinzufügen" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "Baumansicht" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "Das Element einklappen oder das Elternelement auswählen" #: ../quodlibet/qltk/shortcuts.py:37 msgid "Expands the element" msgstr "Das Element ausklappen" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "Textfelder" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "Die letzte rückgängig gemachte Änderung wiederholen" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "Alle Titel in allen Leisten auswählen" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "Nach %s _filtern" #: ../quodlibet/qltk/songlist.py:1094 msgid "All _Headers" msgstr "_Alle Listenspalten" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Listenspalten zu _Titeln" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "Listenspalten zu _Alben" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "Listenspalten zu _Mitwirkenden" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "Listenspalten zum _Datum" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "Listenspalten zu _Dateien" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "Listenspalten zur _Produktion" #: ../quodlibet/qltk/songlist.py:1115 msgid "_Customize Headers…" msgstr "Listenspalten _anpassen …" #: ../quodlibet/qltk/songlist.py:1120 msgid "_Expand Column" msgstr "Listenspalte ausd_ehnen" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "Das Plugin »%(name)s« auf %(count)d Titel anwenden?" msgstr[1] "Das Plugin »%(name)s« auf %(count)d Titel anwenden?" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "Das Plugin »%(name)s« auf %(count)d Album anwenden?" msgstr[1] "Das Plugin »%(name)s« auf %(count)d Alben anwenden?" #: ../quodlibet/qltk/songsmenu.py:149 msgid "Configure Plugins…" msgstr "Plugins konfigurieren …" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Zur _Warteschlange hinzufügen" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "Auf _Gerät übertragen" #: ../quodlibet/qltk/songsmenu.py:378 msgid "_Remove from Library" msgstr "Aus der Bibliothek entfe_rnen" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "_Unterstriche durch Leerzeichen ersetzen" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "Titel_anfang in Großbuchstaben" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "In _mehrere Werte aufteilen" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Tags aus Dateipfad erzeugen" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Neue Tags überschreiben bestehende Tags" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Neue Tags werden zu den vorhandenen Tags hinzugefügt" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "Speichern" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "Das Muster\n" "\t<b>%s</b>\n" "ist ungültig. Möglicherweise enthält es den gleichen Tag zweimal, oder es " "enthält nicht zueinander passende Klammern (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Ungültige Tags" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "Ungültige Tags <b>%s</b>\n" "\n" "Die momentan ausgewählten Dateien unterstützen das Bearbeiten dieser Tags " "nicht." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Das von Ihnen eingegebene Muster ist ungültig. Bitte geben Sie »<«; und " "»>«; als »\\<«; und »\\>«; ein. Achten Sie darauf, dass Tags richtig " "geschlossen werden.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Anzeige bearbeiten" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Titelnummern" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "_Starten bei:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "_Titel insgesamt:" #: ../quodlibet/qltk/unity.py:52 msgid "Play/Pause" msgstr "Abspielen/Pause" #: ../quodlibet/qltk/unity.py:75 msgid "Previous" msgstr "Vorheriger" #: ../quodlibet/qltk/views.py:923 #, python-format msgid "and %d more…" msgstr "und %d weitere …" #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Geänderte Titel werden gespeichert." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d Titel gespeichert\n" "(%(remaining)s übrig)" #: ../quodlibet/qltk/wlw.py:234 #, python-format msgid "%(current)s of %(all)s" msgstr "%(current)s von %(all)s" #: ../quodlibet/update.py:89 msgid "Checking for Updates" msgstr "Nach Aktualisierungen suchen" #: ../quodlibet/update.py:124 msgid "Connection failed" msgstr "Verbindung fehlgeschlagen" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "Sie benutzen bereits die aktuelle Version %(version)s" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" "Eine neue Version %(new-version)s ist verfügbar\n" "\n" "Sie benutzen aktuell Version %(old-version)s\n" "\n" "Besuchen Sie die <a href='%(url)s'>Website</a>" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "Wiedergabelisten müssen einen Namen haben" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Eine Wiedergabeliste mit dem Namen »%s« existiert bereits." #: ../quodlibet/util/cover/built_in.py:26 msgid "Embedded album covers" msgstr "Eingebettete Album-Cover" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "In Audiodateien eingebettete Coverbilder verwenden." #: ../quodlibet/util/cover/built_in.py:49 msgid "Filesystem cover" msgstr "Dateisystem-Cover" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" "Mit üblichen Dateinamen benannte Bilder in üblichen Verzeichnissen neben dem " "Titel benutzen." #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Kurzinfo zur Benutzung anzeigen" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Info zu Version und Copyright anzeigen" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "Verwendung: %(program)s %(usage)s" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[Optionen]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Die Option %r ist ungültig." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "Die Option %r erfordert ein Argument." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r ist kein eindeutiger Präfix." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbit/s" #: ../quodlibet/util/__init__.py:419 #, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "%s Sekunde" msgstr[1] "%s Sekunden" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Keine Informationen zur Abspieldauer" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d Sekunde" msgstr[1] "%d Sekunden" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d Minute" msgstr[1] "%d Minuten" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d Stunde" msgstr[1] "%d Stunden" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d Tag" msgstr[1] "%d Tage" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "%d Jahr" msgstr[1] "%d Jahre" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 msgctxt "check" msgid "titlecase?" msgstr "no title-casing" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Das Datum muss in einem der folgenden Formate eingegeben werden: »JJJJ«, " "»JJJJ-MM-TT« oder »JJJJ-MM-TT HH:MM:SS«." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "" "Die ReplayGain-Wiedergabeverstärkung muss im Format »x.yy dB« eingegeben " "werden." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "ReplayGain-Spitzenpegel müssen im Format »x.yy« eingegeben werden." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz-IDs müssen dem Format UUID entsprechen." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "Der MusicBrainz Release-Status muss »official«, »promotional«, oder " "»bootleg« sein." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Der Sprachcode muss aus drei Buchstaben bestehen (ISO 639-2)" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Der Titel kann nicht bearbeitet werden" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Speichern von <b>%s</b> fehlgeschlagen. Die Datei ist möglicherweise nur " "lesbar, beschädigt, oder Sie haben keine ausreichenden Benutzerrechte zum " "Bearbeiten der Datei." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Ungültige Kodierung]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "Album" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "Arrangeur" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "Arrangeure" #: ../quodlibet/util/tags.py:75 msgid "arrangement" msgstr "Arrangement" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "Autor" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "Autoren" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "Komponist" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "Komponisten" #: ../quodlibet/util/tags.py:78 msgid "composition" msgstr "Komposition" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "Dirigent" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "Dirigenten" #: ../quodlibet/util/tags.py:80 msgid "conducting" msgstr "Dirigat" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "Kontakt" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "Copyright" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "Datum" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "Beschreibung" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "Genre" #: ../quodlibet/util/tags.py:85 msgid "genres" msgstr "Genres" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "Interpret" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "Gruppieren" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "Sprache" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "Lizenz" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "URL" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "Texter" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "Texter" #: ../quodlibet/util/tags.py:91 msgid "lyrics" msgstr "Liedtext" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "Plattenfirma" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "Titel" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "Version" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "Website" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "Album-Künstler" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "CD-Untertitel" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "CD" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "Titel-Nr." #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "Label-ID" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "Erste Veröffentlichung" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "Originalalbum" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "Originalkünstler" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "Aufnahmedatum" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "Erschienen in" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 msgid "MusicBrainz recording ID" msgstr "MusicBrainz Aufnahme-ID" #: ../quodlibet/util/tags.py:121 msgid "MusicBrainz release track ID" msgstr "MusicBrainz Veröffentlichungs-Titel-ID" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "MusicBrainz Veröffentlichungs-ID" #: ../quodlibet/util/tags.py:123 msgid "MusicBrainz artist ID" msgstr "MusicBrainz Künstler-ID" #: ../quodlibet/util/tags.py:124 msgid "MusicBrainz release artist ID" msgstr "MusicBrainz Veröffentlichungs-Künstler-ID" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM-ID" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz Albumstatus" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz Albumtyp" #: ../quodlibet/util/tags.py:129 msgid "MusicBrainz release group ID" msgstr "MusicBrainz Veröffentlichungsgruppen-ID" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "Lautstärkeverstärkung per Titel" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "Titel-Spitzenpegel" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "Lautstärkeverstärkung per Album" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "Album-Spitzenpegel" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "Referenzlautstärke" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "CDs" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "Titel" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "Zuletzt angespielt" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "Vollst. Dateiname" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "Einhängepunkt" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "Mitwirkende" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "Jahr" #: ../quodlibet/util/tags.py:158 msgid "original release year" msgstr "Jahr der Erstveröffentlichung" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "Lesezeichen" #: ../quodlibet/util/tags.py:162 msgid "file format" msgstr "Dateiformat" #: ../quodlibet/util/tags.py:165 msgid "playlists" msgstr "Wiedergabelisten" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "Anzahl der Kanäle" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "sortieren" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "Rollen" #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "" #~ "»%s« konnte nicht importiert werden, der Browser für Audio-Feeds wurde " #~ "deaktiviert." #~ msgid "Audio Backend Failed to Load" #~ msgstr "Audio-Backend konnte nicht geladen werden" #~ msgid "" #~ "Loading the audio backend '%(name)s' failed. Audio playback will be " #~ "disabled." #~ msgstr "" #~ "Laden des Audio-Backends »%(name)s« fehlgeschlagen. Die Audio-Wiedergabe " #~ "wird deaktiviert." #~ msgid "_Open" #~ msgstr "_Öffnen" #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Ein Fehler ist in Quod Libet aufgetreten. Eine Speicherauszugsdatei wurde " #~ "unter <b>%(dump-path)s</b> gespeichert. Sie kann uns bei der " #~ "Fehlerbehebung helfen. Bitte legen Sie unter %(new-issue-url)s einen " #~ "neuen Fehlerbericht inklusive dieser Datei oder ihres Inhalts an. Diese " #~ "Datei kann einige Informationen zu Ihnen oder Ihrem System enthalten, z." #~ "B. zuletzt abgespielte Dateien. Falls das für Sie nicht akzeptabel ist, " #~ "senden Sie stattdessen <b>%(mini-dump-path)s</b> mit einer Beschreibung " #~ "dessen, was zum Auftreten des Fehlers führte." #~ msgid "" #~ "Quod Libet may now be unstable. Closing it and restarting is recommended. " #~ "Your library will be saved." #~ msgstr "" #~ "Quod Libet läuft möglicherweise nicht mehr stabil. Ein Neustart wird " #~ "empfohlen. Die Bibliothek wird gespeichert." #~ msgid "Remove all songs from the queue" #~ msgstr "Alle Titel aus Warteschlange entfernen" #~ msgid "Watch this folder for new songs" #~ msgstr "Diesen Ordner auf neue Titel prüfen" #~ msgid "browsers" #~ msgstr "Browser" #~ msgid "tooltip" #~ msgstr "Tooltip" #~ msgid "Event Logging" #~ msgstr "Ereigniserfassung" #~ msgid "Sends song events to the Zeitgeist event logging service." #~ msgstr "Sendet Titelereignisse zum Zeitgeist-Ereigniserfassungsservice." #~ msgid "Unable to download lyrics." #~ msgstr "Liedtext konnte nicht heruntergeladen werden." #~ msgid "Set or toggle the playback order" #~ msgstr "Wiedergabereihenfolge einstellen oder wechseln" #~ msgid "Uninitialized iPod" #~ msgstr "Nicht initialisierter iPod" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Möchten Sie eine leere Datenbank auf diesem iPod anlegen?" #~ msgid "Combine tags with _multiple values" #~ msgstr "Tags _mit unterschiedlichen Werten zusammenführen" #~ msgid "Model:" #~ msgstr "Modell:" #~ msgid "Capacity:" #~ msgstr "Speicherkapazität:" #~ msgid "Firmware:" #~ msgstr "Firmware:" #~ msgid "Removing orphaned iPod track" #~ msgstr "Verwaister iPod-Titel wird entfernt" #~ msgid "Unable to save iPod database" #~ msgstr "Die iPod-Datenbank konnte nicht gespeichert werden" #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "»libgpod« nicht gefunden, iPod-Unterstützung deaktiviert." #~ msgid "Shuffle" #~ msgstr "Zufall" #~ msgid "Weighted" #~ msgstr "Bewertung" #~ msgid "_Weighted" #~ msgstr "_Bewertung" #~ msgid "Restart the playlist when finished" #~ msgstr "Wiedergabeliste nach Abspielen aller Titel von vorn beginnen" #~ msgid "Disable Browser" #~ msgstr "Browser deaktivieren" #~ msgid "_Disable Browser" #~ msgstr "Browser _deaktivieren" #~ msgid "_Music" #~ msgstr "_Musik" #~ msgid "Add Bookmark" #~ msgstr "Lesezeichen hinzufügen" #~ msgid "Song _List" #~ msgstr "_Titelliste" #~ msgid "Embed cover" #~ msgstr "Cover einbetten" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "Alben-Cover mit abger_undeten Ecken darstellen" #~ msgid "Unable to open input files" #~ msgstr "Die Eingabedateien konnten nicht geöffnet werden" #~ msgid "Invalid audio backend" #~ msgstr "Ungültiges Audio-Backend" #~ msgid "Print all tags to stdout" #~ msgstr "Alle Tags auf Standardausgabe ausgeben" #~ msgid "command|filename" #~ msgstr "Dateiname" #~ msgid "command|tag" #~ msgstr "Tag" #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: »libudev« wurde nicht gefunden." #~ msgid "heading|Search" #~ msgstr "Suche" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "<b>%s</b> überschreiben?" #~ msgid "Output Error" #~ msgstr "Ausgabefehler" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "Die GStreamer Ausgabe-Pipeline konnte nicht initialisiert werden. Die " #~ "Pipeline könnte ungültig oder das Gerät gerade aktiv sein. Überprüfen Sie " #~ "die Player-Einstellungen." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet läuft bereits." #~ msgid "No song is currently playing." #~ msgstr "Momentan wird kein Titel wiedergegeben." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Nach %s konnte nicht geschrieben werden; es wird daher entfernt." #~ msgid "_Add to Playlist" #~ msgstr "Zur Wiederg_abeliste hinzufügen" #~ msgid "Output Log" #~ msgstr "Protokoll" #~ msgid "Are you sure?" #~ msgstr "Sind Sie sicher?" #~ msgid "_Output Log" #~ msgstr "Pr_otokoll" #~ msgid "Invalid command %r received." #~ msgstr "Ungültigen Befehl %r empfangen." #~ msgid "Unknown browser %r." #~ msgstr "Unbekannter Browser %r." #~ msgid "Custom _Sort..." #~ msgstr "Benutzerdefinierte _Sortierung..." #~ msgid "Tag:" #~ msgstr "Tag:" #~ msgid "Descending" #~ msgstr "Absteigend" #~ msgid "Too Many Errors" #~ msgstr "Zu viele Fehler" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Wiedergabe wird gestoppt, da %d Fehler in Folge auftraten." #~ msgid "Warnings" #~ msgstr "Warnungen" #~ msgid "General" #~ msgstr "Allgemein" #~ msgid "No log available." #~ msgstr "Kein Protokoll verfügbar." #~ msgid "errors" #~ msgstr "Fehler" #~ msgid "_Cause an Error" #~ msgstr "Einen Fehler _herbeiführen" #~ msgid "Failed reading album art \"%s\"" #~ msgstr "Das Album-Cover \"%s\" konnte nicht gelesen werden" #~ msgid "Permanently delete this file?" #~ msgstr "Diese Datei unwiderruflich löschen?" #~ msgid "Permanently delete these files?" #~ msgstr "Diese Dateien unwiderruflich löschen?" #~ msgid "Version:" #~ msgstr "Version:" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s konnte nicht zu Ihrer Bibliothek hinzugefügt werden.\n" #~ "\n" #~ msgid "Error running command %r, caused by: %r." #~ msgstr "Fehler beim Ausführen des Befehls %r, verursacht durch: %r." #~ msgid "Do you wish to continue?" #~ msgstr "Möchten Sie fortfahren?" #~ msgid "Confirm duplicates removal" #~ msgstr "Entfernen von Duplikaten bestätigen" #~ msgid "No eject command found." #~ msgstr "Kein Befehl zum Auswerfen gefunden." #~ msgid "Unable to start web browser" #~ msgstr "Der Webbrowser konnte nicht gestartet werden" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Es wurde kein Webbrowser gefunden. Bitte setzen Sie die Variable " #~ "$BROWSER, oder stellen Sie sicher, dass /usr/bin/sensible-browser " #~ "existiert." #~ msgid "" #~ "Cannot save library contents to %s (it's a directory). Please remove it " #~ "and try again." #~ msgstr "" #~ "Die Inhalte der Bibliothek können nicht auf %s (dies ist ein Verzeichnis) " #~ "gespeichert werden. Bitte entfernen und erneut versuchen." #~ msgid "Library Error" #~ msgstr "Fehler in Bibliothek" #~ msgid "_Output device:" #~ msgstr "_Ausgabe-Gerät:" #~ msgid "translator-credits" #~ msgstr "" #~ "Rüdiger Arp <ruediger@gmx.net>\n" #~ "Bastian Kleineidam" #~ msgid "_Edit and Continue" #~ msgstr "_Bearbeiten und Fortfahren" #~ msgid "Confirm rating" #~ msgstr "Bewertung bestätigen" #~ msgid "Search your library" #~ msgstr "Bibliothek durchsuchen" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r enthält keine Browser." #~ msgid "%r doesn't contain any devices." #~ msgstr "%r enthält keine Geräte." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: media-player-info wurde nicht gefunden." #~ msgid "Unkown" #~ msgstr "Unbekannt" #~ msgid "Not setting process title." #~ msgstr "Prozessname wird nicht gesetzt." #~ msgid "Couldn't find module %s." #~ msgstr "Modul %s wurde nicht gefunden." #~ msgid "Total size unknown" #~ msgstr "Gesamtgröße unbekannt" #~ msgid "Not Played To_day" #~ msgstr "Heute n_och nicht abgespielt" #~ msgid "Not Played in a _Week" #~ msgstr "Seit einer _Woche nicht abgespielt" #~ msgid "Not Played in a _Month" #~ msgstr "Seit einem _Monat nicht abgespielt" #~ msgid "B_ottom 40" #~ msgstr "Fl_op 40" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "Die 40 am wenigsten gespielten Titel (mehr als 40 werden ausgewählt bei " #~ "Gleichstand)" #~ msgid "%s: Could not import ctypes." #~ msgstr "%s: ctypes konnte nicht importiert werden." #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Einfache Suchen in Blau, erweiterte in Grün und ungültige in Rot anzeigen" #~ msgid "_Select" #~ msgstr "Au_swählen" #~ msgid "Separators for splitting tags" #~ msgstr "Begrenzungszeichen zum Trennen von Tags" #~ msgid "Choose New Stations" #~ msgstr "Neue Sender auswählen" #~ msgid "Add" #~ msgstr "Hinzufügen" #~ msgid "Bitrate" #~ msgstr "Bitrate" #~ msgid "Genre" #~ msgstr "Genre" #~ msgid "_Stations..." #~ msgstr "_Sender..." #~ msgid "Date" #~ msgstr "Datum" #~ msgid "Unable to dump logs, you're boned." #~ msgstr "Protokolle konnten nicht geschrieben werden." #~ msgid "Initializing audio backend (%s)" #~ msgstr "Audio-Backend (%s) wird initialisiert" #~ msgid "Initializing main library (%s)" #~ msgstr "Hauptbibliothek (%s) wird initialisiert" #~ msgid "Unable to save library" #~ msgstr "Die Bibliothek konnte nicht gespeichert werden" #~ msgid "" #~ "The audio output pipeline %r could not be created. Check your GStreamer " #~ "settings in ~/.quodlibet/config." #~ msgstr "" #~ "Die Audioausgabe-Pipeline %r konnte nicht angelegt werden. Überprüfen Sie " #~ "die GStreamer-Einstellungen in ~/.quodlibet/config." #~ msgid "Sort by title" #~ msgstr "Nach Titel sortieren" #~ msgid "Sort by artist" #~ msgstr "Nach Künstler sortieren" #~ msgid "Lyrics provided by %s." #~ msgstr "Liedtext zur Verfügung gestellt von %s." #~ msgid "" #~ "No lyrics found.\n" #~ "\n" #~ "You can click the Download button to have Quod Libet search for lyrics " #~ "online. You can also enter them yourself and click save." #~ msgstr "" #~ "Liedtext nicht gefunden.\n" #~ "\n" #~ "Klicken Sie auf die Schaltfläche Download, damit Quod Libet die Liedtexte " #~ "online sucht. Sie können die Texte auch selbst eingeben und speichern." ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/po/eu.po����������������������������������������������������������������������������0000644�0001750�0001750�00000552101�13115512750�015335� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Basque translation of Quod Libet # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the Quod Libet package. # Piarres Beobide <pi@beobide.net>, 2010. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-06 13:45+0200\n" "PO-Revision-Date: 2010-11-29 00:37+0200\n" "Last-Translator: Piarres Beobide <pi@beobide.net>\n" "Language-Team: Basque <librezale@librezale.es>\n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.5\n" #: ../data/exfalso.appdata.xml.in.h:1 ../data/exfalso.desktop.in.h:2 msgid "Edit tags in your audio files" msgstr "Editatu zure audio fitxategietako etiketak" #: ../data/exfalso.appdata.xml.in.h:2 msgid "" "Ex Falso is a tag editor with the same tag editing interface as Quod Libet. " "It lets you display and edit any tags you want in the file, for all the file " "formats it supports." msgstr "" #: ../data/exfalso.appdata.xml.in.h:3 ../data/quodlibet.appdata.xml.in.h:3 msgid "" "Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/" "IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI." msgstr "" #: ../data/exfalso.desktop.in.h:1 msgid "Audio tag editor" msgstr "Audio etiketa editorea" #: ../data/quodlibet.appdata.xml.in.h:1 ../data/quodlibet.desktop.in.h:2 msgid "Listen to, browse, or edit your audio collection" msgstr "Entzun, arakatu edo editatu zure audio bilduma" #: ../data/quodlibet.appdata.xml.in.h:2 msgid "" "Quod Libet is a music management program. It provides several different ways " "to view your audio library, as well as support for Internet radio and audio " "feeds. It has extremely flexible metadata tag editing and searching " "capabilities." msgstr "" #: ../data/quodlibet.desktop.in.h:1 msgid "Music Player" msgstr "Musika erreproduzigailua" #: ../quodlibet/browsers/albums/main.py:168 #: ../quodlibet/browsers/covergrid/main.py:54 #, fuzzy msgid "_Title" msgstr "Titulua" #: ../quodlibet/browsers/albums/main.py:169 #: ../quodlibet/browsers/covergrid/main.py:55 ../quodlibet/qltk/prefs.py:49 msgid "_Artist" msgstr "_Artista" #: ../quodlibet/browsers/albums/main.py:170 #: ../quodlibet/browsers/covergrid/main.py:56 ../quodlibet/qltk/prefs.py:54 msgid "_Date" msgstr "_Data" #: ../quodlibet/browsers/albums/main.py:171 #: ../quodlibet/browsers/covergrid/main.py:57 ../quodlibet/qltk/prefs.py:53 #, fuzzy msgid "_Genre" msgstr "Genero" #: ../quodlibet/browsers/albums/main.py:172 #: ../quodlibet/browsers/covergrid/main.py:58 ../quodlibet/qltk/prefs.py:58 #: ../quodlibet/qltk/ratingsmenu.py:39 msgid "_Rating" msgstr "_Balorazioa" #: ../quodlibet/browsers/albums/main.py:178 #: ../quodlibet/browsers/covergrid/main.py:64 #, fuzzy msgid "Sort _by…" msgstr "Ordena_tu:" #: ../quodlibet/browsers/albums/main.py:199 #: ../quodlibet/browsers/covergrid/main.py:85 #: ../quodlibet/browsers/paned/prefs.py:166 #: ../quodlibet/browsers/playlists/main.py:629 #: ../quodlibet/qltk/exfalsowindow.py:109 ../quodlibet/qltk/pluginwin.py:341 #: ../quodlibet/qltk/quodlibetwindow.py:1016 #, fuzzy msgid "_Preferences" msgstr "Hobespenak" #: ../quodlibet/browsers/albums/main.py:361 msgid "Album List" msgstr "Album zerrenda" #: ../quodlibet/browsers/albums/main.py:362 msgid "_Album List" msgstr "_Album zerrenda" #: ../quodlibet/browsers/albums/main.py:472 #: ../quodlibet/browsers/covergrid/main.py:279 #: ../quodlibet/browsers/covergrid/main.py:488 msgid "All Albums" msgstr "Album guztiak" #: ../quodlibet/browsers/albums/main.py:473 #: ../quodlibet/browsers/covergrid/main.py:280 #: ../quodlibet/browsers/covergrid/main.py:489 #, python-format msgid "%d album" msgid_plural "%d albums" msgstr[0] "album %d" msgstr[1] "%d album" #: ../quodlibet/browsers/albums/main.py:650 #: ../quodlibet/browsers/covergrid/main.py:467 #, fuzzy msgid "Reload album _cover" msgid_plural "Reload album _covers" msgstr[0] "Ikusi album _karatulak" msgstr[1] "Ikusi album _karatulak" #: ../quodlibet/browsers/albums/prefs.py:28 #: ../quodlibet/browsers/collection/models.py:17 #: ../quodlibet/browsers/covergrid/prefs.py:30 msgid "Songs not in an album" msgstr "Album gabeko kantak" #: ../quodlibet/browsers/albums/prefs.py:41 #: ../quodlibet/browsers/covergrid/prefs.py:43 #: ../quodlibet/browsers/playlists/prefs.py:35 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:98 #: ../quodlibet/qltk/information.py:381 ../quodlibet/util/collection.py:245 #, python-format msgid "%d track" msgid_plural "%d tracks" msgstr[0] "kanta %d" msgstr[1] "%d kantak" #: ../quodlibet/browsers/albums/prefs.py:42 #: ../quodlibet/browsers/covergrid/prefs.py:44 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:97 #: ../quodlibet/qltk/information.py:379 ../quodlibet/util/collection.py:249 #, python-format msgid "%d disc" msgid_plural "%d discs" msgstr[0] "disko %d" msgstr[1] "%d disko" #: ../quodlibet/browsers/albums/prefs.py:44 #: ../quodlibet/browsers/covergrid/prefs.py:46 #, fuzzy msgid "An Example Album" msgstr "Album guztiak" #: ../quodlibet/browsers/albums/prefs.py:52 msgid "Album List Preferences" msgstr "Album zerrenda hobespenak" #: ../quodlibet/browsers/albums/prefs.py:61 msgid "Show album _covers" msgstr "Ikusi album _karatulak" #: ../quodlibet/browsers/albums/prefs.py:67 msgid "Inline _search includes people" msgstr "Sarezko _bilaketa jendea barneratuz" #: ../quodlibet/browsers/albums/prefs.py:71 #: ../quodlibet/browsers/covergrid/prefs.py:120 #, fuzzy msgid "Options" msgstr "[aukerak]" #: ../quodlibet/browsers/albums/prefs.py:74 #: ../quodlibet/browsers/covergrid/prefs.py:123 msgid "Album Display" msgstr "Album bistaratzea" #: ../quodlibet/browsers/albums/prefs.py:78 #: ../quodlibet/browsers/covergrid/prefs.py:127 #: ../quodlibet/browsers/media.py:39 #: ../quodlibet/browsers/playlists/prefs.py:56 #: ../quodlibet/ext/songsmenu/albumart.py:326 #: ../quodlibet/ext/songsmenu/duplicates.py:350 #: ../quodlibet/ext/songsmenu/filterall.py:48 #: ../quodlibet/qltk/bookmarks.py:101 ../quodlibet/qltk/cbes.py:93 #: ../quodlibet/qltk/data_editors.py:99 ../quodlibet/qltk/data_editors.py:324 #: ../quodlibet/qltk/exfalsowindow.py:297 ../quodlibet/qltk/pluginwin.py:79 #: ../quodlibet/qltk/pluginwin.py:428 ../quodlibet/qltk/prefs.py:707 #: ../quodlibet/qltk/textedit.py:164 ../quodlibet/update.py:148 msgid "_Close" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:55 #: ../quodlibet/browsers/audiofeeds.py:67 #: ../quodlibet/browsers/audiofeeds.py:69 #: ../quodlibet/browsers/audiofeeds.py:159 #: ../quodlibet/browsers/paned/models.py:86 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:46 #: ../quodlibet/formats/_audio.py:495 ../quodlibet/order/__init__.py:27 #: ../quodlibet/qltk/information.py:240 ../quodlibet/qltk/information.py:247 #: ../quodlibet/qltk/information.py:273 ../quodlibet/qltk/wlw.py:70 msgid "Unknown" msgstr "Ezezaguna" #: ../quodlibet/browsers/audiofeeds.py:246 msgid "New Feed" msgstr "Jario berria" #: ../quodlibet/browsers/audiofeeds.py:247 msgid "Enter the location of an audio feed:" msgstr "Idatzi audio jarioaren kokapena:" #: ../quodlibet/browsers/audiofeeds.py:248 #: ../quodlibet/browsers/collection/prefs.py:90 #: ../quodlibet/browsers/iradio.py:341 ../quodlibet/browsers/paned/prefs.py:78 #: ../quodlibet/browsers/playlists/menu.py:96 #: ../quodlibet/browsers/playlists/util.py:52 ../quodlibet/qltk/bookmarks.py:62 #: ../quodlibet/qltk/cbes.py:55 ../quodlibet/qltk/data_editors.py:311 #: ../quodlibet/qltk/edittags.py:288 ../quodlibet/qltk/edittags.py:488 #: ../quodlibet/qltk/quodlibetwindow.py:1354 ../quodlibet/qltk/scanbox.py:61 msgid "_Add" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:265 msgid "Audio Feeds" msgstr "Audio jarioak" #: ../quodlibet/browsers/audiofeeds.py:266 msgid "_Audio Feeds" msgstr "_Audio jarioak" #: ../quodlibet/browsers/audiofeeds.py:345 #: ../quodlibet/browsers/audiofeeds.py:350 #, fuzzy msgid "_Download…" msgstr "_Deskargatu" #: ../quodlibet/browsers/audiofeeds.py:359 msgid "Download Files" msgstr "Deskargatu fitxategiak" #. Save button #: ../quodlibet/browsers/audiofeeds.py:359 #: ../quodlibet/browsers/audiofeeds.py:371 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:81 #: ../quodlibet/ext/songsmenu/albumart.py:322 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:355 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:278 #: ../quodlibet/ext/songsmenu/html.py:76 #: ../quodlibet/ext/songsmenu/lastfmsync.py:216 #: ../quodlibet/ext/songsmenu/playlist.py:51 #: ../quodlibet/ext/songsmenu/replaygain.py:365 #: ../quodlibet/ext/songsmenu/tapbpm.py:182 ../quodlibet/qltk/_editutils.py:39 #: ../quodlibet/qltk/lyrics.py:38 ../quodlibet/qltk/msg.py:52 #: ../quodlibet/qltk/renamefiles.py:168 ../quodlibet/qltk/tracknumbers.py:113 msgid "_Save" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:371 msgid "Download File" msgstr "Deskargatu fitxategia" #: ../quodlibet/browsers/audiofeeds.py:394 #: ../quodlibet/browsers/playlists/main.py:213 #: ../quodlibet/qltk/data_editors.py:96 msgid "_New" msgstr "" #: ../quodlibet/browsers/audiofeeds.py:454 #: ../quodlibet/browsers/audiofeeds.py:513 msgid "Unable to add feed" msgstr "Ezin da jarioa gehitu" #: ../quodlibet/browsers/audiofeeds.py:455 #: ../quodlibet/browsers/audiofeeds.py:514 #, fuzzy, python-format msgid "" "%s could not be added. The server may be down, or the location may not be an " "audio feed." msgstr "" "<b>%s</b> ezin da gehitu. Zerbitzaria eroria egon liteke edo kokapena ez da " "audio jario bat." #. refresh button #: ../quodlibet/browsers/audiofeeds.py:462 ../quodlibet/browsers/media.py:217 #: ../quodlibet/browsers/media.py:386 ../quodlibet/qltk/filesel.py:259 #: ../quodlibet/qltk/pluginwin.py:414 #, fuzzy msgid "_Refresh" msgstr "_Freskatu liburutegia" #: ../quodlibet/browsers/audiofeeds.py:463 #: ../quodlibet/browsers/playlists/main.py:457 #: ../quodlibet/browsers/playlists/util.py:43 ../quodlibet/qltk/delete.py:143 #: ../quodlibet/qltk/filesel.py:256 ../quodlibet/qltk/lyrics.py:39 #: ../quodlibet/qltk/maskedbox.py:28 ../quodlibet/qltk/songsmenu.py:391 #, fuzzy msgid "_Delete" msgstr "Ezabatu fitxategiak" #: ../quodlibet/browsers/audiofeeds.py:530 msgid "" "The current audio backend does not support URLs, Audio Feeds browser " "disabled." msgstr "" "Uneko audio azpiegiturak ez ditu URLak onartzen, audio jario nabigatzailea " "ezgaiturik." #: ../quodlibet/browsers/_base.py:147 ../quodlibet/browsers/_base.py:150 msgid "Library Browser" msgstr "Liburutegi nabigatzailea" #: ../quodlibet/browsers/_base.py:274 ../quodlibet/ext/songsmenu/refresh.py:30 #: ../quodlibet/qltk/exfalsowindow.py:241 ../quodlibet/qltk/information.py:542 #: ../quodlibet/qltk/maskedbox.py:68 ../quodlibet/util/collection.py:531 #, python-format msgid "%d song" msgid_plural "%d songs" msgstr[0] "kanta %d" msgstr[1] "%d kanta" #: ../quodlibet/browsers/_base.py:402 ../quodlibet/browsers/_base.py:407 #: ../quodlibet/qltk/tagsfrompath.py:194 ../quodlibet/qltk/textedit.py:141 #: ../quodlibet/util/__init__.py:622 msgid "Invalid pattern" msgstr "Patroi baliogabea" #: ../quodlibet/browsers/collection/main.py:78 msgid "Album Collection" msgstr "Diska bilduma" #: ../quodlibet/browsers/collection/main.py:79 msgid "Album _Collection" msgstr "Diska _bilduma" #: ../quodlibet/browsers/collection/models.py:24 #, fuzzy, python-format msgid "Unknown %s" msgstr "Ezezaguna" #: ../quodlibet/browsers/collection/models.py:25 #, fuzzy, python-format msgid "Multiple %s Values" msgstr "Zatitu _hainbat baliotan" #: ../quodlibet/browsers/collection/prefs.py:66 #: ../quodlibet/browsers/paned/prefs.py:51 msgid "_Custom" msgstr "_Personalizatu" #. Remove button #: ../quodlibet/browsers/collection/prefs.py:94 #: ../quodlibet/browsers/paned/prefs.py:82 #: ../quodlibet/browsers/playlists/menu.py:97 #: ../quodlibet/ext/playlist/remove_duplicates.py:60 #: ../quodlibet/qltk/bookmarks.py:97 ../quodlibet/qltk/bookmarks.py:127 #: ../quodlibet/qltk/cbes.py:82 ../quodlibet/qltk/cbes.py:89 #: ../quodlibet/qltk/data_editors.py:81 ../quodlibet/qltk/data_editors.py:94 #: ../quodlibet/qltk/data_editors.py:301 ../quodlibet/qltk/data_editors.py:314 #: ../quodlibet/qltk/data_editors.py:322 ../quodlibet/qltk/edittags.py:494 #: ../quodlibet/qltk/edittags.py:634 ../quodlibet/qltk/maskedbox.py:48 #: ../quodlibet/qltk/maskedbox.py:88 ../quodlibet/qltk/queue.py:349 #: ../quodlibet/qltk/scanbox.py:36 ../quodlibet/qltk/scanbox.py:63 #, fuzzy msgid "_Remove" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/browsers/collection/prefs.py:122 #: ../quodlibet/ext/songsmenu/filterall.py:34 #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/qltk/edittags.py:431 msgid "Tag" msgstr "Etiketa" #: ../quodlibet/browsers/collection/prefs.py:128 msgid "Merge" msgstr "Batu" #: ../quodlibet/browsers/collection/prefs.py:188 #, fuzzy msgid "Album Collection Preferences" msgstr "Album zerrenda hobespenak" #: ../quodlibet/browsers/collection/prefs.py:195 #: ../quodlibet/browsers/paned/prefs.py:209 #: ../quodlibet/ext/songsmenu/editplaycount.py:45 #: ../quodlibet/ext/songsmenu/exact_rating.py:38 #: ../quodlibet/player/gstbe/prefs.py:40 ../quodlibet/qltk/prefs.py:127 #: ../quodlibet/qltk/textedit.py:65 msgid "_Apply" msgstr "" #: ../quodlibet/browsers/collection/prefs.py:198 #: ../quodlibet/browsers/paned/prefs.py:213 #: ../quodlibet/browsers/playlists/menu.py:95 #: ../quodlibet/browsers/playlists/util.py:42 #: ../quodlibet/errorreport/ui.py:108 #: ../quodlibet/ext/playlist/export_to_folder.py:37 #: ../quodlibet/ext/playlist/remove_duplicates.py:59 #: ../quodlibet/ext/_shared/squeezebox/util.py:19 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:354 #: ../quodlibet/ext/songsmenu/editplaycount.py:44 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:281 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:88 #: ../quodlibet/ext/songsmenu/importexport.py:35 #: ../quodlibet/ext/songsmenu/lastfmsync.py:215 #: ../quodlibet/ext/songsmenu/playlist.py:50 #: ../quodlibet/ext/songsmenu/replaygain.py:364 #: ../quodlibet/ext/songsmenu/tapbpm.py:181 ../quodlibet/plugins/playlist.py:39 #: ../quodlibet/qltk/chooser.py:189 ../quodlibet/qltk/chooser.py:210 #: ../quodlibet/qltk/chooser.py:234 ../quodlibet/qltk/chooser.py:258 #: ../quodlibet/qltk/delete.py:90 ../quodlibet/qltk/delete.py:133 #: ../quodlibet/qltk/edittags.py:287 ../quodlibet/qltk/_editutils.py:38 #: ../quodlibet/qltk/getstring.py:28 ../quodlibet/qltk/maskedbox.py:27 #: ../quodlibet/qltk/msg.py:54 ../quodlibet/qltk/msg.py:93 #: ../quodlibet/qltk/ratingsmenu.py:33 ../quodlibet/qltk/songsmenu.py:45 #: ../quodlibet/qltk/songsmenu.py:73 ../quodlibet/update.py:94 msgid "_Cancel" msgstr "" #: ../quodlibet/browsers/covergrid/main.py:125 #, fuzzy msgid "Cover Grid" msgstr "Tamaina guztira:" #: ../quodlibet/browsers/covergrid/main.py:126 #, fuzzy msgid "_Cover Grid" msgstr "Tamaina guztira:" #: ../quodlibet/browsers/covergrid/prefs.py:54 #, fuzzy msgid "Cover Grid Preferences" msgstr "Paneldun nabigatzaile hobespenak" #: ../quodlibet/browsers/covergrid/prefs.py:64 #, fuzzy msgid "Show album _text" msgstr "Ikusi album _karatulak" #: ../quodlibet/browsers/covergrid/prefs.py:71 #, fuzzy msgid "Show \"All Albums\" Item" msgstr "Album guztiak" #: ../quodlibet/browsers/covergrid/prefs.py:78 msgid "Vertical Split" msgstr "" #: ../quodlibet/browsers/covergrid/prefs.py:110 #: ../quodlibet/browsers/covergrid/prefs.py:111 #, fuzzy msgid "Cover Magnification" msgstr "erakundea" #: ../quodlibet/browsers/filesystem.py:40 msgid "File System" msgstr "Fitxategi sistema" #: ../quodlibet/browsers/filesystem.py:41 msgid "_File System" msgstr "_Fixtategi sistema" #: ../quodlibet/browsers/filesystem.py:113 ../quodlibet/browsers/media.py:491 #: ../quodlibet/qltk/songlist.py:267 msgid "Unable to copy songs" msgstr "Ezin dira kantak kopiatu" #: ../quodlibet/browsers/filesystem.py:114 ../quodlibet/qltk/songlist.py:268 msgid "The files selected cannot be copied to other song lists or the queue." msgstr "Hautatutako kantak ezin dira kopiatu beste zerrenda edo ilara batera." #: ../quodlibet/browsers/filesystem.py:189 msgid "_Add to Library" msgstr "_Gehitu liburutegira" #: ../quodlibet/browsers/iradio.py:178 msgid "Unsupported file type" msgstr "Onartzen ez den fitxategi mota" #: ../quodlibet/browsers/iradio.py:179 #, python-format msgid "" "Station lists can only contain locations of stations, not other station " "lists or playlists. The following locations cannot be loaded:\n" "%s" msgstr "" "Kate zerrendak kate helbideak bakarrik izan ditzake ez beste kate zerrenda " "edo erreprodukzio-zerrendarik. Hurrengo kateak ezin dira kargatu:\n" "%s" #: ../quodlibet/browsers/iradio.py:219 ../quodlibet/browsers/iradio.py:232 #: ../quodlibet/browsers/iradio.py:810 msgid "Unable to add station" msgstr "Ezin da katea gehitu" #: ../quodlibet/browsers/iradio.py:243 ../quodlibet/browsers/iradio.py:471 msgid "Internet Radio" msgstr "Internet irratia" #: ../quodlibet/browsers/iradio.py:243 #, fuzzy msgid "Downloading station list" msgstr "Deskargatu fitxategiak" #: ../quodlibet/browsers/iradio.py:339 msgid "New Station" msgstr "Kate berria" #: ../quodlibet/browsers/iradio.py:340 msgid "Enter the location of an Internet radio station:" msgstr "Sar Internet bidezko irrati kate kokapena:" #: ../quodlibet/browsers/iradio.py:358 msgid "Electronic" msgstr "Elektronikoa" #: ../quodlibet/browsers/iradio.py:361 msgid "Hip Hop / Rap" msgstr "Hip Hop / Rap" #: ../quodlibet/browsers/iradio.py:362 msgid "Oldies" msgstr "Oldies" #: ../quodlibet/browsers/iradio.py:363 msgid "R&B" msgstr "R&B" #: ../quodlibet/browsers/iradio.py:364 msgid "Japanese" msgstr "Japaniarra" #: ../quodlibet/browsers/iradio.py:365 msgid "Indian" msgstr "Indiarra" #: ../quodlibet/browsers/iradio.py:367 msgid "Religious" msgstr "Erlijio-musika" #: ../quodlibet/browsers/iradio.py:369 msgid "Charts" msgstr "Salduenak" #: ../quodlibet/browsers/iradio.py:370 msgid "Turkish" msgstr "Turkiarra" #: ../quodlibet/browsers/iradio.py:371 msgid "Reggae / Dancehall" msgstr "Reggae / Dantzatzeko" #: ../quodlibet/browsers/iradio.py:372 #, fuzzy msgid "Latin" msgstr "balorazioa" #: ../quodlibet/browsers/iradio.py:373 msgid "College Radio" msgstr "Unibertsitate irratia" #: ../quodlibet/browsers/iradio.py:374 msgid "Talk / News" msgstr "Eztabaidak / Berriak" #: ../quodlibet/browsers/iradio.py:375 msgid "Ambient" msgstr "Ambient" #: ../quodlibet/browsers/iradio.py:376 msgid "Jazz" msgstr "Jazz" #: ../quodlibet/browsers/iradio.py:377 ../quodlibet/ext/events/equalizer.py:45 msgid "Classical" msgstr "Klasikoa" #: ../quodlibet/browsers/iradio.py:378 ../quodlibet/ext/events/equalizer.py:60 msgid "Pop" msgstr "Pop" #: ../quodlibet/browsers/iradio.py:379 msgid "Alternative" msgstr "Alternatiboa" #: ../quodlibet/browsers/iradio.py:380 msgid "Metal" msgstr "Metal" #: ../quodlibet/browsers/iradio.py:381 msgid "Country" msgstr "Country" #: ../quodlibet/browsers/iradio.py:382 msgid "News" msgstr "Berriak" #: ../quodlibet/browsers/iradio.py:383 msgid "Schlager" msgstr "Schlager" #: ../quodlibet/browsers/iradio.py:384 msgid "Funk" msgstr "Funk" #: ../quodlibet/browsers/iradio.py:385 msgid "Indie" msgstr "Indie" #: ../quodlibet/browsers/iradio.py:386 msgid "Blues" msgstr "Blues" #: ../quodlibet/browsers/iradio.py:387 msgid "Soul" msgstr "Soul" #: ../quodlibet/browsers/iradio.py:388 msgid "Lounge" msgstr "Lounge" #: ../quodlibet/browsers/iradio.py:389 msgid "Punk" msgstr "Punk" #: ../quodlibet/browsers/iradio.py:390 msgid "Reggaeton" msgstr "Reggaeton" #: ../quodlibet/browsers/iradio.py:392 msgid "Slavic" msgstr "Eslaboa" #: ../quodlibet/browsers/iradio.py:394 msgid "Greek" msgstr "Greziarra" #: ../quodlibet/browsers/iradio.py:395 msgid "Gothic" msgstr "Gotikoa" #: ../quodlibet/browsers/iradio.py:396 ../quodlibet/ext/events/equalizer.py:38 msgid "Rock" msgstr "Rock" #: ../quodlibet/browsers/iradio.py:449 msgid "Would you like to load a list of popular radio stations?" msgstr "" #: ../quodlibet/browsers/iradio.py:455 #, fuzzy msgid "_Load Stations" msgstr "_Kate berria" #: ../quodlibet/browsers/iradio.py:472 msgid "_Internet Radio" msgstr "_Internet irratia" #: ../quodlibet/browsers/iradio.py:538 #, fuzzy msgid "_New Station…" msgstr "Kate berria" #: ../quodlibet/browsers/iradio.py:541 #, fuzzy msgid "_Update Stations" msgstr "_Kate berria" #: ../quodlibet/browsers/iradio.py:568 #, fuzzy msgid "All Stations" msgstr "Kate berria" #. TODO: support for ~#rating=!None etc (#1940) #: ../quodlibet/browsers/iradio.py:572 #: ../quodlibet/browsers/soundcloud/main.py:64 msgid "Favorites" msgstr "Kuttunak" #: ../quodlibet/browsers/iradio.py:580 #, fuzzy msgid "No Category" msgstr "Kategoria gabe" #: ../quodlibet/browsers/iradio.py:802 msgid "No stations found" msgstr "Ez da katerik aurkitu" #: ../quodlibet/browsers/iradio.py:803 #, python-format msgid "No Internet radio stations were found at %s." msgstr "Ez da Intenet irrati katerik topatu %s-en." #: ../quodlibet/browsers/iradio.py:811 msgid "All stations listed are already in your library." msgstr "Zerrendatutako kate guztiak dagoeneko badaude liburutegian." #: ../quodlibet/browsers/iradio.py:828 #, fuzzy msgid "Add to Favorites" msgstr "_Gehitu erreprodukzio-zerrendara" #: ../quodlibet/browsers/iradio.py:832 #, fuzzy msgid "Remove from Favorites" msgstr "_Kendu erreprodukzio-zerrendatik" #: ../quodlibet/browsers/iradio.py:932 #, python-format msgid "%(count)d station" msgid_plural "%(count)d stations" msgstr[0] "%(count)d kate" msgstr[1] "%(count)d kate" #: ../quodlibet/browsers/media.py:36 msgid "Device Properties" msgstr "Gailu propietateak" #: ../quodlibet/browsers/media.py:52 msgid "Device:" msgstr "Gailua:" #: ../quodlibet/browsers/media.py:54 msgid "Not mounted" msgstr "Ez dago muntaturik" #: ../quodlibet/browsers/media.py:55 #, fuzzy msgid "Mount point:" msgstr "Muntatze puntua:" #: ../quodlibet/browsers/media.py:61 ../quodlibet/qltk/cbes.py:40 msgid "_Name:" msgstr "Ize_na:" #: ../quodlibet/browsers/media.py:135 msgid "Media Devices" msgstr "Medio gailuak" #: ../quodlibet/browsers/media.py:136 msgid "_Media Devices" msgstr "_Medio gailuak" #. eject button #: ../quodlibet/browsers/media.py:224 ../quodlibet/browsers/media.py:378 msgid "_Eject" msgstr "_Ebatzi" #: ../quodlibet/browsers/media.py:360 #, fuzzy msgid "_Properties" msgstr "Propietateak" #: ../quodlibet/browsers/media.py:365 #: ../quodlibet/browsers/playlists/main.py:464 msgid "_Rename" msgstr "Be_rrizendatu" #: ../quodlibet/browsers/media.py:461 #, fuzzy, python-format msgid "%(used-size)s used, %(free-size)s available" msgstr "<b>%s</b> erabilia, <b>%s</b> erabilgarri" #: ../quodlibet/browsers/media.py:479 #, fuzzy, python-format msgid "%s is not connected." msgstr "<b>%s</b> ez dago konektaturik." #: ../quodlibet/browsers/media.py:499 #, fuzzy, python-format msgid "Copying %(song)s" msgstr "<b>%(song)s</b> kopiatzen" #: ../quodlibet/browsers/media.py:513 ../quodlibet/browsers/media.py:529 msgid "Unable to copy song" msgstr "Ezin da kanta kopiatu" #: ../quodlibet/browsers/media.py:514 msgid "There is not enough free space for this song." msgstr "Ez kanta honentzako behar aina leku." #: ../quodlibet/browsers/media.py:526 #, fuzzy, python-format msgid "%s could not be copied." msgstr "<b>%s</b> ezin izan da kopiatu." #: ../quodlibet/browsers/media.py:545 msgid "Unable to delete songs" msgstr "Ezin dira kantak ezabatu" #: ../quodlibet/browsers/media.py:557 #, fuzzy, python-format msgid "Deleting %(song)s" msgstr "<b>%(song)s</b> ezabatzen" #: ../quodlibet/browsers/media.py:575 #, fuzzy, python-format msgid "%s could not be deleted." msgstr "<b>%s</b> ezin izan da ezabatu." #: ../quodlibet/browsers/media.py:579 msgid "Unable to delete song" msgstr "Ezin da abestiak ezabatu" #: ../quodlibet/browsers/media.py:594 #, fuzzy, python-format msgid "Ejecting %s failed." msgstr "<b>%s</b> ebazteak huts egin du." #: ../quodlibet/browsers/media.py:597 msgid "Unable to eject device" msgstr "Ezin da gailua ebatzi" #: ../quodlibet/browsers/media.py:603 msgid "No device backend, Media Devices browser disabled." msgstr "Ez dago gailu azpiegiturarik, media gailu nabigatzailea desgaiturik." #: ../quodlibet/browsers/paned/main.py:40 ../quodlibet/qltk/shortcuts.py:44 msgid "Paned Browser" msgstr "Paneldun nabigatzailea" #: ../quodlibet/browsers/paned/main.py:41 msgid "_Paned Browser" msgstr "_Paneldun nabigatzailea" #: ../quodlibet/browsers/paned/main.py:90 msgid "Select _All" msgstr "Hautatu _denak" #: ../quodlibet/browsers/paned/models.py:104 ../quodlibet/qltk/pluginwin.py:122 #: ../quodlibet/qltk/pluginwin.py:164 msgid "All" msgstr "Dena" #: ../quodlibet/browsers/paned/prefs.py:67 #, python-format msgid "" "Tag pattern with optional markup e.g. <tt>composer</tt> or\n" "<tt>%s</tt>" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:162 msgid "_Wide Mode" msgstr "" #: ../quodlibet/browsers/paned/prefs.py:197 msgid "Paned Browser Preferences" msgstr "Paneldun nabigatzaile hobespenak" #: ../quodlibet/browsers/paned/prefs.py:204 msgid "Equal pane width" msgstr "" #: ../quodlibet/browsers/playlists/main.py:48 #: ../quodlibet/browsers/playlists/main.py:575 #: ../quodlibet/qltk/pluginwin.py:168 msgid "Playlists" msgstr "Erreprodukzio-zerrendak" #: ../quodlibet/browsers/playlists/main.py:49 msgid "_Playlists" msgstr "_Erreprodukzio-zerrendak" #: ../quodlibet/browsers/playlists/main.py:152 msgid "_Remove from Playlist" msgstr "_Kendu erreprodukzio-zerrendatik" #: ../quodlibet/browsers/playlists/main.py:215 #: ../quodlibet/browsers/playlists/main.py:576 msgid "_Import" msgstr "_Inporatu" #: ../quodlibet/browsers/playlists/main.py:391 #: ../quodlibet/browsers/playlists/util.py:50 #: ../quodlibet/util/collection.py:574 msgid "New Playlist" msgstr "Sortu erreprodukzio-zerrenda" #: ../quodlibet/browsers/playlists/main.py:413 msgid "Unable to import playlist" msgstr "Ezin da erreprodukzio-zerrenda inportatu" #: ../quodlibet/browsers/playlists/main.py:414 msgid "Quod Libet can only import playlists in the M3U and PLS formats." msgstr "" "Quod Libet M3U eta PLS formatuko erreprodukzio-zerrendak bakarrik " "inportatzeko gai da." #: ../quodlibet/browsers/playlists/main.py:565 msgid "Unable to rename playlist" msgstr "Ezin da erreprodukzio-zerrenda berrizendatu" #: ../quodlibet/browsers/playlists/main.py:576 msgid "Import Playlist" msgstr "Inportatu erreprodukzio-zerrenda" #: ../quodlibet/browsers/playlists/menu.py:25 #, fuzzy msgid "_New Playlist…" msgstr "_Sortu erreprodukzio-zerrenda" #: ../quodlibet/browsers/playlists/menu.py:86 #, fuzzy, python-format msgid "What do you want to do with that %d song?" msgid_plural "What do you want to do with those %d songs?" msgstr[0] "" "%d abestiren balorazioa aldatzera zoaz.\n" "Jarraitu nahi duzu?" msgstr[1] "" "%d abestiren balorazioa aldatzera zoaz.\n" "Jarraitu nahi duzu?" #: ../quodlibet/browsers/playlists/menu.py:90 #, python-format msgid "Confirm action for playlist \"%s\"" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:21 msgid "empty" msgstr "" #: ../quodlibet/browsers/playlists/prefs.py:39 #, fuzzy msgid "Example Playlist" msgstr "Sortu erreprodukzio-zerrenda" #: ../quodlibet/browsers/playlists/prefs.py:47 #, fuzzy msgid "Playlist Browser Preferences" msgstr "Paneldun nabigatzaile hobespenak" #: ../quodlibet/browsers/playlists/prefs.py:52 #, fuzzy msgid "Playlist display" msgstr "Erreprodukzio-zerrendak" #: ../quodlibet/browsers/playlists/util.py:33 #, fuzzy, python-format msgid "Are you sure you want to delete the playlist '%s'?" msgstr "<i>%s</i> zerrenda ezabatzera zoaz.\n" #: ../quodlibet/browsers/playlists/util.py:35 msgid "" "All information about the selected playlist will be deleted and can not be " "restored." msgstr "" "Aukeratutako zerrendari buruzko informazio guztia ezabatzera doa eta\n" "ezin da berreskuratu izango." #: ../quodlibet/browsers/playlists/util.py:51 msgid "Enter a name for the new playlist:" msgstr "Idatzi erreprodukzio-zerrenda berriaren izena:" #: ../quodlibet/browsers/playlists/util.py:102 #, python-format msgid "" "Importing playlist.\n" "\n" "%(current)d/%(total)d songs added." msgstr "" "Erreprodukzio-zerrenda inportatzen.\n" "\n" "%(current)d/%(total)d kanta gehiturik." #: ../quodlibet/browsers/search.py:33 msgid "_Limit Results" msgstr "_Emaitza muga" #: ../quodlibet/browsers/search.py:48 msgid "Search Library" msgstr "Bilatu liburutegia" #: ../quodlibet/browsers/search.py:49 msgid "_Search Library" msgstr "_Bilatu liburutegia" #: ../quodlibet/browsers/soundcloud/main.py:38 #, fuzzy msgid "Soundcloud Browser" msgstr "Paneldun nabigatzailea" #: ../quodlibet/browsers/soundcloud/main.py:39 msgid "Sound_cloud" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:59 #: ../quodlibet/qltk/searchbar.py:73 msgid "Search" msgstr "Bilatu" #: ../quodlibet/browsers/soundcloud/main.py:136 #, python-format msgid "Go to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:380 #, fuzzy msgid "Connected" msgstr "kokapena" #: ../quodlibet/browsers/soundcloud/main.py:381 #, python-format msgid "Quod Libet is now connected, <b>%s</b>!" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:393 #, python-format msgid "Log out of %s" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:395 msgid "Enter code…" msgstr "" #: ../quodlibet/browsers/soundcloud/main.py:396 #, python-format msgid "Log in to %s" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:86 msgid "Soundcloud authorisation" msgstr "" #: ../quodlibet/browsers/soundcloud/util.py:87 msgid "Enter Soundcloud auth code:" msgstr "" #: ../quodlibet/cli.py:50 #, fuzzy msgid "Quod Libet is not running (add '--run' to start it)" msgstr "Quod Libet ez dago martxan." #: ../quodlibet/cli.py:85 msgid "a music library and player" msgstr "musika liburutegi eta erreproduzigailua" #: ../quodlibet/cli.py:86 #, fuzzy msgid "[option]" msgstr "[aukerak]" #: ../quodlibet/cli.py:88 msgid "Print the playing song and exit" msgstr "Erreproduzitzen den abestia inprimatu eta irten" #: ../quodlibet/cli.py:89 msgid "Begin playing immediately" msgstr "Segituan erreproduzitzen hasiko da" #: ../quodlibet/cli.py:90 msgid "Don't show any windows on start" msgstr "" #: ../quodlibet/cli.py:93 msgid "Jump to next song" msgstr "Salto hurrengo abestira" #: ../quodlibet/cli.py:95 msgid "Jump to previous song or restart if near the beginning" msgstr "Salto aurreko abestira, edota, hasieratik gertu balego, berrabiatu" #: ../quodlibet/cli.py:96 msgid "Jump to previous song" msgstr "Salto aurreko abestira" #: ../quodlibet/cli.py:97 msgid "Start playback" msgstr "Hasi erreproduzitzen" #: ../quodlibet/cli.py:98 msgid "Pause playback" msgstr "Gelditu erreproduzitzeaz" #: ../quodlibet/cli.py:99 msgid "Toggle play/pause mode" msgstr "Txandakatu erreproduzitu/gelditu modua" #: ../quodlibet/cli.py:100 #, fuzzy msgid "Stop playback" msgstr "Hasi erreproduzitzen" #: ../quodlibet/cli.py:101 msgid "Turn up volume" msgstr "Igo bolumena" #: ../quodlibet/cli.py:102 msgid "Turn down volume" msgstr "Beheratu bolumena" #: ../quodlibet/cli.py:103 msgid "Print player status" msgstr "Inprimatu erreproduzigailu egoera" #: ../quodlibet/cli.py:104 msgid "Hide main window" msgstr "Ezkutatu leiho nagusia" #: ../quodlibet/cli.py:105 msgid "Show main window" msgstr "Ikusi leiho nagusia" #: ../quodlibet/cli.py:106 msgid "Toggle main window visibility" msgstr "Txandakatu leiho nagusi ikusgarritasuna" #: ../quodlibet/cli.py:107 msgid "Focus the running player" msgstr "Fokoa ipini erreproduzigailua martxan" #: ../quodlibet/cli.py:108 msgid "Remove active browser filters" msgstr "Kendu nabigatzaile filtroak" #: ../quodlibet/cli.py:109 msgid "Refresh and rescan library" msgstr "Freskatu eta liburutegia berrarakatu" #: ../quodlibet/cli.py:110 #, fuzzy msgid "List available browsers" msgstr "Desgaitu nabigatzailea" #: ../quodlibet/cli.py:111 msgid "Print the current playlist" msgstr "Inprimatu uneko erreprodukzio-zerrenda" #: ../quodlibet/cli.py:112 msgid "Print the contents of the queue" msgstr "Inprimatu ilararen edukiak" #: ../quodlibet/cli.py:113 #, fuzzy msgid "Print the active text query" msgstr "Inprimatu ilararen edukiak" #: ../quodlibet/cli.py:114 msgid "Start without plugins" msgstr "Hasi pluginik gabe" #: ../quodlibet/cli.py:115 #, fuzzy msgid "Start Quod Libet if it isn't running" msgstr "Quod Libet ez dago martxan." #: ../quodlibet/cli.py:116 msgid "Exit Quod Libet" msgstr "Itxi Qoud Libet" #: ../quodlibet/cli.py:121 msgid "Seek within the playing song" msgstr "Bilatu jotzen ari den anestian" #: ../quodlibet/cli.py:121 msgid "[+|-][HH:]MM:SS" msgstr "[+|-][HH:]MM:SS" #: ../quodlibet/cli.py:122 #, fuzzy msgid "Set or toggle shuffle mode" msgstr "Txandakatu erreproduzitu/gelditu modua" #: ../quodlibet/cli.py:123 msgid "Turn repeat off, on, or toggle it" msgstr "Errepikapenak gaitu, desgaitu edo txanda" #: ../quodlibet/cli.py:124 msgid "Set the volume" msgstr "Ezarri bolumena" #: ../quodlibet/cli.py:125 msgid "Search your audio library" msgstr "Bilatu audio liburutegian" #: ../quodlibet/cli.py:125 ../quodlibet/cli.py:137 ../quodlibet/cli.py:141 #: ../quodlibet/cli.py:143 msgid "query" msgstr "bilaketa" #: ../quodlibet/cli.py:126 msgid "Play a file" msgstr "Erreproduzitu fitxategi bat" #: ../quodlibet/cli.py:126 ../quodlibet/cli.py:137 ../quodlibet/cli.py:143 #, fuzzy msgctxt "command" msgid "filename" msgstr "fitxategi-izena" #: ../quodlibet/cli.py:127 msgid "Rate the playing song" msgstr "Baloratu erreproduzitutako abestia" #: ../quodlibet/cli.py:128 msgid "Set the current browser" msgstr "Ezarri nabigatzailea" #: ../quodlibet/cli.py:129 #, fuzzy msgid "Stop after the playing song" msgstr "Baloratu erreproduzitutako abestia" #: ../quodlibet/cli.py:130 msgid "Open a new browser" msgstr "Ireki nabigatzaile berri bat" #: ../quodlibet/cli.py:131 msgid "Show or hide the queue" msgstr "Erakutsi edo ezkutatu ilara" #: ../quodlibet/cli.py:133 #, fuzzy msgid "Show or hide the main song list (deprecated)" msgstr "Erakutsi edo ezkutatu kanten zerrenda nagusia" #: ../quodlibet/cli.py:134 msgid "Filter on a random value" msgstr "Iragazi ausazko balio batez" #: ../quodlibet/cli.py:134 #, fuzzy msgctxt "command" msgid "tag" msgstr "Etiketa" #: ../quodlibet/cli.py:135 msgid "Filter on a tag value" msgstr "Iragazi etiketa balio batez" #: ../quodlibet/cli.py:135 msgid "tag=value" msgstr "etiketa=balioa" #: ../quodlibet/cli.py:136 msgid "Enqueue a file or query" msgstr "Ilaran ipini fitxategi bat edo bilatu" #: ../quodlibet/cli.py:138 msgid "Enqueue comma-separated files" msgstr "Ilaran ipini komaz bereiztutako fitxategiak" #: ../quodlibet/cli.py:139 ../quodlibet/util/tags.py:147 msgid "filename" msgstr "fitxategi-izena" #: ../quodlibet/cli.py:140 msgid "Print filenames of results of query to stdout" msgstr "Erakutsi bilaketaren emaitzen izenak" #: ../quodlibet/cli.py:142 msgid "Unqueue a file or query" msgstr "Ilaratik kendu fitxategi bat edo bilatu" #: ../quodlibet/cli.py:203 #, python-format msgid "Invalid argument for '%s'." msgstr "Argumentu baliogabea '%s'-rentzat." #: ../quodlibet/cli.py:204 ../quodlibet/util/__init__.py:190 #, python-format msgid "Try %s --help." msgstr "Saiatu %s --help." #: ../quodlibet/devices/_base.py:65 msgid "Unknown Device" msgstr "Gailu ezezaguna" #: ../quodlibet/devices/__init__.py:32 #, fuzzy, python-format msgid "Could not import %s, which is needed for device support." msgstr "Ezin da dbus-python inportatu, beharrezkoa da gailu euskarriarentzat." #: ../quodlibet/devices/__init__.py:153 #, python-format msgid "%r is not a supported device." msgstr "%r ez da onartzen den gailu bat." #: ../quodlibet/devices/__init__.py:245 ../quodlibet/devices/__init__.py:251 #, fuzzy, python-format msgid "Could not find '%s'." msgstr "%s: Ezin da media-player-info aurkitu." #: ../quodlibet/devices/__init__.py:450 msgid "Initializing device backend." msgstr "Gailu azpiegitura abiarazten." #: ../quodlibet/devices/__init__.py:451 #, python-format msgid "Trying '%s'" msgstr "'%s' saiatzen" #: ../quodlibet/devices/__init__.py:461 msgid "Couldn't connect to a device backend." msgstr "Ezin da gailu azpiegiturarekin konektatu." #: ../quodlibet/devices/__init__.py:463 msgid "Device backend initialized." msgstr "Gailu azpiegitura abiarazia." #: ../quodlibet/devices/storage.py:57 #, fuzzy msgid "_Filename pattern:" msgstr "_Fixategi-izen patroia:" #: ../quodlibet/devices/storage.py:61 msgid "Copy _album covers" msgstr "Kopiatu _album karatulak" #: ../quodlibet/devices/storage.py:65 msgid "_Remove unused covers and directories" msgstr "_Kendu erabili gabeko karatula eta direktorioak" #: ../quodlibet/errorreport/ui.py:60 #, fuzzy msgid "An Error Occurred" msgstr "Errore bat gertatu da" #: ../quodlibet/errorreport/ui.py:62 msgid "" "You can ignore this error, but the application might be unstable until it is " "restarted. Submitting an error report will only take a few seconds and would " "help us a lot." msgstr "" #: ../quodlibet/errorreport/ui.py:72 msgid "File Bug Report" msgstr "" #: ../quodlibet/errorreport/ui.py:74 ../quodlibet/errorreport/ui.py:90 msgid "Submit Error Report" msgstr "" #: ../quodlibet/errorreport/ui.py:75 msgid "Quit Program" msgstr "" #: ../quodlibet/errorreport/ui.py:76 #, fuzzy msgid "Ignore Error" msgstr "Baztertu errore _guztiak" #: ../quodlibet/errorreport/ui.py:80 msgid "Error details:" msgstr "" #: ../quodlibet/errorreport/ui.py:92 msgid "" "Various details regarding the error and your system will be send to a third " "party online service (<a href='https://www.sentry.io'>www.sentry.io</a>). " "You can review the data before sending it below." msgstr "" #: ../quodlibet/errorreport/ui.py:100 msgid "" "(optional) Please provide a short description of what happened when the " "error occurred:" msgstr "" #: ../quodlibet/errorreport/ui.py:109 msgid "_Send" msgstr "" #: ../quodlibet/errorreport/ui.py:115 #, fuzzy msgid "Short description…" msgstr "azalpena" #: ../quodlibet/errorreport/ui.py:118 msgid "Data to be sent:" msgstr "" #: ../quodlibet/exfalso.py:34 msgid "an audio tag editor" msgstr "audio etiketa editorea" #: ../quodlibet/exfalso.py:34 ../quodlibet/util/tags.py:148 msgid "directory" msgstr "direktorioa" #: ../quodlibet/ext/covers/artwork_url.py:19 msgid "Artwork URL Cover Source" msgstr "" #: ../quodlibet/ext/covers/artwork_url.py:20 msgid "" "Downloads covers linked to by the artwork_url tag.This works with the " "Soundcloud browser." msgstr "" #: ../quodlibet/ext/covers/discogs.py:25 #, fuzzy msgid "Discogs Cover Source" msgstr "MusicBrainz pista IDa" #: ../quodlibet/ext/covers/discogs.py:26 msgid "Downloads covers from Discogs." msgstr "" #: ../quodlibet/ext/covers/lastfm.py:22 msgid "Last.fm Cover Source" msgstr "" #: ../quodlibet/ext/covers/lastfm.py:23 msgid "Downloads covers from Last.fm's cover art archive." msgstr "" #: ../quodlibet/ext/covers/musicbrainz.py:19 #, fuzzy msgid "MusicBrainz Cover Source" msgstr "MusicBrainz pista IDa" #: ../quodlibet/ext/covers/musicbrainz.py:20 msgid "Downloads covers from MusicBrainz's cover art archive." msgstr "" #: ../quodlibet/ext/editing/iconv.py:26 #, fuzzy msgid "Convert Encodings" msgstr "[Kodeketa baliogabea]" #: ../quodlibet/ext/editing/iconv.py:27 msgid "Fixes misinterpreted tag value encodings in the tag editor." msgstr "" #: ../quodlibet/ext/editing/iconv.py:33 msgid "_Convert Encoding…" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:25 msgid "Kana/Kanji Simple Inverter" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:26 msgid "Converts kana/kanji to romaji before renaming." msgstr "" #: ../quodlibet/ext/editing/kakasi.py:35 msgid "Romanize _Japanese text" msgstr "" #: ../quodlibet/ext/editing/kakasi.py:63 msgid "Couldn't find the 'Kanji Kana Simple Inverter' (kakasi)." msgstr "" #: ../quodlibet/ext/editing/resub.py:18 msgid "Regex Substitution" msgstr "" #: ../quodlibet/ext/editing/resub.py:19 msgid "" "Allows arbitrary regex substitutions (s///) when tagging or renaming files." msgstr "" #: ../quodlibet/ext/editing/titlecase.py:20 #, fuzzy msgid "Title Case" msgstr "Titulua" #: ../quodlibet/ext/editing/titlecase.py:21 #, fuzzy msgid "Title-cases tag values in the tag editor." msgstr "Audio etiketa editorea" #: ../quodlibet/ext/editing/titlecase.py:40 #, fuzzy msgid "Title-_case Value" msgstr "_Titulu-gisako etiketak" #: ../quodlibet/ext/editing/titlecase.py:51 msgid "Allow _ALL-CAPS in tags" msgstr "" #: ../quodlibet/ext/editing/titlecase.py:52 #, fuzzy msgid "_Human title case" msgstr "Gaitu _gizakizko izenburu larritasuna" #: ../quodlibet/ext/editing/titlecase.py:53 msgid "" "Uses common English rules for title casing, as in \"Dark Night of the Soul\"" msgstr "" "Erabili ingelesezko arau arruntak letra larrientzat, \"Dark Night of the " "Soul\" gisa" #: ../quodlibet/ext/events/advanced_preferences.py:69 #, fuzzy msgid "Advanced Preferences" msgstr "Paneldun nabigatzaile hobespenak" #: ../quodlibet/ext/events/advanced_preferences.py:70 msgid "Allow editing of advanced config settings." msgstr "" #: ../quodlibet/ext/events/advanced_preferences.py:162 msgid "I know what I'm doing" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:27 msgid "Animated On-Screen Display" msgstr "" #: ../quodlibet/ext/events/animosd/main.py:28 msgid "Displays song information on your screen when it changes." msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:153 msgid "Top of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:154 msgid "Middle of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:155 msgid "Bottom of screen" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:158 msgid "_Position:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:171 #, fuzzy msgid "_Cover size:" msgstr "Tamaina guztira:" #: ../quodlibet/ext/events/animosd/prefs.py:177 #: ../quodlibet/ext/events/lyricswindow.py:334 ../quodlibet/qltk/prefs.py:266 #, fuzzy msgid "Display" msgstr "Editatu bistaratzea" #: ../quodlibet/ext/events/animosd/prefs.py:190 msgid "_Font:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:195 msgid "Left" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:196 msgid "Center" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:197 #, fuzzy msgid "Right" msgstr "_Tamaina" #: ../quodlibet/ext/events/animosd/prefs.py:200 msgid "_Align text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:206 msgid "Text" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:217 msgid "_Text:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:227 msgid "_Fill:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:232 #: ../quodlibet/ext/events/synchronizedlyrics.py:63 msgid "Colors" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:240 msgid "_Shadows" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:241 #, fuzzy msgid "_Outline" msgstr "_Irteera kanalizazioa:" #: ../quodlibet/ext/events/animosd/prefs.py:242 msgid "Rou_nded Corners" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:258 msgid "_Delay:" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:264 #: ../quodlibet/qltk/pluginwin.py:172 msgid "Effects" msgstr "" #: ../quodlibet/ext/events/animosd/prefs.py:270 #, fuzzy msgid "Ed_it Display Pattern…" msgstr "Editatu bistaratzea" #: ../quodlibet/ext/events/animosd/prefs.py:274 #: ../quodlibet/ext/events/trayicon/prefs.py:78 #, fuzzy msgid "Preview" msgstr "_Aurreikusi" #: ../quodlibet/ext/events/auto_library_update.py:136 msgid "Automatic Library Update" msgstr "" #: ../quodlibet/ext/events/auto_library_update.py:137 #, python-format msgid "Keeps your library up to date with inotify. Requires %s." msgstr "" #: ../quodlibet/ext/events/automask.py:22 #, fuzzy msgid "Automatic Masking" msgstr "Automati_koa" #: ../quodlibet/ext/events/automask.py:23 msgid "" "Automatically masks and unmasks drives when they are unmounted or mounted." msgstr "" #: ../quodlibet/ext/events/autorating.py:15 #, fuzzy msgid "Automatic Rating" msgstr "Automati_koa" #: ../quodlibet/ext/events/autorating.py:16 msgid "" "Rates songs automatically when they are played or skipped. This uses the " "'accelerated' algorithm from vux by Brian Nelson." msgstr "" #: ../quodlibet/ext/events/clock.py:24 msgid "Alarm Clock" msgstr "" #: ../quodlibet/ext/events/clock.py:25 msgid "Wakes you up with loud music." msgstr "" #: ../quodlibet/ext/events/clock.py:119 msgid "Lullaby" msgstr "" #: ../quodlibet/ext/events/clock.py:120 msgid "Fades out and pauses your music." msgstr "" #: ../quodlibet/ext/events/equalizer.py:26 msgid "Flat" msgstr "" #: ../quodlibet/ext/events/equalizer.py:27 msgid "Live" msgstr "" #: ../quodlibet/ext/events/equalizer.py:29 msgid "Full Bass & Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:32 msgid "Club" msgstr "" #: ../quodlibet/ext/events/equalizer.py:34 msgid "Large Hall" msgstr "" #: ../quodlibet/ext/events/equalizer.py:36 msgid "Party" msgstr "" #: ../quodlibet/ext/events/equalizer.py:40 msgid "Soft" msgstr "" #: ../quodlibet/ext/events/equalizer.py:42 msgid "Full Bass" msgstr "" #: ../quodlibet/ext/events/equalizer.py:48 #, fuzzy msgid "Reggae" msgstr "Reggaeton" #: ../quodlibet/ext/events/equalizer.py:50 msgid "Headphones" msgstr "" #: ../quodlibet/ext/events/equalizer.py:53 #, fuzzy msgid "Soft Rock" msgstr "Rock" #: ../quodlibet/ext/events/equalizer.py:55 msgid "Full Treble" msgstr "" #: ../quodlibet/ext/events/equalizer.py:58 msgid "Dance" msgstr "" #: ../quodlibet/ext/events/equalizer.py:62 msgid "Techno" msgstr "" #: ../quodlibet/ext/events/equalizer.py:64 msgid "Ska" msgstr "" #: ../quodlibet/ext/events/equalizer.py:66 msgid "Laptop" msgstr "" #: ../quodlibet/ext/events/equalizer.py:97 msgid "Equalizer" msgstr "" #: ../quodlibet/ext/events/equalizer.py:98 msgid "" "Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels (right-click resets the band)." msgstr "" #: ../quodlibet/ext/events/equalizer.py:132 #, fuzzy msgid "The current backend does not support equalization." msgstr "" "Uneko audio azpiegiturak ez ditu URLak onartzen, audio jario nabigatzailea " "ezgaiturik." #: ../quodlibet/ext/events/equalizer.py:138 #, python-format msgid "%.1f kHz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:139 #: ../quodlibet/ext/gstreamer/crossfeed.py:93 #: ../quodlibet/ext/gstreamer/karaoke.py:95 #, python-format msgid "%d Hz" msgstr "" #: ../quodlibet/ext/events/equalizer.py:173 #: ../quodlibet/ext/gstreamer/crossfeed.py:112 #, fuzzy, python-format msgid "%.1f dB" msgstr "segundo %d" #: ../quodlibet/ext/events/equalizer.py:192 #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom" msgstr "_Personalizatu" #: ../quodlibet/ext/events/equalizer.py:199 #, fuzzy msgid "_Clear" msgstr "_Garbitu errorea" #. Translators: statuses relating to Instant Messenger apps #: ../quodlibet/ext/events/gajim_status.py:27 msgid "online" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:28 msgid "offline" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:29 msgid "chat" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:30 msgid "away" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:31 msgid "xa" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:32 msgid "invisible" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:37 msgid "Gajim Status Message" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:38 msgid "" "Changes Gajim status message according to what you are currently listening " "to." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:114 #: ../quodlibet/ext/events/mqtt.py:45 #: ../quodlibet/ext/events/telepathy_status.py:69 msgid "paused" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:154 msgid "" "List accounts, separated by spaces, for changing status message. If none are " "specified, status message of all accounts will be changed." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:160 msgid "Add '[paused]'" msgstr "" #: ../quodlibet/ext/events/gajim_status.py:163 msgid "If checked, '[paused]' will be added to status message on pause." msgstr "" #: ../quodlibet/ext/events/gajim_status.py:187 msgid "Statuses for which message will be changed" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:156 msgid "Pause on Headphone Unplug" msgstr "" #: ../quodlibet/ext/events/headphonemon.py:157 msgid "" "Pauses in case headphones get unplugged and unpauses in case they get " "plugged in again." msgstr "" #: ../quodlibet/ext/events/inhibit.py:41 msgid "Inhibit Screensaver" msgstr "" #: ../quodlibet/ext/events/inhibit.py:42 msgid "Prevents the GNOME screensaver from activating while a song is playing." msgstr "" #: ../quodlibet/ext/events/inhibit.py:51 #, fuzzy msgid "Music is playing" msgstr "Musika erreproduzigailua" #: ../quodlibet/ext/events/iradiolog.py:16 #, fuzzy msgid "Internet Radio Log" msgstr "Internet irratia" #: ../quodlibet/ext/events/iradiolog.py:17 msgid "" "Records the last 10 songs played on radio stations, and lists them in the " "seek context menu." msgstr "" #: ../quodlibet/ext/events/jep118.py:29 msgid "JEP-118" msgstr "" #: ../quodlibet/ext/events/jep118.py:30 msgid "Outputs a Jabber User Tunes file to ~/.quodlibet/jabber." msgstr "" #: ../quodlibet/ext/events/language.py:21 #, fuzzy msgid "Change Language" msgstr "_Balorazioa" #: ../quodlibet/ext/events/language.py:22 msgid "Change the user interface language." msgstr "" #: ../quodlibet/ext/events/language.py:43 #, fuzzy msgid "System Default" msgstr "Berezkoa" #: ../quodlibet/ext/events/language.py:70 msgid "A restart is required for any changes to take effect" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:199 #, fuzzy msgid "No active song" msgstr "Ezin da abestia gorde" #: ../quodlibet/ext/events/lyricswindow.py:215 #, fuzzy msgid "No lyrics found" msgstr "Ez da pluginik aurkitu." #: ../quodlibet/ext/events/lyricswindow.py:227 #, fuzzy msgid "Lyrics:" msgstr "Hitzak" #: ../quodlibet/ext/events/lyricswindow.py:284 msgid "_Zoom level:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:302 msgid "URL:" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:307 msgid "Revert to default" msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:322 msgid "Search via above URL if the lyrics couldn't be found in LyricsWikia." msgstr "" #: ../quodlibet/ext/events/lyricswindow.py:339 #, fuzzy msgid "Alternate search" msgstr "Garbitu bilaketa" #: ../quodlibet/ext/events/lyricswindow.py:347 #, fuzzy msgid "Lyrics Window" msgstr "Hitzak" #: ../quodlibet/ext/events/lyricswindow.py:348 msgid "Shows a window containing lyrics of the playing song." msgstr "" #: ../quodlibet/ext/events/mediaserver.py:38 msgid "UPnP AV Media Server" msgstr "" #: ../quodlibet/ext/events/mediaserver.py:39 msgid "" "Exposes all albums to the Rygel UPnP Media Server through the MediaServer2 D-" "Bus interface." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:61 msgid "MPD Server" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:62 msgid "" "Allows remote control of Quod Libet using an MPD Client. Streaming, playlist " "and library management are not supported." msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:76 msgid "_Port:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:119 msgid "Local _IP:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:125 msgid "P_assword:" msgstr "" #: ../quodlibet/ext/events/mpdserver/__init__.py:161 #, fuzzy msgid "Connection" msgstr "kokapena" #: ../quodlibet/ext/events/mpdserver/__init__.py:163 msgid "Tested Clients" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:38 msgid "MPRIS D-Bus Support" msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:39 msgid "" "Allows control of Quod Libet using the MPRIS 1.0/2.0 D-Bus Interface " "Specification." msgstr "" #: ../quodlibet/ext/events/mpris/__init__.py:45 #: ../quodlibet/ext/events/trayicon/prefs.py:30 #, fuzzy msgid "Hide main window on close" msgstr "Ezkutatu leiho nagusia" #: ../quodlibet/ext/events/mpris/__init__.py:48 #: ../quodlibet/ext/events/themeswitcher.py:84 #: ../quodlibet/ext/gstreamer/compressor.py:99 #: ../quodlibet/ext/gstreamer/crossfeed.py:136 #: ../quodlibet/ext/gstreamer/karaoke.py:99 #: ../quodlibet/ext/gstreamer/pitch.py:83 ../quodlibet/qltk/prefs.py:688 #, fuzzy msgid "Preferences" msgstr "Hobespenak" #: ../quodlibet/ext/events/mqtt.py:50 #, python-format msgid "Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/mqtt.py:56 msgid "MQTT Publisher" msgstr "" #: ../quodlibet/ext/events/mqtt.py:57 msgid "Publishes status messages to an MQTT topic." msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "Broker hostname" msgstr "" #: ../quodlibet/ext/events/mqtt.py:122 msgid "broker hostname / IP" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "Broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:124 msgid "broker port" msgstr "" #: ../quodlibet/ext/events/mqtt.py:126 msgid "Topic" msgstr "" #: ../quodlibet/ext/events/mqtt.py:128 #, fuzzy msgid "Playing Pattern" msgstr "Bide patroiak" #: ../quodlibet/ext/events/mqtt.py:130 msgid "Status text when a song is started." msgstr "" #: ../quodlibet/ext/events/mqtt.py:132 #, fuzzy msgid "Paused Pattern" msgstr "Bide patroiak" #: ../quodlibet/ext/events/mqtt.py:134 msgid "Text when a song is paused." msgstr "" #: ../quodlibet/ext/events/mqtt.py:136 #, fuzzy msgid "No-song Text" msgstr "kanta %d" #: ../quodlibet/ext/events/mqtt.py:138 msgid "Plain text for when there is no current song" msgstr "" #: ../quodlibet/ext/events/mqtt.py:149 #, fuzzy msgid "MQTT Configuration" msgstr "Erregistro irteera" #: ../quodlibet/ext/events/mqtt.py:153 #, fuzzy msgid "Status Text" msgstr "Bide patroiak" #: ../quodlibet/ext/events/mqtt.py:185 #, python-format msgid "Connected to broker at %(host)s:%(port)d" msgstr "" #: ../quodlibet/ext/events/mqtt.py:189 #, fuzzy, python-format msgid "Couldn't connect to %(host)s:%(port)d (%(msg)s" msgstr "Ezin da gailu azpiegiturarekin konektatu." #: ../quodlibet/ext/events/mqtt.py:192 #, fuzzy msgid "Connection error" msgstr "kokapena" #: ../quodlibet/ext/events/notify.py:80 msgid "Notification text" msgstr "" #: ../quodlibet/ext/events/notify.py:88 #, fuzzy msgid "_Title:" msgstr "Titulua" #: ../quodlibet/ext/events/notify.py:99 ../quodlibet/ext/events/notify.py:128 msgid "Revert to default pattern" msgstr "" #: ../quodlibet/ext/events/notify.py:118 msgid "_Body:" msgstr "" #: ../quodlibet/ext/events/notify.py:138 msgid "_Show notification" msgstr "" #: ../quodlibet/ext/events/notify.py:156 msgid "Show notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:162 msgid "Only on <i>_manual</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:170 msgid "Only on <i>_automatic</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:178 msgid "On <i>a_ll</i> song changes" msgstr "" #: ../quodlibet/ext/events/notify.py:196 msgid "Only when the main window is not _focused" msgstr "" #: ../quodlibet/ext/events/notify.py:204 msgid "Show \"_Next\" button" msgstr "" #: ../quodlibet/ext/events/notify.py:236 msgid "Connection Error" msgstr "" #: ../quodlibet/ext/events/notify.py:237 ../quodlibet/ext/events/notify.py:391 #: ../quodlibet/ext/events/notify.py:433 #, fuzzy msgid "Couldn't connect to notification daemon." msgstr "Ezin da gailu azpiegiturarekin konektatu." #: ../quodlibet/ext/events/notify.py:251 msgid "Song Notifications" msgstr "" #: ../quodlibet/ext/events/notify.py:252 msgid "Displays a notification when the song changes." msgstr "" #: ../quodlibet/ext/events/notify.py:415 ../quodlibet/qltk/unity.py:65 msgid "Next" msgstr "Hurrengoa" #: ../quodlibet/ext/events/qlscrobbler.py:178 msgid "" "Please visit the Plugins window to set QLScrobbler up. Until then, songs " "will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:254 #, fuzzy, python-format msgid "Could not contact service '%s'." msgstr "Ezin da gailu azpiegiturarekin konektatu." #: ../quodlibet/ext/events/qlscrobbler.py:260 msgid "Authentication failed: invalid URL." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:277 #, python-format msgid "Authentication failed: Invalid username '%s' or bad password." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:282 msgid "Client is banned. Contact the author." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:286 msgid "Wrong system time. Submissions may fail until it is corrected." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:351 msgid "AudioScrobbler Submission" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:352 msgid "" "Audioscrobbler client for Last.fm, Libre.fm and other Audioscrobbler " "services." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:450 msgid "Authentication successful." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "_Service:" msgstr "Gailua:" #: ../quodlibet/ext/events/qlscrobbler.py:462 msgid "_URL:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:462 #, fuzzy msgid "User_name:" msgstr "Ize_na:" #: ../quodlibet/ext/events/qlscrobbler.py:463 msgid "_Password:" msgstr "" #. Translators: Other service #: ../quodlibet/ext/events/qlscrobbler.py:479 #, fuzzy msgid "Other…" msgstr "_Besteak:" #. verify data #: ../quodlibet/ext/events/qlscrobbler.py:517 msgid "_Verify account data" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:522 #: ../quodlibet/ext/songsmenu/lastfmsync.py:304 msgid "Account" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Artist pattern:" msgstr "_Artista" #: ../quodlibet/ext/events/qlscrobbler.py:530 #, fuzzy msgid "_Title pattern:" msgstr "_Fixategi-izen patroia:" #: ../quodlibet/ext/events/qlscrobbler.py:531 msgid "Exclude _filter:" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:549 msgid "" "The pattern used to format the artist name for submission. Leave blank for " "default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:559 msgid "" "The pattern used to format the title for submission. Leave blank for default." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:568 msgid "Songs matching this filter will not be submitted." msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:576 msgid "_Offline mode (don't submit anything)" msgstr "" #: ../quodlibet/ext/events/qlscrobbler.py:580 msgid "Submission" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:20 msgid "Mute Radio Ads" msgstr "" #: ../quodlibet/ext/events/radioadmute.py:21 msgid "" "Mutes output while radio advertisements are playing.\n" "Stations: di.fm." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:27 #, fuzzy msgid "Random Album Playback" msgstr "Ausazko Al_buma" #: ../quodlibet/ext/events/randomalbum.py:28 msgid "" "Starts a random album when your playlist reaches its end. It requires that " "your active browser supports filtering by album." msgstr "" #: ../quodlibet/ext/events/randomalbum.py:38 msgid "Rated higher" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:39 msgid "Played more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:40 msgid "Skipped more often" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:41 msgid "Played more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:42 msgid "Started more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:43 msgid "Added more recently" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:44 #, fuzzy msgid "Longer albums" msgstr "album" #: ../quodlibet/ext/events/randomalbum.py:83 msgid "seconds before starting next album" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:87 #, fuzzy msgid "Weights" msgstr "_Tamaina" #: ../quodlibet/ext/events/randomalbum.py:89 msgid "Play some albums more than others" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:103 msgid "avoid" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:114 msgid "prefer" msgstr "" #: ../quodlibet/ext/events/randomalbum.py:201 #, fuzzy msgid "Random Album" msgstr "Ausazko Al_buma" #: ../quodlibet/ext/events/randomalbum.py:202 #, python-format msgid "Waiting to start %s" msgstr "" #: ../quodlibet/ext/events/rbimport.py:114 #, fuzzy msgid "Import Failed" msgstr "Inportatu erreprodukzio-zerrenda" #: ../quodlibet/ext/events/rbimport.py:119 #, python-format msgid "Successfully imported ratings and statistics for %d songs" msgstr "" #: ../quodlibet/ext/events/rbimport.py:127 msgid "Rhythmbox Import" msgstr "" #: ../quodlibet/ext/events/rbimport.py:128 msgid "Imports ratings and song statistics from Rhythmbox." msgstr "" #: ../quodlibet/ext/events/rbimport.py:132 #, fuzzy msgid "Start Import" msgstr "_Inporatu" #: ../quodlibet/ext/events/screensaver.py:25 msgid "Screensaver Pause" msgstr "" #: ../quodlibet/ext/events/screensaver.py:26 msgid "Pauses playback while the GNOME screensaver is active." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:73 msgid "No GNOME Shell search provider for Quod Libet installed." msgstr "" #: ../quodlibet/ext/events/searchprovider.py:79 msgid "GNOME Search Provider" msgstr "" #: ../quodlibet/ext/events/searchprovider.py:80 msgid "Allows GNOME Shell to search the library." msgstr "" #: ../quodlibet/ext/events/seekbar.py:122 #, fuzzy msgid "Alternative Seek Bar" msgstr "Alternatiboa" #: ../quodlibet/ext/events/seekbar.py:123 msgid "" "Alternative seek bar which is always visible and spans the whole window " "width." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:28 msgid "Squeezebox Sync" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:29 msgid "" "Makes Logitech Squeezebox mirror Quod Libet output, provided both read from " "an identical library." msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:57 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:90 msgid "Error finding Squeezebox server" msgstr "" #: ../quodlibet/ext/events/squeezebox_sync.py:58 #: ../quodlibet/ext/playlist/export_to_squeezebox.py:91 #, python-format msgid "Error finding %s. Please check settings" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:34 #, fuzzy msgid "Synchronized Lyrics" msgstr "Hitzak" #: ../quodlibet/ext/events/synchronizedlyrics.py:35 msgid "Shows synchronized lyrics from .lrc file with same name as the track." msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:66 msgid "Text:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:76 msgid "Background:" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:87 msgid "Font" msgstr "" #: ../quodlibet/ext/events/synchronizedlyrics.py:90 msgid "Size (px):" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:62 msgid "Telepathy Status Messages" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:63 msgid "" "Updates all Telepathy-based IM accounts (as configured in Empathy etc) with " "a status message based on current song." msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:122 #, fuzzy msgid "Playing:" msgstr "Ez da erreproduzitzen" #: ../quodlibet/ext/events/telepathy_status.py:123 #, python-format msgid "Status text when a song is started. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:139 msgid "Paused:" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:140 #, python-format msgid "Status text when a song is paused. Accepts QL Patterns e.g. %s" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:156 msgid "Plain text for status when there is no current song" msgstr "" #: ../quodlibet/ext/events/telepathy_status.py:157 #, fuzzy msgid "No song:" msgstr "kanta %d" #. Frame #: ../quodlibet/ext/events/telepathy_status.py:164 #, fuzzy msgid "Status Patterns" msgstr "Bide patroiak" #: ../quodlibet/ext/events/themeswitcher.py:25 msgid "Theme Switcher" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:26 msgid "Changes the active GTK+ theme." msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:49 msgid "_Theme:" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:54 msgid "Default Theme" msgstr "" #: ../quodlibet/ext/events/themeswitcher.py:66 msgid "Prefer dark theme version" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:18 msgid "Toggle Menu Bar" msgstr "" #: ../quodlibet/ext/events/toggle_menu.py:19 msgid "Toggle the menu bar by pressing the Alt key." msgstr "" #: ../quodlibet/ext/events/trayicon/appindicator.py:77 #: ../quodlibet/ext/events/trayicon/prefs.py:98 #: ../quodlibet/ext/events/trayicon/systemtray.py:177 #: ../quodlibet/qltk/info.py:47 msgid "Not playing" msgstr "Ez da erreproduzitzen" #: ../quodlibet/ext/events/trayicon/__init__.py:53 msgid "Tray Icon" msgstr "" #: ../quodlibet/ext/events/trayicon/__init__.py:54 msgid "Controls Quod Libet from the system tray." msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:41 #, python-format msgid "_Show %(application-name)s" msgstr "" #: ../quodlibet/ext/events/trayicon/menu.py:60 #: ../quodlibet/qltk/quodlibetwindow.py:183 #: ../quodlibet/qltk/quodlibetwindow.py:1046 #: ../quodlibet/qltk/quodlibetwindow.py:1238 #, fuzzy msgid "_Play" msgstr "_Erreprodukzio-zerrendak" #: ../quodlibet/ext/events/trayicon/menu.py:63 #: ../quodlibet/qltk/quodlibetwindow.py:185 #: ../quodlibet/qltk/quodlibetwindow.py:1240 ../quodlibet/qltk/wlw.py:51 #, fuzzy msgid "P_ause" msgstr "Erreproduzigailua" #: ../quodlibet/ext/events/trayicon/menu.py:68 #: ../quodlibet/qltk/quodlibetwindow.py:190 #: ../quodlibet/qltk/quodlibetwindow.py:1041 #, fuzzy msgid "Pre_vious" msgstr "_Aurreikusi" #: ../quodlibet/ext/events/trayicon/menu.py:71 #: ../quodlibet/qltk/quodlibetwindow.py:194 #: ../quodlibet/qltk/quodlibetwindow.py:1051 #, fuzzy msgid "_Next" msgstr "Hurrengoa" #: ../quodlibet/ext/events/trayicon/menu.py:76 msgid "_Shuffle" msgstr "_Ausaz" #: ../quodlibet/ext/events/trayicon/menu.py:81 msgid "_Repeat" msgstr "E_rrepikatu" #: ../quodlibet/ext/events/trayicon/menu.py:86 #, fuzzy msgid "Stop _After This Song" msgstr "Gelditu kanta honen ondoren" #: ../quodlibet/ext/events/trayicon/menu.py:92 #: ../quodlibet/qltk/quodlibetwindow.py:1012 #, fuzzy msgid "Open _Browser" msgstr "Ireki nabigatzaile berri bat" #: ../quodlibet/ext/events/trayicon/menu.py:103 #: ../quodlibet/qltk/quodlibetwindow.py:1031 ../quodlibet/qltk/songsmenu.py:410 msgid "Edit _Tags" msgstr "Editatu etiketak" #: ../quodlibet/ext/events/trayicon/menu.py:112 #: ../quodlibet/qltk/quodlibetwindow.py:975 ../quodlibet/qltk/songsmenu.py:423 #, fuzzy msgid "_Information" msgstr "Informazioa" #: ../quodlibet/ext/events/trayicon/menu.py:114 #: ../quodlibet/qltk/songsmenu.py:339 #, fuzzy msgid "Play_lists" msgstr "Erreprodukzio-zerrendak" #: ../quodlibet/ext/events/trayicon/menu.py:132 #: ../quodlibet/qltk/quodlibetwindow.py:1026 msgid "_Quit" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:32 ../quodlibet/qltk/prefs.py:69 msgid "Behavior" msgstr "Portaera" #: ../quodlibet/ext/events/trayicon/prefs.py:42 msgid "Scroll wheel adjusts volume" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:48 msgid "Scroll wheel changes song" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:54 msgid "Scroll _Wheel" msgstr "" #: ../quodlibet/ext/events/trayicon/prefs.py:84 #, fuzzy msgid "Tooltip Display" msgstr "Editatu bistaratzea" #: ../quodlibet/ext/events/viewlyrics.py:23 #, fuzzy msgid "View Lyrics" msgstr "Hitzak" #: ../quodlibet/ext/events/viewlyrics.py:24 msgid "Automatically displays lyrics beneath the song list in the main window." msgstr "" #: ../quodlibet/ext/events/viewlyrics.py:29 #, fuzzy msgid "_Lyrics" msgstr "Hitzak" #: ../quodlibet/ext/events/visualisations.py:36 msgid "Launch Visualisations" msgstr "" #: ../quodlibet/ext/events/visualisations.py:38 msgid "Launch external visualisations." msgstr "" #: ../quodlibet/ext/events/visualisations.py:55 #, python-format msgid "Couldn't run visualisations using '%s'" msgstr "" #: ../quodlibet/ext/events/visualisations.py:57 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:44 #, fuzzy msgid "Error" msgstr "Erroreak" #: ../quodlibet/ext/events/visualisations.py:76 msgid "Visualiser executable:" msgstr "" #: ../quodlibet/ext/events/visualisations.py:91 msgid "Reload" msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:410 #, fuzzy msgid "Waveform Seek Bar" msgstr "Alternatiboa" #: ../quodlibet/ext/events/waveformseekbar.py:414 msgid "A seekbar in the shape of the waveform of the current song." msgstr "" #: ../quodlibet/ext/events/waveformseekbar.py:447 msgid "Override foreground color:" msgstr "" #: ../quodlibet/ext/events/write_cover.py:32 msgid "Picture Saver" msgstr "" #: ../quodlibet/ext/events/write_cover.py:33 msgid "Saves the cover image of the current song to a file." msgstr "" #: ../quodlibet/ext/events/write_cover.py:66 #, fuzzy msgid "File:" msgstr "Fixategiak" #: ../quodlibet/ext/gstreamer/compressor.py:20 msgid "_Threshold:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:21 msgid "Threshold until the filter is activated" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "R_atio:" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:22 msgid "Compression ratio" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:74 #: ../quodlibet/ext/gstreamer/karaoke.py:91 #, python-format msgid "%d %%" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:105 msgid "Audio Compressor" msgstr "" #: ../quodlibet/ext/gstreamer/compressor.py:106 msgid "" "Changes the amplitude of all samples above a specific threshold with a " "specific ratio." msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "_Preset:" msgstr "_Aurreikusi" #: ../quodlibet/ext/gstreamer/crossfeed.py:19 #, fuzzy msgid "Filter preset" msgstr "Iragazi _artistaz" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "_Frequency cut:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:20 msgid "Low-pass filter cut frequency" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed _level:" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:21 msgid "Feed level" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:25 #, fuzzy msgid "Default" msgstr "Berezkoa" #: ../quodlibet/ext/gstreamer/crossfeed.py:26 msgid "Closest to virtual speaker placement (30°, 3 meter)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:27 msgid "Chu Moy" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:28 msgid "Close to Chu Moy's crossfeeder (popular)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:29 msgid "Jan Meier" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:30 msgid "Close to Jan Meier's CORDA amplifiers (little change)" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:31 #, fuzzy msgid "Custom settings" msgstr "_Personalizatu" #: ../quodlibet/ext/gstreamer/crossfeed.py:152 msgid "Crossfeed" msgstr "" #: ../quodlibet/ext/gstreamer/crossfeed.py:153 msgid "" "Mixes the left and right channel in a way that simulates a speaker setup " "while using headphones, or to adjust for early Stereo recordings." msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:20 #, fuzzy msgid "Filter _band:" msgstr "Iragazi _generoz" #: ../quodlibet/ext/gstreamer/karaoke.py:21 msgid "The Frequency band of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:22 #, fuzzy msgid "Filter _width:" msgstr "Iragazi _artistaz" #: ../quodlibet/ext/gstreamer/karaoke.py:23 msgid "The Frequency width of the filter" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "_Level:" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:24 msgid "Level of the effect" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:105 msgid "Karaoke" msgstr "" #: ../quodlibet/ext/gstreamer/karaoke.py:106 msgid "Removes main vocals from audio." msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:16 msgid "Mono Downmix" msgstr "" #: ../quodlibet/ext/gstreamer/mono.py:17 msgid "Downmixes audio channels to mono." msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:20 msgid "R_ate:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:21 msgid "_Tempo:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:22 msgid "_Pitch:" msgstr "" #: ../quodlibet/ext/gstreamer/pitch.py:89 #, fuzzy msgid "Audio Pitch / Speed" msgstr "Audio jarioak" #: ../quodlibet/ext/gstreamer/pitch.py:90 #, fuzzy msgid "Controls the pitch of an audio stream." msgstr "Idatzi audio jarioaren kokapena:" #: ../quodlibet/ext/playlist/export_to_folder.py:29 #: ../quodlibet/ext/playlist/export_to_folder.py:97 #: ../quodlibet/ext/playlist/export_to_folder.py:138 #, fuzzy msgid "Export Playlist to Folder" msgstr "Inportatu erreprodukzio-zerrenda" #: ../quodlibet/ext/playlist/export_to_folder.py:38 #, fuzzy msgid "_Export" msgstr "_Inporatu" #: ../quodlibet/ext/playlist/export_to_folder.py:43 #, fuzzy msgid "Destination folder:" msgstr "Ez da katerik aurkitu" #: ../quodlibet/ext/playlist/export_to_folder.py:58 #, fuzzy msgid "Filename pattern:" msgstr "_Fixategi-izen patroia:" #: ../quodlibet/ext/playlist/export_to_folder.py:99 msgid "Exports a playlist by copying files to a folder." msgstr "" #: ../quodlibet/ext/playlist/export_to_folder.py:156 #, fuzzy msgid "Default filename pattern:" msgstr "_Fixategi-izen patroia:" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:23 msgid "Export to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:25 msgid "" "Dynamically exports a playlist to Logitech Squeezebox playlist, provided " "both share a directory structure. Shares configuration with <a href=" "\"quodlibet:///prefs/plugins/Squeezebox Output\">Squeezebox Sync plugin</a>." msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:79 msgid "Export playlist to Squeezebox" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:80 msgid "Playlist name (will overwrite existing)" msgstr "" #: ../quodlibet/ext/playlist/export_to_squeezebox.py:97 msgid "Export to Squeezebox playlist" msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:20 #, fuzzy msgid "Remove Playlist Duplicates" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/playlist/remove_duplicates.py:21 msgid "Removes duplicate entries in a playlist." msgstr "" #: ../quodlibet/ext/playlist/remove_duplicates.py:49 #, fuzzy, python-format msgid "Are you sure you want to remove %d duplicate song?" msgid_plural "Are you sure you want to remove %d duplicate songs?" msgstr[0] "" "%d abestiren balorazioa aldatzera zoaz.\n" "Jarraitu nahi duzu?" msgstr[1] "" "%d abestiren balorazioa aldatzera zoaz.\n" "Jarraitu nahi duzu?" #: ../quodlibet/ext/playlist/remove_duplicates.py:52 #, python-format msgid "The duplicate songs will be removed from the playlist '%s'." msgstr "Kanta bikoiztuak '%s' zerrendatik ezabatuko dira." #: ../quodlibet/ext/playlist/shuffle.py:15 #, fuzzy msgid "Shuffle Playlist" msgstr "Sortu erreprodukzio-zerrenda" #: ../quodlibet/ext/playlist/shuffle.py:16 msgid "Randomly shuffles a playlist." msgstr "" #: ../quodlibet/ext/playorder/follow.py:18 msgid "Follow Cursor" msgstr "" #: ../quodlibet/ext/playorder/follow.py:20 msgid "" "Playback follows your selection, or the next song in the list once exhausted." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:22 msgid "Playcount Equalizer" msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:23 msgid "Shuffle, preferring songs with fewer total plays." msgstr "" #: ../quodlibet/ext/playorder/playcounteq.py:25 #, fuzzy msgid "Prefer less played" msgstr "azken erreproduzitua" #: ../quodlibet/ext/playorder/queue.py:19 #, fuzzy msgid "Queue Only" msgstr "Ilaran" #: ../quodlibet/ext/playorder/queue.py:21 msgid "" "Limits playing of songs to the queue. Select this play order in the main " "window, then double-clicking any song will enqueue it instead of playing." msgstr "" #: ../quodlibet/ext/playorder/reverse.py:14 #, fuzzy msgid "Reverse" msgstr "Inoiz" #: ../quodlibet/ext/playorder/reverse.py:16 msgid "Reverses the play order of songs." msgstr "" #: ../quodlibet/ext/playorder/skip_songs.py:25 #, fuzzy msgid "Skip Songs" msgstr "Abestirik ez" #: ../quodlibet/ext/playorder/skip_songs.py:27 msgid "" "Playback skips over songs with a rating equal or below a given threshold." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:30 msgid "Repeat Each Track" msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:32 msgid "Shuffle songs, but repeat every track a set number of times." msgstr "" #: ../quodlibet/ext/playorder/track_repeat.py:51 msgid "Number of times to play each song:" msgstr "" #: ../quodlibet/ext/query/conditional.py:15 msgid "Conditional Query" msgstr "" #: ../quodlibet/ext/query/conditional.py:16 msgid "" "Chooses the query to match based on a condition query. Syntax is '@(if: " "condition, then, else)'." msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:14 msgid "Python Query" msgstr "" #: ../quodlibet/ext/query/pythonexpression.py:15 msgid "" "Use Python expressions in queries. Syntax is '@(python: expression)'. The " "variable 's' is the song being matched." msgstr "" #: ../quodlibet/ext/query/savedsearch.py:19 #, fuzzy msgid "Include Saved Search" msgstr "Gordetako balioak" #: ../quodlibet/ext/query/savedsearch.py:20 msgid "" "Include the results of a saved search as part of another query. Syntax is " "'@(saved: search name)'." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:77 #, python-format msgid "Squeezebox OK. Using the only player (%s)." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:86 #, fuzzy, python-format msgid "Couldn't connect to %s" msgstr "Ezin da gailu azpiegiturarekin konektatu." #: ../quodlibet/ext/_shared/squeezebox/base.py:110 msgid "Hostname:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:116 msgid "Port:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:121 #, fuzzy msgid "Username:" msgstr "Be_rrizendatu" #: ../quodlibet/ext/_shared/squeezebox/base.py:126 msgid "Password:" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:130 msgid "Library directory the server connects to." msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:132 #, fuzzy msgid "Library path:" msgstr "Liburutegia" #. Add verify button #: ../quodlibet/ext/_shared/squeezebox/base.py:141 msgid "_Verify settings" msgstr "" #. Server settings Frame #: ../quodlibet/ext/_shared/squeezebox/base.py:147 msgid "Squeezebox Server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/base.py:150 msgid "Debug" msgstr "Debug" #: ../quodlibet/ext/_shared/squeezebox/server.py:26 #, python-brace-format msgid "Squeezebox server at {hostname}:{port}" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:28 msgid "unidentified Squeezebox server" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/server.py:37 #, python-format msgid "unidentified Squeezebox player: %r" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:15 msgid "Choose Squeezebox player" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:20 #: ../quodlibet/ext/songsmenu/importexport.py:34 #: ../quodlibet/qltk/getstring.py:21 msgid "_OK" msgstr "" #: ../quodlibet/ext/_shared/squeezebox/util.py:26 msgid "" "Found Squeezebox server.\n" "Please choose the player" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:329 #, fuzzy msgid "Fit image to _window" msgstr "Ezkutatu leiho nagusia" #. Both labels #: ../quodlibet/ext/songsmenu/albumart.py:338 msgid "_Program:" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:343 msgid "_Edit image after saving" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:345 #, fuzzy msgid "File_name:" msgstr "Fitxategi-izena" #: ../quodlibet/ext/songsmenu/albumart.py:457 msgid "Saving failed" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:458 #, fuzzy, python-format msgid "Unable to save \"%s\"." msgstr "Ezin da abestia gorde" #: ../quodlibet/ext/songsmenu/albumart.py:556 #, python-format msgid "[albumart] HTTP Error: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:613 #, fuzzy msgid "Album Art Downloader" msgstr "Album zerrenda" #: ../quodlibet/ext/songsmenu/albumart.py:666 #, python-format msgid "from %(source)s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:669 #, python-format msgid "Resolution: %s" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:672 #, fuzzy, python-format msgid "Size: %s" msgstr "Tamaina" #: ../quodlibet/ext/songsmenu/albumart.py:690 #, fuzzy msgid "_Search" msgstr "_Bilaketa:" #: ../quodlibet/ext/songsmenu/albumart.py:741 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:451 #, fuzzy msgid "Searching…" msgstr "Bilatu" #: ../quodlibet/ext/songsmenu/albumart.py:804 #: ../quodlibet/ext/songsmenu/fingerprint/search.py:42 msgid "Done" msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:922 #, fuzzy msgid "Download Album Art" msgstr "Album zerrenda" #: ../quodlibet/ext/songsmenu/albumart.py:923 msgid "Downloads album covers from various websites." msgstr "" #: ../quodlibet/ext/songsmenu/albumart.py:936 msgid "Sources" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:26 msgid "APEv2 to ID3v2" msgstr "" #: ../quodlibet/ext/songsmenu/ape2id3.py:27 msgid "" "Converts your APEv2 tags to ID3v2 tags. This will delete the APEv2 tags " "after conversion." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:23 #, fuzzy msgid "Go to Bookmark" msgstr "_Editatu laster-markak..." #: ../quodlibet/ext/songsmenu/bookmarks.py:24 msgid "Manages bookmarks in the selected files." msgstr "" #: ../quodlibet/ext/songsmenu/bookmarks.py:63 #: ../quodlibet/qltk/seekbutton.py:244 #, fuzzy msgid "_Edit Bookmarks…" msgstr "_Editatu laster-markak..." #: ../quodlibet/ext/songsmenu/bookmarks.py:73 #, fuzzy msgid "No Bookmarks" msgstr "Laster-markak" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:24 #, fuzzy msgid "MusicBrainz Lookup" msgstr "MusicBrainz album mota" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:26 msgid "Re-tags an album based on a MusicBrainz search." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:50 msgid "Only use year for \"date\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:51 msgid "Write \"_albumartist\" when needed" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:52 msgid "Write sort tags for artist names" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:53 msgid "Write _standard MusicBrainz tags" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/__init__.py:54 msgid "Write \"labelid\" tag" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:129 #: ../quodlibet/qltk/downloader.py:52 msgid "Filename" msgstr "Fitxategi-izena" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:130 #, fuzzy msgid "Disc" msgstr "_Diskoa" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:131 #: ../quodlibet/ext/songsmenu/replaygain.py:404 #: ../quodlibet/qltk/tracknumbers.py:92 msgid "Track" msgstr "Pista" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:132 #, fuzzy msgid "Title" msgstr "Titulua" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:133 msgid "Artist" msgstr "Artista" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:352 #, fuzzy msgid "MusicBrainz lookup" msgstr "MusicBrainz album mota" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:375 #, fuzzy msgid "_Query:" msgstr "bilaketa" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:378 #, fuzzy msgid "S_earch" msgstr "Bilatu" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:391 msgid "Results <i>(drag to reorder)</i>" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:447 msgid "Please enter a query." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:465 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:496 msgid "Error encountered. Please retry." msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:472 #: ../quodlibet/ext/songsmenu/brainz/widgets.py:488 msgid "Loading result…" msgstr "" #: ../quodlibet/ext/songsmenu/brainz/widgets.py:475 #, fuzzy msgid "No results found." msgstr "Ez da pluginik aurkitu." #: ../quodlibet/ext/songsmenu/browsefolders.py:159 #, fuzzy msgid "Browse Folders" msgstr "Nabigatzaileak" #: ../quodlibet/ext/songsmenu/browsefolders.py:160 msgid "Opens the songs' folders in a file manager." msgstr "" #: ../quodlibet/ext/songsmenu/browsefolders.py:172 #, fuzzy msgid "Unable to open folders" msgstr "Ezinda karpeta sortu" #: ../quodlibet/ext/songsmenu/browsefolders.py:173 msgid "No program available to open folders." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:40 msgid "Python Console" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:41 msgid "Interactive Python console." msgstr "" #: ../quodlibet/ext/songsmenu/console.py:72 msgid "You can access the following objects by default:" msgstr "" #: ../quodlibet/ext/songsmenu/console.py:82 msgid "Your current working directory is:" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:41 #, fuzzy msgid "Command" msgstr "komandoa|etiketa" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 #, fuzzy msgid "name" msgstr "Be_rrizendatu" #: ../quodlibet/ext/songsmenu/custom_commands.py:44 msgid "The name of this command" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 #, fuzzy msgid "command" msgstr "komandoa|etiketa" #: ../quodlibet/ext/songsmenu/custom_commands.py:46 msgid "The shell command syntax to run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:48 msgid "parameter" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:49 #, python-brace-format msgid "" "If specified, a parameter whose occurrences in the command will be " "substituted with a user-supplied value, e.g. by using 'PARAM' all instances " "of '{PARAM}' in your command will have the value prompted for when run" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:55 #, fuzzy msgid "pattern" msgstr "Patroi baliogabea" #: ../quodlibet/ext/songsmenu/custom_commands.py:56 msgid "" "The QL pattern, e.g. <~filename>, to use to compute a value for the command. " "For playlists, this also supports virtual tags <~playlistname> and " "<~#playlistindex>." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:61 msgid "unique" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:62 msgid "If set, this will remove duplicate computed values of the pattern" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:65 msgid "max args" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:66 msgid "" "The maximum number of argument to pass to the command at one time (like " "xargs)" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:91 #, fuzzy msgid "Input value" msgstr "Okerreko balioa" #: ../quodlibet/ext/songsmenu/custom_commands.py:92 #, python-format msgid "Value for %s?" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:136 #, fuzzy msgid "Custom Commands" msgstr "_Personalizatu" #: ../quodlibet/ext/songsmenu/custom_commands.py:137 msgid "" "Runs custom commands (in batches if required) on songs using any of their " "tags." msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:188 #: ../quodlibet/ext/songsmenu/custom_commands.py:198 #: ../quodlibet/ext/songsmenu/custom_commands.py:252 msgid "Edit Custom Commands" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:199 msgid "" "Supports QL patterns\n" "eg <tt><~artist~title></tt>" msgstr "" #: ../quodlibet/ext/songsmenu/custom_commands.py:283 #, fuzzy, python-format msgid "Unable to run custom command %s" msgstr "Ezin dira kantak kopiatu" #: ../quodlibet/ext/songsmenu/duplicates.py:290 #, python-format msgid "%d duplicate group" msgid_plural "%d duplicate groups" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/duplicates.py:343 msgid "Collapse / Expand all" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:347 #, python-format msgid "Duplicate key expression is '%s'" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:372 #, fuzzy msgid "Duplicates Browser" msgstr "Desgaitu nabigatzailea" #: ../quodlibet/ext/songsmenu/duplicates.py:373 msgid "Finds and displays similarly tagged versions of songs." msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:411 msgid "" "Accepts QL tag expressions like <tt>~artist~title</tt> or " "<tt>musicbrainz_track_id</tt>" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:413 msgid "_Group duplicates by:" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:418 #, fuzzy msgid "Duplicate Key" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/songsmenu/duplicates.py:423 #, fuzzy msgid "Remove _Whitespace" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/songsmenu/duplicates.py:424 #, fuzzy msgid "Remove _Diacritics" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/songsmenu/duplicates.py:425 #, fuzzy msgid "Remove _Punctuation" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/songsmenu/duplicates.py:426 msgid "Case _Insensitive" msgstr "" #: ../quodlibet/ext/songsmenu/duplicates.py:434 msgid "Matching options" msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/editplaycount.py:19 #: ../quodlibet/ext/songsmenu/editplaycount.py:41 #, fuzzy msgid "Edit Playcount" msgstr "Editatu bistaratzea" #: ../quodlibet/ext/songsmenu/editplaycount.py:20 msgid "" "Edit a song's ~#playcount and ~#skipcount.\n" "\n" "When multiple songs are selected, counts will be incremented, rather than " "set.\n" "\n" "When setting a song's ~#playcount to 0, the ~#lastplayed and ~#laststarted " "entries will be cleared. However, when setting a 0-play song to a positive " "play count, no play times will be created." msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:68 msgid "Play Count" msgstr "" #: ../quodlibet/ext/songsmenu/editplaycount.py:69 msgid "Skip Count" msgstr "" #: ../quodlibet/ext/songsmenu/embedded.py:24 #, fuzzy msgid "Edit Embedded Images" msgstr "Atera irudi txertatuak" #: ../quodlibet/ext/songsmenu/embedded.py:25 #, fuzzy msgid "Removes or replaces embedded images." msgstr "Atera irudi txertatuak" #: ../quodlibet/ext/songsmenu/embedded.py:78 #, fuzzy msgid "_Remove all Images" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/ext/songsmenu/embedded.py:82 #, fuzzy msgid "_Embed Current Image" msgstr "Atera irudi txertatuak" #: ../quodlibet/ext/songsmenu/exact_rating.py:23 msgid "Set Exact Rating" msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:24 msgid "Allows setting the rating of songs with a number." msgstr "" #: ../quodlibet/ext/songsmenu/exact_rating.py:36 msgid "Please give your desired rating on a scale from 0.0 to 1.0" msgstr "" #: ../quodlibet/ext/songsmenu/filterall.py:80 #, fuzzy msgid "Filter on Any Tag" msgstr "Iragazi etiketa balio batez" #: ../quodlibet/ext/songsmenu/filterall.py:81 msgid "Creates a search query based on tags of the selected songs." msgstr "" #: ../quodlibet/ext/songsmenu/filterbrowser.py:19 #, fuzzy msgid "Filter on Directory" msgstr "Iragazi _generoz" #: ../quodlibet/ext/songsmenu/filterbrowser.py:20 msgid "Filters on directory in a new browser window." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:30 msgid "Acoustic Fingerprint Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:31 msgid "Looks up song metadata through acoustic fingerprinting." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:51 #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:41 msgid "Submit Acoustic Fingerprints" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:52 msgid "" "Generates acoustic fingerprints using chromaprint and submits them to " "acoustid.org." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:60 msgid "API Key Missing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:61 msgid "" "You have to specify an acoustid.org API key in the plugin preferences before " "you can submit fingerprints." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:75 msgid "Request API key" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:82 msgid "API _key:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/__init__.py:89 msgid "AcoustID Web Service" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:36 #: ../quodlibet/qltk/downloader.py:67 msgid "Queued" msgstr "Ilaran" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:38 msgid "Analyzing" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:40 msgid "Lookup" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:116 msgid "Write" msgstr "Idatzi" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:144 msgid "Status" msgstr "" #. Translators: album release ID #: ../quodlibet/ext/songsmenu/fingerprint/search.py:158 msgid "Release" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:290 #, fuzzy msgid "Write MusicBrainz tags" msgstr "MusicBrainz pista IDa" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:296 #, fuzzy msgid "Group by directory" msgstr "direktorioa" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:305 #, fuzzy msgid "Album Mode" msgstr "_Album goiburuak" #: ../quodlibet/ext/songsmenu/fingerprint/search.py:307 msgid "" "Write album related tags and try to reduce the number of different album " "releases" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:49 msgid "Generating fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:63 msgid "_Details" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:85 msgid "_Submit" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:115 msgid "" "Songs either need a <i><b>musicbrainz_trackid</b></i>, or <i><b>artist</b></" "i> / <i><b>title</b></i> / <i><b>album</b></i> tags to get submitted." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:118 msgid "Fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:120 msgid "Songs with MBIDs:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:122 msgid "Songs with sufficient tags:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:124 msgid "Songs to submit:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:162 #, python-format msgid "Done. %(to-send)d/%(all)d songs to submit." msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:178 msgid "Submitting fingerprints:" msgstr "" #: ../quodlibet/ext/songsmenu/fingerprint/submit.py:186 msgid "Submitting…" msgstr "" #: ../quodlibet/ext/songsmenu/forcewrite.py:17 #, fuzzy msgid "Update Tags in Files" msgstr "_Kate berria" #: ../quodlibet/ext/songsmenu/forcewrite.py:18 msgid "" "Update modified tags in files. This will ensure play counts and ratings are " "up to date." msgstr "" #: ../quodlibet/ext/songsmenu/html.py:66 ../quodlibet/ext/songsmenu/html.py:76 msgid "Export to HTML" msgstr "" #: ../quodlibet/ext/songsmenu/html.py:67 msgid "Exports the selected song list to HTML." msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:21 msgid "Fix MP3 Duration" msgstr "" #: ../quodlibet/ext/songsmenu/id3tlen.py:22 msgid "" "Removes TLEN frames from ID3 tags which can be the cause for invalid song " "durations." msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:20 msgid "Send to iFP" msgstr "" #: ../quodlibet/ext/songsmenu/ifp.py:21 msgid "Uploads songs to an iRiver iFP device." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:51 msgid "Export Metadata" msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:52 msgid "Exports metadata of selected songs as a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/importexport.py:92 #, fuzzy msgid "Import Metadata" msgstr "Inportatu erreprodukzio-zerrenda" #: ../quodlibet/ext/songsmenu/importexport.py:93 msgid "Imports metadata for selected songs from a .tags file." msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:23 msgid "Burn CD" msgstr "" #: ../quodlibet/ext/songsmenu/k3b.py:24 msgid "Burns CDs with K3b, Brasero or xfburn." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:96 msgid "Updating chart list." msgstr "" #. No charts to fetch, no update scheduled. #: ../quodlibet/ext/songsmenu/lastfmsync.py:114 msgid "Already up-to-date." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:121 #, python-format msgid "Fetching chart for week of %s." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:143 msgid "Sync complete." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:149 #, fuzzy msgid "Error during sync" msgstr "Errorea %r kargatzean" #: ../quodlibet/ext/songsmenu/lastfmsync.py:214 #: ../quodlibet/ext/songsmenu/lastfmsync.py:244 msgid "Last.fm Sync" msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:245 msgid "Updates your library's statistics from your Last.fm profile." msgstr "" #: ../quodlibet/ext/songsmenu/lastfmsync.py:293 #, fuzzy msgid "_Username:" msgstr "Be_rrizendatu" #: ../quodlibet/ext/songsmenu/makesorttags.py:36 msgid "Create Sort Tags" msgstr "" #: ../quodlibet/ext/songsmenu/makesorttags.py:37 msgid "Converts album and artist names to sort names, poorly." msgstr "" #. Create a dialog. #: ../quodlibet/ext/songsmenu/migratemetadata.py:29 #: ../quodlibet/ext/songsmenu/migratemetadata.py:38 #, fuzzy msgid "Migrate Metadata" msgstr "Inportatu erreprodukzio-zerrenda" #: ../quodlibet/ext/songsmenu/migratemetadata.py:32 msgid "Copies the quodlibet-specific metadata between songs." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:45 msgid "_Copy" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:47 msgid "_Paste" msgstr "" #. Create the tag table. #: ../quodlibet/ext/songsmenu/migratemetadata.py:57 #, fuzzy msgid "Information to copy/paste" msgstr "Informazioa" #. Create the indexing box. #: ../quodlibet/ext/songsmenu/migratemetadata.py:79 msgid "Map tracks by disc and track number" msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:80 msgid "" "Enable this when you want to migrate metadata from one album to another " "while matching the disc and track numbers.\n" "\n" "<b>Note:</b> this must be enabled when metadata is copied for track " "information to be stored." msgstr "" #: ../quodlibet/ext/songsmenu/migratemetadata.py:96 #, python-format msgid "There is %d stored track." msgid_plural "There are %d stored tracks." msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/playlist.py:31 #, fuzzy msgid "Export as Playlist" msgstr "Inportatu erreprodukzio-zerrenda" #: ../quodlibet/ext/songsmenu/playlist.py:32 msgid "Exports songs to an M3U or PLS playlist." msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use relative paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:77 msgid "Use absolute paths" msgstr "" #: ../quodlibet/ext/songsmenu/playlist.py:132 #, fuzzy msgid "Unable to export playlist" msgstr "Ezin da erreprodukzio-zerrenda inportatu" #: ../quodlibet/ext/songsmenu/playlist.py:133 #, fuzzy, python-format msgid "Writing to <b>%s</b> failed." msgstr "<b>%s</b> ebazteak huts egin du." #. Translators: Plugin name #: ../quodlibet/ext/songsmenu/refresh.py:22 #, fuzzy msgid "Rescan Songs" msgstr "_Freskatu liburutegia" #: ../quodlibet/ext/songsmenu/refresh.py:23 msgid "Checks for file changes and reloads / removes the songs if needed." msgstr "" #: ../quodlibet/ext/songsmenu/refresh.py:31 #, fuzzy msgid "Rescan songs" msgstr "_Freskatu liburutegia" #: ../quodlibet/ext/songsmenu/replaygain.py:362 msgid "ReplayGain Analyzer" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:418 msgid "Progress" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:433 msgid "Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:448 msgid "Peak" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:463 #, python-format msgid "There is <b>%(to-process)s</b> album to update (of %(all)s)" msgid_plural "There are <b>%(to-process)s</b> albums to update (of %(all)s)" msgstr[0] "" msgstr[1] "" #: ../quodlibet/ext/songsmenu/replaygain.py:578 msgid "Replay Gain" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:579 msgid "" "Analyzes and updates ReplayGain information, using GStreamer. Results are " "grouped by album." msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:617 msgid "always" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:618 msgid "if <b>any</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:620 msgid "if <b>album</b> RG tags are missing" msgstr "" #: ../quodlibet/ext/songsmenu/replaygain.py:637 msgid "_Process albums:" msgstr "" #. Server settings Frame #: ../quodlibet/ext/songsmenu/replaygain.py:649 #, fuzzy msgid "Existing Tags" msgstr "Editatu etiketak" #: ../quodlibet/ext/songsmenu/splitting.py:31 #, fuzzy msgid "Split Tags" msgstr "Editatu etiketak" #: ../quodlibet/ext/songsmenu/splitting.py:32 msgid "" "Splits the disc number from the album and the version from the title at the " "same time." msgstr "" #: ../quodlibet/ext/songsmenu/splitting.py:56 #, fuzzy msgid "Split Album" msgstr "Album guztiak" #: ../quodlibet/ext/songsmenu/splitting.py:57 msgid "Split out disc number." msgstr "" #. TRANSLATORS: BPM mean "beats per minute" #: ../quodlibet/ext/songsmenu/tapbpm.py:31 msgid "BPM:" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:32 #: ../quodlibet/ext/songsmenu/tapbpm.py:61 msgid "n/a" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:36 #, fuzzy msgid "Reset" msgstr "_Aurreikusi" #: ../quodlibet/ext/songsmenu/tapbpm.py:42 #, fuzzy msgid "Tap" msgstr "Etiketa" #: ../quodlibet/ext/songsmenu/tapbpm.py:172 #: ../quodlibet/ext/songsmenu/tapbpm.py:179 msgid "Tap BPM" msgstr "" #: ../quodlibet/ext/songsmenu/tapbpm.py:173 #, fuzzy msgid "Tap BPM for the selected song." msgstr "Ezin dira kantak ezabatu" #: ../quodlibet/ext/songsmenu/website_search.py:35 #, fuzzy msgid "Website Search" msgstr "Bilatu" #: ../quodlibet/ext/songsmenu/website_search.py:36 #, python-format msgid "" "Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s." msgstr "" #: ../quodlibet/ext/songsmenu/website_search.py:78 #, fuzzy msgid "Search URL patterns" msgstr "Bide patroiak" #: ../quodlibet/ext/songsmenu/website_search.py:88 #, fuzzy msgid "Edit search URLs" msgstr "Editatu gordetako balioak..." #. Add link to editor #: ../quodlibet/ext/songsmenu/website_search.py:114 #, fuzzy msgid "Configure Searches…" msgstr "Kolore bil_keta terminoak" #: ../quodlibet/ext/songsmenu/wikipedia.py:46 #, python-format msgid "Search at %(website)s" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:63 msgid "Search Artist in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:64 msgid "" "Opens a browser window with Wikipedia article on the playing song artist." msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:71 msgid "Search Album in Wikipedia" msgstr "" #: ../quodlibet/ext/songsmenu/wikipedia.py:72 msgid "" "Opens a browser window with Wikipedia article on the playing song album." msgstr "" #. then (try to) load all new files #: ../quodlibet/library/libraries.py:650 ../quodlibet/library/libraries.py:660 #: ../quodlibet/library/libraries.py:726 ../quodlibet/library/libraries.py:745 #: ../quodlibet/qltk/information.py:268 ../quodlibet/qltk/prefs.py:639 #: ../quodlibet/util/library.py:124 msgid "Library" msgstr "Liburutegia" #: ../quodlibet/library/libraries.py:650 msgid "Checking mount points" msgstr "Muntatze puntuak arakatzen" #: ../quodlibet/library/libraries.py:660 msgid "Scanning library" msgstr "Liburutegia arakatzen" #: ../quodlibet/library/libraries.py:725 #, python-format msgid "Scanning %s" msgstr "%s arakatzen" #: ../quodlibet/library/libraries.py:745 msgid "Loading files" msgstr "" #: ../quodlibet/operon/base.py:70 #, python-format msgid "Failed to load file: %r" msgstr "%r fitxategia kargatzeak huts egin du" #: ../quodlibet/operon/commands.py:37 msgid "List tags" msgstr "Erakutsi etiketak" #: ../quodlibet/operon/commands.py:42 ../quodlibet/operon/commands.py:81 #: ../quodlibet/operon/commands.py:461 msgid "Print terse output" msgstr "Erakutsi debugarako informazioa" #: ../quodlibet/operon/commands.py:44 ../quodlibet/operon/commands.py:83 #: ../quodlibet/operon/commands.py:463 #, python-format msgid "Columns to display and order in terse mode (%s)" msgstr "Zutabeak eta ordena Debugarako moduan (%s)" #: ../quodlibet/operon/commands.py:47 ../quodlibet/operon/commands.py:86 #, fuzzy msgid "Also list programmatic tags" msgstr "Ikusi etiketa _programatikoak" #: ../quodlibet/operon/commands.py:51 ../quodlibet/operon/commands.py:129 #: ../quodlibet/operon/commands.py:220 ../quodlibet/operon/commands.py:293 #: ../quodlibet/operon/commands.py:336 ../quodlibet/operon/commands.py:340 #: ../quodlibet/operon/commands.py:391 ../quodlibet/operon/commands.py:394 #: ../quodlibet/operon/commands.py:433 ../quodlibet/operon/commands.py:468 #: ../quodlibet/operon/commands.py:508 ../quodlibet/operon/commands.py:543 #: ../quodlibet/operon/commands.py:585 msgid "Not enough arguments" msgstr "Argumentu nahikorik ez" #: ../quodlibet/operon/commands.py:53 ../quodlibet/operon/commands.py:90 #: ../quodlibet/operon/commands.py:131 ../quodlibet/operon/commands.py:222 #: ../quodlibet/operon/commands.py:470 #, fuzzy msgid "Too many arguments" msgstr "Errore gehiegi" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:92 #: ../quodlibet/operon/commands.py:475 ../quodlibet/qltk/data_editors.py:363 #, fuzzy msgid "Description" msgstr "azalpena" #: ../quodlibet/operon/commands.py:56 ../quodlibet/operon/commands.py:475 #: ../quodlibet/qltk/edittags.py:454 msgid "Value" msgstr "Balioa" #: ../quodlibet/operon/commands.py:76 msgid "List all common tags" msgstr "Erakutsi ohiko etiketak" #: ../quodlibet/operon/commands.py:118 msgid "Copy tags from one file to another" msgstr "Kopiatu etiketak fitxategi batetik beste batera" #: ../quodlibet/operon/commands.py:123 ../quodlibet/operon/commands.py:164 #: ../quodlibet/operon/commands.py:289 ../quodlibet/operon/commands.py:324 #: ../quodlibet/operon/commands.py:384 msgid "Show changes, don't apply them" msgstr "Erakutsi aldaketak, ez ezarri" #: ../quodlibet/operon/commands.py:125 msgid "Skip tags that can't be written" msgstr "Jauzi egin idatzi ezin daitezkeen etiketak" #: ../quodlibet/operon/commands.py:145 #, python-format msgid "Can't copy tag %r to file: %r" msgstr "Ezin da %r %r fitxategira kopiatu" #: ../quodlibet/operon/commands.py:157 #, fuzzy msgid "Edit tags in a text editor" msgstr "Audio etiketa editorea" #: ../quodlibet/operon/commands.py:251 msgid "Editing aborted" msgstr "" #: ../quodlibet/operon/commands.py:255 #, python-format msgid "Starting text editor '%(editor-name)s' failed." msgstr "" #: ../quodlibet/operon/commands.py:260 #, fuzzy msgid "No changes detected" msgstr "Ez da abestirik hautatu." #: ../quodlibet/operon/commands.py:284 msgid "Set a tag and remove existing values" msgstr "Jarri etiketa bat eta ezabatu aurreko baloreak" #: ../quodlibet/operon/commands.py:304 ../quodlibet/operon/commands.py:444 #: ../quodlibet/operon/commands.py:676 #, python-format msgid "Can not set %r" msgstr "Ezin da %r jarri" #: ../quodlibet/operon/commands.py:319 #, fuzzy msgid "Remove tags" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/operon/commands.py:326 ../quodlibet/operon/commands.py:386 msgid "Value is a regular expression" msgstr "Balorea expresio erregularra da (RE)" #: ../quodlibet/operon/commands.py:328 #, fuzzy msgid "Remove all tags" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/operon/commands.py:332 msgid "Can't combine '--all' with '--regexp'" msgstr "Ezin da '--all' eta '--regexp' aldi berean erabili" #: ../quodlibet/operon/commands.py:366 #, python-format msgid "Can't remove %r from %r" msgstr "Ezin da %r %r -tik ezabatu" #: ../quodlibet/operon/commands.py:379 #, fuzzy msgid "Remove a tag value" msgstr "Iragazi etiketa balio batez" #: ../quodlibet/operon/commands.py:428 #, fuzzy msgid "Add a tag value" msgstr "Iragazi etiketa balio batez" #: ../quodlibet/operon/commands.py:456 #, fuzzy msgid "List file information" msgstr "Ez dago denbora informaziorik" #: ../quodlibet/operon/commands.py:502 msgid "" "Set the provided image as primary embedded image and remove all other " "embedded images" msgstr "" #: ../quodlibet/operon/commands.py:515 #, fuzzy, python-format msgid "Failed to load image file: %r" msgstr "%r fitxategia kargatzeak huts egin du" #: ../quodlibet/operon/commands.py:522 ../quodlibet/operon/commands.py:551 #, python-format msgid "Image editing not supported for %(file_name)s (%(file_format)s)" msgstr "" #: ../quodlibet/operon/commands.py:538 #, fuzzy msgid "Remove all embedded images" msgstr "Atera irudi txertatuak" #: ../quodlibet/operon/commands.py:568 #, fuzzy, python-format msgid "Extract embedded images to %(filepath)s" msgstr "Atera irudi txertatuak" #: ../quodlibet/operon/commands.py:580 msgid "" "Path to where the images will be saved to (defaults to the working directory)" msgstr "" #: ../quodlibet/operon/commands.py:639 msgid "Rename files based on tags" msgstr "Izenaz aldatu etiketeen arabera" #: ../quodlibet/operon/commands.py:654 msgid "Fill tags based on the file path" msgstr "Bete etiketak fitxategiaren helbidearen arabera" #: ../quodlibet/operon/commands.py:704 ../quodlibet/qltk/information.py:305 #: ../quodlibet/qltk/properties.py:84 ../quodlibet/qltk/renamefiles.py:176 #: ../quodlibet/qltk/tagsfrompath.py:229 ../quodlibet/qltk/tracknumbers.py:79 msgid "File" msgstr "Fitxategia" #: ../quodlibet/operon/commands.py:712 msgid "Fill tracknumbers for all files" msgstr "Bete pista zenbakiak fitxategi guztietan" #: ../quodlibet/operon/commands.py:731 msgid "Print tags based on the given pattern" msgstr "Erakutsi emandako patroiarekin bat datozen etiketak" #: ../quodlibet/operon/commands.py:768 #, fuzzy msgid "Display help information" msgstr "Erakutsi erabiltze argibide laburpena" #: ../quodlibet/operon/util.py:40 #, fuzzy, python-format msgid "'%(column-id)s' is not a valid column name (%(all-column-ids)s)." msgstr "<b>%s</b> ez da baliozko kokapen bat." #: ../quodlibet/order/__init__.py:30 msgid "_Unknown" msgstr "_Ezezaguna" #: ../quodlibet/order/__init__.py:142 msgid "In Order" msgstr "Ordenean" #: ../quodlibet/order/__init__.py:143 msgid "_In Order" msgstr "_Ordenean" #: ../quodlibet/order/reorder.py:23 #, fuzzy msgid "Random" msgstr "_Ausaz" #: ../quodlibet/order/reorder.py:24 ../quodlibet/qltk/queue.py:119 msgid "_Random" msgstr "_Ausaz" #: ../quodlibet/order/reorder.py:39 ../quodlibet/order/reorder.py:40 msgid "Prefer higher rated" msgstr "" #: ../quodlibet/order/repeat.py:43 ../quodlibet/order/repeat.py:44 msgid "Repeat this track" msgstr "" #: ../quodlibet/order/repeat.py:57 ../quodlibet/order/repeat.py:58 #, fuzzy msgid "Repeat all" msgstr "E_rrepikatu" #: ../quodlibet/order/repeat.py:73 ../quodlibet/order/repeat.py:74 msgid "One Song" msgstr "Abesti bat" #: ../quodlibet/player/gstbe/player.py:98 msgid "Stream" msgstr "Stream" #: ../quodlibet/player/gstbe/player.py:98 msgid "Buffering" msgstr "Buffering" #: ../quodlibet/player/gstbe/player.py:319 #, fuzzy msgid "Could not create GStreamer pipeline" msgstr "Ezin da berezko GStreamer pipeline-a sortu." #: ../quodlibet/player/gstbe/player.py:560 msgid "No GStreamer element found to handle media format" msgstr "" #: ../quodlibet/player/gstbe/player.py:561 #, python-format msgid "Media format: %(format-description)s" msgstr "" #: ../quodlibet/player/gstbe/plugins.py:35 #, python-format msgid "GStreamer plugin '%(name)s' could not be initialized" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:25 #, fuzzy msgid "" "The GStreamer output pipeline used for playback. Leave blank for the default " "pipeline. In case the pipeline contains a sink, it will be used instead of " "the default one." msgstr "" "Erreprodukziorako erabiltzen den GStreamer kanalizazio 'alsasink " "device=default' gisakoa. Zurian utzi lehenetsitako kanalizaziorako." #: ../quodlibet/player/gstbe/prefs.py:36 msgid "_Output pipeline:" msgstr "_Irteera kanalizazioa:" #: ../quodlibet/player/gstbe/prefs.py:43 #, fuzzy, python-format msgid "%.1f seconds" msgstr "segundo %d" #: ../quodlibet/player/gstbe/prefs.py:57 msgid "_Buffer duration:" msgstr "_Buferren iraupena:" #: ../quodlibet/player/gstbe/prefs.py:66 msgid "Disable _gapless playback" msgstr "" #: ../quodlibet/player/gstbe/prefs.py:70 msgid "" "Disabling gapless playback can avoid track changing problems with some " "GStreamer versions." msgstr "" #: ../quodlibet/player/gstbe/util.py:93 #, fuzzy msgid "No GStreamer audio sink found" msgstr "Ez da katerik aurkitu" #: ../quodlibet/player/gstbe/util.py:112 #, fuzzy msgid "Invalid GStreamer output pipeline" msgstr "GStreamer irteera kanalizazio baliogabea, lehenetsia saiatzen." #: ../quodlibet/player/xinebe/player.py:90 msgid "Unable to create audio output" msgstr "Ezin da audio irteera sortu" #: ../quodlibet/player/xinebe/player.py:91 #, python-format msgid "" "The audio device %r was not found. Check your Xine settings in ~/.quodlibet/" "config." msgstr "" "Ez da %r audio gailua aurkitu. Aztertu zure Xine ezarpenak ~/.quodlibet/" "config-en." #: ../quodlibet/plugins/__init__.py:62 #, python-brace-format msgid "" "Couldn't find module '{module}'. Perhaps you need to install the package?" msgstr "" #: ../quodlibet/plugins/__init__.py:71 #, fuzzy, python-brace-format msgid "Couldn't find GStreamer element '{element}'." msgstr "Ezin da GStreamer pipeline-a lotu: '%s'" #: ../quodlibet/plugins/playlist.py:30 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)s playlist?" msgid_plural "Run the plugin \"%(name)s\" on %(count)s playlists?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/plugins/playlist.py:41 ../quodlibet/qltk/songsmenu.py:46 #: ../quodlibet/qltk/songsmenu.py:74 #, fuzzy msgid "_Run Plugin" msgstr "_Pluginak" #: ../quodlibet/qltk/about.py:40 #, python-format msgid "Supported formats: %s" msgstr "Onartutako formatuak: %s" #: ../quodlibet/qltk/about.py:43 #, python-format msgid "Audio device: %s" msgstr "Audio gailua: %s" #. Translators: Refers to the beginning of the playing song. #: ../quodlibet/qltk/bookmarks.py:27 msgid "Beginning" msgstr "Hasten" #: ../quodlibet/qltk/bookmarks.py:38 ../quodlibet/qltk/bookmarks.py:78 msgid "N/A" msgstr "E/G" #: ../quodlibet/qltk/bookmarks.py:83 msgid "Time" msgstr "Denbora" #: ../quodlibet/qltk/bookmarks.py:89 ../quodlibet/qltk/bookmarks.py:124 msgid "Bookmark Name" msgstr "Laster-marka izena" #: ../quodlibet/qltk/bookmarks.py:122 msgid "MM:SS" msgstr "MM:SS" #: ../quodlibet/qltk/bookmarks.py:207 ../quodlibet/qltk/information.py:131 msgid "Bookmarks" msgstr "Laster-markak" #: ../quodlibet/qltk/browser.py:56 msgid "_Filters" msgstr "_Iragazkia" #: ../quodlibet/qltk/browser.py:57 #, fuzzy msgid "Recently _Played" msgstr "_Inoiz ez erreproduzituak" #: ../quodlibet/qltk/browser.py:59 msgid "Recently _Added" msgstr "Duela gutxi _gehituak" #: ../quodlibet/qltk/browser.py:61 msgid "_Top 40" msgstr "40 gehien e_rabiliak" #: ../quodlibet/qltk/browser.py:63 #, fuzzy msgid "All _Songs" msgstr "Kate berria" #: ../quodlibet/qltk/browser.py:71 msgid "On Current _Genre(s)" msgstr "" #: ../quodlibet/qltk/browser.py:72 msgid "On Current _Artist(s)" msgstr "" #: ../quodlibet/qltk/browser.py:73 msgid "On Current Al_bum" msgstr "" #: ../quodlibet/qltk/browser.py:81 msgid "Random _Genre" msgstr "Ausazko _generoa" #: ../quodlibet/qltk/browser.py:82 msgid "Random _Artist" msgstr "Ausazko _artista" #: ../quodlibet/qltk/browser.py:83 msgid "Random Al_bum" msgstr "Ausazko Al_buma" #: ../quodlibet/qltk/browser.py:96 msgid "" "The 40 songs you've played most (more than 40 may be chosen if there are " "ties)" msgstr "" "Gehien erreproduzitutako 40 abestiak (40 baino gehiago egon litezke " "berdinketarik badago)" #: ../quodlibet/qltk/cbes.py:48 ../quodlibet/qltk/edittags.py:311 msgid "_Value:" msgstr "_Balioa:" #: ../quodlibet/qltk/cbes.py:262 msgid "Saved Values" msgstr "Gordetako balioak" #: ../quodlibet/qltk/cbes.py:263 #, fuzzy msgid "Edit saved values…" msgstr "Editatu gordetako balioak..." #: ../quodlibet/qltk/controls.py:111 msgid "Auto_matic" msgstr "Automati_koa" #: ../quodlibet/qltk/controls.py:112 #, fuzzy msgid "_Track Mode" msgstr "Pis_ta goiburuak" #: ../quodlibet/qltk/controls.py:113 #, fuzzy msgid "_Album Mode" msgstr "_Album goiburuak" #. Translators: player state, no action #: ../quodlibet/qltk/controls.py:122 msgid "_Mute" msgstr "" #: ../quodlibet/qltk/controls.py:128 #, fuzzy msgid "_Replay Gain Mode" msgstr "Erreprodukzio bolumen irabazi doitzea" #. Translators: New Command/Entry/Item/... #: ../quodlibet/qltk/data_editors.py:119 #, python-format msgid "New %s" msgstr "" #: ../quodlibet/qltk/data_editors.py:218 #, fuzzy msgid "(unknown)" msgstr "Ezezaguna" #: ../quodlibet/qltk/data_editors.py:355 #, fuzzy msgid "Tag expression" msgstr "Balorea expresio erregularra da (RE)" #: ../quodlibet/qltk/data_editors.py:382 msgid "Tag expression e.g. people:real or ~album~year." msgstr "" #: ../quodlibet/qltk/data_editors.py:383 #, fuzzy msgid "Enter new tag" msgstr "Iragazi etiketa balio batez" #: ../quodlibet/qltk/delete.py:37 #, fuzzy msgid "Files:" msgstr "Fixategiak" #: ../quodlibet/qltk/delete.py:63 #, fuzzy msgid "" "The selected songs will be removed from the library and their files deleted " "from disk." msgstr "Kanta bikoiztuak '%s' zerrendatik ezabatuko dira." #: ../quodlibet/qltk/delete.py:72 #, fuzzy msgid "The selected files will be deleted from disk." msgstr "Kanta bikoiztuak '%s' zerrendatik ezabatuko dira." #: ../quodlibet/qltk/delete.py:76 #, python-format msgid "Delete %(file_count)d file permanently?" msgid_plural "Delete %(file_count)d files permanently?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:91 #, fuzzy msgid "_Delete Files" msgstr "Ezabatu fitxategiak" #: ../quodlibet/qltk/delete.py:106 #, fuzzy msgid "" "The selected songs will be removed from the library and their files moved to " "the trash." msgstr "Kanta bikoiztuak '%s' zerrendatik ezabatuko dira." #: ../quodlibet/qltk/delete.py:115 #, fuzzy msgid "The selected files will be moved to the trash." msgstr "Kanta bikoiztuak '%s' zerrendatik ezabatuko dira." #: ../quodlibet/qltk/delete.py:120 #, python-format msgid "Move %(file_count)d file to the trash?" msgid_plural "Move %(file_count)d files to the trash?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/delete.py:134 ../quodlibet/qltk/delete.py:141 msgid "_Move to Trash" msgstr "_Mugitu zakarrontzira" #: ../quodlibet/qltk/delete.py:152 ../quodlibet/qltk/delete.py:187 #, python-format msgid "Moving %(current)d/%(total)d." msgstr "Mugitzen: %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:173 ../quodlibet/qltk/delete.py:205 #, fuzzy msgid "Unable to move to trash" msgstr "Ezin da iPod datu-basea gorde" #: ../quodlibet/qltk/delete.py:174 ../quodlibet/qltk/delete.py:206 #, fuzzy msgid "Moving one or more files to the trash failed." msgstr "<b>%s</b> ebazteak huts egin du." #: ../quodlibet/qltk/delete.py:216 ../quodlibet/qltk/delete.py:250 #, python-format msgid "Deleting %(current)d/%(total)d." msgstr "Ezabatzen: %(current)d/%(total)d." #: ../quodlibet/qltk/delete.py:236 ../quodlibet/qltk/delete.py:269 #, fuzzy msgid "Unable to delete files" msgstr "Ezin da fitxategia ezabatu" #: ../quodlibet/qltk/delete.py:237 ../quodlibet/qltk/delete.py:270 #, fuzzy msgid "Deleting one or more files failed." msgstr "Huts <b>%s</b> ezabatzean." #: ../quodlibet/qltk/downloader.py:38 msgid "Downloads" msgstr "Deskargak" #: ../quodlibet/qltk/downloader.py:62 msgid "Size" msgstr "Tamaina" #. Add stop/pause buttons. count = 0 means an indefinite #. number of steps. #: ../quodlibet/qltk/downloader.py:94 ../quodlibet/qltk/renamefiles.py:265 #: ../quodlibet/qltk/wlw.py:50 msgid "_Stop" msgstr "" #: ../quodlibet/qltk/edittags.py:63 ../quodlibet/qltk/edittags.py:74 #, python-format msgid "missing from %d song" msgid_plural "missing from %d songs" msgstr[0] "abesti %d-etan falta da" msgstr[1] "%d absetitan falta da" #: ../quodlibet/qltk/edittags.py:67 ../quodlibet/qltk/edittags.py:71 #, python-format msgid "different across %d song" msgid_plural "different across %d songs" msgstr[0] "desberdina kanta %d-etan" msgstr[1] "desberdina %d kantetan" #: ../quodlibet/qltk/edittags.py:193 msgid "Split into _Multiple Values" msgstr "Zatitu _hainbat baliotan" #: ../quodlibet/qltk/edittags.py:211 msgid "Split Disc out of _Album" msgstr "Atera diskoa _albumetik" #: ../quodlibet/qltk/edittags.py:228 msgid "Split _Version out of Title" msgstr "Atera _bertsioa izenburutik" #: ../quodlibet/qltk/edittags.py:259 msgid "Split Arranger out of Ar_tist" msgstr "Atera moldatzailea ar_tistatik" #: ../quodlibet/qltk/edittags.py:264 msgid "Split _Performer out of Artist" msgstr "Atera _interpretea atistatik" #: ../quodlibet/qltk/edittags.py:270 #, fuzzy msgid "Split _Performer out of Title" msgstr "Atera _interpretea atistatik" #: ../quodlibet/qltk/edittags.py:276 #, fuzzy msgid "Split _Originalartist out of Title" msgstr "Atera _bertsioa izenburutik" #: ../quodlibet/qltk/edittags.py:283 msgid "Add a Tag" msgstr "Gehitu etiketa bat" #: ../quodlibet/qltk/edittags.py:302 msgid "_Tag:" msgstr "E_tiketa:" #: ../quodlibet/qltk/edittags.py:404 msgid "Edit Tags" msgstr "Editatu etiketak" #: ../quodlibet/qltk/edittags.py:477 msgid "Show _programmatic tags" msgstr "Ikusi etiketa _programatikoak" #: ../quodlibet/qltk/edittags.py:478 msgid "" "Access all tags, including machine-generated ones e.g. MusicBrainz or Replay " "Gain tags" msgstr "" "Atzitu etiketa guztiak, automatikoki sortuak barne: MusicBrainz edo " "ReplayGain, besteak beste" #. Translators: Revert button in the tag editor #: ../quodlibet/qltk/edittags.py:508 #, fuzzy msgctxt "edittags" msgid "_Revert" msgstr "Inoiz" #. Translators: Save button in the tag editor #: ../quodlibet/qltk/edittags.py:513 msgctxt "edittags" msgid "_Save" msgstr "" #: ../quodlibet/qltk/edittags.py:659 msgid "Unable to add tag" msgstr "Ezin da etiketa gehitu" #: ../quodlibet/qltk/edittags.py:660 #, fuzzy, python-format msgid "Unable to add <b>%s</b>" msgstr "Ezin da abestia gehitu" #: ../quodlibet/qltk/edittags.py:662 #, fuzzy, python-format msgid "" "The files currently selected do not support multiple values for <b>%s</b>." msgstr "" "Ezin da <b>%s</b> gehitu\n" "\n" "Unean hautatutako fitxategiak ez ditu balio anitz onartzen." #. Can't add the new tag. #: ../quodlibet/qltk/edittags.py:689 ../quodlibet/qltk/edittags.py:856 #: ../quodlibet/qltk/tagsfrompath.py:212 ../quodlibet/util/__init__.py:554 #: ../quodlibet/util/tags.py:231 msgid "Invalid tag" msgstr "Okerreko etiketa" #: ../quodlibet/qltk/edittags.py:690 ../quodlibet/qltk/edittags.py:857 #: ../quodlibet/qltk/tagsfrompath.py:213 #, python-format msgid "" "Invalid tag <b>%s</b>\n" "\n" "The files currently selected do not support editing this tag." msgstr "" "<b>%s</b> okerreko etiketa\n" "\n" "Unean hautatutako fitxategiak ez du ha editatzea onartzen." #: ../quodlibet/qltk/edittags.py:828 ../quodlibet/qltk/edittags.py:868 msgid "Invalid value" msgstr "Okerreko balioa" #: ../quodlibet/qltk/edittags.py:829 ../quodlibet/qltk/edittags.py:869 #, python-format msgid "" "Invalid value: <b>%(value)s</b>\n" "\n" "%(error)s" msgstr "" "Okerreko balioa: <b>%(value)s</b>\n" "\n" "%(error)s" #: ../quodlibet/qltk/_editutils.py:28 msgid "Tag may not be accurate" msgstr "Etiketa ez zehatza izatea liteke" #: ../quodlibet/qltk/_editutils.py:31 #, fuzzy, python-format msgid "" "%(file-name)s changed while the program was running. Saving without " "refreshing your library may overwrite other changes to the song." msgstr "" "<b>%s</b> aldatu egin da programa martxan zegoela. Liburutegia freskatu gabe " "gordetzeak abestiaren beste aldaketa batzuk gainidatzi ditzake.\n" "\n" "Gorde abesti hau hala ere?" #: ../quodlibet/qltk/_editutils.py:47 msgid "Unable to save song" msgstr "Ezin da abestia gorde" #: ../quodlibet/qltk/_editutils.py:50 #, fuzzy, python-format msgid "" "Saving %(file-name)s failed. The file may be read-only, corrupted, or you do " "not have permission to edit it." msgstr "" "Huts <b>%s</b> gordetzean. Fitxategia irakurketa soilekoa izan daiteke, " "hondaturik egon edo zuk berau editatzeko baimenik ez izatea izan liteke." #: ../quodlibet/qltk/_editutils.py:142 #, fuzzy msgid "_More options…" msgstr "_Aukera gehiago..." #: ../quodlibet/qltk/entry.py:80 msgid "_Undo" msgstr "" #: ../quodlibet/qltk/entry.py:82 msgid "_Redo" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:95 #: ../quodlibet/qltk/quodlibetwindow.py:1066 msgid "_About" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:99 #: ../quodlibet/qltk/quodlibetwindow.py:1088 msgid "_Check for Updates…" msgstr "" #: ../quodlibet/qltk/exfalsowindow.py:105 #: ../quodlibet/qltk/quodlibetwindow.py:1021 ../quodlibet/qltk/songsmenu.py:304 msgid "_Plugins" msgstr "_Pluginak" #: ../quodlibet/qltk/exfalsowindow.py:267 #, fuzzy, python-format msgid "%(title)s and %(count)s more" msgid_plural "%(title)s and %(count)s more" msgstr[0] "%(title)s eta %(count)d gehiago" msgstr[1] "%(title)s eta %(count)d gehiago" #: ../quodlibet/qltk/exfalsowindow.py:279 msgid "Ex Falso Preferences" msgstr "Ex Falso hobespenak" #: ../quodlibet/qltk/exfalsowindow.py:289 ../quodlibet/qltk/prefs.py:598 msgid "Split _on:" msgstr "Zati_tu:" #: ../quodlibet/qltk/exfalsowindow.py:295 ../quodlibet/qltk/prefs.py:613 msgid "Tag Editing" msgstr "Etiketa editatzea" #: ../quodlibet/qltk/filesel.py:210 msgid "Folders" msgstr "Karpetak" #: ../quodlibet/qltk/filesel.py:253 #, fuzzy msgid "_New Folder…" msgstr "Sortu karpeta" #: ../quodlibet/qltk/filesel.py:262 #, fuzzy msgid "_Select all Sub-Folders" msgstr "__Hautatu azpikarpeta guztiak" #: ../quodlibet/qltk/filesel.py:374 msgid "New Folder" msgstr "Sortu karpeta" #: ../quodlibet/qltk/filesel.py:374 msgid "Enter a name for the new folder:" msgstr "Idatzi izen bat karpeta berriarentzat:" #: ../quodlibet/qltk/filesel.py:387 msgid "Unable to create folder" msgstr "Ezinda karpeta sortu" #: ../quodlibet/qltk/filesel.py:404 msgid "Unable to delete folder" msgstr "Ezin da karpeta ezabatu" #: ../quodlibet/qltk/filesel.py:519 ../quodlibet/qltk/pluginwin.py:167 msgid "Songs" msgstr "Abestiak" #. Translators: As in "by Artist Name" #: ../quodlibet/qltk/info.py:42 #, python-format msgid "by %s" msgstr "%s -ez" #: ../quodlibet/qltk/info.py:43 ../quodlibet/qltk/information.py:167 #: ../quodlibet/qltk/information.py:448 #, python-format msgid "Disc %s" msgstr "%s diskoa" #: ../quodlibet/qltk/info.py:44 ../quodlibet/qltk/information.py:172 #, python-format msgid "Track %s" msgstr "%s pista" #: ../quodlibet/qltk/info.py:108 #, fuzzy msgid "_Edit Display…" msgstr "Editatu bistaratzea" #: ../quodlibet/qltk/information.py:105 msgid "No songs are selected." msgstr "Ez da abestirik hautatu." #: ../quodlibet/qltk/information.py:106 msgid "No Songs" msgstr "Abestirik ez" #: ../quodlibet/qltk/information.py:121 ../quodlibet/qltk/information.py:338 #: ../quodlibet/qltk/information.py:471 ../quodlibet/qltk/information.py:531 msgid "Information" msgstr "Informazioa" #: ../quodlibet/qltk/information.py:126 msgid "Lyrics" msgstr "Hitzak" #: ../quodlibet/qltk/information.py:184 ../quodlibet/qltk/information.py:396 #, python-format msgid "Produced by %s" msgstr "%s-ek sortua" #: ../quodlibet/qltk/information.py:199 ../quodlibet/util/tags.py:76 msgid "artist" msgstr "artista" #: ../quodlibet/qltk/information.py:200 ../quodlibet/qltk/information.py:561 #: ../quodlibet/util/tags.py:76 msgid "artists" msgstr "artistak" #. for backwards compat #: ../quodlibet/qltk/information.py:221 ../quodlibet/util/tags.py:86 #: ../quodlibet/util/tags.py:114 msgid "performers" msgstr "interpreteak" #: ../quodlibet/qltk/information.py:235 ../quodlibet/qltk/information.py:248 #: ../quodlibet/qltk/songlistcolumns.py:275 msgid "Never" msgstr "Inoiz" #: ../quodlibet/qltk/information.py:236 #, python-format msgid "%(n)d time" msgid_plural "%(n)d times" msgstr[0] "%(n)d-etan" msgstr[1] "%(n)d aldiz" #: ../quodlibet/qltk/information.py:254 ../quodlibet/util/tags.py:139 msgid "added" msgstr "gehiturik" #: ../quodlibet/qltk/information.py:255 ../quodlibet/util/tags.py:140 msgid "last played" msgstr "azken erreproduzitua" #: ../quodlibet/qltk/information.py:256 ../quodlibet/util/tags.py:150 msgid "plays" msgstr "erreproduzitzen" #: ../quodlibet/qltk/information.py:257 ../quodlibet/util/tags.py:151 msgid "skips" msgstr "salto" #: ../quodlibet/qltk/information.py:258 ../quodlibet/util/tags.py:156 msgid "rating" msgstr "balorazioa" #: ../quodlibet/qltk/information.py:287 msgid "path" msgstr "" #: ../quodlibet/qltk/information.py:288 ../quodlibet/util/tags.py:154 msgid "length" msgstr "iraupena" #: ../quodlibet/qltk/information.py:289 #, fuzzy msgid "format" msgstr "Informazioa" #: ../quodlibet/qltk/information.py:290 ../quodlibet/util/tags.py:163 msgid "codec" msgstr "" #: ../quodlibet/qltk/information.py:291 ../quodlibet/util/tags.py:164 #, fuzzy msgid "encoding" msgstr "Goraka" #: ../quodlibet/qltk/information.py:292 ../quodlibet/util/tags.py:160 msgid "bitrate" msgstr "bit-tasa" #: ../quodlibet/qltk/information.py:293 ../quodlibet/util/tags.py:161 msgid "file size" msgstr "fitxategi tamaina" #: ../quodlibet/qltk/information.py:294 ../quodlibet/util/tags.py:149 msgid "modified" msgstr "eraldatua" #: ../quodlibet/qltk/information.py:331 msgid "Additional" msgstr "" #: ../quodlibet/qltk/information.py:383 #, python-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d hautatua" msgstr[1] "%d hautatuak" #: ../quodlibet/qltk/information.py:458 msgid "Track unavailable" msgstr "Pista erabilezina" #: ../quodlibet/qltk/information.py:464 msgid "Track List" msgstr "Pista zerrenda" #: ../quodlibet/qltk/information.py:505 ../quodlibet/qltk/information.py:578 #, python-format msgid "%d song with no album" msgid_plural "%d songs with no album" msgstr[0] "kanta %d album gabe" msgstr[1] "%d kanta album gabe" #: ../quodlibet/qltk/information.py:508 msgid "Selected Discography" msgstr "Hautatu diskografia" #: ../quodlibet/qltk/information.py:558 #, python-format msgid "%d song with no artist" msgid_plural "%d songs with no artist" msgstr[0] "abesti %d artista gabe" msgstr[1] "%d abesti artista gabe" #: ../quodlibet/qltk/information.py:586 ../quodlibet/util/tags.py:74 msgid "albums" msgstr "album" #: ../quodlibet/qltk/information.py:599 msgid "Total length:" msgstr "Iraupena guztira:" #: ../quodlibet/qltk/information.py:603 msgid "Total size:" msgstr "Tamaina guztira:" #: ../quodlibet/qltk/information.py:606 msgid "Files" msgstr "Fixategiak" #: ../quodlibet/qltk/lyrics.py:37 msgid "_Download" msgstr "_Deskargatu" #: ../quodlibet/qltk/lyrics.py:40 #, fuzzy msgid "_Edit" msgstr "_Editatu bistaratzea..." #. buffer.set_text(_("No lyrics found.\n\nYou can click the " #. "Download button to have Quod Libet search " #. "for lyrics online. You can also enter them " #. "yourself and click save.")) #: ../quodlibet/qltk/lyrics.py:73 ../quodlibet/qltk/lyrics.py:109 msgid "No lyrics found for this song." msgstr "Ez da kanta honen letrarik aurkitu." #: ../quodlibet/qltk/lyrics.py:82 #, fuzzy msgid "Searching for lyrics…" msgstr "Letrak bilatzen..." #: ../quodlibet/qltk/maskedbox.py:20 #, fuzzy msgid "Are you sure you want to remove all songs?" msgstr "" "%d abestiren balorazioa aldatzera zoaz.\n" "Jarraitu nahi duzu?" #: ../quodlibet/qltk/maskedbox.py:21 #, fuzzy msgid "The selected songs will be removed from the library." msgstr "Kanta bikoiztuak '%s' zerrendatik ezabatuko dira." #: ../quodlibet/qltk/maskedbox.py:44 msgid "Unhide" msgstr "" #: ../quodlibet/qltk/maskedbox.py:86 msgid "_Unhide" msgstr "" #: ../quodlibet/qltk/msg.py:41 msgid "Discard tag changes?" msgstr "Baztertu etiketa aldaketak?" #: ../quodlibet/qltk/msg.py:42 msgid "" "Tags have been changed but not saved. Save these files, or revert and " "discard changes?" msgstr "" "Etiketak aldatu egin dira baina ez gorde. Fitxategi hauek gorde edo atzera " "egin eta aldaketa baztertu?" #: ../quodlibet/qltk/msg.py:55 ../quodlibet/qltk/prefs.py:595 #: ../quodlibet/qltk/textedit.py:64 ../quodlibet/qltk/tracknumbers.py:117 #, fuzzy msgid "_Revert" msgstr "Inoiz" #: ../quodlibet/qltk/msg.py:86 msgid "File exists" msgstr "Fitxategia badago" #: ../quodlibet/qltk/msg.py:88 #, python-format msgid "Replace %(file-name)s?" msgstr "" #: ../quodlibet/qltk/msg.py:94 #, fuzzy msgid "_Replace File" msgstr "Berrizendatu fitxategiak" #: ../quodlibet/qltk/notif.py:182 msgid "Active tasks" msgstr "Lan aktiboak" #: ../quodlibet/qltk/notif.py:188 #, python-format msgid "%d tasks running" msgstr "Lan aktiboak: %d" #: ../quodlibet/qltk/playorder.py:254 #, fuzzy msgid "Toggle shuffle mode" msgstr "Txandakatu erreproduzitu/gelditu modua" #: ../quodlibet/qltk/playorder.py:270 #, fuzzy msgid "Toggle repeat mode" msgstr "Txandakatu erreproduzitu/gelditu modua" #: ../quodlibet/qltk/pluginwin.py:44 msgid "Plugin Errors" msgstr "Plugin erroreak" #: ../quodlibet/qltk/pluginwin.py:124 msgid "Enabled" msgstr "Gaitua" #: ../quodlibet/qltk/pluginwin.py:125 msgid "Disabled" msgstr "Desgaitua" #: ../quodlibet/qltk/pluginwin.py:131 msgid "No category" msgstr "Kategoria gabe" #: ../quodlibet/qltk/pluginwin.py:169 msgid "Events" msgstr "" #: ../quodlibet/qltk/pluginwin.py:170 #, fuzzy msgid "Play Order" msgstr "_Ordena:" #: ../quodlibet/qltk/pluginwin.py:171 #, fuzzy msgid "Editing" msgstr "Etiketa editatzea" #: ../quodlibet/qltk/pluginwin.py:173 #, fuzzy msgid "Covers" msgstr "Tamaina guztira:" #: ../quodlibet/qltk/pluginwin.py:309 msgid "No plugins found." msgstr "Ez da pluginik aurkitu." #: ../quodlibet/qltk/pluginwin.py:358 #, fuzzy msgid "Plugins" msgstr "_Pluginak" #: ../quodlibet/qltk/pluginwin.py:382 msgid "Filter by plugin state / tag" msgstr "" #: ../quodlibet/qltk/pluginwin.py:388 msgid "Filter by plugin type" msgstr "" #: ../quodlibet/qltk/pluginwin.py:394 msgid "Filter by plugin name or description" msgstr "" #: ../quodlibet/qltk/pluginwin.py:403 msgid "Show _Errors" msgstr "Ikusi erroreak" #: ../quodlibet/qltk/prefs.py:45 msgid "_Disc" msgstr "_Diskoa" #: ../quodlibet/qltk/prefs.py:46 msgid "_Track" msgstr "_Pista" #: ../quodlibet/qltk/prefs.py:47 #, fuzzy msgid "Grou_ping" msgstr "taldekatzea" #: ../quodlibet/qltk/prefs.py:50 msgid "Al_bum" msgstr "Al_buma" #: ../quodlibet/qltk/prefs.py:55 msgid "_Filename" msgstr "_Fitxategi-izena" #: ../quodlibet/qltk/prefs.py:57 msgid "_Length" msgstr "_Iraupena" #: ../quodlibet/qltk/prefs.py:64 msgid "_Jump to playing song automatically" msgstr "_Salto erreproduzitzen den abestira automatikoki" #: ../quodlibet/qltk/prefs.py:66 msgid "When the playing song changes, scroll to it in the song list" msgstr "" "Erreproduzitzen ari den abestia aldatzean, joan abesti zerrendan uneko " "abestiraino" #: ../quodlibet/qltk/prefs.py:82 msgid "_Others:" msgstr "_Besteak:" #: ../quodlibet/qltk/prefs.py:88 #, fuzzy msgid "_Edit…" msgstr "_Editatu bistaratzea..." #: ../quodlibet/qltk/prefs.py:91 msgid "Add or remove additional column headers" msgstr "Gehitu edo ezabatu informazio gehigarriko zutabeak" #: ../quodlibet/qltk/prefs.py:101 msgid "Visible Columns" msgstr "Zutabe ikusgarriak" #: ../quodlibet/qltk/prefs.py:104 msgid "Title includes _version" msgstr "Izenburuak bertsioa barneratzen du" #: ../quodlibet/qltk/prefs.py:106 #, fuzzy msgid "Artist includes all _people" msgstr "Sarezko _bilaketa jendea barneratuz" #: ../quodlibet/qltk/prefs.py:108 msgid "Album includes _disc subtitle" msgstr "Albumak _disko azpititulua barneratzen du" #: ../quodlibet/qltk/prefs.py:110 msgid "Filename includes _folder" msgstr "Fitxategi-izenak _karpeta barneratzen du" #: ../quodlibet/qltk/prefs.py:123 #, fuzzy msgid "Column Preferences" msgstr "Hobespenak" #: ../quodlibet/qltk/prefs.py:129 msgid "Apply current configuration to song list, adding new columns to the end" msgstr "" "Ezarri oraingo konfigurazioa zerrendari, zutabe berriak bukaeran jarriz" #: ../quodlibet/qltk/prefs.py:142 ../quodlibet/qltk/shortcuts.py:24 msgid "Song List" msgstr "Abesti zerrenda" #: ../quodlibet/qltk/prefs.py:222 #, fuzzy msgid "Edit Columns" msgstr "Zutabe gehigarriak" #: ../quodlibet/qltk/prefs.py:259 msgid "Duration totals" msgstr "" #: ../quodlibet/qltk/prefs.py:271 msgid "_Global filter:" msgstr "Iragazki na_gusia:" #: ../quodlibet/qltk/prefs.py:277 msgid "Apply this query in addition to all others" msgstr "Ezarri bilaketa hau besteei gehituz" #. Translators: The heading of the preference group, no action #: ../quodlibet/qltk/prefs.py:283 #, fuzzy msgctxt "heading" msgid "Search" msgstr "Bilatu" #: ../quodlibet/qltk/prefs.py:287 ../quodlibet/qltk/shortcuts.py:21 msgid "Browsers" msgstr "Nabigatzaileak" #: ../quodlibet/qltk/prefs.py:293 msgid "Confirm _multiple ratings" msgstr "Berretsi balorazio a_nitz" #: ../quodlibet/qltk/prefs.py:295 #, fuzzy msgid "" "Ask for confirmation before changing the rating of multiple songs at once" msgstr "Berrespena eskatu abesti anitzen balorazioa batera aldatu aurretik" #: ../quodlibet/qltk/prefs.py:298 msgid "Enable _one-click ratings" msgstr "Gaitu klik-bakarreko balorazioak" #: ../quodlibet/qltk/prefs.py:300 #, fuzzy msgid "Enable rating by clicking on the rating column in the song list" msgstr "Balorazio gaitu abesti zerrendak balorazio zutabea klikatuaz" #: ../quodlibet/qltk/prefs.py:306 ../quodlibet/qltk/prefs.py:616 msgid "Ratings" msgstr "Balorazioak" #. Filename choice algorithm config #: ../quodlibet/qltk/prefs.py:312 msgid "Prefer _embedded art" msgstr "Hobetsi album arte lan _txertatuak" #: ../quodlibet/qltk/prefs.py:314 msgid "" "Choose to use artwork embedded in the audio (where available) over other " "sources" msgstr "Aukeratu album arte lan txertatuak hobestea, dagoenean" #: ../quodlibet/qltk/prefs.py:319 #, fuzzy msgid "_Fixed image filename:" msgstr "_Ezarritako irudiaren izena:" #: ../quodlibet/qltk/prefs.py:321 #, fuzzy msgid "The single image filename to use if selected" msgstr "Album arte lanaren irudia erabiltzeko, izena ezartzen denean" #: ../quodlibet/qltk/prefs.py:327 msgid "The album art image file to use when forced" msgstr "Album arte lanaren irudia erabiltzeko, izena ezartzen denean" #: ../quodlibet/qltk/prefs.py:336 #, fuzzy msgid "Album Art" msgstr "Album zerrenda" #: ../quodlibet/qltk/prefs.py:357 #, fuzzy msgid "Playback" msgstr "Gelditu erreproduzitzeaz" #: ../quodlibet/qltk/prefs.py:362 #, fuzzy msgid "Output Configuration" msgstr "Erregistro irteera" #: ../quodlibet/qltk/prefs.py:373 msgid "" "If no Replay Gain information is available for a song, scale the volume by " "this value" msgstr "" "Ez badago erreprodukzio argibiderik kanta batentzat, bidertu bolumena balio " "hau erabiliaz" #: ../quodlibet/qltk/prefs.py:376 #, fuzzy msgid "_Fall-back gain (dB):" msgstr "Lehenetsiriko irabazia (dB):" #: ../quodlibet/qltk/prefs.py:387 msgid "" "Scale volume for all songs by this value, as long as the result will not clip" msgstr "" "Biderkatu abesti guztien bolumena balio honez, beti mozketak sortzen ez " "baditu" #: ../quodlibet/qltk/prefs.py:390 #, fuzzy msgid "_Pre-amp gain (dB):" msgstr "Aurre-amp irabazia (dB):" #: ../quodlibet/qltk/prefs.py:395 msgid "_Enable Replay Gain volume adjustment" msgstr "_Gaitu erreprodukzio irabazte bolumen doitzea" #: ../quodlibet/qltk/prefs.py:420 msgid "Replay Gain Volume Adjustment" msgstr "Erreprodukzio bolumen irabazi doitzea" #: ../quodlibet/qltk/prefs.py:450 #, fuzzy msgid "_Default rating:" msgstr "Berezkoa" #: ../quodlibet/qltk/prefs.py:493 #, fuzzy msgid "Rating _scale:" msgstr "Balorazioak" #: ../quodlibet/qltk/prefs.py:542 msgid "" "Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that albums with few " "tracks will have less extreme ratings. Changing this value triggers a re-" "calculation for all albums." msgstr "" "Erantsitako balorazioa osatzeko Batezbesteko Bayesianaren faktorea (C).\n" "0k ohiko batezbesteko esan nahi du, balore handiagok esan nahi dute \n" "pista gutxiko albumek puntuazio estremo gutxiago izango dutela.\n" "Balore hau aldatutakoan, album guztientzat birkalkulatzea abiaraziko da." #: ../quodlibet/qltk/prefs.py:547 msgid "_Bayesian averaging amount:" msgstr "_Batezbesteko Bayesianaren kopurua:" #: ../quodlibet/qltk/prefs.py:556 msgid "Save ratings and play _counts" msgstr "Gorde balorazio eta erreprodukzio _kontaketak" #: ../quodlibet/qltk/prefs.py:560 msgid "_Email:" msgstr "_Eposta:" #: ../quodlibet/qltk/prefs.py:562 msgid "Ratings and play counts will be set for this email address" msgstr "" "Balorazio eta erreprodukzio kontuak ezarriko dira posta helbide honentzat" #: ../quodlibet/qltk/prefs.py:577 #, fuzzy msgid "Auto-save tag changes" msgstr "Baztertu etiketa aldaketak?" #: ../quodlibet/qltk/prefs.py:579 msgid "Save changes to tags without confirmation when editing multiple files" msgstr "" "Gorde aldaketak baiespen indibidualarik eskatu gabe fitxategi asko editatzen " "denean" #: ../quodlibet/qltk/prefs.py:587 #, fuzzy msgid "" "A set of separators to use when splitting tag values in the tag editor. The " "list is space-separated" msgstr "" "Etiketatik baloreak bereizterakoan erabil daitezkeen bereizle zerrenda " "(komaz bereiztuta)." #: ../quodlibet/qltk/prefs.py:610 #, fuzzy msgid "Tags" msgstr "Editatu etiketak" #: ../quodlibet/qltk/prefs.py:631 #, fuzzy msgid "Updating for new ratings" msgstr "_Kate berria" #: ../quodlibet/qltk/prefs.py:641 #, fuzzy msgid "Scan library _on start" msgstr "F_reskatu liburutegia abiaraztean" #: ../quodlibet/qltk/prefs.py:651 ../quodlibet/qltk/quodlibetwindow.py:1100 #, fuzzy msgid "_Scan Library" msgstr "_Bilatu liburutegia" #: ../quodlibet/qltk/prefs.py:653 ../quodlibet/qltk/quodlibetwindow.py:1162 msgid "Check for changes in your library" msgstr "Aztertu zure liburutegiko aldaketak" #: ../quodlibet/qltk/prefs.py:658 #, fuzzy msgid "Re_build Library" msgstr "Birkargatu _liburutegia" #: ../quodlibet/qltk/prefs.py:661 #, fuzzy msgid "Reload all songs in your library. This can take a long time." msgstr "Birkargatu liburutegiko kanta guztiak (denbora luzea har lezake)" #: ../quodlibet/qltk/prefs.py:671 #, fuzzy msgid "Scan Directories" msgstr "Arakatu _direktorioak" #: ../quodlibet/qltk/prefs.py:677 #, fuzzy msgid "Hidden Songs" msgstr "Abestirik ez" #: ../quodlibet/qltk/properties.py:158 ../quodlibet/util/collection.py:402 #, python-format msgid "%(title)s and %(count)d more" msgid_plural "%(title)s and %(count)d more" msgstr[0] "%(title)s eta %(count)d gehiago" msgstr[1] "%(title)s eta %(count)d gehiago" #: ../quodlibet/qltk/properties.py:162 ../quodlibet/qltk/properties.py:164 msgid "Properties" msgstr "Propietateak" #: ../quodlibet/qltk/queue.py:101 msgid "_Queue" msgstr "_Ilara" #: ../quodlibet/qltk/queue.py:125 msgid "Stop Once Empty" msgstr "" #: ../quodlibet/qltk/queue.py:129 #, fuzzy msgid "_Clear Queue" msgstr "_Garbitu errorea" #: ../quodlibet/qltk/queue.py:241 #, python-format msgid "%(count)d song (%(time)s)" msgid_plural "%(count)d songs (%(time)s)" msgstr[0] "kanta %(count)d (%(time)s)" msgstr[1] "%(count)d kanta (%(time)s)" #: ../quodlibet/qltk/quodlibetwindow.py:198 msgid "_Browse Library" msgstr "_Arakatu liburutegia" #: ../quodlibet/qltk/quodlibetwindow.py:395 #, fuzzy msgid "Toggle queue visibility" msgstr "Txandakatu leiho nagusi ikusgarritasuna" #: ../quodlibet/qltk/quodlibetwindow.py:516 #, fuzzy msgid "Playback Error" msgstr "Gelditu erreproduzitzeaz" #: ../quodlibet/qltk/quodlibetwindow.py:524 #, fuzzy msgid "Set up library directories?" msgstr "Hautatu direktorioak" #: ../quodlibet/qltk/quodlibetwindow.py:525 msgid "You don't have any music library set up. Would you like to do that now?" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:531 msgid "_Not Now" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:532 msgid "_Set Up" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:956 msgid "Unable to add songs" msgstr "Ezin dira abestiak gehitu" #: ../quodlibet/qltk/quodlibetwindow.py:957 #: ../quodlibet/qltk/quodlibetwindow.py:1364 #, fuzzy, python-format msgid "%s uses an unsupported protocol." msgstr "<b>%s</b>k onartzen ez den protokolo bat erabiltzen du." #: ../quodlibet/qltk/quodlibetwindow.py:980 msgid "_Jump to Playing Song" msgstr "_Salto erreproduzitzen den abestira" #: ../quodlibet/qltk/quodlibetwindow.py:986 #, fuzzy msgid "_File" msgstr "Fitxategia" #: ../quodlibet/qltk/quodlibetwindow.py:987 #, fuzzy msgid "_Song" msgstr "Abestiak" #: ../quodlibet/qltk/quodlibetwindow.py:988 msgid "_View" msgstr "_Ikusi" #: ../quodlibet/qltk/quodlibetwindow.py:989 #, fuzzy msgid "_Browse" msgstr "Nabigatzaileak" #: ../quodlibet/qltk/quodlibetwindow.py:990 msgid "_Control" msgstr "_Kontrola" #: ../quodlibet/qltk/quodlibetwindow.py:991 msgid "_Help" msgstr "_Laguntza" #: ../quodlibet/qltk/quodlibetwindow.py:997 #, fuzzy msgid "_Add a Folder…" msgstr "_Gehitu karpeta bat..." #: ../quodlibet/qltk/quodlibetwindow.py:1002 #, fuzzy msgid "_Add a File…" msgstr "_Gehitu fitxategi bat..." #: ../quodlibet/qltk/quodlibetwindow.py:1007 #, fuzzy msgid "_Add a Location…" msgstr "Gehitu kokapena" #: ../quodlibet/qltk/quodlibetwindow.py:1036 #, fuzzy msgid "Edit Bookmarks…" msgstr "_Editatu laster-markak..." #: ../quodlibet/qltk/quodlibetwindow.py:1056 #, fuzzy msgid "Stop After This Song" msgstr "Gelditu kanta honen ondoren" #: ../quodlibet/qltk/quodlibetwindow.py:1062 msgid "_Keyboard Shortcuts" msgstr "" #: ../quodlibet/qltk/quodlibetwindow.py:1071 msgid "Online Help" msgstr "Laguntza sarean" #: ../quodlibet/qltk/quodlibetwindow.py:1080 #, fuzzy msgid "Search Help" msgstr "Bilatu" #: ../quodlibet/qltk/quodlibetwindow.py:1352 msgid "Add a Location" msgstr "Gehitu kokapena" #: ../quodlibet/qltk/quodlibetwindow.py:1353 msgid "Enter the location of an audio file:" msgstr "Idatzi audio fitxategiaren kokapena:" #: ../quodlibet/qltk/quodlibetwindow.py:1358 #: ../quodlibet/qltk/quodlibetwindow.py:1363 msgid "Unable to add location" msgstr "Ezin da kokapena gehitu" #: ../quodlibet/qltk/quodlibetwindow.py:1359 #, fuzzy, python-format msgid "%s is not a valid location." msgstr "<b>%s</b> ez da baliozko kokapen bat." #: ../quodlibet/qltk/quodlibetwindow.py:1372 #: ../quodlibet/qltk/quodlibetwindow.py:1381 msgid "Add Music" msgstr "Gehitu musika" #: ../quodlibet/qltk/quodlibetwindow.py:1372 ../quodlibet/qltk/scanbox.py:99 #, fuzzy msgid "_Add Folders" msgstr "_Gehitu karpeta bat..." #: ../quodlibet/qltk/quodlibetwindow.py:1379 #, fuzzy msgid "Music Files" msgstr "Musika erreproduzigailua" #: ../quodlibet/qltk/quodlibetwindow.py:1381 #, fuzzy msgid "_Add Files" msgstr "_Gehitu fitxategi bat..." #: ../quodlibet/qltk/ratingsmenu.py:24 #, fuzzy, python-format msgid "Are you sure you want to change the rating of all %d songs?" msgstr "" "%d abestiren balorazioa aldatzera zoaz.\n" "Jarraitu nahi duzu?" #: ../quodlibet/qltk/ratingsmenu.py:26 #, fuzzy msgid "The saved ratings will be removed" msgstr "Kanta bikoiztuak '%s' zerrendatik ezabatuko dira." #: ../quodlibet/qltk/ratingsmenu.py:27 #, fuzzy, python-format msgid "The rating of all selected songs will be changed to '%s'" msgstr "Hautatuko %d abestien balorazioa '%s'-ra aldatuko da" #: ../quodlibet/qltk/ratingsmenu.py:57 ../quodlibet/qltk/ratingsmenu.py:111 #, fuzzy msgid "_Remove Rating" msgstr "Bikoiztuak ezabatu" #: ../quodlibet/qltk/ratingsmenu.py:98 #, fuzzy msgid "Change _Rating" msgstr "_Balorazioa" #: ../quodlibet/qltk/renamefiles.py:46 msgid "Replace spaces with _underscores" msgstr "Ordeztu zuriuneak a_zpimarrez" #: ../quodlibet/qltk/renamefiles.py:56 msgid "Strip _Windows-incompatible characters" msgstr "Kendu windows-ekin bateragarriak ez diren karaktereak" #: ../quodlibet/qltk/renamefiles.py:74 msgid "Strip _diacritical marks" msgstr "Kendu marka _diakritikoak" #: ../quodlibet/qltk/renamefiles.py:85 msgid "Strip non-_ASCII characters" msgstr "Kendu ASCII ez diren karaktereak" #: ../quodlibet/qltk/renamefiles.py:95 msgid "Use only _lowercase characters" msgstr "Erabili letra _xeheak bakarrik" #: ../quodlibet/qltk/renamefiles.py:123 msgid "Rename Files" msgstr "Berrizendatu fitxategiak" #: ../quodlibet/qltk/renamefiles.py:139 ../quodlibet/qltk/tagsfrompath.py:116 msgid "Path Patterns" msgstr "Bide patroiak" #: ../quodlibet/qltk/renamefiles.py:140 ../quodlibet/qltk/tagsfrompath.py:117 #, fuzzy msgid "Edit saved patterns…" msgstr "Editatu gordetako balioak..." #: ../quodlibet/qltk/renamefiles.py:143 ../quodlibet/qltk/tagsfrompath.py:120 #: ../quodlibet/qltk/tracknumbers.py:58 msgid "_Preview" msgstr "_Aurreikusi" #: ../quodlibet/qltk/renamefiles.py:190 msgid "New Name" msgstr "Izen berria" #: ../quodlibet/qltk/renamefiles.py:255 msgid "Unable to rename file" msgstr "Ezin da fitxategia berrizendatu" #: ../quodlibet/qltk/renamefiles.py:256 #, fuzzy, python-format msgid "" "Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> failed. Possibly the " "target file already exists, or you do not have permission to make the new " "file or remove the old one." msgstr "" "Huts <b>%s</b> <b>%s</b>-ra berrizendatzean. Ziurrenik edo helburua " "fixtategi badago dagoeneko edo ez duzu baimenik fitxategi berria sortu edo " "zaharra kentzeko." #: ../quodlibet/qltk/renamefiles.py:264 msgid "Ignore _All Errors" msgstr "Baztertu errore _guztiak" #: ../quodlibet/qltk/renamefiles.py:267 msgid "_Continue" msgstr "_Jarraitu" #: ../quodlibet/qltk/renamefiles.py:296 msgid "Path is not absolute" msgstr "Bidea ez da absolutua" #: ../quodlibet/qltk/renamefiles.py:297 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "contains / but does not start from root. To avoid misnamed folders, root " "your pattern by starting it with / or ~/." msgstr "" "\t<b>%s</b>\n" "patroiak / du baina ez da errotik hasten. Okerreko izeneko direktorioak " "saihesteko patroia / edo ~/ -rekin hasi behar da." #: ../quodlibet/qltk/scanbox.py:47 #, fuzzy msgid "" "Songs in the listed folders will be added to the library during a library " "refresh" msgstr "" "Karpeta hauetan kokatutako abestiak (':' erabiliaz bereziak) zure " "liburutegira gehituko dira" #: ../quodlibet/qltk/scanbox.py:99 msgid "Select Directories" msgstr "Hautatu direktorioak" #: ../quodlibet/qltk/searchbar.py:52 #, fuzzy msgid "Saved Searches" msgstr "Gordetako balioak" #: ../quodlibet/qltk/searchbar.py:53 #, fuzzy msgid "Edit saved searches…" msgstr "Editatu gordetako balioak..." #: ../quodlibet/qltk/searchbar.py:74 msgid "Search your library, using free text or QL queries" msgstr "Bilatu zure bilduman, testua edo QL bilaketak erabiliz" #: ../quodlibet/qltk/searchbar.py:129 msgid "Search after _typing" msgstr "Bilatu ida_tzi ondoren" #: ../quodlibet/qltk/searchbar.py:132 msgid "Show search results after the user stops typing." msgstr "" "Bistarazi bilaketa emaitzak erabiltzaileak tekleatzeari utzi bezain laster." #: ../quodlibet/qltk/searchbar.py:187 msgid "_Limit:" msgstr "_Muga:" #: ../quodlibet/qltk/searchbar.py:200 msgid "_Weight" msgstr "_Tamaina" #: ../quodlibet/qltk/seekbutton.py:238 msgid "Display remaining time" msgstr "Bistarazi faltako denbora" #: ../quodlibet/qltk/shortcuts.py:16 #, fuzzy msgid "Main Window" msgstr "Hitzak" #: ../quodlibet/qltk/shortcuts.py:17 msgid "Seek backwards by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:18 msgid "Seek forward by 10 seconds" msgstr "" #: ../quodlibet/qltk/shortcuts.py:19 #, fuzzy msgid "Focus the search entry" msgstr "Fokoa ipini erreproduzigailua martxan" #: ../quodlibet/qltk/shortcuts.py:22 #, fuzzy msgid "Reset filters and jump to the playing song" msgstr "Bilatu jotzen ari den anestian" #: ../quodlibet/qltk/shortcuts.py:26 msgid "Open the information window for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:27 msgid "Open the tag editor for the selected songs" msgstr "" #: ../quodlibet/qltk/shortcuts.py:28 #, fuzzy msgid "Queue the selected songs" msgstr "Ezin dira kantak ezabatu" #: ../quodlibet/qltk/shortcuts.py:29 #, fuzzy msgid "Delete the selected songs" msgstr "Ezin dira kantak ezabatu" #: ../quodlibet/qltk/shortcuts.py:30 msgid "Show the inline search entry" msgstr "" #: ../quodlibet/qltk/shortcuts.py:31 msgid "Left click on a column header" msgstr "" #: ../quodlibet/qltk/shortcuts.py:32 msgid "Add the column to the list of columns to sort by" msgstr "" #: ../quodlibet/qltk/shortcuts.py:34 msgid "Tree View" msgstr "" #: ../quodlibet/qltk/shortcuts.py:36 ../quodlibet/qltk/shortcuts.py:41 msgid "Collapses the element or select the parent element" msgstr "" #: ../quodlibet/qltk/shortcuts.py:37 #, fuzzy msgid "Expands the element" msgstr "Zutabe gehigarriak" #: ../quodlibet/qltk/shortcuts.py:39 msgid "Text Entries" msgstr "" #: ../quodlibet/qltk/shortcuts.py:42 msgid "Redo the last undone change" msgstr "" #: ../quodlibet/qltk/shortcuts.py:45 msgid "Select all songs in all panes" msgstr "" #: ../quodlibet/qltk/songlist.py:377 #, python-format msgid "_Filter on %s" msgstr "_Iragazi %s-ez" #: ../quodlibet/qltk/songlist.py:1094 #, fuzzy msgid "All _Headers" msgstr "_Album goiburuak" #: ../quodlibet/qltk/songlist.py:1095 msgid "_Track Headers" msgstr "Pis_ta goiburuak" #: ../quodlibet/qltk/songlist.py:1096 msgid "_Album Headers" msgstr "_Album goiburuak" #: ../quodlibet/qltk/songlist.py:1097 msgid "_People Headers" msgstr "_Pertsona goiburuak" #: ../quodlibet/qltk/songlist.py:1098 msgid "_Date Headers" msgstr "_Data goiburuak" #: ../quodlibet/qltk/songlist.py:1099 msgid "_File Headers" msgstr "_fixategi goiburuak" #: ../quodlibet/qltk/songlist.py:1100 msgid "_Production Headers" msgstr "P_rodukzio goiburuak" #: ../quodlibet/qltk/songlist.py:1115 #, fuzzy msgid "_Customize Headers…" msgstr "_Pertsonalizatu goiburuak..." #: ../quodlibet/qltk/songlist.py:1120 #, fuzzy msgid "_Expand Column" msgstr "Zutabe gehigarriak" #: ../quodlibet/qltk/songsmenu.py:36 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d song?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d songs?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:64 #, python-format msgid "Run the plugin \"%(name)s\" on %(count)d album?" msgid_plural "Run the plugin \"%(name)s\" on %(count)d albums?" msgstr[0] "" msgstr[1] "" #: ../quodlibet/qltk/songsmenu.py:149 #, fuzzy msgid "Configure Plugins…" msgstr "Kolore bil_keta terminoak" #: ../quodlibet/qltk/songsmenu.py:344 msgid "Add to _Queue" msgstr "Gehitu _ilarara" #: ../quodlibet/qltk/songsmenu.py:367 msgid "_Copy to Device" msgstr "_Kopiatu gailura" #: ../quodlibet/qltk/songsmenu.py:378 #, fuzzy msgid "_Remove from Library" msgstr "_Kendu erreprodukzio-zerrendatik" #: ../quodlibet/qltk/tagsfrompath.py:47 msgid "Replace _underscores with spaces" msgstr "Ordeztu azpimarrak zuriunez" #: ../quodlibet/qltk/tagsfrompath.py:57 msgid "_Title-case tags" msgstr "_Titulu-gisako etiketak" #: ../quodlibet/qltk/tagsfrompath.py:67 msgid "Split into multiple _values" msgstr "Zatitu hainbat _ baliotan" #: ../quodlibet/qltk/tagsfrompath.py:101 msgid "Tags From Path" msgstr "Etiketak bidetik" #: ../quodlibet/qltk/tagsfrompath.py:138 msgid "Tags replace existing ones" msgstr "Etiketak daudenak ordezkatzen dituzte" #: ../quodlibet/qltk/tagsfrompath.py:139 msgid "Tags are added to existing ones" msgstr "Etiketak daudenei gehituko zaizkie" #. Save button #: ../quodlibet/qltk/tagsfrompath.py:153 msgid "Save" msgstr "" #: ../quodlibet/qltk/tagsfrompath.py:195 #, python-format msgid "" "The pattern\n" "\t<b>%s</b>\n" "is invalid. Possibly it contains the same tag twice or it has unbalanced " "brackets (< / >)." msgstr "" "\t<b>%s</b>\n" "patroia baliogabea da. Baliteke etiketa berdina bi aldiz edukitzea edo itxi " "gabeko parentesiak ditu (< / >)." #: ../quodlibet/qltk/tagsfrompath.py:216 msgid "Invalid tags" msgstr "Etiketa baliogabeak" #: ../quodlibet/qltk/tagsfrompath.py:217 #, python-format msgid "" "Invalid tags <b>%s</b>\n" "\n" "The files currently selected do not support editing these tags." msgstr "" "<b>%s</b> etiketa baliogabeak\n" "\n" "Hautatutako fitxategiek ez dute onartzen etiketa hauek ezabatzea." #: ../quodlibet/qltk/textedit.py:142 #, python-format msgid "" "The pattern you entered was invalid. Make sure you enter < and > as " "\\< and \\> and that your tags are balanced.\n" "\n" "%s" msgstr "" "Sartutako patroia baliogabea da. Ziuratu < eta > \\< eta \\> " "gisa sartu dituzula eta etiketak parekatuak daudela.\n" "\n" "%s" #: ../quodlibet/qltk/textedit.py:158 msgid "Edit Display" msgstr "Editatu bistaratzea" #: ../quodlibet/qltk/tracknumbers.py:39 msgid "Track Numbers" msgstr "Pista zenbakiak" #: ../quodlibet/qltk/tracknumbers.py:42 msgid "Start fro_m:" msgstr "Hasi he_mendik:" #: ../quodlibet/qltk/tracknumbers.py:51 msgid "_Total tracks:" msgstr "Pista _guztira:" #: ../quodlibet/qltk/unity.py:52 #, fuzzy msgid "Play/Pause" msgstr "Erreproduzigailua" #: ../quodlibet/qltk/unity.py:75 #, fuzzy msgid "Previous" msgstr "_Aurreikusi" #: ../quodlibet/qltk/views.py:923 #, fuzzy, python-format msgid "and %d more…" msgstr "eta %d gehiago..." #: ../quodlibet/qltk/wlw.py:200 msgid "Saving the songs you changed." msgstr "Aldatu dituzun abestiak gordetzen." #: ../quodlibet/qltk/wlw.py:201 #, python-format msgid "" "%(current)d/%(total)d songs saved\n" "(%(remaining)s remaining)" msgstr "" "%(current)d/%(total)d abesti gordeak\n" "(%(remaining)s falta dira)" #: ../quodlibet/qltk/wlw.py:234 #, fuzzy, python-format msgid "%(current)s of %(all)s" msgstr "Mugitzen: %(current)d/%(total)d." #: ../quodlibet/update.py:89 #, fuzzy msgid "Checking for Updates" msgstr "Muntatze puntuak arakatzen" #: ../quodlibet/update.py:124 #, fuzzy msgid "Connection failed" msgstr "kokapena" #: ../quodlibet/update.py:133 #, python-format msgid "You are already using the newest version %(version)s" msgstr "" #: ../quodlibet/update.py:136 #, python-format msgid "" "A new version %(new-version)s is available\n" "\n" "You are currently using version %(old-version)s\n" "\n" "Visit the <a href='%(url)s'>website</a>" msgstr "" #: ../quodlibet/util/collection.py:424 msgid "Playlists must have a name" msgstr "" #: ../quodlibet/util/collection.py:607 #, python-format msgid "A playlist named %s already exists." msgstr "Badago %s izeneko erreprodukzio-zerrenda bat." #: ../quodlibet/util/cover/built_in.py:26 #, fuzzy msgid "Embedded album covers" msgstr "Ikusi album _karatulak" #: ../quodlibet/util/cover/built_in.py:27 msgid "Uses covers embedded into audio files." msgstr "" #: ../quodlibet/util/cover/built_in.py:49 #, fuzzy msgid "Filesystem cover" msgstr "Fitxategi sistema" #: ../quodlibet/util/cover/built_in.py:50 msgid "" "Uses commonly named images found in common directories alongside the song." msgstr "" #: ../quodlibet/util/__init__.py:93 msgid "Display brief usage information" msgstr "Erakutsi erabiltze argibide laburpena" #: ../quodlibet/util/__init__.py:95 msgid "Display version and copyright" msgstr "Bertsio eta kopia-eskubideak bistarazi" #: ../quodlibet/util/__init__.py:135 #, python-format msgid "Usage: %(program)s %(usage)s" msgstr "" #: ../quodlibet/util/__init__.py:137 msgid "[options]" msgstr "[aukerak]" #: ../quodlibet/util/__init__.py:182 #, python-format msgid "Option %r not recognized." msgstr "Ez da %r aukera ezagutzen." #: ../quodlibet/util/__init__.py:185 #, python-format msgid "Option %r requires an argument." msgstr "%r aukerak argumentu bat behar du." #: ../quodlibet/util/__init__.py:188 #, python-format msgid "%r is not a unique prefix." msgstr "%r ez da aurrizki bakana." #: ../quodlibet/util/__init__.py:364 #, python-format msgid "%d kbps" msgstr "%d kbps" #: ../quodlibet/util/__init__.py:419 #, fuzzy, python-format msgid "%s second" msgid_plural "%s seconds" msgstr[0] "segundo %d" msgstr[1] "%d segundo" #: ../quodlibet/util/__init__.py:432 msgid "No time information" msgstr "Ez dago denbora informaziorik" #: ../quodlibet/util/__init__.py:435 #, python-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "segundo %d" msgstr[1] "%d segundo" #: ../quodlibet/util/__init__.py:436 #, python-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "minutu %d" msgstr[1] "%d minutu" #: ../quodlibet/util/__init__.py:437 #, python-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "ordu %d" msgstr[1] "%d ordu" #: ../quodlibet/util/__init__.py:438 #, python-format msgid "%d day" msgid_plural "%d days" msgstr[0] "egun %d" msgstr[1] "%d egun" #: ../quodlibet/util/__init__.py:439 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "urte %d" msgstr[1] "%d urte" #. Translators: If tag names, when capitalized, should not #. be title-cased ("Looks Like This"), but rather only have #. the first letter capitalized, translate this string as #. something non-empty other than "titlecase?". #: ../quodlibet/util/__init__.py:563 #, fuzzy msgctxt "check" msgid "titlecase?" msgstr "Lehen hizkia larriz hitz bakoitzean?" #: ../quodlibet/util/massagers.py:115 msgid "" "The date must be entered in 'YYYY', 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' " "format." msgstr "" "Data 'UUUU', 'UUUU-HH-EE' edo 'UUUU-HH-EE OO:MM:SS' formatuan sartu behar da." #: ../quodlibet/util/massagers.py:130 msgid "Replay Gain gains must be entered in 'x.yy dB' format." msgstr "Erreprodukzio irabazia 'x.yy dB' formatuan idatzi behar da." #: ../quodlibet/util/massagers.py:151 msgid "Replay Gain peaks must be entered in 'x.yy' format." msgstr "Erreprodukzio irabazi gailurra 'x.yy' formatuan sartu behar da." #: ../quodlibet/util/massagers.py:173 msgid "MusicBrainz IDs must be in UUID format." msgstr "MusicBrainz IDak UUID formatuan izan behar dira." #. Translators: Leave "official", "promotional", and "bootleg" #. untranslated. They are the three possible literal values. #: ../quodlibet/util/massagers.py:195 msgid "" "MusicBrainz release status must be 'official', 'promotional', or 'bootleg'." msgstr "" "MusicBrainz argitaratze egoera 'official', 'promotional', edo 'bootleg' izan " "behar da." #: ../quodlibet/util/massagers.py:208 msgid "Language must be an ISO 639-2 three-letter code" msgstr "Hizkuntzak ISO 639-2tik hiru letratako kodea izan behar du" #: ../quodlibet/util/songwrapper.py:112 msgid "Unable to edit song" msgstr "Ezin da abestia editatu" #: ../quodlibet/util/songwrapper.py:113 #, python-format msgid "" "Saving <b>%s</b> failed. The file may be read-only, corrupted, or you do not " "have permission to edit it." msgstr "" "Huts <b>%s</b> gordetzean. Fitxategia irakurketa soilekoa izan daiteke, " "hondaturik egon edo zuk berau editatzeko baimenik ez izatea izan liteke." #: ../quodlibet/util/string/__init__.py:34 #: ../quodlibet/util/string/__init__.py:44 msgid "[Invalid Encoding]" msgstr "[Kodeketa baliogabea]" #: ../quodlibet/util/tags.py:74 msgid "album" msgstr "albuma" #: ../quodlibet/util/tags.py:75 msgid "arranger" msgstr "Moldatzailea" #: ../quodlibet/util/tags.py:75 msgid "arrangers" msgstr "moldatzaileak" #: ../quodlibet/util/tags.py:75 #, fuzzy msgid "arrangement" msgstr "Moldatzailea" #: ../quodlibet/util/tags.py:77 msgid "author" msgstr "egilea" #: ../quodlibet/util/tags.py:77 msgid "authors" msgstr "egileak" #: ../quodlibet/util/tags.py:78 msgid "composer" msgstr "konposatzailea" #: ../quodlibet/util/tags.py:78 msgid "composers" msgstr "konposatzaileak" #: ../quodlibet/util/tags.py:78 #, fuzzy msgid "composition" msgstr "konposatzailea" #. Translators: conducting as in conducting a musical performance #: ../quodlibet/util/tags.py:80 msgid "conductor" msgstr "gidaria" #: ../quodlibet/util/tags.py:80 msgid "conductors" msgstr "gidariak" #: ../quodlibet/util/tags.py:80 #, fuzzy msgid "conducting" msgstr "gidaria" #: ../quodlibet/util/tags.py:81 msgid "contact" msgstr "kontaktua" #: ../quodlibet/util/tags.py:82 msgid "copyright" msgstr "Copyright-a" #: ../quodlibet/util/tags.py:83 msgid "date" msgstr "data" #: ../quodlibet/util/tags.py:84 msgid "description" msgstr "azalpena" #: ../quodlibet/util/tags.py:85 msgid "genre" msgstr "generoa" #: ../quodlibet/util/tags.py:85 #, fuzzy msgid "genres" msgstr "generoa" #: ../quodlibet/util/tags.py:86 msgid "performer" msgstr "interpretea" #: ../quodlibet/util/tags.py:87 msgid "grouping" msgstr "taldekatzea" #: ../quodlibet/util/tags.py:88 msgid "language" msgstr "hizkuntza" #: ../quodlibet/util/tags.py:89 msgid "license" msgstr "lizentzia" #: ../quodlibet/util/tags.py:90 msgid "location" msgstr "kokapena" #: ../quodlibet/util/tags.py:91 msgid "lyricist" msgstr "idazlea" #: ../quodlibet/util/tags.py:91 msgid "lyricists" msgstr "Idazleak" #: ../quodlibet/util/tags.py:91 #, fuzzy msgid "lyrics" msgstr "idazlea" #. Translators: Also e.g. "record label", "publisher" #: ../quodlibet/util/tags.py:93 msgid "organization" msgstr "erakundea" #: ../quodlibet/util/tags.py:94 msgid "title" msgstr "izenburua" #: ../quodlibet/util/tags.py:95 msgid "version" msgstr "bertsioa" #: ../quodlibet/util/tags.py:96 msgid "website" msgstr "webgunea" #: ../quodlibet/util/tags.py:98 msgid "album artist" msgstr "album artista" #: ../quodlibet/util/tags.py:99 msgid "BPM" msgstr "BPM" #. Translators: This used to be called "part". #: ../quodlibet/util/tags.py:102 ../quodlibet/util/tags.py:103 msgid "disc subtitle" msgstr "disko azpititulua" #: ../quodlibet/util/tags.py:104 ../quodlibet/util/tags.py:141 msgid "disc" msgstr "diskoa" #: ../quodlibet/util/tags.py:105 ../quodlibet/util/tags.py:143 msgid "track" msgstr "pista" #: ../quodlibet/util/tags.py:106 msgid "label ID" msgstr "etiketa IDa" #: ../quodlibet/util/tags.py:107 msgid "original release date" msgstr "jatorrizko argitaratze data" #: ../quodlibet/util/tags.py:108 msgid "original album" msgstr "jatorrizko albuma" #: ../quodlibet/util/tags.py:109 msgid "original artist" msgstr "jatorrizko artista" #: ../quodlibet/util/tags.py:110 msgid "recording date" msgstr "grabaketa data" #: ../quodlibet/util/tags.py:111 msgid "release country" msgstr "argitaratzen nazioa" #. http://musicbrainz.org/doc/MusicBrainzTag #. Note: picard has changed musicbrainz_trackid to mean release track. #. We can't do that because of existing libraries, so use a new #. musicbrainz_releastrackid instead. #: ../quodlibet/util/tags.py:120 #, fuzzy msgid "MusicBrainz recording ID" msgstr "MusicBrainz pista IDa" #: ../quodlibet/util/tags.py:121 #, fuzzy msgid "MusicBrainz release track ID" msgstr "MusicBrainz argitaratze IDa" #: ../quodlibet/util/tags.py:122 msgid "MusicBrainz release ID" msgstr "MusicBrainz argitaratze IDa" #: ../quodlibet/util/tags.py:123 #, fuzzy msgid "MusicBrainz artist ID" msgstr "Musicbrainz artista IDa" #: ../quodlibet/util/tags.py:124 #, fuzzy msgid "MusicBrainz release artist ID" msgstr "MusicBrainz argitaratze IDa" #: ../quodlibet/util/tags.py:125 msgid "MusicBrainz TRM ID" msgstr "MusicBrainz TRM IDa" #: ../quodlibet/util/tags.py:126 msgid "MusicIP PUID" msgstr "MusicIP PUID" #: ../quodlibet/util/tags.py:127 msgid "MusicBrainz album status" msgstr "MusicBrainz album egoera" #: ../quodlibet/util/tags.py:128 msgid "MusicBrainz album type" msgstr "MusicBrainz album mota" #: ../quodlibet/util/tags.py:129 #, fuzzy msgid "MusicBrainz release group ID" msgstr "MusicBrainz argitaratze IDa" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:132 msgid "track gain" msgstr "Pistaren irabazpena" #: ../quodlibet/util/tags.py:133 msgid "track peak" msgstr "Pistaren erpina" #. Translators: "gain" means a volume adjustment, not "to acquire". #: ../quodlibet/util/tags.py:135 msgid "album gain" msgstr "Albumaren irabazpena" #: ../quodlibet/util/tags.py:136 msgid "album peak" msgstr "Albumaren gailurra" #: ../quodlibet/util/tags.py:137 msgid "reference loudness" msgstr "erreferentzia ozena" #: ../quodlibet/util/tags.py:142 msgid "discs" msgstr "diskoak" #: ../quodlibet/util/tags.py:144 msgid "tracks" msgstr "pistak" #: ../quodlibet/util/tags.py:145 msgid "last started" msgstr "azken abiarazia" #: ../quodlibet/util/tags.py:146 msgid "full name" msgstr "Izen osoa" #: ../quodlibet/util/tags.py:153 msgid "mount point" msgstr "muntatze puntua" #: ../quodlibet/util/tags.py:155 msgid "people" msgstr "jendea" #: ../quodlibet/util/tags.py:157 msgid "year" msgstr "urtea" #: ../quodlibet/util/tags.py:158 #, fuzzy msgid "original release year" msgstr "jatorrizko argitaratze data" #: ../quodlibet/util/tags.py:159 msgid "bookmark" msgstr "laster-marka" #: ../quodlibet/util/tags.py:162 #, fuzzy msgid "file format" msgstr "Ez dago denbora informaziorik" #: ../quodlibet/util/tags.py:165 #, fuzzy msgid "playlists" msgstr "Erreprodukzio-zerrendak" #: ../quodlibet/util/tags.py:166 msgid "channel count" msgstr "" #. Translators: e.g. "artist (sort)" #: ../quodlibet/util/tags.py:256 msgid "sort" msgstr "" #. Translators: e.g. "performer (roles)" #: ../quodlibet/util/tags.py:264 msgid "roles" msgstr "" #, fuzzy #~ msgid "browsers" #~ msgstr "Nabigatzaileak" #, fuzzy #~ msgid "Could not import %s. Audio Feeds browser disabled." #~ msgstr "" #~ "Ezin da python-feedparser inportatu, audio jario nabigatzaile desgaiturik." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%(dump-path)s</b> that will help us debug the crash. Please file a new " #~ "issue at %(new-issue-url)sand attach this file or include its contents. " #~ "This file may contain some identifying information about you or your " #~ "system, such as a list of recent files played. If this is unacceptable, " #~ "send <b>%(mini-dump-path)s</b> instead with a description of what you " #~ "were doing." #~ msgstr "" #~ "Salbuespen bat gertatu da Quod Libet-en. Iraulketa fitxategi bat gorde da " #~ "<b>%s</b>-en zuri kraskatzea arazten laguntzeko. Mesedez ireki programa- " #~ "errore txostena at http://code.google.com/p/quodlibet/issues/list gunean " #~ "eta erantsi fitxategia edo bertako edukia. Fitxategi honek zure sistema " #~ "ezagutagarri egin dezakeen informazioa izan dezake, azken " #~ "erreproduzitutako abestiak adibidez. Hau onartezina bada bidali <b>%s</b> " #~ "zer egiten ari zinen azalpenarekin.." #~ msgid "" #~ "Quod Libet may now be unstable. Closing it and restarting is recommended. " #~ "Your library will be saved." #~ msgstr "" #~ "QuodLibet ezegonkor egon liteke. Itxi eta berriz irekitzea gomendatzen " #~ "da. \n" #~ "Bilduma gordea izango da." #~ msgid "Unable to download lyrics." #~ msgstr "Ezin dira letrak deskargatu." #~ msgid "Remove all songs from the queue" #~ msgstr "Kendu ilarako abesti guztiak" #~ msgid "Watch this folder for new songs" #~ msgstr "Bilatu kanta berriak karpeta honetan" #~ msgid "Set or toggle the playback order" #~ msgstr "Ezarri edo txandakatu erreprodukzio ordena" #~ msgid "Uninitialized iPod" #~ msgstr "Hasieratu-gabeko iPoda" #~ msgid "Do you want to create an empty database on this iPod?" #~ msgstr "Data-base huts bat sortu nahi al duzu iPod honentzat?" #~ msgid "_Volume Gain (dB):" #~ msgstr "_Bolumen irabazia (dB):" #~ msgid "Combine tags with _multiple values" #~ msgstr "Nahasi etiketak balio a_nitzekin" #~ msgid "Model:" #~ msgstr "Modeloa:" #~ msgid "Capacity:" #~ msgstr "Kapazitatea:" #~ msgid "Firmware:" #~ msgstr "Firmwarea:" #~ msgid "Removing orphaned iPod track" #~ msgstr "iPod pista umezurtzak kentzen" #, fuzzy #~ msgid "Saving iPod database…" #~ msgstr "Ezin da iPod datu-basea gorde" #~ msgid "Unable to save iPod database" #~ msgstr "Ezin da iPod datu-basea gorde" #, fuzzy #~ msgid "Could not find libgpod, iPod support disabled." #~ msgstr "Ezin da python-gpod inporatu, iPod euskarria desgaitua." #, fuzzy #~ msgid "Track Repeat" #~ msgstr "Pistaren erpina" #~ msgid "Shuffle" #~ msgstr "Ausaz" #~ msgid "Weighted" #~ msgstr "Iraupena" #~ msgid "_Weighted" #~ msgstr "_Iraupena" #~ msgid "_One Song" #~ msgstr "_Abesti bat" #~ msgid "Restart the playlist when finished" #~ msgstr "Berriz hasi erreprodukzio-zerrenda amaitzean" #~ msgid "Disable Browser" #~ msgstr "Desgaitu nabigatzailea" #~ msgid "_Disable Browser" #~ msgstr "_Desgaitu nabigatzailea" #, fuzzy #~ msgid "Force Write" #~ msgstr "Idatzi" #~ msgid "Filter on _Genre" #~ msgstr "Iragazi _generoz" #~ msgid "Filter on _Artist" #~ msgstr "Iragazi _artistaz" #~ msgid "Filter on Al_bum" #~ msgstr "Iragazi al_bumez" #~ msgid "_Music" #~ msgstr "_Musika" #, fuzzy #~ msgid "Add Bookmark" #~ msgstr "Laster-markak" #~ msgid "Song _List" #~ msgstr "Abesti _zerrenda" #, fuzzy #~ msgid "D:" #~ msgstr "W: " #, fuzzy #~ msgid "W:" #~ msgstr "W: " #, fuzzy #~ msgid "E:" #~ msgstr "E: " #, fuzzy #~ msgid "Stop _after this song" #~ msgstr "Gelditu kanta honen ondoren" #, fuzzy #~ msgid "Found %d result." #~ msgid_plural "Found %d results." #~ msgstr[0] "eta %d gehiago..." #~ msgstr[1] "eta %d gehiago..." #, fuzzy #~ msgid "Split _disc from album" #~ msgstr "Atera diskoa _albumetik" #, fuzzy #~ msgid "Timeout" #~ msgstr "Denbora" #, fuzzy #~ msgid "Select an album" #~ msgstr "Hautatu _denak" #, fuzzy #~ msgid "%(title)s and %(count)d more…" #~ msgid_plural "%(title)s and %(count)d more…" #~ msgstr[0] "%(title)s eta %(count)d gehiago" #~ msgstr[1] "%(title)s eta %(count)d gehiago" #, fuzzy #~ msgid "Playlist Export" #~ msgstr "Erreprodukzio-zerrendak" #~ msgid "_Use rounded corners on thumbnails" #~ msgstr "_Erabili borobildutako ertzak argazkitxoentzat" #, fuzzy #~ msgid "Round the corners of album artwork thumbnail images." #~ msgstr "" #~ "Borobildu album arte-lan argazkitxo irudiaren ertzak. Berrabiarazte behar " #~ "dezake eragin izateko." #~ msgid "Re_fresh Library" #~ msgstr "_Freskatu liburutegia" #, fuzzy #~ msgid "_Remove rating" #~ msgstr "Bikoiztuak ezabatu" #~ msgid "Unable to open input files" #~ msgstr "Ezin dira sarrera fitxategiak ireki" #~ msgid "" #~ "GStreamer has no element to handle reading files. Check your GStreamer " #~ "installation settings." #~ msgstr "" #~ "Gstreamer-ek ez du irakurritako fitxategiak kudeatzeko elementurik. " #~ "Aztertu zure Gstreamer instalazio ezarpenak." #~ msgid "Invalid audio backend" #~ msgstr "Audio azpiegitura baliogabea" #, fuzzy #~ msgid "The audio backend '%(backend-name)s' could not be loaded." #~ msgstr "%r audio azpiegitura ez dago instalaturik." #~ msgid "ql-save" #~ msgstr "Gorde" #, fuzzy #~ msgid "ql-revert" #~ msgstr "E_zabatu bilduma" #~ msgid "Print all tags to stdout" #~ msgstr "Erakutsi etiketa guztiak irteera estandarrean" #~ msgid "Load tags dumped with 'dump'" #~ msgstr "Kargatu 'dump'-ek jaurkitako etiketak" #~ msgid "command|filename" #~ msgstr "komandoa|fixtategi-izena" #~ msgid "command|tag" #~ msgstr "komandoa|etiketa" #, fuzzy #~ msgid "%s: Could not find 'libudev'." #~ msgstr "%s: Ezin da media-player-info aurkitu." #, fuzzy #~ msgid "heading|Search" #~ msgstr "Bilatu" #~ msgid "%d of %d" #~ msgstr "%d %d-tik" #, fuzzy #~ msgid "Usage: %s %s\n" #~ msgstr "Erabilera: %s %s" #~ msgid "_Download..." #~ msgstr "_Deskargak..." #, fuzzy #~ msgid "_New Station..." #~ msgstr "_Kate berria" #~ msgid "Overwrite <b>%s</b>?" #~ msgstr "Gainidatzi <b>%s</b>?" #~ msgid "Output Error" #~ msgstr "Irteera erroreak" #~ msgid "" #~ "GStreamer output pipeline could not be initialized. The pipeline might be " #~ "invalid, or the device may be in use. Check the player preferences." #~ msgstr "" #~ "Ezin izan da GStreamer irteera kanalizazioa abiatu.Kanalizazioa baliogaea " #~ "izanda daiteke edo gailua erabilita egon. Aztertu erreproduzigailu " #~ "ezarpenak." #~ msgid "Quod Libet is already running." #~ msgstr "Quod Libet martxan dago." #~ msgid "No song is currently playing." #~ msgstr "Ez dago abestirik erreproduzitzen." #~ msgid "Unable to write to %s. Removing it." #~ msgstr "Ezin da %s-en idatzi. Ezabatzen." #~ msgid "_Edit Bookmarks..." #~ msgstr "_Editatu laster-markak..." #~ msgid "_New Folder..." #~ msgstr "_Sortu karpeta..." #~ msgid "_Add to Playlist" #~ msgstr "_Gehitu erreprodukzio-zerrendara" #~ msgid "_Edit Display..." #~ msgstr "_Editatu bistaratzea..." #~ msgid "Output Log" #~ msgstr "Erregistro irteera" #, fuzzy #~ msgid "%(song_count)d songs" #~ msgstr "%(count)d kate" #~ msgid "_Add a Location..." #~ msgstr "_Gehitu kokapen bat..." #~ msgid "_Output Log" #~ msgstr "_Irteera erregistroa" #~ msgid "Invalid command %r received." #~ msgstr "%r komando baliogabea jasoa." #~ msgid "Unknown browser %r." #~ msgstr "%r nabigatzaile ezezaguna." #, fuzzy #~ msgid "Custom _Sort..." #~ msgstr "_Pertsonalizatu goiburuak..." #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d song?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d songs?" #~ msgstr[0] "" #~ "%d abestiren balorazioa aldatzera zoaz.\n" #~ "Jarraitu nahi duzu?" #~ msgstr[1] "" #~ "%d abestiren balorazioa aldatzera zoaz.\n" #~ "Jarraitu nahi duzu?" #, fuzzy #~ msgid "Are you sure you want to run the \"%s\" plugin on %d album?" #~ msgid_plural "Are you sure you want to run the \"%s\" plugin on %d albums?" #~ msgstr[0] "" #~ "%d abestiren balorazioa aldatzera zoaz.\n" #~ "Jarraitu nahi duzu?" #~ msgstr[1] "" #~ "%d abestiren balorazioa aldatzera zoaz.\n" #~ "Jarraitu nahi duzu?" #, fuzzy #~ msgid "Track Headers" #~ msgstr "Pis_ta goiburuak" #, fuzzy #~ msgid "People Headers" #~ msgstr "_Pertsona goiburuak" #, fuzzy #~ msgid "Album Headers" #~ msgstr "_Album goiburuak" #, fuzzy #~ msgid "Date Headers" #~ msgstr "_Data goiburuak" #, fuzzy #~ msgid "File Headers" #~ msgstr "_fixategi goiburuak" #, fuzzy #~ msgid "Production Headers" #~ msgstr "P_rodukzio goiburuak" #, fuzzy #~ msgid "Tag:" #~ msgstr "E_tiketa:" #~ msgid "Descending" #~ msgstr "Beheraka" #~ msgid "Too Many Errors" #~ msgstr "Errore gehiegi" #~ msgid "Stopping playback because there were %d errors in a row." #~ msgstr "Errenkada batean %d errore daudelako erreprodukzioa gelditzen." #~ msgid "Warnings" #~ msgstr "Abisuak" #~ msgid "General" #~ msgstr "Orokorra" #~ msgid "No log available." #~ msgstr "Erregistrurik gabe." #~ msgid "album artist (sort)" #~ msgstr "album artista (ordenatu)" #~ msgid "artist (sort)" #~ msgstr "artista (ordenatu)" #~ msgid "album (sort)" #~ msgstr "album (ordenatu)" #~ msgid "performer (sort)" #~ msgstr "interpretea (ordenatu)" #~ msgid "performers (sort)" #~ msgstr "interpreteak (ordenatu)" #~ msgid "MusicBrainz album artist ID" #~ msgstr "MusicBrainz album artista IDa" #~ msgid "errors" #~ msgstr "erroreak" #~ msgid "Failed reading album art \"%s\"" #~ msgstr "Album arte-lan \"%s\" irakurteak huts egin du" #~ msgid "Permanently delete this file?" #~ msgstr "Betirako ezabatu fitxategi hau?" #~ msgid "Permanently delete these files?" #~ msgstr "Betirako ezabatu fitxategi hauek?" #~ msgid "%(title)s and %(count)d more..." #~ msgid_plural "%(title)s and %(count)d more..." #~ msgstr[0] "%(title)s eta %(count)d gehiago..." #~ msgstr[1] "%(title)s eta %(count)d gehiago..." #, fuzzy #~ msgid "Version:" #~ msgstr "bertsioa" #~ msgid "_Cause an Error" #~ msgstr "E_rrore bat sortzen du" #~ msgid "" #~ "%s could not be added to your library.\n" #~ "\n" #~ msgstr "" #~ "%s ezin da liburutegian gehitu.\n" #~ "\n" #~ msgid "Error running command %r, caused by: %r." #~ msgstr "%r komando exekutatzeak huts egin du, %r dela eta." #, fuzzy #~ msgid "" #~ "An exception has occured in Quod Libet. A dump file has been saved to <b >" #~ "%s</b> that will help us debug the crash. Please file a new issue at " #~ "http://code.google.com/p/quodlibet/issues /list and attach this file or " #~ "include its contents. This file may contain some identifying information " #~ "about you or your system, such as a list of recent files played. If this " #~ "is unacceptable, send <b>% s</b> instead with a description of whatyou " #~ "were doing." #~ msgstr "" #~ "Salbuespen bat gertatu da Quod Libet-en. Iraulketa fitxategi bat gorde da " #~ "<b>%s</b>-en zuri kraskatzea arazten laguntzeko. Mesedez ireki programa- " #~ "errore txostena at http://code.google.com/p/quodlibet/issues/list gunean " #~ "eta erantsi fitxategia edo bertako edukia. Fitxategi honek zure sistema " #~ "ezagutagarri egin dezakeen informazioa izan dezake, azken " #~ "erreproduzitutako abestiak adibidez. Hau onartezina bada bidali <b>%s</b> " #~ "zer egiten ari zinen azalpenarekin..\n" #~ "\n" #~ "Quod Libet erabilezina egon liteke.Itxi eta berriz irekitzea gomendatzen " #~ "da. Zure liburutegia gordea izango da." #~ msgid "Could not import python-gpod, iPod support disabled." #~ msgstr "Ezin da python-gpod inporatu, iPod euskarria desgaitua." #, fuzzy #~ msgid "_Output device:" #~ msgstr "_Irteera kanalizazioa:" #~ msgid "Search your library" #~ msgstr "Bilatu zure liburutegian" #~ msgid "No eject command found." #~ msgstr "Ez da ebazpen komandorik aurkitu." #~ msgid "Unable to start web browser" #~ msgstr "Ezinda web nabigatzaile abiarazi" #~ msgid "" #~ "A web browser could not be found. Please set your $BROWSER variable, or " #~ "make sure /usr/bin/sensible-browser exists." #~ msgstr "" #~ "Ezin da nabigatzailerik aurkitu. Mesedez ezarri $BROWSER aldagaia, edo " #~ "ziurtatu /usr/bin/sensible-browser egotea." #, fuzzy #~ msgid "Library Error" #~ msgstr "Liburutegi nabigatzailea" #~ msgid "translator-credits" #~ msgstr "Piarres Beobide <pi@beobide.net>" #~ msgid "Other columns to display, separated by spaces" #~ msgstr "Bistaratzeko beste zutabeak, zuriunez bereizirik" #~ msgid "_Edit and Continue" #~ msgstr "_Editatu eta jarraitu" #, fuzzy #~ msgid "You are about to change the rating of %d song." #~ msgid_plural "You are about to change the rating of %d songs." #~ msgstr[0] "" #~ "%d abestiren balorazioa aldatzera zoaz.\n" #~ "Jarraitu nahi duzu?" #~ msgstr[1] "" #~ "%d abestiren balorazioa aldatzera zoaz.\n" #~ "Jarraitu nahi duzu?" #~ msgid "Confirm rating" #~ msgstr "Berretsi balorazioa" #, fuzzy #~ msgid "" #~ "{title} {version}\n" #~ "<{email}>\n" #~ "Copyright {dates}\t{authors}\n" #~ "\n" #~ "This is free software; see the source for copying conditions. There is " #~ "NO\n" #~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " #~ "PURPOSE.\n" #~ msgstr "" #~ "%s %s - <quod-libet-development@googlegroups.com>\n" #~ "Copyright 2004-2005 Joe Wreschnig, Michael Urman, eta beste zenbait\n" #~ "\n" #~ "Hau software librea da, kopiatze baldintzak ikusteko begiratu iturburuan. " #~ "EZ dago bermerik \n" #~ "ezta MERKATARITZA edo ERABILERA warranty; not even for MERCHANTABILITY or " #~ "FITNESS FOR A PARTICULAR PURPOSE.\n" #~ msgid "%r doesn't contain any browsers." #~ msgstr "%r-ek ez du nabigatzailerik." #, fuzzy #~ msgid "Total size unknown" #~ msgstr "Tamaina guztira:" #~ msgid "%r doesn't contain any devices." #~ msgstr "%r-ek ez du gailurik." #~ msgid "%s: Could not import ctypes." #~ msgstr "%s: Ezin da ctypes inportatu." #~ msgid "%s: Could not find media-player-info." #~ msgstr "%s: Ezin da media-player-info aurkitu." #, fuzzy #~ msgid "Couldn't find module %s." #~ msgstr "%s: Ezin da media-player-info aurkitu." #~ msgid "Quod Libet Plugins" #~ msgstr "Quod Libet pluginak" #~ msgid "" #~ "Display simple searches in blue, advanced ones in green, and invalid ones " #~ "in red" #~ msgstr "" #~ "Bistarazi bilaketa arruntak urdinez, hedatutakoak berdez eta baliogabeak " #~ "gorriz" #~ msgid "_Select" #~ msgstr "_Hautatu" #~ msgid "Separators for splitting tags" #~ msgstr "Bereizleak zatitutako etiketentzat" #~ msgid "Quod Libet Preferences" #~ msgstr "Quod Libet hobespenak" #~ msgid "Not Played To_day" #~ msgstr "_Gaur erreproduzitu gabe" #~ msgid "Not Played in a _Week" #~ msgstr "_Aste batean erreproduzitu gabe" #~ msgid "Not Played in a _Month" #~ msgstr "_Hilabete batean erreproduzitu gabe" #~ msgid "B_ottom 40" #~ msgstr "40 gutxien era_biliak" #~ msgid "" #~ "The 40 songs you've played least (more than 40 may be chosen if there are " #~ "ties)" #~ msgstr "" #~ "Azken erreproduzitutako 40 abestiak (40 baino gehiago egon litezke " #~ "berdinketarik badago)" #~ msgid "gtk-media-next" #~ msgstr "_Hurrengoa" #~ msgid "gtk-media-previous" #~ msgstr "_Aurrekoa" #~ msgid "gtk-media-play" #~ msgstr "_Erreproduzitu" #~ msgid "gtk-media-pause" #~ msgstr "_Gelditu" #~ msgid "[ --print-playing | control ]" #~ msgstr "[ --print-playing | kontrol ]" #~ msgid "Date" #~ msgstr "Data" #~ msgid "Choose New Stations" #~ msgstr "Hautatu kate berriak" #~ msgid "Add" #~ msgstr "Gehitu" #~ msgid "Bitrate" #~ msgstr "Bit-tasa" #~ msgid "_Stations..." #~ msgstr "Ka_teak..." #~ msgid "Quod Libet" #~ msgstr "Quod Libet" #~ msgid "Initializing audio backend (%s)" #~ msgstr "Audio azpiegitura abiarazten (%s)" #~ msgid "Initializing main library (%s)" #~ msgstr "Liburutegi nagusia hasieratzen (%s)" #~ msgid "Unable to save library" #~ msgstr "Ezin da liburutegia gorde" #~ msgid "" #~ "The audio output pipeline %r could not be created. Check your GStreamer " #~ "settings in ~/.quodlibet/config." #~ msgstr "" #~ "Ezin izan da %r audio irteera kanalizazioa sortu. Aztertu zure GStreamer " #~ "ezarpenak ~/.quodlibet/config-en." ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/README������������������������������������������������������������������������������0000644�0001750�0001750�00000001260�13112005742�014614� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ex Falso / Quod Libet - A Music Library/Editor/Player ===================================================== Quod Libet is a music management program. It provides several different ways to view your audio library, as well as support for Internet radio and audio feeds. It has extremely flexible metadata tag editing and searching capabilities. Ex Falso is a tag editor with the same tag editing interface as Quod Libet. For information on how to build/install/test Quod Libet check out https://quodlibet.readthedocs.org/en/latest/development/overview.html .. image:: https://travis-ci.org/quodlibet/quodlibet.svg?branch=master :target: https://travis-ci.org/quodlibet/quodlibet ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/�������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�014644� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/quodlibet.desktop.in�����������������������������������������������������������0000644�0001750�0001750�00000001451�13112005742�020637� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[Desktop Entry] Name=Quod Libet _GenericName=Music Player _Comment=Listen to, browse, or edit your audio collection Exec=quodlibet --run --play-file %u MimeType=application/x-flac;audio/aac;audio/aiff;audio/midi;audio/mp3;audio/mp4;audio/mpeg;audio/mpeg4;audio/mpg;audio/ogg;audio/vorbis;audio/wav;audio/wave;audio/x-aac;audio/x-aiff;audio/x-flac;audio/x-m4a;audio/x-midi;audio/x-mp3;audio/x-mpc;audio/x-mpeg;audio/x-ms-wma;audio/x-ms-wmv;audio/x-musepack;audio/x-oggflac;audio/x-speex;audio/x-tta;audio/x-wav;audio/x-wavpack;audio/x-wma;video/ogg;video/x-ms-asf;video/x-theora;video/x-wmv;x-scheme-handler/quodlibet; Terminal=false StartupNotify=true Type=Application Icon=quodlibet Categories=AudioVideo;Audio;Player;GTK; #http://live.gnome.org/GnomeGoals/NotificationSource X-GNOME-UsesNotifications=true �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/net.sacredchao.QuodLibet.service.in��������������������������������������������0000644�0001750�0001750�00000000112�13112005742�023377� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[D-BUS Service] Name=net.sacredchao.QuodLibet Exec=@PREFIX@/bin/quodlibet ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/exfalso.desktop.in�������������������������������������������������������������0000644�0001750�0001750�00000000343�13112005742�020307� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[Desktop Entry] Name=Ex Falso _GenericName=Audio tag editor _Comment=Edit tags in your audio files Exec=exfalso Terminal=false StartupNotify=true Type=Application Icon=exfalso Categories=AudioVideo;Audio;AudioVideoEditing;GTK; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/exfalso.appdata.xml.in���������������������������������������������������������0000644�0001750�0001750�00000002123�13112005742�021045� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <application> <id type="desktop">exfalso.desktop</id> <name>Ex Falso</name> <_summary>Edit tags in your audio files</_summary> <metadata_license>CC0</metadata_license> <project_license>GPL-2.0</project_license> <translation type="gettext">quodlibet</translation> <description> <_p> Ex Falso is a tag editor with the same tag editing interface as Quod Libet. It lets you display and edit any tags you want in the file, for all the file formats it supports. </_p> <_p> Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI. </_p> </description> <screenshots> <screenshot type="default"> <image>https://quodlibet.readthedocs.org/en/latest/_images/exfalso.png</image> </screenshot> </screenshots> <url type="homepage">https://quodlibet.readthedocs.org</url> <updatecontact>quod-libet-development@googlegroups.com</updatecontact> </application> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/org.mpris.MediaPlayer2.quodlibet.service.in������������������������������������0000644�0001750�0001750�00000000122�13112005742�025014� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[D-BUS Service] Name=org.mpris.MediaPlayer2.quodlibet Exec=@PREFIX@/bin/quodlibet ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/quodlibet.1��������������������������������������������������������������������0000644�0001750�0001750�00000016641�13112005742�016730� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.\" Man page generated from reStructuredText. . .TH QUODLIBET 1 "" "" "" .SH NAME quodlibet \- audio library manager and player . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .SH SYNOPSIS .nf \fBquodlibet\fP [ \fB\-\-print\-playing\fP | \fIcontrol\fP ] \fBexfalso\fP [ \fIdirectory\fP ] .fi .sp .SH DESCRIPTION .sp Quod Libet is a music management program. It provides several different ways to view your audio library, as well as support for Internet radio and audio feeds. It has extremely flexible metadata tag editing and searching capabilities. .sp This manual page is only a short reference for Quod Libet. Complete documentation is available at \fI\%https://quodlibet.readthedocs.io/en/latest/guide/index.html\fP\&. .SH OPTIONS .INDENT 0.0 .TP .B \-\-enqueue filename|query Enqueue a filename or query results .TP .B \-\-filter tag=value Filter on a tag value .UNINDENT .INDENT 0.0 .TP .B \-\-focus Focus the running player .TP .B \-\-hide\-window Hide main window .TP .B \-\-next Jump to next song .TP .B \-\-list\-browsers List available browsers .TP .BI \-\-open\-browser\fB= BrowserName Open a new browser .UNINDENT .INDENT 0.0 .TP .B \-\-order=inorder|shuffle|weighted|onesong|toggle Set or toggle the playback order .UNINDENT .INDENT 0.0 .TP .B \-\-pause Pause playback .TP .B \-\-play Start playback .TP .BI \-\-play\-file\fB= filename Play a file .TP .B \-\-play\-pause Toggle play/pause mode .TP .B \-\-previous Jump to previous song if near the beginning, otherwise restart .TP .B \-\-force\-previous Jump to previous song .TP .B \-\-print\-playlist Print the current playlist .TP .B \-\-print\-queue Print the contents of the queue .TP .B \-\-print\-playing Print out information about the currently playing song. You may provide in a string like the kind described in the RENAMING FILES section below. .TP .BI \-\-query\fB= search\-string Search your audio library .TP .B \-\-run Start Quod Libet if it isn\(aqt running .TP .B \-\-quit Exit Quod Libet .TP .BI \-\-random\fB= tag Filter on a random value .TP .B \-\-refresh Refresh and rescan library .UNINDENT .INDENT 0.0 .TP .B \-\-repeat=off|on|t Turn repeat off, on, or toggle .TP .B \-\-seek=[+|\-][HH:]MM:SS Seek within the playing song .UNINDENT .INDENT 0.0 .TP .BI \-\-set\-browser\fB= BrowserName Set the current browser .UNINDENT .INDENT 0.0 .TP .B \-\-set\-rating=0.0..1.0 Rate the playing song .UNINDENT .INDENT 0.0 .TP .B \-\-show\-window Show main window .TP .B \-\-start\-hidden Don\(aqt show any windows on start .TP .B \-\-start\-playing Begin playing immediately .TP .B \-\-status Print playing status .UNINDENT .INDENT 0.0 .TP .B \-\-stop\-after=0|1|t Stop after the playing song .UNINDENT .INDENT 0.0 .TP .B \-\-toggle\-window Toggle main window visibility .TP .B \-\-unfilter Remove active browser filters .UNINDENT .INDENT 0.0 .TP .B \-\-unqueue=filename|query Unqueue a file or query .TP .B \-\-volume=(+|\-|)0..100 Set the volume .UNINDENT .SH ALBUM COVERS .sp Album covers should be put in the same directory as the songs they apply to, and have "folder", "front", or "cover" in their filenames. If you want to store multiple albums in the same directory but keep distinct cover images, the name of the appropriate image file must contain the labelid tag value, e.g. COCX\-32760 cover.jpg. .SH TIED TAGS .sp Many places in Quod Libet allow you to use "tied tags". Tied tags are two tag names joined together with a "~" like "title~version" or "album~part". Tied tags result in "nice" displays even when one of the tags is missing; for example, "title~version" will result in Title \- Version when a version tag is present, but only Title when one isn\(aqt. You can tie any number of tags together. .SH SEARCH SYNTAX .sp All of Quod Libet\(aqs search boxes support advanced searches of the following forms: .sp .nf tag = value tag = !value tag = "value" tag = /value/ tag = &(value1, value2) tag = |(value1, value2) !tag = value |(tag1 = value1, tag2 = value2) &(tag1 = value1, tag2 = value2) #(numerictag < value) #(numerictag = value) #(numerictag > value) .fi .sp .sp .sp The \(aqc\(aq postfix on strings or regular expressions makes the search case\-sensitive. Numeric values may be given as integers, floating\-point numbers, MM:SS format, or simple English, e.g. "3 days", "2 hours". .sp See \fI\%https://quodlibet.readthedocs.io/en/latest/guide/searching.html\fP\&. .sp All internal tags begin with a ~ character. Non\-numeric internal tags are ~base‐ name, ~dirname, ~filename, ~format, ~length, ~people, and ~rating. Numeric internal tags are ~#added, ~#bitrate, ~#disc, ~#lastplayed, ~#laststarted, ~#length, ~#mtime, ~#playcount, ~#skipcount, and ~#track. .sp See \fI\%https://quodlibet.readthedocs.io/en/latest/guide/tags/internal_tags.html\fP\&. .SH RENAMING FILES .sp Quod Libet allows you to rename files based on their tags. In some cases you may wish to alter the filename depending on whether some tags are present or missing, in addition to their values. A common pattern might be .sp \fB<tracknumber>. <title~version>\fP .sp You can use a \(aq|\(aq to only text when a tag is present: .sp \fB<tracknumber|<tracknumber>. ><title~version>\fP .sp You can also specify literal text to use if the tag is missing by adding another \(aq|\(aq: .sp \fB<album|<album>|No Album> \- <title>\fP .sp See \fI\%https://quodlibet.readthedocs.io/en/latest/guide/renaming_files.html\fP\&. .SH AUDIO BACKENDS .sp Quod Libet uses GStreamer for audio playback. It tries to read your GConf GStreamer configuration, but if that fails it falls back to osssink. You can change the pipeline option in ~/.quodlibet/config to use a different sink, or pass options to the sink. For example, you might use esdsink or alsasink device=hw:1. .sp See \fI\%https://quodlibet.readthedocs.io/en/latest/guide/playback/backends.html\fP\&. .SH FILES .INDENT 0.0 .TP .B ~/.quodlibet/songs A pickled Python dict of cached metadata. Deleting this file will remove all songs from your library. .TP .B ~/.quodlibet/config Quod Libet\(aqs configuration file. This file is overwritten when Quod Libet exits. .TP .B ~/.quodlibet/current A "key=value" file containing information about the currently playing song. .TP .B ~/.quodlibet/control A FIFO connected to the most\-recently\-started instance of the program. \-\-next, \-\-previous, etc., use this to control the player. .TP .B ~/.quodlibet/plugins/ Put plugins here. .TP .B ~/.quodlibet/browsers/ Put custom library browsers here. .UNINDENT .sp See \fI\%https://quodlibet.readthedocs.io/en/latest/guide/interacting.html\fP\&. .SH BUGS .sp See \fI\%https://github.com/quodlibet/quodlibet/issues\fP for a list of all currently open bugs and feature requests. .SH AUTHORS .sp Joe Wreschnig and Michael Urman are the primary authors of Quod Libet. .SH SEE ALSO .nf \fI\%https://quodlibet.readthedocs.io/en/latest/guide/\fP, \fI\%https://quodlibet.readthedocs.io/en/latest/guide/faq.html\fP, \fBregex\fP(7), \fBgst\-launch\fP(1) .fi .sp .\" Generated by docutils manpage writer. . �����������������������������������������������������������������������������������������������quodlibet-3.9.1/data/quodlibet.zsh������������������������������������������������������������������0000644�0001750�0001750�00000003431�13112005742�017365� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#compdef quodlibet local browsers='(SearchBar Playlists PanedBrowser AlbumList '\ 'FileSystem InternetRadio AudioFeeds MediaDevices)' local orders='(toggle inorder shuffle weighted onesong)' _arguments \ '--enqueue=[Enqueue a file or query]:file or query:_files'\ '--filter=[Filter on a tag value]:key=value'\ '--focus[Focus the running player]'\ '--force-previous[Jump to previous song]'\ '--hide-window[Hide main window]'\ '--next[Jump to next song]'\ '--open-browser=[Open a new browser]:browser name:'$browsers\ '--order=[Set or toggle the playback order]:order or toggle:'$orders\ '--pause[Pause playback]'\ '--play[Start playback]'\ '--play-file=[Play a file]:filename:_files'\ '--play-pause[Toggle play/pause mode]'\ '--previous[Jump to previous song]'\ '--print-playing=[Print the playing song and exit]:pattern'\ '--print-playlist[Print the current playlist]'\ '--print-queue[Print the contents of the queue]'\ '--query[Search your audio library]'\ '--queue=[Show or hide the queue]:on|off|t:(on off t)'\ '--quit[Exit Quod Libet]'\ '--random=[Filter on a random value]:tag'\ '--refresh[Refresh and rescan library]'\ '--repeat=[Turn repeat off, on, or toggle it]:0|1|t:(0 1 t)'\ '--seek=[Seek within the playing song]:[+|-][HH\:]MM\:SS'\ '--set-browser=[Set the current browser]:browser name:'$browsers\ '--set-rating=[Rate the playing song]:0.0..1.0'\ '--show-window[Show main window]'\ '--song-list=[Show or hide the main song list]:on|off|t:(on off t)'\ '--start-playing[Begin playing immediately]'\ '--status[Print player status]'\ '--toggle-window[Toggle main window visibility]'\ '--unfilter[Remove active browser filters]'\ '--volume=[Set the volume]:(+|-|)0..100'\ '--volume-down[Turn down volume]'\ '--volume-up[Turn up volume]' ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/quodlibet-search-provider.ini��������������������������������������������������0000644�0001750�0001750�00000000242�13112005742�022430� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[Shell Search Provider] DesktopId=quodlibet.desktop BusName=net.sacredchao.QuodLibet.SearchProvider ObjectPath=/net/sacredchao/QuodLibet/SearchProvider Version=2 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/exfalso.1����������������������������������������������������������������������0000644�0001750�0001750�00000005111�13112005742�016367� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.\" Man page generated from reStructuredText. . .TH EXFALSO 1 "" "" "" .SH NAME exfalso \- audio tag editor . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .SH SYNOPSIS .sp \fBexfalso\fP [ \fIdirectory\fP ] .SH DESCRIPTION .sp Ex Falso displays and edits audio metadata tags. Supported formats include MP3, Ogg Vorbis, FLAC, Musepack (MPC), WavPack, and MOD/XM/IT. .sp This manual page is only a short reference for Ex Falso. Complete documentation is available at \fI\%https://quodlibet.readthedocs.io/en/latest/guide/\fP\&. .SH OPTIONS .sp Ex Falso may be given a directory to open on the command line. .SH TIED TAGS .sp Many places in Ex Falso allow you to use "tied tags". Tied tags are two tag names joined together with a "~" like "title~version" or "album~part". Tied tags result in "nice" displays even when one of the tags is missing; for example, "title~version" will result in Title \- Version when a version tag is present, but only Title when one isn\(aqt. You can tie any number of tags together. .SH RENAMING FILES .sp Ex Falso allows you to rename files based on their tags. In some cases you may wish to alter the filename depending on whether some tags are present or missing, in addition to their values. A common pattern might be .sp \fB<tracknumber>. <title~version>\fP .sp You can use a \(aq|\(aq to only text when a tag is present: .sp \fB<tracknumber|<tracknumber>. ><title~version>\fP .sp You can also specify literal text to use if the tag is missing by adding another \(aq|\(aq: .sp \fB<album|<album>|No Album> \- <title>\fP .sp See \fI\%https://quodlibet.readthedocs.io/en/latest/guide/renaming_files.html\fP\&. .SH BUGS .sp See \fI\%https://github.com/quodlibet/quodlibet/issues\fP for a list of all currently open bugs and feature requests. .SH AUTHORS .sp Joe Wreschnig and Michael Urman are the primary authors of Ex Falso. .SH SEE ALSO .nf \fI\%https://quodlibet.readthedocs.io/en/latest/guide/\fP, \fI\%https://quodlibet.readthedocs.io/en/latest/guide/faq.html\fP .fi .sp .\" Generated by docutils manpage writer. . �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/README.rst���������������������������������������������������������������������0000644�0001750�0001750�00000001177�13112005742�016343� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Some info on the file formats contained here: Man Pages (``*.1``) These are autogenerated using rst2man and the source can be found in ``docs/guide/commands`` Desktop Files (``*.desktop.in``) and AppData Files (``*.appdata.xml-in``) These can be edited here, but will be changed to include translations on installation. D-Bus Service Files (``*.service.in``) These depend on the installation path, so get changed during installation. GNOME Search Provider (``quodlibet-search-provider.ini``) Gets copied as is for GNOME to know that Quod Libet can provide a search provider (currently through a plugin) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/org.mpris.quodlibet.service.in�������������������������������������������������0000644�0001750�0001750�00000000105�13112005742�022540� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[D-BUS Service] Name=org.mpris.quodlibet Exec=@PREFIX@/bin/quodlibet �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/data/operon.1�����������������������������������������������������������������������0000644�0001750�0001750�00000020710�13112005742�016232� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.\" Man page generated from reStructuredText. . .TH OPERON 1 "" "" "" .SH NAME operon \- command line music tagger . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .SH SYNOPSIS .nf \fBoperon\fP [\-\-version] [\-\-help] [\-v | \-\-verbose] <\fIcommand\fP> [<\fIargument\fP>...] \fBoperon help\fP <\fIcommand\fP> .fi .sp .SH OPTIONS .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .B \-\-version Print the program version .TP .B \-v\fP,\fB \-\-verbose Verbose mode .UNINDENT .SH COMMAND-OVERVIEW .SS Edit Tags .nf \fIadd\fP Add a tag value \fIremove\fP Remove a tag value \fIset\fP Set a tag and remove existing values \fIclear\fP Remove tags \fIcopy\fP Copy tags from one file to another \fIedit\fP Edit tags in a text editor \fIfill\fP Fill tags based on the file path .fi .sp .SS Show file metadata .nf \fIlist\fP List tags \fIinfo\fP List file information \fIprint\fP Print tags based on the given pattern .fi .sp .SS Edit Embedded Images .nf \fIimage\-extract\fP Extract embedded images \fIimage\-set\fP Set embedded image \fIimage\-clear\fP Remove embedded images .fi .sp .SS Miscellaneous .nf \fItags\fP List all common tags \fIhelp\fP Display help information .fi .sp .SH EDIT TAGS .SS add .sp Add a new tag \fB<tag>\fP with the value \fB<value>\fP to all files. .sp operon add [\-h] <tag> <value> <file>... .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .UNINDENT .INDENT 0.0 .TP .B Example: operon add artist \(aqThe Beatles\(aq song1.ogg song2.ogg .UNINDENT .SS remove .sp Remove all values from the tag \fB<tag>\fP that match either \fB<value>\fP or the regular expression \fB<pattern>\fP from all files. .sp operon remove [\-h] [\-\-dry\-run] <tag> (\-e <pattern> | <value>) <file>... .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .B \-\-dry\-run Print the results without changing any files .TP .BI \-e\fP,\fB \-\-regexp \ <regexp> Remove all tag values that match the given regular expression .UNINDENT .INDENT 0.0 .TP .B Example: operon remove artist \(aqThe Beatles\(aq song.ogg .UNINDENT .SS set .sp Replace all values of the tag \fB<tag>\fP by \fB<value>\fP in all files. .sp operon set [\-h] [\-\-dry\-run] <tag> <value> <file>... .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .B \-\-dry\-run Print the results without changing any files .UNINDENT .INDENT 0.0 .TP .B Example: operon set artist \(aqThe Beatles\(aq song.ogg .UNINDENT .SS clear .sp Remove all tags that match \fB<tag>\fP or the regular expression \fB<pattern>\fP from all files. If \fI\-\-all\fP is specified, all known tags will be removed. .sp operon clear [\-h] [\-\-dry\-run] (\-a | \-e <pattern> | <tag>) <file>... .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .B \-\-dry\-run Print the results without changing any files .TP .B \-a\fP,\fB \-\-all Remove all tags .TP .BI \-e\fP,\fB \-\-regexp \ <regexp> Remove all tags that match the given regular expression .UNINDENT .INDENT 0.0 .TP .B Example: operon clear \-a song.ogg .sp operon clear \-e \(aqmusicbrainz_.*\(aq song.ogg .sp operon clear date song.ogg .UNINDENT .SS copy .sp Copy all tags from the file \fI<source>\fP to \fI<dest>\fP\&. All tags in \fB<dest>\fP will be preserved. In case the destination format doesn\(aqt support setting a tag from source, no tags will be copied. To ignore tags that aren\(aqt supported by the destination format pass \fI\-\-ignore\-errors\fP\&. .sp operon copy [\-h] [\-\-dry\-run] [\-\-ignore\-errors] <source> <dest> .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .B \-\-dry\-run Print the results without changing any files .TP .B \-\-ignore\-errors Skip tags which the target file does not support .UNINDENT .INDENT 0.0 .TP .B Example: operon copy song.flac song.ogg .UNINDENT .SS edit .sp Shows all tags in a text editor and will apply any changes made to the text to the tags. \fIoperon\fP will use the editor specified in the VISUAL or EDITOR environment variables and if those are not set fall back to \(aqnano\(aq. .sp operon edit [\-h] [\-\-dry\-run] <file> .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .B \-\-dry\-run Print the results without changing any files .UNINDENT .INDENT 0.0 .TP .B Example: VISUAL=vi operon edit song.flac .UNINDENT .SS fill .sp Fill tags based one file paths and a given pattern. .sp operon fill [\-h] [\-\-dry\-run] <pattern> <file>... .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help show this help message and exit .TP .B \-\-dry\-run show changes, don\(aqt apply them .UNINDENT .INDENT 0.0 .TP .B Example: operon fill \-\-dry\-run "<tracknumber>. <title>" "01. Was Ist Ist.flac" .UNINDENT .SH SHOW FILE METADATA .SS list .sp Lists all tags, values and a description of each tag in a table. .sp operon list [\-h] [\-a] [\-t] [\-c <c1>,<c2>...] <file> .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .B \-a\fP,\fB \-\-all Also list programmatic tags .TP .B \-t\fP,\fB \-\-terse Output is terse and suitable for script processing .UNINDENT .INDENT 0.0 .TP .B \-c, \-\-columns <name>,... Defines which columns should be printed and in which order .TP .B Example: operon list \-a song.flac .sp operon list \-t \-c tag,value song.ogg .UNINDENT .SS info .sp Lists non\-tag metadata like length, size and format. .sp operon info [\-h] [\-t] [\-c <c1>,<c2>...] <file> .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .B \-t\fP,\fB \-\-terse Output is terse and suitable for script processing .UNINDENT .INDENT 0.0 .TP .B \-c, \-\-columns <name>,... Defines which columns should be printed and in which order .TP .B Example: operon info a.ogg .UNINDENT .SS print .sp Prints information per file built from tag values. The pattern can be customized by passing a pattern string (See \fBquodlibet\fP(1) for the pattern format) .sp operon print [\-h] [\-p <pattern>] <file>... .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .BI \-p\fP,\fB \-\-pattern \ <pattern> Use a custom pattern .UNINDENT .INDENT 0.0 .TP .B Example: operon print \-p "<album> \- <artist>" a.ogg .UNINDENT .SH EDIT EMBEDDED IMAGES .SS image\-extract .sp Extract all embedded images to the current working directory or the specified destination directory. .sp operon image\-extract [\-h] [\-\-dry\-run] [\-\-primary] [\-d <destination>] <file>... .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .B \-\-dry\-run Print the found images and resulting file paths but don\(aqt save them .TP .B \-\-primary Only extract the primary images for each file .TP .BI \-d\fP,\fB \-\-destination \ <destination> Save all images to the specified destination .UNINDENT .INDENT 0.0 .TP .B Example: operon image\-extract asong.mp3 anotherone.ogg .UNINDENT .SS image\-set .sp Set the provided image as primary embedded image and remove all other embedded images. .sp operon image\-set <image\-file> <file>... .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .UNINDENT .INDENT 0.0 .TP .B Example: operon image\-set cover.jpg song.mp3 .UNINDENT .SS image\-clear .sp Remove all embedded images from all specified files. .sp operon image\-clear <file>... .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .UNINDENT .INDENT 0.0 .TP .B Example: operon image\-clear song.mp3 .UNINDENT .SH MISCELLANEOUS .SS tags .sp List all common tags .sp operon tags [\-h] [\-a] [\-t] [\-c <c1>,<c2>...] .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help Display help and exit .TP .B \-a\fP,\fB \-\-all Also list programmatic tags .TP .B \-t\fP,\fB \-\-terse Output is terse and suitable for script processing .UNINDENT .INDENT 0.0 .TP .B \-c, \-\-columns <name>,... Defines which columns should be printed and in which order .TP .B Example: operon tags \-a .sp operon tags \-t \-c tag .UNINDENT .SS help .sp operon help [<command>] .INDENT 0.0 .TP .B Example: operon help list .UNINDENT .SH SEE ALSO .nf \fBregex\fP(7) \fBexfalso\fP(1) \fBquodlibet\fP(1) .fi .sp .\" Generated by docutils manpage writer. . ��������������������������������������������������������quodlibet-3.9.1/data/quodlibet.appdata.xml.in�������������������������������������������������������0000644�0001750�0001750�00000002475�13112005742�021406� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <application> <id type="desktop">quodlibet.desktop</id> <name>Quod Libet</name> <_summary>Listen to, browse, or edit your audio collection</_summary> <metadata_license>CC0</metadata_license> <project_license>GPL-2.0</project_license> <translation type="gettext">quodlibet</translation> <description> <_p> Quod Libet is a music management program. It provides several different ways to view your audio library, as well as support for Internet radio and audio feeds. It has extremely flexible metadata tag editing and searching capabilities. </_p> <_p> Supported file formats include Ogg Vorbis/Opus/Speex/FLAC, MP3, FLAC, MOD/XM/IT, Musepack, Wavpack, MPEG-4 AAC, Monkeys Audio, WMA, SPC, MIDI. </_p> </description> <screenshots> <screenshot type="default"> <image>https://quodlibet.readthedocs.org/en/latest/_images/paned1.png</image> </screenshot> <screenshot> <image>https://quodlibet.readthedocs.org/en/latest/_images/queue_2browsers1.png</image> </screenshot> </screenshots> <url type="homepage">https://quodlibet.readthedocs.org</url> <updatecontact>quod-libet-development@googlegroups.com</updatecontact> </application> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/PKG-INFO����������������������������������������������������������������������������0000644�0001750�0001750�00000000456�13115513301�015035� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Metadata-Version: 1.0 Name: quodlibet Version: 3.9.1 Summary: a music library, tagger, and player Home-page: https://quodlibet.readthedocs.org Author: Steven Robertson and Christoph Reiter Author-email: quod-libet-development@googlegroups.com License: GNU GPL v2 Description: UNKNOWN Platform: UNKNOWN ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�015045� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/scripts.py��������������������������������������������������������������������0000644�0001750�0001750�00000003271�13112005742�017113� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 Joe Wreschnig # 2015-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os from .util import get_dist_class du_build_scripts = get_dist_class("build_scripts") class build_scripts(du_build_scripts): description = "copy scripts to build directory" def run(self): du_build_scripts.run(self) # remove ".py" for script in self.scripts: outfile = os.path.join(self.build_dir, os.path.basename(script)) new = os.path.splitext(outfile)[0] try: os.unlink(new) except OSError: pass self.move_file(outfile, new) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/appdata.py��������������������������������������������������������������������0000644�0001750�0001750�00000007660�13112005742�017044� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ AppData Specification: http://people.freedesktop.org/~hughsient/appdata/ """ import os from distutils.dep_util import newer from .util import Command from .gettextutil import intltool class build_appdata(Command): """Build .appdata.xml files Move .appdata.xml files to the appropriate location in the build tree. If there is a .appdata.xml.in file, process it with intltool. """ description = "build .appdata.xml files" user_options = [] def initialize_options(self): self.build_base = None self.po_directory = None self.appdata = None def finalize_options(self): self.appdata = self.distribution.appdata self.po_directory = self.distribution.po_directory self.set_undefined_options('build', ('build_base', 'build_base')) def run(self): basepath = os.path.join(self.build_base, 'share', 'appdata') self.mkpath(basepath) for appdata in self.appdata: if os.path.exists(appdata + ".in"): fullpath = os.path.join(basepath, os.path.basename(appdata)) if newer(appdata + ".in", fullpath): self.spawn( intltool("merge", "-x", self.po_directory, appdata + ".in", fullpath)) else: self.copy_file(appdata, os.path.join(basepath, appdata)) class install_appdata(Command): """Install .appdata.xml files Install any .appdata.xml files from the build tree to their final location, under $prefix/share/appdata. """ description = "install .appdata.xml files" user_options = [] def initialize_options(self): self.install_dir = None self.skip_build = None self.appdata = None self.build_base = None self.outfiles = [] def finalize_options(self): self.set_undefined_options('build', ('build_base', 'build_base')) self.set_undefined_options( 'install', ('install_data', 'install_dir'), ('skip_build', 'skip_build')) self.set_undefined_options( 'build_appdata', ('appdata', 'appdata')) def get_outputs(self): return self.outfiles def run(self): if not self.skip_build: self.run_command('build_appdata') basepath = os.path.join(self.install_dir, 'share', 'appdata') srcpath = os.path.join(self.build_base, 'share', 'appdata') out = self.mkpath(basepath) self.outfiles.extend(out or []) for appdata in self.appdata: appdata = os.path.basename(appdata) fullsrc = os.path.join(srcpath, appdata) fullpath = os.path.join(basepath, appdata) (out, _) = self.copy_file(fullsrc, fullpath) self.outfiles.append(out) __all__ = ["build_appdata", "install_appdata"] ��������������������������������������������������������������������������������quodlibet-3.9.1/gdist/clean.py����������������������������������������������������������������������0000644�0001750�0001750�00000006533�13112005742�016512� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 Joe Wreschnig # 2012,2013,2015, 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """clean up output of 'build' commands""" import os import shutil from .util import get_dist_class distutils_clean = get_dist_class("clean") class clean(distutils_clean): """clean up output of 'build' commands GDistribution commands generate files that the normal distutils clean command doesn't. This removes them. """ description = "clean up output of 'build' commands" def initialize_options(self): distutils_clean.initialize_options(self) self.shortcuts = None self.po_package = None self.po_directory = None def finalize_options(self): distutils_clean.finalize_options(self) self.shortcuts = self.distribution.shortcuts self.po_package = self.distribution.po_package self.po_directory = self.distribution.po_directory def run(self): distutils_clean.run(self) if not self.all: return # gettext byproducts if self.po_directory and self.po_package: pot = os.path.join(self.po_directory, self.po_package + ".pot") try: os.unlink(pot) except OSError: pass # Python byproducts def should_remove(filename): if (filename.lower()[-4:] in [".pyc", ".pyo"] or filename.endswith("~") or (filename.startswith("#") and filename.endswith("#"))): return True else: return False for pathname, dirs, files in os.walk("."): for filename in filter(should_remove, files): try: os.unlink(os.path.join(pathname, filename)) except EnvironmentError as err: print(str(err)) # setup.py byproducts for base in ["coverage", "build", "dist"]: if os.path.isdir(base): shutil.rmtree(base) # docs for entry in os.listdir("docs"): path = os.path.join("docs", entry) if entry.startswith("_") and os.path.isdir(path): shutil.rmtree(path) try: os.remove("MANIFEST") except EnvironmentError: pass __all__ = ["clean"] ���������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/man.py������������������������������������������������������������������������0000644�0001750�0001750�00000005236�13112005742�016202� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007-2008 Joe Wreschnig # 2009,2012-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """install man pages Commands to install Unix man pages. """ import os from .util import Command class install_man(Command): """install man pages Install man pages into $prefix/share/man/manN or into $mandir/manN by using setup.py install --mandir=$mandir """ description = "install man pages" user_options = [] def initialize_options(self): self.man_pages = None self.mandir = None self.install_dir = None self.outfiles = [] def finalize_options(self): self.set_undefined_options( 'install', ('install_data', 'install_dir'), ('mandir', 'mandir'), ) if self.mandir is None: self.mandir = os.path.join(self.install_dir, 'share', 'man') self.man_pages = self.distribution.man_pages for man_page in self.man_pages: if not man_page[-1].isdigit(): raise SystemExit("%r has no section" % man_page) def get_outputs(self): return self.outfiles def run(self): basepath = self.mandir out = self.mkpath(basepath) self.outfiles.extend(out or []) for man_page in self.man_pages: manpath = os.path.join(basepath, "man" + man_page[-1]) out = self.mkpath(manpath) self.outfiles.extend(out or []) fullpath = os.path.join(manpath, os.path.basename(man_page)) (out, _) = self.copy_file(man_page, fullpath) self.outfiles.append(out) __all__ = ["install_man"] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/zsh_completions.py������������������������������������������������������������0000644�0001750�0001750�00000003665�13112005742�020653� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os from .util import Command class install_zsh_completions(Command): user_options = [] def initialize_options(self): self.install_dir = None self.zsh_completions = [] self.outfiles = [] def finalize_options(self): self.set_undefined_options('install', ('install_data', 'install_dir')) self.zsh_completions = self.distribution.zsh_completions def get_outputs(self): return self.outfiles def run(self): basepath = os.path.join( self.install_dir, 'share', 'zsh', 'vendor-completions') out = self.mkpath(basepath) self.outfiles.extend(out or []) for src, dest in self.zsh_completions: (out, _) = self.copy_file(src, os.path.join(basepath, dest)) self.outfiles.append(out) ���������������������������������������������������������������������������quodlibet-3.9.1/gdist/util.py�����������������������������������������������������������������������0000644�0001750�0001750�00000002540�13112005742�016377� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from distutils.core import Distribution from distutils.core import Command def get_dist_class(name): # in case of setuptools this returns the extended commands return Distribution({}).get_command_class(name) Distribution, Command, get_dist_class ����������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/docs.py�����������������������������������������������������������������������0000644�0001750�0001750�00000003577�13112005742�016365� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os from .util import Command class build_sphinx(Command): description = "build sphinx documentation" user_options = [ ("build-dir=", "d", "build directory"), ("all", "a", "build all docs, not just the user guide"), ] def initialize_options(self): self.build_dir = None self.all = False def finalize_options(self): self.build_dir = self.build_dir or "build" self.all = bool(self.all) def run(self): DOCS_ROOT = "docs" GUIDE_ROOT = os.path.join(DOCS_ROOT, "guide") TARGET = os.path.join(self.build_dir, "sphinx") srcdir = GUIDE_ROOT if not self.all else DOCS_ROOT self.spawn(["sphinx-build", "-b", "html", "-c", DOCS_ROOT, "-n", "-E", srcdir, TARGET]) ���������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/__init__.py�������������������������������������������������������������������0000644�0001750�0001750�00000016472�13115500547�017200� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 Joe Wreschnig # 2012-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """distutils extensions for GTK+/GObject/Unix This module contains a Distribution subclass (GDistribution) which implements build and install commands for operations related to Python GTK+ and GObject support. This includes installation of man pages and gettext/intltool support. Also supports setuptools but needs to be imported after setuptools (which does some monkey patching) """ import sys from distutils.core import setup from .shortcuts import build_shortcuts, install_shortcuts from .man import install_man from .po import build_mo, install_mo, po_stats, update_po, create_po from .icons import install_icons from .search_provider import install_search_provider from .dbus_services import build_dbus_services, install_dbus_services from .appdata import build_appdata, install_appdata from .coverage import coverage_cmd from .docs import build_sphinx from .scripts import build_scripts from .tests import quality_cmd, distcheck_cmd, test_cmd from .clean import clean from .zsh_completions import install_zsh_completions from .util import get_dist_class, Distribution distutils_build = get_dist_class("build") class build(distutils_build): """Override the default build with new subcommands.""" user_options = distutils_build.user_options + [ ("skip-po-update", None, "Don't update pot/po files"), ] sub_commands = distutils_build.sub_commands + [ ("build_mo", lambda self: self.distribution.has_po()), ("build_shortcuts", lambda self: self.distribution.has_shortcuts()), ("build_dbus_services", lambda self: self.distribution.has_dbus_services()), ("build_appdata", lambda self: self.distribution.has_appdata()), ] distutils_install = get_dist_class("install") class install(distutils_install): """Override the default install with new subcommands.""" user_options = distutils_install.user_options + [ ("mandir=", None, "destination directory for man pages. " "Defaults to $PREFIX/share/man"), ] sub_commands = distutils_install.sub_commands + [ ("install_shortcuts", lambda self: self.distribution.has_shortcuts()), ("install_man", lambda self: self.distribution.has_man_pages()), ("install_mo", lambda self: self.distribution.has_po()), ("install_icons", lambda self: self.distribution.need_icon_install()), ("install_search_provider", lambda self: self.distribution.need_search_provider()), ("install_dbus_services", lambda self: self.distribution.has_dbus_services()), ("install_appdata", lambda self: self.distribution.has_appdata()), ("install_zsh_completions", lambda self: self.distribution.has_zsh_completions()), ] def initialize_options(self): distutils_install.initialize_options(self) self.mandir = None is_osx = (sys.platform == "darwin") class GDistribution(Distribution): """A Distribution with support for GTK+-related options The GDistribution class adds a number of commads and parameters related to GTK+ and GObject Python programs and libraries. Parameters (to distutils.core.setup): po_directory -- directory where .po files are contained po_package -- package name for translation files shortcuts -- list of .desktop files to build/install dbus_services -- list of .service files to build/install man_pages -- list of man pages to install appdata -- list of appdata files to install Using the translation features requires intltool. Example: from distutils.core import setup from gdist import GDistribution setup(distclass=GDistribution, ...) """ shortcuts = [] appdata = [] dbus_services = [] po_directory = None man_pages = [] po_package = None search_provider = None coverage_options = {} zsh_completions = [] def __init__(self, *args, **kwargs): Distribution.__init__(self, *args, **kwargs) self.cmdclass.setdefault("build_mo", build_mo) self.cmdclass.setdefault("build_shortcuts", build_shortcuts) self.cmdclass.setdefault("build_dbus_services", build_dbus_services) self.cmdclass.setdefault("build_appdata", build_appdata) self.cmdclass.setdefault("build_scripts", build_scripts) self.cmdclass.setdefault("install_icons", install_icons) self.cmdclass.setdefault("install_shortcuts", install_shortcuts) self.cmdclass.setdefault("install_dbus_services", install_dbus_services) self.cmdclass.setdefault("install_man", install_man) self.cmdclass.setdefault("install_mo", install_mo) self.cmdclass.setdefault("install_search_provider", install_search_provider) self.cmdclass.setdefault("install_appdata", install_appdata) self.cmdclass.setdefault( "install_zsh_completions", install_zsh_completions) self.cmdclass.setdefault("build", build) self.cmdclass.setdefault("install", install) self.cmdclass.setdefault("po_stats", po_stats) self.cmdclass.setdefault("update_po", update_po) self.cmdclass.setdefault("create_po", create_po) self.cmdclass.setdefault("coverage", coverage_cmd) self.cmdclass.setdefault("build_sphinx", build_sphinx) self.cmdclass.setdefault("quality", quality_cmd) self.cmdclass.setdefault("distcheck", distcheck_cmd) self.cmdclass.setdefault("test", test_cmd) self.cmdclass.setdefault("quality", quality_cmd) self.cmdclass.setdefault("clean", clean) def has_po(self): return bool(self.po_directory) def has_shortcuts(self): return not is_osx and bool(self.shortcuts) def has_appdata(self): return not is_osx and bool(self.appdata) def has_man_pages(self): return bool(self.man_pages) def has_dbus_services(self): return not is_osx and bool(self.dbus_services) def has_zsh_completions(self): return bool(self.zsh_completions) def need_icon_install(self): return not is_osx def need_search_provider(self): return not is_osx __all__ = ["GDistribution", "setup"] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/search_provider.py������������������������������������������������������������0000644�0001750�0001750�00000003610�13112005742�020600� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os from .util import Command class install_search_provider(Command): user_options = [] def initialize_options(self): self.install_dir = None self.search_provider = None self.outfiles = [] def finalize_options(self): self.set_undefined_options('install', ('install_data', 'install_dir')) self.search_provider = self.distribution.search_provider def get_outputs(self): return self.outfiles def run(self): basepath = os.path.join( self.install_dir, 'share', 'gnome-shell', 'search-providers') out = self.mkpath(basepath) self.outfiles.extend(out or []) (out, _) = self.copy_file(self.search_provider, basepath) self.outfiles.append(out) ������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/shortcuts.py������������������������������������������������������������������0000644�0001750�0001750�00000010171�13112005742�017457� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007-2008 Joe Wreschnig # 2009,2012-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os from distutils.dep_util import newer from .util import Command from .gettextutil import intltool class build_shortcuts(Command): """Build .desktop files Move .desktop files to the appropriate location in the build tree. If there is a .desktop.in file, process it with intltool. """ description = "build .desktop files" user_options = [] def initialize_options(self): self.build_base = None def finalize_options(self): self.shortcuts = self.distribution.shortcuts self.po_directory = self.distribution.po_directory self.set_undefined_options('build', ('build_base', 'build_base')) def __check_po(self): """Exit if translation is needed and not available""" if not (self.po_directory and os.path.isdir(self.po_directory)): raise SystemExit("PO directory %r not found." % self.po_directory) def run(self): basepath = os.path.join(self.build_base, 'share', 'applications') self.mkpath(basepath) for shortcut in self.shortcuts: if os.path.exists(shortcut + ".in"): fullpath = os.path.join(basepath, os.path.basename(shortcut)) self.__check_po() if newer(shortcut + ".in", fullpath): self.spawn( intltool("merge", "-d", self.po_directory, shortcut + ".in", fullpath)) else: self.copy_file(shortcut, os.path.join(basepath, shortcut)) class install_shortcuts(Command): """Install .desktop files Install any .desktop files from the build tree to their final location, under $prefix/share/applications. """ description = "install .desktop files" user_options = [] def initialize_options(self): self.install_dir = None self.skip_build = None self.shortcuts = None self.build_base = None self.outfiles = [] def finalize_options(self): self.set_undefined_options('build', ('build_base', 'build_base')) self.set_undefined_options( 'install', ('install_data', 'install_dir'), ('skip_build', 'skip_build')) self.set_undefined_options( 'build_shortcuts', ('shortcuts', 'shortcuts')) def get_outputs(self): return self.outfiles def run(self): if not self.skip_build: self.run_command('build_shortcuts') basepath = os.path.join(self.install_dir, 'share', 'applications') srcpath = os.path.join(self.build_base, 'share', 'applications') out = self.mkpath(basepath) self.outfiles.extend(out or []) for shortcut in self.shortcuts: shortcut = os.path.basename(shortcut) fullsrc = os.path.join(srcpath, shortcut) fullpath = os.path.join(basepath, shortcut) (out, _) = self.copy_file(fullsrc, fullpath) self.outfiles.append(out) __all__ = ["build_shortcuts", "install_shortcuts"] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/tests.py����������������������������������������������������������������������0000644�0001750�0001750�00000012346�13112005742�016571� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import import os import sys import subprocess import tarfile from distutils import dir_util from .util import Command, get_dist_class class test_cmd(Command): description = "run automated tests" user_options = [ ("to-run=", None, "list of tests to run (default all)"), ("suite=", None, "test suite (folder) to run (default 'tests')"), ("strict", None, "make glib warnings / errors fatal"), ("all", None, "run all suites"), ("exitfirst", "x", "stop after first failing test"), ("no-network", "n", "skip tests requiring a network connection"), ] def initialize_options(self): self.to_run = [] self.suite = None self.strict = False self.all = False self.exitfirst = False self.no_network = False def finalize_options(self): if self.to_run: self.to_run = self.to_run.split(",") self.strict = bool(self.strict) self.all = bool(self.all) self.suite = self.suite and str(self.suite) self.exitfirst = bool(self.exitfirst) self.no_network = bool(self.no_network) def run(self): import tests suite = self.suite if self.all: suite = None status = tests.unit(run=self.to_run, suite=suite, strict=self.strict, exitfirst=self.exitfirst, network=(not self.no_network or self.all), quality=self.all) if status != 0: raise SystemExit(status) class quality_cmd(Command): description = "Run pep8/pyflakes tests" user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): import tests status = tests.unit(suite="quality", quality=True) if status != 0: raise SystemExit(status) sdist = get_dist_class("sdist") class distcheck_cmd(sdist): description = "run tests on a fresh sdist" def _check_manifest(self): assert self.get_archive_files() skip = os.path.join("quodlibet", "optpackages", "") # make sure MANIFEST.in includes all tracked files if subprocess.call(["git", "status"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0: # contains the packaged files after run() is finished included_files = self.filelist.files assert included_files process = subprocess.Popen( ["git", "ls-tree", "-r", "HEAD", "--name-only"], stdout=subprocess.PIPE, universal_newlines=True) out, err = process.communicate() assert process.returncode == 0 tracked_files = out.splitlines() tracked_files = [ p for p in tracked_files if not p.startswith(skip)] diff = set(tracked_files) - set(included_files) assert not diff, ( "Not all tracked files included in tarball, check MANIFEST.in", diff) def _check_dist(self): assert self.get_archive_files() distcheck_dir = os.path.join(self.dist_dir, "distcheck") if os.path.exists(distcheck_dir): dir_util.remove_tree(distcheck_dir) self.mkpath(distcheck_dir) archive = self.get_archive_files()[0] tfile = tarfile.open(archive, "r:gz") tfile.extractall(distcheck_dir) tfile.close() name = self.distribution.get_fullname() extract_dir = os.path.join(distcheck_dir, name) old_pwd = os.getcwd() os.chdir(extract_dir) self.spawn([sys.executable, "setup.py", "test"]) self.spawn([sys.executable, "setup.py", "quality"]) self.spawn([sys.executable, "setup.py", "build"]) self.spawn([sys.executable, "setup.py", "build_sphinx"]) self.spawn([sys.executable, "setup.py", "install", "--root", "../prefix", "--record", "../log.txt"]) os.chdir(old_pwd) def run(self): sdist.run(self) self._check_manifest() self._check_dist() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/coverage.py�������������������������������������������������������������������0000644�0001750�0001750�00000006102�13112005742�017213� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import import os import sys try: from urllib import pathname2url except: from urllib.request import pathname2url from .util import Command class coverage_cmd(Command): description = "generate test coverage data" user_options = [ ("to-run=", None, "list of tests to run (default all)"), ] def initialize_options(self): self.to_run = [] def finalize_options(self): self.options = self.distribution.coverage_options self.packages = self.distribution.packages include = set([p.split(".", 1)[0] + "*" for p in self.packages]) self.options.setdefault("include", include) self.options.setdefault("directory", "coverage") def run(self): # Wipe existing modules, to make sure coverage data is properly # generated for them. for key in sys.modules.keys(): for package in self.packages: if key == package or key.startswith(package + "."): del sys.modules[key] break try: from coverage import coverage, CoverageException except ImportError: print("Missing 'coverage' module. See " "https://pypi.python.org/pypi/coverage or try " "`apt-get install python-coverage`") return cov = coverage() cov.start() cmd = self.reinitialize_command("test") cmd.to_run = self.to_run[:] cmd.ensure_finalized() cmd.run() cov.stop() try: cov.html_report(**self.options) except CoverageException as e: # this fails in case js libs are missing, but the html is still # there, so don't fail completely print(e) dest = os.path.abspath(self.options["directory"]) index = os.path.join(dest, "index.html") index_url = pathname2url(index) print("Coverage summary: file://%s" % index_url) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/po.py�������������������������������������������������������������������������0000644�0001750�0001750�00000021477�13115500547�016060� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 Joe Wreschnig # 2009-2010,2012-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """translation support This module contains commands to support building and installing gettext message catalogs. """ import os import glob from subprocess import Popen, PIPE from tempfile import mkstemp from distutils.dep_util import newer from distutils.spawn import find_executable from distutils.errors import DistutilsOptionError from .util import Command from . import gettextutil class po_stats(Command): description = "Show translation statistics" user_options = [] def initialize_options(self): self.po_directory = None self.po_files = None def finalize_options(self): self.po_directory = self.distribution.po_directory self.po_package = self.distribution.po_package self.po_files = glob.glob(os.path.join(self.po_directory, "*.po")) def run(self): gettextutil.update_pot(self.po_directory, self.po_package) res = [] for po in self.po_files: language = os.path.basename(po).split(".")[0] fd, temp_path = mkstemp(".po") try: os.close(fd) gettextutil.update_po(self.po_directory, self.po_package, language, output_file=temp_path) proc = Popen(["msgfmt", "-o", "/dev/null", "--statistics", temp_path], stdout=PIPE, stderr=PIPE) output = proc.communicate()[1] res.append((language, output)) finally: os.remove(temp_path) stats = [] for po, r in res: nums = [int(p.split()[0]) for p in r.split(",")] while len(nums) < 3: nums.append(0) trans, fuzzy, untrans = nums stats.append((po, trans, fuzzy, untrans)) stats.sort(key=lambda x: x[1], reverse=True) print("#" * 30) for po, trans, fuzzy, untrans in stats: all_ = float(trans + fuzzy + untrans) / 100 print("%5s: %3d%% (+%2d%% fuzzy)" % (po, trans / all_, fuzzy / all_)) class update_po(Command): description = "update po files" user_options = [ ("lang=", None, "force update <lang>.po"), ] def initialize_options(self): self.po_directory = None self.lang = None def finalize_options(self): self.po_directory = self.distribution.po_directory self.po_package = self.distribution.po_package self.po_files = glob.glob(os.path.join(self.po_directory, "*.po")) self.pot_file = os.path.join( self.po_directory, self.po_package + ".pot") def _update_pot(self): gettextutil.update_pot(self.po_directory, self.po_package) def _update_po(self, po): assert po in self.po_files lang_code = os.path.basename(po[:-3]) gettextutil.update_po(self.po_directory, self.po_package, lang_code) def run(self): try: gettextutil.check_version() except gettextutil.GettextError as e: raise SystemExit(e) # if lang is given, force update pot and the specific po if self.lang is not None: po = os.path.join(self.po_directory, self.lang + ".po") if po not in self.po_files: raise SystemExit("Error: %r not found" % po) self._update_pot() self._update_po(po) return self._update_pot() # if the pot file is newer than any of the po files, update that po for po in self.po_files: if newer(self.pot_file, po): self._update_po(po) class create_po(Command): description = "create a new po file" user_options = [ ("lang=", None, "create <lang>.po"), ] def initialize_options(self): self.po_directory = None self.lang = None def finalize_options(self): self.po_directory = self.distribution.po_directory self.po_package = self.distribution.po_package self.pot_file = os.path.join( self.po_directory, self.po_package + ".pot") if not self.lang: raise DistutilsOptionError("no --lang= given") def run(self): try: gettextutil.check_version() except gettextutil.GettextError as e: raise SystemExit(e) gettextutil.update_pot(self.po_directory, self.po_package) path = gettextutil.create_po( self.po_directory, self.po_package, self.lang) gettextutil.update_po(self.po_directory, self.po_package, self.lang) print("Created %r" % os.path.abspath(path)) def strip_pot_date(path): """strip POT-Creation-Date from po/pot""" done = False lines = [] for line in open(path, "rb"): if not done and line.startswith(b'"POT-Creation-Date:'): done = True continue lines.append(line) with open(path, "wb") as h: h.write(b"".join(lines)) class build_mo(Command): """build message catalog files Build message catalog (.mo) files from .po files using xgettext and intltool. These are placed directly in the build tree. """ description = "build message catalog files" user_options = [] def initialize_options(self): self.build_base = None self.po_package = None self.po_files = None def finalize_options(self): self.po_directory = self.distribution.po_directory self.po_package = self.distribution.po_package self.set_undefined_options('build', ('build_base', 'build_base')) self.po_files = glob.glob(os.path.join(self.po_directory, "*.po")) def run(self): if find_executable("msgfmt") is None: raise SystemExit("Error: 'gettext' not found.") gettextutil.update_pot(self.po_directory, self.po_package) basepath = os.path.join(self.build_base, 'share', 'locale') for po in self.po_files: language = os.path.basename(po).split(".")[0] fullpath = os.path.join(basepath, language, "LC_MESSAGES") destpath = os.path.join(fullpath, self.po_package + ".mo") if newer(po, destpath): self.mkpath(fullpath) # strip POT-Creation-Date from po/mo to make build reproducible fd, temp_path = mkstemp(".po") try: os.close(fd) gettextutil.update_po(self.po_directory, self.po_package, language, output_file=temp_path) strip_pot_date(temp_path) self.spawn(["msgfmt", "-o", destpath, temp_path]) finally: os.remove(temp_path) class install_mo(Command): """install message catalog files Copy compiled message catalog files into their installation directory, $prefix/share/locale/$lang/LC_MESSAGES/$package.mo. """ description = "install message catalog files" user_options = [] def initialize_options(self): self.skip_build = None self.build_base = None self.install_dir = None self.outfiles = [] def finalize_options(self): self.set_undefined_options('build', ('build_base', 'build_base')) self.set_undefined_options( 'install', ('install_data', 'install_dir'), ('skip_build', 'skip_build')) def get_outputs(self): return self.outfiles def run(self): if not self.skip_build: self.run_command('build_mo') src = os.path.join(self.build_base, "share", "locale") dest = os.path.join(self.install_dir, "share", "locale") out = self.copy_tree(src, dest) self.outfiles.extend(out) __all__ = ["build_mo", "install_mo", "po_stats"] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/icons.py����������������������������������������������������������������������0000644�0001750�0001750�00000005546�13112005742�016546� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os import subprocess from .util import Command def update_icon_cache(*args): args = list(args) try: subprocess.check_call( ['gtk-update-icon-cache-3.0'] + args) except OSError: try: subprocess.check_call( ['gtk-update-icon-cache'] + args) except OSError: return False except subprocess.CalledProcessError: return False except subprocess.CalledProcessError: return False return True class install_icons(Command): """Copy app icons to hicolor/pixmaps and update the global cache""" user_options = [] def initialize_options(self): self.install_dir = None self.outfiles = [] def finalize_options(self): self.set_undefined_options('install', ('install_data', 'install_dir')) def get_outputs(self): return self.outfiles def run(self): # install into hicolor icon theme basepath = os.path.join(self.install_dir, 'share', 'icons', 'hicolor') local = os.path.join("quodlibet", "images", "hicolor") # copy all "apps" images for entry in os.listdir(local): source = os.path.join(local, entry, "apps") dest = os.path.join(basepath, entry, "apps") out = self.mkpath(dest) self.outfiles.extend(out or []) for image in os.listdir(source): if os.path.splitext(image)[-1] in (".png", ".svg"): file_path = os.path.join(source, image) (out, _) = self.copy_file(file_path, dest) self.outfiles.append(out) # this fails during packaging.. so ignore the outcome update_icon_cache(basepath) ����������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/dbus_services.py��������������������������������������������������������������0000644�0001750�0001750�00000010014�13112005742�020255� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013-2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os from .util import Command class build_dbus_services(Command): """Build .service files""" description = "build .service files" user_options = [] def initialize_options(self): self.build_base = None self.dbus_services = None def finalize_options(self): self.dbus_services = self.distribution.dbus_services self.set_undefined_options('build', ('build_base', 'build_base')) def run(self): basepath = os.path.join(self.build_base, 'share', 'dbus-1', 'services') self.mkpath(basepath) for service in self.dbus_services: in_variant = service + ".in" target_path = os.path.join(basepath, os.path.basename(service)) if os.path.exists(in_variant): # the exec line needs the install path, so we can't really # do anything here besides renaming self.copy_file(in_variant, target_path) else: self.copy_file(service, target_path) def _replace(path, pattern, subst): with open(path, "rb") as hi: data = hi.read() with open(path, "wb") as ho: ho.write(data.replace(pattern, subst)) class install_dbus_services(Command): """Install .service files""" description = "install .service files" user_options = [] def initialize_options(self): self.install_dir = None self.exec_prefix = None self.skip_build = None self.dbus_services = None self.build_base = None self.outfiles = [] def finalize_options(self): self.set_undefined_options( 'build', ('build_base', 'build_base')) self.set_undefined_options( 'install', ('install_data', 'install_dir'), ('exec_prefix', 'exec_prefix'), ('skip_build', 'skip_build')) self.set_undefined_options( 'build_dbus_services', ('dbus_services', 'dbus_services')) def get_outputs(self): return self.outfiles def run(self): if not self.skip_build: self.run_command('build_dbus_services') basepath = os.path.join( self.install_dir, 'share', 'dbus-1', 'services') out = self.mkpath(basepath) self.outfiles.extend(out or []) srcpath = os.path.join(self.build_base, 'share', 'dbus-1', 'services') for service in self.dbus_services: service_name = os.path.basename(service) fullsrc = os.path.join(srcpath, service_name) fullpath = os.path.join(basepath, service_name) (out, _) = self.copy_file(fullsrc, fullpath) self.outfiles.append(out) prefix = self.exec_prefix or "" if not isinstance(prefix, bytes): prefix = prefix.encode("utf-8") _replace(fullpath, b"@PREFIX@", prefix) __all__ = ["build_dbus_services", "install_dbus_services"] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/gdist/gettextutil.py����������������������������������������������������������������0000644�0001750�0001750�00000015107�13115500547�020015� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015-2017 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """So we don't have to touch intltool directly (and maybe can get rid of it one day) """ import os import subprocess from distutils.spawn import find_executable class GettextError(Exception): pass def _get_xgettext_args(): # pgettext isn't included by default for Python for example EXTRA_KEYWORDS = { "_": "", "N_": "", "C_": "1c,2", "NC_": "1c,2", "Q_": "", "pgettext": "1c,2", "npgettext": "1c,2,3", "numeric_phrase": "1,2", "dgettext": "2", "ngettext": "1,2", "dngettext": "2,3", } # The lone -k disables default xgettext keywords args = ["-k"] # There are still some keywords defined by intltool-update which we can't # change, but they shouldn't conflict with anything. for name, spec in EXTRA_KEYWORDS.items(): if spec: args.append("--keyword=%s:%s" % (name, spec)) else: args.append("--keyword=%s" % name) return args XGETTEXT_ARGS = " ".join(_get_xgettext_args()) def intltool(*args): command = args[0] args = args[1:] if os.name == "nt": return ["perl", "/usr/bin/intltool-%s" % command] + list(args) else: return ["intltool-%s" % command] + list(args) def update_pot(po_dir, package): """Regenerate the pot file in po_dir Returns the path to the pot file or raise GettextError """ old_dir = os.getcwd() os.chdir(po_dir) try: os.environ["XGETTEXT_ARGS"] = XGETTEXT_ARGS with open(os.devnull, 'wb') as devnull: subprocess.check_call( intltool("update", "--pot", "--gettext-package", package), stderr=devnull, stdout=devnull) except subprocess.CalledProcessError as e: raise GettextError(e) finally: os.chdir(old_dir) return os.path.join(po_dir, package + ".pot") def update_po(po_dir, package, lang_code, output_file=None): """Update the <lang_code>.po file based on <package>.pot If output_file is given the resulting po file will be save to that path. Returns the path to the po file or raise GettextError """ old_dir = os.getcwd() os.chdir(po_dir) try: os.environ["XGETTEXT_ARGS"] = XGETTEXT_ARGS args = intltool( "update", "--dist", "--gettext-package", package, lang_code) if output_file is not None: args.extend(["--output-file", output_file]) with open(os.devnull, 'wb') as devnull: subprocess.check_call(args, stderr=devnull, stdout=devnull) except subprocess.CalledProcessError as e: raise GettextError(e) finally: os.chdir(old_dir) if output_file is not None: return output_file return os.path.join(po_dir, lang_code + ".po") def create_po(po_dir, package, lang_code): """Create a new <lang_code>.po file based on <package>.pot Returns the path to the new po file or raise GettextError in case something went wrong or the file already exists. """ pot_path = os.path.join(po_dir, package + ".pot") po_path = os.path.join(po_dir, lang_code + ".po") if os.path.exists(po_path): raise GettextError("%r already exists" % po_path) if not os.path.exists(pot_path): raise GettextError("%r missing" % pot_path) try: subprocess.check_call(["msginit", "--no-translator", "-i", pot_path, "-o", po_path]) except subprocess.CalledProcessError as e: raise GettextError(e) if not os.path.exists(po_path): raise GettextError( "something went wrong; %r didn't get created" % po_path) return po_path def get_missing(po_dir, package): """Returns a list of files which include translatable strings but are not listed as translatable. or raise GettextError """ missing_path = os.path.join(po_dir, "missing") old_dir = os.getcwd() os.chdir(po_dir) try: os.remove(missing_path) except OSError: pass # While intltool prints the result also to stderr it gets mixed with # warnings etc. so we have to check the "missing" file try: with open(os.devnull, 'wb') as devnull: subprocess.check_call( intltool("update", "--maintain", "--gettext-package", package), stderr=devnull, stdout=devnull) except subprocess.CalledProcessError as e: raise GettextError(e) else: try: with open(missing_path) as h: result = h.read() except IOError: result = "" finally: os.chdir(old_dir) return result.splitlines() def _get_xgettext_version(): """Returns a version tuple e.g. (0, 19, 3) or GettextError""" try: result = subprocess.check_output(["xgettext", "--version"]) except subprocess.CalledProcessError as e: raise GettextError(e) try: return tuple(map(int, result.splitlines()[0].split()[-1].split(b"."))) except (IndexError, ValueError) as e: raise GettextError(e) def check_version(): """Raises GettextError in case intltool and xgettext are missing Tries to include a helpful error message.. """ if os.name != "nt" and find_executable("intltool-update") is None: raise GettextError("intltool-update missing") if find_executable("xgettext") is None: raise GettextError("xgettext missing") if _get_xgettext_version() < (0, 15): raise GettextError("xgettext too old, need 0.15+") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet.py������������������������������������������������������������������������0000755�0001750�0001750�00000000551�13112005742�016303� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. import sys from quodlibet.main import main if __name__ == "__main__": sys.exit(main()) �������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/MANIFEST.in�������������������������������������������������������������������������0000644�0001750�0001750�00000001301�13112005742�015466� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������include COPYING include HACKING include NEWS include README include po/*.po include po/POTFILES.in include po/POTFILES.skip include quodlibet/images/Makefile recursive-include quodlibet/images/hicolor *.svg *.png *.svg.in include tests/data/* recursive-include tests *.py include gdist/*.py include data/*.desktop.in include data/*.ini include data/*.service.in include data/*.appdata.xml.in include data/*.1 include data/*.sh include data/*.zsh include data/README.rst include MANIFEST.in include quodlibet/packages/README.rst include *.py recursive-include docs *.py Makefile *.rst *.png *.ico *.svg *.css prune docs/_build_guide prune docs/_build_all prune docs/_rtd_theme* prune quodlibet/optpackages �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/exfalso.py��������������������������������������������������������������������������0000755�0001750�0001750�00000000555�13112005742�015760� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. import sys from quodlibet.exfalso import main if __name__ == "__main__": sys.exit(main()) ���������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/operon.py���������������������������������������������������������������������������0000755�0001750�0001750�00000000560�13112005742�015615� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys from quodlibet.operon import main if __name__ == "__main__": sys.exit(main()) ������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/��������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�015723� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/pattern/������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017400� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/pattern/_pattern.py�������������������������������������������������������0000644�0001750�0001750�00000036757�13112005742�021612� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2010 Joe Wreschnig, Michael Urman # Copyright 2010,2013 Christoph Reiter # Copyright 2013-2015 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation # Pattern := (<String> | <Tags>)* # String := ([^<>|\\]|\\.)+, a string # Tags := "<" String [ "|" Pattern [ "|" Pattern ] ] ">" import os import re from re import Scanner from senf import sep, fsnative, expanduser from quodlibet import util from quodlibet.query import Query from quodlibet.compat import exec_, itervalues from quodlibet.util.path import strip_win32_incompat_from_path, limit_path from quodlibet.formats._audio import decode_value, FILESYSTEM_TAGS from quodlibet.compat import quote_plus, text_type, number_types # Token types. (OPEN, CLOSE, TEXT, COND, EOF) = range(5) class error(ValueError): pass class ParseError(error): pass class LexerError(error): pass class PatternLexeme(object): _reverse = {OPEN: "OPEN", CLOSE: "CLOSE", TEXT: "TEXT", COND: "COND", EOF: "EOF"} def __init__(self, typ, lexeme): self.type = typ self.lexeme = lexeme def __repr__(self): return (super(PatternLexeme, self).__repr__().split()[0] + " type=" + repr(self.type) + " (" + str(self._reverse[self.type]) + "), lexeme=" + repr(self.lexeme) + ">") class PatternLexer(Scanner): def __init__(self, s): self.string = s Scanner.__init__(self, [(r"([^<>|\\]|\\.)+", self.text), (r"[<>|]", self.table), ]) def text(self, scanner, string): return PatternLexeme(TEXT, re.sub(r"\\([|<>\\])", r"\1", string)) def table(self, scanner, string): return PatternLexeme( {"|": COND, "<": OPEN, ">": CLOSE}[string], string) def __iter__(self): s = self.scan(self.string) if s[1] != "": raise LexerError("characters left over in string") else: return iter(s[0] + [PatternLexeme(EOF, "")]) class PatternNode(object): def __init__(self): self.children = [] def __repr__(self): return "Pattern(%s)" % (", ".join(map(repr, self.children))) class TextNode(object): def __init__(self, text): self.text = text def __repr__(self): return "Text(\"%s\")" % self.text class ConditionNode(object): def __init__(self, expr, ifcase, elsecase): self.expr = expr self.ifcase = ifcase self.elsecase = elsecase def __repr__(self): t, i, e = self.expr, repr(self.ifcase), repr(self.elsecase) return "Condition(expression: \"%s\", if: %s, else: %s)" % (t, i, e) class TagNode(object): def __init__(self, tag): self.tag = tag def __repr__(self): return "Tag(\"%s\")" % self.tag class PatternParser(object): def __init__(self, tokens): self.tokens = iter(tokens) self.lookahead = next(self.tokens) self.node = self.Pattern() def Pattern(self): node = PatternNode() while self.lookahead.type in [OPEN, TEXT]: la = self.lookahead self.match(TEXT, OPEN) if la.type == TEXT: node.children.append(TextNode(la.lexeme)) elif la.type == OPEN: node.children.extend(self.Tags()) return node def Tags(self): nodes = [] tag = self.lookahead.lexeme # fix bad tied tags if tag[:1] != "~" and "~" in tag: tag = "~" + tag try: self.match(TEXT) except ParseError: while self.lookahead.type not in [CLOSE, EOF]: self.match(self.lookahead.type) return nodes if self.lookahead.type == COND: self.match(COND) ifcase = self.Pattern() if self.lookahead.type == COND: self.match(COND) elsecase = self.Pattern() else: elsecase = None nodes.append(ConditionNode(tag, ifcase, elsecase)) try: self.match(CLOSE) except ParseError: nodes.pop(-1) while self.lookahead.type not in [EOF, OPEN]: self.match(self.lookahead.type) else: nodes.append(TagNode(tag)) try: self.match(CLOSE) except ParseError: nodes.pop(-1) while self.lookahead.type not in [EOF, OPEN]: self.match(self.lookahead.type) return nodes def match(self, *tokens): if tokens != [EOF] and self.lookahead.type == EOF: raise ParseError("The search string ended, but more " "tokens were expected.") try: if self.lookahead.type in tokens: self.lookahead = next(self.tokens) else: raise ParseError("The token '%s' is not the type exected." % ( self.lookahead.lexeme)) except StopIteration: self.lookahead = PatternLexeme(EOF, "") class PatternFormatter(object): _format = None _post = None _text = None def __init__(self, func, list_func, tags): self.__func = func self.__list_func = list_func self.tags = util.list_unique(tags) self.format(self.Dummy()) # Validate string class Dummy(dict): def __call__(self, key, *args): if key in FILESYSTEM_TAGS: return fsnative(u"_") if key[:2] == "~#" and "~" not in key[2:]: return 0 return u"_" def comma(self, key, *args): return u"_" def list_separate(self, key): return [u""] class SongProxy(object): def __init__(self, realsong, formatter): self.__song = realsong self.__formatter = formatter def __call__(self, key, *args): return self.__song(key, *args) def get(self, key, default=None): return self.__song.get(key, default) def comma(self, key): value = self.__song.comma(key) if isinstance(value, number_types): value = decode_value(key, value) if self.__formatter: return self.__formatter(key, value) return value def list_separate(self, key): if key.startswith("~#") and "~" not in key[2:]: value = self.__song(key) value = decode_value(key, value) if self.__formatter: value = self.__formatter(key, value) values = [(value, value)] else: values = self.__song.list_separate(key) if self.__formatter: return [(self.__formatter(key, v[0]), self.__formatter(key, v[1])) for v in values] return values def format(self, song): value = u"".join(self.__func(self.SongProxy(song, self._format))) if self._post: return self._post(value, song) return value def format_list(self, song): """Formats the output of a list pattern, generating all the combinations always returns pairs of display and sort values. The returned set will never be empty (e.g. for an empty pattern). """ vals = [(u"", u"")] for val in self.__list_func(self.SongProxy(song, self._format)): if not val: continue if isinstance(val, list): # list of strings or pairs vals = [(r[0] + part[0], r[1] + part[1]) for part in val for r in vals] else: # just a display string to concatenate vals = [(r[0] + val, r[1] + val) for r in vals] if self._post: vals = ((self._post(v[0], song), self._post(v[1], song)) for v in vals) return set(vals) __mod__ = format class PatternCompiler(object): def __init__(self, root): self.__root = root.node def compile(self, song_func, text_formatter=None): tags = [] queries = {} content = [ "def f(s):", " x = s." + song_func, " r = []", " a = r.append"] content.extend( self.__tag(self.__root, {}, {}, tags, queries, text_formatter)) content.append(" return r") code = "\n".join(content) scope = dict(itervalues(queries)) if text_formatter: scope["_format"] = text_formatter exec_(compile(code, "<string>", "exec"), scope) return scope["f"], tags def __get_value(self, text, scope, tag): if tag not in scope: t_var = 'v%d' % len(scope) scope[tag] = t_var text.append('%s = x(%r)' % (t_var, tag)) else: t_var = scope[tag] return t_var def __get_query(self, text, scope, qscope, query, queries): if query not in qscope: if query in queries: q_var = queries[query][0] r_var = 'r%d' % len(qscope) text.append('%s = %s(s)' % (r_var, q_var)) qscope[query] = r_var else: q = Query.StrictQueryMatcher(query) if q is not None: q_var = 'q%d' % len(queries) r_var = 'r%d' % len(qscope) queries[query] = (q_var, q.search) text.append('%s = %s(s)' % (r_var, q_var)) qscope[query] = r_var else: r_var = self.__get_value(text, scope, query) else: r_var = qscope[query] return r_var def __tag(self, node, scope, qscope, tags, queries, text_formatter): text = [] if isinstance(node, TextNode): if text_formatter: text.append('a(_format(%r))' % node.text) else: text.append('a(%r)' % node.text) elif isinstance(node, ConditionNode): var = self.__get_query(text, scope, qscope, node.expr, queries) ic = self.__tag( node.ifcase, dict(scope), dict(qscope), tags, queries, text_formatter) ec = self.__tag( node.elsecase, dict(scope), dict(qscope), tags, queries, text_formatter) if not ic and not ec: text.pop(-1) elif ic: text.append('if %s:' % var) text.extend(ic) if ec: text.append('else:') text.extend(ec) else: text.append('if not %s:' % var) text.extend(ec) elif isinstance(node, TagNode): tags.extend(util.tagsplit(node.tag)) var = self.__get_value(text, scope, node.tag) text.append('a(%s)' % var) elif isinstance(node, PatternNode): for child in node.children: for line in self.__tag(child, scope, qscope, tags, queries, text_formatter): text.append(" " + line) return text def Pattern(string, Kind=PatternFormatter, MAX_CACHE_SIZE=100, cache={}): if (Kind, string) not in cache: if len(cache) > MAX_CACHE_SIZE: cache.clear() comp = PatternCompiler(PatternParser(PatternLexer(string))) func, tags = comp.compile("comma", Kind._text) list_func, tags = comp.compile("list_separate", Kind._text) cache[(Kind, string)] = Kind(func, list_func, tags) return cache[(Kind, string)] def _number(key, value): if key == "tracknumber": parts = value.split("/") try: decimals = len(str(int(parts[1]))) except (IndexError, ValueError): decimals = 2 try: return "%0*d" % (max(2, decimals), int(parts[0])) except (TypeError, ValueError): return value elif key == "discnumber": parts = value.split("/") try: return "%02d" % int(parts[0]) except (TypeError, ValueError): return value else: return value class _FileFromPattern(PatternFormatter): def _format(self, key, value): value = _number(key, value) value = value.replace(sep, "_") value = value.replace(u"\uff0f", "_") value = value.strip() return value def _post(self, value, song, keep_extension=True): if value: assert isinstance(value, text_type) value = fsnative(value) if keep_extension: fn = song.get("~filename", ".") ext = fn[fn.rfind("."):].lower() val_ext = value[-len(ext):].lower() if not ext == val_ext: value += ext.lower() if os.name == "nt": assert isinstance(value, text_type) value = strip_win32_incompat_from_path(value) value = expanduser(value) value = limit_path(value) if sep in value and not os.path.isabs(value): raise ValueError("Pattern is not rooted") return value else: return fsnative(value) class _ArbitraryExtensionFileFromPattern(_FileFromPattern): """Allows filename-like output with extensions different from the song.""" def _post(self, value, song): super_object = super(_ArbitraryExtensionFileFromPattern, self) return super_object._post(value, song, False) class _XMLFromPattern(PatternFormatter): def _format(self, key, value): return util.escape(value) def replace_nt_seps(string): """On Windows, users may use backslashes in patterns as path separators. Since Windows filenames can't use '<>|' anyway, preserving backslash escapes is unnecessary, so we just replace them blindly.""" return string.replace("\\", r"\\") if os.name == 'nt' else string def FileFromPattern(string): """Gives fsnative, not unicode""" return Pattern(replace_nt_seps(string), _FileFromPattern) def ArbitraryExtensionFileFromPattern(string): return Pattern(replace_nt_seps(string), _ArbitraryExtensionFileFromPattern) def XMLFromPattern(string): return Pattern(string, _XMLFromPattern) class _XMLFromMarkupPattern(_XMLFromPattern): @classmethod def _text(cls, string): tags = ["b", "big", "i", "s", "sub", "sup", "small", "tt", "u", "span", "a"] pat = "(?:%s)" % "|".join(tags) def repl_func(match): orig, pre, body = match.group(0, 1, 2) if len(pre) % 2: return orig[1:] return r"%s<%s>" % (pre, body) string = re.sub(r"(\\*)\[(/?%s\s*)\]" % pat, repl_func, string) string = re.sub(r"(\\*)\[((a|span)\s+.*?)\]", repl_func, string) return string def XMLFromMarkupPattern(string): """Like XMLFromPattern but allows using [] instead of \<\> for pango markup to get rid of all the escaping in the common case. To get text like "[b]" escape the first '[' like "\[b]" """ return Pattern(string, _XMLFromMarkupPattern) class _URLFromPattern(PatternFormatter): def _format(self, key, value): return quote_plus(value.encode('utf8')) def URLFromPattern(string): return Pattern(string, _URLFromPattern) �����������������quodlibet-3.9.1/quodlibet/pattern/__init__.py�������������������������������������������������������0000644�0001750�0001750�00000000736�13112005742�021521� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from ._pattern import (Pattern, FileFromPattern, XMLFromPattern, XMLFromMarkupPattern, error, ArbitraryExtensionFileFromPattern, URLFromPattern) URLFromPattern ArbitraryExtensionFileFromPattern FileFromPattern Pattern XMLFromMarkupPattern XMLFromPattern error ����������������������������������quodlibet-3.9.1/quodlibet/config.py�����������������������������������������������������������������0000644�0001750�0001750�00000026742�13112005742�017557� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2008 Joe Wreschnig # 2009-2013 Nick Boultbee # 2011-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import shutil from quodlibet.util import enum from . import const from quodlibet.util.config import Config, Error from quodlibet.util import print_d, print_w from quodlibet.compat import PY2, iteritems, text_type # Some plugins can be enabled on first install AUTO_ENABLED_PLUGINS = ["Shuffle Playlist", "Remove Playlist Duplicates"] def _config_text(text): # raw config values are utf-8 encoded on PY2, while they are unicode # with surrogates on PY2. this makes initing the defaults work assert isinstance(text, text_type) if PY2: return text.encode("utf-8") return text # this defines the initial and default values INITIAL = { # User-defined tag name -> human name mappings "header_maps": { }, "player": { "time_remaining": "false", "replaygain": "on", "fallback_gain": "0.0", "pre_amp_gain": "0.0", "backend": "gstbe", "gst_pipeline": "", "gst_buffer": "3", # stream buffer duration in seconds "gst_device": "", "gst_disable_gapless": "false", }, "library": { "exclude": "", "refresh_on_start": "true", }, # State about the player, to restore on startup "memory": { "song": "", # filename of last song "seek": "0", # last song position, in milliseconds "volume": "1.0", # internal volume, [0.0, 1.0] "browser": "PanedBrowser", # browser name "queue": "false", # on or off "queue_expanded": "false", # on or off "shufflequeue": "false", # on or off "queue_stop_once_empty": "false", # on or off "sortby": "0album", # <reversed?>tagname, song list sort # Repeat on or off "repeat": "false", # The Repeat (Order) to use "repeat_mode": "repeat_song", # Shuffle on or off "shuffle": "false", # The Shuffle (Order) to use "shuffle_mode": "random", "plugin_selection": "", # selected plugin in manager "column_widths": "", # column widths in c1,w1,c2,w2... format "column_expands": "", }, "browsers": { "query_text": "", # none/search bar text # panes in paned browser "panes": "~people\t<~year|[b][i]<~year>[/i][/b] - ><album>", "pane_selection": "", # selected pane values "pane_wide_mode": "0", # browser orientation "equal_pane_width": "true", # equal pane width in paned browser "background": "", # "global" filter for SearchBar "albums": "", # album list "album_sort": "0", # album sorting mode, default is title "album_covers": "1", # album cover display, on/off "album_substrings": "1", # include substrings in inline search "collection_headers": "~people 0", "radio": "", # radio filter selection "rating_click": "true", # click to rate song, on/off "rating_confirm_multiple": "false", # confirm rating multiple songs "cover_size": "-1", # max cover height/width, <= 0 is default "search_limit": "false", # Show the limit widgets for SearchBar "album_text": "1", # show text in covergrid view "covergrid_magnification": "3.0", # show text in covergrid view "covergrid_all": "0", # show "all albums" in covergrid view }, # Kind of a dumping ground right now, should probably be # cleaned out later. "settings": { # scan directories, :-separated "scan": "", # scroll song list on current song change "jump": "true", # Unrated songs are given this value "default_rating": "0.5", # Rating scale i.e. maximum number of symbols "ratings": "4", # (0 = disabled i.e. arithmetic mean) "bayesian_rating_factor": "0.0", # rating symbol (black star) "rating_symbol_full": _config_text(u'\u2605'), # rating symbol (hollow star) "rating_symbol_blank": _config_text(u'\u2606'), # Now deprecated: space-separated headers column #"headers": " ".join(const.DEFAULT_COLUMNS), # 2.6: this gets migrated from headers entry in code. # TODO: re-instate columns here in > 2.6 or once most have migrated #"columns": ",".join(const.DEFAULT_COLUMNS), # hack to disable hints, see bug #526 "disable_hints": "false", # search as soon as text is typed into search box "eager_search": "true", # tags which get searched in addition to the ones present in the # song list, separate with "," "search_tags": "", # If set to "true" allow directly deleting files, even on systems that # support sending them to the trash. "bypass_trash": "false", # osx implementation might be buggy so let users disable it "disable_mmkeys": "false", # the UI language to use, empty means system default "language": "", # the pattern for the main window title "window_title_pattern": "~title~version~~people", }, "rename": { "spaces": "false", "windows": "true", "ascii": "false", }, "tagsfrompath": { "underscores": "false", "titlecase": "false", "split": "false", "add": "false", }, "plugins": { # newline-separated plugin IDs "active_plugins": "\n".join(AUTO_ENABLED_PLUGINS), # Issue 1231: Maximum number of SongsMenu plugins to run at once "default_max_plugin_invocations": 30, }, "editing": { # characters to split tags on "split_on": "/ & ,", # ID3 encodings to try "id3encoding": "", "human_title_case": "true", "save_to_songs": "true", "save_email": const.EMAIL, "alltags": "true", # show all tags, or just "human-readable" ones # Skip dialog to save or revert changes "auto_save_changes": "false", "default_tags": "", # e.g. "title,artist" }, "albumart": { "prefer_embedded": "false", "force_filename": "false", "filename": "folder.jpg", }, "display": { "duration_format": "standard" } } # global instance _config = Config(version=0) options = _config.options get = _config.get gettext = _config.gettext getboolean = _config.getboolean getint = _config.getint getfloat = _config.getfloat getstringlist = _config.getstringlist setstringlist = _config.setstringlist getlist = _config.getlist setlist = _config.setlist set = _config.set settext = _config.settext write = _config.write reset = _config.reset add_section = _config.add_section has_option = _config.has_option remove_option = _config.remove_option register_upgrade_function = _config.register_upgrade_function getbytes = _config.getbytes setbytes = _config.setbytes _filename = None """The filename last used for loading""" def init_defaults(): """Fills in the defaults, so they are guaranteed to be available""" _config.defaults.clear() for section, values in iteritems(INITIAL): _config.defaults.add_section(section) for key, value in iteritems(values): _config.defaults.set(section, key, value) def init(filename=None): global _filename if not _config.is_empty(): _config.clear() _filename = filename if filename is not None: try: _config.read(filename) except (Error, EnvironmentError): print_w("Reading config file %r failed." % filename) # move the broken file out of the way try: shutil.copy(filename, filename + ".not-valid") except EnvironmentError: pass def save(filename=None): """Writes the active config to filename, ignoring all possible errors. If not filename is given the one used for loading is used. """ global _filename if filename is None: filename = _filename if filename is None: return print_d("Writing config...") try: _config.write(filename) except EnvironmentError: print_w("Unable to write config.") def quit(): """Clears the active config""" _config.clear() def state(arg): return _config.getboolean("settings", arg) class RatingsPrefs(object): """ Models Ratings settings as configured by the user, with caching. """ def __init__(self): self.__number = self.__default = None self.__full_symbol = self.__blank_symbol = None @property def precision(self): """Returns the smallest ratings delta currently configured""" return 1.0 / self.number @property def number(self): if self.__number is None: self.__number = getint("settings", "ratings") return self.__number @number.setter def number(self, i): """The (maximum) integer number of ratings icons configured""" self.__number = self.__save("ratings", int(i)) @property def default(self): """The current default floating-point rating""" if self.__default is None: self.__default = getfloat("settings", "default_rating") return self.__default @default.setter def default(self, f): self.__default = self.__save("default_rating", float(f)) @property def full_symbol(self): """The symbol to use for a full (active) rating""" if self.__full_symbol is None: self.__full_symbol = self.__get_symbol("full") return self.__full_symbol @full_symbol.setter def full_symbol(self, s): self.__full_symbol = self.__save("rating_symbol_full", s) @property def blank_symbol(self): """The symbol to use for a blank (inactive) rating, if needed""" if self.__blank_symbol is None: self.__blank_symbol = self.__get_symbol("blank") return self.__blank_symbol @blank_symbol.setter def blank_symbol(self, s): self.__blank_symbol = self.__save("rating_symbol_blank", s) @property def all(self): """Returns all the possible ratings currently available""" return [float(i) / self.number for i in range(0, self.number + 1)] @staticmethod def __save(key, value): set("settings", key, value) return value @staticmethod def __get_symbol(variant="full"): return gettext("settings", "rating_symbol_%s" % variant) class HardCodedRatingsPrefs(RatingsPrefs): number = int(INITIAL["settings"]["ratings"]) default = float(INITIAL["settings"]["default_rating"]) blank_symbol = INITIAL["settings"]["rating_symbol_blank"] full_symbol = INITIAL["settings"]["rating_symbol_full"] if PY2: blank_symbol = blank_symbol.decode("utf-8") full_symbol = full_symbol.decode("utf-8") # Need an instance just for imports to work RATINGS = RatingsPrefs() @enum class DurationFormat(str): NUMERIC, SECONDS = "numeric", "numeric-seconds" STANDARD, FULL = "standard", "text-full" class DurationFormatPref(object): @property def format(self): raw = get("display", "duration_format") return DurationFormat.value_of(raw, DurationFormat.STANDARD) @format.setter def format(self, value): set("display", "duration_format", value) DURATION = DurationFormatPref() ������������������������������quodlibet-3.9.1/quodlibet/library/������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017367� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/library/librarians.py�����������������������������������������������������0000644�0001750�0001750�00000016556�13112005742�022106� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2012, 2016 Nick Boultbee # 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """ Librarians for libraries. """ import itertools from gi.repository import GObject from quodlibet.util.dprint import print_d from quodlibet.compat import itervalues class Librarian(GObject.GObject): """The librarian is a nice interface to all active libraries. Librarians are a kind of meta-library. When any of their registered libraries fire a signal, they fire the same signal. Likewise, they provide various methods equivalent to the ones found in libraries that group the results of the real libraries. Attributes: libraries -- a dict mapping library names to libraries """ __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'removed': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'added': (GObject.SignalFlags.RUN_LAST, None, (object,)), } def __init__(self): super(Librarian, self).__init__() self.libraries = {} self.__signals = {} def destroy(self): pass def register(self, library, name): """Register a library with this librarian.""" if name in self.libraries or name in self.__signals: raise ValueError("library %r is already active" % name) added_sig = library.connect('added', self.__added) removed_sig = library.connect('removed', self.__removed) changed_sig = library.connect('changed', self.__changed) self.libraries[name] = library self.__signals[library] = [added_sig, removed_sig, changed_sig] def _unregister(self, library, name): # This function, unlike register, should be private. # Libraries get unregistered at the discretion of the # librarian, not the libraries. del(self.libraries[name]) for signal_id in self.__signals[library]: library.disconnect(signal_id) del(self.__signals[library]) # FIXME: We can be smarter about this -- queue a list of items # and fire the signal after a short wait, to take advantage of # a case where many libraries fire a signal at the same time (or # one fires a signal often). def __changed(self, library, items): self.emit('changed', items) def __added(self, library, items): self.emit('added', items) def __removed(self, library, items): self.emit('removed', items) def changed(self, items): """Triage the items and inform their real libraries.""" for library in itervalues(self.libraries): in_library = set(item for item in items if item in library) if in_library: library._changed(in_library) def __getitem__(self, key): """Find a item given its key.""" for library in itervalues(self.libraries): try: return library[key] except KeyError: pass else: raise KeyError(key) def get(self, key, default=None): try: return self[key] except KeyError: return default def remove(self, items): """Remove items from all libraries.""" for library in itervalues(self.libraries): library.remove(items) def __contains__(self, item): """Check if a key or item is in the library.""" for library in itervalues(self.libraries): if item in library: return True else: return False def __iter__(self): """Iterate over all items in all libraries.""" return itertools.chain(*itervalues(self.libraries)) def move(self, items, from_, to): """Move items from one library to another. This causes 'removed' signals on the from library, and 'added' signals on the 'to' library, but will not cause any signals to be emitted via this librarian. """ try: from_.handler_block(self.__signals[from_][1]) to.handler_block(self.__signals[to][0]) from_.remove(items) to.add(items) finally: from_.handler_unblock(self.__signals[from_][1]) to.handler_unblock(self.__signals[to][0]) class SongLibrarian(Librarian): """A librarian for SongLibraries.""" def tag_values(self, tag): """Return a set of all values for the given tag.""" return {value for lib in itervalues(self.libraries) for value in lib.tag_values(tag)} def rename(self, song, newname, changed=None): """Rename the song in all libraries it belongs to. The 'changed' signal will fire for any library the song is in except if a set() is passed as changed. """ # This needs to poke around inside the library directly. If # it uses add/remove to handle the songs it fires incorrect # signals. If it uses the library's rename method, it breaks # the call for future libraries because the item's key has # changed. So, it needs to reimplement the method. re_add = [] print_d("Renaming %r to %r" % (song.key, newname), self) for library in itervalues(self.libraries): try: del library._contents[song.key] except KeyError: pass else: re_add.append(library) song.rename(newname) for library in re_add: library._contents[song.key] = song if changed is None: library._changed({song}) else: print_d("Delaying changed signal for %r." % library, self) changed.add(song) def reload(self, item, changed=None, removed=None): """Reload a song (for all libraries), possibly noting its status. If sets are given, it assumes the caller will handle signals, and only updates the sets. Otherwise, it handles signals itself. It *always* handles library contents, so do not try to remove (again) a song that appears in the removed set. """ had_item = [] print_d("Reloading %r" % item.key, self) for library in itervalues(self.libraries): try: del library._contents[item.key] except KeyError: pass else: had_item.append(library) try: library = had_item[0] except IndexError: return # Rely on the first library in the list to do the actual # load, then just inform the other libraries what happened. was_changed, was_removed = library._load_item(item, force=True) assert not (was_changed and was_removed) if was_removed: if removed is None: for library in had_item: library.emit('removed', {item}) else: removed.add(item) elif was_changed: for library in had_item: library._contents[item.key] = item if changed is None: for library in had_item: library.emit('changed', {item}) else: changed.add(item) ��������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/library/__init__.py�������������������������������������������������������0000644�0001750�0001750�00000003156�13112005742�021507� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Various library classes. Libraries are (roughly) dicts of items, and in the case of Quod Libet, these items are songs. Libraries are in charge of alerting the rest of the program when songs have been added, changed, or removed. They can also be queried in various ways. """ import time from quodlibet import print_d from quodlibet.library.libraries import SongFileLibrary, SongLibrary from quodlibet.library.librarians import SongLibrarian from quodlibet.util.path import mtime def init(cache_fn=None): """Set up the library and return the main one. Return a main library, and set a librarian for all future SongLibraries. """ SongFileLibrary.librarian = SongLibrary.librarian = SongLibrarian() library = SongFileLibrary("main") if cache_fn: library.load(cache_fn) return library def save(save_period=None): """Save all registered libraries that have a filename and are marked dirty. If `save_period` (seconds) is given the library will only be saved if it hasn't been in the last `save_period` seconds. """ print_d("Saving all libraries...") librarian = SongFileLibrary.librarian for lib in librarian.libraries.values(): filename = lib.filename if not filename or not lib.dirty: continue if not save_period or abs(time.time() - mtime(filename)) > save_period: lib.save() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/library/libraries.py������������������������������������������������������0000644�0001750�0001750�00000066467�13112005742�021742� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2013 Nick Boultbee # 2013,2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Base library classes. These classes are the most basic library classes. As such they are the least useful but most content-agnostic. """ import os import shutil import time from gi.repository import GObject from senf import fsn2text, fsnative from quodlibet import _ from quodlibet.formats import MusicFile, AudioFileError, load_audio_files, \ dump_audio_files, SerializationError from quodlibet.query import Query from quodlibet.qltk.notif import Task from quodlibet.util.atomic import atomic_save from quodlibet.util.collection import Album from quodlibet.util.collections import DictMixin from quodlibet import util from quodlibet import formats from quodlibet.util.dprint import print_d, print_w from quodlibet.util.path import unexpand, mkdir, normalize_path, ishidden, \ ismount from quodlibet.compat import iteritems, iterkeys, itervalues, listkeys, \ listvalues, listfilter class Library(GObject.GObject, DictMixin): """A Library contains useful objects. The only required method these objects support is a .key attribute, but specific types of libraries may require more advanced interfaces. Every method which takes a sequence of items expects items to implement __iter__, __len__ and __contains__. Likewise the signals emit sequences which implement __iter__, __len__ and __contains__ e.g. set(), list() or tuple(). WARNING: The library implements the dict interface with the exception that iterating over it yields values and not keys. """ __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'removed': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'added': (GObject.SignalFlags.RUN_LAST, None, (object,)), } librarian = None dirty = False def __init__(self, name=None): super(Library, self).__init__() self._contents = {} self._name = name if self.librarian is not None and name is not None: self.librarian.register(self, name) def destroy(self): if self.librarian is not None and self._name is not None: self.librarian._unregister(self, self._name) def changed(self, items): """Alert other users that these items have changed. This causes a 'changed' signal. If a librarian is available this function will call its changed method instead, and all libraries that librarian manages may fire a 'changed' signal. The item list may be filtered to those items actually in the library. If a librarian is available, it will handle the filtering instead. That means if this method is delegated to the librarian, this library's changed signal may not fire, but another's might. """ if not items: return if self.librarian and self in itervalues(self.librarian.libraries): print_d("Changing %d items via librarian." % len(items), self) self.librarian.changed(items) else: items = {item for item in items if item in self} if not items: return print_d("Changing %d items directly." % len(items), self) self._changed(items) def _changed(self, items): assert isinstance(items, set) # Called by the changed method and Librarians. if not items: return print_d("Changing %d items." % len(items), self) self.dirty = True self.emit('changed', items) def __iter__(self): """Iterate over the items in the library.""" return itervalues(self._contents) def iteritems(self): return iteritems(self._contents) def iterkeys(self): return iterkeys(self._contents) def itervalues(self): return itervalues(self._contents) def __len__(self): """The number of items in the library.""" return len(self._contents) def __getitem__(self, key): """Find a item given its key.""" return self._contents[key] def __contains__(self, item): """Check if a key or item is in the library.""" try: return item in self._contents or item.key in self._contents except AttributeError: return False def get_content(self): """All items including hidden ones for saving the library (see FileLibrary with masked items) """ return listvalues(self) def keys(self): return self._contents.keys() def values(self): return self._contents.values() def _load_item(self, item): """Load (add) an item into this library""" # Subclasses should override this if they want to check # item validity; see `FileLibrary`. print_d("Loading %r." % item.key, self) self.dirty = True self._contents[item.key] = item def _load_init(self, items): """Load many items into the library (on start)""" # Subclasses should override this if they want to check # item validity; see `FileLibrary`. content = self._contents for item in items: content[item.key] = item def add(self, items): """Add items. This causes an 'added' signal. Return the sequence of items actually added, filtering out items already in the library. """ items = {item for item in items if item not in self} if not items: return items print_d("Adding %d items." % len(items), self) for item in items: self._contents[item.key] = item self.dirty = True self.emit('added', items) return items def remove(self, items): """Remove items. This causes a 'removed' signal. Return the sequence of items actually removed. """ items = {item for item in items if item in self} if not items: return items print_d("Removing %d items." % len(items), self) for item in items: del(self._contents[item.key]) self.dirty = True self.emit('removed', items) return items def _load_items(filename): """Load items from disk. In case of an error returns default or an empty list. """ try: with open(filename, "rb") as fp: data = fp.read() except EnvironmentError: print_w("Couldn't load library file from: %r" % filename) return [] try: items = load_audio_files(data) except SerializationError: # there are too many ways this could fail util.print_exc() # move the broken file out of the way try: shutil.copy(filename, filename + ".not-valid") except EnvironmentError: util.print_exc() return [] return items class PicklingMixin(object): """A mixin to provide persistence of a library by pickling to disk""" filename = None def load(self, filename): """Load a library from a file, containing a picked list. Loading does not cause added, changed, or removed signals. """ self.filename = filename print_d("Loading contents of %r." % filename, self) items = _load_items(filename) # this loads all items without checking their validity, but makes # sure that non-mounted items are masked self._load_init(items) print_d("Done loading contents of %r." % filename, self) def save(self, filename=None): """Save the library to the given filename, or the default if `None`""" if filename is None: filename = self.filename print_d("Saving contents to %r." % filename, self) try: dirname = os.path.dirname(filename) mkdir(dirname) with atomic_save(filename, "wb") as fileobj: fileobj.write(dump_audio_files(self.get_content())) # unhandled SerializationError, shouldn't happen -> better # not replace the library file with nothing except EnvironmentError: print_w("Couldn't save library to path: %r" % filename) else: self.dirty = False class PicklingLibrary(Library, PicklingMixin): """A library that pickles its contents to disk""" def __init__(self, name=None): print_d("Using pickling persistence for library \"%s\"" % name) PicklingMixin.__init__(self) Library.__init__(self, name) class AlbumLibrary(Library): """An AlbumLibrary listens to a SongLibrary and sorts its songs into albums. The library behaves like a dictionary: the keys are album_keys of AudioFiles, the values are Album objects. """ def __init__(self, library): self.librarian = None print_d("Initializing Album Library to watch %r" % library._name) super(AlbumLibrary, self).__init__( "AlbumLibrary for %s" % library._name) self._library = library self._asig = library.connect('added', self.__added) self._rsig = library.connect('removed', self.__removed) self._csig = library.connect('changed', self.__changed) self.__added(library, library.values(), signal=False) def load(self): # deprectated pass def destroy(self): for sig in [self._asig, self._rsig, self._csig]: self._library.disconnect(sig) def _get(self, item): return self._contents.get(item) def __add(self, items): changed = set() new = set() for song in items: key = song.album_key if key in self._contents: changed.add(self._contents[key]) else: album = Album(song) self._contents[key] = album new.add(album) self._contents[key].songs.add(song) changed -= new return changed, new def __added(self, library, items, signal=True): changed, new = self.__add(items) for album in changed: album.finalize() if signal: if new: self.emit('added', new) if changed: self.emit('changed', changed) def __removed(self, library, items): changed = set() removed = set() for song in items: key = song.album_key album = self._contents[key] album.songs.remove(song) changed.add(album) if not album.songs: removed.add(album) del self._contents[key] changed -= removed for album in changed: album.finalize() if removed: self.emit('removed', removed) if changed: self.emit('changed', changed) def __changed(self, library, items): """Album keys could change between already existing ones.. so we have to do it the hard way and search by id.""" print_d("Updating affected albums for %d items" % len(items)) changed = set() removed = set() to_add = [] for song in items: # in case the key hasn't changed key = song.album_key if key in self._contents and song in self._contents[key].songs: changed.add(self._contents[key]) else: # key changed.. look for it in each album to_add.append(song) for key, album in iteritems(self._contents): if song in album.songs: album.songs.remove(song) if not album.songs: removed.add(album) else: changed.add(album) break # get new albums and changed ones because keys could have changed add_changed, new = self.__add(to_add) changed |= add_changed # check if albums that were empty at some point are still empty for album in removed: if not album.songs: del self._contents[album.key] changed.discard(album) for album in changed: album.finalize() if removed: self.emit("removed", removed) if changed: self.emit("changed", changed) if new: self.emit("added", new) class SongLibrary(PicklingLibrary): """A library for songs. Items in this kind of library must support (roughly) the AudioFile interface. """ def __init__(self, *args, **kwargs): super(SongLibrary, self).__init__(*args, **kwargs) @util.cached_property def albums(self): return AlbumLibrary(self) def destroy(self): super(SongLibrary, self).destroy() if "albums" in self.__dict__: self.albums.destroy() def tag_values(self, tag): """Return a set of all values for the given tag.""" return {value for song in itervalues(self) for value in song.list(tag)} def rename(self, song, newname, changed=None): """Rename a song. This requires a special method because it can change the song's key. The 'changed' signal may fire for this library or the changed song is added to the passed changed set(). If the song exists in multiple libraries you cannot use this method. Instead, use the librarian. """ print_d("Renaming %r to %r" % (song.key, newname), self) del(self._contents[song.key]) song.rename(newname) self._contents[song.key] = song if changed is not None: print_d("%s: Delaying changed signal." % (type(self).__name__,)) changed.add(song) else: self.changed({song}) def query(self, text, sort=None, star=Query.STAR): """Query the library and return matching songs.""" if isinstance(text, bytes): text = text.decode('utf-8') songs = self.values() if text != "": songs = listfilter(Query(text, star).search, songs) return songs def iter_paths(root, exclude=[], skip_hidden=True): """yields paths contained in root (symlinks dereferenced) Any path starting with any of the path parts included in exclude are ignored (before and after dereferencing symlinks) Directory symlinks are not followed (except root itself) Args: root (fsnative) exclude (List[fsnative]) skip_hidden (bool): Ignore files which are hidden or where any of the parent directories are hidden. Yields: fsnative: absolute dereferenced paths """ assert isinstance(root, fsnative) assert all((isinstance(p, fsnative) for p in exclude)) assert os.path.abspath(root) def skip(path): if skip_hidden and ishidden(path): return True # FIXME: normalize paths.. return any((path.startswith(p) for p in exclude)) if skip_hidden and ishidden(root): return for path, dnames, fnames in os.walk(root): if skip_hidden: dnames[:] = list(filter( lambda d: not ishidden(os.path.join(path, d)), dnames)) for filename in fnames: fullfilename = os.path.join(path, filename) if skip(fullfilename): continue fullfilename = os.path.realpath(fullfilename) if skip(fullfilename): continue yield fullfilename class FileLibrary(PicklingLibrary): """A library containing items on a local(-ish) filesystem. These must support the valid, exists, mounted, and reload methods, and have a mountpoint attribute. """ def __init__(self, name=None): super(FileLibrary, self).__init__(name) self._masked = {} def _load_init(self, items): """Add many items to the library, check if the mountpoints are available and mark items as masked if not. Does not check if items are valid. """ mounts = {} contents = self._contents masked = self._masked for item in items: mountpoint = item.mountpoint if mountpoint not in mounts: is_mounted = ismount(mountpoint) # In case mountpoint is mounted through autofs we need to # access a sub path for it to mount # https://github.com/quodlibet/quodlibet/issues/2146 if not is_mounted: item.exists() is_mounted = ismount(mountpoint) mounts[mountpoint] = is_mounted # at least one not mounted, make sure masked has an entry if not is_mounted: masked.setdefault(mountpoint, {}) if mounts[mountpoint]: contents[item.key] = item else: masked[mountpoint][item.key] = item def _load_item(self, item, force=False): """Add an item, or refresh it if it's already in the library. No signals will be fired. Return a tuple of booleans: (changed, removed) """ print_d("Loading %r." % item.key, self) valid = item.valid() # The item is fine; add it if it's not present. if not force and valid: print_d("%r is valid." % item.key, self) self._contents[item.key] = item return False, False else: # Either we should force a load, or the item is not okay. # We're going to reload; this could change the key. So # remove the item if it's currently in. try: del(self._contents[item.key]) except KeyError: present = False else: present = True # If the item still exists, reload it. if item.exists(): try: item.reload() except AudioFileError: print_d("Error reloading %r." % item.key, self) util.print_exc() return False, True else: print_d("Reloaded %r." % item.key, self) self._contents[item.key] = item return True, False elif not item.mounted(): # We don't know if the item is okay or not, since # it's not not mounted. If the item was present # we need to mark it as removed. print_d("Masking %r." % item.key, self) self._masked.setdefault(item.mountpoint, {}) self._masked[item.mountpoint][item.key] = item return False, present else: # The item doesn't exist at all anymore. Mark it as # removed if it was present, otherwise nothing. print_d("Ignoring (so removing) %r." % item.key, self) return False, present def reload(self, item, changed=None, removed=None): """Reload a song, possibly noting its status. If sets are given, it assumes the caller will handle signals, and only updates the sets. Otherwise, it handles signals itself. It *always* handles library contents, so do not try to remove (again) a song that appears in the removed set. """ was_changed, was_removed = self._load_item(item, force=True) assert not (was_changed and was_removed) if was_changed: if changed is None: self.emit('changed', {item}) else: changed.add(item) elif was_removed: if removed is None: self.emit('removed', {item}) else: removed.add(item) def rebuild(self, paths, force=False, exclude=[], cofuncid=None): """Reload or remove songs if they have changed or been deleted. This generator rebuilds the library over the course of iteration. Any paths given will be scanned for new files, using the 'scan' method. Only items present in the library when the rebuild is started will be checked. If this function is copooled, set "cofuncid" to enable pause/stop buttons in the UI. """ print_d("Rebuilding, force is %s." % force, self) task = Task(_("Library"), _("Checking mount points")) if cofuncid: task.copool(cofuncid) for i, (point, items) in task.list(enumerate(self._masked.items())): if ismount(point): self._contents.update(items) del(self._masked[point]) self.emit('added', listvalues(items)) yield True task = Task(_("Library"), _("Scanning library")) if cofuncid: task.copool(cofuncid) changed, removed = set(), set() for i, (key, item) in task.list(enumerate(sorted(self.items()))): if key in self._contents and force or not item.valid(): self.reload(item, changed, removed) # These numbers are pretty empirical. We should yield more # often than we emit signals; that way the main loop stays # interactive and doesn't get bogged down in updates. if len(changed) > 100: self.emit('changed', changed) changed = set() if len(removed) > 100: self.emit('removed', removed) removed = set() if len(changed) > 5 or i % 100 == 0: yield True print_d("Removing %d, changing %d." % (len(removed), len(changed)), self) if removed: self.emit('removed', removed) if changed: self.emit('changed', changed) for value in self.scan(paths, exclude, cofuncid): yield value def add_filename(self, filename, add=True): """Add a file based on its filename. Subclasses must override this to open the file correctly. """ raise NotImplementedError def contains_filename(self, filename): """Returns if a song for the passed filename is in the library. Returns: bool """ raise NotImplementedError def scan(self, paths, exclude=[], cofuncid=None): def need_yield(last_yield=[0]): current = time.time() if abs(current - last_yield[0]) > 0.015: last_yield[0] = current return True return False def need_added(last_added=[0]): current = time.time() if abs(current - last_added[0]) > 1.0: last_added[0] = current return True return False # first scan each path for new files paths_to_load = [] for scan_path in paths: print_d("Scanning %r." % scan_path) desc = _("Scanning %s") % (fsn2text(unexpand(scan_path))) with Task(_("Library"), desc) as task: if cofuncid: task.copool(cofuncid) for real_path in iter_paths(scan_path, exclude=exclude): if need_yield(): task.pulse() yield # skip unknown file extensions if not formats.filter(real_path): continue # already loaded if self.contains_filename(real_path): continue paths_to_load.append(real_path) yield # then (try to) load all new files with Task(_("Library"), _("Loading files")) as task: if cofuncid: task.copool(cofuncid) added = [] for real_path in task.gen(paths_to_load): item = self.add_filename(real_path, False) if item is not None: added.append(item) if len(added) > 100 or need_added(): self.add(added) added = [] yield if added and need_yield(): yield if added: self.add(added) added = [] yield True def get_content(self): """Return visible and masked items""" items = listvalues(self) for masked in self._masked.values(): items.extend(masked.values()) # Item keys are often based on filenames, in which case # sorting takes advantage of the filesystem cache when we # reload/rescan the files. items.sort(key=lambda item: item.key) return items def masked(self, item): """Return true if the item is in the library but masked.""" try: point = item.mountpoint except AttributeError: # Checking a key. for point in itervalues(self._masked): if item in point: return True else: # Checking a full item. return item in itervalues(self._masked.get(point, {})) def unmask(self, point): print_d("Unmasking %r." % point, self) items = self._masked.pop(point, {}) if items: self.add(items.values()) def mask(self, point): print_d("Masking %r." % point, self) removed = {} for item in itervalues(self): if item.mountpoint == point: removed[item.key] = item if removed: self.remove(removed.values()) self._masked.setdefault(point, {}).update(removed) @property def masked_mount_points(self): """List of mount points that contain masked items""" return listkeys(self._masked) def get_masked(self, mount_point): """List of items for a mount point""" return listvalues(self._masked.get(mount_point, {})) def remove_masked(self, mount_point): """Remove all songs for a masked point""" self._masked.pop(mount_point, {}) class SongFileLibrary(SongLibrary, FileLibrary): """A library containing song files. Pickles contents to disk as `FileLibrary`""" def __init__(self, name=None): print_d("Initializing SongFileLibrary \"%s\"." % name) super(SongFileLibrary, self).__init__(name) def contains_filename(self, filename): key = normalize_path(filename, True) return key in self._contents def add_filename(self, filename, add=True): """Add a song to the library based on filename. If 'add' is true, the song will be added and the 'added' signal may be fired. Example (add=False): load many songs and call Library.add(songs) to add all in one go. The song is returned if it is in the library after this call. Otherwise, None is returned. """ key = normalize_path(filename, True) song = None if key not in self._contents: song = MusicFile(filename) if song and add: self.add([song]) else: print_d("Already got file %r." % filename) song = self._contents[key] return song ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/mmkeys/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017230� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/mmkeys/osx.py�������������������������������������������������������������0000644�0001750�0001750�00000012651�13112005742�020422� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Martijn Pieters <mj@zopatista.com> # Copyright 2014 Eric Le Lay elelay.fr:dev # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """ osxmmkey - Mac OS X Media Keys support -------------------------------------- Requires the PyObjC, with the Cocoa and Quartz bindings to be installed. Under macports, that's the `py27-pyobjc`, `py27-pyobjc-cocoa` and`py27-pyobjc-quartz` ports, or equivalents for the python version used by quodlibet. This plugin also requires that 'access for assistive devices' is enabled, see the Universal Access preference pane in the OS X System Prefences. We register a Quartz event tap to listen for the multimedia keys and intercept them to control QL and prevent iTunes to get them. """ import threading from gi.repository import GLib from ._base import MMKeysBackend, MMKeysAction, MMKeysImportError try: from AppKit import NSKeyUp, NSSystemDefined, NSEvent import Quartz except ImportError: raise MMKeysImportError class OSXBackend(MMKeysBackend): def __init__(self, name, callback): self.__eventsapp = MacKeyEventsTap(callback) self.__eventsapp.start() def cancel(self): if self.__eventsapp is not None: self.__eventsapp.stop() self.__eventsapp = None class MacKeyEventsTap(threading.Thread): # Quartz event tap, listens for media key events and translates these to # control messages for quodlibet. _EVENTS = { 16: MMKeysAction.PLAYPAUSE, 19: MMKeysAction.NEXT, 20: MMKeysAction.PREV, } def __init__(self, callback): super(MacKeyEventsTap, self).__init__() self._callback = callback self._tap = None self._runLoopSource = None self._event = threading.Event() def _push_callback(self, action): # push to the main thread, ignore if we have been stopped by now def idle_call(action): if self._tap: self._callback(action) return False GLib.idle_add(idle_call, action) def _event_tap(self, proxy, type_, event, refcon): # evenTrap disabled by timeout or user input, reenable if type_ == Quartz.kCGEventTapDisabledByUserInput or \ type_ == Quartz.kCGEventTapDisabledByTimeout: assert self._tap is not None Quartz.CGEventTapEnable(self._tap, True) return event # Convert the Quartz CGEvent into something more useful keyEvent = NSEvent.eventWithCGEvent_(event) if keyEvent.subtype() is 8: # subtype 8 is media keys data = keyEvent.data1() keyCode = (data & 0xFFFF0000) >> 16 keyState = (data & 0xFF00) >> 8 if keyCode in self._EVENTS: if keyState == NSKeyUp: self._push_callback(self._EVENTS[keyCode]) return None # swallow the event, so iTunes doesn't launch return event def _loop_start(self, observer, activiti, info): self._event.set() def run(self): self._tap = Quartz.CGEventTapCreate( Quartz.kCGSessionEventTap, # Session level is enough for our needs Quartz.kCGHeadInsertEventTap, # Insert wherever, we do not filter # Active, to swallow the play/pause event is enough Quartz.kCGEventTapOptionDefault, # NSSystemDefined for media keys Quartz.CGEventMaskBit(NSSystemDefined), self._event_tap, None ) # the above can fail if self._tap is None: self._event.set() return self._loop = Quartz.CFRunLoopGetCurrent() # add an observer so we know when we can stop it # without a race condition self._observ = Quartz.CFRunLoopObserverCreate( None, Quartz.kCFRunLoopEntry, False, 0, self._loop_start, None) Quartz.CFRunLoopAddObserver( self._loop, self._observ, Quartz.kCFRunLoopCommonModes) # Create a runloop source and add it to the current loop self._runLoopSource = Quartz.CFMachPortCreateRunLoopSource( None, self._tap, 0) Quartz.CFRunLoopAddSource( self._loop, self._runLoopSource, Quartz.kCFRunLoopDefaultMode ) # Enable the tap Quartz.CGEventTapEnable(self._tap, True) # runrunrun Quartz.CFRunLoopRun() def stop(self): """Call once from the main thread to stop the thread. After this returns no callback will be called anymore. """ # wait until we fail or the observer tells us that the loop has started self._event.wait() # failed to create a tap, nothing to stop if self._tap is None: return # remove the runloop source Quartz.CFRunLoopRemoveSource( self._loop, self._runLoopSource, Quartz.kCFRunLoopDefaultMode ) self._runLoopSource = None # remove observer Quartz.CFRunLoopRemoveObserver( self._loop, self._observ, Quartz.kCFRunLoopCommonModes) self._observ = None # stop the loop Quartz.CFRunLoopStop(self._loop) self._loop = None # Disable the tap Quartz.CGEventTapEnable(self._tap, False) self._tap = None ���������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/mmkeys/winhook.py���������������������������������������������������������0000644�0001750�0001750�00000004751�13112005742�021271� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import ctypes from ._base import MMKeysBackend, MMKeysAction, MMKeysImportError try: from quodlibet.util import winapi except ImportError: raise MMKeysImportError class WinHookBackend(MMKeysBackend): def __init__(self, name, callback): self._callback = callback self._hhook = None self._kb_proc_ptr = None try: self._start() except WindowsError: pass def cancel(self): try: self._stop() except WindowsError: pass def _kb_proc(self, nCode, wParam, lParam): """A LowLevelKeyboardProc""" if nCode == winapi.HC_ACTION and wParam == winapi.WM_KEYDOWN: hstruct_ptr = ctypes.cast(lParam, winapi.LPKBDLLHOOKSTRUCT) assert hstruct_ptr hstruct = hstruct_ptr.contents vkCode = hstruct.vkCode STOP_PROCESSING = 1 if vkCode == winapi.VK_MEDIA_PLAY_PAUSE: self._callback(MMKeysAction.PLAYPAUSE) return STOP_PROCESSING elif vkCode == winapi.VK_MEDIA_STOP: self._callback(MMKeysAction.STOP) return STOP_PROCESSING elif vkCode == winapi.VK_MEDIA_NEXT_TRACK: self._callback(MMKeysAction.NEXT) return STOP_PROCESSING elif vkCode == winapi.VK_MEDIA_PREV_TRACK: self._callback(MMKeysAction.PREV) return STOP_PROCESSING return winapi.CallNextHookEx(self._hhook, nCode, wParam, lParam) def _start(self): """Start mmkey monitoring. Might raise WindowsError. """ kb_proc_ptr = winapi.LowLevelKeyboardProc(self._kb_proc) hhook = winapi.SetWindowsHookExW( winapi.WH_KEYBOARD_LL, kb_proc_ptr, None, 0) if not hhook: raise winapi.WinError() self._kb_proc_ptr = kb_proc_ptr self._hhook = hhook def _stop(self): """Stop mmkey monitoring. Can be called multiple times. Might raise WindowsError. """ if self._hhook is not None: if winapi.UnhookWindowsHookEx(self._hhook) == 0: raise winapi.WinError() self._hhook = None self._kb_proc_ptr = None �����������������������quodlibet-3.9.1/quodlibet/mmkeys/__init__.py��������������������������������������������������������0000644�0001750�0001750�00000006007�13112005742�021346� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import config from quodlibet.util import print_d from ._base import MMKeysAction, MMKeysImportError def iter_backends(): if config.getboolean("settings", "disable_mmkeys"): return try: from .gnome import GnomeBackend, GnomeBackendOldName, MateBackend except MMKeysImportError: pass else: yield GnomeBackend yield GnomeBackendOldName yield MateBackend try: from .keybinder import KeybinderBackend except MMKeysImportError: pass else: yield KeybinderBackend try: from .winhook import WinHookBackend except MMKeysImportError: pass else: yield WinHookBackend try: from .osx import OSXBackend except MMKeysImportError: pass else: yield OSXBackend def find_active_backend(): print_d("Trying to find a mmkeys backend") for backend in iter_backends(): if backend.is_active(): print_d("Found %r" % backend.__name__) return backend class MMKeysHandler(object): """Manages multiple keybinding backends and translates the generated events to actions on the player backend. """ def __init__(self, app): self._backend = None self._window = app.window self._player = app.player self._app_name = app.name def start(self): kind = find_active_backend() if not kind: return self._backend = kind(self._app_name, self._callback) # grab on start for cases when the window is hidden on start self._backend.grab() self._window.connect("notify::is-active", self._focus_event) def quit(self): if self._backend: self._backend.cancel() self._backend = None self._window = None self._player = None def _focus_event(self, window, param): if window.get_property(param.name) and self._backend: self._backend.grab() def _callback(self, action): print_d("Event %r from %r" % (action, type(self._backend).__name__)) player = self._player if action == MMKeysAction.PREV: player.previous() elif action == MMKeysAction.NEXT: player.next() elif action == MMKeysAction.STOP: player.stop() elif action == MMKeysAction.PLAY: if player.song is None: player.reset() else: player.paused = False elif action == MMKeysAction.PLAYPAUSE: if player.song is None: player.reset() else: player.paused ^= True elif action == MMKeysAction.PAUSE: player.paused = True else: assert 0, "unhandled event" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/mmkeys/keybinder.py�������������������������������������������������������0000644�0001750�0001750�00000002477�13112005742�021572� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from ._base import MMKeysBackend, MMKeysAction, MMKeysImportError import gi try: gi.require_version("Keybinder", "3.0") except ValueError: raise MMKeysImportError try: from gi.repository import Keybinder except ImportError: raise MMKeysImportError Keybinder.init() class KeybinderBackend(MMKeysBackend): _EVENTS = { "XF86AudioPrev": MMKeysAction.PREV, "XF86AudioNext": MMKeysAction.NEXT, "XF86AudioStop": MMKeysAction.STOP, "XF86AudioPlay": MMKeysAction.PLAYPAUSE, } def __init__(self, name, callback): self._callback = callback self._worked = [] for keystring, action in self._EVENTS.items(): if Keybinder.bind(keystring, self._bind_cb, None): self._worked.append(keystring) def _bind_cb(self, keystring, *args): self._callback(self._EVENTS[keystring]) def cancel(self): if not self._callback: return for keystring in self._worked: Keybinder.unbind(keystring) del self._worked[:] self._callback = None �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/mmkeys/_base.py�����������������������������������������������������������0000644�0001750�0001750�00000002174�13112005742�020661� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation class MMKeysImportError(ImportError): pass class MMKeysAction(object): PLAY = "play" STOP = "stop" PAUSE = "pause" PREV = "prev" NEXT = "next" PLAYPAUSE = "playpause" class MMKeysBackend(object): def __init_(self, name, callback): """Callback will be called in the main thread and gets passed an MMKeysAction. `name` should be the application name. """ raise NotImplementedError @classmethod def is_active(cls): """Should return if the backend should be used""" return True def grab(self): """Should tell the backend that the application was active (e.g. the main window got focused) """ pass def cancel(self): """After cancel returns the callback will no longer be called. Can be called multiple times. """ raise NotImplementedError ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/mmkeys/gnome.py�����������������������������������������������������������0000644�0001750�0001750�00000011434�13112005742�020714� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import time from ._base import MMKeysBackend, MMKeysAction, MMKeysImportError try: import dbus except ImportError: raise MMKeysImportError class GnomeBackend(MMKeysBackend): DBUS_NAME = "org.gnome.SettingsDaemon.MediaKeys" DBUS_PATH = "/org/gnome/SettingsDaemon/MediaKeys" DBUS_IFACE = "org.gnome.SettingsDaemon.MediaKeys" _EVENTS = { "Next": MMKeysAction.NEXT, "Previous": MMKeysAction.PREV, "Play": MMKeysAction.PLAYPAUSE, "Pause": MMKeysAction.PAUSE, "Stop": MMKeysAction.STOP, } # TODO: Rewind, FastForward, Repeat, Shuffle def __init__(self, name, callback): self.__interface = None self.__watch = None self.__grab_time = -1 self.__name = name self.__key_pressed_sig = None self.__callback = callback self.__enable_watch() @classmethod def is_active(cls): """If the gsd plugin is active atm""" try: bus = dbus.Bus(dbus.Bus.TYPE_SESSION) return bus.name_has_owner(cls.DBUS_NAME) except dbus.DBusException: return False def cancel(self): if self.__callback: self.__disable_watch() self.__release() self.__callback = None def grab(self, update=True): """Tells gsd that QL started or got the focus. update: whether to send the current time or the last one""" if update: # so this breaks every 50 days.. ok.. t = int((time.time() * 1000)) & 0xFFFFFFFF self.__grab_time = dbus.UInt32(t) elif self.__grab_time < 0: # can not send the last event if there was none return iface = self.__update_interface() if not iface: return iface.GrabMediaPlayerKeys(self.__name, self.__grab_time, reply_handler=lambda *x: None, error_handler=lambda *x: None) def __update_interface(self): """If __interface is None, set a proxy interface object and connect to the key pressed signal.""" if self.__interface: return self.__interface try: bus = dbus.Bus(dbus.Bus.TYPE_SESSION) obj = bus.get_object(self.DBUS_NAME, self.DBUS_PATH) iface = dbus.Interface(obj, self.DBUS_IFACE) except dbus.DBusException: pass else: self.__key_pressed_sig = iface.connect_to_signal( "MediaPlayerKeyPressed", self.__key_pressed) self.__interface = iface return self.__interface def __enable_watch(self): """Enable events for dbus name owner change""" if self.__watch: return bus = dbus.Bus(dbus.Bus.TYPE_SESSION) # This also triggers for existing name owners self.__watch = bus.watch_name_owner(self.DBUS_NAME, self.__owner_changed) def __disable_watch(self): """Disable name owner change events""" if self.__watch: self.__watch.cancel() self.__watch = None def __owner_changed(self, owner): """This gets called when the owner of the dbus name changes so we can handle gnome-settings-daemon restarts.""" if not owner: # owner gone, remove the signal matches/interface etc. self.__release() elif not self.__interface: # new owner, get a new interface object and # resend the last grab event self.grab(update=False) def __key_pressed(self, application, action): if application != self.__name: return if action in self._EVENTS: self.__callback(self._EVENTS[action]) def __release(self): """Tells gsd that we don't want events anymore and removes all signal matches""" if self.__key_pressed_sig: self.__key_pressed_sig.remove() self.__key_pressed_sig = None if self.__interface: try: self.__interface.ReleaseMediaPlayerKeys(self.__name) except dbus.DBusException: pass self.__interface = None # https://mail.gnome.org/archives/desktop-devel-list/2017-April/msg00069.html class GnomeBackendOldName(GnomeBackend): DBUS_NAME = "org.gnome.SettingsDaemon" class MateBackend(GnomeBackend): DBUS_NAME = "org.mate.SettingsDaemon" DBUS_PATH = "/org/mate/SettingsDaemon/MediaKeys" DBUS_IFACE = "org.mate.SettingsDaemon.MediaKeys" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/�����������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017571� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/playlists/�������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021615� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/playlists/prefs.py�����������������������������������������������0000644�0001750�0001750�00000004626�13112005742�023320� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet.util import format_time_display, format_time_long,\ format_size, tag from quodlibet import _ from quodlibet import qltk from quodlibet.browsers._base import EditDisplayPatternMixin, FakeDisplayItem from quodlibet.qltk import Button, Icons from quodlibet.util.i18n import numeric_phrase _FOOTER = "<~tracks> (<~filesize> / <~length>)" DEFAULT_PATTERN_TEXT = ("[b]<~name>[/b]\n" "[small]<~tracks|%s|[i](%s)[/i]>[/small]" % (_FOOTER, (_("empty")))) class Preferences(qltk.UniqueWindow, EditDisplayPatternMixin): _A_SIZE = 127 * 1024 * 1024 _SOME_PEOPLE = "\n".join( tag(t) for t in ["artist", "performer", "composer", "arranger"]) _DEFAULT_PATTERN = DEFAULT_PATTERN_TEXT _PREVIEW_ITEM = FakeDisplayItem({ "date": "2015-11-31", "~length": format_time_display(6319), "~long-length": format_time_long(6319), "~tracks": numeric_phrase("%d track", "%d tracks", 27), "~#filesize": _A_SIZE, "~filesize": format_size(_A_SIZE), "~#rating": 0.75, "~name": _("Example Playlist"), "~people": _SOME_PEOPLE + "..."}) def __init__(self, browser): if self.is_not_unique(): return super(Preferences, self).__init__() self.set_border_width(12) self.set_title(_("Playlist Browser Preferences")) self.set_default_size(420, 240) self.set_transient_for(qltk.get_top_parent(browser)) box = Gtk.VBox(spacing=6) edit_frame = self.edit_display_pane(browser, _("Playlist display")) box.pack_start(edit_frame, False, True, 12) main_box = Gtk.VBox(spacing=12) close = Button(_("_Close"), Icons.WINDOW_CLOSE) close.connect('clicked', lambda *x: self.destroy()) b = Gtk.HButtonBox() b.set_layout(Gtk.ButtonBoxStyle.END) b.pack_start(close, True, True, 0) main_box.pack_start(box, True, True, 0) self.use_header_bar() if not self.has_close_button(): main_box.pack_start(b, False, True, 0) self.add(main_box) close.grab_focus() self.show_all() ����������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/playlists/util.py������������������������������������������������0000644�0001750�0001750�00000010666�13112005742�023157� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014-2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk from senf import uri2fsn, fsnative, fsn2text, path2fsn, bytes2fsn import quodlibet from quodlibet import _ from quodlibet import formats, qltk from quodlibet.qltk import Icons from quodlibet.qltk.getstring import GetStringDialog from quodlibet.qltk.wlw import WaitLoadWindow from quodlibet.util import escape from quodlibet.util.collection import FileBackedPlaylist from quodlibet.util.path import mkdir, uri_is_valid # Directory for playlist files PLAYLISTS = os.path.join(quodlibet.get_user_dir(), "playlists") assert isinstance(PLAYLISTS, fsnative) if not os.path.isdir(PLAYLISTS): mkdir(PLAYLISTS) class ConfirmRemovePlaylistDialog(qltk.Message): def __init__(self, parent, playlist): title = (_("Are you sure you want to delete the playlist '%s'?") % escape(playlist.name)) description = (_("All information about the selected playlist " "will be deleted and can not be restored.")) super(ConfirmRemovePlaylistDialog, self).__init__( Gtk.MessageType.WARNING, parent, title, description, Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Delete"), Icons.EDIT_DELETE, Gtk.ResponseType.YES) class GetPlaylistName(GetStringDialog): def __init__(self, parent): super(GetPlaylistName, self).__init__( parent, _("New Playlist"), _("Enter a name for the new playlist:"), button_label=_("_Add"), button_icon=Icons.LIST_ADD) def parse_m3u(filename, library=None): plname = fsn2text(path2fsn(os.path.basename( os.path.splitext(filename)[0]))) filenames = [] with open(filename, "rb") as h: for line in h: line = line.strip() if line.startswith(b"#"): continue else: try: filenames.append(bytes2fsn(line, "utf-8")) except ValueError: continue return __parse_playlist(plname, filename, filenames, library) def parse_pls(filename, name="", library=None): plname = fsn2text(path2fsn(os.path.basename( os.path.splitext(filename)[0]))) filenames = [] with open(filename, "rb") as h: for line in h: line = line.strip() if not line.lower().startswith(b"file"): continue else: try: line = line[line.index(b"=") + 1:].strip() except ValueError: pass else: try: filenames.append(bytes2fsn(line, "utf-8")) except ValueError: continue return __parse_playlist(plname, filename, filenames, library) def __parse_playlist(name, plfilename, files, library): playlist = FileBackedPlaylist.new(PLAYLISTS, name, library=library) songs = [] win = WaitLoadWindow( None, len(files), _("Importing playlist.\n\n%(current)d/%(total)d songs added.")) win.show() for i, filename in enumerate(files): if not uri_is_valid(filename): # Plain filename. filename = os.path.realpath(os.path.join( os.path.dirname(plfilename), filename)) if library and filename in library: songs.append(library[filename]) else: songs.append(formats.MusicFile(filename)) else: try: filename = uri2fsn(filename) except ValueError: # Who knows! Hand it off to GStreamer. songs.append(formats.remote.RemoteFile(filename)) else: # URI-encoded local filename. filename = os.path.realpath(os.path.join( os.path.dirname(plfilename), filename)) if library and filename in library: songs.append(library[filename]) else: songs.append(formats.MusicFile(filename)) if win.step(): break win.destroy() playlist.extend(filter(None, songs)) return playlist ��������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/playlists/__init__.py��������������������������������������������0000644�0001750�0001750�00000000463�13112005742�023733� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from .main import PlaylistsBrowser browsers = [PlaylistsBrowser] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/playlists/main.py������������������������������������������������0000644�0001750�0001750�00000056323�13112005742�023126� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # 2012 - 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from tempfile import NamedTemporaryFile from gi.repository import Gtk, GLib, Pango, Gdk import quodlibet from quodlibet import _ from quodlibet import config from quodlibet import qltk from quodlibet.browsers import Browser from quodlibet.browsers._base import DisplayPatternMixin from quodlibet.browsers.playlists.prefs import Preferences, \ DEFAULT_PATTERN_TEXT from quodlibet.compat import listfilter from quodlibet.formats import AudioFile from quodlibet.plugins.playlist import PLAYLIST_HANDLER from quodlibet.qltk.completion import LibraryTagCompletion from quodlibet.qltk.menubutton import MenuButton from quodlibet.qltk.models import ObjectStore, ObjectModelSort from quodlibet.qltk.searchbar import SearchBarBox from quodlibet.qltk.songlist import SongList from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.views import RCMHintedTreeView from quodlibet.qltk.x import ScrolledWindow, Align, MenuItem, SymbolicIconImage from quodlibet.qltk import Icons from quodlibet.qltk.chooser import choose_files, create_chooser_filter from quodlibet.query import Query from quodlibet.util import connect_obj from quodlibet.util.dprint import print_d, print_w from quodlibet.util.collection import FileBackedPlaylist from quodlibet.util.urllib import urlopen from .util import parse_m3u, parse_pls, PLAYLISTS, ConfirmRemovePlaylistDialog DND_QL, DND_URI_LIST, DND_MOZ_URL = range(3) class PlaylistsBrowser(Browser, DisplayPatternMixin): name = _("Playlists") accelerated_name = _("_Playlists") keys = ["Playlists", "PlaylistsBrowser"] priority = 2 replaygain_profiles = ["track"] __last_render = None _PATTERN_FN = os.path.join(quodlibet.get_user_dir(), "playlist_pattern") _DEFAULT_PATTERN_TEXT = DEFAULT_PATTERN_TEXT def pack(self, songpane): self._main_box.pack1(self, True, False) self._rh_box = rhbox = Gtk.VBox(spacing=6) align = Align(self._sb_box, left=0, right=6, top=6) rhbox.pack_start(align, False, True, 0) rhbox.pack_start(songpane, True, True, 0) self._main_box.pack2(rhbox, True, False) rhbox.show() align.show_all() return self._main_box def unpack(self, container, songpane): self._rh_box.remove(songpane) container.remove(self._rh_box) container.remove(self) @classmethod def init(klass, library): klass.library = library model = klass.__lists.get_model() for playlist in os.listdir(PLAYLISTS): try: playlist = FileBackedPlaylist(PLAYLISTS, FileBackedPlaylist.unquote(playlist), library=library) model.append(row=[playlist]) except EnvironmentError: print_w("Invalid Playlist '%s'" % playlist) pass klass._ids = [ library.connect('removed', klass.__removed), library.connect('added', klass.__added), library.connect('changed', klass.__changed), ] klass.load_pattern() @classmethod def deinit(cls, library): model = cls.__lists.get_model() model.clear() for id_ in cls._ids: library.disconnect(id_) del cls._ids @classmethod def playlists(klass): return [row[0] for row in klass.__lists] @classmethod def changed(klass, playlist, refresh=True): model = klass.__lists for row in model: if row[0] is playlist: if refresh: print_d("Refreshing playlist %s..." % row[0]) klass.__lists.row_changed(row.path, row.iter) playlist.write() break else: model.get_model().append(row=[playlist]) playlist.write() @classmethod def __removed(klass, library, songs): for playlist in klass.playlists(): if playlist.remove_songs(songs): klass.changed(playlist) @classmethod def __added(klass, library, songs): filenames = {song("~filename") for song in songs} for playlist in klass.playlists(): if playlist.add_songs(filenames, library): klass.changed(playlist) @classmethod def __changed(klass, library, songs): for playlist in klass.playlists(): for song in songs: if song in playlist.songs: klass.changed(playlist) break def cell_data(self, col, cell, model, iter, data): playlist = model[iter][0] cell.markup = markup = self.display_pattern % playlist if self.__last_render == markup: return self.__last_render = markup cell.markup = markup cell.set_property('markup', markup) def Menu(self, songs, library, items): model, iters = self.__get_selected_songs() remove = qltk.MenuItem(_("_Remove from Playlist"), Icons.LIST_REMOVE) qltk.add_fake_accel(remove, "Delete") connect_obj(remove, 'activate', self.__remove, iters, model) playlist_iter = self.__selected_playlists()[1] remove.set_sensitive(bool(playlist_iter)) items.append([remove]) menu = super(PlaylistsBrowser, self).Menu(songs, library, items) return menu def __get_selected_songs(self): songlist = qltk.get_top_parent(self).songlist model, rows = songlist.get_selection().get_selected_rows() iters = map(model.get_iter, rows) return model, iters __lists = ObjectModelSort(model=ObjectStore()) __lists.set_default_sort_func(ObjectStore._sort_on_value) def __init__(self, library): self.library = library super(PlaylistsBrowser, self).__init__(spacing=6) self.set_orientation(Gtk.Orientation.VERTICAL) self.__render = self.__create_cell_renderer() self.__view = view = self.__create_playlists_view(self.__render) self.__embed_in_scrolledwin(view) self.__configure_buttons(library) self.__configure_dnd(view, library) self.__connect_signals(view, library) self._sb_box = self.__create_searchbar(library) self._main_box = self.__create_box() self.show_all() self._query = None for child in self.get_children(): child.show_all() def __destroy(self, *args): del self._sb_box def __create_box(self): box = qltk.ConfigRHPaned("browsers", "playlistsbrowser_pos", 0.4) box.show_all() return box def __create_searchbar(self, library): self.accelerators = Gtk.AccelGroup() completion = LibraryTagCompletion(library.librarian) sbb = SearchBarBox(completion=completion, accel_group=self.accelerators) sbb.connect('query-changed', self.__text_parse) sbb.connect('focus-out', self.__focus) return sbb def __embed_in_scrolledwin(self, view): swin = ScrolledWindow() swin.set_shadow_type(Gtk.ShadowType.IN) swin.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) swin.add(view) self.pack_start(swin, True, True, 0) def __configure_buttons(self, library): new_pl = qltk.Button(_("_New"), Icons.DOCUMENT_NEW, Gtk.IconSize.MENU) new_pl.connect('clicked', self.__new_playlist) import_pl = qltk.Button(_("_Import"), Icons.LIST_ADD, Gtk.IconSize.MENU) import_pl.connect('clicked', self.__import, library) hb = Gtk.HBox(spacing=6) hb.set_homogeneous(False) hb.pack_start(new_pl, True, True, 0) hb.pack_start(import_pl, True, True, 0) hb2 = Gtk.HBox(spacing=0) hb2.pack_start(hb, True, True, 0) hb2.pack_start(PreferencesButton(self), False, False, 6) self.pack_start(Align(hb2, left=3, bottom=3), False, False, 0) def __create_playlists_view(self, render): view = RCMHintedTreeView() view.set_enable_search(True) view.set_search_column(0) view.set_search_equal_func( lambda model, col, key, iter, data: not model[iter][col].name.lower().startswith(key.lower()), None) col = Gtk.TreeViewColumn("Playlists", render) col.set_cell_data_func(render, self.cell_data) view.append_column(col) view.set_model(self.__lists) view.set_rules_hint(True) view.set_headers_visible(False) return view def __configure_dnd(self, view, library): targets = [ ("text/x-quodlibet-songs", Gtk.TargetFlags.SAME_APP, DND_QL), ("text/uri-list", 0, DND_URI_LIST), ("text/x-moz-url", 0, DND_MOZ_URL) ] targets = [Gtk.TargetEntry.new(*t) for t in targets] view.drag_dest_set(Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY) view.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, targets[:2], Gdk.DragAction.COPY) view.connect('drag-data-received', self.__drag_data_received, library) view.connect('drag-data-get', self._drag_data_get) view.connect('drag-motion', self.__drag_motion) view.connect('drag-leave', self.__drag_leave) def __connect_signals(self, view, library): view.connect('row-activated', lambda *x: self.songs_activated()) view.connect('popup-menu', self.__popup_menu, library) view.get_selection().connect('changed', self.activate) model = view.get_model() s = model.connect('row-changed', self.__check_current) connect_obj(self, 'destroy', model.disconnect, s) self.connect('key-press-event', self.__key_pressed) def __create_cell_renderer(self): render = Gtk.CellRendererText() render.set_padding(3, 3) render.set_property('ellipsize', Pango.EllipsizeMode.END) render.connect('editing-started', self.__start_editing) render.connect('edited', self.__edited) return render def key_pressed(self, event): if qltk.is_accel(event, "Delete"): self.__handle_songlist_delete() return True return False def __handle_songlist_delete(self, *args): model, iters = self.__get_selected_songs() self.__remove(iters, model) def __key_pressed(self, widget, event): if qltk.is_accel(event, "Delete"): model, iter = self.__selected_playlists() if not iter: return False playlist = model[iter][0] dialog = ConfirmRemovePlaylistDialog(self, playlist) if dialog.run() == Gtk.ResponseType.YES: playlist.delete() model.get_model().remove( model.convert_iter_to_child_iter(iter)) return True elif qltk.is_accel(event, "F2"): model, iter = self.__selected_playlists() if iter: self._start_rename(model.get_path(iter)) return True return False def __check_current(self, model, path, iter): model, citer = self.__selected_playlists() if citer and model.get_path(citer) == path: songlist = qltk.get_top_parent(self).songlist self.activate(resort=not songlist.is_sorted()) def __drag_motion(self, view, ctx, x, y, time): targets = [t.name() for t in ctx.list_targets()] if "text/x-quodlibet-songs" in targets: view.set_drag_dest(x, y, into_only=True) return True else: # Highlighting the view itself doesn't work. view.get_parent().drag_highlight() return True def __drag_leave(self, view, ctx, time): view.get_parent().drag_unhighlight() def __remove(self, iters, smodel): def song_at(itr): return smodel[smodel.get_path(itr)][0] def remove_from_model(iters, smodel): for it in iters: smodel.remove(it) model, iter = self.__selected_playlists() if iter: playlist = model[iter][0] # A {iter: song} dict, exhausting `iters` once. removals = {iter_remove: song_at(iter_remove) for iter_remove in iters} if not removals: print_w("No songs selected to remove") return if self._query is None or not self.get_filter_text(): # Calling playlist.remove_songs(songs) won't remove the # right ones if there are duplicates remove_from_model(removals.keys(), smodel) self.__rebuild_playlist_from_songs_model(playlist, smodel) # Emit manually self.library.emit('changed', removals.values()) else: playlist.remove_songs(removals.values(), True) remove_from_model(iters, smodel) print_d("Removed %d song(s) from %s" % (len(removals), playlist)) self.changed(playlist) self.activate() def __rebuild_playlist_from_songs_model(self, playlist, smodel): playlist.inhibit = True playlist.clear() playlist.extend([row[0] for row in smodel]) playlist.inhibit = False def __drag_data_received(self, view, ctx, x, y, sel, tid, etime, library): # TreeModelSort doesn't support GtkTreeDragDestDrop. view.emit_stop_by_name('drag-data-received') model = view.get_model() if tid == DND_QL: filenames = qltk.selection_get_filenames(sel) songs = listfilter(None, [library.get(f) for f in filenames]) if not songs: Gtk.drag_finish(ctx, False, False, etime) return try: path, pos = view.get_dest_row_at_pos(x, y) except TypeError: playlist = FileBackedPlaylist.from_songs(PLAYLISTS, songs, library) GLib.idle_add(self._select_playlist, playlist) else: playlist = model[path][0] playlist.extend(songs) self.changed(playlist) Gtk.drag_finish(ctx, True, False, etime) else: if tid == DND_URI_LIST: uri = sel.get_uris()[0] name = os.path.basename(uri) elif tid == DND_MOZ_URL: data = sel.get_data() uri, name = data.decode('utf16', 'replace').split('\n') else: Gtk.drag_finish(ctx, False, False, etime) return name = name or os.path.basename(uri) or _("New Playlist") uri = uri.encode('utf-8') try: sock = urlopen(uri) f = NamedTemporaryFile() f.write(sock.read()) f.flush() if uri.lower().endswith('.pls'): playlist = parse_pls(f.name, library=library) elif uri.lower().endswith('.m3u'): playlist = parse_m3u(f.name, library=library) else: raise IOError library.add_filename(playlist) if name: playlist.rename(name) self.changed(playlist) Gtk.drag_finish(ctx, True, False, etime) except IOError: Gtk.drag_finish(ctx, False, False, etime) qltk.ErrorMessage( qltk.get_top_parent(self), _("Unable to import playlist"), _("Quod Libet can only import playlists in the M3U " "and PLS formats.")).run() def _drag_data_get(self, view, ctx, sel, tid, etime): model, iters = self.__view.get_selection().get_selected_rows() songs = [] for itr in iters: if itr: songs += model[itr][0].songs if tid == 0: qltk.selection_set_songs(sel, songs) else: sel.set_uris([song("~uri") for song in songs]) def _select_playlist(self, playlist, scroll=False): view = self.__view model = view.get_model() for row in model: if row[0] is playlist: view.get_selection().select_iter(row.iter) if scroll: view.scroll_to_cell(row.path, use_align=True, row_align=0.5) def __popup_menu(self, view, library): model, itr = view.get_selection().get_selected() if itr is None: return songs = list(model[itr][0]) songs = [s for s in songs if isinstance(s, AudioFile)] menu = SongsMenu(library, songs, playlists=False, remove=False, ratings=False) menu.preseparate() def _remove(model, itr): playlist = model[itr][0] dialog = ConfirmRemovePlaylistDialog(self, playlist) if dialog.run() == Gtk.ResponseType.YES: playlist.delete() model.get_model().remove( model.convert_iter_to_child_iter(itr)) rem = MenuItem(_("_Delete"), Icons.EDIT_DELETE) connect_obj(rem, 'activate', _remove, model, itr) menu.prepend(rem) def _rename(path): self._start_rename(path) ren = qltk.MenuItem(_("_Rename"), Icons.EDIT) qltk.add_fake_accel(ren, "F2") connect_obj(ren, 'activate', _rename, model.get_path(itr)) menu.prepend(ren) playlist = model[itr][0] PLAYLIST_HANDLER.populate_menu(menu, library, self, [playlist]) menu.show_all() return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def _start_rename(self, path): view = self.__view self.__render.set_property('editable', True) view.set_cursor(path, view.get_columns()[0], start_editing=True) def __focus(self, widget, *args): qltk.get_top_parent(widget).songlist.grab_focus() def __text_parse(self, bar, text): self.activate() def _set_text(self, text): self._sb_box.set_text(text) def activate(self, widget=None, resort=True): songs = self._get_playlist_songs() text = self.get_filter_text() # TODO: remove static dependency on Query if Query.is_parsable(text): self._query = Query(text, SongList.star) songs = self._query.filter(songs) GLib.idle_add(self.songs_selected, songs, resort) @classmethod def refresh_all(cls): model = cls.__lists.get_model() for iter_, value in model.iterrows(): model.row_changed(model.get_path(iter_), iter_) @property def model(self): return self.__lists.get_model() def _get_playlist_songs(self): model, iter = self.__selected_playlists() songs = iter and list(model[iter][0]) or [] return [s for s in songs if isinstance(s, AudioFile)] def can_filter_text(self): return True def filter_text(self, text): self._set_text(text) self.activate() def get_filter_text(self): return self._sb_box.get_text() def can_filter(self, key): # TODO: special-case the ~playlists tag maybe? return super(PlaylistsBrowser, self).can_filter(key) def finalize(self, restore): config.set("browsers", "query_text", "") def unfilter(self): self.filter_text("") def active_filter(self, song): return (song in self._get_playlist_songs() and (self._query is None or self._query.search(song))) def save(self): model, iter = self.__selected_playlists() name = iter and model[iter][0].name or "" config.set("browsers", "playlist", name) text = self.get_filter_text() config.set("browsers", "query_text", text) def __new_playlist(self, activator): playlist = FileBackedPlaylist.new(PLAYLISTS) self.model.append(row=[playlist]) self._select_playlist(playlist, scroll=True) model, iter = self.__selected_playlists() path = model.get_path(iter) GLib.idle_add(self._start_rename, path) def __start_editing(self, render, editable, path): editable.set_text(self.__lists[path][0].name) def __edited(self, render, path, newname): return self._rename(path, newname) def _rename(self, path, newname): playlist = self.__lists[path][0] try: playlist.rename(newname) except ValueError as s: qltk.ErrorMessage( None, _("Unable to rename playlist"), s).run() else: row = self.__lists[path] child_model = self.model child_model.remove( self.__lists.convert_iter_to_child_iter(row.iter)) child_model.append(row=[playlist]) self._select_playlist(playlist, scroll=True) def __import(self, activator, library): cf = create_chooser_filter(_("Playlists"), ["*.pls", "*.m3u"]) fns = choose_files(self, _("Import Playlist"), _("_Import"), cf) for filename in fns: if filename.endswith(".m3u"): playlist = parse_m3u(filename, library=library) elif filename.endswith(".pls"): playlist = parse_pls(filename, library=library) else: continue self.changed(playlist) library.add(playlist) def restore(self): try: name = config.get("browsers", "playlist") except config.Error as e: print_d("Couldn't get last playlist from config: %s" % e) else: self.__view.select_by_func(lambda r: r[0].name == name, one=True) try: text = config.get("browsers", "query_text") except config.Error as e: print_d("Couldn't get last search string from config: %s" % e) else: self._set_text(text) can_reorder = True def scroll(self, song): self.__view.iter_select_by_func(lambda r: song in r[0]) def reordered(self, songs): model, iter = self.__selected_playlists() playlist = None if iter: playlist = model[iter][0] playlist[:] = songs elif songs: playlist = FileBackedPlaylist.from_songs(PLAYLISTS, songs) GLib.idle_add(self._select_playlist, playlist) if playlist: self.changed(playlist, refresh=False) def __selected_playlists(self): """Returns a tuple of (model, iter) for the current playlist(s)""" return self.__view.get_selection().get_selected() class PreferencesButton(Gtk.HBox): def __init__(self, browser): super(PreferencesButton, self).__init__() menu = Gtk.Menu() pref_item = MenuItem(_("_Preferences"), Icons.PREFERENCES_SYSTEM) menu.append(pref_item) connect_obj(pref_item, "activate", Preferences, browser) menu.show_all() button = MenuButton( SymbolicIconImage(Icons.EMBLEM_SYSTEM, Gtk.IconSize.MENU), arrow=True) button.set_menu(menu) self.pack_start(button, True, True, 0) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/playlists/menu.py������������������������������������������������0000644�0001750�0001750�00000007226�13114753360�023154� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Pango, GObject from quodlibet import app from quodlibet import ngettext, _ from quodlibet import qltk from quodlibet.browsers.playlists.util import GetPlaylistName, PLAYLISTS from quodlibet.qltk import SeparatorMenuItem, get_menu_item_top_parent, Icons from quodlibet.util.collection import Playlist, FileBackedPlaylist class PlaylistMenu(Gtk.Menu): __gsignals__ = { 'new': (GObject.SignalFlags.RUN_LAST, None, (object,)), } def __init__(self, songs, playlists): super(PlaylistMenu, self).__init__() i = Gtk.MenuItem(label=_(u"_New Playlist…"), use_underline=True) i.connect('activate', self._on_new_playlist_activate, songs) self.append(i) self.append(SeparatorMenuItem()) self.set_size_request(int(i.size_request().width * 2), -1) for playlist in playlists: name = playlist.name i = Gtk.CheckMenuItem(name) some, all = playlist.has_songs(songs) i.set_active(some) i.set_inconsistent(some and not all) i.get_child().set_ellipsize(Pango.EllipsizeMode.END) i.connect( 'activate', self._on_toggle_playlist_activate, playlist, songs) self.append(i) def _on_new_playlist_activate(self, item, songs): parent = get_menu_item_top_parent(item) title = Playlist.suggested_name_for(songs) title = self._get_new_name(parent, title) if title is None: return playlist = FileBackedPlaylist.new(PLAYLISTS, title, library=app.library) playlist.extend(songs) self._emit_new(playlist) def _get_new_name(self, parent, title): """Ask the user for a name for the new playlist""" return GetPlaylistName(qltk.get_top_parent(parent)).run(title) def _emit_new(self, playlist): # TODO: signals directly from a new playlist library (#518) self.emit('new', playlist) def _on_toggle_playlist_activate(self, item, playlist, songs): parent = get_menu_item_top_parent(item) has_some, has_all = playlist.has_songs(songs) if has_all: playlist.remove_songs(songs) elif has_some: resp = ConfirmMultipleSongsAction(parent, playlist, songs).run() if resp == ConfirmMultipleSongsAction.REMOVE: playlist.remove_songs(songs) elif resp == ConfirmMultipleSongsAction.ADD: playlist.extend(songs) return else: playlist.extend(songs) class ConfirmMultipleSongsAction(qltk.Message): """Dialog to ask the user what to do when selecting a playlist for multiple songs with a mix of inclusion""" ADD, REMOVE = range(2) def __init__(self, parent, playlist, songs): desc = ngettext("What do you want to do with that %d song?", "What do you want to do with those %d songs?", len(songs)) % len(songs) title = _("Confirm action for playlist \"%s\"") % playlist.name super(ConfirmMultipleSongsAction, self).__init__( Gtk.MessageType.QUESTION, parent, title, desc, Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Add"), Icons.LIST_ADD, self.ADD) self.add_icon_button(_("_Remove"), Icons.LIST_REMOVE, self.REMOVE) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/collection/������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021724� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/collection/prefs.py����������������������������������������������0000644�0001750�0001750�00000015410�13112005742�023420� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010, 2012-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import config from quodlibet import util from quodlibet import qltk from quodlibet import _ from quodlibet.qltk.tagscombobox import TagsComboBoxEntry from quodlibet.qltk.views import BaseView from quodlibet.qltk import Button, Icons from quodlibet.util import connect_obj from quodlibet.compat import iteritems, iterkeys def get_headers(): result = [] headers = config.get("browsers", "collection_headers") for h in headers.splitlines(): values = h.split() if len(values) != 2: continue tag, merge = values try: result.append((tag, bool(int(merge)))) except ValueError: continue return result def save_headers(headers): headers = "\n".join(["%s %d" % (t, m) for (t, m) in headers]) config.set("browsers", "collection_headers", headers) class PatternEditor(Gtk.HBox): PRESETS = [ [("~people", False)], [("~year", False)], [("genre", False)], [("genre", False), ("artist", False)], ] COMPLETION = ["genre", "grouping", "~people", "artist", "album", "~year"] def __init__(self): super(PatternEditor, self).__init__(spacing=12) self.__headers = headers = {} buttons = [] group = None for tags in self.PRESETS: tied = "~" + "~".join([t[0] for t in tags]) group = Gtk.RadioButton(group=group, label="_" + util.tag(tied), use_underline=True) headers[group] = tags buttons.append(group) group = Gtk.RadioButton(group=group, label=_("_Custom"), use_underline=True) self.__custom = group headers[group] = [] buttons.append(group) button_box = Gtk.HBox(spacing=6) self.__model = model = Gtk.ListStore(str, bool) radio_box = Gtk.VBox(spacing=6) for button in buttons: radio_box.pack_start(button, False, True, 0) button.connect('toggled', self.__toggled, button_box, model) self.pack_start(radio_box, False, True, 0) cb = TagsComboBoxEntry(self.COMPLETION) view = BaseView(model=model) view.set_reorderable(True) view.set_headers_visible(True) ctrl_box = Gtk.VBox(spacing=6) add = Button(_("_Add"), Icons.LIST_ADD) ctrl_box.pack_start(add, False, True, 0) add.connect('clicked', self.__add, model, cb) remove = Button(_("_Remove"), Icons.LIST_REMOVE) ctrl_box.pack_start(remove, False, True, 0) remove.connect('clicked', self.__remove, view) selection = view.get_selection() selection.connect('changed', self.__selection_changed, remove) selection.emit('changed') sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(view) edit_box = Gtk.VBox(spacing=6) edit_box.pack_start(cb, False, True, 0) edit_box.pack_start(sw, True, True, 0) button_box.pack_start(edit_box, True, True, 0) button_box.pack_start(ctrl_box, False, True, 0) self.pack_start(button_box, True, True, 0) render = Gtk.CellRendererText() render.set_property("editable", True) def edited_cb(render, path, text, model): model[path][0] = text render.connect("edited", edited_cb, model) column = Gtk.TreeViewColumn(_("Tag"), render, text=0) column.set_expand(True) view.append_column(column) toggle = Gtk.CellRendererToggle() toggle.connect("toggled", self.__toggeled, model) toggle_column = Gtk.TreeViewColumn(_("Merge"), toggle, active=1) view.append_column(toggle_column) def __toggeled(self, render, path, model): model[path][1] = not model[path][1] @property def headers(self): for button in iterkeys(self.__headers): if button.get_active(): if button == self.__custom: model_headers = [(row[0], row[1]) for row in self.__model] self.__headers[self.__custom] = model_headers return self.__headers[button] @headers.setter def headers(self, new_headers): for button, headers in iteritems(self.__headers): if headers == new_headers: button.set_active(True) button.emit("toggled") break else: self.__headers[self.__custom] = new_headers self.__custom.set_active(True) def __selection_changed(self, selection, remove): remove.set_sensitive(bool(selection.get_selected()[1])) def __add(self, button, model, cb): if cb.tag: model.append(row=[cb.tag, False]) def __remove(self, button, view): view.remove_selection() def __toggled(self, button, edit_widget, model): tags = self.__headers[button] if tags: model.clear() for tag, merge in tags: model.append(row=[tag, merge]) edit_widget.set_sensitive( button.get_active() and button is self.__custom) class Preferences(qltk.UniqueWindow): def __init__(self, browser): if self.is_not_unique(): return super(Preferences, self).__init__() self._browser = browser self.set_transient_for(qltk.get_top_parent(browser)) self.set_default_size(350, 225) self.set_border_width(12) self.set_title(_("Album Collection Preferences")) vbox = Gtk.VBox(spacing=12) editor = PatternEditor() editor.headers = get_headers() apply = Button(_("_Apply")) connect_obj(apply, "clicked", self.__apply, editor, False) cancel = Button(_("_Cancel")) cancel.connect("clicked", lambda x: self.destroy()) box = Gtk.HButtonBox() box.set_spacing(6) box.set_layout(Gtk.ButtonBoxStyle.END) box.pack_start(apply, True, True, 0) self.use_header_bar() if not self.has_close_button(): box.pack_start(cancel, True, True, 0) vbox.pack_start(editor, True, True, 0) vbox.pack_start(box, False, True, 0) self.add(vbox) apply.grab_focus() self.show_all() def __apply(self, editor, close): if editor.headers != get_headers(): save_headers(editor.headers) self._browser.set_hierarchy() if close: self.destroy() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/collection/__init__.py�������������������������������������������0000644�0001750�0001750�00000000504�13112005742�024036� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010, 2012-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from .main import CollectionBrowser browsers = [CollectionBrowser] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/collection/models.py���������������������������������������������0000644�0001750�0001750�00000020625�13112005742�023570� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010, 2012-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import util from quodlibet import config from quodlibet import _ from quodlibet.pattern import XMLFromPattern from quodlibet.qltk.models import ObjectTreeStore, ObjectModelFilter from quodlibet.qltk.models import ObjectModelSort from quodlibet.compat import iteritems, string_types, itervalues EMPTY = _("Songs not in an album") ALBUM_PATTERN = r""" \<b\><album|<album>|%s>\</b\><date| \<small\>(<date>)\</small\>> \<small\><~discs|<~discs> - ><~tracks> - <~long-length>\</small\>""" % EMPTY ALBUM_PATTERN = ALBUM_PATTERN.lstrip() PAT = XMLFromPattern(ALBUM_PATTERN) UNKNOWN_PATTERN = "<b><i>%s</i></b>" % _("Unknown %s") MULTI_PATTERN = "<b><i>%s</i></b>" % _("Multiple %s Values") COUNT_PATTERN = " <span size='small' color='#777'>(%s)</span>" class AlbumNode(object): def __init__(self, album): self.album = album self.scanned = False @property def COVER_SIZE(self): size = config.getint("browsers", "cover_size") if size <= 0: size = 48 return size def scan_cover(self, scale_factor=1): if self.scanned or not self.album.songs: return self.scanned = True from quodlibet import app s = self.COVER_SIZE * scale_factor * 0.5 self.cover = app.cover_manager.get_pixbuf_many(self.album.songs, s, s) UnknownNode = object() MultiNode = object() _ORDERING = {t: (x + 1) for x, t in enumerate([MultiNode, UnknownNode, None])} """The ordering score by instance of singleton / "special" values".""" def build_tree(tags, albums, cache=None): if not tags: return list(albums) tag, merge = tags[0] tree = {} cache = cache or {} for album in albums: cache_key = (album, tag) if cache_key not in cache: cache[cache_key] = album.list(tag) values = cache[cache_key] if merge and len(values) > 1: values = [MultiNode] for value in values or [UnknownNode]: tree.setdefault(value, []).append(album) for key, value in iteritems(tree): tree[key] = build_tree(tags[1:], value, cache) return tree class CollectionModelMixin(object): def get_path_for_album(self, album): """Returns the path for an album or None""" def func(model, path, iter_, result): item = model.get_value(iter_) if getattr(item, "album", None) is album: # pygobject bug: treepath only valid in callback, # so make a copy result[0] = path.copy() return True return False res = [None] self.foreach(func, res) return res[0] def get_albums_for_path(self, path): return self.get_albums_for_iter(self.get_iter(path)) def get_albums_for_iter(self, iter_): obj = self.get_value(iter_) if isinstance(obj, AlbumNode): return {obj.album} albums = set() for child_iter, value in self.iterrows(iter_): if isinstance(value, AlbumNode): albums.add(value.album) else: albums.update(self.get_albums_for_iter(child_iter)) return albums def iter_albums(self, iter_): """Yields all albums below iter_""" for child_iter, value in self.iterrows(iter_): if isinstance(value, AlbumNode): yield value.album else: for album in self.iter_albums(child_iter): yield album def get_markup(self, tags, iter_): obj = self.get_value(iter_, 0) if isinstance(obj, AlbumNode): return PAT % obj.album if isinstance(obj, string_types): markup = util.escape(obj) else: tag = util.tag(tags[len(self.get_path(iter_).get_indices()) - 1]) if obj is UnknownNode: markup = UNKNOWN_PATTERN % util.escape(tag) else: markup = MULTI_PATTERN % util.escape(tag) num = len(self.get_albums_for_iter(iter_)) return markup + COUNT_PATTERN % num def get_album(self, iter_): obj = self.get_value(iter_, 0) if isinstance(obj, AlbumNode): return obj.album class CollectionFilterModel(ObjectModelFilter, CollectionModelMixin): pass class CollectionSortModel(ObjectModelSort, CollectionModelMixin): pass class CollectionTreeStore(ObjectTreeStore, CollectionModelMixin): def __init__(self): super(CollectionTreeStore, self).__init__(object) self.__tags = [] def set_albums(self, tags, albums): self.clear() self.__tags = tags self.add_albums(albums) @property def tags(self): return [t[0] for t in self.__tags] def add_albums(self, albums): def _add(tree, iter_=None): # lowest level, add albums if isinstance(tree, list): for album in tree: self.append(parent=iter_, row=[AlbumNode(album)]) return # move into existing nodes and remove them from tree child = self.iter_children(iter_) while child: obj = self[child][0] if obj in tree: _add(tree[obj], child) del tree[obj] child = self.iter_next(child) # add missing ones for key, value in iteritems(tree): _add(value, self.append(parent=iter_, row=[key])) _add(build_tree(self.__tags, albums)) def remove_albums(self, albums): # We can't get anything from the albums (they have no songs), # so we have to look through everything. def _remove_albums(albums, iter_=None): child = self.iter_children(iter_) while child: _remove_albums(albums, child) obj = self[child][0] if isinstance(obj, AlbumNode): # remove albums if obj.album in albums: if not self.remove(child): child = None continue else: child = self.iter_next(child) else: # clean up empty containers if not self.iter_has_child(child): if not self.remove(child): child = None continue else: child = self.iter_next(child) _remove_albums(set(albums)) def change_albums(self, albums): def _check_albums(tree, iter_=None, not_found=None): if not_found is None: not_found = set() if isinstance(tree, list): # save nodes that are not there anymore child = self.iter_children(iter_) while child: row = self[child] try: tree.remove(row[0].album) except ValueError: pass else: # it's still in the same position, trigger a redraw self.row_changed(row.path, row.iter) child = self.iter_next(child) not_found.update(tree) return not_found child = self.iter_children(iter_) while child: obj = self[child][0] if obj in tree: _check_albums(tree[obj], child, not_found) del tree[obj] child = self.iter_next(child) # everything left over changed def _get_all(sub, found=None): if found is None: found = set() if isinstance(sub, list): found.update(sub) return found for v in itervalues(sub): _get_all(v, found) return found not_found.update(_get_all(tree)) return not_found not_found = _check_albums(build_tree(self.__tags, albums)) self.remove_albums(not_found) self.add_albums(not_found) �����������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/collection/main.py�����������������������������������������������0000644�0001750�0001750�00000031710�13112005742�023226� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010, 2012-2014 Christoph Reiter # 2017 Uriel Zajaczkovski # 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GLib, Pango, Gdk from quodlibet import qltk from quodlibet import util from quodlibet import config from quodlibet import _ from quodlibet.browsers.albums import AlbumTagCompletion from quodlibet.browsers import Browser from quodlibet.query import Query from quodlibet.compat import cmp from quodlibet.qltk.searchbar import SearchBarBox from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.views import AllTreeView from quodlibet.qltk import Icons from quodlibet.qltk.image import add_border_widget, get_surface_for_pixbuf from quodlibet.qltk.x import ScrolledWindow, Align, SymbolicIconImage from quodlibet.util import connect_obj from quodlibet.util.library import background_filter from .models import (CollectionTreeStore, CollectionSortModel, CollectionFilterModel, AlbumNode, _ORDERING) from .prefs import get_headers, Preferences class CollectionView(AllTreeView): def __init__(self): super(CollectionView, self).__init__() self.connect_after("row-expanded", self.__expand_helper) def __expand_helper(self, view, iter, path): model = view.get_model() children = list(model[path].iterchildren()) if len(children) == 1: view.expand_row(children[0].path, False) def select_album(self, album, unselect=True): model = self.get_model() path = model.get_path_for_album(album) if path is not None: self.select_path(path, unselect) def select_path(self, path, unselect=True): path_idx = path if isinstance(path_idx, Gtk.TreePath): path_idx = path_idx.get_indices() for i, x in enumerate(path_idx[:-1]): self.expand_row(Gtk.TreePath(tuple(path_idx[:i + 1])), False) self.scroll_to_cell(path, use_align=True, row_align=0.5) selection = self.get_selection() assert selection if unselect: selection.unselect_all() self.set_cursor(path) else: selection.select_path(path) def get_selected_albums(self): selection = self.get_selection() assert selection model, paths = selection.get_selected_rows() albums = set() for path in paths: albums.update(model.get_albums_for_path(path)) return albums class CollectionBrowser(Browser, util.InstanceTracker): name = _("Album Collection") accelerated_name = _("Album _Collection") keys = ["AlbumCollection", "CollectionBrowser"] priority = 5 __model = None def pack(self, songpane): container = qltk.ConfigRHPaned( "browsers", "collectionbrowser_pos", 0.4) container.pack1(self, True, False) container.pack2(songpane, True, False) return container def unpack(self, container, songpane): container.remove(songpane) container.remove(self) @classmethod def _init_model(klass, library): klass.__model = model = CollectionTreeStore() klass.__albums = albums = library.albums albums.load() klass.__sigs = [ albums.connect("added", klass._add_albums, model), albums.connect("removed", klass._remove_albums, model), albums.connect("changed", klass._change_albums, model), ] klass.set_hierarchy() @classmethod def _destroy_model(klass): for sig in klass.__sigs: klass.__albums.disconnect(sig) klass.__model = None del klass.__sigs def _refilter(self): if hasattr(self, "view"): self.view.get_model().refilter() @classmethod def set_hierarchy(klass): klass.__model.set_albums(get_headers(), klass.__albums.values()) for inst in klass.instances(): inst._refilter() @classmethod def _add_albums(klass, library, added, model): model.add_albums(added) @classmethod def _remove_albums(klass, library, removed, model): model.remove_albums(removed) @classmethod def _change_albums(klass, library, changed, model): model.change_albums(changed) def __init__(self, library): super(CollectionBrowser, self).__init__(spacing=6) self.set_orientation(Gtk.Orientation.VERTICAL) self._register_instance() if self.__model is None: self._init_model(library) sw = ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) self.view = view = CollectionView() view.set_headers_visible(False) model_sort = CollectionSortModel(model=self.__model) model_filter = CollectionFilterModel(child_model=model_sort) self.__filter = None self.__bg_filter = background_filter() model_filter.set_visible_func(self.__parse_query) view.set_model(model_filter) def cmp_rows(model, i1, i2, data): t1, t2 = model[i1][0], model[i2][0] pos1 = _ORDERING.get(t1, 0) pos2 = _ORDERING.get(t2, 0) if pos1 or pos2: return cmp(pos1, pos2) if not isinstance(t1, AlbumNode): return cmp(util.human_sort_key(t1), util.human_sort_key(t2)) a1, a2 = t1.album, t2.album return (cmp(a1.peoplesort and a1.peoplesort[0], a2.peoplesort and a2.peoplesort[0]) or cmp(a1.date or "ZZZZ", a2.date or "ZZZZ") or cmp((a1.sort, a1.key), (a2.sort, a2.key))) model_sort.set_sort_func(0, cmp_rows) model_sort.set_sort_column_id(0, Gtk.SortType.ASCENDING) column = Gtk.TreeViewColumn("albums") def cell_data(column, cell, model, iter_, data): markup = model.get_markup(self.__model.tags, iter_) cell.markup = markup cell.set_property('markup', markup) def get_scaled_cover(item): if item.scanned: return item.cover scale_factor = self.get_scale_factor() item.scan_cover(scale_factor=scale_factor) return item.cover def cell_data_pb(column, cell, model, iter_, data): album = model.get_album(iter_) if album is None: cell.set_property('icon-name', Icons.FOLDER) else: item = model.get_value(iter_) cover = get_scaled_cover(item) if cover: cover = add_border_widget(cover, view) surface = get_surface_for_pixbuf(self, cover) cell.set_property("surface", surface) else: cell.set_property('icon-name', Icons.MEDIA_OPTICAL) imgrender = Gtk.CellRendererPixbuf() render = Gtk.CellRendererText() if view.supports_hints(): render.set_property('ellipsize', Pango.EllipsizeMode.END) column.pack_start(imgrender, False) column.pack_start(render, True) column.set_cell_data_func(render, cell_data) column.set_cell_data_func(imgrender, cell_data_pb) view.append_column(column) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.add(view) hbox = Gtk.HBox(spacing=6) prefs = Gtk.Button() prefs.add(SymbolicIconImage(Icons.EMBLEM_SYSTEM, Gtk.IconSize.MENU)) prefs.connect('clicked', lambda *x: Preferences(self)) self.accelerators = Gtk.AccelGroup() search = SearchBarBox(completion=AlbumTagCompletion(), accel_group=self.accelerators) search.connect('query-changed', self.__update_filter) connect_obj(search, 'focus-out', lambda w: w.grab_focus(), view) self.__search = search hbox.pack_start(search, True, True, 0) hbox.pack_start(prefs, False, True, 0) self.pack_start(Align(hbox, left=6, top=6), False, True, 0) self.pack_start(sw, True, True, 0) view.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) self.__sig = view.get_selection().connect('changed', self.__selection_changed) view.connect('row-activated', self.__play) connect_obj(view, 'popup-menu', self.__popup, view, library) targets = [("text/x-quodlibet-songs", Gtk.TargetFlags.SAME_APP, 1), ("text/uri-list", 0, 2)] targets = [Gtk.TargetEntry.new(*t) for t in targets] view.drag_source_set( Gdk.ModifierType.BUTTON1_MASK, targets, Gdk.DragAction.COPY) view.connect("drag-data-get", self.__drag_data_get) self.connect("destroy", self.__destroy) self.show_all() def __inhibit(self): self.view.get_selection().handler_block(self.__sig) def __uninhibit(self): self.view.get_selection().handler_unblock(self.__sig) def __parse_query(self, model, iter_, data): f, b = self.__filter, self.__bg_filter if f is None and b is None: return True def check_album(obj): if b is None: return f(obj) if f is None: return b(obj) return f(obj) and b(obj) obj = model.get_value(iter_) if isinstance(obj, AlbumNode): return check_album(obj.album) else: for album in model.iter_albums(iter_): if check_album(album): return True return False def __update_filter(self, entry, text): self.__filter = None if not Query.match_all(text): tags = self.__model.tags + ["album"] self.__filter = Query(text, star=tags).search self.__bg_filter = background_filter() self.view.get_model().refilter() def __destroy(self, browser): klass = type(browser) if not klass.instances(): klass._destroy_model() def __drag_data_get(self, view, ctx, sel, tid, etime): songs = self.__get_selected_songs() if tid == 1: qltk.selection_set_songs(sel, songs) else: sel.set_uris([song("~uri") for song in songs]) def __popup(self, view, library): songs = self.__get_selected_songs(view.get_selection()) menu = SongsMenu(library, songs) menu.show_all() return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __play(self, view, path, col): model = view.get_model() if isinstance(model[path][0], AlbumNode): self.songs_activated() else: if view.row_expanded(path): view.collapse_row(path) else: view.expand_row(path, False) def __get_selected_songs(self, sort=True): albums = self.view.get_selected_albums() songs = [] if sort: for album in albums: songs.extend(sorted(album.songs)) else: for album in albums: songs.extend(album.songs) return songs def __selection_changed(self, selection): songs = self.__get_selected_songs(False) if songs is not None: GLib.idle_add(self.songs_selected, songs) def can_filter_albums(self): return True def filter_albums(self, album_keys): albums = [a for a in [self.__albums.get(k) for k in album_keys] if a is not None] if albums: self.view.select_album(albums[0], unselect=True) for album in albums[1:]: self.view.select_album(album, unselect=False) def can_filter_text(self): return True def filter_text(self, text): self.__search.set_text(text) if Query.is_parsable(text): self.__update_filter(self.__search, text) self.activate() def get_filter_text(self): return self.__search.get_text() def unfilter(self): pass def activate(self): self.view.get_selection().emit('changed') def restore(self): paths = config.get("browsers", "collection", "").split("\t") paths = [tuple(map(int, path.split())) for path in paths] self.__inhibit() if paths: if not paths[0]: self.__uninhibit() return self.view.select_path(paths[0], unselect=True) for path in paths[1:]: self.view.select_path(path, unselect=False) self.__uninhibit() def scroll(self, song): album = self.__albums.get(song.album_key) if album: self.view.select_album(album) def save(self): model, paths = self.view.get_selection().get_selected_rows() paths = "\t".join([" ".join(map(str, path)) for path in paths]) config.set("browsers", "collection", paths) browsers = [CollectionBrowser] ��������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/media.py���������������������������������������������������������0000644�0001750�0001750�00000050422�13112005742�021227� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Markus Koller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk, Pango from quodlibet import config from quodlibet import devices from quodlibet import qltk from quodlibet import util from quodlibet import app from quodlibet import _ from quodlibet.browsers import Browser from quodlibet.formats import AudioFile from quodlibet.qltk.views import AllTreeView from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.wlw import WaitLoadBar from quodlibet.qltk.browser import LibraryBrowser from quodlibet.qltk.delete import DeleteDialog from quodlibet.qltk.window import Dialog from quodlibet.qltk.x import Align, ScrolledWindow, Button, MenuItem from quodlibet.qltk import Icons from quodlibet.util import connect_obj, print_w from quodlibet.compat import text_type class DeviceProperties(Dialog): def __init__(self, parent, device): super(DeviceProperties, self).__init__( title=_("Device Properties"), transient_for=qltk.get_top_parent(parent)) self.add_icon_button(_("_Close"), Icons.WINDOW_CLOSE, Gtk.ResponseType.CLOSE) self.set_default_size(400, -1) self.connect('response', self.__close) table = Gtk.Table() table.set_border_width(8) table.set_row_spacings(8) table.set_col_spacings(8) self.vbox.pack_start(table, False, True, 0) props = [] props.append((_("Device:"), device.block_device, None)) mountpoint = util.escape( device.mountpoint or ("<i>%s</i>" % _("Not mounted"))) props.append((_("Mount point:"), mountpoint, None)) props.append((None, None, None)) entry = Gtk.Entry() entry.set_text(device['name']) props.append((_("_Name:"), entry, 'name')) y = 0 for title, value, key in props + device.Properties(): if title is None: table.attach(Gtk.HSeparator(), 0, 2, y, y + 1) else: if key and isinstance(value, Gtk.CheckButton): value.set_label(title) value.set_use_underline(True) value.connect('toggled', self.__changed, key, device) table.attach(value, 0, 2, y, y + 1, xoptions=Gtk.AttachOptions.FILL) else: label = Gtk.Label() label.set_markup("<b>%s</b>" % util.escape(title)) label.set_alignment(0.0, 0.5) table.attach(label, 0, 1, y, y + 1, xoptions=Gtk.AttachOptions.FILL) if key and isinstance(value, Gtk.Widget): widget = value label.set_mnemonic_widget(widget) label.set_use_underline(True) widget.connect('changed', self.__changed, key, device) else: widget = Gtk.Label(label=value) widget.set_use_markup(True) widget.set_selectable(True) widget.set_alignment(0.0, 0.5) table.attach(widget, 1, 2, y, y + 1) y += 1 self.get_child().show_all() def __changed(self, widget, key, device): if isinstance(widget, Gtk.Entry): value = widget.get_text() elif isinstance(widget, Gtk.SpinButton): value = widget.get_value() elif isinstance(widget, Gtk.CheckButton): value = widget.get_active() else: raise NotImplementedError device[key] = value def __close(self, dialog, response): dialog.destroy() devices.write() # This will be included in SongsMenu class Menu(Gtk.Menu): def __init__(self, songs, library): super(Menu, self).__init__() for device in MediaDevices.devices(): i = Gtk.ImageMenuItem(device['name']) i.set_image( Gtk.Image.new_from_icon_name(device.icon, Gtk.IconSize.MENU)) i.set_sensitive(device.is_connected()) connect_obj(i, 'activate', self.__copy_to_device, device, songs, library) self.append(i) @staticmethod def __copy_to_device(device, songs, library): if len(MediaDevices.instances()) > 0: browser = MediaDevices.instances()[0] else: win = LibraryBrowser.open(MediaDevices, library, app.player) browser = win.browser browser.select(device) browser.dropped(songs) class MediaDevices(Browser, util.InstanceTracker): name = _("Media Devices") accelerated_name = _("_Media Devices") keys = ["MediaDevices"] priority = 25 uses_main_library = False replaygain_profiles = ['track'] __devices = Gtk.ListStore(object, str) __busy = False __last = None @staticmethod def cell_data(col, render, model, iter, data): device = model[iter][0] if device.is_connected(): render.markup = "<b>%s</b>" % util.escape(device['name']) else: render.markup = util.escape(device['name']) render.set_property('markup', render.markup) @classmethod def init(klass, library): devices.device_manager.connect('added', klass.__device_added) devices.device_manager.connect('removed', klass.__device_removed) devices.device_manager.discover() @classmethod def devices(klass): return [row[0] for row in klass.__devices] @classmethod def __device_added(klass, manager, device): klass.__devices.append(row=[device, device.icon]) @classmethod def __device_removed(klass, manager, bid): for row in klass.__devices: if row[0].bid == bid: klass.__devices.remove(row.iter) break def __init__(self, library): super(MediaDevices, self).__init__(spacing=6) self.set_orientation(Gtk.Orientation.VERTICAL) self._register_instance() self.__cache = {} # Device list on the left pane swin = ScrolledWindow() swin.set_shadow_type(Gtk.ShadowType.IN) swin.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.pack_start(swin, True, True, 0) self.__view = view = AllTreeView() view.set_model(self.__devices) view.set_rules_hint(True) view.set_headers_visible(False) view.get_selection().set_mode(Gtk.SelectionMode.BROWSE) connect_obj(view.get_selection(), 'changed', self.__refresh, False) view.connect('popup-menu', self.__popup_menu, library) view.connect('row-activated', lambda *a: self.songs_activated()) swin.add(view) col = Gtk.TreeViewColumn("Devices") view.append_column(col) render = Gtk.CellRendererPixbuf() col.pack_start(render, False) col.add_attribute(render, 'icon-name', 1) self.__render = render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) render.connect('edited', self.__edited) col.pack_start(render, True) col.set_cell_data_func(render, MediaDevices.cell_data) hbox = Gtk.HBox(spacing=6) hbox.set_homogeneous(True) self.pack_start(Align(hbox, left=3, bottom=3), False, True, 0) # refresh button refresh = Button(_("_Refresh"), Icons.VIEW_REFRESH, Gtk.IconSize.MENU) self.__refresh_button = refresh connect_obj(refresh, 'clicked', self.__refresh, True) refresh.set_sensitive(False) hbox.pack_start(refresh, True, True, 0) # eject button eject = Button(_("_Eject"), Icons.MEDIA_EJECT, Gtk.IconSize.MENU) self.__eject_button = eject eject.connect('clicked', self.__eject) eject.set_sensitive(False) hbox.pack_start(eject, True, True, 0) # Device info on the right pane self.__header = table = Gtk.Table() table.set_col_spacings(8) self.__device_icon = icon = Gtk.Image() icon.set_size_request(48, 48) table.attach(icon, 0, 1, 0, 2, 0) self.__device_name = label = Gtk.Label() label.set_ellipsize(Pango.EllipsizeMode.END) label.set_alignment(0, 0) table.attach(label, 1, 3, 0, 1) self.__device_space = label = Gtk.Label() label.set_ellipsize(Pango.EllipsizeMode.END) label.set_alignment(0, 0.5) table.attach(label, 1, 2, 1, 2) self.__progress = progress = Gtk.ProgressBar() progress.set_size_request(150, -1) table.attach(progress, 2, 3, 1, 2, xoptions=0, yoptions=0) self.accelerators = Gtk.AccelGroup() key, mod = Gtk.accelerator_parse('F2') self.accelerators.connect(key, mod, 0, self.__rename) self.__statusbar = WaitLoadBar() for child in self.get_children(): child.show_all() def pack(self, songpane): self.__vbox = vbox = Gtk.VBox(spacing=6) vbox.pack_start(self.__header, False, True, 0) vbox.pack_start(songpane, True, True, 0) vbox.pack_start(self.__statusbar, False, True, 0) vbox.show() self.__header.show_all() self.__header.hide() self.__statusbar.show_all() self.__statusbar.hide() self.show() self.__paned = paned = qltk.ConfigRHPaned( "browsers", "mediadevices_pos", 0.4) paned.pack1(self, True, False) paned.pack2(vbox, True, False) return paned def unpack(self, container, songpane): self.__vbox.remove(songpane) self.__paned.remove(self) def Menu(self, songs, library, items): model, iter = self.__view.get_selection().get_selected() if iter: device = model[iter][0] delete = device.delete and self.__delete_songs else: delete = False menu = SongsMenu(library, songs, delete=delete, remove=False, items=items) return menu def activate(self): self.__refresh() def save(self): selection = self.__view.get_selection() model, iter = selection.get_selected() if iter: config.set('browsers', 'media', model[iter][0]['name']) def restore(self): try: name = config.get('browsers', 'media') except config.Error: pass else: for row in self.__devices: if row[0]['name'] == name: break else: return selection = self.__view.get_selection() selection.unselect_all() selection.select_iter(row.iter) def select(self, device): for row in self.__devices: if row[0] == device: break else: return # Force a full refresh try: del self.__cache[device.bid] except KeyError: pass selection = self.__view.get_selection() selection.unselect_all() selection.select_iter(row.iter) def active_filter(self, song): model, iter_ = self.__view.get_selection().get_selected() if iter_ is None: return False device = model[iter_][0] return device.contains(song) def dropped(self, songs): return self.__copy_songs(songs) def __popup_menu(self, view, library): model, iter = view.get_selection().get_selected() device = model[iter][0] if device.is_connected() and not self.__busy: songs = self.__list_songs(device) else: songs = [] menu = SongsMenu(library, songs, playlists=False, devices=False, remove=False) menu.preseparate() props = MenuItem(_("_Properties"), Icons.DOCUMENT_PROPERTIES) connect_obj(props, 'activate', self.__properties, model[iter][0]) props.set_sensitive(not self.__busy) menu.prepend(props) ren = qltk.MenuItem(_("_Rename"), Icons.EDIT) keyval, mod = Gtk.accelerator_parse("F2") ren.add_accelerator( 'activate', self.accelerators, keyval, mod, Gtk.AccelFlags.VISIBLE) def rename(path): self.__render.set_property('editable', True) view.set_cursor(path, view.get_columns()[0], start_editing=True) connect_obj(ren, 'activate', rename, model.get_path(iter)) menu.prepend(ren) menu.preseparate() eject = Gtk.ImageMenuItem(_("_Eject"), use_underline=True) eject.set_image( Gtk.Image.new_from_icon_name(Icons.MEDIA_EJECT, Gtk.IconSize.MENU)) eject.set_sensitive( not self.__busy and device.eject and device.is_connected()) connect_obj(eject, 'activate', self.__eject, None) menu.prepend(eject) refresh = MenuItem(_("_Refresh"), Icons.VIEW_REFRESH) refresh.set_sensitive(device.is_connected()) connect_obj(refresh, 'activate', self.__refresh, True) menu.prepend(refresh) menu.show_all() return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __properties(self, device): DeviceProperties(self, device).run() self.__set_name(device) def __rename(self, group, acceleratable, keyval, modifier): model, iter = self.__view.get_selection().get_selected() if iter: self.__render.set_property('editable', True) self.__view.set_cursor(model.get_path(iter), self.__view.get_columns()[0], start_editing=True) def __edited(self, render, path, newname): self.__devices[path][0]['name'] = newname self.__set_name(self.__devices[path][0]) render.set_property('editable', False) devices.write() def __set_name(self, device): self.__device_name.set_markup( '<span size="x-large"><b>%s</b></span>' % util.escape(device['name'])) def __refresh(self, rescan=False): model, iter = self.__view.get_selection().get_selected() if iter: path = model[iter].path if not rescan and self.__last == path: return self.__last = path device = model[iter][0] self.__device_icon.set_from_icon_name( device.icon, Gtk.IconSize.DIALOG) self.__set_name(device) songs = [] if device.is_connected(): self.__header.show_all() self.__eject_button.set_sensitive(bool(device.eject)) self.__refresh_button.set_sensitive(True) self.__refresh_space(device) try: songs = self.__list_songs(device, rescan) except NotImplementedError: pass else: self.__eject_button.set_sensitive(False) self.__refresh_button.set_sensitive(False) self.__header.hide() self.songs_selected(songs, device.ordered) else: self.__last = None self.songs_selected([], False) def __refresh_space(self, device): try: space, free = device.get_space() except NotImplementedError: self.__device_space.set_text("") self.__progress.hide() else: used = space - free fraction = float(used) / space self.__device_space.set_markup( _("%(used-size)s used, %(free-size)s available") % {"used-size": util.bold(util.format_size(used)), "free-size": util.bold(util.format_size(free))}) self.__progress.set_fraction(fraction) self.__progress.set_text("%.f%%" % round(fraction * 100)) self.__progress.show() def __list_songs(self, device, rescan=False): if rescan or not device.bid in self.__cache: self.__busy = True self.__cache[device.bid] = device.list(self.__statusbar) self.__busy = False return self.__cache[device.bid] def __check_device(self, device, message): if not device.is_connected(): qltk.WarningMessage( self, message, _("%s is not connected.") % util.bold(util.escape(device['name'])) ).run() return False return True def __copy_songs(self, songs): model, iter = self.__view.get_selection().get_selected() if not iter: return False device = model[iter][0] if not self.__check_device(device, _("Unable to copy songs")): return False self.__busy = True wlb = self.__statusbar wlb.setup( len(songs), _("Copying %(song)s") % {'song': '<b>%(song)s</b>'}, {'song': ''}) wlb.show() for song in songs: label = util.escape(song('~artist~title')) if wlb.step(song=label): wlb.hide() break space, free = device.get_space() if free < os.path.getsize(song['~filename']): wlb.hide() qltk.WarningMessage( self, _("Unable to copy song"), _("There is not enough free space for this song.") ).run() break status = device.copy(self, song) if isinstance(status, AudioFile): try: self.__cache[device.bid].append(song) except KeyError: pass self.__refresh_space(device) else: msg = _("%s could not be copied.") % util.bold(label) if type(status) == text_type: msg += "\n\n" + util.escape(status) qltk.WarningMessage(self, _("Unable to copy song"), msg).run() if device.cleanup and not device.cleanup(wlb, 'copy'): pass else: wlb.hide() self.__busy = False return True def __delete_songs(self, songs): model, iter = self.__view.get_selection().get_selected() if not iter: return False device = model[iter][0] if not self.__check_device(device, _("Unable to delete songs")): return False dialog = DeleteDialog.for_songs(self, songs) if dialog.run() != DeleteDialog.RESPONSE_DELETE: return False self.__busy = True wlb = self.__statusbar wlb.setup( len(songs), _("Deleting %(song)s") % {"song": "<b>%(song)s</b>"}, {'song': ''}) wlb.show() for song in songs: label = util.escape(song('~artist~title')) if wlb.step(song=label): wlb.hide() break status = device.delete(self, song) if status is True: try: self.__cache[device.bid].remove(song) except (KeyError, ValueError): pass self.__refresh_space(device) else: msg = _("%s could not be deleted.") % util.bold(label) if type(status) == text_type: msg += "\n\n%s" % status qltk.WarningMessage( self, _("Unable to delete song"), msg).run() if device.cleanup and not device.cleanup(wlb, 'delete'): pass else: wlb.hide() self.__busy = False def __eject(self, button): model, iter = self.__view.get_selection().get_selected() if iter: device = model[iter][0] status = device.eject() if status is not True: msg = _("Ejecting %s failed.") % util.bold(device['name']) if status: msg += "\n\n%s" % status qltk.ErrorMessage(self, _("Unable to eject device"), msg).run() if devices.init(): browsers = [MediaDevices] else: if not util.is_windows() and not util.is_osx(): print_w(_("No device backend, Media Devices browser disabled.")) browsers = [] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/__init__.py������������������������������������������������������0000644�0001750�0001750�00000004714�13112005742�021712� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import util from quodlibet.compat import listfilter from quodlibet.util.importhelper import load_dir_modules from ._base import Browser browsers = [] default = None def init(): """Import all browsers from this package and from the user directory. After this is called the global `browsers` list will contain all classes sorted by priority. Can be called multiple times. """ global browsers, default # ignore double init (for the test suite) if browsers: return this_dir = util.get_module_dir() load_pyc = util.is_windows() or util.is_osx() modules = load_dir_modules(this_dir, package=__package__, load_compiled=load_pyc) for browser in modules: try: browsers.extend(browser.browsers) except AttributeError: util.print_w("%r doesn't contain any browsers." % browser.__name__) def is_browser(Kind): return isinstance(Kind, type) and issubclass(Kind, Browser) browsers = listfilter(is_browser, browsers) if not browsers: raise SystemExit("No browsers found!") browsers.sort(key=lambda Kind: Kind.priority) try: default = get("SearchBar") except ValueError: raise SystemExit("Default browser not found!") def name(browser): """Return the name of the browser""" return browser.keys[0] def get(i): """Return a constructor for a browser, either given by number, a string of the number, or the name. Raises ValueError if the lookup fails. """ try: return browsers[int(i)] except (IndexError, ValueError, TypeError): try: return get(index(i)) except (IndexError, ValueError): raise ValueError("%r not found" % i) def index(name): """Return the index of a browser given its name. Raises ValueError if the lookup fails. """ name = name.lower() for j, browser in enumerate(browsers): keys = [k.lower() for k in browser.keys] if name in keys: return j raise ValueError("%r not found" % name) ����������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/covergrid/�������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021555� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/covergrid/prefs.py�����������������������������������������������0000644�0001750�0001750�00000012503�13112005742�023251� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2007 Joe Wreschnig, Michael Urman, Iñigo Serna # 2009-2010 Steven Robertson # 2012,2013,2016 Nick Boultbee # 2009-2013 Christoph Reiter # 2016 Mice Pápai # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import config from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.browsers._base import FakeDisplayItem, EditDisplayPatternMixin from quodlibet.formats import PEOPLE from quodlibet.qltk import Button, Icons from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.util import format_rating from quodlibet.util.i18n import numeric_phrase from quodlibet.util.dprint import print_d PEOPLE _SOME_PEOPLE = "\n".join([util.tag("artist"), util.tag("performer"), util.tag("composer"), util.tag("arranger"), ]) _EMPTY = _("Songs not in an album") DEFAULT_PATTERN_TEXT = """[b]<album|<album>|%s>[/b]<date| (<date>)> [small]<~discs|<~discs> - ><~tracks> - <~long-length>[/small] <~people>""" % _EMPTY class Preferences(qltk.UniqueWindow, EditDisplayPatternMixin): _DEFAULT_PATTERN = DEFAULT_PATTERN_TEXT _PREVIEW_ITEM = FakeDisplayItem({ "date": "2010-10-31", "~length": util.format_time_display(6319), "~long-length": util.format_time_long(6319), "~tracks": numeric_phrase("%d track", "%d tracks", 5), "~discs": numeric_phrase("%d disc", "%d discs", 2), "~#rating": 0.75, "album": _("An Example Album"), "~people": _SOME_PEOPLE + "..."}) def __init__(self, browser): if self.is_not_unique(): return super(Preferences, self).__init__() self.set_border_width(12) self.set_title(_("Cover Grid Preferences") + " - Quod Libet") self.set_default_size(420, 380) self.set_transient_for(qltk.get_top_parent(browser)) # Do this config-driven setup at instance-time self._PREVIEW_ITEM["~rating"] = format_rating(0.75) self.mag_lock = False box = Gtk.VBox(spacing=6) vbox = Gtk.VBox(spacing=6) cb = ConfigCheckButton( _("Show album _text"), "browsers", "album_text") cb.set_active(config.getboolean("browsers", "album_text")) cb.connect('toggled', lambda s: browser.toggle_text()) vbox.pack_start(cb, False, True, 0) cb2 = ConfigCheckButton( _("Show \"All Albums\" Item"), "browsers", "covergrid_all") cb2.set_active(config.getboolean("browsers", "covergrid_all", False)) cb2.connect('toggled', lambda s: browser.view.get_model().refilter()) vbox.pack_start(cb2, False, True, 0) cb3 = ConfigCheckButton( _("Vertical Split"), "browsers", "covergrid_vertical") cb3.set_active(config.getboolean("browsers", "covergrid_vertical", True)) cb3.connect('toggled', lambda s: browser.toggle_vert()) vbox.pack_start(cb3, False, True, 0) # Redraws the covers only when the user releases the slider def mag_button_press(*_): self.mag_lock = True def mag_button_release(mag, _): self.mag_lock = False mag_changed(mag) def mag_changed(mag): if self.mag_lock: return newmag = mag.get_value() oldmag = config.getfloat("browsers", "covergrid_magnification", 3.) if newmag == oldmag: print_d("Covergrid magnification haven't changed: {0}" .format(newmag)) return print_d('Covergrid magnification update from {0} to {1}' .format(oldmag, newmag)) config.set("browsers", "covergrid_magnification", mag.get_value()) browser.update_mag() mag_scale = Gtk.HScale( adjustment=Gtk.Adjustment.new(config.getfloat("browsers", "covergrid_magnification", 3), 0., 10., .5, .5, 0)) mag_scale.set_tooltip_text(_("Cover Magnification")) l = Gtk.Label(label=_("Cover Magnification")) mag_scale.set_value_pos(Gtk.PositionType.RIGHT) mag_scale.connect('button-press-event', mag_button_press) mag_scale.connect('button-release-event', mag_button_release) mag_scale.connect('value-changed', mag_changed) vbox.pack_start(l, False, True, 0) vbox.pack_start(mag_scale, False, True, 0) f = qltk.Frame(_("Options"), child=vbox) box.pack_start(f, False, True, 12) display_frame = self.edit_display_pane(browser, _("Album Display")) box.pack_start(display_frame, True, True, 0) main_box = Gtk.VBox(spacing=12) close = Button(_("_Close"), Icons.WINDOW_CLOSE) close.connect('clicked', lambda *x: self.destroy()) b = Gtk.HButtonBox() b.set_layout(Gtk.ButtonBoxStyle.END) b.pack_start(close, True, True, 0) main_box.pack_start(box, True, True, 0) self.use_header_bar() if not self.has_close_button(): main_box.pack_start(b, False, True, 0) self.add(main_box) close.grab_focus() self.show_all() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/covergrid/__init__.py��������������������������������������������0000644�0001750�0001750�00000000570�13112005742�023672� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import from .main import CoverGrid, AlbumTagCompletion AlbumTagCompletion browsers = [CoverGrid] ����������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/covergrid/main.py������������������������������������������������0000644�0001750�0001750�00000056332�13112005742�023066� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2007 Joe Wreschnig, Michael Urman, Iñigo Serna # 2009-2010 Steven Robertson # 2012,2013,2016 Nick Boultbee # 2009-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import import os from gi.repository import Gtk, Pango, Gdk, Gio from .prefs import Preferences, DEFAULT_PATTERN_TEXT from quodlibet.browsers.albums.models import (AlbumModel, AlbumFilterModel, AlbumSortModel) from quodlibet.browsers.albums.main import (get_cover_size, AlbumTagCompletion, PreferencesButton, VisibleUpdate) import quodlibet from quodlibet import app from quodlibet import ngettext from quodlibet import config from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.browsers import Browser from quodlibet.browsers._base import DisplayPatternMixin from quodlibet.query import Query from quodlibet.qltk.information import Information from quodlibet.qltk.properties import SongProperties from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.x import MenuItem, Align, ScrolledWindow, RadioMenuItem from quodlibet.qltk.x import SymbolicIconImage from quodlibet.qltk.searchbar import SearchBarBox from quodlibet.qltk.menubutton import MenuButton from quodlibet.qltk import Icons from quodlibet.util import connect_destroy from quodlibet.util.library import background_filter from quodlibet.util import connect_obj from quodlibet.qltk.cover import get_no_cover_pixbuf from quodlibet.qltk.image import add_border_widget, get_surface_for_pixbuf from quodlibet.qltk import popup_menu_at_widget class PreferencesButton(PreferencesButton): def __init__(self, browser, model): Gtk.HBox.__init__(self) sort_orders = [ (_("_Title"), self.__compare_title), (_("_Artist"), self.__compare_artist), (_("_Date"), self.__compare_date), (_("_Genre"), self.__compare_genre), (_("_Rating"), self.__compare_rating), ] menu = Gtk.Menu() sort_item = Gtk.MenuItem( label=_(u"Sort _by…"), use_underline=True) sort_menu = Gtk.Menu() active = config.getint('browsers', 'album_sort', 1) item = None for i, (label, func) in enumerate(sort_orders): item = RadioMenuItem(group=item, label=label, use_underline=True) model.set_sort_func(100 + i, func) if i == active: model.set_sort_column_id(100 + i, Gtk.SortType.ASCENDING) item.set_active(True) item.connect("toggled", util.DeferredSignal(self.__sort_toggled_cb), model, i) sort_menu.append(item) sort_item.set_submenu(sort_menu) menu.append(sort_item) pref_item = MenuItem(_("_Preferences"), Icons.PREFERENCES_SYSTEM) menu.append(pref_item) connect_obj(pref_item, "activate", Preferences, browser) menu.show_all() button = MenuButton( SymbolicIconImage(Icons.EMBLEM_SYSTEM, Gtk.IconSize.MENU), arrow=True) button.set_menu(menu) self.pack_start(button, True, True, 0) class IconView(Gtk.IconView): # XXX: disable height for width etc. Speeds things up and doesn't seem # to break anyhting in a scrolled window def do_get_preferred_width_for_height(self, height): return (1, 1) def do_get_preferred_width(self): return (1, 1) def do_get_preferred_height(self): return (1, 1) def do_get_preferred_height_for_width(self, width): return (1, 1) class CoverGrid(Browser, util.InstanceTracker, VisibleUpdate, DisplayPatternMixin): __gsignals__ = Browser.__gsignals__ __model = None __last_render = None __last_render_surface = None _PATTERN_FN = os.path.join(quodlibet.get_user_dir(), "album_pattern") _DEFAULT_PATTERN_TEXT = DEFAULT_PATTERN_TEXT name = _("Cover Grid") accelerated_name = _("_Cover Grid") keys = ["CoverGrid"] priority = 4 def pack(self, songpane): container = self.songcontainer container.pack1(self, True, False) container.pack2(songpane, True, False) return container def unpack(self, container, songpane): container.remove(songpane) container.remove(self) @classmethod def init(klass, library): super(CoverGrid, klass).load_pattern() @classmethod def _destroy_model(klass): klass.__model.destroy() klass.__model = None @classmethod def toggle_text(klass): on = config.getboolean("browsers", "album_text", True) for covergrid in klass.instances(): covergrid.__text_cells.set_visible(on) covergrid.view.queue_resize() @classmethod def toggle_vert(klass): vert = config.getboolean("browsers", "covergrid_vertical", True) for covergrid in klass.instances(): covergrid.songcontainer.set_orientation( Gtk.Orientation.VERTICAL if vert else Gtk.Orientation.HORIZONTAL) @classmethod def update_mag(klass): mag = config.getfloat("browsers", "covergrid_magnification", 3.) for covergrid in klass.instances(): covergrid.__cover.set_property('width', get_cover_size() * mag + 8) covergrid.__cover.set_property('height', get_cover_size() * mag + 8) covergrid.view.set_item_width(get_cover_size() * mag + 8) covergrid.view.queue_resize() covergrid.redraw() def redraw(self): model = self.__model for iter_, item in model.iterrows(): album = item.album if album is not None: item.scanned = False model.row_changed(model.get_path(iter_), iter_) @classmethod def _init_model(klass, library): klass.__model = AlbumModel(library) klass.__library = library @classmethod def _refresh_albums(klass, albums): """We signal all other open album views that we changed something (Only needed for the cover atm) so they redraw as well.""" if klass.__library: klass.__library.albums.refresh(albums) @util.cached_property def _no_cover(self): """Returns a cairo surface representing a missing cover""" mag = config.getfloat("browsers", "covergrid_magnification", 3.) cover_size = get_cover_size() scale_factor = self.get_scale_factor() * mag pb = get_no_cover_pixbuf(cover_size, cover_size, scale_factor) return get_surface_for_pixbuf(self, pb) def __init__(self, library): Browser.__init__(self, spacing=6) self.set_orientation(Gtk.Orientation.VERTICAL) self.songcontainer = qltk.paned.ConfigRVPaned( "browsers", "covergrid_pos", 0.4) if not config.getboolean("browsers", "covergrid_vertical", True): self.songcontainer.set_orientation(Gtk.Orientation.HORIZONTAL) self._register_instance() if self.__model is None: self._init_model(library) self._cover_cancel = Gio.Cancellable.new() self.scrollwin = sw = ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) model_sort = AlbumSortModel(model=self.__model) model_filter = AlbumFilterModel(child_model=model_sort) self.view = view = IconView(model_filter) #view.set_item_width(get_cover_size() + 12) self.view.set_row_spacing(config.getint("browsers", "row_spacing", 6)) self.view.set_column_spacing(config.getint("browsers", "column_spacing", 6)) self.view.set_item_padding(config.getint("browsers", "item_padding", 6)) self.view.set_has_tooltip(True) self.view.connect("query-tooltip", self._show_tooltip) self.__bg_filter = background_filter() self.__filter = None model_filter.set_visible_func(self.__parse_query) mag = config.getfloat("browsers", "covergrid_magnification", 3.) self.view.set_item_width(get_cover_size() * mag + 8) self.__cover = render = Gtk.CellRendererPixbuf() render.set_property('width', get_cover_size() * mag + 8) render.set_property('height', get_cover_size() * mag + 8) view.pack_start(render, False) def cell_data_pb(view, cell, model, iter_, no_cover): item = model.get_value(iter_) if item.album is None: surface = None elif item.cover: pixbuf = item.cover pixbuf = add_border_widget(pixbuf, self.view) surface = get_surface_for_pixbuf(self, pixbuf) # don't cache, too much state has an effect on the result self.__last_render_surface = None else: surface = no_cover if self.__last_render_surface == surface: return self.__last_render_surface = surface cell.set_property("surface", surface) view.set_cell_data_func(render, cell_data_pb, self._no_cover) self.__text_cells = render = Gtk.CellRendererText() render.set_visible(config.getboolean("browsers", "album_text", True)) render.set_property('alignment', Pango.Alignment.CENTER) render.set_property('xalign', 0.5) render.set_property('ellipsize', Pango.EllipsizeMode.END) view.pack_start(render, False) def cell_data(view, cell, model, iter_, data): album = model.get_album(iter_) if album is None: text = "<b>%s</b>" % _("All Albums") text += "\n" + ngettext("%d album", "%d albums", len(model) - 1) % (len(model) - 1) markup = text else: markup = self.display_pattern % album if self.__last_render == markup: return self.__last_render = markup cell.markup = markup cell.set_property('markup', markup) view.set_cell_data_func(render, cell_data, None) view.set_selection_mode(Gtk.SelectionMode.MULTIPLE) sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.add(view) view.connect('item-activated', self.__play_selection, None) self.__sig = connect_destroy( view, 'selection-changed', util.DeferredSignal(self.__update_songs, owner=self)) targets = [("text/x-quodlibet-songs", Gtk.TargetFlags.SAME_APP, 1), ("text/uri-list", 0, 2)] targets = [Gtk.TargetEntry.new(*t) for t in targets] view.drag_source_set( Gdk.ModifierType.BUTTON1_MASK, targets, Gdk.DragAction.COPY) view.connect("drag-data-get", self.__drag_data_get) # NOT WORKING connect_obj(view, 'button-press-event', self.__rightclick, view, library) connect_obj(view, 'popup-menu', self.__popup, view, library) self.accelerators = Gtk.AccelGroup() search = SearchBarBox(completion=AlbumTagCompletion(), accel_group=self.accelerators) search.connect('query-changed', self.__update_filter) connect_obj(search, 'focus-out', lambda w: w.grab_focus(), view) self.__search = search prefs = PreferencesButton(self, model_sort) search.pack_start(prefs, False, True, 0) self.pack_start(Align(search, left=6, top=6), False, True, 0) self.pack_start(sw, True, True, 0) self.connect("destroy", self.__destroy) self.enable_row_update(view, sw, self.view) self.connect('key-press-event', self.__key_pressed, library.librarian) if app.cover_manager: connect_destroy( app.cover_manager, "cover-changed", self._cover_changed) self.show_all() def _cover_changed(self, manager, songs): model = self.__model songs = set(songs) for iter_, item in model.iterrows(): album = item.album if album is not None and songs & album.songs: item.scanned = False model.row_changed(model.get_path(iter_), iter_) def __key_pressed(self, widget, event, librarian): if qltk.is_accel(event, "<Primary>I"): songs = self.__get_selected_songs() if songs: window = Information(librarian, songs, self) window.show() return True elif qltk.is_accel(event, "<alt>Return"): songs = self.__get_selected_songs() if songs: window = SongProperties(librarian, songs, self) window.show() return True return False def _row_needs_update(self, model, iter_): item = model.get_value(iter_) return item.album is not None and not item.scanned def _update_row(self, filter_model, iter_): sort_model = filter_model.get_model() model = sort_model.get_model() iter_ = filter_model.convert_iter_to_child_iter(iter_) iter_ = sort_model.convert_iter_to_child_iter(iter_) tref = Gtk.TreeRowReference.new(model, model.get_path(iter_)) mag = config.getfloat("browsers", "covergrid_magnification", 3.) def callback(): path = tref.get_path() if path is not None: model.row_changed(path, model.get_iter(path)) # XXX: icon view seems to ignore row_changed signals for pixbufs.. self.queue_resize() item = model.get_value(iter_) scale_factor = self.get_scale_factor() * mag item.scan_cover(scale_factor=scale_factor, callback=callback, cancel=self._cover_cancel) def __destroy(self, browser): self._cover_cancel.cancel() self.disable_row_update() self.view.set_model(None) klass = type(browser) if not klass.instances(): klass._destroy_model() def __update_filter(self, entry, text, scroll_up=True, restore=False): model = self.view.get_model() self.__filter = None if not Query.match_all(text): self.__filter = Query(text, star=["~people", "album"]).search self.__bg_filter = background_filter() self.__inhibit() # If we're hiding "All Albums", then there will always # be something to filter ­— probably there's a better # way to implement this if (not restore or self.__filter or self.__bg_filter) or (not config.getboolean("browsers", "covergrid_all", False)): model.refilter() self.__uninhibit() def __parse_query(self, model, iter_, data): f, b = self.__filter, self.__bg_filter album = model.get_album(iter_) if f is None and b is None and album is not None: return True else: if album is None: return config.getboolean("browsers", "covergrid_all", False) elif b is None: return f(album) elif f is None: return b(album) else: return b(album) and f(album) def __search_func(self, model, column, key, iter_, data): album = model.get_album(iter_) if album is None: return config.getboolean("browsers", "covergrid_all", False) key = util.gdecode(key).lower() title = album.title.lower() if key in title: return False if config.getboolean("browsers", "album_substrings"): people = (p.lower() for p in album.list("~people")) for person in people: if key in person: return False return True def __rightclick(self, view, event, library): x = int(event.x) y = int(event.y) current_path = view.get_path_at_pos(x, y) if event.button == Gdk.BUTTON_SECONDARY and current_path: if not view.path_is_selected(current_path): view.unselect_all() view.select_path(current_path) self.__popup(view, library) def __popup(self, view, library): albums = self.__get_selected_albums() songs = self.__get_songs_from_albums(albums) items = [] num = len(albums) button = MenuItem( ngettext("Reload album _cover", "Reload album _covers", num), Icons.VIEW_REFRESH) button.connect('activate', self.__refresh_album, view) items.append(button) menu = SongsMenu(library, songs, items=[items]) menu.show_all() popup_menu_at_widget(menu, view, Gdk.BUTTON_SECONDARY, Gtk.get_current_event_time()) def _show_tooltip(self, widget, x, y, keyboard_tip, tooltip): w = self.scrollwin.get_hadjustment().get_value() z = self.scrollwin.get_vadjustment().get_value() path = widget.get_path_at_pos(int(x + w), int(y + z)) if path is None: return False model = widget.get_model() iter = model.get_iter(path) album = model.get_album(iter) if album is None: text = "<b>%s</b>" % _("All Albums") text += "\n" + ngettext("%d album", "%d albums", len(model) - 1) % (len(model) - 1) markup = text else: markup = self.display_pattern % album tooltip.set_markup(markup) return True def __refresh_album(self, menuitem, view): items = self.__get_selected_items() for item in items: item.scanned = False model = self.view.get_model() for iter_, item in model.iterrows(): if item in items: model.row_changed(model.get_path(iter_), iter_) def __get_selected_items(self): model = self.view.get_model() paths = self.view.get_selected_items() return model.get_items(paths) def __get_selected_albums(self): model = self.view.get_model() paths = self.view.get_selected_items() return model.get_albums(paths) def __get_songs_from_albums(self, albums, sort=True): # Sort first by how the albums appear in the model itself, # then within the album using the default order. songs = [] if sort: for album in albums: songs.extend(sorted(album.songs, key=lambda s: s.sort_key)) else: for album in albums: songs.extend(album.songs) return songs def __get_selected_songs(self, sort=True): albums = self.__get_selected_albums() return self.__get_songs_from_albums(albums, sort) def __drag_data_get(self, view, ctx, sel, tid, etime): songs = self.__get_selected_songs() if tid == 1: qltk.selection_set_songs(sel, songs) else: sel.set_uris([song("~uri") for song in songs]) def __play_selection(self, view, indices, col): self.songs_activated() def active_filter(self, song): for album in self.__get_selected_albums(): if song in album.songs: return True return False def can_filter_text(self): return True def filter_text(self, text): self.__search.set_text(text) if Query.is_parsable(text): self.__update_filter(self.__search, text) # self.__inhibit() #self.view.set_cursor((0,), None, False) # self.__uninhibit() self.activate() def get_filter_text(self): return self.__search.get_text() def can_filter(self, key): # Numerics are different for collections, and although title works, # it's not of much use here. if key is not None and (key.startswith("~#") or key == "title"): return False return super(CoverGrid, self).can_filter(key) def can_filter_albums(self): return True def list_albums(self): model = self.view.get_model() return [row[0].album.key for row in model if row[0].album] def select_by_func(self, func, scroll=True, one=False): model = self.view.get_model() if not model: return False selection = self.view.get_selected_items() first = True for row in model: if func(row): if not first: selection.select_path(row.path) continue self.view.unselect_all() self.view.select_path(row.path) self.view.set_cursor(row.path, None, False) if scroll: self.view.scroll_to_path(row.path, True, 0.5, 0.5) first = False if one: break return not first def filter_albums(self, values): self.__inhibit() changed = self.select_by_func( lambda r: r[0].album and r[0].album.key in values) self.__uninhibit() if changed: self.activate() def unfilter(self): self.filter_text("") #self.view.set_cursor((0,), None, False) def activate(self): self.view.emit('selection-changed') def __inhibit(self): self.view.handler_block(self.__sig) def __uninhibit(self): self.view.handler_unblock(self.__sig) def restore(self): text = config.gettext("browsers", "query_text") entry = self.__search entry.set_text(text) # update_filter expects a parsable query if Query.is_parsable(text): self.__update_filter(entry, text, scroll_up=False, restore=True) keys = config.gettext("browsers", "covergrid", "").split("\n") # FIXME: If albums is "" then it could be either all albums or # no albums. If it's "" and some other stuff, assume no albums, # otherwise all albums. self.__inhibit() if keys != [""]: def select_fun(row): album = row[0].album if not album: # all return False return album.str_key in keys self.select_by_func(select_fun) self.__uninhibit() def scroll(self, song): album_key = song.album_key select = lambda r: r[0].album and r[0].album.key == album_key self.select_by_func(select, one=True) def __get_config_string(self): model = self.view.get_model() paths = self.view.get_selected_items() # All is selected if model.contains_all(paths): return "" # All selected albums albums = model.get_albums(paths) confval = "\n".join((a.str_key for a in albums)) # ConfigParser strips a trailing \n so we move it to the front if confval and confval[-1] == "\n": confval = "\n" + confval[:-1] return confval def save(self): conf = self.__get_config_string() config.settext("browsers", "covergrid", conf) text = self.__search.get_text() config.settext("browsers", "query_text", text) def __update_songs(self, selection): songs = self.__get_selected_songs(sort=False) self.songs_selected(songs) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/paned/�����������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020660� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/paned/prefs.py���������������������������������������������������0000644�0001750�0001750�00000017345�13112005742�022365� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # 2015 Nick Boultbee # 2017 Fredrik Strupe # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import util from quodlibet import qltk from quodlibet import _ from quodlibet.qltk.views import BaseView from quodlibet.qltk.tagscombobox import TagsComboBoxEntry from quodlibet.qltk.x import SymbolicIconImage, MenuItem, Button from quodlibet.qltk import Icons from quodlibet.qltk.menubutton import MenuButton from quodlibet.qltk.ccb import ConfigCheckMenuItem, ConfigCheckButton from quodlibet.util import connect_obj, escape from quodlibet.compat import iteritems, iterkeys from .util import get_headers, save_headers class PatternEditor(Gtk.VBox): PRESETS = [ ["genre", "~people", "album"], ["~people", "album"], ] COMPLETION = ["genre", "grouping", "~people", "artist", "album", "~year", "~rating"] _COMPLEX_PATTERN_EXAMPLE = "<~year|[b]<~year>[/b]|[i]unknown year[/i]>" def __init__(self): super(PatternEditor, self).__init__(spacing=6) self.__headers = headers = {} buttons = [] group = None for tags in self.PRESETS: tied = "~" + "~".join(tags) group = Gtk.RadioButton(group=group, label="_" + util.tag(tied), use_underline=True) headers[group] = tags buttons.append(group) group = Gtk.RadioButton(group=group, label=_("_Custom"), use_underline=True) self.__custom = group headers[group] = [] buttons.append(group) button_box = Gtk.HBox(spacing=6) self.__model = model = Gtk.ListStore(str) radio_box = Gtk.VBox(spacing=6) for button in buttons: radio_box.pack_start(button, False, True, 0) button.connect('toggled', self.__toggled, button_box, model) self.pack_start(radio_box, False, True, 0) tooltip = _("Tag pattern with optional markup " "e.g. <tt>composer</tt> or\n<tt>%s</tt>" % escape(self._COMPLEX_PATTERN_EXAMPLE)) cb = TagsComboBoxEntry(self.COMPLETION, tooltip_markup=tooltip) view = BaseView(model=model) view.set_reorderable(True) view.set_headers_visible(False) ctrl_box = Gtk.VBox(spacing=6) add = Button(_("_Add"), Icons.LIST_ADD) ctrl_box.pack_start(add, False, True, 0) add.connect('clicked', self.__add, model, cb) remove = Button(_("_Remove"), Icons.LIST_REMOVE) ctrl_box.pack_start(remove, False, True, 0) remove.connect('clicked', self.__remove, view) selection = view.get_selection() selection.connect('changed', self.__selection_changed, remove) selection.emit('changed') sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(view) edit_box = Gtk.VBox(spacing=6) edit_box.pack_start(cb, False, True, 0) edit_box.pack_start(sw, True, True, 0) button_box.pack_start(edit_box, True, True, 0) button_box.pack_start(ctrl_box, False, True, 0) self.pack_start(button_box, True, True, 0) render = Gtk.CellRendererText() render.set_property("editable", True) def edited_cb(render, path, text, model): model[path][0] = text render.connect("edited", edited_cb, model) column = Gtk.TreeViewColumn(None, render, text=0) view.append_column(column) @property def headers(self): for button in iterkeys(self.__headers): if button.get_active(): if button == self.__custom: model_headers = [row[0] for row in self.__model] self.__headers[self.__custom] = model_headers return self.__headers[button] @headers.setter def headers(self, new_headers): for button, headers in iteritems(self.__headers): if headers == new_headers: button.set_active(True) button.emit("toggled") break else: self.__headers[self.__custom] = new_headers self.__custom.set_active(True) def __selection_changed(self, selection, remove): remove.set_sensitive(bool(selection.get_selected()[1])) def __add(self, button, model, cb): if cb.tag: model.append(row=[cb.tag]) def __remove(self, button, view): view.remove_selection() def __toggled(self, button, edit_widget, model): tags = self.__headers[button] if tags: model.clear() for h in tags: model.append(row=[h]) edit_widget.set_sensitive( button.get_active() and button is self.__custom) class PreferencesButton(Gtk.HBox): def __init__(self, browser): super(PreferencesButton, self).__init__() self._menu = menu = Gtk.Menu() wide_mode = ConfigCheckMenuItem( _("_Wide Mode"), "browsers", "pane_wide_mode", True) wide_mode.connect("toggled", self.__wide_mode_changed, browser) menu.append(wide_mode) pref_item = MenuItem(_("_Preferences"), Icons.PREFERENCES_SYSTEM) def preferences_cb(menu_item): window = Preferences(browser) window.show() pref_item.connect("activate", preferences_cb) menu.append(pref_item) menu.show_all() button = MenuButton( SymbolicIconImage(Icons.EMBLEM_SYSTEM, Gtk.IconSize.MENU), arrow=True) button.set_menu(menu) button.show() self.pack_start(button, True, True, 0) def __wide_mode_changed(self, menu_item, browser): browser.set_all_wide_mode(menu_item.get_active()) class Preferences(qltk.UniqueWindow): def __init__(self, browser): if self.is_not_unique(): return super(Preferences, self).__init__() self.set_transient_for(qltk.get_top_parent(browser)) self.set_default_size(350, 300) self.set_border_width(12) self.set_title(_("Paned Browser Preferences")) vbox = Gtk.VBox(spacing=12) editor = PatternEditor() editor.headers = get_headers() equal_width = ConfigCheckButton(_("Equal pane width"), "browsers", "equal_pane_width", populate=True) apply_ = Button(_("_Apply")) connect_obj(apply_, "clicked", self.__apply, editor, browser, False, equal_width) cancel = Button(_("_Cancel")) cancel.connect("clicked", lambda x: self.destroy()) box = Gtk.HButtonBox() box.set_spacing(6) box.set_layout(Gtk.ButtonBoxStyle.EDGE) box.pack_start(equal_width, True, True, 0) box.pack_start(apply_, False, False, 0) self.use_header_bar() if not self.has_close_button(): box.pack_start(cancel, True, True, 0) vbox.pack_start(editor, True, True, 0) vbox.pack_start(box, False, True, 0) self.add(vbox) cancel.grab_focus() self.get_child().show_all() def __apply(self, editor, browser, close, equal_width): if editor.headers != get_headers(): save_headers(editor.headers) browser.set_all_panes() if equal_width.get_active(): browser.make_pane_widths_equal() if close: self.destroy() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/paned/util.py����������������������������������������������������0000644�0001750�0001750�00000005626�13112005742�022222� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import re from quodlibet import config from quodlibet import util from quodlibet.compat import text_type from quodlibet.pattern import XMLFromMarkupPattern as XMLFromPattern class PaneConfig(object): """Row pattern format: 'categorize_pattern:display_pattern' * display_pattern is optional (fallback: ~#tracks) * patterns, tied and normal tags. * display patterns can have function prefixes for numerical tags. * ':' has to be escaped ('\:') TODO: sort pattern, filter query """ def __init__(self, row_pattern): parts = re.split(r"(?<!\\):", row_pattern) parts = list(map(lambda p: p.replace(r"\:", ":"), parts)) is_numeric = lambda s: s[:2] == "~#" and "~" not in s[2:] is_pattern = lambda s: '<' in s f_round = lambda s: (isinstance(s, float) and "%.2f" % s) or s disp = (len(parts) >= 2 and parts[1]) or r"[i](<~#tracks>)[/i]" cat = parts[0] if is_pattern(cat): title = util.pattern(cat, esc=True, markup=True) try: pc = XMLFromPattern(cat) except ValueError: pc = XMLFromPattern("") tags = pc.tags format = pc.format_list has_markup = True else: title = util.tag(cat) tags = util.tagsplit(cat) has_markup = False if is_numeric(cat): def format(song): v = text_type(f_round(song(cat))) return [(v, v)] else: format = lambda song: song.list_separate(cat) if is_pattern(disp): try: pd = XMLFromPattern(disp) except ValueError: pd = XMLFromPattern("") format_display = pd.format else: if is_numeric(disp): format_display = lambda coll: text_type(f_round(coll(disp))) else: format_display = lambda coll: util.escape(coll.comma(disp)) self.title = title self.tags = set(tags) self.format = format self.format_display = format_display self.has_markup = has_markup def __repr__(self): return "<%s title=%r tags=%r>" % ( self.__class__.__name__, self.title, self.tags) def get_headers(): # QL <= 2.1 saved the headers tab-separated, but had a space-separated # default value, so check for that. headers = config.get("browsers", "panes") if headers == "~people album": return headers.split() else: return headers.split("\t") def save_headers(headers): headers = "\t".join(headers) config.set("browsers", "panes", headers) ����������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/paned/__init__.py������������������������������������������������0000644�0001750�0001750�00000000457�13112005742�023001� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from .main import PanedBrowser browsers = [PanedBrowser] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/paned/models.py��������������������������������������������������0000644�0001750�0001750�00000026116�13112005742�022525� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import re from quodlibet import _ from quodlibet import util from quodlibet.qltk.models import ObjectStore from quodlibet.util.collection import Collection from quodlibet.compat import iteritems, listfilter class BaseEntry(Collection): def __init__(self, key=None, songs=None): super(BaseEntry, self).__init__() self.songs = set(songs or []) self.key = key # not used for sorting! self.sort = tuple() def all_have(self, tag, value): """Check if all songs have tag `tag` set to `value`""" if tag[:2] == "~#" and "~" not in tag[2:]: for song in self.songs: if song(tag) != value: return False else: for song in self.songs: if value not in song.list(tag): return False return True def get_count_text(self, config): raise NotImplementedError def get_text(self, config): """Returns (is_markup, text)""" raise NotImplementedError def contains_text(self, text): """Used for the inline search""" raise NotImplementedError class SongsEntry(BaseEntry): def __init__(self, key, sort, songs=None): super(SongsEntry, self).__init__(key, songs) self.sort = sort # value used for sorting def get_count_text(self, config): return config.format_display(self) def get_text(self, config): if config.has_markup: return True, self.key else: return False, self.key def contains_text(self, text): return text.lower() in self.key.lower() def contains_song(self, song): return song in self.songs def __repr__(self): return "<%s key=%r songs=%d>" % ( type(self).__name__, self.key, len(self.songs)) class UnknownEntry(SongsEntry): def __init__(self, songs=None): super(UnknownEntry, self).__init__("", tuple(), songs) def get_text(self, config): return True, "<b>%s</b>" % _("Unknown") def contains_text(self, text): return False def __repr__(self): return "<%s songs=%d>" % (type(self).__name__, len(self.songs)) class AllEntry(BaseEntry): def __init__(self): super(AllEntry, self).__init__() def get_count_text(self, config): return u"" def get_text(self, config): return True, "<b>%s</b>" % _("All") def contains_text(self, text): return False def contains_song(self, song): return False def __repr__(self): return "<%s>" % (type(self).__name__,) class PaneModel(ObjectStore): def __init__(self, pattern_config): super(PaneModel, self).__init__() self.__sort_cache = {} # text to sort text cache self.__key_cache = {} # song to key cache self.config = pattern_config def get_format_keys(self, song): try: return self.__key_cache[song] except KeyError: # We filter out empty values, so Unknown can be "" self.__key_cache[song] = listfilter( lambda v: v[0], self.config.format(song)) return self.__key_cache[song] def __human_sort_key(self, text, reg=re.compile('<.*?>')): try: return self.__sort_cache[text], text except KeyError: # remove the markup so it doesn't affect the sort order if self.config.has_markup: text_stripped = reg.sub("", text) else: text_stripped = text self.__sort_cache[text] = util.human_sort_key(text_stripped) return self.__sort_cache[text], text def get_songs(self, paths): """Get all songs for the given paths (from a selection e.g.)""" s = set() if not paths: return s first_path = paths[0] if isinstance(self[first_path][0], AllEntry): for entry in self.itervalues(): s.update(entry.songs) else: for path in paths: s.update(self[path][0].songs) return s def get_keys(self, paths): return {self[p][0].key for p in paths} def remove_songs(self, songs, remove_if_empty): """Remove all songs from the entries. If remove_if_empty == True, entries with no songs will be removed. """ songs = set(songs) for song in songs: if song in self.__key_cache: del self.__key_cache[song] to_remove = [] for iter_, entry in self.iterrows(): if isinstance(entry, AllEntry): continue entry.songs -= songs entry.finalize() self.row_changed(self.get_path(iter_), iter_) if not entry.songs: to_remove.append(iter_) if not remove_if_empty: return # remove from cache and the model for iter_ in to_remove: try: key = self.get_value(iter_).key del(self.__sort_cache[key]) except KeyError: pass self.remove(iter_) if len(self) == 1 and isinstance(self[0][0], AllEntry): # only All is left.. clear everything self.clear() elif to_remove and len(self) == 2: # Only one entry + All -> remove All self.remove(self.get_iter_first()) def add_songs(self, songs): """Add new songs to the list, creating new rows""" collection = {} unknown = UnknownEntry() human_sort = self.__human_sort_key for song in songs: items = self.get_format_keys(song) if not items: unknown.songs.add(song) for key, sort in items: if key in collection: if sort and not collection[key][2]: # first actual sort key hsort = human_sort(sort) collection[key][0].sort = hsort collection[key] = (collection[key][0], hsort, True) collection[key][0].songs.add(song) else: # first key sets up sorting hsort = human_sort(sort) entry = SongsEntry(key, hsort) collection[key] = (entry, hsort, bool(sort)) entry.songs.add(song) items = sorted(iteritems(collection), key=lambda s: s[1][1], reverse=True) # fast path if not len(self): if unknown.songs: self.insert(0, [unknown]) entries = [] for key, (val, sort_key, srtp) in items: entries.append(val) self.insert_many(0, reversed(entries)) if len(self) > 1: self.insert(0, [AllEntry()]) return # insert all new songs key = None val = None sort_key = None for iter_, entry in self.iterrows(): if not isinstance(entry, SongsEntry): continue if key is None: if not items: break key, (val, sort_key, srtp) = items.pop(-1) if key == entry.key: # Display strings the same entry.songs |= val.songs entry.finalize() self.row_changed(self.get_path(iter_), iter_) key = None elif sort_key < entry.sort: self.insert_before(iter_, row=[val]) key = None # the last one failed, add it again if key: items.append((key, (val, sort_key, srtp))) # insert the left over songs if items: entries = [] for key, (val, srt, srtp) in items: entries.append(val) if isinstance(self[-1][0], UnknownEntry): self.insert_many(len(self) - 1, entries) else: self.append_many(entries) # check if All needs to be inserted if len(self) > 1 and not isinstance(self[0][0], AllEntry): self.insert(0, [AllEntry()]) # check if Unknown needs to be inserted or updated if unknown.songs: last_row = self[-1] entry = last_row[0] if isinstance(entry, UnknownEntry): entry.songs |= unknown.songs entry.finalize() self.row_changed(last_row.path, last_row.iter) else: self.append(row=[unknown]) def matches(self, paths, song): """If the song is included in the selection defined by the paths. paths has to be sorted. """ if not paths: return False # All included if isinstance(self[paths[0]][0], AllEntry): return True keys = self.get_format_keys(song) # empty key -> unknown if not keys and isinstance(self[paths[-1]][0], UnknownEntry): return True for path in paths: entry = self.get_value(self.get_iter(path)) for key in keys: if entry.key == (key[0] if isinstance(key, tuple) else key): return True return False def list(self, tag): tags = self.config.tags # fast path, use the keys since they are unique and only depend # on the tag in question. if tag in tags and len(tags) == 1: return {r.key for r in self.itervalues() if not isinstance(r, AllEntry)} # For patterns/tied tags we have to make sure that filtering for # that key will return only songs that all have the specified value values = set() for entry in self.itervalues(): if isinstance(entry, AllEntry): continue if not entry.key: # add unknown values.add("") else: for value in entry.list(tag): if value not in values and entry.all_have(tag, value): values.add(value) return values def get_keys_by_tag(self, tag, values): """List of keys for entries where all songs contain a tag with at least one value from values. """ tags = self.config.tags # Like with self.list we can select all matching keys if the tag # is our only tag if len(tags) == 1 and tag in tags: return [e.key for e in self.itervalues() if e.key in values] keys = [] for entry in self.itervalues(): if isinstance(entry, SongsEntry): for value in values: if entry.all_have(tag, value): keys.append(entry.key) break # add unknown if "" in values and isinstance(self[-1][0], UnknownEntry): keys.append("") return keys ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/paned/main.py����������������������������������������������������0000644�0001750�0001750�00000023572�13112005742�022171� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2008 Joe Wreschnig, Michael Urman, Iñigo Serna # 2009,2010 Steven Robertson # 2009-2013 Christoph Reiter # 2011,2013 Nick Boultbee # 2017 Fredrik Strupe # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GLib from quodlibet import config from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.browsers import Browser from quodlibet.formats import PEOPLE from quodlibet.query import Query from quodlibet.qltk.songlist import SongList from quodlibet.qltk.completion import LibraryTagCompletion from quodlibet.qltk.searchbar import SearchBarBox from quodlibet.qltk.x import ScrolledWindow, Align from quodlibet.util.library import background_filter from quodlibet.util import connect_destroy from quodlibet.qltk.paned import ConfigMultiRHPaned from .prefs import PreferencesButton from .util import get_headers from .pane import Pane class PanedBrowser(Browser, util.InstanceTracker): """A Browser enabling "drilling down" of tracks by successive selections in multiple tag pattern panes (e.g. Genre / People / Album ). It presents available values (and track counts) for each pane's tag """ name = _("Paned Browser") accelerated_name = _("_Paned Browser") keys = ["Paned", "PanedBrowser"] priority = 3 def pack(self, songpane): container = Gtk.HBox() self.show() container.pack_start(self, True, True, 0) self.main_box.pack2(songpane, True, False) return container def unpack(self, container, songpane): self.main_box.remove(songpane) container.remove(self) @classmethod def set_all_wide_mode(klass, value): for browser in klass.instances(): browser.set_wide_mode(value) @classmethod def set_all_panes(klass): for browser in klass.instances(): browser.refresh_panes() browser.fill_panes() def __init__(self, library): super(PanedBrowser, self).__init__() self._register_instance() self._filter = lambda s: False self._library = library self.set_spacing(6) self.set_orientation(Gtk.Orientation.VERTICAL) completion = LibraryTagCompletion(library.librarian) self.accelerators = Gtk.AccelGroup() sbb = SearchBarBox(completion=completion, accel_group=self.accelerators) sbb.connect('query-changed', self.__text_parse) sbb.connect('focus-out', self.__focus) self._sb_box = sbb align = Align(sbb, left=6, right=6, top=6) self.pack_start(align, False, True, 0) keyval, mod = Gtk.accelerator_parse("<Primary>Home") self.accelerators.connect(keyval, mod, 0, self.__select_all) select = Gtk.Button(label=_("Select _All"), use_underline=True) select.connect('clicked', self.__select_all) sbb.pack_start(select, False, True, 0) prefs = PreferencesButton(self) sbb.pack_start(prefs, False, True, 0) connect_destroy(library, 'changed', self.__changed) connect_destroy(library, 'added', self.__added) connect_destroy(library, 'removed', self.__removed) self.connect('destroy', self.__destroy) # contains the panes and the song list self.main_box = qltk.ConfigRPaned("browsers", "panedbrowser_pos", 0.4) self.pack_start(self.main_box, True, True, 0) self.multi_paned = ConfigMultiRHPaned("browsers", "panedbrowser_pane_widths") self.refresh_panes() for child in self.get_children(): child.show_all() def __destroy(self, *args): del self._sb_box def set_wide_mode(self, do_wide): hor = Gtk.Orientation.HORIZONTAL ver = Gtk.Orientation.VERTICAL if do_wide: self.main_box.props.orientation = hor self.multi_paned.change_orientation(horizontal=False) else: self.main_box.props.orientation = ver self.multi_paned.change_orientation(horizontal=True) def _get_text(self): return self._sb_box.get_text() def _set_text(self, text): self._sb_box.set_text(text) def __focus(self, widget, *args): qltk.get_top_parent(widget).songlist.grab_focus() def __text_parse(self, bar, text): self.activate() def filter_text(self, text): self._set_text(text) self.activate() def get_filter_text(self): return self._get_text() def __select_all(self, *args): self._panes[-1].inhibit() for pane in self._panes: pane.set_selected(None, True) self._panes[-1].uninhibit() self._panes[-1].get_selection().emit('changed') def __added(self, library, songs): songs = filter(self._filter, songs) for pane in self._panes: pane.add(songs) songs = filter(pane.matches, songs) def __removed(self, library, songs, remove_if_empty=True): songs = filter(self._filter, songs) for pane in self._panes: pane.remove(songs, remove_if_empty) def __changed(self, library, songs): self.__removed(library, songs, False) self.__added(library, songs) self.__removed(library, []) def active_filter(self, song): # check with the search filter if not self._filter(song): return False # check if the selection is right in every pane for pane in self._panes: if not pane.matches(song): return False return True def activate(self): text = self._get_text() if Query.is_parsable(text): star = dict.fromkeys(SongList.star) star.update(self.__star) self._filter = Query(text, star.keys()).search songs = filter(self._filter, self._library) bg = background_filter() if bg: songs = filter(bg, songs) self._panes[0].fill(songs) def scroll(self, song): for pane in self._panes: pane.scroll(song) def refresh_panes(self): self.multi_paned.destroy() # Fill in the pane list. The last pane reports back to us. self._panes = [self] for header in reversed(get_headers()): pane = Pane(self._library, header, self._panes[0]) pane.connect('row-activated', lambda *x: self.songs_activated()) self._panes.insert(0, pane) self._panes.pop() # remove self # Put the panes in scrollable windows sws = [] for pane in self._panes: sw = ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(pane) sws.append(sw) self.multi_paned.set_widgets(sws) self.multi_paned.show_all() self.main_box.pack1(self.multi_paned.get_paned(), True, False) self.__star = {} for p in self._panes: tags = [t for t in p.tags if not t.startswith("~#")] self.__star.update(dict.fromkeys(tags)) self.set_wide_mode(config.getboolean("browsers", "pane_wide_mode")) def fill_panes(self): self._panes[-1].inhibit() self.activate() self._panes[-1].uninhibit() def make_pane_widths_equal(self): self.multi_paned.make_pane_widths_equal() def __get_filter_pane(self, key): """Get the best pane for filtering etc.""" candidates = [] for pane in self._panes: if (key in pane.tags or (key in PEOPLE and "~people" in pane.tags)): candidates.append((len(pane.tags), pane)) candidates.sort() return (candidates and candidates[0][1]) or None def can_filter_tag(self, tag): return (self.__get_filter_pane(tag) is not None) def can_filter_text(self): return True def filter(self, tag, values): filter_pane = self.__get_filter_pane(tag) for pane in self._panes: if pane is filter_pane: filter_pane.set_selected_by_tag(tag, values, True) return pane.set_selected([None], True) def unfilter(self): self._panes[-1].inhibit() for pane in self._panes: pane.set_selected(None, True) self._panes[-1].uninhibit() self._set_text("") self.activate() def list(self, key): filter_pane = self.__get_filter_pane(key) if filter_pane is None: return super(PanedBrowser, self).list(key) for pane in self._panes: if pane is filter_pane: return list(filter_pane.list(key)) pane.set_selected(None, True) return [] def save(self): config.settext("browsers", "query_text", self._get_text()) selected = [] for pane in self._panes: selected.append(pane.get_restore_string()) to_save = u"\n".join(selected) config.settext("browsers", "pane_selection", to_save) def restore(self): try: text = config.gettext("browsers", "query_text") except config.Error: pass else: self._set_text(text) selected = config.gettext("browsers", "pane_selection") if not selected: return for pane, string in zip(self._panes, selected.split(u"\n")): pane.parse_restore_string(string) def finalize(self, restored): config.settext("browsers", "query_text", u"") if not restored: self.fill_panes() def fill(self, songs): GLib.idle_add(self.songs_selected, list(songs)) ��������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/paned/pane.py����������������������������������������������������0000644�0001750�0001750�00000022162�13112005742�022162� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import operator from gi.repository import Gtk, Pango, Gdk from quodlibet import qltk from quodlibet.qltk.views import AllTreeView, TreeViewColumnButton from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk import is_accel from quodlibet.util import connect_obj, gdecode from quodlibet.compat import text_type from .models import PaneModel from .util import PaneConfig class Pane(AllTreeView): """Pane of the paned browser""" TARGET_INFO_QL = 1 TARGET_INFO_URI_LIST = 2 def __init__(self, library, prefs, next_=None): super(Pane, self).__init__() self.set_fixed_height_mode(True) self.config = PaneConfig(prefs) self.__next = next_ self.__restore_values = None self.__no_fill = 0 column = TreeViewColumnButton(title=self.config.title) def on_column_header_clicked(column, event): # In case the column header gets clicked select the "All" entry if event.button != Gdk.BUTTON_PRIMARY or \ event.type != Gdk.EventType.BUTTON_PRESS: return Gdk.EVENT_PROPAGATE self.set_selected([]) return Gdk.EVENT_STOP column.set_clickable(True) column.connect("button-press-event", on_column_header_clicked) column.set_use_markup(True) column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) column.set_fixed_width(50) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) column.pack_start(render, True) def text_cdf(column, cell, model, iter_, data): entry = model.get_value(iter_) is_markup, text = entry.get_text(self.config) if is_markup: cell.markup = text cell.set_property('markup', text) else: cell.markup = None cell.set_property('text', text) column.set_cell_data_func(render, text_cdf) render_count = Gtk.CellRendererText() render_count.set_property('xalign', 1.0) column.pack_start(render_count, False) def count_cdf(column, cell, model, iter_, data): entry = model.get_value(iter_) markup = entry.get_count_text(self.config) cell.markup = markup cell.set_property('markup', markup) column.set_cell_data_func(render_count, count_cdf) self.append_column(column) model = PaneModel(self.config) self.set_model(model) self.set_search_equal_func(self.__search_func, None) self.set_search_column(0) self.set_enable_search(True) selection = self.get_selection() selection.set_mode(Gtk.SelectionMode.MULTIPLE) self.__sig = self.connect( 'selection-changed', self.__selection_changed) s = self.connect('popup-menu', self.__popup_menu, library) connect_obj(self, 'destroy', self.disconnect, s) targets = [ ("text/x-quodlibet-songs", Gtk.TargetFlags.SAME_APP, self.TARGET_INFO_QL), ("text/uri-list", 0, self.TARGET_INFO_URI_LIST) ] targets = [Gtk.TargetEntry.new(*t) for t in targets] self.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, targets, Gdk.DragAction.COPY) self.connect("drag-data-get", self.__drag_data_get) self.connect("destroy", self.__destroy) self.connect("key-press-event", self.__key_pressed) def __key_pressed(self, view, event): # if ctrl+a is pressed, intercept and select the All entry instead if is_accel(event, "<Primary>a"): self.set_selected([]) return True return False def __repr__(self): return "<%s config=%r>" % (type(self).__name__, self.config) def parse_restore_string(self, config_value): assert isinstance(config_value, text_type) values = config_value.split("\t")[:-1] try: if int(values[0]): values[0] = None else: del values[0] except (ValueError, IndexError): pass self.__restore_values = values def get_restore_string(self): values = self.get_selected() # The first value tells us if All was selected all_ = None in values if all_: values.remove(None) all_ = str(int(bool(all_))) values = list(values) values.insert(0, all_) # The config lib strips all whitespace, # so add a bogus . at the end values.append(u".") return u"\t".join(values) @property def tags(self): """Tags this pane displays""" return self.config.tags def __destroy(self, *args): # needed for gc self.__next = None def __search_func(self, model, column, key, iter_, data): entry = model.get_value(iter_) return not entry.contains_text(gdecode(key)) def __drag_data_get(self, view, ctx, sel, tid, etime): songs = self.__get_selected_songs(sort=True) if tid == self.TARGET_INFO_QL: qltk.selection_set_songs(sel, songs) else: sel.set_uris([song("~uri") for song in songs]) def __popup_menu(self, view, library): songs = self.__get_selected_songs(sort=True) menu = SongsMenu(library, songs) menu.show_all() return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __selection_changed(self, *args): if self.__next: self.__next.fill(self.__get_selected_songs()) def add(self, songs): self.get_model().add_songs(songs) def remove(self, songs, remove_if_empty=True): self.inhibit() self.get_model().remove_songs(songs, remove_if_empty) self.uninhibit() def matches(self, song): model, paths = self.get_selection().get_selected_rows() # nothing == all if not paths: return True return model.matches(paths, song) def inhibit(self): """Inhibit selection change events and song propagation""" self.__no_fill += 1 self.handler_block(self.__sig) def uninhibit(self): """Uninhibit selection change events and song propagation""" self.handler_unblock(self.__sig) self.__no_fill -= 1 def fill(self, songs): # Restore the selection if self.__restore_values is not None: selected = self.__restore_values self.__restore_values = None else: selected = self.get_selected() model = self.get_model() # If previously all entries were selected or None: select All if not selected or len(model) == len(selected): selected = [None] self.inhibit() with self.without_model(): model.clear() model.add_songs(songs) self.set_selected(selected, jump=True) self.uninhibit() if self.__next and self.__no_fill == 0: self.__next.fill(self.__get_selected_songs()) def scroll(self, song): """Select and scroll to entry which contains song""" def select_func(row): entry = row[0] return entry.contains_song(song) self.select_by_func(select_func, one=True) def list(self, tag): return self.get_model().list(tag) def get_selected(self): """A list of keys for selected entries""" model, paths = self.get_selection().get_selected_rows() return model.get_keys(paths) def set_selected(self, values, jump=False, force_any=True): """Select entries with key in values jump -- scroll the the first selected entry any -- if nothing gets selected, select the first entry """ if self.get_model().is_empty(): return values = values or [] # If the selection is the same, change nothing if values != self.get_selected(): self.inhibit() self.get_selection().unselect_all() def select_func(row): entry = row[0] return entry.key in values self.select_by_func(select_func, scroll=jump) self.uninhibit() self.get_selection().emit('changed') if force_any and self.get_selection().count_selected_rows() == 0: self.set_cursor((0,)) def set_selected_by_tag(self, tag, values, *args, **kwargs): """Select the entries which songs all have one of the values for the given tag. """ pattern_values = self.get_model().get_keys_by_tag(tag, values) self.set_selected(pattern_values, *args, **kwargs) def __get_selected_songs(self, sort=False): model, paths = self.get_selection().get_selected_rows() songs = model.get_songs(paths) if sort: return sorted(songs, key=operator.attrgetter("sort_key")) return songs ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/search.py��������������������������������������������������������0000644�0001750�0001750�00000010567�13112005742�021423� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2016 Joe Wreschnig, Michael Urman, Iñigo Serna, # Christoph Reiter, Steven Robertson, Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GLib from quodlibet import config from quodlibet import qltk from quodlibet import _ from quodlibet.browsers import Browser from quodlibet.query import Query from quodlibet.qltk.ccb import ConfigCheckMenuItem from quodlibet.qltk.completion import LibraryTagCompletion from quodlibet.qltk.menubutton import MenuButton from quodlibet.qltk.songlist import SongList from quodlibet.qltk.searchbar import LimitSearchBarBox from quodlibet.qltk.x import Align, SymbolicIconImage from quodlibet.qltk import Icons class PreferencesButton(Gtk.HBox): def __init__(self, search_bar_box): super(PreferencesButton, self).__init__() menu = Gtk.Menu() limit_item = ConfigCheckMenuItem( _("_Limit Results"), "browsers", "search_limit", True) limit_item.connect("toggled", search_bar_box.toggle_limit_widgets) menu.append(limit_item) menu.show_all() button = MenuButton( SymbolicIconImage(Icons.EMBLEM_SYSTEM, Gtk.IconSize.MENU), arrow=True) button.set_menu(menu) self.pack_start(button, True, True, 0) class SearchBar(Browser): """A browser in which queries are parsed and used to filter results""" name = _("Search Library") accelerated_name = _("_Search Library") keys = ["SearchBar"] priority = 1 def pack(self, songpane): container = Gtk.VBox(spacing=6) container.pack_start(self, False, True, 0) container.pack_start(songpane, True, True, 0) return container def unpack(self, container, songpane): container.remove(songpane) container.remove(self) def __init__(self, library): super(SearchBar, self).__init__() self.set_spacing(6) self.set_orientation(Gtk.Orientation.VERTICAL) self._query = None self._library = library completion = LibraryTagCompletion(library.librarian) self.accelerators = Gtk.AccelGroup() show_limit = config.getboolean("browsers", "search_limit") sbb = LimitSearchBarBox(completion=completion, accel_group=self.accelerators, show_limit=show_limit) sbb.connect('query-changed', self.__text_parse) sbb.connect('focus-out', self.__focus) self._sb_box = sbb prefs = PreferencesButton(sbb) sbb.pack_start(prefs, False, True, 0) align = Align(sbb, left=6, right=6, top=6) self.pack_start(align, False, True, 0) self.connect('destroy', self.__destroy) self.show_all() def _get_text(self): return self._sb_box.get_text() def _set_text(self, text): self._sb_box.set_text(text) def __destroy(self, *args): self._sb_box = None def __focus(self, widget, *args): qltk.get_top_parent(widget).songlist.grab_focus() def _get_songs(self): text = self._get_text() try: self._query = Query(text, star=SongList.star) except Query.error: pass else: return self._query.filter(self._library) def activate(self): songs = self._get_songs() if songs is not None: songs = self._sb_box.limit(songs) GLib.idle_add(self.songs_selected, songs) def __text_parse(self, bar, text): self.activate() def save(self): config.settext("browsers", "query_text", self._get_text()) def restore(self): text = config.gettext("browsers", "query_text") self._set_text(text) def finalize(self, restore): config.set("browsers", "query_text", "") def can_filter_text(self): return True def filter_text(self, text): self._set_text(text) self.activate() def get_filter_text(self): return self._get_text() def unfilter(self): self.filter_text("") def active_filter(self, song): if self._query is not None: return self._query.search(song) else: return True browsers = [SearchBar] �����������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/filesystem.py����������������������������������������������������0000644�0001750�0001750�00000021217�13112005742�022334� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012,2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation # Some sort of crazy directory-based browser. QL is full of minor hacks # to support this by automatically adding songs to the library when it # needs them to be there. import os from gi.repository import Gtk, Gdk from senf import fsn2uri from quodlibet import config from quodlibet import formats from quodlibet import qltk from quodlibet import _ from quodlibet.browsers import Browser from quodlibet.compat import listfilter from quodlibet.library import SongFileLibrary from quodlibet.qltk.filesel import MainDirectoryTree from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.x import ScrolledWindow from quodlibet.qltk import Icons from quodlibet.util import copool from quodlibet.util.library import get_scan_dirs from quodlibet.util.dprint import print_d from quodlibet.util.path import normalize_path from quodlibet.util import connect_obj class FileSystem(Browser, Gtk.HBox): __library = None name = _("File System") accelerated_name = _("_File System") keys = ["FileSystem"] priority = 10 uses_main_library = False TARGET_QL, TARGET_EXT = range(1, 3) def pack(self, songpane): container = qltk.ConfigRHPaned("browsers", "filesystem_pos", 0.4) container.pack1(self, True, False) container.pack2(songpane, True, False) return container def unpack(self, container, songpane): container.remove(songpane) container.remove(self) @classmethod def __added(klass, library, songs): klass.__library.remove(songs) @classmethod def init(klass, library): if klass.__library is not None: return klass.__glibrary = library klass.__library = SongFileLibrary("filesystem") library.connect('added', klass.__remove_because_added) @classmethod def __remove_because_added(klass, library, songs): songs = filter(klass.__library.__contains__, songs) klass.__library.remove(songs) def __init__(self, library): super(FileSystem, self).__init__() sw = ScrolledWindow() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) dt = MainDirectoryTree(folders=get_scan_dirs()) targets = [("text/x-quodlibet-songs", Gtk.TargetFlags.SAME_APP, self.TARGET_QL), ("text/uri-list", 0, self.TARGET_EXT)] targets = [Gtk.TargetEntry.new(*t) for t in targets] dt.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, targets, Gdk.DragAction.COPY) dt.connect('drag-data-get', self.__drag_data_get) sel = dt.get_selection() sel.unselect_all() connect_obj(sel, 'changed', copool.add, self.__songs_selected, dt) dt.connect('row-activated', lambda *a: self.songs_activated()) sw.add(dt) self.pack_start(sw, True, True, 0) self.show_all() def get_child(self): return self.get_children()[0].get_child() def __drag_data_get(self, view, ctx, sel, tid, etime): model, rows = view.get_selection().get_selected_rows() dirs = [model[row][0] for row in rows] for songs in self.__find_songs(view.get_selection()): pass if tid == self.TARGET_QL: cant_add = listfilter(lambda s: not s.can_add, songs) if cant_add: qltk.ErrorMessage( qltk.get_top_parent(self), _("Unable to copy songs"), _("The files selected cannot be copied to other " "song lists or the queue.")).run() ctx.drag_abort(etime) return to_add = filter(self.__library.__contains__, songs) self.__add_songs(view, to_add) qltk.selection_set_songs(sel, songs) else: # External target (app) is delivered a list of URIS of songs uris = list({fsn2uri(dir) for dir in dirs}) print_d("Directories to drop: %s" % dirs) sel.set_uris(uris) def can_filter_tag(self, key): return key == "~dirname" def filter(self, key, values): self.get_child().get_selection().unselect_all() for v in values: self.get_child().go_to(v) def scroll(self, song): self.__select_paths([song("~dirname")]) def restore(self): try: paths = config.get("browsers", "filesystem").split("\n") except config.Error: pass else: self.__select_paths(paths) def __select_paths(self, paths): # AudioFile uses normalized paths, DirectoryTree doesn't paths = map(normalize_path, paths) def select(model, path, iter_, paths_): (paths, first) = paths_ value = model.get_value(iter_) if value is None: return not bool(paths) value = normalize_path(value) if value in paths: self.get_child().get_selection().select_path(path) paths.remove(value) if not first: self.get_child().set_cursor(path) # copy treepath, gets invalid after the callback first.append(path.copy()) else: for fpath in paths: if fpath.startswith(value): self.get_child().expand_row(path, False) return not bool(paths) # XXX: We expect all paths we want in DirectoryTree to be # expanded once before first = [] self.get_child().get_model().foreach(select, (paths, first)) if first: self.get_child().scroll_to_cell(first[0], None, True, 0.5) def save(self): model, rows = self.get_child().get_selection().get_selected_rows() paths = "\n".join([model[row][0] for row in rows]) config.set("browsers", "filesystem", paths) def activate(self): copool.add(self.__songs_selected, self.get_child()) def Menu(self, songs, library, items): i = qltk.MenuItem(_("_Add to Library"), Icons.LIST_ADD) i.set_sensitive(False) i.connect('activate', self.__add_songs, songs) for song in songs: if song not in self.__glibrary: i.set_sensitive(True) break items.append([i]) menu = SongsMenu(library, songs, remove=self.__remove_songs, delete=True, queue=True, items=items) return menu def __add_songs(self, item, songs): songs = filter(self.__library.__contains__, songs) self.__library.librarian.move(songs, self.__library, self.__glibrary) def __remove_songs(self, songs): songs = filter(self.__glibrary.__contains__, songs) self.__library.librarian.move(songs, self.__glibrary, self.__library) def __find_songs(self, selection): model, rows = selection.get_selected_rows() dirs = [model[row][0] for row in rows] songs = [] to_add = [] for dir in dirs: try: for file in filter(formats.filter, sorted(os.listdir(dir))): raw_path = os.path.join(dir, file) fn = normalize_path(raw_path, canonicalise=True) if fn in self.__glibrary: songs.append(self.__glibrary[fn]) elif fn not in self.__library: song = formats.MusicFile(fn) if song: to_add.append(song) songs.append(song) yield songs if fn in self.__library: song = self.__library[fn] if not song.valid(): self.__library.reload(song) if song in self.__library: songs.append(song) except OSError: pass self.__library.add(to_add) yield songs def __songs_selected(self, view): if self.get_window(): self.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) for songs in self.__find_songs(view.get_selection()): yield True if self.get_window(): self.get_window().set_cursor(None) self.songs_selected(songs) browsers = [FileSystem] ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/soundcloud/������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021750� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/soundcloud/library.py��������������������������������������������0000644�0001750�0001750�00000011335�13114747176�024013� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.util.dprint import print_d, print_w from quodlibet.browsers.soundcloud.query import SoundcloudQuery from quodlibet import config from quodlibet.formats.remote import RemoteFile from quodlibet.library.libraries import SongLibrary from quodlibet.util import cached_property, print_exc class SoundcloudLibrary(SongLibrary): STAR = ["artist", "title", "genre", "tags"] def __init__(self, client, player=None): super(SoundcloudLibrary, self).__init__("Soundcloud") self.client = client self.client.connect('songs-received', self._on_songs_received) self.client.connect('comments-received', self._on_comments_received) if player: player.connect('song-started', self.__song_started) def query(self, text, sort=None, star=STAR): values = self._contents.values() try: return SoundcloudQuery(text).filter(values) except SoundcloudQuery.error: return values def query_with_refresh(self, text, sort=None, star=STAR): """Queries Soundcloud for some (more) relevant results, then filters""" current = self._contents.values() try: query = SoundcloudQuery(text, star=star) self.client.get_tracks(query.terms) except SoundcloudQuery.error as e: print_w("Couldn't filter for query '%s' (%s)" % (text, e)) return current filtered = query.filter(current) print_d("Filtered %d results to %d" % (len(current), len(filtered))) return filtered def rename(self, song, newname, changed=None): raise TypeError("Can't rename Soundcloud files") def _on_songs_received(self, client, songs): new = len(self.add(songs)) print_d("Got %d songs (%d new)." % (len(songs), new)) def _on_comments_received(self, client, track_id, comments): def bookmark_for(com): text = "\"%s\" --%s" % (com['body'], com['user']['username']) return max(0, int((com.get('timestamp') or 0) / 1000.0)), text try: song = self.song_by_track_id(track_id) except KeyError: # https://github.com/quodlibet/quodlibet/issues/2410 print_exc() return song.bookmarks = [bookmark_for(c) for c in comments] def song_by_track_id(self, track_id): for song in self.values(): if song.track_id == track_id: return song raise KeyError("No track with id %s. Do have %s" % (track_id, [s.track_id for s in self.values()])) def _changed(self, items): super(SoundcloudLibrary, self)._changed(items) # We should ask the AudioFile subclass to write what it can ASAP for item in items: item.write() def __song_started(self, player, song): if isinstance(song, SoundcloudFile): print_d("Getting comments for %s (%s)" % (song("title"), song.key)) self.client.get_comments(song.track_id) class SoundcloudFile(RemoteFile): format = "Remote Soundcloud File" def __init__(self, uri, track_id, favorite=False, client=None): super(SoundcloudFile, self).__init__(uri) self.client = client self["soundcloud_track_id"] = track_id self.favorite = favorite if self.favorite: self['~#rating'] = 1.0 if not self.client: raise EnvironmentError("Must have a Soundcloud client") def set_image(self, image): raise TypeError("Can't change images on Soundcloud") @cached_property def track_id(self): return int(self["soundcloud_track_id"]) @cached_property def key(self): return "track-%s" % (self.track_id,) def can_change(self, k=None): if k is None: return ["~rating", "~#rating"] else: return "rating" in k def write(self): if not self.client or not self.client.online: print_w("Can't save without a logged-in Soundcloud client") return # There's not much that can be written self._write_rating() def _write_rating(self): should_fave = (self.has_rating and self("~#rating") >= config.RATINGS.default) track_id = self.track_id if not self.favorite and should_fave: self.client.put_favorite(track_id) self.favorite = True elif self.favorite and not should_fave: self.client.remove_favorite(track_id) self.favorite = False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/soundcloud/util.py�����������������������������������������������0000644�0001750�0001750�00000005457�13112005742�023314� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from datetime import datetime from quodlibet import print_d, _ from quodlibet.qltk import WebImage from quodlibet.qltk.getstring import GetStringDialog from quodlibet.util import enum SOUNDCLOUD_NAME = "Soundcloud" PROCESS_QL_URLS = True DEFAULT_BITRATE = 128 EPOCH = datetime(1970, 1, 1) SITE_URL = "https://soundcloud.com" class Wrapper(object): """Object-like wrapper for read-only dictionaries""" def __init__(self, data): self.data = data def __getattr__(self, name): if name in self.data: return self.data.get(name) raise AttributeError("'%s' not found" % (name,)) def __getitem__(self, item): return self.data[item] def __setitem__(self, key, value): raise NotImplementedError def get(self, name, default=None): return self.data.get(name, default) def __str__(self): return "<Wrapped: %s>" % self.data def json_callback(wrapped): """Decorator for `download_json` callbacks, handling common errors""" def _callback(self, message, json, data): if json is None: print_d('Invalid JSON ({message.status_code}): ' '{message.response_body.data} (request: {data})' .format(**locals())) return if 'errors' in json: raise ValueError("Got HTTP %d (%s)" % (message.status_code, json['errors'])) if 'error' in json: raise ValueError("Got HTTP %d (%s)" % (message.status_code, json['error'])) return wrapped(self, json) return _callback def clamp(val, low, high): intval = int(val or 0) return max(low, min(high, intval)) @enum class State(int): LOGGED_OUT, LOGGING_IN, LOGGED_IN = range(3) @enum class FilterType(int): SEP, SEARCH, FAVORITES = range(3) class EnterAuthCodeDialog(GetStringDialog): def __init__(self, parent): super(EnterAuthCodeDialog, self).__init__( parent, _("Soundcloud authorisation"), _("Enter Soundcloud auth code:"), button_icon=None) def _verify_clipboard(self, text): if len(text) > 10: return text def sanitise_tag(value): """QL doesn't want newlines in tags, but they Soundcloud ones are not always best represented as multi-value tags (comments, etc) """ return (value or '').replace('\n', '\t').replace('\r', '') def sc_btn_image(path, w, h): return WebImage('https://connect.soundcloud.com/2/btn-%s.png' % path, w, h) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/soundcloud/__init__.py�������������������������������������������0000644�0001750�0001750�00000000651�13112005742�024065� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import app from .main import SoundcloudBrowser browsers = ([SoundcloudBrowser] if not app.player or app.player.can_play_uri("http://") else []) ���������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/soundcloud/main.py�����������������������������������������������0000644�0001750�0001750�00000034444�13112005742�023261� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Pango from quodlibet import _ from quodlibet.compat import parse_qs, urlparse, iteritems from quodlibet import config, app from quodlibet import qltk from quodlibet import util from quodlibet.browsers import Browser from quodlibet.qltk import Icons, Message from quodlibet.qltk.completion import LibraryTagCompletion from quodlibet.qltk.searchbar import SearchBarBox from quodlibet.qltk.views import RCMHintedTreeView from quodlibet.qltk.x import Align, ScrolledWindow, WebImage from quodlibet.util import connect_destroy, DeferredSignal, website, enum, \ cached_property from quodlibet.util.dprint import print_w, print_d from .api import SoundcloudApiClient from .library import SoundcloudLibrary from .query import SoundcloudQuery from .util import State, FilterType, PROCESS_QL_URLS, EnterAuthCodeDialog, \ SITE_URL, SOUNDCLOUD_NAME, sc_btn_image class SoundcloudBrowser(Browser, util.InstanceTracker): background = False __librarian = None __filter = None name = _("Soundcloud Browser") accelerated_name = _("Sound_cloud") keys = ["Soundcloud"] priority = 30 uses_main_library = False headers = ("artist ~people title genre ~#length ~mtime ~bitrate date " "website comment ~rating " "~#playback_count ~#favoritings_count ~#likes_count").split() @enum class ModelIndex(int): TYPE, ICON_NAME, NAME, QUERY, ALWAYS_ENABLE = range(5) login_state = State.LOGGED_OUT STAR = [tag for tag in headers if not tag.startswith("~#")] @classmethod def _init(klass, library): klass.__librarian = library.librarian klass.filters = { _("Search"): (FilterType.SEARCH, Icons.EDIT_FIND, "", True), # TODO: support for ~#rating=!None etc (#1940) _("Favorites"): (FilterType.FAVORITES, Icons.FAVORITE, "#(rating = 1.0)", False), } token = config.get("browsers", "soundcloud_token", default=None) try: if klass.library: return except AttributeError: pass klass.api_client = SoundcloudApiClient(token) klass.library = SoundcloudLibrary(klass.api_client, app.player) @classmethod def _destroy(klass): klass.__librarian = None klass.filters = {} klass.library.destroy() klass.library = None def __inhibit(self): self.view.get_selection().handler_block(self.__changed_sig) def __uninhibit(self): self.view.get_selection().handler_unblock(self.__changed_sig) def __destroy(self, *args): self.api_client.disconnect(self.__auth_sig) if not self.instances(): self._destroy() def __init__(self, library): print_d("Creating Soundcloud Browser") super(SoundcloudBrowser, self).__init__(spacing=12) self.set_orientation(Gtk.Orientation.VERTICAL) if not self.instances(): self._init(library) self._register_instance() self.connect('destroy', self.__destroy) self.connect('uri-received', self.__handle_incoming_uri) self.__auth_sig = self.api_client.connect('authenticated', self.__on_authenticated) self.login_state = (State.LOGGED_IN if self.online else State.LOGGED_OUT) self._create_searchbar(library) vbox = Gtk.VBox() vbox.pack_start(self._create_footer(), False, False, 6) vbox.pack_start(self._create_category_widget(), True, True, 0) vbox.pack_start(self.create_login_button(), False, False, 6) vbox.show() pane = qltk.ConfigRHPaned("browsers", "soundcloud_pos", 0.4) pane.show() pane.pack1(vbox, resize=False, shrink=False) self._songs_box = songs_box = Gtk.VBox(spacing=6) songs_box.pack_start(self._searchbox, False, True, 0) songs_box.show() pane.pack2(songs_box, resize=True, shrink=False) self.pack_start(pane, True, True, 0) self.show() @property def online(self): return self.api_client.online def _create_footer(self): hbox = Gtk.HBox() button = Gtk.Button(always_show_image=True, relief=Gtk.ReliefStyle.NONE) button.connect('clicked', lambda _: website(SITE_URL)) button.set_tooltip_text(_("Go to %s" % SITE_URL)) button.add(self._logo_image) hbox.pack_start(button, True, True, 6) hbox.show_all() return hbox def _create_searchbar(self, library): completion = LibraryTagCompletion(library) self.accelerators = Gtk.AccelGroup() search = SearchBarBox(completion=completion, validator=SoundcloudQuery.validator, accel_group=self.accelerators, timeout=3000) self.__searchbar = search search.connect('query-changed', self.__query_changed) def focus(widget, *args): qltk.get_top_parent(widget).songlist.grab_focus() search.connect('focus-out', focus) self._searchbox = Align(search, left=0, right=6, top=6) self._searchbox.show_all() def update_connect_button(self): but = self.login_button but.set_sensitive(False) tooltip, icon = self._login_state_data[self.login_state] but.set_tooltip_text(tooltip) child = but.get_child() if child: print_d("Removing old image...") but.remove(child) but.add(icon if icon else Gtk.Label(tooltip)) but.get_child().show() but.set_sensitive(True) but.show() def create_login_button(self): def clicked_login(*args): # TODO: use a magic enum next() method, or similar state = self.login_state if state == State.LOGGED_IN: self.api_client.log_out() self.login_state = State.LOGGED_OUT self._refresh_online_filters() elif state == State.LOGGING_IN: dialog = EnterAuthCodeDialog(app.window) value = dialog.run(clipboard=True) if value: self.login_state = State.LOGGED_IN print_d("Got a user token value of '%s'" % value) self.api_client.get_token(value) elif state == State.LOGGED_OUT: self.api_client.authenticate_user() self.login_state = State.LOGGING_IN self.update_connect_button() hbox = Gtk.HBox() self.login_button = login = Gtk.Button(always_show_image=True, relief=Gtk.ReliefStyle.NONE) self.update_connect_button() login.connect('clicked', clicked_login) hbox.pack_start(login, True, False, 0) hbox.show_all() return hbox def _create_category_widget(self): scrolled_window = ScrolledWindow() scrolled_window.show() scrolled_window.set_shadow_type(Gtk.ShadowType.IN) self.view = view = RCMHintedTreeView() view.show() view.set_headers_visible(False) scrolled_window.set_policy( Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scrolled_window.add(view) model = Gtk.ListStore(int, str, str, str, bool) filters = self.filters for (i, (name, data)) in enumerate(iteritems(filters)): filter_type, icon, query, always = data enabled = always or self.online model.append(row=[filter_type, icon, name, query, enabled]) if i + 1 < len(filters): model.append(row=[FilterType.SEP, None, "", None, False]) def is_separator(model, iter_, data): return model[iter_][self.ModelIndex.TYPE] == FilterType.SEP view.set_row_separator_func(is_separator, None) def search_func(model, column, key, iter, data): return key.lower() not in model[iter][column].lower() view.set_search_column(self.ModelIndex.NAME) view.set_search_equal_func(search_func, None) column = Gtk.TreeViewColumn("Songs") column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) renderpb = Gtk.CellRendererPixbuf() renderpb.props.xpad = 6 renderpb.props.ypad = 6 column.pack_start(renderpb, False) column.add_attribute(renderpb, "icon-name", self.ModelIndex.ICON_NAME) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) def cdf(column, cell, model, iter_, user_data): on = (self.online or model[iter_][self.ModelIndex.ALWAYS_ENABLE]) cell.set_sensitive(on) column.set_cell_data_func(render, cdf) column.set_cell_data_func(renderpb, cdf) view.append_column(column) column.pack_start(render, True) column.add_attribute(render, "text", self.ModelIndex.NAME) view.set_model(model) selection = view.get_selection() def select_func(sel, model, path, value): return (self.online or model[model.get_iter(path)][self.ModelIndex.ALWAYS_ENABLE]) selection.set_select_function(select_func) self._refresh_online_filters() self.__changed_sig = connect_destroy(selection, 'changed', DeferredSignal(self._on_select)) return scrolled_window def _on_select(self, sel): model, paths = sel.get_selected_rows() if not paths: return row = model[paths[0]] filter_type = row[self.ModelIndex.TYPE] if filter_type == FilterType.SEARCH: self.__searchbar.set_enabled() elif filter_type == FilterType.FAVORITES: print_d("Getting favorites...") self.api_client.get_favorites() self.__searchbar.set_enabled(False) query_text = row[self.ModelIndex.QUERY] self.__searchbar.set_text(query_text) self.activate() def pack(self, songpane): container = Gtk.VBox() container.add(self) self._songs_box.add(songpane) return container def unpack(self, container, songpane): self._songs_box.remove(songpane) container.remove(self) def __query_changed(self, bar, text, restore=False): try: self.__filter = SoundcloudQuery(text, self.STAR) self.library.query_with_refresh(text) except SoundcloudQuery.error as e: print_d("Couldn't parse query: %s" % e) else: print_d("Got terms from query: %s" % (self.__filter.terms,)) if not restore: self.activate() def __get_selected_libraries(self): """Returns the libraries to search in depending on the filter selection""" return [self.library] def restore(self): text = config.gettext("browsers", "query_text") self.__searchbar.set_text(text) self.__query_changed(None, text, restore=True) def __get_filter(self): return self.__filter or SoundcloudQuery("") def can_filter_text(self): return True def filter_text(self, text): self.__searchbar.set_text(text) if SoundcloudQuery.is_parsable(text): self.activate() else: print_w("Not parseable: %s" % text) def get_filter_text(self): return self.__searchbar.get_text() def activate(self): print_d("Refreshing browser for query \"%r\"" % self.__filter) songs = self.library.query(self.get_filter_text()) self.songs_selected(songs) def active_filter(self, song): for lib in self.__get_selected_libraries(): if song in lib: filter_ = self.__get_filter() if filter_: return filter_.search(song) return True else: return False def save(self): text = self.__searchbar.get_text() config.settext("browsers", "query_text", text) self.api_client.save_token() def _refresh_online_filters(self): model = self.view.get_model() # TODO: less hard-coding of these for path in [2]: model.row_changed(path, model.get_iter(path)) def __handle_incoming_uri(self, obj, uri): if not PROCESS_QL_URLS: print_w("Processing of quodlibet:// URLs is disabled. (%s)" % uri) return uri = urlparse(uri) if (uri.scheme == 'quodlibet' and uri.netloc == 'callbacks' and uri.path == '/soundcloud'): try: code = parse_qs(uri.query)["code"][0] except IndexError: print_w("Malformed response in callback URI: %s" % uri) return print_d("Processing Soundcloud callback (%s)" % (uri,)) self.api_client.get_token(code) else: print_w("Unknown URL format (%s)" % (uri,)) def __on_authenticated(self, obj, data): name = data.username self.login_state = State.LOGGED_IN self.update_connect_button() self._refresh_online_filters() msg = Message(Gtk.MessageType.INFO, app.window, _("Connected"), _("Quod Libet is now connected, <b>%s</b>!") % name) msg.run() @cached_property def _logo_image(self): return WebImage( "https://developers.soundcloud.com/assets/logo_black.png", 104, 16) @cached_property def _login_state_data(self): """Login-state-based data for configuring actions (e.g. the button)""" return { State.LOGGED_IN: (_("Log out of %s") % SOUNDCLOUD_NAME, sc_btn_image('disconnect-l', 140, 29)), State.LOGGING_IN: (_("Enter code…"), None), State.LOGGED_OUT: (_("Log in to %s") % SOUNDCLOUD_NAME, sc_btn_image('connect-l', 124, 29)), } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/soundcloud/query.py����������������������������������������������0000644�0001750�0001750�00000011527�13112005742�023477� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import time import operator from collections import defaultdict from datetime import datetime from quodlibet.formats import AudioFile from quodlibet.query import Query from quodlibet.query._match import Tag, Inter, Union, Numcmp, NumexprTag, \ Numexpr, True_, error error INVERSE_OPS = {operator.le: operator.gt, operator.gt: operator.le, operator.lt: operator.ge, operator.ge: operator.lt} _DUMMY_AF = AudioFile() _CLOCK = time.time def convert_time(t): return datetime.strftime(datetime.fromtimestamp(int(t)), '%Y-%m-%d %H:%S') # Convert QL to Soundcloud tags with optional value mapper _QL_TO_SC = { 'genre': ('genres', None), 'length': ('duration', lambda x: int((x or 0) * 1000)), 'date': ('created_at', convert_time), 'tags': ('tags', None), 'bpm': ('bpm', None), 'artist': ('q', None), 'title': ('q', None), 'comments': ('q', None), } SUPPORTED = set(_QL_TO_SC.keys()) | {"rating"} class SoundcloudQuery(Query): def __init__(self, string, star=None, clock=time.time): super(SoundcloudQuery, self).__init__(string, star) self._clock = clock self.terms = self._extract_terms(self._match) def _extract_terms(self, node): """ Return a dict of sets keyed on API search term, with values for these that could be used to query the API and might return results useful for populating the songlist. Note this is not a *translation* of the query in any sense, and that (currently) the browser filters ingested API results so that the QL results are still valid based on the query given, even if some more could have been returned. ...so if in doubt, *less* restrictive is better here.""" tuples = self._extract_terms_set(node) terms = defaultdict(set) for (k, v) in tuples: terms[k].add(v) return terms def _extract_terms_set(self, node, tag=None): def to_api(tag, raw_value): try: api_tag, converter = _QL_TO_SC[tag] if tag else ('q', None) except KeyError: if tag not in SUPPORTED: raise self.error("Unsupported '%s' tag. Try: %s" % (tag, ", ". join(SUPPORTED))) return None, None else: value = str(converter(raw_value) if converter else raw_value) return api_tag, value def terms_from_re(pattern, t): """Best efforts to de-regex""" pat = pattern.lstrip('^').rstrip('$') api_tag, pat = to_api(t, pat) return {(api_tag, p) for p in pat.split('|')} if api_tag else set() if isinstance(node, Tag) and set(node._names) & SUPPORTED: if len(node._names) == 1: return self._extract_terms_set(node.res, tag=node._names[0]) return self._extract_terms_set(node.res) elif isinstance(node, Inter) or isinstance(node, Union): # Treat identically as the text-based query will perform # relevance ranking itself, meaning that any term is still useful terms = set() for n in node.res: terms |= self._extract_terms_set(n) return terms elif isinstance(node, Numcmp): def from_relative(op, l, r): raw_value = r.evaluate(_DUMMY_AF, self._clock(), True) tag, value = to_api(l._tag, raw_value) if not value: return set() if op == operator.eq: return {(tag, value)} elif op in (operator.le, operator.lt): return {(tag + "[to]", value)} elif op in (operator.ge, operator.gt): return {(tag + "[from]", value)} raise self.error("Unsupported operator: %s" % op) left = node._expr right = node._expr2 if isinstance(left, NumexprTag) and isinstance(right, Numexpr): return from_relative(node._op, left, right) elif isinstance(right, NumexprTag) and isinstance(left, Numexpr): # We can reduce the logic by flipping the expression return from_relative(INVERSE_OPS[node._op], right, left) raise self.error("Unsupported numeric: %s" % node) elif hasattr(node, 'pattern'): return terms_from_re(node.pattern, tag) elif isinstance(node, True_): return set() raise self.error("Unhandled node: %r" % (node,)) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/soundcloud/api.py������������������������������������������������0000644�0001750�0001750�00000024104�13112005742�023076� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from datetime import datetime from gi.repository import GObject, Gio, Soup from quodlibet import util, config from quodlibet.util import website from quodlibet.util.dprint import print_w, print_d from quodlibet.util.http import download_json, download from quodlibet.compat import urlencode, iteritems from .library import SoundcloudFile from .util import json_callback, Wrapper, sanitise_tag, DEFAULT_BITRATE, EPOCH class RestApi(GObject.Object): """Semi-generic REST API client, using libsoup / `http.py`""" def __init__(self, root): super(RestApi, self).__init__() self._cancellable = Gio.Cancellable.new() self.root = root def _default_params(self): return {} def _get(self, path, callback, **kwargs): args = self._default_params() args.update(kwargs) msg = Soup.Message.new('GET', self._url(path, args)) download_json(msg, self._cancellable, callback, None) def _post(self, path, callback, **kwargs): args = self._default_params() args.update(kwargs) msg = Soup.Message.new('POST', self._url(path)) post_body = urlencode(args) if not isinstance(post_body, bytes): post_body = post_body.encode("ascii") msg.set_request('application/x-www-form-urlencoded', Soup.MemoryUse.COPY, post_body) download_json(msg, self._cancellable, callback, None) def _put(self, path, callback, **kwargs): args = self._default_params() args.update(kwargs) msg = Soup.Message.new('PUT', self._url(path)) body = urlencode(args) if not isinstance(body, bytes): body = body.encode("ascii") msg.set_request('application/x-www-form-urlencoded', Soup.MemoryUse.COPY, body) download_json(msg, self._cancellable, callback, None) def _delete(self, path, callback, **kwargs): args = self._default_params() args.update(kwargs) # Turns out the SC API doesn't mind body arguments for DELETEs, # and as it's neater and slightly more secure, let's do that. body = urlencode(args) if not isinstance(body, bytes): body = body.encode("ascii") msg = Soup.Message.new('DELETE', self._url(path)) msg.set_request('application/x-www-form-urlencoded', Soup.MemoryUse.COPY, body) download(msg, self._cancellable, callback, None, try_decode=False) def _url(self, path, args=None): path = "%s%s" % (self.root, path) return "%s?%s" % (path, urlencode(args)) if args else path class SoundcloudApiClient(RestApi): __CLIENT_SECRET = 'ca2b69301bd1f73985a9b47224a2a239' __CLIENT_ID = '5acc74891941cfc73ec8ee2504be6617' API_ROOT = "https://api.soundcloud.com" REDIRECT_URI = 'https://quodlibet.github.io/callbacks/soundcloud.html' PAGE_SIZE = 150 MIN_DURATION_SECS = 120 COUNT_TAGS = {'%s_count' % t for t in ('playback', 'download', 'likes', 'favoritings', 'download', 'comments')} __gsignals__ = { 'fetch-success': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'fetch-failure': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'songs-received': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'comments-received': (GObject.SignalFlags.RUN_LAST, None, (int, object,)), 'authenticated': (GObject.SignalFlags.RUN_LAST, None, (object,)), } def __init__(self, token=None): print_d("Starting Soundcloud API...") super(SoundcloudApiClient, self).__init__(self.API_ROOT) self.online = bool(token) self.username = None self.access_token = token def _default_params(self): params = {'client_id': self.__CLIENT_ID} if self.access_token: params["oauth_token"] = self.access_token return params def authenticate_user(self): # create client object with app credentials if self.access_token: print_d("Ignoring saved Soundcloud token...") # redirect user to authorize URL website(self._authorize_url) def log_out(self): print_d("Destroying access token...") self.access_token = None self.save_token() self.online = False def get_token(self, code): print_d("Getting access token...") options = { 'grant_type': 'authorization_code', 'redirect_uri': self.REDIRECT_URI, 'client_id': self.__CLIENT_ID, 'client_secret': self.__CLIENT_SECRET, 'code': code, } self._post('/oauth2/token', self._receive_token, **options) @json_callback def _receive_token(self, json): self.access_token = json['access_token'] print_d("Got an access token: %s" % self.access_token) self.save_token() self.online = True self._get('/me', self._receive_me) @json_callback def _receive_me(self, json): self.username = json['username'] self.emit('authenticated', Wrapper(json)) def get_tracks(self, params): merged = { "q": "", "limit": self.PAGE_SIZE, "duration[from]": self.MIN_DURATION_SECS * 1000, } for k, v in iteritems(params): delim = " " if k == 'q' else "," merged[k] = delim.join(list(v)) print_d("Getting tracks: params=%s" % merged) self._get('/tracks', self._on_track_data, **merged) @json_callback def _on_track_data(self, json): songs = list(filter(None, [self._audiofile_for(r) for r in json])) self.emit('songs-received', songs) def get_favorites(self): self._get('/me/favorites', self._on_track_data, limit=self.PAGE_SIZE) def get_comments(self, track_id): self._get('/tracks/%s/comments' % track_id, self._receive_comments, limit=200) @json_callback def _receive_comments(self, json): print_d("Got comments: %s" % json) if json and len(json): # Should all be the same track... track_id = json[0]["track_id"] self.emit('comments-received', track_id, json) def save_token(self): config.set("browsers", "soundcloud_token", self.access_token or "") def put_favorite(self, track_id): print_d("Saving track %s as favorite" % track_id) url = '/me/favorites/%s' % track_id self._put(url, self._on_favorited) def remove_favorite(self, track_id): print_d("Deleting favorite for %s" % track_id) url = '/me/favorites/%s' % track_id self._delete(url, self._on_favorited) @json_callback def _on_favorited(self, json): print_d("Successfully updated favorite: %s" % json) def _audiofile_for(self, response): r = Wrapper(response) d = r.data dl = d.get("downloadable", False) and d.get("download_url", None) try: url = dl or r.stream_url except AttributeError as e: print_w("Unusable result (%s) from SC: %s" % (e, d)) return None uri = SoundcloudApiClient._add_secret(url) song = SoundcloudFile(uri=uri, track_id=r.id, favorite=d.get("user_favorite", False), client=self) def get_utc_date(s): parts = s.split() dt = datetime.strptime(" ".join(parts[:-1]), "%Y/%m/%d %H:%M:%S") return int((dt - EPOCH).total_seconds()) def put_time(tag, r, attr): try: song[tag] = get_utc_date(r[attr]) except KeyError: pass def put_date(tag, r, attr): try: parts = r[attr].split() dt = datetime.strptime(" ".join(parts[:-1]), "%Y/%m/%d %H:%M:%S") song[tag] = dt.strftime("%Y-%m-%d") except KeyError: pass def put_counts(tags): for tag in tags: try: song["~#%s" % tag] = int(r[tag]) except KeyError: pass try: song.update(title=r.title, artist=r.user["username"], website=r.permalink_url, genre=u"\n".join(r.genre and r.genre.split(",") or [])) if dl: song.update(format=r.original_format) song["~#bitrate"] = r.original_content_size * 8 / r.duration else: song["~#bitrate"] = DEFAULT_BITRATE if r.description: song["comment"] = sanitise_tag(r.description) song["~#length"] = int(r.duration) / 1000 art_url = r.artwork_url if art_url: song["artwork_url"] = ( art_url.replace("-large.", "-t500x500.")) put_time("~#mtime", r, "last_modified") put_date("date", r, "created_at") put_counts(self.COUNT_TAGS) plays = d.get("user_playback_count", 0) if plays: song["~#playcount"] = plays # print_d("Got song: %s" % song) except Exception as e: print_w("Couldn't parse a song from %s (%r). " "Had these tags:\n %s" % (r, e, song.keys())) return song @classmethod def _add_secret(cls, stream_url): return "%s?client_id=%s" % (stream_url, cls.__CLIENT_ID) @util.cached_property def _authorize_url(self): url = '%s/connect' % (self.API_ROOT,) options = { 'scope': 'non-expiring', 'client_id': self.__CLIENT_ID, 'response_type': 'code', 'redirect_uri': self.REDIRECT_URI } return '%s?%s' % (url, urlencode(options)) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/_base.py���������������������������������������������������������0000644�0001750�0001750�00000032510�13112005742�021217� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import random from gi.repository import Gtk, GObject, GLib, Pango from quodlibet import app, qltk from quodlibet import util from quodlibet import _ from quodlibet.pattern import XMLFromMarkupPattern from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.textedit import PatternEditBox from quodlibet.util import connect_obj, print_d from quodlibet.util.i18n import numeric_phrase from quodlibet.util.library import background_filter from quodlibet.compat import itervalues class Filter(object): active_filter = None """A callable that returns True if the passed song should be in the song list, False if not and None if no filter is active. Used for adding new songs to the song list or dynamic playlist removal when a song ends. def active_filter(self, song): ... """ def can_filter_tag(self, key): """If key can be passed to filter()""" return False def can_filter_text(self): """If filter_text() and get_filter_text() can be used""" return False def filter_text(self, text): """Set a text query""" raise NotImplementedError def get_filter_text(self): """Get the active text query""" raise NotImplementedError def can_filter_albums(self): """If filter_albums() can be used""" return False def filter_albums(self, values): """Do filtering base on a list of album keys""" raise NotImplementedError def list_albums(self): """Return a list of unique album keys (song.album_key)""" albums = app.library.albums albums.load() return [a.key for a in albums] def filter(self, key, values): """Actually do the filtering (with a union of values).""" # for backward compatibility if self.can_filter_text(): self.filter_text(util.build_filter_query(key, values)) def list(self, tag): """Return a list of unique values for the given tag. This needs to be here since not all browsers pull from the default library. """ library = app.library bg = background_filter() if bg: songs = filter(bg, itervalues(library)) return list({value for song in songs for value in song.list(tag)}) return list(library.tag_values(tag)) def unfilter(self): """Reset all filters and display the whole library.""" pass def can_filter(self, key): """If key can be passed to filter_on() or filter_random()""" c = self.can_filter_text() c = c or (key == "album" and self.can_filter_albums()) return c or (key is not None and self.can_filter_tag(key)) def filter_on(self, songs, key): """Do filtering in the best way the browser can handle""" if key == "album" and self.can_filter_albums(): values = {s.album_key for s in songs} self.filter_albums(values) elif self.can_filter_tag(key) or self.can_filter_text(): values = set() if key.startswith("~#"): values.update([song(key, 0) for song in songs]) else: for song in songs: values.update(song.list(key)) if self.can_filter_tag(key): self.filter(key, values) else: query = util.build_filter_query(key, values) self.filter_text(query) def filter_random(self, key): """Select one random value for the given key""" if key == "album" and self.can_filter_albums(): albums = self.list_albums() if albums: self.filter_albums([random.choice(albums)]) elif self.can_filter_tag(key): values = self.list(key) if values: value = random.choice(values) self.filter(key, [value]) elif self.can_filter_text(): values = self.list(key) if values: value = random.choice(values) query = util.build_filter_query(key, [value]) self.filter_text(query) class Browser(Gtk.Box, Filter): """Browsers are how the audio library is presented to the user; they create the list of songs that MainSongList is filled with, and pass them back via a callback function. """ __gsignals__ = { 'songs-selected': (GObject.SignalFlags.RUN_LAST, None, (object, object)), 'songs-activated': (GObject.SignalFlags.RUN_LAST, None, ()), 'uri-received': (GObject.SignalFlags.RUN_LAST, None, (str,)) } name = _("Library Browser") """The browser's name, without an accelerator.""" accelerated_name = _("Library Browser") """The name, with an accelerator.""" keys = ["Unknown"] """Keys which are used to reference the browser from the command line. The first is the primary one. """ priority = 100 """Priority in the menu list (0 is first, higher numbers come later)""" uses_main_library = True """Whether the browser has the main library as source""" def songs_selected(self, songs, is_sorted=False): """Emits the songs-selected signal. If is_sorted is True the songs will be put as is in the song list. In case it's False the songs will be sorted by the song list depending on its current sort configuration. """ self.emit("songs-selected", songs, is_sorted) def songs_activated(self): """Call after calling songs_selected() to activate the songs (start playing, enqueue etc..) """ self.emit("songs-activated") def pack(self, songpane): """For custom packing, define a function that returns a Widget with the browser and MainSongList both packed into it. """ raise NotImplementedError def unpack(self, container, songpane): """Unpack the browser and songlist when switching browsers in the main window. The container will be automatically destroyed afterwards. """ raise NotImplementedError background = True """If true, the global filter will be applied by MainSongList to the songs returned. """ headers = None """A list of column headers to display; None means all are okay.""" @classmethod def init(klass, library): """Called after library and MainWindow initialization, before the GTK main loop starts. """ pass def save(self): """Save the selected songlist. Browsers should save whatever they need to recreate the criteria for the current song list (not the list itself). """ raise NotImplementedError def restore(self): """Restore the selected songlist. restore is called at startup if the browser is the first loaded. """ raise NotImplementedError def finalize(self, restored): """Called after restore/activate or after the browser is loaded. restored is True if restore was called.""" pass def scroll(self, song): """Scroll to something related to the given song.""" pass def activate(self): """Do whatever is needed to emit songs-selected again.""" raise NotImplementedError can_reorder = False """If the song list should be reorderable. In case this is True every time the song list gets reordered the whole list of songs is passed to reordered(). """ def reordered(self, songs): """In case can_reorder is True and the song list gets reordered this gets called with the whole list of songs. """ raise NotImplementedError def dropped(self, songs): """Called with a list of songs when songs are dropped but the song list does not support reordering. This function should return True if the drop was successful. """ return False def key_pressed(self, event): """Gets called with a key pressed event from the song list. Should return True if the key was handled. """ return False accelerators = None """An AccelGroup that is added to / removed from the window where the browser is. """ def Menu(self, songs, library, items): """This method returns a Gtk.Menu, probably a SongsMenu. After this menu is returned the SongList may modify it further. """ return SongsMenu(library, songs, delete=True, items=items) def status_text(self, count, time=None): tmpl = numeric_phrase("%d song", "%d songs", count) return tmpl + " (%s)" % time replaygain_profiles = None """Replay Gain profiles for this browser.""" class DisplayPatternMixin(object): """Allows Browsers customisable item (e.g. album) display patterns""" _DEFAULT_PATTERN_TEXT = "" """The default pattern to display""" _PATTERN_FN = None """The filename to save the display pattern under""" __pattern = None __pattern_text = None @classmethod def load_pattern(cls): """Load the pattern as defined in `_PATTERN_FN`""" print_d("Loading pattern from %s" % cls._PATTERN_FN) try: with open(cls._PATTERN_FN, "r") as f: cls.__pattern_text = f.read().rstrip() except EnvironmentError as e: print_d("Couldn't load pattern for %s (%s), using default." % (cls.__name__, e)) cls.__pattern_text = cls._DEFAULT_PATTERN_TEXT cls.__refresh_pattern() @classmethod def update_pattern(cls, pattern_text): """Saves `pattern_text` to disk (and caches)""" if pattern_text == cls.__pattern_text: return cls.__pattern_text = pattern_text cls.__refresh_pattern() cls.refresh_all() print_d("Saving pattern for %s to %s" % (cls.__name__, cls._PATTERN_FN)) with open(cls._PATTERN_FN, "w") as f: f.write(pattern_text + "\n") @classmethod def __refresh_pattern(cls): cls.__pattern = XMLFromMarkupPattern(cls.__pattern_text) @property def display_pattern(self): """The `Pattern` used for formatting entries in this browser""" return self.__pattern @property def display_pattern_text(self): """The text of the display pattern used for formatting entries in this browser""" return self.__pattern_text or self._DEFAULT_PATTERN_TEXT @classmethod def refresh_all(cls): """Refresh the browser's items""" pass class FakeDisplayItem(dict): """Like an `AudioFile`, but if the values aren't present in the underlying dictionary, it uses the translated tag names as values. See also `util.pattern`""" def get(self, key, default="", connector=" - "): if key[:1] == "~" and '~' in key[1:]: return connector.join(map(self.get, util.tagsplit(key))) elif key[:1] == "~" and key[-4:-3] == ":": func = key[-3:] key = key[:-4] return "%s<%s>" % (util.tag(key), func) elif key in self: return self[key] return util.tag(key) __call__ = get def comma(self, key): value = self.get(key) if isinstance(value, (int, float)): return value return value.replace("\n", ", ") class EditDisplayPatternMixin(object): """Provides a display Pattern in an editable frame""" _PREVIEW_ITEM = None """The `FakeItem` (or similar) to use to interpolate into the pattern""" _DEFAULT_PATTERN = None """The display pattern to use when none is saved""" def edit_display_pane(self, browser, frame_title=None): """Returns a Pattern edit widget, with preview, optionally wrapped in a named Frame""" vbox = Gtk.VBox(spacing=6) label = Gtk.Label() label.set_alignment(0.0, 0.5) label.set_padding(6, 6) eb = Gtk.EventBox() eb.get_style_context().add_class("entry") eb.add(label) edit = PatternEditBox(self._DEFAULT_PATTERN) edit.text = browser.display_pattern_text edit.apply.connect('clicked', self._set_pattern, edit, browser) connect_obj( edit.buffer, 'changed', self._preview_pattern, edit, label) vbox.pack_start(eb, False, True, 3) vbox.pack_start(edit, True, True, 0) self._preview_pattern(edit, label) return qltk.Frame(frame_title, child=vbox) if frame_title else vbox def _set_pattern(self, button, edit, browser): browser.update_pattern(edit.text) def _preview_pattern(self, edit, label): try: text = XMLFromMarkupPattern(edit.text) % self._PREVIEW_ITEM except: text = _("Invalid pattern") edit.apply.set_sensitive(False) try: Pango.parse_markup(text, -1, u"\u0000") except GLib.GError: text = _("Invalid pattern") edit.apply.set_sensitive(False) else: edit.apply.set_sensitive(True) label.set_markup(text) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/iradio.py��������������������������������������������������������0000644�0001750�0001750�00000073414�13112005742�021425� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011 Joe Wreschnig, Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import bz2 import itertools from gi.repository import Gtk, GLib, Pango from quodlibet.util.dprint import print_d import quodlibet from quodlibet import _ from quodlibet import qltk from quodlibet import util from quodlibet import config from quodlibet.browsers import Browser from quodlibet.formats.remote import RemoteFile from quodlibet.formats._audio import TAG_TO_SORT, MIGRATE, AudioFile from quodlibet.library import SongLibrary from quodlibet.query import Query from quodlibet.compat import reduce, urlopen from quodlibet.qltk.getstring import GetStringDialog from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.notif import Task from quodlibet.qltk import Icons, ErrorMessage, WarningMessage from quodlibet.util import copool, connect_destroy, sanitize_tags, \ connect_obj, escape from quodlibet.util.i18n import numeric_phrase from quodlibet.util.path import uri_is_valid from quodlibet.util.string import decode, encode from quodlibet.util import print_w from quodlibet.qltk.views import AllTreeView from quodlibet.qltk.searchbar import SearchBarBox from quodlibet.qltk.completion import LibraryTagCompletion from quodlibet.qltk.x import MenuItem, Align, ScrolledWindow from quodlibet.qltk.x import SymbolicIconImage from quodlibet.qltk.menubutton import MenuButton from quodlibet.compat import text_type, iteritems, iterkeys STATION_LIST_URL = \ "https://bitbucket.org/lazka/quodlibet/downloads/radiolist.bz2" STATIONS_FAV = os.path.join(quodlibet.get_user_dir(), "stations") STATIONS_ALL = os.path.join(quodlibet.get_user_dir(), "stations_all") # TODO: - Do the update in a thread # - Ranking: reduce duplicate stations (max 3 URLs per station) # prefer stations that match a genre? # Migration path for pickle sys.modules["browsers.iradio"] = sys.modules[__name__] class IRFile(RemoteFile): multisong = True can_add = False format = "Radio Station" __CAN_CHANGE = "title artist grouping".split() def __get(self, base_call, key, *args, **kwargs): if key == "title" and "title" not in self and "organization" in self: return base_call("organization", *args, **kwargs) # split title by " - " if no artist tag is present and # this is not the main song: common format for shoutcast stations if not self.multisong and key in ("title", "artist") and \ "title" in self and "artist" not in self: title = base_call("title").split(" - ", 1) if len(title) > 1: return (key == "title" and title[-1]) or title[0] if key in ("artist", TAG_TO_SORT["artist"]) and \ not base_call(key, *args) and "website" in self: return base_call("website", *args) if key == "~format" and "audio-codec" in self: return "%s (%s)" % (self.format, base_call("audio-codec", *args, **kwargs)) return base_call(key, *args, **kwargs) def __call__(self, key, *args, **kwargs): base_call = super(IRFile, self).__call__ return self.__get(base_call, key, *args, **kwargs) def get(self, key, *args, **kwargs): base_call = super(IRFile, self).get return self.__get(base_call, key, *args, **kwargs) def write(self): pass def to_dump(self): # dump without title title = None if "title" in self: title = self["title"] del self["title"] dump = super(IRFile, self).to_dump() if title is not None: self["title"] = title # add all generated tags lines = dump.splitlines() for tag in ["title", "artist", "~format"]: value = self.get(tag) if value is not None: lines.append(encode(tag) + b"=" + encode(value)) return b"\n".join(lines) def can_change(self, k=None): if self.streamsong: if k is None: return [] else: return False else: if k is None: return self.__CAN_CHANGE else: return k in self.__CAN_CHANGE def ParsePLS(file): data = {} lines = file.readlines() if not lines or "[playlist]" not in lines.pop(0): return [] for line in lines: try: head, val = line.strip().split("=", 1) except (TypeError, ValueError): continue else: head = head.lower() if head.startswith("length") and val == "-1": continue else: data[head] = val.decode('utf-8', 'replace') count = 1 files = [] warnings = [] while True: if "file%d" % count in data: filename = data["file%d" % count].encode('utf-8', 'replace') if filename.lower()[-4:] in [".pls", ".m3u"]: warnings.append(filename) else: irf = IRFile(filename) for key in ["title", "genre", "artist"]: try: irf[key] = data["%s%d" % (key, count)] except KeyError: pass try: irf["~#length"] = int(data["length%d" % count]) except (KeyError, TypeError, ValueError): pass files.append(irf) else: break count += 1 if warnings: WarningMessage( None, _("Unsupported file type"), _("Station lists can only contain locations of stations, " "not other station lists or playlists. The following locations " "cannot be loaded:\n%s") % "\n ".join(map(util.escape, warnings)) ).run() return files def ParseM3U(fileobj): files = [] pending_title = None for line in fileobj: line = line.strip() if line.startswith("#EXTINF:"): try: pending_title = line.split(",", 1)[1] except IndexError: pending_title = None elif line.startswith("http"): irf = IRFile(line) if pending_title: irf["title"] = pending_title.decode('utf-8', 'replace') pending_title = None files.append(irf) return files def add_station(uri): """Fetches the URI content and extracts IRFiles Returns None in error, else a possibly filled list of stations""" irfs = [] if uri.lower().endswith(".pls") or uri.lower().endswith(".m3u"): try: sock = urlopen(uri) except EnvironmentError as err: err = text_type(err) print_d("Got %s from %s" % (uri, err)) ErrorMessage(None, _("Unable to add station"), escape(err)).run() return None if uri.lower().endswith(".pls"): irfs = ParsePLS(sock) elif uri.lower().endswith(".m3u"): irfs = ParseM3U(sock) sock.close() else: try: irfs = [IRFile(uri)] except ValueError as err: ErrorMessage(None, _("Unable to add station"), err).run() return irfs def download_taglist(callback, cofuncid, step=1024 * 10): """Generator for loading the bz2 compressed tag list. Calls callback with the decompressed data or None in case of an error.""" with Task(_("Internet Radio"), _("Downloading station list")) as task: if cofuncid: task.copool(cofuncid) try: response = urlopen(STATION_LIST_URL) except EnvironmentError: GLib.idle_add(callback, None) return try: size = int(response.info().get("content-length", 0)) except ValueError: size = 0 decomp = bz2.BZ2Decompressor() data = "" temp = "" read = 0 while temp or not data: read += len(temp) if size: task.update(float(read) / size) else: task.pulse() yield True try: data += decomp.decompress(temp) temp = response.read(step) except (IOError, EOFError): data = None break response.close() yield True stations = None if data: stations = parse_taglist(data) GLib.idle_add(callback, stations) def parse_taglist(data): """Parses a dump file like list of tags and returns a list of IRFiles uri=http://... tag=value1 tag2=value tag=value2 uri=http://... ... """ stations = [] station = None for l in data.split("\n"): key = l.split("=")[0] value = l.split("=", 1)[1] if key == "uri": if station: stations.append(station) station = IRFile(value) continue value = decode(value) san = sanitize_tags({key: value}, stream=True).items() if not san: continue key, value = san[0] if key == "~listenerpeak": key = "~#listenerpeak" value = int(value) if isinstance(value, bytes): value = value.decode("utf-8") if value not in station.list(key): station.add(key, value) else: station[key] = value if station: stations.append(station) return stations class AddNewStation(GetStringDialog): def __init__(self, parent): super(AddNewStation, self).__init__( parent, _("New Station"), _("Enter the location of an Internet radio station:"), button_label=_("_Add"), button_icon=Icons.LIST_ADD) def _verify_clipboard(self, text): # try to extract a URI from the clipboard for line in text.splitlines(): line = line.strip() if uri_is_valid(line): return line class GenreFilter(object): STAR = ["genre", "organization"] # This probably needs improvements GENRES = { "electronic": ( _("Electronic"), "|(electr,house,techno,trance,/trip.?hop/,&(drum,n,bass),chill," "dnb,minimal,/down(beat|tempo)/,&(dub,step))"), "rap": (_("Hip Hop / Rap"), "|(&(hip,hop),rap)"), "oldies": (_("Oldies"), "|(/[2-9]0\S?s/,oldies)"), "r&b": (_("R&B"), "/r(\&|n)b/"), "japanese": (_("Japanese"), "|(anime,jpop,japan,jrock)"), "indian": (_("Indian"), "|(bollywood,hindi,indian,bhangra)"), "religious": ( _("Religious"), "|(religious,christian,bible,gospel,spiritual,islam)"), "charts": (_("Charts"), "|(charts,hits,top)"), "turkish": (_("Turkish"), "|(turkish,turkce)"), "reggae": (_("Reggae / Dancehall"), "|(/reggae([^\w]|$)/,dancehall)"), "latin": (_("Latin"), "|(latin,salsa)"), "college": (_("College Radio"), "|(college,campus)"), "talk_news": (_("Talk / News"), "|(news,talk)"), "ambient": (_("Ambient"), "|(ambient,easy)"), "jazz": (_("Jazz"), "|(jazz,swing)"), "classical": (_("Classical"), "classic"), "pop": (_("Pop"), None), "alternative": (_("Alternative"), None), "metal": (_("Metal"), None), "country": (_("Country"), None), "news": (_("News"), None), "schlager": (_("Schlager"), None), "funk": (_("Funk"), None), "indie": (_("Indie"), None), "blues": (_("Blues"), None), "soul": (_("Soul"), None), "lounge": (_("Lounge"), None), "punk": (_("Punk"), None), "reggaeton": (_("Reggaeton"), None), "slavic": ( _("Slavic"), "|(narodna,albanian,manele,shqip,kosova)"), "greek": (_("Greek"), None), "gothic": (_("Gothic"), None), "rock": (_("Rock"), None), } # parsing all above takes 350ms on an atom, so only generate when needed __CACHE = {} def keys(self): return self.GENRES.keys() def query(self, key): if key not in self.__CACHE: text, filter_ = self.GENRES[key] if filter_ is None: filter_ = key self.__CACHE[key] = Query(filter_, star=self.STAR) return self.__CACHE[key] def text(self, key): return self.GENRES[key][0] class CloseButton(Gtk.Button): """Reimplementation of 3.10 close button for InfoBar.""" def __init__(self): image = Gtk.Image(visible=True, can_focus=False, icon_name="window-close-symbolic") super(CloseButton, self).__init__( visible=False, can_focus=True, image=image, relief=Gtk.ReliefStyle.NONE, valign=Gtk.Align.CENTER) ctx = self.get_style_context() ctx.add_class("raised") ctx.add_class("close") class QuestionBar(Gtk.InfoBar): """A widget which suggest to download the radio list if no radio stations are present. Connect to Gtk.InfoBar::response and check for RESPONSE_LOAD as response id. """ RESPONSE_LOAD = 1 def __init__(self): super(QuestionBar, self).__init__() self.connect("response", self.__response) self.set_message_type(Gtk.MessageType.QUESTION) label = Gtk.Label(label=_( "Would you like to load a list of popular radio stations?")) label.set_line_wrap(True) label.show() content = self.get_content_area() content.add(label) self.add_button(_("_Load Stations"), self.RESPONSE_LOAD) self.set_show_close_button(True) def __response(self, bar, response_id): if response_id == Gtk.ResponseType.CLOSE: bar.hide() class InternetRadio(Browser, util.InstanceTracker): __stations = None __fav_stations = None __librarian = None __filter = None name = _("Internet Radio") accelerated_name = _("_Internet Radio") keys = ["InternetRadio"] priority = 16 uses_main_library = False headers = "title artist ~people grouping genre website ~format " \ "channel-mode".split() TYPE, ICON_NAME, KEY, NAME = range(4) TYPE_FILTER, TYPE_ALL, TYPE_FAV, TYPE_SEP, TYPE_NOCAT = range(5) STAR = ["artist", "title", "website", "genre", "comment"] @classmethod def _init(klass, library): klass.__librarian = library.librarian klass.__stations = SongLibrary("iradio-remote") klass.__stations.load(STATIONS_ALL) klass.__fav_stations = SongLibrary("iradio") klass.__fav_stations.load(STATIONS_FAV) klass.filters = GenreFilter() @classmethod def _destroy(klass): if klass.__stations.dirty: klass.__stations.save() klass.__stations.destroy() klass.__stations = None if klass.__fav_stations.dirty: klass.__fav_stations.save() klass.__fav_stations.destroy() klass.__fav_stations = None klass.__librarian = None klass.filters = None def __inhibit(self): self.view.get_selection().handler_block(self.__changed_sig) def __uninhibit(self): self.view.get_selection().handler_unblock(self.__changed_sig) def __destroy(self, *args): if not self.instances(): self._destroy() def __init__(self, library): super(InternetRadio, self).__init__(spacing=12) self.set_orientation(Gtk.Orientation.VERTICAL) if not self.instances(): self._init(library) self._register_instance() self.connect('destroy', self.__destroy) completion = LibraryTagCompletion(self.__stations) self.accelerators = Gtk.AccelGroup() self.__searchbar = search = SearchBarBox(completion=completion, accel_group=self.accelerators) search.connect('query-changed', self.__filter_changed) menu = Gtk.Menu() new_item = MenuItem(_(u"_New Station…"), Icons.LIST_ADD) new_item.connect('activate', self.__add) menu.append(new_item) update_item = MenuItem(_("_Update Stations"), Icons.VIEW_REFRESH) update_item.connect('activate', self.__update) menu.append(update_item) menu.show_all() button = MenuButton( SymbolicIconImage(Icons.EMBLEM_SYSTEM, Gtk.IconSize.MENU), arrow=True) button.set_menu(menu) def focus(widget, *args): qltk.get_top_parent(widget).songlist.grab_focus() search.connect('focus-out', focus) # treeview scrolled_window = ScrolledWindow() scrolled_window.show() scrolled_window.set_shadow_type(Gtk.ShadowType.IN) self.view = view = AllTreeView() view.show() view.set_headers_visible(False) scrolled_window.set_policy( Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scrolled_window.add(view) model = Gtk.ListStore(int, str, str, str) model.append(row=[self.TYPE_ALL, Icons.FOLDER, "__all", _("All Stations")]) model.append(row=[self.TYPE_SEP, Icons.FOLDER, "", ""]) #Translators: Favorite radio stations model.append(row=[self.TYPE_FAV, Icons.FOLDER, "__fav", _("Favorites")]) model.append(row=[self.TYPE_SEP, Icons.FOLDER, "", ""]) filters = self.filters for text, k in sorted([(filters.text(k), k) for k in filters.keys()]): model.append(row=[self.TYPE_FILTER, Icons.EDIT_FIND, k, text]) model.append(row=[self.TYPE_NOCAT, Icons.FOLDER, "nocat", _("No Category")]) def separator(model, iter, data): return model[iter][self.TYPE] == self.TYPE_SEP view.set_row_separator_func(separator, None) def search_func(model, column, key, iter, data): return key.lower() not in model[iter][column].lower() view.set_search_column(self.NAME) view.set_search_equal_func(search_func, None) column = Gtk.TreeViewColumn("genres") column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) renderpb = Gtk.CellRendererPixbuf() renderpb.props.xpad = 3 column.pack_start(renderpb, False) column.add_attribute(renderpb, "icon-name", self.ICON_NAME) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) view.append_column(column) column.pack_start(render, True) column.add_attribute(render, "text", self.NAME) view.set_model(model) # selection selection = view.get_selection() selection.set_mode(Gtk.SelectionMode.MULTIPLE) self.__changed_sig = connect_destroy(selection, 'changed', util.DeferredSignal(lambda x: self.activate())) box = Gtk.HBox(spacing=6) box.pack_start(search, True, True, 0) box.pack_start(button, False, True, 0) self._searchbox = Align(box, left=0, right=6, top=6) self._searchbox.show_all() def qbar_response(infobar, response_id): if response_id == infobar.RESPONSE_LOAD: self.__update() self.qbar = QuestionBar() self.qbar.connect("response", qbar_response) if self._is_library_empty(): self.qbar.show() pane = qltk.ConfigRHPaned("browsers", "internetradio_pos", 0.4) pane.show() pane.pack1(scrolled_window, resize=False, shrink=False) songbox = Gtk.VBox(spacing=6) songbox.pack_start(self._searchbox, False, True, 0) self._songpane_container = Gtk.VBox() self._songpane_container.show() songbox.pack_start(self._songpane_container, True, True, 0) songbox.pack_start(self.qbar, False, True, 0) songbox.show() pane.pack2(songbox, resize=True, shrink=False) self.pack_start(pane, True, True, 0) self.show() def _is_library_empty(self): return not len(self.__stations) and not len(self.__fav_stations) def pack(self, songpane): container = Gtk.VBox() container.add(self) self._songpane_container.add(songpane) return container def unpack(self, container, songpane): self._songpane_container.remove(songpane) container.remove(self) def __update(self, *args): self.qbar.hide() copool.add(download_taglist, self.__update_done, cofuncid="radio-load", funcid="radio-load") def __update_done(self, stations): if not stations: print_w("Loading remote station list failed.") return # filter stations based on quality, listenercount def filter_stations(station): peak = station.get("~#listenerpeak", 0) if peak < 10: return False aac = "AAC" in station("~format") bitrate = station("~#bitrate", 50) if (aac and bitrate < 40) or (not aac and bitrate < 60): return False return True stations = filter(filter_stations, stations) # group them based on the title groups = {} for s in stations: key = s("~title~artist") groups.setdefault(key, []).append(s) # keep at most 2 URLs for each group stations = [] for key, sub in iteritems(groups): sub.sort(key=lambda s: s.get("~#listenerpeak", 0), reverse=True) stations.extend(sub[:2]) # only keep the ones in at least one category all_ = [self.filters.query(k) for k in self.filters.keys()] assert all_ anycat_filter = reduce(lambda x, y: x | y, all_) stations = filter(anycat_filter.search, stations) # remove listenerpeak for s in stations: s.pop("~#listenerpeak", None) # update the libraries stations = dict(((s.key, s) for s in stations)) # don't add ones that are in the fav list for fav in iterkeys(self.__fav_stations): stations.pop(fav, None) # separate o, n = set(iterkeys(self.__stations)), set(stations) to_add, to_change, to_remove = n - o, o & n, o - n del o, n # migrate stats to_change = [stations.pop(k) for k in to_change] for new in to_change: old = self.__stations[new.key] # clear everything except stats AudioFile.reload(old) # add new metadata except stats for k in (x for x in iterkeys(new) if x not in MIGRATE): old[k] = new[k] to_add = [stations.pop(k) for k in to_add] to_remove = [self.__stations[k] for k in to_remove] self.__stations.remove(to_remove) self.__stations.changed(to_change) self.__stations.add(to_add) def __filter_changed(self, bar, text, restore=False): self.__filter = Query(text, self.STAR) if not restore: self.activate() def __get_selected_libraries(self): """Returns the libraries to search in depending on the filter selection""" selection = self.view.get_selection() model, rows = selection.get_selected_rows() types = [model[row][self.TYPE] for row in rows] libs = [self.__fav_stations] if types != [self.TYPE_FAV]: libs.append(self.__stations) return libs def __get_selection_filter(self): """Retuns a filter object for the current selection or None if nothing should be filtered""" selection = self.view.get_selection() model, rows = selection.get_selected_rows() filter_ = None for row in rows: type_ = model[row][self.TYPE] if type_ == self.TYPE_FILTER: key = model[row][self.KEY] current_filter = self.filters.query(key) if current_filter: if filter_: filter_ |= current_filter else: filter_ = current_filter elif type_ == self.TYPE_NOCAT: # if notcat is selected, combine all filters, negate and merge all_ = [self.filters.query(k) for k in self.filters.keys()] nocat_filter = all_ and -reduce(lambda x, y: x | y, all_) if nocat_filter: if filter_: filter_ |= nocat_filter else: filter_ = nocat_filter elif type_ == self.TYPE_ALL: filter_ = None break return filter_ def __add_fav(self, songs): songs = [s for s in songs if s in self.__stations] type(self).__librarian.move( songs, self.__stations, self.__fav_stations) def __remove_fav(self, songs): songs = [s for s in songs if s in self.__fav_stations] type(self).__librarian.move( songs, self.__fav_stations, self.__stations) def __add(self, button): parent = qltk.get_top_parent(self) uri = (AddNewStation(parent).run(clipboard=True) or "").strip() if uri != "": self.__add_station(uri) def __add_station(self, uri): irfs = add_station(uri) if irfs is None: # Error, rather than empty list return if not irfs: ErrorMessage( None, _("No stations found"), _("No Internet radio stations were found at %s.") % util.escape(uri)).run() return irfs = set(irfs) - set(self.__fav_stations) if not irfs: WarningMessage( None, _("Unable to add station"), _("All stations listed are already in your library.")).run() if irfs: self.__fav_stations.add(irfs) def Menu(self, songs, library, items): in_fav = False in_all = False for song in songs: if song in self.__fav_stations: in_fav = True elif song in self.__stations: in_all = True if in_fav and in_all: break iradio_items = [] button = MenuItem(_("Add to Favorites"), Icons.LIST_ADD) button.set_sensitive(in_all) connect_obj(button, 'activate', self.__add_fav, songs) iradio_items.append(button) button = MenuItem(_("Remove from Favorites"), Icons.LIST_REMOVE) button.set_sensitive(in_fav) connect_obj(button, 'activate', self.__remove_fav, songs) iradio_items.append(button) items.append(iradio_items) menu = SongsMenu(self.__librarian, songs, playlists=False, remove=True, queue=False, devices=False, items=items) return menu def restore(self): text = config.gettext("browsers", "query_text") self.__searchbar.set_text(text) if Query.is_parsable(text): self.__filter_changed(self.__searchbar, text, restore=True) keys = config.get("browsers", "radio").splitlines() def select_func(row): return row[self.TYPE] != self.TYPE_SEP and row[self.KEY] in keys self.__inhibit() view = self.view if not view.select_by_func(select_func): for row in view.get_model(): if row[self.TYPE] == self.TYPE_FAV: view.set_cursor(row.path) break self.__uninhibit() def __get_filter(self): filter_ = self.__get_selection_filter() text_filter = self.__filter or Query("") if filter_: filter_ &= text_filter else: filter_ = text_filter return filter_ def can_filter_text(self): return True def filter_text(self, text): self.__searchbar.set_text(text) if Query.is_parsable(text): self.__filter_changed(self.__searchbar, text) self.activate() def get_filter_text(self): return self.__searchbar.get_text() def activate(self): filter_ = self.__get_filter() libs = self.__get_selected_libraries() songs = filter_.filter(itertools.chain(*libs)) self.songs_selected(songs) def active_filter(self, song): for lib in self.__get_selected_libraries(): if song in lib: break else: return False filter_ = self.__get_filter() if filter_: return filter_.search(song) return True def save(self): text = self.__searchbar.get_text() config.settext("browsers", "query_text", text) selection = self.view.get_selection() model, rows = selection.get_selected_rows() names = filter(None, [model[row][self.KEY] for row in rows]) config.set("browsers", "radio", "\n".join(names)) def scroll(self, song): # nothing we care about if song not in self.__stations and song not in self.__fav_stations: return path = None for row in self.view.get_model(): if row[self.TYPE] == self.TYPE_FILTER: if self.filters.query(row[self.KEY]).search(song): path = row.path break else: # in case nothing matches, select all path = (0,) self.view.set_cursor(path) self.view.scroll_to_cell(path, use_align=True, row_align=0.5) def status_text(self, count, time=None): return numeric_phrase("%(count)d station", "%(count)d stations", count, 'count') from quodlibet import app if not app.player or app.player.can_play_uri("http://"): browsers = [InternetRadio] else: browsers = [] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/audiofeeds.py����������������������������������������������������0000644�0001750�0001750�00000043610�13112005742�022261� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import threading import time from gi.repository import Gtk, GLib, Pango, Gdk import feedparser import quodlibet from quodlibet import _ from quodlibet import config from quodlibet import formats from quodlibet import print_d from quodlibet import qltk from quodlibet import util from quodlibet import app from quodlibet.browsers import Browser from quodlibet.compat import listfilter, text_type, build_opener, PY2 from quodlibet.formats import AudioFile from quodlibet.formats.remote import RemoteFile from quodlibet.qltk.downloader import DownloadWindow from quodlibet.qltk.getstring import GetStringDialog from quodlibet.qltk.msg import ErrorMessage from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.views import AllTreeView from quodlibet.qltk import Icons from quodlibet.util import connect_obj, print_w from quodlibet.qltk.x import ScrolledWindow, Align, Button, MenuItem from quodlibet.qltk.chooser import choose_target_file, choose_target_folder from quodlibet.util.picklehelper import pickle_load, pickle_dump, PickleError FEEDS = os.path.join(quodlibet.get_user_dir(), "feeds") DND_URI_LIST, DND_MOZ_URL = range(2) # Migration path for pickle sys.modules["browsers.audiofeeds"] = sys.modules[__name__] class InvalidFeed(ValueError): pass class Feed(list): def __init__(self, uri): self.name = _("Unknown") self.uri = uri self.changed = False self.website = "" self.__lastgot = 0 def get_age(self): return time.time() - self.__lastgot @staticmethod def __fill_af(feed, af): try: af["title"] = feed.title or _("Unknown") except: af["title"] = _("Unknown") try: af["date"] = "%04d-%02d-%02d" % feed.modified_parsed[:3] except (AttributeError, TypeError): pass for songkey, feedkey in [ ("website", "link"), ("description", "tagline"), ("language", "language"), ("copyright", "copyright"), ("organization", "publisher"), ("license", "license")]: try: value = getattr(feed, feedkey) except: pass else: if value and value not in af.list(songkey): af.add(songkey, value) try: author = feed.author_detail except AttributeError: try: author = feed.author except AttributeError: pass else: if author and author not in af.list("artist"): af.add('artist', author) else: try: if author.email and author.email not in af.list("contact"): af.add("contact", author.email) except AttributeError: pass try: if author.name and author.name not in af.list("artist"): af.add("artist", author.name) except AttributeError: pass try: values = feed.contributors except AttributeError: pass else: for value in values: try: value = value.name except AttributeError: pass else: if value and value not in af.list("performer"): af.add("performer", value) try: af["~#length"] = util.parse_time(feed.itunes_duration) except (AttributeError, ValueError): pass try: values = dict(feed.categories).values() except AttributeError: pass else: for value in values: if value and value not in af.list("genre"): af.add("genre", value) def parse(self): try: if not self._check_feed(): return False doc = feedparser.parse(self.uri) except Exception as e: print_w("Couldn't parse feed: %s (%s)" % (self.uri, e)) return False try: album = doc.channel.title except AttributeError: print_w("No channel title in %s" % doc) return False if album: self.name = album else: self.name = _("Unknown") defaults = AudioFile({"feed": self.uri}) try: self.__fill_af(doc.channel, defaults) except: return False entries = [] uris = set() print_d("Found %d entries in channel" % len(doc.entries)) for entry in doc.entries: try: for enclosure in entry.enclosures: try: if ("audio" in enclosure.type or "ogg" in enclosure.type or formats.filter(enclosure.url)): uri = enclosure.url if not isinstance(uri, text_type): uri = uri.decode('utf-8') try: size = float(enclosure.length) except AttributeError: size = 0 entries.append((uri, entry, size)) uris.add(uri) break except AttributeError: pass except AttributeError: print_d("No enclosures found in %s" % entry) for entry in list(self): if entry["~uri"] not in uris: self.remove(entry) else: uris.remove(entry["~uri"]) print_d("Successfully got %d episodes in channel" % len(entries)) entries.reverse() for uri, entry, size in entries: if uri in uris: song = RemoteFile(uri) song["~#size"] = size song.fill_metadata = False song.update(defaults) song["album"] = self.name try: self.__fill_af(entry, song) except Exception as e: print_d("Couldn't convert %s to AudioFile (%s)" % (uri, e)) else: self.insert(0, song) self.__lastgot = time.time() return bool(uris) def _check_feed(self): """Validate stream a bit - failing fast where possible. Constructs an equivalent(ish) HEAD request, without re-writing feedparser completely. (it never times out if reading from a stream - see #2257)""" req = feedparser._build_urllib2_request( self.uri, feedparser.USER_AGENT, None, None, None, None, {}) req.method = "HEAD" opener = build_opener(feedparser._FeedURLHandler()) try: result = opener.open(req) ct_hdr = result.headers.get('Content-Type', "Unknown type") content_type = ct_hdr.split(';')[0] status = result.code if PY2 else result.status print_d("Pre-check: %s returned %s with content type '%s'" % (self.uri, status, content_type)) if content_type not in feedparser.ACCEPT_HEADER: print_w("Unusable content: %s. Perhaps %s is not a feed?" % (content_type, self.uri)) return False # No real need to check HTTP Status - errors are very unlikely # to be a usable content type, and we should always try to parse finally: opener.close() return True class AddFeedDialog(GetStringDialog): def __init__(self, parent): super(AddFeedDialog, self).__init__( qltk.get_top_parent(parent), _("New Feed"), _("Enter the location of an audio feed:"), button_label=_("_Add"), button_icon=Icons.LIST_ADD) def run(self, text='', test=False): uri = super(AddFeedDialog, self).run(text=text, test=test) if uri: if not isinstance(uri, text_type): uri = uri.decode('utf-8') return Feed(uri) return None class AudioFeeds(Browser): __feeds = Gtk.ListStore(object) # unread headers = ("title artist performer ~people album date website language " "copyright organization license contact").split() name = _("Audio Feeds") accelerated_name = _("_Audio Feeds") keys = ["AudioFeeds"] priority = 20 uses_main_library = False def pack(self, songpane): container = qltk.ConfigRHPaned("browsers", "audiofeeds_pos", 0.4) self.show() container.pack1(self, True, False) container.pack2(songpane, True, False) return container def unpack(self, container, songpane): container.remove(songpane) container.remove(self) @staticmethod def cell_data(col, render, model, iter, data): if model[iter][0].changed: render.markup = "<b>%s</b>" % util.escape(model[iter][0].name) else: render.markup = util.escape(model[iter][0].name) render.set_property('markup', render.markup) @classmethod def changed(klass, feeds): for row in klass.__feeds: if row[0] in feeds: row[0].changed = True row[0] = row[0] AudioFeeds.write() @classmethod def write(klass): feeds = [row[0] for row in klass.__feeds] with open(FEEDS, "wb") as f: pickle_dump(feeds, f, 2) @classmethod def init(klass, library): uris = set() try: with open(FEEDS, "rb") as fileobj: feeds = pickle_load(fileobj) except (PickleError, EnvironmentError): pass else: for feed in feeds: if feed.uri in uris: continue klass.__feeds.append(row=[feed]) uris.add(feed.uri) GLib.idle_add(klass.__do_check) @classmethod def reload(klass, library): klass.__feeds = Gtk.ListStore(object) # unread klass.init(library) @classmethod def __do_check(klass): thread = threading.Thread(target=klass.__check, args=()) thread.setDaemon(True) thread.start() @classmethod def __check(klass): for row in klass.__feeds: feed = row[0] if feed.get_age() < 2 * 60 * 60: continue elif feed.parse(): feed.changed = True row[0] = feed klass.write() GLib.timeout_add(60 * 60 * 1000, klass.__do_check) def Menu(self, songs, library, items): if len(songs) == 1: item = qltk.MenuItem(_(u"_Download…"), Icons.NETWORK_WORKGROUP) item.connect('activate', self.__download, songs[0]("~uri")) item.set_sensitive(not songs[0].is_file) else: uris = [song("~uri") for song in songs if not song.is_file] item = qltk.MenuItem(_(u"_Download…"), Icons.NETWORK_WORKGROUP) item.connect('activate', self.__download_many, uris) item.set_sensitive(bool(uris)) items.append([item]) menu = SongsMenu(library, songs, items=items) return menu def __download_many(self, activator, sources): target = choose_target_folder(self, _("Download Files"), _("_Save")) if target is not None: for i, source in enumerate(sources): base = os.path.basename(source) if not base: base = ("file%d" % i) + ( os.path.splitext(source)[1] or ".audio") fulltarget = os.path.join(target, base) DownloadWindow.download(source, fulltarget, self) def __download(self, activator, source): name = os.path.basename(source) target = choose_target_file(self, _("Download File"), _("_Save"), name) if target is not None: DownloadWindow.download(source, target, self) def __init__(self, library): super(AudioFeeds, self).__init__(spacing=6) self.set_orientation(Gtk.Orientation.VERTICAL) self.__view = view = AllTreeView() self.__render = render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) col = Gtk.TreeViewColumn("Audio Feeds", render) col.set_cell_data_func(render, AudioFeeds.cell_data) view.append_column(col) view.set_model(self.__feeds) view.set_rules_hint(True) view.set_headers_visible(False) swin = ScrolledWindow() swin.set_shadow_type(Gtk.ShadowType.IN) swin.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) swin.add(view) self.pack_start(swin, True, True, 0) new = Button(_("_New"), Icons.LIST_ADD, Gtk.IconSize.MENU) new.connect('clicked', self.__new_feed) view.get_selection().connect('changed', self.__changed) view.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) view.connect('popup-menu', self.__popup_menu) targets = [ ("text/uri-list", 0, DND_URI_LIST), ("text/x-moz-url", 0, DND_MOZ_URL) ] targets = [Gtk.TargetEntry.new(*t) for t in targets] view.drag_dest_set(Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY) view.connect('drag-data-received', self.__drag_data_received) view.connect('drag-motion', self.__drag_motion) view.connect('drag-leave', self.__drag_leave) connect_obj(self, 'destroy', self.__save, view) self.pack_start(Align(new, left=3, bottom=3), False, True, 0) for child in self.get_children(): child.show_all() def __drag_motion(self, view, ctx, x, y, time): targets = [t.name() for t in ctx.list_targets()] if "text/x-quodlibet-songs" not in targets: view.get_parent().drag_highlight() return True return False def __drag_leave(self, view, ctx, time): view.get_parent().drag_unhighlight() def __drag_data_received(self, view, ctx, x, y, sel, tid, etime): view.emit_stop_by_name('drag-data-received') targets = [ ("text/uri-list", 0, DND_URI_LIST), ("text/x-moz-url", 0, DND_MOZ_URL) ] targets = [Gtk.TargetEntry.new(*t) for t in targets] view.drag_dest_set(Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY) if tid == DND_URI_LIST: uri = sel.get_uris()[0] elif tid == DND_MOZ_URL: uri = sel.data.decode('utf16', 'replace').split('\n')[0] else: ctx.finish(False, False, etime) return ctx.finish(True, False, etime) feed = Feed(uri.encode("ascii", "replace")) feed.changed = feed.parse() if feed: self.__feeds.append(row=[feed]) AudioFeeds.write() else: ErrorMessage( self, _("Unable to add feed"), _("%s could not be added. The server may be down, " "or the location may not be an audio feed.") % util.bold(util.escape(feed.uri))).run() def __popup_menu(self, view): model, paths = view.get_selection().get_selected_rows() menu = Gtk.Menu() refresh = MenuItem(_("_Refresh"), Icons.VIEW_REFRESH) delete = MenuItem(_("_Delete"), Icons.EDIT_DELETE) connect_obj(refresh, 'activate', self.__refresh, [model[p][0] for p in paths]) connect_obj(delete, 'activate', self.__remove_paths, model, paths) menu.append(refresh) menu.append(delete) menu.show_all() menu.connect('selection-done', lambda m: m.destroy()) # XXX: keep the menu around self.__menu = menu return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __save(self, view): AudioFeeds.write() def __refresh(self, feeds): changed = listfilter(Feed.parse, feeds) AudioFeeds.changed(changed) def __remove_paths(self, model, paths): for path in paths: model.remove(model.get_iter(path)) def activate(self): self.__changed(self.__view.get_selection()) def __changed(self, selection): model, paths = selection.get_selected_rows() if model and paths: songs = [] for path in paths: model[path][0].changed = False songs.extend(model[path][0]) self.songs_selected(songs, True) config.set("browsers", "audiofeeds", "\t".join([model[path][0].name for path in paths])) def __new_feed(self, activator): feed = AddFeedDialog(self).run() if feed is not None: feed.changed = feed.parse() if feed: self.__feeds.append(row=[feed]) AudioFeeds.write() else: ErrorMessage( self, _("Unable to add feed"), _("%s could not be added. The server may be down, " "or the location may not be an audio feed.") % util.bold(util.escape(feed.uri))).run() def restore(self): try: names = config.get("browsers", "audiofeeds").split("\t") except: pass else: self.__view.select_by_func(lambda r: r[0].name in names) browsers = [] if not app.player or app.player.can_play_uri("http://"): browsers = [AudioFeeds] else: print_w(_("The current audio backend does not support URLs, " "Audio Feeds browser disabled.")) ������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/albums/����������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021054� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/albums/prefs.py��������������������������������������������������0000644�0001750�0001750�00000006555�13112005742�022562� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2007 Joe Wreschnig, Michael Urman, Iñigo Serna # 2009-2010 Steven Robertson # 2012,2013,2016 Nick Boultbee # 2009-2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import config from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.browsers._base import FakeDisplayItem, EditDisplayPatternMixin from quodlibet.formats import PEOPLE from quodlibet.qltk import Button, Icons from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.util import format_rating from quodlibet.util.i18n import numeric_phrase PEOPLE _SOME_PEOPLE = "\n".join([util.tag("artist"), util.tag("performer"), util.tag("composer"), util.tag("arranger"), ]) _EMPTY = _("Songs not in an album") DEFAULT_PATTERN_TEXT = """[b]<album|<album>|%s>[/b]<date| (<date>)> [small]<~discs|<~discs> - ><~tracks> - <~long-length>[/small] <~people>""" % _EMPTY class Preferences(qltk.UniqueWindow, EditDisplayPatternMixin): _DEFAULT_PATTERN = DEFAULT_PATTERN_TEXT _PREVIEW_ITEM = FakeDisplayItem({ "date": "2010-10-31", "~length": util.format_time_display(6319), "~long-length": util.format_time_long(6319), "~tracks": numeric_phrase("%d track", "%d tracks", 5), "~discs": numeric_phrase("%d disc", "%d discs", 2), "~#rating": 0.75, "album": _("An Example Album"), "~people": _SOME_PEOPLE + "..."}) def __init__(self, browser): if self.is_not_unique(): return super(Preferences, self).__init__() self.set_border_width(12) self.set_title(_("Album List Preferences")) self.set_default_size(420, 380) self.set_transient_for(qltk.get_top_parent(browser)) # Do this config-driven setup at instance-time self._PREVIEW_ITEM["~rating"] = format_rating(0.75) box = Gtk.VBox(spacing=6) vbox = Gtk.VBox(spacing=6) cb = ConfigCheckButton( _("Show album _covers"), "browsers", "album_covers") cb.set_active(config.getboolean("browsers", "album_covers")) cb.connect('toggled', lambda s: browser.toggle_covers()) vbox.pack_start(cb, False, True, 0) cb = ConfigCheckButton( _("Inline _search includes people"), "browsers", "album_substrings") cb.set_active(config.getboolean("browsers", "album_substrings")) vbox.pack_start(cb, False, True, 0) f = qltk.Frame(_("Options"), child=vbox) box.pack_start(f, False, True, 12) display_frame = self.edit_display_pane(browser, _("Album Display")) box.pack_start(display_frame, True, True, 0) main_box = Gtk.VBox(spacing=12) close = Button(_("_Close"), Icons.WINDOW_CLOSE) close.connect('clicked', lambda *x: self.destroy()) b = Gtk.HButtonBox() b.set_layout(Gtk.ButtonBoxStyle.END) b.pack_start(close, True, True, 0) main_box.pack_start(box, True, True, 0) self.use_header_bar() if not self.has_close_button(): main_box.pack_start(b, False, True, 0) self.add(main_box) close.grab_focus() self.show_all() ���������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/albums/__init__.py�����������������������������������������������0000644�0001750�0001750�00000000570�13112005742�023171� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import from .main import AlbumList, AlbumTagCompletion AlbumTagCompletion browsers = [AlbumList] ����������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/albums/models.py�������������������������������������������������0000644�0001750�0001750�00000010063�13112005742�022713� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import app from quodlibet import config from quodlibet.qltk.models import ObjectStore, ObjectModelFilter from quodlibet.qltk.models import ObjectModelSort from quodlibet.compat import itervalues class AlbumItem(object): cover = None scanned = False def __init__(self, album): self.album = album @property def COVER_SIZE(self): size = config.getint("browsers", "cover_size") if size <= 0: size = 48 return size def scan_cover(self, force=False, scale_factor=1, callback=None, cancel=None): if (self.scanned and not force) or not self.album or \ not self.album.songs: return self.scanned = True def set_cover_cb(pixbuf): self.cover = pixbuf callback() s = self.COVER_SIZE * scale_factor app.cover_manager.get_pixbuf_many_async( self.album.songs, s, s, cancel, set_cover_cb) def __repr__(self): return repr(self.album) class AlbumModelMixin(object): def get_items(self, paths): items = [] for path in paths: item = self.get_value(self.get_iter(path)) if item.album is None: return [i for i in self.itervalues() if i.album is not None] items.append(item) return items def get_albums(self, paths): return [i.album for i in self.get_items(paths)] def get_album(self, iter_): return self.get_value(iter_, 0).album class AlbumModel(ObjectStore, AlbumModelMixin): def __init__(self, library): super(AlbumModel, self).__init__() self.__library = library albums = library.albums self.__sigs = [ albums.connect("added", self._add_albums), albums.connect("removed", self._remove_albums), albums.connect("changed", self._change_albums) ] self.append(row=[AlbumItem(None)]) self.append_many((AlbumItem(a) for a in itervalues(albums))) def refresh_all(self): """Trigger redraws for all rows""" for iter_, value in self.iterrows(): self.row_changed(self.get_path(iter_), iter_) def destroy(self): library = self.__library for sig in self.__sigs: library.albums.disconnect(sig) self.__library = None self.clear() def _update_all(self): if not self.is_empty(): row = self[0] self.row_changed(row.path, row.iter) def _add_albums(self, library, added): self.append_many((AlbumItem(a) for a in added)) self._update_all() def _remove_albums(self, library, removed): removed_albums = removed.copy() iters_remove = [] for iter_, item in self.iterrows(): album = item.album if album is not None and album in removed_albums: removed_albums.remove(album) iters_remove.append(iter_) if not removed_albums: break for iter_ in iters_remove: self.remove(iter_) self._update_all() def _change_albums(self, library, changed): """Trigger a row redraw for each album that changed""" changed_albums = changed.copy() for iter_, item in self.iterrows(): album = item.album if album is not None and album in changed_albums: changed_albums.remove(album) self.row_changed(self.get_path(iter_), iter_) if not changed_albums: break class AlbumFilterModel(ObjectModelFilter, AlbumModelMixin): def contains_all(self, paths): values = (self.get_value(self.get_iter(p), 0).album for p in paths) return None in values class AlbumSortModel(ObjectModelSort, AlbumModelMixin): pass �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/browsers/albums/main.py���������������������������������������������������0000644�0001750�0001750�00000064470�13112005742�022367� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2007 Joe Wreschnig, Michael Urman, Iñigo Serna # 2009-2010 Steven Robertson # 2012,2013,2016 Nick Boultbee # 2009-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import import os from gi.repository import Gtk, Pango, Gdk, GLib, Gio from quodlibet.util.i18n import numeric_phrase from .prefs import Preferences, DEFAULT_PATTERN_TEXT from .models import AlbumModel, AlbumFilterModel, AlbumSortModel, AlbumItem import quodlibet from quodlibet import app from quodlibet import ngettext from quodlibet import config from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.browsers import Browser from quodlibet.query import Query from quodlibet.browsers._base import DisplayPatternMixin from quodlibet.qltk.completion import EntryWordCompletion from quodlibet.qltk.information import Information from quodlibet.qltk.properties import SongProperties from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.views import AllTreeView from quodlibet.qltk.x import MenuItem, Align, ScrolledWindow, RadioMenuItem from quodlibet.qltk.x import SymbolicIconImage from quodlibet.qltk.searchbar import SearchBarBox from quodlibet.qltk.menubutton import MenuButton from quodlibet.qltk import Icons from quodlibet.util import copool, connect_destroy from quodlibet.util.library import background_filter from quodlibet.util import connect_obj, DeferredSignal, gdecode from quodlibet.qltk.cover import get_no_cover_pixbuf from quodlibet.qltk.image import add_border_widget, get_surface_for_pixbuf from quodlibet.compat import cmp def get_cover_size(): return AlbumItem(None).COVER_SIZE class AlbumTagCompletion(EntryWordCompletion): def __init__(self): super(AlbumTagCompletion, self).__init__() try: model = self.__model except AttributeError: model = type(self).__model = Gtk.ListStore(str) self.__refreshmodel() self.set_model(model) self.set_text_column(0) def __refreshmodel(self, *args): for tag in ["title", "album", "date", "people", "artist", "genre"]: self.__model.append(row=[tag]) for tag in ["tracks", "discs", "length", "date"]: self.__model.append(row=["#(" + tag]) for tag in ["rating", "playcount", "skipcount"]: for suffix in ["avg", "max", "min", "sum"]: self.__model.append(row=["#(%s:%s" % (tag, suffix)]) def cmpa(a, b): """Like cmp but treats values that evaluate to false as inf""" if not a and b: return 1 if not b and a: return -1 return cmp(a, b) def compare_title(a1, a2): a1, a2 = a1.album, a2.album # All albums should stay at the top if a1 is None: return -1 if a2 is None: return 1 # Move albums without a title to the bottom if not a1.title: return 1 if not a2.title: return -1 return (cmpa(a1.sort, a2.sort) or cmp(a1.key, a2.key)) def compare_artist(a1, a2): a1, a2 = a1.album, a2.album if a1 is None: return -1 if a2 is None: return 1 if not a1.title: return 1 if not a2.title: return -1 return (cmpa(a1.peoplesort, a2.peoplesort) or cmpa(a1.date, a2.date) or cmpa(a1.sort, a2.sort) or cmp(a1.key, a2.key)) def compare_date(a1, a2): a1, a2 = a1.album, a2.album if a1 is None: return -1 if a2 is None: return 1 if not a1.title: return 1 if not a2.title: return -1 return (cmpa(a1.date, a2.date) or cmpa(a1.sort, a2.sort) or cmp(a1.key, a2.key)) def compare_genre(a1, a2): a1, a2 = a1.album, a2.album if a1 is None: return -1 if a2 is None: return 1 if not a1.title: return 1 if not a2.title: return -1 return (cmpa(a1.genre, a2.genre) or cmpa(a1.peoplesort, a2.peoplesort) or cmpa(a1.date, a2.date) or cmpa(a1.sort, a2.sort) or cmp(a1.key, a2.key)) def compare_rating(a1, a2): a1, a2 = a1.album, a2.album if a1 is None: return -1 if a2 is None: return 1 if not a1.title: return 1 if not a2.title: return -1 return (-cmp(a1("~#rating"), a2("~#rating")) or cmpa(a1.date, a2.date) or cmpa(a1.sort, a2.sort) or cmp(a1.key, a2.key)) class PreferencesButton(Gtk.HBox): def __init__(self, browser, model): super(PreferencesButton, self).__init__() sort_orders = [ (_("_Title"), self.__compare_title), (_("_Artist"), self.__compare_artist), (_("_Date"), self.__compare_date), (_("_Genre"), self.__compare_genre), (_("_Rating"), self.__compare_rating), ] menu = Gtk.Menu() sort_item = Gtk.MenuItem( label=_(u"Sort _by…"), use_underline=True) sort_menu = Gtk.Menu() active = config.getint('browsers', 'album_sort', 1) item = None for i, (label, func) in enumerate(sort_orders): item = RadioMenuItem(group=item, label=label, use_underline=True) model.set_sort_func(100 + i, func) if i == active: model.set_sort_column_id(100 + i, Gtk.SortType.ASCENDING) item.set_active(True) item.connect("toggled", util.DeferredSignal(self.__sort_toggled_cb), model, i) sort_menu.append(item) sort_item.set_submenu(sort_menu) menu.append(sort_item) pref_item = MenuItem(_("_Preferences"), Icons.PREFERENCES_SYSTEM) menu.append(pref_item) connect_obj(pref_item, "activate", Preferences, browser) menu.show_all() button = MenuButton( SymbolicIconImage(Icons.EMBLEM_SYSTEM, Gtk.IconSize.MENU), arrow=True) button.set_menu(menu) self.pack_start(button, True, True, 0) def __sort_toggled_cb(self, item, model, num): if item.get_active(): config.set("browsers", "album_sort", str(num)) model.set_sort_column_id(100 + num, Gtk.SortType.ASCENDING) def __compare_title(self, model, i1, i2, data): a1, a2 = model.get_value(i1), model.get_value(i2) return compare_title(a1, a2) def __compare_artist(self, model, i1, i2, data): a1, a2 = model.get_value(i1), model.get_value(i2) return compare_artist(a1, a2) def __compare_date(self, model, i1, i2, data): a1, a2 = model.get_value(i1), model.get_value(i2) return compare_date(a1, a2) def __compare_genre(self, model, i1, i2, data): a1, a2 = model.get_value(i1), model.get_value(i2) return compare_genre(a1, a2) def __compare_rating(self, model, i1, i2, data): a1, a2 = model.get_value(i1), model.get_value(i2) return compare_rating(a1, a2) class VisibleUpdate(object): # how many rows should be updated # beyond the visible area in both directions PRELOAD_COUNT = 35 def enable_row_update(self, view, sw, column): connect_obj(view, 'draw', self.__update_visibility, view) connect_destroy( sw.get_vadjustment(), "value-changed", self.__stop_update, view) self.__pending_paths = [] self.__update_deferred = DeferredSignal( self.__update_visible_rows, timeout=50, priority=GLib.PRIORITY_LOW) self.__column = column self.__first_expose = True def disable_row_update(self): if self.__update_deferred: self.__update_deferred.abort self.__update_deferred = None if self.__pending_paths: copool.remove(self.__scan_paths) self.__column = None self.__pending_paths = [] def _row_needs_update(self, model, iter_): """Should return True if the rows should be updated""" raise NotImplementedError def _update_row(self, model, iter_): """Do whatever is needed to update the row.""" raise NotImplementedError def __stop_update(self, adj, view): if self.__pending_paths: copool.remove(self.__scan_paths) self.__pending_paths = [] self.__update_visibility(view) def __update_visibility(self, view, *args): if not self.__column.get_visible(): return # update all visible rows on first expose event if self.__first_expose: self.__first_expose = False self.__update_visible_rows(view, 0) for i in self.__scan_paths(): pass self.__update_deferred(view, self.PRELOAD_COUNT) def __scan_paths(self): while self.__pending_paths: model, path = self.__pending_paths.pop() try: iter_ = model.get_iter(path) except ValueError: continue self._update_row(model, iter_) yield True def __update_visible_rows(self, view, preload): vrange = view.get_visible_range() if vrange is None: return model = view.get_model() # Generate a path list so that cover scanning starts in the middle # of the visible area and alternately moves up and down. start, end = vrange # pygtk2.12 sometimes returns empty tuples if not start or not end: return start = start.get_indices()[0] - preload - 1 end = end.get_indices()[0] + preload vlist = list(range(end, start, -1)) top = vlist[:len(vlist) // 2] bottom = vlist[len(vlist) // 2:] top.reverse() vlist_new = [] for i in vlist: if top: vlist_new.append(top.pop()) if bottom: vlist_new.append(bottom.pop()) vlist_new = filter(lambda s: s >= 0, vlist_new) vlist_new = map(Gtk.TreePath, vlist_new) visible_paths = [] for path in vlist_new: try: iter_ = model.get_iter(path) except ValueError: continue if self._row_needs_update(model, iter_): visible_paths.append((model, path)) if not self.__pending_paths and visible_paths: copool.add(self.__scan_paths) self.__pending_paths = visible_paths class AlbumList(Browser, util.InstanceTracker, VisibleUpdate, DisplayPatternMixin): __model = None __last_render = None __last_render_surface = None _PATTERN_FN = os.path.join(quodlibet.get_user_dir(), "album_pattern") _DEFAULT_PATTERN_TEXT = DEFAULT_PATTERN_TEXT name = _("Album List") accelerated_name = _("_Album List") keys = ["AlbumList"] priority = 4 def pack(self, songpane): container = qltk.ConfigRHPaned("browsers", "albumlist_pos", 0.4) container.pack1(self, True, False) container.pack2(songpane, True, False) return container def unpack(self, container, songpane): container.remove(songpane) container.remove(self) @classmethod def init(klass, library): super(AlbumList, klass).load_pattern() @classmethod def _destroy_model(klass): klass.__model.destroy() klass.__model = None @classmethod def toggle_covers(klass): on = config.getboolean("browsers", "album_covers") for albumlist in klass.instances(): albumlist.__cover_column.set_visible(on) for column in albumlist.view.get_columns(): column.queue_resize() @classmethod def refresh_all(cls): cls.__model.refresh_all() @classmethod def _init_model(klass, library): klass.__model = AlbumModel(library) klass.__library = library @util.cached_property def _no_cover(self): """Returns a cairo surface representing a missing cover""" cover_size = get_cover_size() scale_factor = self.get_scale_factor() pb = get_no_cover_pixbuf(cover_size, cover_size, scale_factor) return get_surface_for_pixbuf(self, pb) def __init__(self, library): super(AlbumList, self).__init__(spacing=6) self.set_orientation(Gtk.Orientation.VERTICAL) self._register_instance() if self.__model is None: self._init_model(library) self._cover_cancel = Gio.Cancellable.new() sw = ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) self.view = view = AllTreeView() view.set_headers_visible(False) model_sort = AlbumSortModel(model=self.__model) model_filter = AlbumFilterModel(child_model=model_sort) self.__bg_filter = background_filter() self.__filter = None model_filter.set_visible_func(self.__parse_query) render = Gtk.CellRendererPixbuf() self.__cover_column = column = Gtk.TreeViewColumn("covers", render) column.set_visible(config.getboolean("browsers", "album_covers")) column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) column.set_fixed_width(get_cover_size() + 12) render.set_property('height', get_cover_size() + 8) render.set_property('width', get_cover_size() + 8) def cell_data_pb(column, cell, model, iter_, no_cover): item = model.get_value(iter_) if item.album is None: surface = None elif item.cover: pixbuf = item.cover pixbuf = add_border_widget(pixbuf, self.view) surface = get_surface_for_pixbuf(self, pixbuf) # don't cache, too much state has an effect on the result self.__last_render_surface = None else: surface = no_cover if self.__last_render_surface == surface: return self.__last_render_surface = surface cell.set_property("surface", surface) column.set_cell_data_func(render, cell_data_pb, self._no_cover) view.append_column(column) render = Gtk.CellRendererText() column = Gtk.TreeViewColumn("albums", render) column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) if view.supports_hints(): render.set_property('ellipsize', Pango.EllipsizeMode.END) def cell_data(column, cell, model, iter_, data): album = model.get_album(iter_) if album is None: text = "<b>%s</b>\n" % _("All Albums") text += numeric_phrase("%d album", "%d albums", len(model) - 1) markup = text else: markup = self.display_pattern % album if self.__last_render == markup: return self.__last_render = markup cell.markup = markup cell.set_property('markup', markup) column.set_cell_data_func(render, cell_data) view.append_column(column) view.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) view.set_rules_hint(True) view.set_search_equal_func(self.__search_func, None) view.set_search_column(0) view.set_model(model_filter) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.add(view) view.connect('row-activated', self.__play_selection) self.__sig = view.connect('selection-changed', util.DeferredSignal(self.__update_songs, owner=view)) targets = [("text/x-quodlibet-songs", Gtk.TargetFlags.SAME_APP, 1), ("text/uri-list", 0, 2)] targets = [Gtk.TargetEntry.new(*t) for t in targets] view.drag_source_set( Gdk.ModifierType.BUTTON1_MASK, targets, Gdk.DragAction.COPY) view.connect("drag-data-get", self.__drag_data_get) connect_obj(view, 'popup-menu', self.__popup, view, library) self.accelerators = Gtk.AccelGroup() search = SearchBarBox(completion=AlbumTagCompletion(), accel_group=self.accelerators) search.connect('query-changed', self.__update_filter) connect_obj(search, 'focus-out', lambda w: w.grab_focus(), view) self.__search = search prefs = PreferencesButton(self, model_sort) search.pack_start(prefs, False, True, 0) self.pack_start(Align(search, left=6, top=6), False, True, 0) self.pack_start(sw, True, True, 0) self.connect("destroy", self.__destroy) self.enable_row_update(view, sw, self.__cover_column) self.connect('key-press-event', self.__key_pressed, library.librarian) if app.cover_manager: connect_destroy( app.cover_manager, "cover-changed", self._cover_changed) self.show_all() def _cover_changed(self, manager, songs): model = self.__model songs = set(songs) for iter_, item in model.iterrows(): album = item.album if album is not None and songs & album.songs: item.scanned = False model.row_changed(model.get_path(iter_), iter_) def __key_pressed(self, widget, event, librarian): if qltk.is_accel(event, "<Primary>I"): songs = self.__get_selected_songs() if songs: window = Information(librarian, songs, self) window.show() return True elif qltk.is_accel(event, "<alt>Return"): songs = self.__get_selected_songs() if songs: window = SongProperties(librarian, songs, self) window.show() return True return False def _row_needs_update(self, model, iter_): item = model.get_value(iter_) return item.album is not None and not item.scanned def _update_row(self, filter_model, iter_): sort_model = filter_model.get_model() model = sort_model.get_model() iter_ = filter_model.convert_iter_to_child_iter(iter_) iter_ = sort_model.convert_iter_to_child_iter(iter_) tref = Gtk.TreeRowReference.new(model, model.get_path(iter_)) def callback(): path = tref.get_path() if path is not None: model.row_changed(path, model.get_iter(path)) item = model.get_value(iter_) scale_factor = self.get_scale_factor() item.scan_cover(scale_factor=scale_factor, callback=callback, cancel=self._cover_cancel) def __destroy(self, browser): self._cover_cancel.cancel() self.disable_row_update() self.view.set_model(None) klass = type(browser) if not klass.instances(): klass._destroy_model() def __update_filter(self, entry, text, scroll_up=True, restore=False): model = self.view.get_model() self.__filter = None if not Query.match_all(text): self.__filter = Query(text, star=["~people", "album"]).search self.__bg_filter = background_filter() self.__inhibit() # We could be smart and try to scroll to a selected album # but that introduces lots of wild scrolling. Feel free to change it. # Without scrolling the TV tries to stay at the same position # (40% down) which makes no sense, so always go to the top. if scroll_up: self.view.scroll_to_point(0, 0) # Don't filter on restore if there is nothing to filter if not restore or self.__filter or self.__bg_filter: model.refilter() self.__uninhibit() def __parse_query(self, model, iter_, data): f, b = self.__filter, self.__bg_filter if f is None and b is None: return True else: album = model.get_album(iter_) if album is None: return True elif b is None: return f(album) elif f is None: return b(album) else: return b(album) and f(album) def __search_func(self, model, column, key, iter_, data): album = model.get_album(iter_) if album is None: return True key = gdecode(key).lower() title = album.title.lower() if key in title: return False if config.getboolean("browsers", "album_substrings"): people = (p.lower() for p in album.list("~people")) for person in people: if key in person: return False return True def __popup(self, view, library): albums = self.__get_selected_albums() songs = self.__get_songs_from_albums(albums) items = [] if self.__cover_column.get_visible(): num = len(albums) button = MenuItem( ngettext("Reload album _cover", "Reload album _covers", num), Icons.VIEW_REFRESH) button.connect('activate', self.__refresh_album, view) items.append(button) menu = SongsMenu(library, songs, items=[items]) menu.show_all() return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __refresh_album(self, menuitem, view): items = self.__get_selected_items() for item in items: item.scanned = False model = self.view.get_model() for iter_, item in model.iterrows(): if item in items: model.row_changed(model.get_path(iter_), iter_) def __get_selected_items(self): selection = self.view.get_selection() model, paths = selection.get_selected_rows() return model.get_items(paths) def __get_selected_albums(self): selection = self.view.get_selection() model, paths = selection.get_selected_rows() return model.get_albums(paths) def __get_songs_from_albums(self, albums, sort=True): # Sort first by how the albums appear in the model itself, # then within the album using the default order. songs = [] if sort: for album in albums: songs.extend(sorted(album.songs, key=lambda s: s.sort_key)) else: for album in albums: songs.extend(album.songs) return songs def __get_selected_songs(self, sort=True): albums = self.__get_selected_albums() return self.__get_songs_from_albums(albums, sort) def __drag_data_get(self, view, ctx, sel, tid, etime): songs = self.__get_selected_songs() if tid == 1: qltk.selection_set_songs(sel, songs) else: sel.set_uris([song("~uri") for song in songs]) def __play_selection(self, view, indices, col): self.songs_activated() def active_filter(self, song): for album in self.__get_selected_albums(): if song in album.songs: return True return False def can_filter_text(self): return True def filter_text(self, text): self.__search.set_text(text) if Query.is_parsable(text): self.__update_filter(self.__search, text) self.__inhibit() self.view.set_cursor((0,)) self.__uninhibit() self.activate() def get_filter_text(self): return self.__search.get_text() def can_filter(self, key): # Numerics are different for collections, and although title works, # it's not of much use here. if key is not None and (key.startswith("~#") or key == "title"): return False return super(AlbumList, self).can_filter(key) def can_filter_albums(self): return True def list_albums(self): model = self.view.get_model() return [row[0].album.key for row in model if row[0].album] def filter_albums(self, values): view = self.view self.__inhibit() changed = view.select_by_func( lambda r: r[0].album and r[0].album.key in values) self.__uninhibit() if changed: self.activate() def unfilter(self): self.filter_text("") self.view.set_cursor((0,)) def activate(self): self.view.get_selection().emit('changed') def __inhibit(self): self.view.handler_block(self.__sig) def __uninhibit(self): self.view.handler_unblock(self.__sig) def restore(self): text = config.gettext("browsers", "query_text") entry = self.__search entry.set_text(text) # update_filter expects a parsable query if Query.is_parsable(text): self.__update_filter(entry, text, scroll_up=False, restore=True) keys = config.gettext("browsers", "albums").split("\n") # FIXME: If albums is "" then it could be either all albums or # no albums. If it's "" and some other stuff, assume no albums, # otherwise all albums. self.__inhibit() if keys == [""]: self.view.set_cursor((0,)) else: def select_fun(row): album = row[0].album if not album: # all return False return album.str_key in keys self.view.select_by_func(select_fun) self.__uninhibit() def scroll(self, song): album_key = song.album_key select = lambda r: r[0].album and r[0].album.key == album_key self.view.select_by_func(select, one=True) def __get_config_string(self): selection = self.view.get_selection() model, paths = selection.get_selected_rows() # All is selected if model.contains_all(paths): return "" # All selected albums albums = model.get_albums(paths) confval = "\n".join((a.str_key for a in albums)) # ConfigParser strips a trailing \n so we move it to the front if confval and confval[-1] == "\n": confval = "\n" + confval[:-1] return confval def save(self): conf = self.__get_config_string() config.settext("browsers", "albums", conf) text = self.__search.get_text() config.settext("browsers", "query_text", text) def __update_songs(self, view, selection): songs = self.__get_selected_songs(sort=False) self.songs_selected(songs) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/const.py������������������������������������������������������������������0000644�0001750�0001750�00000013404�13115513265�017436� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Constants used in various parts of QL, mostly strings.""" import sys import os # MSYS2 defines MSYSTEM which changes os.sep/os.path.sep for the mingw # Python build. Unset here and restart.. (does not work for py.test etc.) # XXX: do this here since it gets executed by all scripts if os.name == "nt" and "MSYSTEM" in os.environ: import subprocess del os.environ["MSYSTEM"] argv = [] for arg in [sys.executable] + sys.argv: if os.path.exists(arg): arg = arg.replace("/", "\\") argv.append(arg) sys.exit(subprocess.call(argv)) class Version(tuple): """Represent the version of a dependency as a tuple""" def __new__(cls, name, *args, **kwargs): inst = tuple.__new__(Version, args) inst.name = name inst.message = kwargs.pop("message", "") return inst def human_version(self): return ".".join(map(str, self)) def __str__(self): return self.human_version() def check(self, version_tuple): """Raises ImportError if the version isn't supported""" if self[0] == version_tuple[0] and version_tuple >= self: return message = " " + self.message if self.message else "" raise ImportError("%s %s required. %s found.%s" % ( self.name, self, Version("", *version_tuple), message)) class MinVersions(object): """Dependency requirements for Quod Libet / Ex Falso""" PYTHON2 = Version("Python2", 2, 7) PYTHON3 = Version("Python3", 3, 4) MUTAGEN = Version("Mutagen", 1, 32, message="Use the Quod Libet unstable PPAs/repos to get a newer " "mutagen version.") GTK = Version("GTK+", 3, 14) PYGOBJECT = Version("PyGObject", 3, 14) GSTREAMER = Version("GStreamer", 1, 4) VERSION_TUPLE = Version("", 3, 9, 1) VERSION = str(VERSION_TUPLE) # entry point for the user guide / wiki BRANCH_NAME = "quodlibet-3.9" DOCS_BASE_URL = "https://quodlibet.readthedocs.org/en/%s" DOCS_LATEST = DOCS_BASE_URL % "latest" DOCS_BASE_URL %= BRANCH_NAME if BRANCH_NAME != "master" else "latest" ONLINE_HELP = DOCS_BASE_URL + "/guide/index.html" SEARCH_HELP = DOCS_BASE_URL + "/guide/searching.html" SHORTCUTS_HELP = DOCS_BASE_URL + "/guide/shortcuts.html" # Email used as default for reading/saving per-user data in tags, etc. EMAIL = os.environ.get("EMAIL", "quodlibet@lists.sacredchao.net") # Displayed as registered / help email address SUPPORT_EMAIL = "quod-libet-development@googlegroups.com" # about dialog, --version etc. WEBSITE = "https://quodlibet.readthedocs.org/" COPYRIGHT = u"Copyright 2004-2017" AUTHORS = sorted(u"""\ Alexandre Passos Alexey Bobyakov Alex Geoffrey Smith Anders Carlsson Andreas Bombe Andrew Chadwick Anton Shestakov Ari Pollak Aymeric Mansoux Bastian Kleineidam Bastien Gorissen Benjamin Boutier Ben Zeigler Bernd Wechner Bruno Bergot Carlo Teubner Christine Spang Christoph Reiter Corentin Néau David Kågedal David Schneider Decklin Foster Didier Villevalois Eduardo Gonzalez Eric Casteleijn Erich Schubert Eric Le Lay Federico Pelloni Felix Krull Florian Demmer Fredrik Strupe Guillaume Chazarain Hans Scholze Iñigo Serna Jacob Lee Jakob Gahde Jan Arne Petersen Jan Path Javier Kohen Joe Higton Joe Wreschnig Johan Hovold Johannes Marbach Johannes Rohrer Joschka Fischer Josh Lee Joshua Homan Joshua Kwan Lalo Martins Lee Willis Lukáš Lalinský Markus Koller Martijn Pieters Martin Bergström Michaël Ball Michael Urman Mickael Royer Nicholas J. Michalek Nick Boultbee Niklas Janlert Nikolai Prokoschenko Philipp Müller Philipp Weis Quincy John Hamilton Remi Vanicat Robert Muth Ryan Turner Sebastian Thürrschmidt Simonas Kazlauskas Simon Larsen Steven Robertson Thomas Vogt Tobias Wolf Tomasz Miasko Tomasz Torcz Tshepang Lekhonkhobe Türerkan İnce Uriel Zajaczkovski Vasiliy Faronov Victoria Hayes Zack Weinberg Vimalan Reddy Jason Heard David Pérez Carmona Jakub Wilk IBBoard@github CreamyCookie@github """.strip().split("\n")) TRANSLATORS = sorted(u""" Åka Sikrom (nb) Alexandre Passos (pt) Andreas Bertheussen (nb) Olivier Humbert (fr) Anton Shestakov (ru) Bastian Kleineidam (de) Bastien Gorissen (fr) Byung-Hee HWANG (ko) ChangBom Yoon (ko) Daniel Nyberg (sv) Dimitris Papageorgiou (el) Djavan Fagundes (pt) Einārs Sprūģis (lv) Eirik Haatveit (nb) Emfox Zhou (zh_CN) Erik Christiansson (sv) Fabien Devaux (fr) Filippo Pappalardo (it) Guillaume Ayoub (fr) Hans van Dok (nl) Honza Hejzl (cs_CZ) Hsin-lin Cheng (zh_TW) Jari Rahkonen (fi) Javier Kohen (es) Joe Wreschnig (en_CA) Johám-Luís Miguéns Vila (es, gl, gl_ES, eu, pt) Jonas Slivka (lt) Joshua Kwan (fr) Luca Baraldi (it) Ludovic Druette (fr) Lukáš Lalinský (sk) Mathieu Morey (fr) Michal Nowikowski (pl) Mugurel Tudor (ro) Mykola Lynnyk (uk) Naglis Jonaitis (lt) Nathan Follens (nl) Nick Boultbee (fr, en_GB) Olivier Gambier (fr) Piarres Beobide (eu) Piotr Drąg (pl) Roee Haimovich (he) Rüdiger Arp (de) SZERVÁC Attila (hu) Tomasz Torcz (pl) Türerkan İnce (tr) Witold Kieraś (pl) Yasushi Iwata (ja) Δημήτρης Παπαγεωργίου (el) Андрей Федосеев (ru) Микола 'Cthulhu' Линник (uk) Николай Прокошенко (ru) Ростислав "zbrox" Райков (bg) Сергей Федосеев (ru) scootergrisen@github (da) Marek Suchánek (cs) Till Berger (de) Jean-Michel Pouré (fr) """.strip().splitlines()) ARTISTS = sorted(u"""\ Tobias Jakub Steiner Fabien Devaux """.strip().split("\n")) # Default songlist column headers DEFAULT_COLUMNS = "~#track ~people ~title~version ~album~discsubtitle " \ "~#length".split() DEBUG = ("--debug" in sys.argv or "QUODLIBET_DEBUG" in os.environ) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/errorreport/��������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020310� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/errorreport/faulthandling.py����������������������������������������������0000644�0001750�0001750�00000006634�13112005742�023515� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. """ Interface around faulthandler to save and restore segfault info for the next program invocation. """ import os import ctypes import errno import re import atexit import faulthandler from quodlibet.compat import text_type from quodlibet.util.dprint import print_exc _fileobj = None class FaultHandlerCrash(Exception): """The exception type used for raising errors with a faulthandler stacktrace. Needed so we can add special handling in the error reporting code paths. """ def get_grouping_key(self): """Given a stacktrace produced by the faulthandler module returns a short string for grouping similar stacktraces together. Args: stacktrace (text_type) Returns: text_type """ stacktrace = text_type(self) if isinstance(stacktrace, bytes): stacktrace = stacktrace.decode("utf-8", "replace") assert isinstance(stacktrace, text_type) # Extract the basename and the function name for each line and hash # them. Could be smarter, but let's try this for now.. reg = re.compile('.*?"([^"]+).*?(\w+$)') values = [] for l in stacktrace.splitlines(): m = reg.match(l) if m is not None: path, func = m.groups() path = os.path.basename(path) values.extend([path, func]) return u"|".join(values) def enable(path): """Enable crash reporting and create empty target file Args: path (pathlike): the location of the crash log target path Raises: IOError: In case the location is not writable """ global _fileobj if _fileobj is not None: raise Exception("already enabled") try: _fileobj = open(path, "rb+") except IOError as e: if e.errno == errno.ENOENT: _fileobj = open(path, "wb+") faulthandler.enable(_fileobj, all_threads=False) def disable(): """Disable crash reporting and removes the target file Does not raise. """ global _fileobj if _fileobj is None: return faulthandler.disable() try: _fileobj.close() os.unlink(_fileobj.name) except (OSError, IOError): pass _fileobj = None @atexit.register def _at_exit(): disable() def raise_and_clear_error(): """Raises an error if there is one. Calling this will clear the error so a second call wont do anything. enable() needs to be called first. Raises: FaultHandlerCrash """ global _fileobj if _fileobj is None: return try: _fileobj.seek(0) text = _fileobj.read().decode("utf-8", "replace").strip() _fileobj.seek(0) _fileobj.truncate() except IOError: print_exc() else: if text: raise FaultHandlerCrash(text) def crash(): """Makes the process segfault. For testing purposes""" if os.name == "nt": i = ctypes.c_char(b'a') j = ctypes.pointer(i) c = 0 while True: j[c] = b'a' c += 1 else: ctypes.string_at(0) ����������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/errorreport/ui.py���������������������������������������������������������0000644�0001750�0001750�00000010241�13112005742�021277� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. from gi.repository import Gtk from quodlibet import _ from quodlibet import app from quodlibet import util from quodlibet.qltk.entry import UndoEntry def find_active_window(): """Try to get the active Window, default to the main one""" for window in Gtk.Window.list_toplevels(): if window.is_active(): return window else: return app.window class TextExpander(Gtk.Expander): def __init__(self, title, text): super(TextExpander, self).__init__(label=title) self.set_resize_toplevel(True) buf = Gtk.TextBuffer() buf.set_text(text) tv = Gtk.TextView(buffer=buf, editable=False) tv.set_left_margin(6) if hasattr(tv, "set_top_margin"): tv.set_top_margin(6) tv.set_bottom_margin(6) label = self.get_label_widget() label.props.margin = 4 win = Gtk.ScrolledWindow() win.add(tv) win.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) win.set_shadow_type(Gtk.ShadowType.ETCHED_OUT) win.set_size_request(-1, 175) self.add(win) win.show_all() class ErrorDialog(Gtk.MessageDialog): RESPONSE_QUIT = 1 RESPONSE_SUBMIT = 2 RESPONSE_BUGREPORT = 3 def __init__(self, parent, error_text, show_bug_report): main_text = _("An Error Occurred") secondary_text = _( "You can ignore this error, but the application might be unstable " "until it is restarted. Submitting an error report will only " "take a few seconds and would help us a lot.") super(ErrorDialog, self).__init__( text=main_text, secondary_text=secondary_text) self.set_transient_for(parent) self.set_modal(True) if show_bug_report: self.add_button(_("File Bug Report"), self.RESPONSE_BUGREPORT) else: self.add_button(_("Submit Error Report"), self.RESPONSE_SUBMIT) self.add_button(_("Quit Program"), self.RESPONSE_QUIT) self.add_button(_("Ignore Error"), Gtk.ResponseType.CANCEL) self.set_default_response(Gtk.ResponseType.CANCEL) area = self.get_message_area() expand = TextExpander(_("Error details:"), error_text) area.pack_start(expand, False, True, 0) area.show_all() class SubmitErrorDialog(Gtk.MessageDialog): RESPONSE_SUBMIT = 1 def __init__(self, parent, error_text): main_text = _("Submit Error Report") secondary_text = _( "Various details regarding the error and your system will be send " "to a third party online service " "(<a href='https://www.sentry.io'>www.sentry.io</a>). You can " "review the data before sending it below.") secondary_text += u"\n\n" secondary_text += _( "(optional) Please provide a short description of what happened " "when the error occurred:") super(SubmitErrorDialog, self).__init__( modal=True, text=main_text, secondary_text=secondary_text, secondary_use_markup=True) self.set_transient_for(parent) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_button(_("_Send"), self.RESPONSE_SUBMIT) self.set_default_response(Gtk.ResponseType.CANCEL) area = self.get_message_area() self._entry = UndoEntry() self._entry.set_placeholder_text(_("Short description…")) area.pack_start(self._entry, False, True, 0) expand = TextExpander(_("Data to be sent:"), error_text) area.pack_start(expand, False, True, 0) area.show_all() self.get_widget_for_response(Gtk.ResponseType.CANCEL).grab_focus() def get_comment(self): """"Returns the user provided error description Returns text_Type """ return util.gdecode(self._entry.get_text()) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/errorreport/sentrywrapper.py����������������������������������������������0000644�0001750�0001750�00000017404�13112005742�023617� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. """ A wrapper API for sentry-raven to make it work in a GUI environment. We need to split the capturing phase from the submit phase so we can show the report to the user and provide feedback about the report submit process. This hacks it together while trying to not touch too many raven internals. It also only imports raven when needed since it takes quite a lot of time to import. """ import pprint from quodlibet.compat import text_type, urlencode from quodlibet.util.urllib import Request, urlopen class SentryError(Exception): """Exception type for all the API below""" pass def send_feedback(dsn, event_id, name, email, comment, timeout): """Send feedback, blocking. Args: dsn (str): The DSN event_id (str): The event ID this feedback should be attached to name (text_type): The user name email (text_type): The user email comment (text_type): The feedback text timeout (float): The timeout for this request Raises: SentryError: In case of timeout or other errors """ name = text_type(name).encode("utf-8") email = text_type(email).encode("utf-8") comment = text_type(comment).encode("utf-8") data = urlencode( [('name', name), ('email', email), ('comments', comment)]) if not isinstance(data, bytes): # py3 data = data.encode("utf-8") headers = {"Referer": "https://quodlibet.github.io"} params = urlencode([("dsn", dsn), ("eventId", event_id)]) try: req = Request( "https://sentry.io/api/embed/error-page/?" + params, data=data, headers=headers) urlopen(req, timeout=timeout).close() except EnvironmentError as e: raise SentryError(e) def urlopen_hack(**kwargs): # There is no way to make raven use the system cert store. This makes # it use the standard urlopen instead. url = kwargs["url"] data = kwargs["data"] timeout = kwargs["timeout"] return urlopen(url, data, timeout) class CapturedException(object): """Contains the data to be send to sentry.""" def __init__(self, dsn, data): """ Args: dsn (str): the sentry.io DSN data (object): some sentry internals """ self._dsn = dsn self._args, self._kwargs = data self._comment = None def get_report(self): """Gives a textual representation of the collected data. The goal is to give the user a way to see what is being send to the sentry servers. Returns: text_type """ lines = [] if self._args: lines += pprint.pformat(self._args, width=40).splitlines() if self._kwargs: lines += pprint.pformat(self._kwargs, width=40).splitlines() def compact(l): level = len(l) - len(l.lstrip()) return u" " * (level // 4) + l.lstrip() return u"\n".join(map(compact, lines)) def set_comment(self, comment): """Attach a user provided comment to the error. Something like "I clicked button X and then this happened" Args: comment (text_type) """ self._comment = comment def send(self, timeout): """Submit the error including the user feedback. Blocking. Args: timeout (float): timeout for each request made Returns: str: The sentry event id Raises: SentryError """ from raven import Client from raven.transport import http from raven.transport.http import HTTPTransport http.urlopen = urlopen_hack try: raise Exception except Exception: client = Client( self._dsn + "?timeout=%d" % timeout, install_sys_hook=False, install_logging_hook=False, capture_locals=False, transport=HTTPTransport) # replace the captured data with the one we already have old_send = client.send def inject_data(*args, **kwargs): kw = dict(self._kwargs) kw["event_id"] = kwargs.get("event_id", "") return old_send(*self._args, **kw) client.send = inject_data event_id = client.captureException() if client.state.did_fail(): raise SentryError("captureException failed") # fix leak client.context.deactivate() if self._comment: send_feedback(self._dsn, event_id, "default", "email@example.com", self._comment, timeout) return event_id class Sentry(object): """The main object of our sentry API wrapper""" def __init__(self, dsn): """ Args: dsn (str) """ self._dsn = dsn self._tags = {} def add_tag(self, key, value): """Attach tags to the error report. Args: key (text_type) value (text_type) The keys are arbitrary, but some have a special meaning: * "release" will show up as a separate page in sentry * "environment" will add a dropdown for grouping """ self._tags[key] = value def capture(self, exc_info=None, fingerprint=None): """Captures the current exception and returns a CapturedException The returned object contains everything needed to submit the error at a later point in time (e.g. after pushing it to the main thread and displaying it in the UI) Args: exc_info (tuple): a sys.exc_info() return value fingerprint (List[text_type] or None): fingerprint for custom grouping Returns: CapturedException Raises: SentryError: Raised if raven isn't installed or capturing failed for some unknown reason. """ try: from raven import Client from raven.transport import Transport except ImportError as e: raise SentryError(e) class DummyTransport(Transport): """A sync raven transport which does nothing""" def send(self, *args, **kwargs): pass # Some tags have a special meaning and conflict with info given to the # client, so pass them to the client instead tags = dict(self._tags) kwargs = {} if "release" in tags: kwargs["release"] = tags.pop("release") if "environment" in tags: kwargs["environment"] = tags.pop("environment") if "server_name" in tags: kwargs["name"] = tags.pop("server_name") # It would default to the hostname otherwise kwargs.setdefault("name", "default") # We use a dummy transport and intercept the captured data client = Client( self._dsn, install_sys_hook=False, install_logging_hook=False, capture_locals=True, transport=DummyTransport, tags=tags, **kwargs) data = [None] old_send = client.send def save_state(*args, **kwargs): data[0] = (args, kwargs) return old_send(*args, **kwargs) client.send = save_state client.captureException(exc_info, fingerprint=fingerprint) if data[0] is None: raise SentryError("Failed to capture") # fix leak client.context.deactivate() return CapturedException(self._dsn, data[0]) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/errorreport/github.py�����������������������������������������������������0000644�0001750�0001750�00000003004�13112005742�022143� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. import sys import platform import quodlibet from quodlibet.compat import text_type, urlencode from quodlibet.util.dprint import format_exception def build_issue_url(title, body): """Returns an URL which provides a pre-filled github issue. Args: title (text_type): The issue title body (text_type): The issue content Returns: str: the URL to open """ title = text_type(title).encode("utf-8") body = text_type(body).encode("utf-8") params = urlencode([("title", title), ("body", body)]) return "https://github.com/quodlibet/quodlibet/issues/new?%s" % params def get_github_issue_url(exc_info): """Gives an URL for a pre-filled github issue based on an exception Returns: str """ error_title = (text_type(exc_info[1]).strip() or u"\n").splitlines()[0] title = u"[Error] %s: %s" % (exc_info[0].__name__, error_title) error_text = u"\n".join(format_exception(*exc_info)) body = u"""\ * What did you try to do when the error occurred? Error Details: ``` %s Version: %s Python: %s Platform: %s ``` """ % (error_text, quodlibet.get_build_description(), sys.version, platform.platform()) return build_issue_url(title, body) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/errorreport/__init__.py���������������������������������������������������0000644�0001750�0001750�00000000601�13112005742�022420� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. from .main import enable_errorhook, errorhook enable_errorhook, errorhook �������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/errorreport/main.py�������������������������������������������������������0000644�0001750�0001750�00000013347�13112005742�021620� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. import threading import sys import platform import os from gi.repository import GLib import mutagen import cairo import quodlibet from quodlibet import app from quodlibet.compat import text_type from quodlibet.build import BUILD_TYPE, BUILD_INFO from quodlibet.util import fver, cached_func, is_main_thread, website from quodlibet.util.dprint import format_exception, print_exc, print_e from quodlibet.qltk import gtk_version, pygobject_version, get_backend_name from .sentrywrapper import Sentry, SentryError from .ui import ErrorDialog, find_active_window, SubmitErrorDialog from .github import get_github_issue_url from .faulthandling import FaultHandlerCrash from .logdump import dump_to_disk @cached_func def get_sentry(): """Returns a cached Sentry instance Returns: Sentry """ # reverse, so it isn't so easy to search for at least SENTRY_DSN = ( "514241/oi.yrtnes@0818e5ab0218038bcbb41f049ec5de21:" "0d15f73b978d143b5e84030a1ddf9a73//:sptth")[::-1] sentry = Sentry(SENTRY_DSN) sentry.add_tag("release", quodlibet.get_build_description()) sentry.add_tag("build_type", BUILD_TYPE) sentry.add_tag("build_info", BUILD_INFO) sentry.add_tag("mutagen_version", fver(mutagen.version)) sentry.add_tag("python_version", platform.python_version()) sentry.add_tag("gtk_version", fver(gtk_version)) sentry.add_tag("gtk_backend", get_backend_name()) sentry.add_tag("pygobject_version", fver(pygobject_version)) sentry.add_tag("pycairo_version", fver(cairo.version_info)) sentry.add_tag("platform", platform.platform()) return sentry # We guard against recursive errors _error_lock = threading.Lock() _errorhook_enabled = False def enable_errorhook(value): """Enables/Disables the error hook and the excepthook integration. Args: value (bool) """ global _errorhook_enabled value = bool(value) _errorhook_enabled = value if value: sys.excepthook = excepthook else: sys.excepthook = sys.__excepthook__ def run_error_dialogs(exc_info, sentry_error): error_text = u"%s: %s" % ( exc_info[0].__name__, (text_type(exc_info[1]).strip() or u"\n").splitlines()[0]) error_text += u"\n------\n" error_text += u"\n".join(format_exception(*exc_info)) window = find_active_window() if window is None: return # XXX: This does blocking IO and uses nested event loops... but it's simple dialog = ErrorDialog( window, error_text, show_bug_report=(sentry_error is None)) while 1: response = dialog.run() if response == ErrorDialog.RESPONSE_QUIT: dialog.destroy() app.quit() elif response == ErrorDialog.RESPONSE_SUBMIT: dialog.hide() submit_dialog = SubmitErrorDialog( window, sentry_error.get_report()) submit_response = submit_dialog.run() if submit_response == SubmitErrorDialog.RESPONSE_SUBMIT: sentry_error.set_comment(submit_dialog.get_comment()) timeout_seconds = 5 try: sentry_error.send(timeout_seconds) except SentryError: print_exc() submit_dialog.destroy() dialog.destroy() else: submit_dialog.destroy() dialog.show() continue elif response == ErrorDialog.RESPONSE_BUGREPORT: url = get_github_issue_url(exc_info) website(url) dialog.destroy() else: dialog.destroy() break def errorhook(exc_info=None): """This is the main entry point Call in an exception context. Thread safe. def my_thread(): try: do_work() except Exception: errorhook() """ global _error_lock, _errorhook_enabled if not _errorhook_enabled: return if exc_info is None: exc_info = sys.exc_info() if exc_info[0] is None: # called outside of an exception context, just ignore print_e("no active exception!") return # In case something goes wrong during error handling print it first print_exc(exc_info) if not _error_lock.acquire(False): # Make sure only one of these is active at a time return # write error and logs to disk dump_dir = os.path.join(quodlibet.get_user_dir(), "dumps") dump_to_disk(dump_dir, exc_info) sentry = get_sentry() # For crashes the stack trace is not enough to differentiating different # crash sources. We need to give our own grouping key (fingerprint) based # on the stack trace provided by faulthandler. fingerprint = None if isinstance(exc_info[1], FaultHandlerCrash): fingerprint = ["{{ default }}", exc_info[1].get_grouping_key()] try: sentry_error = sentry.capture(exc_info, fingerprint=fingerprint) except SentryError: sentry_error = None def called_in_main_thread(): try: run_error_dialogs(exc_info, sentry_error) finally: _error_lock.release() if is_main_thread(): called_in_main_thread() else: GLib.idle_add(called_in_main_thread) def excepthook(*exc_info): """Custom exception hook. This is called in case an unhandled exception occurs in the main thread. In other threads errorhook() has to be called explicitly. """ errorhook(exc_info) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/errorreport/logdump.py����������������������������������������������������0000644�0001750�0001750�00000004071�13112005742�022335� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. import os import sys import platform import time import mutagen import quodlibet from quodlibet.util import logging from quodlibet.util.path import mkdir from quodlibet.util.dprint import print_exc, format_exception def format_dump_header(exc_info): """Returns system information and the traceback Args: exc_info (tuple): sys.exc_info() result tuple Returns: text_type """ lines = [ u"=== SYSTEM INFORMATION:" u"", u"Quod Libet %s" % quodlibet.get_build_description(), u"Mutagen %s" % mutagen.version_string, u"Python %s %s" % (sys.version, sys.platform), u"Platform %s" % platform.platform(), u"=== STACK TRACE", u"", ] lines.extend(format_exception(*exc_info)) lines.append(u"") return os.linesep.join(lines) def format_dump_log(limit=75): """Returns recent log entries. Args: limit (int): number of log entries to return Returns: text_type """ dump = [u"=== LOG:"] dump.extend(logging.get_content(limit=limit)) return os.linesep.join(dump) def dump_to_disk(dump_dir, exc_info): """Writes a new error log file into 'dump_dir' Args: dump_dir (path-like) exc_info (tuple): sys.exc_info() result tuple """ try: mkdir(dump_dir) except EnvironmentError: print_exc() return time_ = time.localtime() dump_path = os.path.join( dump_dir, time.strftime("Dump_%Y%m%d_%H%M%S.txt", time_)) header = format_dump_header(exc_info).encode("utf-8") log = format_dump_log().encode("utf-8") try: with open(dump_path, "wb") as dump: dump.write(header) dump.write(log) except EnvironmentError: print_exc() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/devices/������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017345� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/devices/storage.py��������������������������������������������������������0000644�0001750�0001750�00000012145�13112005742�021370� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Markus Koller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import shutil import copy from glob import glob from gi.repository import Gtk, GLib, GdkPixbuf import quodlibet from quodlibet import app from quodlibet import _ from quodlibet.devices._base import Device from quodlibet.library import SongFileLibrary from quodlibet.pattern import FileFromPattern from quodlibet.qltk.msg import ConfirmFileReplace from quodlibet.util.path import (mtime, escape_filename, strip_win32_incompat_from_path) from quodlibet.compat import text_type CACHE = os.path.join(quodlibet.get_user_dir(), 'cache') class StorageDevice(Device): protocol = 'storage' defaults = { 'pattern': '<artist>/<album>/<title>', 'covers': True, 'unclutter': True, } __library = None __pattern = None def __init__(self, backend_id, device_id): super(StorageDevice, self).__init__(backend_id, device_id) filename = escape_filename(device_id) self.__library_path = os.path.join(CACHE, filename) self.__library_name = device_id def __set_pattern(self, widget=None): self.__pattern = FileFromPattern( os.path.join(self.mountpoint, self['pattern'])) def Properties(self): props = [] entry = Gtk.Entry() entry.set_text(self['pattern']) entry.connect_after('changed', self.__set_pattern) props.append((_("_Filename pattern:"), entry, 'pattern')) check = Gtk.CheckButton() check.set_active(self['covers']) props.append((_("Copy _album covers"), check, 'covers')) check = Gtk.CheckButton() check.set_active(self['unclutter']) props.append((_("_Remove unused covers and directories"), check, 'unclutter')) return props def list(self, wlb): self.__load_library() wlb.setup() next = self.__library.rebuild([self.mountpoint]).next while True: if wlb.quit: wlb.hide() break if not wlb.paused: try: next() except StopIteration: break Gtk.main_iteration() self.__save_library() return self.__library.values() def contains(self, song): return song in self.__library def copy(self, parent_widget, song): if not self.__pattern: self.__set_pattern() target = strip_win32_incompat_from_path(self.__pattern.format(song)) dirname = os.path.dirname(target) if os.path.exists(target): dialog = ConfirmFileReplace(parent_widget, target) resp = dialog.run() if resp == ConfirmFileReplace.RESPONSE_REPLACE: try: # Remove the current song self.__library.remove([self.__library[target]]) except KeyError: pass else: return False try: if not os.path.isdir(dirname): os.makedirs(dirname) shutil.copyfile(song['~filename'], target) if self['covers']: coverfile = os.path.join(dirname, 'folder.jpg') cover = app.cover_manager.get_cover(song) if cover and mtime(cover.name) > mtime(coverfile): image = GdkPixbuf.Pixbuf.new_from_file_at_size( cover.name, 200, 200) image.savev(coverfile, "jpeg", [], []) song = copy.deepcopy(song) song.sanitize(target) self.__library.add([song]) return song except (OSError, IOError, GLib.GError) as exc: return text_type(exc) def delete(self, parent_widget, song): try: path = song['~filename'] dir = os.path.dirname(path) os.unlink(path) self.__library.remove([song]) if self['unclutter']: files = glob(dir + '/*') if len(files) == 1 and os.path.isfile(files[0]) and \ os.path.basename(files[0]) == 'folder.jpg': os.unlink(files[0]) try: os.removedirs(os.path.dirname(path)) except OSError: pass return True except (OSError, IOError) as exc: return text_type(exc) def cleanup(self, wlb, action): self.__save_library() return True def close(self): if self.__library: self.__library.destroy() self.__library = None def __load_library(self): if self.__library is None: self.__library = SongFileLibrary(self.__library_name) if os.path.isfile(self.__library_path): self.__library.load(self.__library_path) def __save_library(self): self.__library.save(self.__library_path) devices = [StorageDevice] ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/devices/__init__.py�������������������������������������������������������0000644�0001750�0001750�00000032305�13112005742�021463� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Markus Koller # 2012 Christoph Reiter, Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os try: import ConfigParser except ImportError: import configparser as ConfigParser from senf import fsn2bytes, path2fsn from gi.repository import GObject from quodlibet.util.path import xdg_get_system_data_dirs import quodlibet from quodlibet import _ from quodlibet.compat import iteritems from quodlibet import util from quodlibet.devices import _udev as udev from quodlibet.util.importhelper import load_dir_modules from quodlibet.util.dprint import print_d, print_w from quodlibet.compat import text_type, escape_decode try: import dbus except ImportError: if not util.is_osx() and not util.is_windows(): print_w(_("Could not import %s, which is needed for " "device support.") % "dbus-python") dbus = None devices = [] def init_devices(): global devices load_pyc = util.is_windows() or util.is_osx() modules = load_dir_modules(util.get_module_dir(), package=__package__, load_compiled=load_pyc) for mod in modules: try: devices.extend(mod.devices) except AttributeError: print_w("%r doesn't contain any devices." % mod.__name__) devices.sort(key=lambda d: repr(d)) if not util.is_osx() and not util.is_windows(): init_devices() DEVICES = os.path.join(quodlibet.get_user_dir(), "devices") config = ConfigParser.RawConfigParser() config.read(DEVICES) def write(): with open(DEVICES, 'w') as f: config.write(f) # Return a constructor for a device given by a string def get(name): try: return devices[[d.__name__ for d in devices].index(name)] except ValueError: return None # Return a constructor for a device given by the supported # access method protocols def get_by_protocols(protocols): # Try the storage protocol last if 'storage' in protocols: protocols.remove('storage') protocols.append('storage') for protocol in protocols: try: return devices[[d.protocol for d in devices].index(protocol)] except ValueError: pass return None class DeviceManager(GObject.GObject): SIG_PYOBJECT = (GObject.SignalFlags.RUN_LAST, None, (object,)) __gsignals__ = { 'removed': SIG_PYOBJECT, 'added': SIG_PYOBJECT, } _system_bus = None def __init__(self, bus_name): super(DeviceManager, self).__init__() self._system_bus = dbus.SystemBus() # raises DBusException if no owner is active or can be activated self._system_bus.activate_name_owner(bus_name) def discover(self): """Push out all existing devices""" raise NotImplementedError def get_name(self, udi): """A nice looking name like 'vendor' 'modelname' """ raise NotImplementedError def eject(self, udi): """Eject device""" raise NotImplementedError def get_block_device(self, udi): """/dev/sdX""" raise NotImplementedError def get_mountpoint(self, path): """/media/myplayer""" raise NotImplementedError def create_device(self, backend_id, device_id, protocols): """backend_id is the string that gets passed to the backend so it can identify the device. device_id should be a something including the device serial (so it's unique) and maybe the model name.""" device = None print_d("Creating device %r supporting protocols: %r" % ( device_id, protocols)) for prots in (protocols, ['storage']): klass = get_by_protocols(prots) if klass is None: break try: device = klass(backend_id, device_id) except TypeError: pass # rockboxed iPod else: break if device is None: print_w(_("%r is not a supported device.") % device_id) return device def get_devices_from_path(udev_ctx, path): """A list of device attribute dicts for the given device path and all its parents. Either returns a non empty list or raises EnvironmentError. """ path = fsn2bytes(path2fsn(path), None) enum = udev.UdevEnumerate.new(udev_ctx) if not enum: raise EnvironmentError # only match the device we want if enum.add_match_property(b"DEVNAME", path) != 0: enum.unref() raise EnvironmentError # search for it if enum.scan_devices() != 0: enum.unref() raise EnvironmentError # take the first entry entry = enum.get_list_entry() if not entry: enum.unref() raise EnvironmentError sys_path = entry.get_name() enum.unref() device = udev.UdevDevice.new_from_syspath(udev_ctx, sys_path) if not device: raise EnvironmentError devices = [] while device: devices.append(device) device = device.get_parent() device_attrs = [] for device in devices: entry = device.get_properties_list_entry() if not entry: continue attrs = {} for e in entry: name = e.get_name() value = e.get_value() attrs[name] = escape_decode(value) device_attrs.append(attrs) # the first device owns its parents devices[0].unref() return device_attrs def dbus_barray_to_bytes(array): """ Args: array (dbus.Array[dbus.Byte]) Returns: bytes """ return bytes(bytearray(array)).split(b"\x00", 1)[0] class UDisks2Manager(DeviceManager): BUS_NAME = "org.freedesktop.UDisks2" BLOCK_IFACE = "org.freedesktop.UDisks2.Block" FS_IFACE = "org.freedesktop.UDisks2.Filesystem" DRIVE_IFACE = "org.freedesktop.UDisks2.Drive" PROP_IFACE = "org.freedesktop.DBus.Properties" OBJMAN_IFACE = "org.freedesktop.DBus.ObjectManager" def __init__(self): super(UDisks2Manager, self).__init__(self.BUS_NAME) error = False try: udev.init() except OSError: print_w("UDisks2: " + _("Could not find '%s'.") % "libudev") error = True else: self._udev = udev.Udev.new() if get_mpi_dir() is None: print_w("UDisks2: " + _("Could not find '%s'.") % "media-player-info") error = True if error: raise LookupError # object path -> properties self._drives = {} self._fs = {} self._blocks = {} # object paths -> devices (block/fs) we emitted self._devices = {} obj = self._system_bus.get_object( self.BUS_NAME, "/org/freedesktop/UDisks2") self._interface = dbus.Interface(obj, self.OBJMAN_IFACE) self._interface.connect_to_signal( 'InterfacesAdded', self._interface_added) self._interface.connect_to_signal( 'InterfacesRemoved', self._interface_removed) def _try_build_device(self, object_path, block, fs): """Returns a Device instance or None. None if it wasn't a media player etc.. """ drive = self._drives.get(block["Drive"]) if not drive: # I think this shouldn't happen, but check anyway return dev_path = dbus_barray_to_bytes(block["Device"]) print_d("Found device: %r" % dev_path) media_player_id = get_media_player_id(self._udev, dev_path) if not media_player_id: print_d("%r not a media player" % dev_path) return protocols = get_media_player_protocols(media_player_id) device_id = drive["Id"] dev = self.create_device(object_path, text_type(device_id), protocols) icon_name = block["HintIconName"] if icon_name: dev.icon = icon_name return dev def discover(self): objects = self._interface.GetManagedObjects() for object_path, interfaces_and_properties in iteritems(objects): self._update_interfaces(object_path, interfaces_and_properties) self._check_interfaces() def get_name(self, path): block = self._blocks[path] drive = self._drives.get(block["Drive"]) return " - ".join([drive["Vendor"], drive["Model"]]) def get_mountpoint(self, path): # the mointpoint gets filed with a delay, so fetch over dbus each time # the get the correct value obj = self._system_bus.get_object(self.BUS_NAME, path) interface = dbus.Interface(obj, self.PROP_IFACE) try: array = interface.Get(self.FS_IFACE, "MountPoints") except dbus.DBusException: paths = [] else: paths = [dbus_barray_to_bytes(v) for v in array] if paths: return paths[0] return "" def get_block_device(self, path): block = self._blocks[path] return dbus_barray_to_bytes(block["Device"]) def eject(self, path): # first try to unmount obj = self._system_bus.get_object(self.BUS_NAME, path) interface = dbus.Interface(obj, self.FS_IFACE) try: interface.Unmount({}) except dbus.DBusException: pass # then eject.. # XXX: this only works if no other FS is mounted.. block = self._blocks[path] obj = self._system_bus.get_object(self.BUS_NAME, block["Drive"]) interface = dbus.Interface(obj, self.DRIVE_IFACE) try: interface.Eject({}) except dbus.DBusException: return False return True def _update_interfaces(self, object_path, iap): if self.DRIVE_IFACE in iap: self._drives[object_path] = iap[self.DRIVE_IFACE] if self.FS_IFACE in iap: self._fs[object_path] = iap[self.FS_IFACE] if self.BLOCK_IFACE in iap: self._blocks[object_path] = iap[self.BLOCK_IFACE] def _check_interfaces(self): # we need the block and fs interface to create a device for object_path in (set(self._fs.keys()) & set(self._blocks.keys())): # we are finished with this one, ignore if object_path in self._devices: continue block = self._blocks[object_path] fs = self._fs[object_path] dev = self._try_build_device(object_path, block, fs) if dev: self._devices[object_path] = dev self.emit("added", dev) def _interface_added(self, object_path, iap): self._update_interfaces(object_path, iap) self._check_interfaces() def _interface_removed(self, object_path, interfaces): if self.FS_IFACE in interfaces or self.BLOCK_IFACE in interfaces: # if any of our needed interfaces goes away, remove the device if object_path in self._devices: self.emit("removed", text_type(object_path)) dev = self._devices[object_path] dev.close() del self._devices[object_path] if self.DRIVE_IFACE in interfaces: del self._drives[object_path] if self.FS_IFACE in interfaces: del self._fs[object_path] if self.BLOCK_IFACE in interfaces: del self._blocks[object_path] def get_media_player_id(udev_ctx, dev_path): """Get the ID_MEDIA_PLAYER key for a specific device path e.g. /dev/sdc Returns the str ID or None. """ try: devs = get_devices_from_path(udev_ctx, dev_path) except Exception: print_w("Failed to retrieve udev properties for %r" % dev_path) util.print_exc() return for dev in devs: try: return dev["ID_MEDIA_PLAYER"] except KeyError: continue def get_mpi_dir(): """Path to the media-player-info directory or None""" for dir_ in xdg_get_system_data_dirs(): mpi_path = os.path.join(dir_, "media-player-info") if os.path.isdir(mpi_path): return mpi_path def get_media_player_protocols(media_player_id): """Gives a list of supported protocols""" # get the path to the mpi files mpi_path = get_mpi_dir() if not mpi_path: return [] file_path = os.path.join(mpi_path, media_player_id + ".mpi") parser = ConfigParser.SafeConfigParser() if parser.read(file_path): try: prots = parser.get("Device", "AccessProtocol") except ConfigParser.Error: return [] else: return prots.split(";") return [] def init(): global device_manager if not dbus: return device_manager = None print_d(_("Initializing device backend.")) try_text = _("Trying '%s'") if device_manager is None: print_d(try_text % "UDisks2") try: device_manager = UDisks2Manager() except (LookupError, dbus.DBusException): pass if device_manager is None: print_w(_("Couldn't connect to a device backend.")) else: print_d(_("Device backend initialized.")) return device_manager ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/devices/_base.py����������������������������������������������������������0000644�0001750�0001750�00000013077�13112005742�021002� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Markus Koller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from quodlibet import _ import quodlibet.devices from quodlibet.util.path import ismount class Device(dict): """A base class for devices""" icon = 'multimedia-player' """The default icon for this device.""" protocol = '' """The used HAL access method protocol for this device, as defined in 'portable_audio_player.access_method.protocols' """ udi = None """The UDI of this device""" bid = None """Backend device id""" defaults = None """Set this to a hash with default values for user-configurable properties. """ def __init__(self, backend_id, device_id): device_manager = quodlibet.devices.device_manager self.udi = udi = device_id self.bid = bid = backend_id # Load default properties. if self.defaults: self.update(self.defaults) # Load configured properties. if quodlibet.devices.config.has_section(udi): for key in quodlibet.devices.config.options(udi): t = type(self.defaults.get(key)) if t == int: value = quodlibet.devices.config.getint(udi, key) elif t == float: value = quodlibet.devices.config.getfloat(udi, key) elif t == bool: value = quodlibet.devices.config.getboolean(udi, key) else: value = quodlibet.devices.config.get(udi, key) dict.__setitem__(self, key, value) # Sometimes a device shows up twice. The UDI identifies the right one. dict.__setitem__(self, 'udi', str(udi)) # Set a sensible name if none is set. if "name" not in self: self['name'] = device_manager.get_name(bid) or _("Unknown Device") def __setitem__(self, key, value): """Store all changed properties in the ConfigParser.""" if not quodlibet.devices.config.has_section(self.udi): quodlibet.devices.config.add_section(self.udi) quodlibet.devices.config.set(self.udi, key, value) dict.__setitem__(self, key, value) def is_connected(self): """Should return True if the device is connected.""" return ismount(self.mountpoint) def eject(self): """Eject the device, should return True on success. If the eject failed, it should return False or a string describing the error. If the device is not ejectable, set it to None. """ return quodlibet.devices.device_manager.eject(self.bid) def get_space(self): """Returns a tuple with the size of this device and the free space.""" info = os.statvfs(self.mountpoint) space = info.f_bsize * info.f_blocks free = info.f_bsize * info.f_bavail return (space, free) @property def mountpoint(self): return quodlibet.devices.device_manager.get_mountpoint(self.bid) @property def block_device(self): return quodlibet.devices.device_manager.get_block_device(self.bid) def list(self, wlb): """Returns a list of AudioFile instances representing the songs on this device. The WaitLoadBar can be used to display messages. """ return [] def contains(self, song): """If the device contains the passed song (it will be returned if list() would be called). """ return False ordered = False """Whether the order of the files returned by list() is meaningful. If it is, refreshing will reset the song list sort order. """ def copy(self, parent_widget, song): """ Copies a song to the device. This will be called once for each song. If the copy was successful, it should return an AudioFile instance, which will be added to the songlist. If the copy failed, it should return False or a string describing the error. """ raise NotImplementedError delete = None """Deletes a song from the device. This will be called once for each song. This is not needed if the device is file-based, i.e. the songs returned by list() have is_file set to True. If the delete was successful, it should return True. If the delete failed, it should return False or a string describing the error. def delete(self, parent_widget, song): ... return True """ cleanup = None """This will be called once after all songs have been copied/deleted. Should return True if no errors occured, or else False. The WaitLoadBar can be used to display messages. def cleanup(self, wlb, action='copy'|'delete'): ... """ def Properties(self): """Returns a list of tuples for device-specific settings which should be displayed in the properties dialog. The first value should be a string and will be used as a title. Include an underline for changeable settings. The second value should be an appropriate gtk.Widget for the setting. It can also be a string, in which case it will be displayed with a Label and won't be changeable. The third value is the name of the object's key which should be set when the widget is changed. If the second value is a string, this will be ignored. Separators can be added by passing (None, None, None). """ return [] def close(self): pass �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/devices/_udev.py����������������������������������������������������������0000644�0001750�0001750�00000017115�13112005742�021030� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation # Basic ctypes wrapper for libudev. # You have to call init() to make class methods available. # Versions: # The first API stable libudev version is 143. # The first API incompatible change (version bump) was introduced in 183 # http://cgit.freedesktop.org/systemd/systemd/commit/?id=20bbd54f603994a3 from quodlibet.util import load_library, print_d from ctypes import POINTER, Structure from ctypes import c_longlong, c_int, c_char_p, c_void_p, c_long, c_char c_void = None dev_t = c_long _classes = [] def init(): """Initialise the bindings. Raises OSError if udev isn't installed""" global _classes udevlib, name = load_library(["libudev.so.1", "libudev.so.0"]) if name.endswith("1"): version = 1 else: version = 0 for info in _classes: _wrap_class(udevlib, version, *info) def _register_class(base, ptr, prefix, methods): global _classes _classes.append((base, ptr, prefix, methods)) def _wrap_class(lib, version, base, ptr, prefix, methods): for method in methods: name, ret, args = method[:3] if len(method) > 3 and method[-1] != version: continue try: func = getattr(lib, prefix + name) except AttributeError: # don't fail on missing ones, just in case.. print_d("missing libudev symbol: %r" % (prefix + name)) continue func.argtypes = args func.restype = ret def add_self(f, check_null=False): def check(*args): # the first arg is the pointer to the struct, check for # null pointers before passing it... args[0].contents return f(*args) return check if args and args[0] == ptr: setattr(ptr, name, add_self(func)) else: setattr(base, name, func) class Udev(Structure): pass class UdevPtr(POINTER(Udev)): _type_ = Udev _register_class(Udev, UdevPtr, "udev_", [ ("ref", UdevPtr, [UdevPtr]), ("unref", c_void, [UdevPtr], 0), ("unref", UdevPtr, [UdevPtr], 1), ("new", UdevPtr, []), #("set_log_fn", None, ... ("get_log_priority", c_int, [UdevPtr]), ("set_log_priority", c_void, [UdevPtr, c_int]), ("get_sys_path", c_char_p, [UdevPtr], 0), ("get_dev_path", c_char_p, [UdevPtr], 0), ("get_userdata", c_void_p, [UdevPtr]), ("set_userdata", c_void, [UdevPtr, c_void_p]), ]) class _UdevListIterator(object): def __init__(self, start_entry): self.__current = start_entry def __iter__(self): return self def __next__(self): next_ = self.__current.get_next() if next_: self.__current = next_ return next_ raise StopIteration next = __next__ class UdevListEntry(Structure): pass class UdevListEntryPtr(POINTER(UdevListEntry)): _type_ = UdevListEntry def __iter__(self): return _UdevListIterator(self) _register_class(UdevListEntry, UdevListEntryPtr, "udev_list_entry_", [ ("get_next", UdevListEntryPtr, [UdevListEntryPtr]), ("get_by_name", UdevListEntryPtr, [UdevListEntryPtr, c_char_p]), ("get_name", c_char_p, [UdevListEntryPtr]), ("get_value", c_char_p, [UdevListEntryPtr]), ]) class UdevDevice(Structure): pass class UdevDevicePtr(POINTER(UdevDevice)): _type_ = UdevDevice _register_class(UdevDevice, UdevDevicePtr, "udev_device_", [ ("ref", UdevDevicePtr, [UdevDevicePtr]), ("unref", c_void, [UdevDevicePtr], 0), ("unref", UdevDevicePtr, [UdevDevicePtr], 1), ("get_udev", UdevPtr, [UdevDevicePtr]), ("new_from_syspath", UdevDevicePtr, [UdevPtr, c_char_p]), ("new_from_devnum", UdevDevicePtr, [UdevPtr, c_char, dev_t]), ("new_from_subsystem_sysname", UdevDevicePtr, [UdevPtr, c_char_p, c_char_p]), ("get_parent", UdevDevicePtr, [UdevDevicePtr]), ("get_parent_with_subsystem_devtype", UdevDevicePtr, [UdevDevicePtr, c_char_p, c_char_p]), ("get_devpath", c_char_p, [UdevDevicePtr]), ("get_subsystem", c_char_p, [UdevDevicePtr]), ("get_devtype", c_char_p, [UdevDevicePtr]), ("get_syspath", c_char_p, [UdevDevicePtr]), ("get_sysname", c_char_p, [UdevDevicePtr]), ("get_sysnum", c_char_p, [UdevDevicePtr]), ("get_devnode", c_char_p, [UdevDevicePtr]), ("get_devlinks_list_entry", UdevListEntryPtr, [UdevDevicePtr]), ("get_properties_list_entry", UdevListEntryPtr, [UdevDevicePtr]), ("get_property_value", c_char_p, [UdevDevicePtr, c_char_p]), ("get_driver", c_char_p, [UdevDevicePtr]), ("get_devnum", dev_t, [UdevDevicePtr]), ("get_action", c_char_p, [UdevDevicePtr]), ("get_sysattr_value", c_char_p, [UdevDevicePtr, c_char_p]), ("get_seqnum", c_longlong, [UdevDevicePtr]), ]) class UdevMonitor(Structure): pass class UdevMonitorPtr(POINTER(UdevMonitor)): _type_ = UdevMonitor _register_class(UdevMonitor, UdevMonitorPtr, "udev_monitor_", [ ("ref", UdevMonitorPtr, [UdevMonitorPtr]), ("unref", c_void, [UdevMonitorPtr], 0), ("unref", UdevMonitorPtr, [UdevMonitorPtr], 1), ("get_udev", UdevPtr, [UdevMonitorPtr]), ("new_from_netlink", UdevMonitorPtr, [UdevPtr, c_char_p]), ("new_from_socket", UdevMonitorPtr, [UdevPtr, c_char_p], 0), ("enable_receiving", c_int, [UdevMonitorPtr]), ("get_fd", c_int, [UdevMonitorPtr]), ("receive_device", UdevDevicePtr, [UdevMonitorPtr]), ("filter_add_match_subsystem_devtype", c_int, [UdevMonitorPtr, c_char_p, c_char_p]), ("filter_update", c_int, [UdevMonitorPtr]), ("filter_remove", c_int, [UdevMonitorPtr]), ]) class UdevEnumerate(Structure): pass class UdevEnumeratePtr(POINTER(UdevEnumerate)): _type_ = UdevEnumerate _register_class(UdevEnumerate, UdevEnumeratePtr, "udev_enumerate_", [ ("ref", UdevEnumeratePtr, [UdevEnumeratePtr]), ("unref", c_void, [UdevEnumeratePtr], 0), ("unref", UdevEnumeratePtr, [UdevEnumeratePtr], 1), ("get_udev", UdevPtr, [UdevEnumeratePtr]), ("new", UdevEnumeratePtr, [UdevPtr]), ("add_match_subsystem", c_int, [UdevEnumeratePtr, c_char_p]), ("add_nomatch_subsystem", c_int, [UdevEnumeratePtr, c_char_p]), ("add_match_sysattr", c_int, [UdevEnumeratePtr, c_char_p, c_char_p]), ("add_nomatch_sysattr", c_int, [UdevEnumeratePtr, c_char_p, c_char_p]), ("add_match_property", c_int, [UdevEnumeratePtr, c_char_p, c_char_p]), ("add_match_sysname", c_int, [UdevEnumeratePtr, c_char_p]), ("add_syspath", c_int, [UdevEnumeratePtr, c_char_p]), ("scan_devices", c_int, [UdevEnumeratePtr]), ("scan_subsystems", c_int, [UdevEnumeratePtr]), ("get_list_entry", UdevListEntryPtr, [UdevEnumeratePtr]), ]) class UdevQueue(Structure): pass class UdevQueuePtr(POINTER(UdevQueue)): _type_ = UdevQueue _register_class(UdevQueue, UdevQueuePtr, "udev_queue_", [ ("ref", UdevQueuePtr, [UdevQueuePtr]), ("unref", c_void, [UdevQueuePtr], 0), ("unref", UdevQueuePtr, [UdevQueuePtr], 1), ("get_udev", UdevPtr, [UdevQueuePtr]), ("new", UdevQueuePtr, [UdevPtr]), ("get_udev_is_active", c_int, [UdevQueuePtr]), ("get_queue_is_empty", c_int, [UdevQueuePtr]), ("get_seqnum_is_finished", c_int, [UdevQueuePtr, c_long]), ("get_seqnum_sequence_is_finished", c_int, [UdevQueuePtr, c_long, c_long]), ("get_queued_list_entry", UdevListEntryPtr, [UdevQueuePtr]), ("get_kernel_seqnum", c_longlong, [UdevQueuePtr]), ("get_udev_seqnum", c_longlong, [UdevQueuePtr]), ]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/compat.py�����������������������������������������������������������������0000644�0001750�0001750�00000010614�13112005742�017564� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright (C) 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import sys PY2 = sys.version_info[0] == 2 PY3 = not PY2 if PY2: import __builtin__ as builtins builtins from urlparse import urlparse, urlunparse, urlsplit, parse_qs urlparse, urlunparse, urlsplit, parse_qs from urllib import pathname2url, url2pathname, quote_plus, unquote_plus, \ urlencode, quote, unquote pathname2url, url2pathname, quote_plus, unquote_plus, urlencode, quote, \ unquote from urllib2 import urlopen, build_opener urlopen, build_opener from cStringIO import StringIO as cBytesIO cBytesIO from StringIO import StringIO StringIO from functools import reduce reduce from operator import div as floordiv from itertools import izip_longest, izip izip_longest, izip import Queue as queue queue xrange = xrange long = long unichr = unichr cmp = cmp getbyte = lambda b, i: b[i] iterbytes = lambda b: iter(b) text_type = unicode string_types = (str, unicode) integer_types = (int, long) number_types = (int, long, float) iteritems = lambda d: d.iteritems() itervalues = lambda d: d.itervalues() iterkeys = lambda d: d.iterkeys() listitems = lambda d: d.items() listkeys = lambda d: d.keys() listvalues = lambda d: d.values() listfilter = filter listmap = map def exec_(_code_, _globs_=None, _locs_=None): if _globs_ is None: frame = sys._getframe(1) _globs_ = frame.f_globals if _locs_ is None: _locs_ = frame.f_locals del frame elif _locs_ is None: _locs_ = _globs_ exec("""exec _code_ in _globs_, _locs_""") exec("def reraise(tp, value, tb):\n raise tp, value, tb") def swap_to_string(cls): if "__str__" in cls.__dict__: cls.__unicode__ = cls.__str__ if "__bytes__" in cls.__dict__: cls.__str__ = cls.__bytes__ return cls escape_decode = lambda b: b.decode("string-escape") elif PY3: import builtins builtins from urllib.parse import urlparse, urlunparse, quote_plus, unquote_plus, \ urlsplit, parse_qs, urlencode, quote, unquote urlparse, quote_plus, unquote_plus, urlunparse, urlsplit, parse_qs, \ urlencode, quote, unquote from urllib.request import pathname2url, url2pathname pathname2url, url2pathname from urllib.request import urlopen, build_opener urlopen, build_opener from io import BytesIO as cBytesIO cBytesIO from io import StringIO StringIO = StringIO from functools import reduce reduce from operator import floordiv floordiv from itertools import zip_longest as izip_longest izip_longest import codecs import queue queue xrange = range long = int unichr = chr cmp = lambda a, b: (a > b) - (a < b) izip = zip getbyte = lambda b, i: b[i:i + 1] iterbytes = lambda b: (bytes([v]) for v in b) text_type = str string_types = (str,) integer_types = (int,) number_types = (int, float) iteritems = lambda d: iter(d.items()) itervalues = lambda d: iter(d.values()) iterkeys = lambda d: iter(d.keys()) listitems = lambda d: list(d.items()) listkeys = lambda d: list(d.keys()) listvalues = lambda d: list(d.values()) listfilter = lambda *x: list(filter(*x)) listmap = lambda *x: list(map(*x)) import builtins exec_ = getattr(builtins, "exec") def reraise(tp, value, tb): raise tp(value).with_traceback(tb) def swap_to_string(cls): return cls escape_decode = lambda b: codecs.escape_decode(b)[0] # taken from six def add_metaclass(metaclass): """Class decorator for creating a class with a metaclass.""" def wrapper(cls): orig_vars = cls.__dict__.copy() slots = orig_vars.get('__slots__') if slots is not None: if isinstance(slots, str): slots = [slots] for slots_var in slots: orig_vars.pop(slots_var) orig_vars.pop('__dict__', None) orig_vars.pop('__weakref__', None) return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper ��������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/�����������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017501� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/senf/������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020434� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/senf/_winapi.py��������������������������������������������������0000644�0001750�0001750�00000013223�13112005742�022437� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import ctypes from ctypes import WinDLL, wintypes shell32 = WinDLL("shell32") kernel32 = WinDLL("kernel32") shlwapi = WinDLL("shlwapi") GetCommandLineW = kernel32.GetCommandLineW GetCommandLineW.argtypes = [] GetCommandLineW.restype = wintypes.LPCWSTR CommandLineToArgvW = shell32.CommandLineToArgvW CommandLineToArgvW.argtypes = [ wintypes.LPCWSTR, ctypes.POINTER(ctypes.c_int)] CommandLineToArgvW.restype = ctypes.POINTER(wintypes.LPWSTR) LocalFree = kernel32.LocalFree LocalFree.argtypes = [wintypes.HLOCAL] LocalFree.restype = wintypes.HLOCAL # https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751.aspx LPCTSTR = ctypes.c_wchar_p LPWSTR = wintypes.LPWSTR LPCWSTR = ctypes.c_wchar_p LPTSTR = LPWSTR PCWSTR = ctypes.c_wchar_p PCTSTR = PCWSTR PWSTR = ctypes.c_wchar_p PTSTR = PWSTR LPVOID = wintypes.LPVOID WCHAR = wintypes.WCHAR LPSTR = ctypes.c_char_p BOOL = wintypes.BOOL LPBOOL = ctypes.POINTER(BOOL) UINT = wintypes.UINT WORD = wintypes.WORD DWORD = wintypes.DWORD SHORT = wintypes.SHORT HANDLE = wintypes.HANDLE ULONG = wintypes.ULONG LPCSTR = wintypes.LPCSTR STD_INPUT_HANDLE = DWORD(-10) STD_OUTPUT_HANDLE = DWORD(-11) STD_ERROR_HANDLE = DWORD(-12) INVALID_HANDLE_VALUE = wintypes.HANDLE(-1).value INTERNET_MAX_SCHEME_LENGTH = 32 INTERNET_MAX_PATH_LENGTH = 2048 INTERNET_MAX_URL_LENGTH = ( INTERNET_MAX_SCHEME_LENGTH + len("://") + INTERNET_MAX_PATH_LENGTH) FOREGROUND_BLUE = 0x0001 FOREGROUND_GREEN = 0x0002 FOREGROUND_RED = 0x0004 FOREGROUND_INTENSITY = 0x0008 BACKGROUND_BLUE = 0x0010 BACKGROUND_GREEN = 0x0020 BACKGROUND_RED = 0x0040 BACKGROUND_INTENSITY = 0x0080 COMMON_LVB_REVERSE_VIDEO = 0x4000 COMMON_LVB_UNDERSCORE = 0x8000 UrlCreateFromPathW = shlwapi.UrlCreateFromPathW UrlCreateFromPathW.argtypes = [ PCTSTR, PTSTR, ctypes.POINTER(DWORD), DWORD] UrlCreateFromPathW.restype = ctypes.HRESULT SetEnvironmentVariableW = kernel32.SetEnvironmentVariableW SetEnvironmentVariableW.argtypes = [LPCTSTR, LPCTSTR] SetEnvironmentVariableW.restype = wintypes.BOOL GetEnvironmentVariableW = kernel32.GetEnvironmentVariableW GetEnvironmentVariableW.argtypes = [LPCTSTR, LPTSTR, DWORD] GetEnvironmentVariableW.restype = DWORD GetEnvironmentStringsW = kernel32.GetEnvironmentStringsW GetEnvironmentStringsW.argtypes = [] GetEnvironmentStringsW.restype = ctypes.c_void_p FreeEnvironmentStringsW = kernel32.FreeEnvironmentStringsW FreeEnvironmentStringsW.argtypes = [ctypes.c_void_p] FreeEnvironmentStringsW.restype = ctypes.c_bool GetStdHandle = kernel32.GetStdHandle GetStdHandle.argtypes = [DWORD] GetStdHandle.restype = HANDLE class COORD(ctypes.Structure): _fields_ = [ ("X", SHORT), ("Y", SHORT), ] class SMALL_RECT(ctypes.Structure): _fields_ = [ ("Left", SHORT), ("Top", SHORT), ("Right", SHORT), ("Bottom", SHORT), ] class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure): _fields_ = [ ("dwSize", COORD), ("dwCursorPosition", COORD), ("wAttributes", WORD), ("srWindow", SMALL_RECT), ("dwMaximumWindowSize", COORD), ] GetConsoleScreenBufferInfo = kernel32.GetConsoleScreenBufferInfo GetConsoleScreenBufferInfo.argtypes = [ HANDLE, ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO)] GetConsoleScreenBufferInfo.restype = BOOL GetConsoleOutputCP = kernel32.GetConsoleOutputCP GetConsoleOutputCP.argtypes = [] GetConsoleOutputCP.restype = UINT SetConsoleOutputCP = kernel32.SetConsoleOutputCP SetConsoleOutputCP.argtypes = [UINT] SetConsoleOutputCP.restype = BOOL GetConsoleCP = kernel32.GetConsoleCP GetConsoleCP.argtypes = [] GetConsoleCP.restype = UINT SetConsoleCP = kernel32.SetConsoleCP SetConsoleCP.argtypes = [UINT] SetConsoleCP.restype = BOOL SetConsoleTextAttribute = kernel32.SetConsoleTextAttribute SetConsoleTextAttribute.argtypes = [HANDLE, WORD] SetConsoleTextAttribute.restype = BOOL SetConsoleCursorPosition = kernel32.SetConsoleCursorPosition SetConsoleCursorPosition.argtypes = [HANDLE, COORD] SetConsoleCursorPosition.restype = BOOL ReadConsoleW = kernel32.ReadConsoleW ReadConsoleW.argtypes = [HANDLE, LPVOID, DWORD, ctypes.POINTER(DWORD), LPVOID] ReadConsoleW.restype = BOOL MultiByteToWideChar = kernel32.MultiByteToWideChar MultiByteToWideChar.argtypes = [ UINT, DWORD, LPCSTR, ctypes.c_int, LPWSTR, ctypes.c_int] MultiByteToWideChar.restype = ctypes.c_int WideCharToMultiByte = kernel32.WideCharToMultiByte WideCharToMultiByte.argtypes = [ UINT, DWORD, LPCWSTR, ctypes.c_int, LPSTR, ctypes.c_int, LPCSTR, LPBOOL] WideCharToMultiByte.restpye = ctypes.c_int MoveFileW = kernel32.MoveFileW MoveFileW.argtypes = [LPCTSTR, LPCTSTR] MoveFileW.restype = BOOL �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/senf/_environ.py�������������������������������������������������0000644�0001750�0001750�00000015173�13112005742�022636� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os import ctypes import collections from ._compat import text_type, PY2 from ._fsnative import path2fsn, is_win, _fsn2legacy, fsnative from . import _winapi as winapi def get_windows_env_var(key): """Get an env var. Raises: WindowsError """ if not isinstance(key, text_type): raise TypeError("%r not of type %r" % (key, text_type)) buf = ctypes.create_unicode_buffer(32767) stored = winapi.GetEnvironmentVariableW(key, buf, 32767) if stored == 0: raise ctypes.WinError() return buf[:stored] def set_windows_env_var(key, value): """Set an env var. Raises: WindowsError """ if not isinstance(key, text_type): raise TypeError("%r not of type %r" % (key, text_type)) if not isinstance(value, text_type): raise TypeError("%r not of type %r" % (value, text_type)) status = winapi.SetEnvironmentVariableW(key, value) if status == 0: raise ctypes.WinError() def del_windows_env_var(key): """Delete an env var. Raises: WindowsError """ if not isinstance(key, text_type): raise TypeError("%r not of type %r" % (key, text_type)) status = winapi.SetEnvironmentVariableW(key, None) if status == 0: raise ctypes.WinError() def read_windows_environ(): """Returns a unicode dict of the Windows environment. Raises: WindowsEnvironError """ res = winapi.GetEnvironmentStringsW() if not res: raise ctypes.WinError() res = ctypes.cast(res, ctypes.POINTER(ctypes.c_wchar)) done = [] current = u"" i = 0 while 1: c = res[i] i += 1 if c == u"\x00": if not current: break done.append(current) current = u"" continue current += c dict_ = {} for entry in done: try: key, value = entry.split(u"=", 1) except ValueError: continue key = _norm_key(key) dict_[key] = value status = winapi.FreeEnvironmentStringsW(res) if status == 0: raise ctypes.WinError() return dict_ def _norm_key(key): assert isinstance(key, fsnative) if is_win: key = key.upper() return key class Environ(collections.MutableMapping): """Dict[`fsnative`, `fsnative`]: Like `os.environ` but contains unicode keys and values under Windows + Python 2. Any changes made will be forwarded to `os.environ`. """ def __init__(self): if is_win and PY2: try: env = read_windows_environ() except WindowsError: env = {} else: env = os.environ self._env = env def __getitem__(self, key): key = _norm_key(path2fsn(key)) return self._env[key] def __setitem__(self, key, value): key = _norm_key(path2fsn(key)) value = path2fsn(value) if is_win and PY2: # this calls putenv, so do it first and replace later try: os.environ[_fsn2legacy(key)] = _fsn2legacy(value) except OSError: raise ValueError try: set_windows_env_var(key, value) except WindowsError: # py3+win fails for invalid keys. try to do the same raise ValueError try: self._env[key] = value except OSError: raise ValueError def __delitem__(self, key): key = _norm_key(path2fsn(key)) if is_win and PY2: try: del_windows_env_var(key) except WindowsError: pass try: del os.environ[_fsn2legacy(key)] except KeyError: pass del self._env[key] def __iter__(self): return iter(self._env) def __len__(self): return len(self._env) def __repr__(self): return repr(self._env) def copy(self): return self._env.copy() environ = Environ() def getenv(key, value=None): """Like `os.getenv` but returns unicode under Windows + Python 2 Args: key (pathlike): The env var to get value (object): The value to return if the env var does not exist Returns: `fsnative` or `object`: The env var or the passed value if it doesn't exist """ key = path2fsn(key) if is_win and PY2: return environ.get(key, value) return os.getenv(key, value) def unsetenv(key): """Like `os.unsetenv` but takes unicode under Windows + Python 2 Args: key (pathlike): The env var to unset """ key = path2fsn(key) if is_win: # python 3 has no unsetenv under Windows -> use our ctypes one as well try: del_windows_env_var(key) except WindowsError: pass else: os.unsetenv(key) def putenv(key, value): """Like `os.putenv` but takes unicode under Windows + Python 2 Args: key (pathlike): The env var to get value (pathlike): The value to set Raises: ValueError """ key = path2fsn(key) value = path2fsn(value) if is_win and PY2: try: set_windows_env_var(key, value) except WindowsError: # py3 + win fails here raise ValueError else: try: os.putenv(key, value) except OSError: # win + py3 raise here for invalid keys which is probably a bug. # ValueError seems better raise ValueError �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/senf/_stdlib.py��������������������������������������������������0000644�0001750�0001750�00000010562�13112005742�022434� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import re import os from ._fsnative import path2fsn, fsnative, is_win from ._compat import PY2 from ._environ import environ sep = path2fsn(os.sep) pathsep = path2fsn(os.pathsep) curdir = path2fsn(os.curdir) pardir = path2fsn(os.pardir) altsep = path2fsn(os.altsep) if os.altsep is not None else None extsep = path2fsn(os.extsep) devnull = path2fsn(os.devnull) defpath = path2fsn(os.defpath) def getcwd(): """Like `os.getcwd` but returns a `fsnative` path Returns: `fsnative` """ if is_win and PY2: return os.getcwdu() return os.getcwd() def _get_userdir(user=None): """Returns the user dir or None""" if user is not None and not isinstance(user, fsnative): raise TypeError if is_win: if "HOME" in environ: path = environ["HOME"] elif "USERPROFILE" in environ: path = environ["USERPROFILE"] elif "HOMEPATH" in environ and "HOMEDRIVE" in environ: path = os.path.join(environ["HOMEDRIVE"], environ["HOMEPATH"]) else: return if user is None: return path else: return os.path.join(os.path.dirname(path), user) else: import pwd if user is None: if "HOME" in environ: return environ["HOME"] else: try: return path2fsn(pwd.getpwuid(os.getuid()).pw_dir) except KeyError: return else: try: return path2fsn(pwd.getpwnam(user).pw_dir) except KeyError: return def expanduser(path): """ Args: path (pathlike): A path to expand Returns: `fsnative` Like :func:`python:os.path.expanduser` but supports unicode home directories under Windows + Python 2 and always returns a `fsnative`. """ path = path2fsn(path) if path == "~": return _get_userdir() elif path.startswith("~" + sep) or ( altsep is not None and path.startswith("~" + altsep)): userdir = _get_userdir() if userdir is None: return path return userdir + path[1:] elif path.startswith("~"): sep_index = path.find(sep) if altsep is not None: alt_index = path.find(altsep) if alt_index != -1 and alt_index < sep_index: sep_index = alt_index if sep_index == -1: user = path[1:] rest = "" else: user = path[1:sep_index] rest = path[sep_index:] userdir = _get_userdir(user) if userdir is not None: return userdir + rest else: return path else: return path def expandvars(path): """ Args: path (pathlike): A path to expand Returns: `fsnative` Like :func:`python:os.path.expandvars` but supports unicode under Windows + Python 2 and always returns a `fsnative`. """ path = path2fsn(path) def repl_func(match): return environ.get(match.group(1), match.group(0)) path = re.compile(r"\$(\w+)", flags=re.UNICODE).sub(repl_func, path) if os.name == "nt": path = re.sub(r"%([^%]+)%", repl_func, path) return re.sub(r"\$\{([^\}]+)\}", repl_func, path) ����������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/senf/_compat.py��������������������������������������������������0000644�0001750�0001750�00000003715�13112005742�022440� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import sys PY2 = sys.version_info[0] == 2 PY3 = not PY2 if PY2: from urlparse import urlparse, urlunparse urlparse, urlunparse from urllib import pathname2url, url2pathname, quote, unquote pathname2url, url2pathname, quote, unquote from StringIO import StringIO BytesIO = StringIO from io import StringIO as TextIO TextIO string_types = (str, unicode) text_type = unicode iteritems = lambda d: d.iteritems() elif PY3: from urllib.parse import urlparse, quote, unquote, urlunparse urlparse, quote, unquote, urlunparse from urllib.request import pathname2url, url2pathname pathname2url, url2pathname from io import StringIO StringIO = StringIO TextIO = StringIO from io import BytesIO BytesIO = BytesIO string_types = (str,) text_type = str iteritems = lambda d: iter(d.items()) ���������������������������������������������������quodlibet-3.9.1/quodlibet/packages/senf/__init__.py�������������������������������������������������0000644�0001750�0001750�00000005205�13112005742�022551� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os if os.name != "nt": # make imports work _winapi = object() from ._fsnative import fsnative, path2fsn, fsn2text, fsn2bytes, \ bytes2fsn, uri2fsn, fsn2uri, text2fsn from ._print import print_, input_ from ._stdlib import sep, pathsep, curdir, pardir, altsep, extsep, devnull, \ defpath, getcwd, expanduser, expandvars from ._argv import argv from ._environ import environ, getenv, unsetenv, putenv from ._temp import mkstemp, gettempdir, gettempprefix, mkdtemp fsnative, print_, getcwd, getenv, unsetenv, putenv, environ, expandvars, \ path2fsn, fsn2text, fsn2bytes, bytes2fsn, uri2fsn, fsn2uri, mkstemp, \ gettempdir, gettempprefix, mkdtemp, input_, expanduser, text2fsn version = (1, 2, 2) """Tuple[`int`, `int`, `int`]: The version tuple (major, minor, micro)""" version_string = ".".join(map(str, version)) """`str`: A version string""" argv = argv """List[`fsnative`]: Like `sys.argv` but contains unicode under Windows + Python 2 """ sep = sep """`fsnative`: Like `os.sep` but a `fsnative`""" pathsep = pathsep """`fsnative`: Like `os.pathsep` but a `fsnative`""" curdir = curdir """`fsnative`: Like `os.curdir` but a `fsnative`""" pardir = pardir """`fsnative`: Like `os.pardir` but a fsnative""" altsep = altsep """`fsnative` or `None`: Like `os.altsep` but a `fsnative` or `None`""" extsep = extsep """`fsnative`: Like `os.extsep` but a `fsnative`""" devnull = devnull """`fsnative`: Like `os.devnull` but a `fsnative`""" defpath = defpath """`fsnative`: Like `os.defpath` but a `fsnative`""" __all__ = [] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/senf/_fsnative.py������������������������������������������������0000644�0001750�0001750�00000043752�13112005742�023001� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os import sys import ctypes import codecs from . import _winapi as winapi from ._compat import text_type, PY3, PY2, url2pathname, urlparse, quote, \ unquote, urlunparse is_win = os.name == "nt" is_unix = not is_win is_darwin = sys.platform == "darwin" _surrogatepass = "strict" if PY2 else "surrogatepass" def _normalize_codec(codec, _cache={}): """Raises LookupError""" try: return _cache[codec] except KeyError: _cache[codec] = codecs.lookup(codec).name return _cache[codec] def _swap_bytes(data): """swaps bytes for 16 bit, leaves remaining trailing bytes alone""" a, b = data[1::2], data[::2] data = bytearray().join(bytearray(x) for x in zip(a, b)) if len(b) > len(a): data += b[-1:] return bytes(data) def _codec_fails_on_encode_surrogates(codec, _cache={}): """Returns if a codec fails correctly when passing in surrogates with a surrogatepass/surrogateescape error handler. Some codecs were broken in Python <3.4 """ try: return _cache[codec] except KeyError: try: u"\uD800\uDC01".encode(codec) except UnicodeEncodeError: _cache[codec] = True else: _cache[codec] = False return _cache[codec] def _codec_can_decode_with_surrogatepass(codec, _cache={}): """Returns if a codec supports the surrogatepass error handler when decoding. Some codecs were broken in Python <3.4 """ try: return _cache[codec] except KeyError: try: u"\ud83d".encode( codec, _surrogatepass).decode(codec, _surrogatepass) except UnicodeDecodeError: _cache[codec] = False else: _cache[codec] = True return _cache[codec] def _bytes2winpath(data, codec): """Like data.decode(codec, 'surrogatepass') but makes utf-16-le/be work on Python < 3.4 + Windows https://bugs.python.org/issue27971 Raises UnicodeDecodeError, LookupError """ try: return data.decode(codec, _surrogatepass) except UnicodeDecodeError: if not _codec_can_decode_with_surrogatepass(codec): if _normalize_codec(codec) == "utf-16-be": data = _swap_bytes(data) codec = "utf-16-le" if _normalize_codec(codec) == "utf-16-le": buffer_ = ctypes.create_string_buffer(data + b"\x00\x00") value = ctypes.wstring_at(buffer_, len(data) // 2) if value.encode("utf-16-le", _surrogatepass) != data: raise return value else: raise else: raise def _winpath2bytes_py3(text, codec): """Fallback implementation for text including surrogates""" # merge surrogate codepoints if _normalize_codec(codec).startswith("utf-16"): # fast path, utf-16 merges anyway return text.encode(codec, _surrogatepass) return _bytes2winpath( text.encode("utf-16-le", _surrogatepass), "utf-16-le").encode(codec, _surrogatepass) if PY2: def _winpath2bytes(text, codec): return text.encode(codec) else: def _winpath2bytes(text, codec): if _codec_fails_on_encode_surrogates(codec): try: return text.encode(codec) except UnicodeEncodeError: return _winpath2bytes_py3(text, codec) else: return _winpath2bytes_py3(text, codec) def _fsn2legacy(path): """Takes a fsnative path and returns a path that can be put into os.environ or sys.argv. Might result in a mangled path on Python2 + Windows. Can't fail. Args: path (fsnative) Returns: str """ if PY2 and is_win: return path.encode(_encoding, "replace") return path def _fsnative(text): if not isinstance(text, text_type): raise TypeError("%r needs to be a text type (%r)" % (text, text_type)) if is_unix: # First we go to bytes so we can be sure we have a valid source. # Theoretically we should fail here in case we have a non-unicode # encoding. But this would make everything complicated and there is # no good way to handle a failure from the user side. Instead # fall back to utf-8 which is the most likely the right choice in # a mis-configured environment encoding = _encoding try: path = text.encode(encoding, _surrogatepass) except UnicodeEncodeError: path = text.encode("utf-8", _surrogatepass) if b"\x00" in path: path = path.replace(b"\x00", fsn2bytes(_fsnative(u"\uFFFD"), None)) if PY3: return path.decode(_encoding, "surrogateescape") return path else: if u"\x00" in text: text = text.replace(u"\x00", u"\uFFFD") return text def _create_fsnative(type_): # a bit of magic to make fsnative(u"foo") and isinstance(path, fsnative) # work class meta(type): def __instancecheck__(self, instance): return _typecheck_fsnative(instance) def __subclasscheck__(self, subclass): return issubclass(subclass, type_) class impl(object): """fsnative(text=u"") Args: text (text): The text to convert to a path Returns: fsnative: The new path. Raises: TypeError: In case something other then `text` has been passed This type is a virtual base class for the real path type. Instantiating it returns an instance of the real path type and it overrides instance and subclass checks so that `isinstance` and `issubclass` checks work: :: isinstance(fsnative(u"foo"), fsnative) == True issubclass(type(fsnative(u"foo")), fsnative) == True The real returned type is: - **Python 2 + Windows:** :obj:`python:unicode`, with ``surrogates``, without ``null`` - **Python 2 + Unix:** :obj:`python:str`, without ``null`` - **Python 3 + Windows:** :obj:`python3:str`, with ``surrogates``, without ``null`` - **Python 3 + Unix:** :obj:`python3:str`, with ``surrogates``, without ``null``, without code points not encodable with the locale encoding Constructing a `fsnative` can't fail. Passing a `fsnative` to :func:`open` will never lead to `ValueError` or `TypeError`. Any operation on `fsnative` can also use the `str` type, as long as the `str` only contains ASCII and no NULL. """ def __new__(cls, text=u""): return _fsnative(text) new_type = meta("fsnative", (object,), dict(impl.__dict__)) new_type.__module__ = "senf" return new_type fsnative_type = text_type if is_win or PY3 else bytes fsnative = _create_fsnative(fsnative_type) def _typecheck_fsnative(path): """ Args: path (object) Returns: bool: if path is a fsnative """ if not isinstance(path, fsnative_type): return False if PY3 or is_win: if u"\x00" in path: return False if is_unix and not _is_unicode_encoding: try: path.encode(_encoding, "surrogateescape") except UnicodeEncodeError: return False elif b"\x00" in path: return False return True def _fsn2native(path): """ Args: path (fsnative) Returns: `text` on Windows, `bytes` on Unix Raises: TypeError: in case the type is wrong or the ´str` on Py3 + Unix can't be converted to `bytes` This helper allows to validate the type and content of a path. To reduce overhead the encoded value for Py3 + Unix is returned so it can be reused. """ if not isinstance(path, fsnative_type): raise TypeError("path needs to be %s, not %s" % ( fsnative_type.__name__, type(path).__name__)) if is_unix: if PY3: try: path = path.encode(_encoding, "surrogateescape") except UnicodeEncodeError: assert not _is_unicode_encoding # This look more like ValueError, but raising only one error # makes things simpler... also one could say str + surrogates # is its own type raise TypeError( "path contained Unicode code points not valid in" "the current path encoding. To create a valid " "path from Unicode use text2fsn()") if b"\x00" in path: raise TypeError("fsnative can't contain nulls") else: if u"\x00" in path: raise TypeError("fsnative can't contain nulls") return path def _get_encoding(): """The encoding used for paths, argv, environ, stdout and stdin""" encoding = sys.getfilesystemencoding() if encoding is None: if is_darwin: encoding = "utf-8" elif is_win: encoding = "mbcs" else: encoding = "ascii" encoding = _normalize_codec(encoding) return encoding _encoding = _get_encoding() _is_unicode_encoding = _encoding.startswith("utf") def path2fsn(path): """ Args: path (pathlike): The path to convert Returns: `fsnative` Raises: TypeError: In case the type can't be converted to a `fsnative` ValueError: In case conversion fails Returns a `fsnative` path for a `pathlike`. """ # allow mbcs str on py2+win and bytes on py3 if PY2: if is_win: if isinstance(path, bytes): path = path.decode(_encoding) else: if isinstance(path, text_type): path = path.encode(_encoding) if "\x00" in path: raise ValueError("embedded null") else: path = getattr(os, "fspath", lambda x: x)(path) if isinstance(path, bytes): if b"\x00" in path: raise ValueError("embedded null") path = path.decode(_encoding, "surrogateescape") elif is_unix and isinstance(path, str): # make sure we can encode it and this is not just some random # unicode string data = path.encode(_encoding, "surrogateescape") if b"\x00" in data: raise ValueError("embedded null") else: if u"\x00" in path: raise ValueError("embedded null") if not isinstance(path, fsnative_type): raise TypeError("path needs to be %s", fsnative_type.__name__) return path def fsn2text(path, strict=False): """ Args: path (fsnative): The path to convert strict (bool): Fail in case the conversion is not reversible Returns: `text` Raises: TypeError: In case no `fsnative` has been passed ValueError: In case ``strict`` was True and the conversion failed Converts a `fsnative` path to `text`. Can be used to pass a path to some unicode API, like for example a GUI toolkit. If ``strict`` is True the conversion will fail in case it is not reversible. This can be useful for converting program arguments that are supposed to be text and erroring out in case they are not. Encoding with a Unicode encoding will always succeed with the result. """ path = _fsn2native(path) errors = "strict" if strict else "replace" if is_win: return path.encode("utf-16-le", _surrogatepass).decode("utf-16-le", errors) else: return path.decode(_encoding, errors) def text2fsn(text): """ Args: text (text): The text to convert Returns: `fsnative` Raises: TypeError: In case no `text` has been passed Takes `text` and converts it to a `fsnative`. This operation is not reversible and can't fail. """ return fsnative(text) def fsn2bytes(path, encoding): """ Args: path (fsnative): The path to convert encoding (`str` or `None`): `None` if you don't care about Windows Returns: `bytes` Raises: TypeError: If no `fsnative` path is passed ValueError: If encoding fails or no encoding is given Converts a `fsnative` path to `bytes`. The passed *encoding* is only used on platforms where paths are not associated with an encoding (Windows for example). If you don't care about Windows you can pass `None`. For Windows paths, lone surrogates will be encoded like normal code points and surrogate pairs will be merged before encoding. In case of ``utf-8`` or ``utf-16-le`` this is equal to the `WTF-8 and WTF-16 encoding <https://simonsapin.github.io/wtf-8/>`__. """ path = _fsn2native(path) if is_win: if encoding is None: raise ValueError("invalid encoding %r" % encoding) try: return _winpath2bytes(path, encoding) except LookupError: raise ValueError("invalid encoding %r" % encoding) else: return path def bytes2fsn(data, encoding): """ Args: data (bytes): The data to convert encoding (`str` or `None`): `None` if you don't care about Windows Returns: `fsnative` Raises: TypeError: If no `bytes` path is passed ValueError: If decoding fails or no encoding is given Turns `bytes` to a `fsnative` path. The passed *encoding* is only used on platforms where paths are not associated with an encoding (Windows for example). If you don't care about Windows you can pass `None`. """ if not isinstance(data, bytes): raise TypeError("data needs to be bytes") if is_win: if encoding is None: raise ValueError("invalid encoding %r" % encoding) try: path = _bytes2winpath(data, encoding) except LookupError: raise ValueError("invalid encoding %r" % encoding) if u"\x00" in path: raise ValueError("contains nulls") return path else: if b"\x00" in data: raise ValueError("contains nulls") if PY2: return data else: return data.decode(_encoding, "surrogateescape") def uri2fsn(uri): """ Args: uri (`text` or :obj:`python:str`): A file URI Returns: `fsnative` Raises: TypeError: In case an invalid type is passed ValueError: In case the URI isn't a valid file URI Takes a file URI and returns a `fsnative` path """ if PY2: if isinstance(uri, text_type): uri = uri.encode("utf-8") if not isinstance(uri, bytes): raise TypeError("uri needs to be ascii str or unicode") else: if not isinstance(uri, str): raise TypeError("uri needs to be str") parsed = urlparse(uri) scheme = parsed.scheme netloc = parsed.netloc path = parsed.path if scheme != "file": raise ValueError("Not a file URI: %r" % uri) if not path: raise ValueError("Invalid file URI: %r" % uri) uri = urlunparse(parsed)[7:] if is_win: path = url2pathname(uri) if netloc: path = "\\\\" + path if PY2: path = path.decode("utf-8") if u"\x00" in path: raise ValueError("embedded null") return path else: path = url2pathname(uri) if "\x00" in path: raise ValueError("embedded null") if PY3: path = fsnative(path) return path def fsn2uri(path): """ Args: path (fsnative): The path to convert to an URI Returns: `text`: An ASCII only URI Raises: TypeError: If no `fsnative` was passed ValueError: If the path can't be converted Takes a `fsnative` path and returns a file URI. On Windows non-ASCII characters will be encoded using utf-8 and then percent encoded. """ path = _fsn2native(path) def _quote_path(path): # RFC 2396 path = quote(path, "/:@&=+$,") if PY2: path = path.decode("ascii") return path if is_win: buf = ctypes.create_unicode_buffer(winapi.INTERNET_MAX_URL_LENGTH) length = winapi.DWORD(winapi.INTERNET_MAX_URL_LENGTH) flags = 0 try: winapi.UrlCreateFromPathW(path, buf, ctypes.byref(length), flags) except WindowsError as e: raise ValueError(e) uri = buf[:length.value] # For some reason UrlCreateFromPathW escapes some chars outside of # ASCII and some not. Unquote and re-quote with utf-8. if PY3: # latin-1 maps code points directly to bytes, which is what we want uri = unquote(uri, "latin-1") else: # Python 2 does what we want by default uri = unquote(uri) return _quote_path(uri.encode("utf-8", _surrogatepass)) else: return u"file://" + _quote_path(path) ����������������������quodlibet-3.9.1/quodlibet/packages/senf/_winansi.py�������������������������������������������������0000644�0001750�0001750�00000024544�13112005742�022630� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import ctypes import re import atexit from . import _winapi as winapi def ansi_parse(code): """Returns command, (args)""" return code[-1:], tuple([int(v or "0") for v in code[2:-1].split(";")]) def ansi_split(text, _re=re.compile(u"(\x1b\[(\d*;?)*\S)")): """Yields (is_ansi, text)""" for part in _re.split(text): if part: yield (bool(_re.match(part)), part) class AnsiCommand(object): TEXT = "m" MOVE_UP = "A" MOVE_DOWN = "B" MOVE_FORWARD = "C" MOVE_BACKWARD = "D" SET_POS = "H" SET_POS_ALT = "f" SAVE_POS = "s" RESTORE_POS = "u" class TextAction(object): RESET_ALL = 0 SET_BOLD = 1 SET_DIM = 2 SET_ITALIC = 3 SET_UNDERLINE = 4 SET_BLINK = 5 SET_BLINK_FAST = 6 SET_REVERSE = 7 SET_HIDDEN = 8 RESET_BOLD = 21 RESET_DIM = 22 RESET_ITALIC = 23 RESET_UNDERLINE = 24 RESET_BLINK = 25 RESET_BLINK_FAST = 26 RESET_REVERSE = 27 RESET_HIDDEN = 28 FG_BLACK = 30 FG_RED = 31 FG_GREEN = 32 FG_YELLOW = 33 FG_BLUE = 34 FG_MAGENTA = 35 FG_CYAN = 36 FG_WHITE = 37 FG_DEFAULT = 39 FG_LIGHT_BLACK = 90 FG_LIGHT_RED = 91 FG_LIGHT_GREEN = 92 FG_LIGHT_YELLOW = 93 FG_LIGHT_BLUE = 94 FG_LIGHT_MAGENTA = 95 FG_LIGHT_CYAN = 96 FG_LIGHT_WHITE = 97 BG_BLACK = 40 BG_RED = 41 BG_GREEN = 42 BG_YELLOW = 43 BG_BLUE = 44 BG_MAGENTA = 45 BG_CYAN = 46 BG_WHITE = 47 BG_DEFAULT = 49 BG_LIGHT_BLACK = 100 BG_LIGHT_RED = 101 BG_LIGHT_GREEN = 102 BG_LIGHT_YELLOW = 103 BG_LIGHT_BLUE = 104 BG_LIGHT_MAGENTA = 105 BG_LIGHT_CYAN = 106 BG_LIGHT_WHITE = 107 class AnsiState(object): def __init__(self): self.default_attrs = None self.bold = False self.bg_light = False self.fg_light = False self.saved_pos = (0, 0) def do_text_action(self, attrs, action): # In case the external state has changed, apply it it to ours. # Mostly the first time this is called. if attrs & winapi.FOREGROUND_INTENSITY and not self.fg_light \ and not self.bold: self.fg_light = True if attrs & winapi.BACKGROUND_INTENSITY and not self.bg_light: self.bg_light = True dark_fg = { TextAction.FG_BLACK: 0, TextAction.FG_RED: winapi.FOREGROUND_RED, TextAction.FG_GREEN: winapi.FOREGROUND_GREEN, TextAction.FG_YELLOW: winapi.FOREGROUND_GREEN | winapi.FOREGROUND_RED, TextAction.FG_BLUE: winapi.FOREGROUND_BLUE, TextAction.FG_MAGENTA: winapi.FOREGROUND_BLUE | winapi.FOREGROUND_RED, TextAction.FG_CYAN: winapi.FOREGROUND_BLUE | winapi.FOREGROUND_GREEN, TextAction.FG_WHITE: winapi.FOREGROUND_BLUE | winapi.FOREGROUND_GREEN | winapi.FOREGROUND_RED, } dark_bg = { TextAction.BG_BLACK: 0, TextAction.BG_RED: winapi.BACKGROUND_RED, TextAction.BG_GREEN: winapi.BACKGROUND_GREEN, TextAction.BG_YELLOW: winapi.BACKGROUND_GREEN | winapi.BACKGROUND_RED, TextAction.BG_BLUE: winapi.BACKGROUND_BLUE, TextAction.BG_MAGENTA: winapi.BACKGROUND_BLUE | winapi.BACKGROUND_RED, TextAction.BG_CYAN: winapi.BACKGROUND_BLUE | winapi.BACKGROUND_GREEN, TextAction.BG_WHITE: winapi.BACKGROUND_BLUE | winapi.BACKGROUND_GREEN | winapi.BACKGROUND_RED, } light_fg = { TextAction.FG_LIGHT_BLACK: 0, TextAction.FG_LIGHT_RED: winapi.FOREGROUND_RED, TextAction.FG_LIGHT_GREEN: winapi.FOREGROUND_GREEN, TextAction.FG_LIGHT_YELLOW: winapi.FOREGROUND_GREEN | winapi.FOREGROUND_RED, TextAction.FG_LIGHT_BLUE: winapi.FOREGROUND_BLUE, TextAction.FG_LIGHT_MAGENTA: winapi.FOREGROUND_BLUE | winapi.FOREGROUND_RED, TextAction.FG_LIGHT_CYAN: winapi.FOREGROUND_BLUE | winapi.FOREGROUND_GREEN, TextAction.FG_LIGHT_WHITE: winapi.FOREGROUND_BLUE | winapi.FOREGROUND_GREEN | winapi.FOREGROUND_RED, } light_bg = { TextAction.BG_LIGHT_BLACK: 0, TextAction.BG_LIGHT_RED: winapi.BACKGROUND_RED, TextAction.BG_LIGHT_GREEN: winapi.BACKGROUND_GREEN, TextAction.BG_LIGHT_YELLOW: winapi.BACKGROUND_GREEN | winapi.BACKGROUND_RED, TextAction.BG_LIGHT_BLUE: winapi.BACKGROUND_BLUE, TextAction.BG_LIGHT_MAGENTA: winapi.BACKGROUND_BLUE | winapi.BACKGROUND_RED, TextAction.BG_LIGHT_CYAN: winapi.BACKGROUND_BLUE | winapi.BACKGROUND_GREEN, TextAction.BG_LIGHT_WHITE: winapi.BACKGROUND_BLUE | winapi.BACKGROUND_GREEN | winapi.BACKGROUND_RED, } if action == TextAction.RESET_ALL: attrs = self.default_attrs self.bold = self.fg_light = self.bg_light = False elif action == TextAction.SET_BOLD: self.bold = True elif action == TextAction.RESET_BOLD: self.bold = False elif action == TextAction.SET_DIM: self.bold = False elif action == TextAction.SET_REVERSE: attrs |= winapi.COMMON_LVB_REVERSE_VIDEO elif action == TextAction.RESET_REVERSE: attrs &= ~winapi.COMMON_LVB_REVERSE_VIDEO elif action == TextAction.SET_UNDERLINE: attrs |= winapi.COMMON_LVB_UNDERSCORE elif action == TextAction.RESET_UNDERLINE: attrs &= ~winapi.COMMON_LVB_UNDERSCORE elif action == TextAction.FG_DEFAULT: attrs = (attrs & ~0xF) | (self.default_attrs & 0xF) self.fg_light = False elif action == TextAction.BG_DEFAULT: attrs = (attrs & ~0xF0) | (self.default_attrs & 0xF0) self.bg_light = False elif action in dark_fg: attrs = (attrs & ~0xF) | dark_fg[action] self.fg_light = False elif action in dark_bg: attrs = (attrs & ~0xF0) | dark_bg[action] self.bg_light = False elif action in light_fg: attrs = (attrs & ~0xF) | light_fg[action] self.fg_light = True elif action in light_bg: attrs = (attrs & ~0xF0) | light_bg[action] self.bg_light = True if self.fg_light or self.bold: attrs |= winapi.FOREGROUND_INTENSITY else: attrs &= ~winapi.FOREGROUND_INTENSITY if self.bg_light: attrs |= winapi.BACKGROUND_INTENSITY else: attrs &= ~winapi.BACKGROUND_INTENSITY return attrs def apply(self, handle, code): buffer_info = winapi.CONSOLE_SCREEN_BUFFER_INFO() if not winapi.GetConsoleScreenBufferInfo(handle, ctypes.byref(buffer_info)): return attrs = buffer_info.wAttributes # We take the first attrs we see as default if self.default_attrs is None: self.default_attrs = attrs # Make sure that like with linux terminals the program doesn't # affect the prompt after it exits atexit.register( winapi.SetConsoleTextAttribute, handle, self.default_attrs) cmd, args = ansi_parse(code) if cmd == AnsiCommand.TEXT: for action in args: attrs = self.do_text_action(attrs, action) winapi.SetConsoleTextAttribute(handle, attrs) elif cmd in (AnsiCommand.MOVE_UP, AnsiCommand.MOVE_DOWN, AnsiCommand.MOVE_FORWARD, AnsiCommand.MOVE_BACKWARD): coord = buffer_info.dwCursorPosition x, y = coord.X, coord.Y amount = max(args[0], 1) if cmd == AnsiCommand.MOVE_UP: y -= amount elif cmd == AnsiCommand.MOVE_DOWN: y += amount elif cmd == AnsiCommand.MOVE_FORWARD: x += amount elif cmd == AnsiCommand.MOVE_BACKWARD: x -= amount x = max(x, 0) y = max(y, 0) winapi.SetConsoleCursorPosition(handle, winapi.COORD(x, y)) elif cmd in (AnsiCommand.SET_POS, AnsiCommand.SET_POS_ALT): args = list(args) while len(args) < 2: args.append(0) x, y = args[:2] win_rect = buffer_info.srWindow x += win_rect.Left - 1 y += win_rect.Top - 1 x = max(x, 0) y = max(y, 0) winapi.SetConsoleCursorPosition(handle, winapi.COORD(x, y)) elif cmd == AnsiCommand.SAVE_POS: win_rect = buffer_info.srWindow coord = buffer_info.dwCursorPosition x, y = coord.X, coord.Y x -= win_rect.Left y -= win_rect.Top self.saved_pos = (x, y) elif cmd == AnsiCommand.RESTORE_POS: win_rect = buffer_info.srWindow x, y = self.saved_pos x += win_rect.Left y += win_rect.Top winapi.SetConsoleCursorPosition(handle, winapi.COORD(x, y)) ������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/senf/_temp.py����������������������������������������������������0000644�0001750�0001750�00000006322�13112005742�022117� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import tempfile from ._fsnative import path2fsn, fsnative def gettempdir(): """ Returns: `fsnative` Like :func:`python3:tempfile.gettempdir`, but always returns a `fsnative` path """ # FIXME: I don't want to reimplement all that logic, reading env vars etc. # At least for the default it works. return path2fsn(tempfile.gettempdir()) def gettempprefix(): """ Returns: `fsnative` Like :func:`python3:tempfile.gettempprefix`, but always returns a `fsnative` path """ return path2fsn(tempfile.gettempprefix()) def mkstemp(suffix=None, prefix=None, dir=None, text=False): """ Args: suffix (`pathlike` or `None`): suffix or `None` to use the default prefix (`pathlike` or `None`): prefix or `None` to use the default dir (`pathlike` or `None`): temp dir or `None` to use the default text (bool): if the file should be opened in text mode Returns: Tuple[`int`, `fsnative`]: A tuple containing the file descriptor and the file path Raises: EnvironmentError Like :func:`python3:tempfile.mkstemp` but always returns a `fsnative` path. """ suffix = fsnative() if suffix is None else path2fsn(suffix) prefix = gettempprefix() if prefix is None else path2fsn(prefix) dir = gettempdir() if dir is None else path2fsn(dir) return tempfile.mkstemp(suffix, prefix, dir, text) def mkdtemp(suffix=None, prefix=None, dir=None): """ Args: suffix (`pathlike` or `None`): suffix or `None` to use the default prefix (`pathlike` or `None`): prefix or `None` to use the default dir (`pathlike` or `None`): temp dir or `None` to use the default Returns: `fsnative`: A path to a directory Raises: EnvironmentError Like :func:`python3:tempfile.mkstemp` but always returns a `fsnative` path. """ suffix = fsnative() if suffix is None else path2fsn(suffix) prefix = gettempprefix() if prefix is None else path2fsn(prefix) dir = gettempdir() if dir is None else path2fsn(dir) return tempfile.mkdtemp(suffix, prefix, dir) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/senf/_print.py���������������������������������������������������0000644�0001750�0001750�00000024654�13112005742�022316� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import sys import os import ctypes from ._fsnative import _encoding, is_win, is_unix, _surrogatepass from ._compat import text_type, PY2, PY3 from ._winansi import AnsiState, ansi_split from . import _winapi as winapi def print_(*objects, **kwargs): """print_(*objects, sep=None, end=None, file=None, flush=False) Args: objects (object): zero or more objects to print sep (str): Object separator to use, defaults to ``" "`` end (str): Trailing string to use, defaults to ``"\\n"``. If end is ``"\\n"`` then `os.linesep` is used. file (object): A file-like object, defaults to `sys.stdout` flush (bool): If the file stream should be flushed Raises: EnvironmentError Like print(), but: * Supports printing filenames under Unix + Python 3 and Windows + Python 2 * Emulates ANSI escape sequence support under Windows * Never fails due to encoding/decoding errors. Tries hard to get everything on screen as is, but will fall back to "?" if all fails. This does not conflict with ``colorama``, but will not use it on Windows. """ sep = kwargs.get("sep") sep = sep if sep is not None else " " end = kwargs.get("end") end = end if end is not None else "\n" file = kwargs.get("file") file = file if file is not None else sys.stdout flush = bool(kwargs.get("flush", False)) if is_win: _print_windows(objects, sep, end, file, flush) else: _print_unix(objects, sep, end, file, flush) def _print_unix(objects, sep, end, file, flush): """A print_() implementation which writes bytes""" encoding = _encoding if isinstance(sep, text_type): sep = sep.encode(encoding, "replace") if not isinstance(sep, bytes): raise TypeError if isinstance(end, text_type): end = end.encode(encoding, "replace") if not isinstance(end, bytes): raise TypeError if end == b"\n": end = os.linesep if PY3: end = end.encode("ascii") parts = [] for obj in objects: if not isinstance(obj, text_type) and not isinstance(obj, bytes): obj = text_type(obj) if isinstance(obj, text_type): if PY2: obj = obj.encode(encoding, "replace") else: try: obj = obj.encode(encoding, "surrogateescape") except UnicodeEncodeError: obj = obj.encode(encoding, "replace") assert isinstance(obj, bytes) parts.append(obj) data = sep.join(parts) + end assert isinstance(data, bytes) file = getattr(file, "buffer", file) try: file.write(data) except TypeError: if PY3: # For StringIO, first try with surrogates surr_data = data.decode(encoding, "surrogateescape") try: file.write(surr_data) except (TypeError, ValueError): file.write(data.decode(encoding, "replace")) else: # for file like objects with don't support bytes file.write(data.decode(encoding, "replace")) if flush: file.flush() ansi_state = AnsiState() def _print_windows(objects, sep, end, file, flush): """The windows implementation of print_()""" h = winapi.INVALID_HANDLE_VALUE try: fileno = file.fileno() except (EnvironmentError, AttributeError): pass else: if fileno == 1: h = winapi.GetStdHandle(winapi.STD_OUTPUT_HANDLE) elif fileno == 2: h = winapi.GetStdHandle(winapi.STD_ERROR_HANDLE) encoding = _encoding parts = [] for obj in objects: if isinstance(obj, bytes): obj = obj.decode(encoding, "replace") if not isinstance(obj, text_type): obj = text_type(obj) parts.append(obj) if isinstance(sep, bytes): sep = sep.decode(encoding, "replace") if not isinstance(sep, text_type): raise TypeError if isinstance(end, bytes): end = end.decode(encoding, "replace") if not isinstance(end, text_type): raise TypeError if end == u"\n": end = os.linesep text = sep.join(parts) + end assert isinstance(text, text_type) is_console = True if h == winapi.INVALID_HANDLE_VALUE: is_console = False else: # get the default value info = winapi.CONSOLE_SCREEN_BUFFER_INFO() if not winapi.GetConsoleScreenBufferInfo(h, ctypes.byref(info)): is_console = False if is_console: # make sure we flush before we apply any console attributes file.flush() # try to force a utf-8 code page, use the output CP if that fails cp = winapi.GetConsoleOutputCP() try: encoding = "utf-8" if winapi.SetConsoleOutputCP(65001) == 0: encoding = None for is_ansi, part in ansi_split(text): if is_ansi: ansi_state.apply(h, part) else: if encoding is not None: data = part.encode(encoding, _surrogatepass) else: data = _encode_codepage(cp, part) os.write(fileno, data) finally: # reset the code page to what we had before winapi.SetConsoleOutputCP(cp) else: # try writing bytes first, so in case of Python 2 StringIO we get # the same type on all platforms try: file.write(text.encode("utf-8", _surrogatepass)) except (TypeError, ValueError): file.write(text) if flush: file.flush() def _readline_windows(): """Raises OSError""" try: fileno = sys.stdin.fileno() except (EnvironmentError, AttributeError): fileno = -1 # In case stdin is replaced, read from that if fileno != 0: return _readline_windows_fallback() h = winapi.GetStdHandle(winapi.STD_INPUT_HANDLE) if h == winapi.INVALID_HANDLE_VALUE: return _readline_windows_fallback() buf_size = 1024 buf = ctypes.create_string_buffer(buf_size * ctypes.sizeof(winapi.WCHAR)) read = winapi.DWORD() text = u"" while True: if winapi.ReadConsoleW( h, buf, buf_size, ctypes.byref(read), None) == 0: if not text: return _readline_windows_fallback() raise ctypes.WinError() data = buf[:read.value * ctypes.sizeof(winapi.WCHAR)] text += data.decode("utf-16-le", _surrogatepass) if text.endswith(u"\r\n"): return text[:-2] def _decode_codepage(codepage, data): """ Args: codepage (int) data (bytes) Returns: `text` Decodes data using the given codepage. If some data can't be decoded using the codepage it will not fail. """ assert isinstance(data, bytes) if not data: return u"" # get the required buffer length first length = winapi.MultiByteToWideChar(codepage, 0, data, len(data), None, 0) if length == 0: raise ctypes.WinError() # now decode buf = ctypes.create_unicode_buffer(length) length = winapi.MultiByteToWideChar( codepage, 0, data, len(data), buf, length) if length == 0: raise ctypes.WinError() return buf[:] def _encode_codepage(codepage, text): """ Args: codepage (int) text (text) Returns: `bytes` Encode text using the given code page. Will not fail if a char can't be encoded using that codepage. """ assert isinstance(text, text_type) if not text: return b"" size = (len(text.encode("utf-16-le", _surrogatepass)) // ctypes.sizeof(winapi.WCHAR)) # get the required buffer size length = winapi.WideCharToMultiByte( codepage, 0, text, size, None, 0, None, None) if length == 0: raise ctypes.WinError() # decode to the buffer buf = ctypes.create_string_buffer(length) length = winapi.WideCharToMultiByte( codepage, 0, text, size, buf, length, None, None) if length == 0: raise ctypes.WinError() return buf[:length] def _readline_windows_fallback(): # In case reading from the console failed (maybe we get piped data) # we assume the input was generated according to the output encoding. # Got any better ideas? assert is_win cp = winapi.GetConsoleOutputCP() data = getattr(sys.stdin, "buffer", sys.stdin).readline().rstrip(b"\r\n") return _decode_codepage(cp, data) def _readline_default(): assert is_unix data = getattr(sys.stdin, "buffer", sys.stdin).readline().rstrip(b"\r\n") if PY3: return data.decode(_encoding, "surrogateescape") else: return data def _readline(): if is_win: return _readline_windows() else: return _readline_default() def input_(prompt=None): """ Args: prompt (object): Prints the passed object to stdout without adding a trailing newline Returns: `fsnative` Raises: EnvironmentError Like :func:`python3:input` but returns a `fsnative` and allows printing filenames as prompt to stdout. Use :func:`fsn2text` on the result if you just want to deal with text. """ if prompt is not None: print_(prompt, end="") return _readline() ������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/senf/_argv.py����������������������������������������������������0000644�0001750�0001750�00000006415�13112005742�022114� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import sys import ctypes import collections from functools import total_ordering from ._compat import PY2, string_types from ._fsnative import is_win, _fsn2legacy, path2fsn from . import _winapi as winapi def _get_win_argv(): """Returns a unicode argv under Windows and standard sys.argv otherwise Returns: List[`fsnative`] """ assert is_win argc = ctypes.c_int() try: argv = winapi.CommandLineToArgvW( winapi.GetCommandLineW(), ctypes.byref(argc)) except WindowsError: return [] if not argv: return [] res = argv[max(0, argc.value - len(sys.argv)):argc.value] winapi.LocalFree(argv) return res @total_ordering class Argv(collections.MutableSequence): """List[`fsnative`]: Like `sys.argv` but contains unicode keys and values under Windows + Python 2. Any changes made will be forwarded to `sys.argv`. """ def __init__(self): if PY2 and is_win: self._argv = _get_win_argv() else: self._argv = sys.argv def __getitem__(self, index): return self._argv[index] def __setitem__(self, index, value): if isinstance(value, string_types): value = path2fsn(value) self._argv[index] = value if sys.argv is not self._argv: try: if isinstance(value, string_types): sys.argv[index] = _fsn2legacy(value) else: sys.argv[index] = [_fsn2legacy(path2fsn(v)) for v in value] except IndexError: pass def __delitem__(self, index): del self._argv[index] try: del sys.argv[index] except IndexError: pass def __eq__(self, other): return self._argv == other def __lt__(self, other): return self._argv < other def __len__(self): return len(self._argv) def __repr__(self): return repr(self._argv) def insert(self, index, value): value = path2fsn(value) self._argv.insert(index, value) if sys.argv is not self._argv: sys.argv.insert(index, _fsn2legacy(value)) argv = Argv() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/__init__.py������������������������������������������������������0000644�0001750�0001750�00000000464�13112005742�021620� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/packages/README.rst�������������������������������������������������������0000644�0001750�0001750�00000000230�13112005742�021165� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Don't change anything here as these are just copies of upstream releases. senf: PYPI: https://pypi.python.org/pypi/senf License: "MIT License" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/����������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�016523� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/gstreamer/������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020514� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/gstreamer/compressor.py�����������������������������������������������0000644�0001750�0001750�00000010357�13112005742�023272� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gst, Gtk, GObject from quodlibet import _ from quodlibet.plugins import PluginImportException from quodlibet.plugins.gstelement import GStreamerPlugin from quodlibet import qltk from quodlibet import config _PLUGIN_ID = "compressor" _SETTINGS = { "threshold": [_("_Threshold:"), _("Threshold until the filter is activated"), 1.0], "ratio": [_("R_atio:"), _("Compression ratio"), 1.0], } def get_cfg(option): cfg_option = "%s_%s" % (_PLUGIN_ID, option) default = _SETTINGS[option][2] if option == "threshold": return config.getfloat("plugins", cfg_option, default) elif option == "ratio": return config.getfloat("plugins", cfg_option, default) def set_cfg(option, value): cfg_option = "%s_%s" % (_PLUGIN_ID, option) if get_cfg(option) != value: config.set("plugins", cfg_option, value) class Preferences(Gtk.VBox): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, tuple()), } def __init__(self): super(Preferences, self).__init__(spacing=12) table = Gtk.Table(n_rows=2, n_columns=2) table.set_col_spacings(6) table.set_row_spacings(6) labels = {} for idx, key in enumerate(["threshold", "ratio"]): text, tooltip = _SETTINGS[key][:2] label = Gtk.Label(label=text) labels[key] = label label.set_tooltip_text(tooltip) label.set_alignment(0.0, 0.5) label.set_padding(0, 6) label.set_use_underline(True) table.attach(label, 0, 1, idx, idx + 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) threshold_scale = Gtk.HScale( adjustment=Gtk.Adjustment.new(0, 0, 1, 0.01, 0.1, 0)) threshold_scale.set_digits(2) labels["threshold"].set_mnemonic_widget(threshold_scale) threshold_scale.set_value_pos(Gtk.PositionType.RIGHT) def format_perc(scale, value): return _("%d %%") % (value * 100) threshold_scale.connect('format-value', format_perc) table.attach(threshold_scale, 1, 2, 0, 1) def threshold_changed(scale): value = scale.get_value() set_cfg("threshold", value) self.emit("changed") threshold_scale.connect('value-changed', threshold_changed) threshold_scale.set_value(get_cfg("threshold")) ratio_scale = Gtk.HScale( adjustment=Gtk.Adjustment.new(0, 0, 1, 0.01, 0.1, 0)) ratio_scale.set_digits(2) labels["ratio"].set_mnemonic_widget(ratio_scale) ratio_scale.set_value_pos(Gtk.PositionType.RIGHT) table.attach(ratio_scale, 1, 2, 1, 2) def ratio_changed(scale): value = scale.get_value() set_cfg("ratio", value) self.emit("changed") ratio_scale.connect('value-changed', ratio_changed) ratio_scale.set_value(get_cfg("ratio")) self.pack_start(qltk.Frame(_("Preferences"), child=table), True, True, 0) class Compressor(GStreamerPlugin): PLUGIN_ID = _PLUGIN_ID PLUGIN_NAME = _("Audio Compressor") PLUGIN_DESC = _("Changes the amplitude of all samples above a specific " "threshold with a specific ratio.") @classmethod def setup_element(cls): return Gst.ElementFactory.make('audiodynamic', cls.PLUGIN_ID) @classmethod def update_element(cls, element): element.set_property("characteristics", "soft-knee") element.set_property("mode", "compressor") element.set_property("ratio", get_cfg("ratio")) element.set_property("threshold", get_cfg("threshold")) @classmethod def PluginPreferences(cls, window): prefs = Preferences() prefs.connect("changed", lambda *x: cls.queue_update()) return prefs if not Compressor.setup_element(): raise PluginImportException( "GStreamer element 'audiodynamic' missing (gst-plugins-good)") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/gstreamer/karaoke.py��������������������������������������������������0000644�0001750�0001750�00000010227�13112005742�022507� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gst, Gtk, GObject from quodlibet import _ from quodlibet.plugins import PluginImportException from quodlibet.plugins.gstelement import GStreamerPlugin from quodlibet import qltk from quodlibet import config from quodlibet.qltk import Icons _PLUGIN_ID = "karaoke" _SETTINGS = { "band": [_("Filter _band:"), _("The Frequency band of the filter"), 220.0], "width": [_("Filter _width:"), _("The Frequency width of the filter"), 100.0], "level": [_("_Level:"), _("Level of the effect"), 1.0], } def get_cfg(option): cfg_option = "%s_%s" % (_PLUGIN_ID, option) default = _SETTINGS[option][2] return config.getfloat("plugins", cfg_option, default) def set_cfg(option, value): cfg_option = "%s_%s" % (_PLUGIN_ID, option) if get_cfg(option) != value: config.set("plugins", cfg_option, value) class Preferences(Gtk.VBox): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, tuple()), } def __init__(self): super(Preferences, self).__init__(spacing=12) table = Gtk.Table(n_rows=3, n_columns=2) table.set_col_spacings(6) table.set_row_spacings(6) labels = {} for idx, key in enumerate(["level", "band", "width"]): label = Gtk.Label(label=_SETTINGS[key][0]) labels[key] = label label.set_alignment(0.0, 0.5) label.set_padding(0, 6) label.set_tooltip_text(_SETTINGS[key][1]) label.set_use_underline(True) table.attach(label, 0, 1, idx, idx + 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) def scale_changed(scale, option): value = scale.get_value() set_cfg(option, value) self.emit("changed") max_values = [1.0, 441, 100] steps = [0.01, 10, 10] pages = [0.1, 50, 25] scales = {} for idx, key in enumerate(["level", "band", "width"]): max_value = max_values[idx] step = steps[idx] page = pages[idx] scale = Gtk.HScale( adjustment=Gtk.Adjustment.new(0, 0, max_value, step, page, 0)) scales[key] = scale if step < 0.1: scale.set_digits(2) scale.add_mark(_SETTINGS[key][2], Gtk.PositionType.BOTTOM, None) labels[key].set_mnemonic_widget(scale) scale.set_value_pos(Gtk.PositionType.RIGHT) table.attach(scale, 1, 2, idx, idx + 1) scale.connect('value-changed', scale_changed, key) scale.set_value(get_cfg(key)) def format_perc(scale, value): return _("%d %%") % (value * 100) scales["level"].connect('format-value', format_perc) def format_hertz(scale, value): return _("%d Hz") % value scales["band"].connect('format-value', format_hertz) scales["width"].connect('format-value', format_hertz) self.pack_start(qltk.Frame(_("Preferences"), child=table), True, True, 0) class Karaoke(GStreamerPlugin): PLUGIN_ID = _PLUGIN_ID PLUGIN_NAME = _("Karaoke") PLUGIN_DESC = _("Removes main vocals from audio.") PLUGIN_ICON = Icons.AUDIO_INPUT_MICROPHONE @classmethod def setup_element(cls): return Gst.ElementFactory.make('audiokaraoke', cls.PLUGIN_ID) @classmethod def update_element(cls, element): element.set_property("level", get_cfg("level")) element.set_property("filter-band", get_cfg("band")) element.set_property("filter-width", get_cfg("width")) @classmethod def PluginPreferences(cls, window): prefs = Preferences() prefs.connect("changed", lambda *x: cls.queue_update()) return prefs if not Karaoke.setup_element(): raise PluginImportException( "GStreamer element 'audiokaraoke' missing (gst-plugins-good)") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/gstreamer/__init__.py�������������������������������������������������0000644�0001750�0001750�00000000317�13112005742�022630� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/gstreamer/mono.py�����������������������������������������������������0000644�0001750�0001750�00000001463�13112005742�022044� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gst from quodlibet import _ from quodlibet.plugins.gstelement import GStreamerPlugin class MonoDownmix(GStreamerPlugin): PLUGIN_ID = "mono" PLUGIN_NAME = _("Mono Downmix") PLUGIN_DESC = _("Downmixes audio channels to mono.") priority = -1 @classmethod def setup_element(cls): element = Gst.ElementFactory.make('capsfilter', cls.PLUGIN_ID) if not element: return caps = Gst.Caps.from_string('audio/x-raw,channels=1') element.set_property('caps', caps) return element �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/gstreamer/crossfeed.py������������������������������������������������0000644�0001750�0001750�00000013516�13112005742�023053� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Gst, GObject from quodlibet import _ from quodlibet.plugins.gstelement import GStreamerPlugin from quodlibet import qltk, plugins from quodlibet import config _PLUGIN_ID = "crossfeed" _SETTINGS = { "preset": [_("_Preset:"), _("Filter preset")], "fcut": [_("_Frequency cut:"), _("Low-pass filter cut frequency")], "feed": [_("Feed _level:"), _("Feed level")], } _PRESETS = [ ["default", _("Default"), _("Closest to virtual speaker placement (30°, 3 meter)"), 700, 45], ["cmoy", _("Chu Moy"), _("Close to Chu Moy's crossfeeder (popular)"), 700, 60], ["jmeier", _("Jan Meier"), _("Close to Jan Meier's CORDA amplifiers (little change)"), 650, 90], ["custom", _("Custom"), _("Custom settings"), -1, -1], ] _CUSTOM_INDEX = 3 def get_cfg(option): cfg_option = "%s_%s" % (_PLUGIN_ID, option) if option == "feed": return config.getint("plugins", cfg_option, _PRESETS[0][4]) elif option == "fcut": return config.getint("plugins", cfg_option, _PRESETS[0][3]) def set_cfg(option, value): cfg_option = "%s_%s" % (_PLUGIN_ID, option) if get_cfg(option) != value: config.set("plugins", cfg_option, value) class Preferences(Gtk.VBox): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, tuple()), } def __init__(self): super(Preferences, self).__init__(spacing=12) table = Gtk.Table(n_rows=3, n_columns=2) table.props.expand = False table.set_col_spacings(6) table.set_row_spacings(6) labels = {} for idx, key in enumerate(["preset", "fcut", "feed"]): text, tooltip = _SETTINGS[key] label = Gtk.Label(label=text) labels[key] = label label.set_tooltip_text(tooltip) label.set_alignment(0.0, 0.5) label.set_padding(0, 6) label.set_use_underline(True) table.attach(label, 0, 1, idx, idx + 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) preset_combo = Gtk.ComboBoxText() self.__combo = preset_combo labels["preset"].set_mnemonic_widget(preset_combo) for preset in _PRESETS: preset_combo.append_text(preset[1]) preset_combo.set_active(-1) table.attach(preset_combo, 1, 2, 0, 1) fcut_scale = Gtk.HScale( adjustment=Gtk.Adjustment.new(700, 300, 2000, 10, 100, 0)) fcut_scale.set_tooltip_text(_SETTINGS["fcut"][1]) labels["fcut"].set_mnemonic_widget(fcut_scale) fcut_scale.set_value_pos(Gtk.PositionType.RIGHT) def format_hz(scale, value): return _("%d Hz") % value fcut_scale.connect('format-value', format_hz) table.attach(fcut_scale, 1, 2, 1, 2) def fcut_changed(scale): value = int(scale.get_value()) set_cfg("fcut", value) self.__update_combo() self.emit("changed") fcut_scale.connect('value-changed', fcut_changed) fcut_scale.set_value(get_cfg("fcut")) level_scale = Gtk.HScale( adjustment=Gtk.Adjustment.new(45, 10, 150, 1, 5, 0)) level_scale.set_tooltip_text(_SETTINGS["feed"][1]) labels["feed"].set_mnemonic_widget(level_scale) level_scale.set_value_pos(Gtk.PositionType.RIGHT) def format_db(scale, value): return _("%.1f dB") % (value / 10.0) level_scale.connect('format-value', format_db) table.attach(level_scale, 1, 2, 2, 3) def level_changed(scale): value = int(scale.get_value()) set_cfg("feed", value) self.__update_combo() self.emit("changed") level_scale.connect('value-changed', level_changed) level_scale.set_value(get_cfg("feed")) def combo_change(combo, level_scale, fcut_scale): index = combo.get_active() if index == _CUSTOM_INDEX: combo.set_tooltip_text("") return tooltip, fcut, feed = _PRESETS[index][-3:] combo.set_tooltip_text(tooltip) level_scale.set_value(feed) fcut_scale.set_value(fcut) preset_combo.connect("changed", combo_change, level_scale, fcut_scale) self.__update_combo() self.pack_start(qltk.Frame(_("Preferences"), child=table), True, True, 0) def __update_combo(self): feed = get_cfg("feed") fcut = get_cfg("fcut") for i, preset in enumerate(_PRESETS): def_fcut, def_feed = preset[-2:] if def_fcut == fcut and def_feed == feed: self.__combo.set_active(i) return self.__combo.set_active(_CUSTOM_INDEX) class Crossfeed(GStreamerPlugin): PLUGIN_ID = _PLUGIN_ID PLUGIN_NAME = _("Crossfeed") PLUGIN_DESC = _("Mixes the left and right channel in a way that simulates" " a speaker setup while using headphones, or to adjust " "for early Stereo recordings.") PLUGIN_ICON = "audio-volume-high" @classmethod def setup_element(cls): return Gst.ElementFactory.make('bs2b', cls.PLUGIN_ID) @classmethod def update_element(cls, element): element.set_property("feed", get_cfg("feed")) element.set_property("fcut", get_cfg("fcut")) @classmethod def PluginPreferences(cls, window): prefs = Preferences() prefs.connect("changed", lambda *x: cls.queue_update()) return prefs if not Crossfeed.setup_element(): raise plugins.MissingGstreamerElementPluginException("bs2b") ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/gstreamer/pitch.py����������������������������������������������������0000644�0001750�0001750�00000006556�13112005742�022213� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GObject, Gst from quodlibet import _ from quodlibet.plugins import PluginImportException from quodlibet.plugins.gstelement import GStreamerPlugin from quodlibet import qltk from quodlibet import config _PLUGIN_ID = "pitch" _SETTINGS = { "rate": [_("R_ate:"), 1.0], "tempo": [_("_Tempo:"), 1.0], "pitch": [_("_Pitch:"), 1.0], } def get_cfg(option): cfg_option = "%s_%s" % (_PLUGIN_ID, option) default = _SETTINGS[option][1] if option == "rate": return config.getfloat("plugins", cfg_option, default) elif option == "tempo": return config.getfloat("plugins", cfg_option, default) elif option == "pitch": return config.getfloat("plugins", cfg_option, default) def set_cfg(option, value): cfg_option = "%s_%s" % (_PLUGIN_ID, option) if get_cfg(option) != value: config.set("plugins", cfg_option, value) class Preferences(Gtk.VBox): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, tuple()), } def __init__(self): super(Preferences, self).__init__(spacing=12) table = Gtk.Table(n_rows=3, n_columns=2) table.set_col_spacings(6) table.set_row_spacings(6) labels = {} for idx, key in enumerate(["tempo", "rate", "pitch"]): label = Gtk.Label(label=_SETTINGS[key][0]) labels[key] = label label.set_alignment(0.0, 0.5) label.set_padding(0, 6) label.set_use_underline(True) table.attach(label, 0, 1, idx, idx + 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) def scale_changed(scale, option): value = scale.get_value() set_cfg(option, value) self.emit("changed") for idx, key in enumerate(["tempo", "rate", "pitch"]): scale = Gtk.HScale( adjustment=Gtk.Adjustment.new(0, 0.1, 3, 0.1, 1, 0)) scale.set_digits(2) scale.add_mark(1.0, Gtk.PositionType.BOTTOM, None) labels[key].set_mnemonic_widget(scale) scale.set_value_pos(Gtk.PositionType.RIGHT) table.attach(scale, 1, 2, idx, idx + 1) scale.connect('value-changed', scale_changed, key) scale.set_value(get_cfg(key)) self.pack_start(qltk.Frame(_("Preferences"), child=table), True, True, 0) class Pitch(GStreamerPlugin): PLUGIN_ID = _PLUGIN_ID PLUGIN_NAME = _("Audio Pitch / Speed") PLUGIN_DESC = _("Controls the pitch of an audio stream.") @classmethod def setup_element(cls): return Gst.ElementFactory.make('pitch', cls.PLUGIN_ID) @classmethod def update_element(cls, element): for key in ["tempo", "rate", "pitch"]: element.set_property(key, get_cfg(key)) @classmethod def PluginPreferences(cls, window): prefs = Preferences() prefs.connect("changed", lambda *x: cls.queue_update()) return prefs if not Pitch.setup_element(): raise PluginImportException( "GStreamer element 'pitch' missing (gst-plugins-bad)") ��������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/covers/���������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020024� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/covers/artwork_url.py�������������������������������������������������0000644�0001750�0001750�00000002514�13112005742�022755� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from os import path from gi.repository import Soup from quodlibet import _ from quodlibet.plugins.cover import CoverSourcePlugin, cover_dir from quodlibet.util.cover.http import HTTPDownloadMixin from quodlibet.util.path import escape_filename class ArtworkUrlCover(CoverSourcePlugin, HTTPDownloadMixin): PLUGIN_ID = "artwork-url-cover" PLUGIN_NAME = _("Artwork URL Cover Source") PLUGIN_DESC = _("Downloads covers linked to by the artwork_url tag." "This works with the Soundcloud browser.") @classmethod def group_by(cls, song): return song.get('album', None) @staticmethod def priority(): return 0.9 @property def cover_path(self): url = self.url if url: return path.join(cover_dir, escape_filename(url)) return super(ArtworkUrlCover, self).cover_path @property def url(self): return self.song.get('artwork_url', None) def fetch_cover(self): if not self.url: return self.fail('artwork_url missing') self.download(Soup.Message.new('GET', self.url)) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/covers/discogs.py�����������������������������������������������������0000644�0001750�0001750�00000007451�13112005742�022042� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Mice Pápai # # Based on lastfm.py by Simonas Kazlauskas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import json from os import path from gi.repository import Soup from quodlibet import _ from quodlibet.plugins.cover import CoverSourcePlugin, cover_dir from quodlibet.util.http import download_json from quodlibet.util.cover.http import HTTPDownloadMixin from quodlibet.util.path import escape_filename from quodlibet.util import print_d class DiscogsCover(CoverSourcePlugin, HTTPDownloadMixin): PLUGIN_ID = "discogs-cover" PLUGIN_NAME = _("Discogs Cover Source") PLUGIN_DESC = _("Downloads covers from Discogs.") credentials = ('?key=aWfZGjHQvkMcreUECGAp' + '&secret=VlORkklpdvAwJMwxUjNNSgqicjuizJAl') def pretty_json(self, json_dict): print_d(json.dumps(json_dict, sort_keys=True, indent=4, separators=(',', ': '))) @classmethod def group_by(cls, song): return song.album_key @staticmethod def priority(): return 0.1 # Testing version @property def cover_path(self): mbid = self.song.get('musicbrainz_albumid', None) if mbid: return path.join(cover_dir, escape_filename(mbid)) else: return super(DiscogsCover, self).cover_path @property def url(self): _url = ('https://api.discogs.com/database/search' + self.credentials + '&type=release' + '&artist={artist}' + '&release_title={album}') artist = Soup.URI.encode(self.song.get('artist', ''), None) album = Soup.URI.encode(self.song.get('album', ''), None) if artist and album: return _url.format(artist=artist, album=album) else: return None # Not enough data def search(self): if not self.url: return self.emit('search-complete', []) msg = Soup.Message.new('GET', self.url) download_json(msg, self.cancellable, self.search_data, None) def search_data(self, message, json_dict, data=None): if not json_dict: print_d('Server did not return valid JSON') return self.emit('search-complete', []) # debug # self.pretty_json(json_dict) try: res_url = json_dict.get('results', [])[0].get('resource_url', '') except IndexError: res_url = '' if not res_url: print_d('Album data is not available') return self.emit('search-complete', []) msg = Soup.Message.new('GET', res_url + self.credentials) download_json(msg, self.cancellable, self.album_data, None) def album_data(self, message, json_dict, data=None): # debug # self.pretty_json(json_dict) images = json_dict.get('images', '') if not images: print_d('Covers are not available') return self.emit('search-complete', []) result = [] for cover in images: if cover.get('uri') and cover['type'] == 'primary': result.append({'cover': cover['uri']}) self.emit('search-complete', result) def fetch_cover(self): if not self.url: return self.fail('Not enough data to get cover from Discogs') def search_complete(self, res): self.disconnect(sci) if res: self.download(Soup.Message.new('GET', res[0]['cover'])) else: return self.fail('No cover was found') sci = self.connect('search-complete', search_complete) self.search() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/covers/__init__.py����������������������������������������������������0000644�0001750�0001750�00000000317�13112005742�022140� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/covers/lastfm.py������������������������������������������������������0000644�0001750�0001750�00000006347�13112005742�021700� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Simonas Kazlauskas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from os import path from gi.repository import Soup from quodlibet import _ from quodlibet.plugins.cover import CoverSourcePlugin, cover_dir from quodlibet.util.http import download_json from quodlibet.util.cover.http import HTTPDownloadMixin from quodlibet.util.path import escape_filename from quodlibet.util import print_d class LastFMCover(CoverSourcePlugin, HTTPDownloadMixin): PLUGIN_ID = "lastfm-cover" PLUGIN_NAME = _("Last.fm Cover Source") PLUGIN_DESC = _("Downloads covers from Last.fm's cover art archive.") @classmethod def group_by(cls, song): return song.album_key @staticmethod def priority(): return 0.33 # No cover size guarantee, accurate @property def cover_path(self): mbid = self.song.get('musicbrainz_albumid', None) # It is beneficial to use mbid for cover names. if mbid: return path.join(cover_dir, escape_filename(mbid)) else: return super(LastFMCover, self).cover_path @property def url(self): _url = 'https://ws.audioscrobbler.com/2.0?method=album.getinfo&' + \ 'api_key=107db6fd4c1c7f53b1526fafddab2c82&format=json&' +\ '&artist={artist}&album={album}&mbid={mbid}' artist = Soup.URI.encode(self.song.get('artist', ''), None) album = Soup.URI.encode(self.song.get('album', ''), None) mbid = Soup.URI.encode(self.song.get('musicbrainz_albumid', ''), None) if (artist and album) or mbid: return _url.format(artist=artist, album=album, mbid=mbid) else: return None # Not enough data def search(self): if not self.url: return self.emit('search-complete', []) msg = Soup.Message.new('GET', self.url) download_json(msg, self.cancellable, self.album_data, None) def album_data(self, message, json, data=None): if not json: print_d('Server did not return valid JSON') return self.emit('search-complete', []) album = json.get('album', {}) if not album: print_d('Album data is not available') return self.emit('search-complete', []) covers = dict((i['size'], i['#text']) for i in album['image']) result = [] for ck in ('mega', 'extralarge',): if covers.get(ck): result.append({'artist': album['artist'], 'album': album['name'], 'cover': covers[ck] }) self.emit('search-complete', result) def fetch_cover(self): if not self.url: return self.fail('Not enough data to get cover from Last.fm') def search_complete(self, res): self.disconnect(sci) if res: self.download(Soup.Message.new('GET', res[0]['cover'])) else: return self.fail('No cover was found') sci = self.connect('search-complete', search_complete) self.search() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/covers/musicbrainz.py�������������������������������������������������0000644�0001750�0001750�00000003116�13112005742�022727� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Simonas Kazlauskas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from os import path from gi.repository import Soup from quodlibet import _ from quodlibet.plugins.cover import CoverSourcePlugin, cover_dir from quodlibet.util.cover.http import HTTPDownloadMixin from quodlibet.util.path import escape_filename class MusicBrainzCover(CoverSourcePlugin, HTTPDownloadMixin): PLUGIN_ID = "musicbrainz-cover" PLUGIN_NAME = _("MusicBrainz Cover Source") PLUGIN_DESC = _("Downloads covers from MusicBrainz's cover art archive.") @classmethod def group_by(cls, song): return song.get('musicbrainz_albumid', None) @staticmethod def priority(): # It's a pretty good source return 0.65 @property def cover_path(self): mbid = self.mbid if mbid is None: return super(MusicBrainzCover, self).cover_path return path.join(cover_dir, escape_filename(mbid)) @property def mbid(self): return self.song.get('musicbrainz_albumid', None) @property def url(self, front=True): if not self.mbid: return None mbid = Soup.URI.encode(self.mbid, None) return 'https://coverartarchive.org/release/{0}/front'.format(mbid) def fetch_cover(self): if not self.mbid: return self.fail('MBID is required to fetch the cover') self.download(Soup.Message.new('GET', self.url)) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/_shared/��������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020130� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/_shared/squeezebox/���������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022322� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/_shared/squeezebox/base.py��������������������������������������������0000644�0001750�0001750�00000014326�13112005742�023616� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk, GLib from quodlibet import _ from quodlibet import print_d, app, config from quodlibet.plugins import PluginConfigMixin from quodlibet.qltk import Message from quodlibet.qltk.x import Frame from quodlibet.qltk.entry import UndoEntry from quodlibet.util.library import get_scan_dirs from .util import GetPlayerDialog from .server import SqueezeboxServer, SqueezeboxException class SqueezeboxPluginMixin(PluginConfigMixin): """ All the Squeezebox connection / communication code in one delicious class """ # Maintain a singleton; we only support one SB server live in QL server = None # We want all derived classes to share the config section CONFIG_SECTION = "squeezebox" @classmethod def _get_ql_base_dir(cls): dirs = get_scan_dirs() return os.path.realpath(dirs[0]) if dirs else "" @classmethod def get_sb_path(cls, song): """Gets a SB path to `song` by simple substitution""" path = song('~filename') return path.replace( cls._get_ql_base_dir(), cls.server.get_library_dir()) @classmethod def post_reconnect(cls): pass @staticmethod def _show_dialog(dialog_type, msg): dialog = Message(dialog_type, app.window, "Squeezebox", msg) dialog.connect('response', lambda dia, resp: dia.destroy()) dialog.show() @staticmethod def quick_dialog(msg, dialog_type=Gtk.MessageType.INFO): GLib.idle_add(SqueezeboxPluginMixin._show_dialog, dialog_type, msg) @classmethod def set_player(cls, val): cls.server.current_player = val cls.config_set("current_player", val) print_d("Setting player to #%d (%s)" % (val, cls.server.players[val])) @classmethod def check_settings(cls, button): cls.init_server() if cls.server.is_connected: ret = 0 if len(cls.server.players) > 1: dialog = GetPlayerDialog(app.window, cls.server.players, cls.server.current_player) ret = dialog.run() or 0 else: cls.quick_dialog( _("Squeezebox OK. Using the only player (%s).") % cls.server.players[0]) cls.set_player(ret) # TODO: verify sanity of SB library path # Manage the changeover as best we can... cls.post_reconnect() else: cls.quick_dialog(_("Couldn't connect to %s") % (cls.server,), Gtk.MessageType.ERROR) @classmethod def PluginPreferences(cls, parent): def value_changed(entry, key): if entry.get_property('sensitive'): cls.server.config[key] = entry.get_text() config.set("plugins", "squeezebox_" + key, entry.get_text()) vb = Gtk.VBox(spacing=12) if not cls.server: cls.init_server() cfg = cls.server.config # Tabulate all settings for neatness table = Gtk.Table(n_rows=3, n_columns=2) table.set_col_spacings(6) table.set_row_spacings(6) rows = [] ve = UndoEntry() ve.set_text(cfg["hostname"]) ve.connect('changed', value_changed, 'server_hostname') rows.append((Gtk.Label(label=_("Hostname:")), ve)) ve = UndoEntry() ve.set_width_chars(5) ve.set_text(str(cfg["port"])) ve.connect('changed', value_changed, 'server_port') rows.append((Gtk.Label(label=_("Port:")), ve)) ve = UndoEntry() ve.set_text(cfg["user"]) ve.connect('changed', value_changed, 'server_user') rows.append((Gtk.Label(label=_("Username:")), ve)) ve = UndoEntry() ve.set_text(str(cfg["password"])) ve.connect('changed', value_changed, 'server_password') rows.append((Gtk.Label(label=_("Password:")), ve)) ve = UndoEntry() ve.set_text(str(cfg["library_dir"])) ve.set_tooltip_text(_("Library directory the server connects to.")) ve.connect('changed', value_changed, 'server_library_dir') rows.append((Gtk.Label(label=_("Library path:")), ve)) for (row, (label, entry)) in enumerate(rows): label.set_alignment(0.0, 0.5) table.attach(label, 0, 1, row, row + 1, xoptions=Gtk.AttachOptions.FILL) table.attach(entry, 1, 2, row, row + 1) # Add verify button button = Gtk.Button(label=_("_Verify settings"), use_underline=True) button.set_sensitive(cls.server is not None) button.connect('clicked', cls.check_settings) table.attach(button, 0, 2, row + 1, row + 2) # Server settings Frame cfg_frame = Frame(_("Squeezebox Server"), table) vb.pack_start(cfg_frame, True, True, 0) debug = cls.ConfigCheckButton(_("Debug"), "debug") vb.pack_start(debug, True, True, 0) return vb @classmethod def init_server(cls): """Initialises a server, and connects to check if it's alive""" try: cur = int(cls.config_get("current_player", 0)) except ValueError: cur = 0 cls.server = SqueezeboxServer( hostname=cls.config_get("server_hostname", "localhost"), port=cls.config_get("server_port", 9090), user=cls.config_get("server_user", ""), password=cls.config_get("server_password", ""), library_dir=cls.config_get( "server_library_dir", cls._get_ql_base_dir()), current_player=cur, debug=cls.config_get_bool("debug", False)) try: ver = cls.server.get_version() if cls.server.is_connected: print_d( "Squeezebox server version: %s. Current player: #%d (%s)." % (ver, cur, cls.server.get_players()[cur]["name"])) except (IndexError, KeyError, SqueezeboxException) as e: print_d("Couldn't get player info (%s)." % e) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/_shared/squeezebox/util.py��������������������������������������������0000644�0001750�0001750�00000003240�13112005742�023652� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ class GetPlayerDialog(Gtk.Dialog): def __init__(self, parent, players, current=0): title = _("Choose Squeezebox player") super(GetPlayerDialog, self).__init__(title, parent) self.set_border_width(6) self.set_resizable(False) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_button(_("_OK"), Gtk.ResponseType.OK) self.vbox.set_spacing(6) self.set_default_response(Gtk.ResponseType.OK) box = Gtk.VBox(spacing=6) label = Gtk.Label( label=_("Found Squeezebox server.\nPlease choose the player")) box.set_border_width(6) label.set_line_wrap(True) label.set_justify(Gtk.Justification.CENTER) box.pack_start(label, True, True, 0) player_combo = Gtk.ComboBoxText() for player in players: player_combo.append_text(player["name"]) player_combo.set_active(current) self._val = player_combo box.pack_start(self._val, True, True, 0) self.vbox.pack_start(box, True, True, 0) self.get_child().show_all() def run(self, text=""): self.show() self._val.grab_focus() resp = super(GetPlayerDialog, self).run() if resp == Gtk.ResponseType.OK: value = self._val.get_active() else: value = None self.destroy() return value ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/_shared/squeezebox/__init__.py����������������������������������������0000644�0001750�0001750�00000000360�13112005742�024434� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/_shared/squeezebox/server.py������������������������������������������0000644�0001750�0001750�00000017712�13112005742�024214� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014, 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import socket from telnetlib import Telnet import time from quodlibet import _ from quodlibet import app from quodlibet.util.dprint import print_w, print_d, print_ from quodlibet.compat import quote, unquote class SqueezeboxException(Exception): """Errors communicating with the Squeezebox""" class SqueezeboxServerSettings(dict): """Encapsulates Server settings""" def __str__(self): try: return _("Squeezebox server at {hostname}:{port}").format(**self) except KeyError: return _("unidentified Squeezebox server") class SqueezeboxPlayerSettings(dict): """Encapsulates player settings""" def __str__(self): try: return "{name} [{playerid}]".format(**self) except KeyError: return _("unidentified Squeezebox player: %r" % self) class SqueezeboxServer(object): """Encapsulates access to a Squeezebox player via a squeezecenter server""" _TIMEOUT = 10 _MAX_FAILURES = 3 telnet = None is_connected = False current_player = 0 players = [] config = SqueezeboxServerSettings() _debug = False def __init__(self, hostname="localhost", port=9090, user="", password="", library_dir='', current_player=0, debug=False): self._debug = debug self.failures = 0 self.delta = 600 # Default in ms self.config = SqueezeboxServerSettings(locals()) if hostname: del self.config["self"] del self.config["current_player"] self.current_player = int(current_player) or 0 try: if self._debug: print_d("Trying %s..." % self.config) self.telnet = Telnet(hostname, port, self._TIMEOUT) except socket.error as e: print_d("Couldn't talk to %s (%s)" % (self.config, e)) else: result = self.__request("login %s %s" % (user, password)) if result != (6 * '*'): raise SqueezeboxException( "Couldn't log in to squeezebox: response was '%s'" % result) self.is_connected = True self.failures = 0 print_d("Connected to Squeezebox Server! %s" % self) # Reset players (forces reload) self.players = [] self.get_players() def get_library_dir(self): return self.config['library_dir'] def __request(self, line, raw=False, want_reply=True): """ Send a request to the server, if connected, and return its response """ line = line.strip() if not (self.is_connected or line.split()[0] == 'login'): print_d("Can't do '%s' - not connected" % line.split()[0], self) return None if self._debug: print_(">>>> \"%s\"" % line) try: self.telnet.write((line + "\n").encode('utf-8')) if not want_reply: return None raw_response = self.telnet.read_until(b"\n").decode('utf-8') except socket.error as e: print_w("Couldn't communicate with squeezebox (%s)" % e) self.failures += 1 if self.failures >= self._MAX_FAILURES: print_w("Too many Squeezebox failures. Disconnecting") self.is_connected = False return None response = (raw_response if raw else unquote(raw_response)).strip() if self._debug: print_("<<<< \"%s\"" % (response,)) return (response[len(line) - 1:] if line.endswith("?") else response[len(line) + 1:]) def get_players(self): """ Returns (and caches) a list of the Squeezebox players available""" if self.players: return self.players pairs = self.__request("players 0 99", True).split(" ") def demunge(string): s = unquote(string) cpos = s.index(":") return s[0:cpos], s[cpos + 1:] # Do a meaningful URL-unescaping and tuplification for all values pairs = [demunge(p) for p in pairs] # First element is always count count = int(pairs.pop(0)[1]) self.players = [] for pair in pairs: if pair[0] == "playerindex": playerindex = int(pair[1]) self.players.append(SqueezeboxPlayerSettings()) else: # Don't worry playerindex is always the first entry... self.players[playerindex][pair[0]] = pair[1] if self._debug: print_d("Found %d player(s): %s" % (len(self.players), self.players)) assert (count == len(self.players)) return self.players def player_request(self, line, want_reply=True): if not self.is_connected: return try: return self.__request( "%s %s" % (self.players[self.current_player]["playerid"], line), want_reply=want_reply) except IndexError: return None def get_version(self): if self.is_connected: return self.__request("version ?") else: return "(not connected)" def play(self): """Plays the current song""" self.player_request("play") def is_stopped(self): """Returns whether the player is in any sort of non-playing mode""" response = self.player_request("mode ?") return "play" != response def playlist_play(self, path): """Play song immediately""" self.player_request("playlist play %s" % (quote(path))) def playlist_add(self, path): self.player_request("playlist add %s" % (quote(path)), False) def playlist_save(self, name): self.player_request("playlist save %s" % (quote(name)), False) def playlist_clear(self): self.player_request("playlist clear", False) def playlist_resume(self, name, resume, wipe=False): cmd = ("playlist resume %s noplay:%d wipePlaylist:%d" % (quote(name), int(not resume), int(wipe))) self.player_request(cmd, want_reply=False) def change_song(self, path): """Queue up a song""" self.player_request("playlist clear") self.player_request("playlist insert %s" % (quote(path))) def seek_to(self, ms): """Seeks the current song to `ms` milliseconds from start""" if not self.is_connected: return if self._debug: print_d("Requested %0.2f s, adding drift of %d ms..." % (ms / 1000.0, self.delta)) ms += self.delta start = time.time() self.player_request("time %d" % round(int(ms) / 1000)) end = time.time() took = (end - start) * 1000 reported_time = self.get_milliseconds() ql_pos = app.player.get_position() # Assume 50% of the time taken to complete is response. # TODO: Better predictive modelling new_delta = ql_pos - reported_time self.delta = (self.delta + new_delta) / 2 if self._debug: print_d("Player at %0.0f but QL at %0.2f." "(Took %0.0f ms). Drift was %+0.0f ms" % (reported_time / 1000.0, ql_pos / 1000.0, took, new_delta)) def get_milliseconds(self): secs = self.player_request("time ?") or 0 return float(secs) * 1000.0 def pause(self): self.player_request("pause 1") def unpause(self): if self.is_stopped(): self.play() ms = app.player.get_position() self.seek_to(ms) #self.player_request("pause 0") def stop(self): self.player_request("stop") def __str__(self): return str(self.config) ������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/_shared/__init__.py���������������������������������������������������0000644�0001750�0001750�00000000544�13112005742�022246� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """ Shared plugin code lives here - for example, two plugins of different types may want to share common code. """ ������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playorder/������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020524� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playorder/track_repeat.py���������������������������������������������0000644�0001750�0001750�00000005474�13112005742�023556� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011,2012,2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. """ Repeats a given track a configurable number of times Useful for musicians practising / working out songs... or maybe you just REALLY like your playlist. TODO: notification of play count? """ from gi.repository import Gtk from quodlibet import _ from quodlibet.order.repeat import Repeat from quodlibet.plugins.playorder import RepeatPlugin from quodlibet.util.dprint import print_d from quodlibet.plugins import PluginConfigMixin from quodlibet.qltk import Icons START_COUNT = 1 class TrackRepeatOrder(RepeatPlugin, PluginConfigMixin): PLUGIN_ID = "track_repeat" PLUGIN_NAME = _("Repeat Each Track") PLUGIN_ICON = Icons.MEDIA_PLAYLIST_REPEAT PLUGIN_DESC = _("Shuffle songs, " "but repeat every track a set number of times.") PLAY_EACH_DEFAULT = 2 START_COUNT = 1 """By the time this plugin is invoked, the song has already been played""" # Plays of the current song play_count = START_COUNT priority = Repeat.priority @classmethod def PluginPreferences(cls, parent): def plays_changed(spin): cls.config_set("play_each", int(spin.get_value())) vb = Gtk.VBox(spacing=10) vb.set_border_width(10) hbox = Gtk.HBox(spacing=6) lbl = Gtk.Label(label=_("Number of times to play each song:")) hbox.pack_start(lbl, False, True, 0) val = cls.config_get("play_each", cls.PLAY_EACH_DEFAULT) spin = Gtk.SpinButton( adjustment=Gtk.Adjustment.new(float(val), 2, 20, 1, 10, 0)) spin.connect("value-changed", plays_changed) hbox.pack_start(spin, False, True, 0) vb.pack_start(hbox, True, True, 0) vb.show_all() return vb def restart_counting(self): self.play_count = START_COUNT print_d("Resetting play count") def next(self, playlist, iter): play_each = int(self.config_get('play_each', self.PLAY_EACH_DEFAULT)) self.play_count += 1 if self.play_count <= play_each and iter is not None: print_d("Play count now at %d/%d" % (self.play_count, play_each)) return iter else: self.restart_counting() return self.wrapped.next(playlist, iter) def next_explicit(self, playlist, iter): self.restart_counting() return self.wrapped.next_explicit(playlist, iter) def set(self, playlist, iter): self.restart_counting() return super(TrackRepeatOrder, self).set(playlist, iter) def reset(self, playlist): self.play_count = 0 return super(TrackRepeatOrder, self).reset(playlist) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playorder/reverse.py��������������������������������������������������0000644�0001750�0001750�00000001420�13112005742�022550� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.plugins.playorder import ShufflePlugin from quodlibet.qltk import Icons from quodlibet.qltk.playorder import OrderInOrder class ReverseOrder(ShufflePlugin, OrderInOrder): PLUGIN_ID = "reverse" PLUGIN_NAME = _("Reverse") PLUGIN_ICON = Icons.MEDIA_SKIP_BACKWARD PLUGIN_DESC = _("Reverses the play order of songs.") def previous(self, playlist, iter): return super(ReverseOrder, self).next(playlist, iter) def next(self, playlist, iter): return super(ReverseOrder, self).previous(playlist, iter) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playorder/follow.py���������������������������������������������������0000644�0001750�0001750�00000003370�13112005742�022405� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. from quodlibet.plugins.playorder import ShufflePlugin from quodlibet.order import OrderInOrder, OrderRemembered from quodlibet import _ from quodlibet import app from quodlibet.qltk import Icons class FollowOrder(ShufflePlugin, OrderInOrder, OrderRemembered): PLUGIN_ID = "follow" PLUGIN_NAME = _("Follow Cursor") PLUGIN_ICON = Icons.GO_JUMP PLUGIN_DESC = _("Playback follows your selection, " "or the next song in the list once exhausted.") __last_path = None def next(self, playlist, iter): next_fallback = OrderInOrder.next(self, playlist, iter) OrderRemembered.next(self, playlist, iter) selected = app.window.songlist.get_selected_songs() if not selected: return next_fallback selected_iter = playlist.find(selected[0]) selected_path = playlist.get_path(selected_iter) current_path = iter and playlist.get_path(iter) if selected_path in (current_path, self.__last_path): return next_fallback self.__last_path = selected_path return selected_iter def previous(self, *args): self.__last_path = None return super(FollowOrder, self).previous(*args) def set(self, playlist, iter): if iter: self.__last_path = playlist.get_path(iter) return super(FollowOrder, self).set(playlist, iter) def reset(self, playlist): super(FollowOrder, self).reset(playlist) self.__last_path = None ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playorder/playcounteq.py����������������������������������������������0000644�0001750�0001750�00000003474�13112005742�023454� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012-2016 Ryan "ZDBioHazard" Turner <zdbiohazard2@gmail.com> # 2016-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import math import random from quodlibet import _ from quodlibet.order.reorder import Reorder from quodlibet.plugins.playorder import ShufflePlugin from quodlibet.order import OrderRemembered from quodlibet.qltk import Icons from quodlibet.compat import iteritems class PlaycountEqualizer(ShufflePlugin, OrderRemembered): PLUGIN_ID = "playcounteq" PLUGIN_NAME = _("Playcount Equalizer") PLUGIN_DESC = _("Shuffle, preferring songs with fewer total plays.") PLUGIN_ICON = Icons.MEDIA_PLAYLIST_SHUFFLE display_name = _("Prefer less played") priority = Reorder.priority # Select the next track. def next(self, playlist, current): super(PlaycountEqualizer, self).next(playlist, current) remaining = self.remaining(playlist) # Don't try to search through an empty / played playlist. if len(remaining) <= 0: return None # Set-up the search information. max_count = max([song('~#playcount') for song in remaining.values()]) weights = {i: max_count - song('~#playcount') for i, song in iteritems(remaining)} choice = int(max(1, math.ceil(sum(weights) * random.random()))) # Search for a track. for i, weight in iteritems(weights): choice -= weight if choice <= 0: return playlist.get_iter([i]) else: # This should only happen if all songs have equal play counts. return playlist.get_iter([random.choice(list(remaining.keys()))]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playorder/__init__.py�������������������������������������������������0000644�0001750�0001750�00000000317�13112005742�022640� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playorder/queue.py����������������������������������������������������0000644�0001750�0001750�00000002155�13112005742�022227� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2009 Steven Robertson # 2016-17 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. from quodlibet.plugins.playorder import ShufflePlugin from quodlibet.qltk.playorder import OrderInOrder from quodlibet import _ from quodlibet import app from quodlibet.qltk import Icons class QueueOrder(ShufflePlugin, OrderInOrder): PLUGIN_ID = "queue" PLUGIN_NAME = _("Queue Only") PLUGIN_ICON = Icons.MEDIA_SKIP_FORWARD PLUGIN_DESC = _("Limits playing of songs to the queue. " "Select this play order in the main window, " "then double-clicking any song will enqueue it " "instead of playing.") def next(self, playlist, iter): return None def set_explicit(self, playlist, iter): if iter is None: return song = playlist[iter][0] if song is None: return app.window.playlist.enqueue([playlist[iter][0]]) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playorder/skip_songs.py�����������������������������������������������0000644�0001750�0001750�00000004650�13112005742�023264� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # 2017 Jason Heard # 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. from gi.repository import Gtk from quodlibet import _, print_d from quodlibet.order import OrderInOrder from quodlibet.plugins import PluginConfig from quodlibet.plugins.playorder import ShufflePlugin from quodlibet.qltk import Icons pconfig = PluginConfig("skip_songs") pconfig.defaults.set("threshold", 0.0) class SkipZeros(ShufflePlugin, OrderInOrder): PLUGIN_ID = "skip_songs" PLUGIN_NAME = _("Skip Songs") PLUGIN_ICON = Icons.GO_JUMP PLUGIN_DESC = _("Playback skips over songs with a rating equal or below a " "given threshold.") @classmethod def PluginPreferences(self, window): vb = Gtk.VBox(spacing=10) vb.set_border_width(0) adj = Gtk.Adjustment.new( pconfig.getfloat("threshold"), 0, 1.0, 0.01, 0.01, 0.0) fb_spin = Gtk.SpinButton(adjustment=adj) fb_spin.set_digits(2) def on_changed(button): pconfig.set("threshold", button.get_value()) fb_spin.connect('changed', on_changed) vb.add(fb_spin) vb.show_all() return vb def next(self, playlist, current): next_ = super(SkipZeros, self).next(playlist, current) while next_ is not None and self._should_skip(playlist, next_): next_ = super(SkipZeros, self).next(playlist, next_) return next_ def previous(self, playlist, current): previous = super(SkipZeros, self).previous(playlist, current) is_first = False while not is_first and previous is not None and \ self._should_skip(playlist, previous): previous = super(SkipZeros, self).previous(playlist, previous) is_first = playlist.get_path(previous).get_indices()[0] == 0 return previous def _should_skip(self, playlist, song_iter): song = playlist.get_value(song_iter) if not song.has_rating: return False rating = song("~#rating") threshold = pconfig.getfloat("threshold") if rating <= threshold: print_d("Rating is %f <= %f; skipping..." % (rating, threshold)) return True return False ����������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/__init__.py�����������������������������������������������������������0000644�0001750�0001750�00000000656�13112005742�020645� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """ Extension points for Quod Libet and Ex Falso This (currently) contains code plugins (formerly kept in /plugins) arranged by plugin type (songsmenu, events, etc). Base classes themselves are in /quodlibet/plugins """ ����������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playlist/�������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020364� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playlist/remove_duplicates.py�����������������������������������������0000644�0001750�0001750�00000004227�13112005742�024457� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.formats import AudioFile from quodlibet import print_d, ngettext, _ from quodlibet import qltk from quodlibet.plugins.playlist import PlaylistPlugin from quodlibet.qltk import Icons from gi.repository import Gtk class RemoveDuplicates(PlaylistPlugin): PLUGIN_ID = "Remove Playlist Duplicates" PLUGIN_NAME = _("Remove Playlist Duplicates") PLUGIN_DESC = _("Removes duplicate entries in a playlist.") PLUGIN_ICON = Icons.EDIT_CLEAR def plugin_handles(self, playlists): return len(playlists) == 1 and playlists[0].has_duplicates def plugin_playlist(self, playlist): songs = filter(lambda s: isinstance(s, AudioFile), playlist.songs) unique = set() dupes = list() for s in songs: if s in unique: dupes.append(s) else: unique.add(s) if len(dupes) < 1: print_d("No duplicates in this playlist") return dialog = ConfirmRemoveDuplicatesDialog(self, playlist, len(dupes)) if dialog.run() == Gtk.ResponseType.YES: playlist.remove_songs(dupes, True) return True return False class ConfirmRemoveDuplicatesDialog(qltk.Message): def __init__(self, parent, playlist, count): title = ngettext("Are you sure you want to remove %d duplicate song?", "Are you sure you want to remove %d duplicate songs?", count) % count description = (_("The duplicate songs will be removed " "from the playlist '%s'.") % playlist.name) super(ConfirmRemoveDuplicatesDialog, self).__init__( Gtk.MessageType.WARNING, parent, title, description, Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Remove"), Icons.LIST_REMOVE, Gtk.ResponseType.YES) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playlist/shuffle.py���������������������������������������������������0000644�0001750�0001750�00000001373�13112005742�022400� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014,2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.plugins.playlist import PlaylistPlugin from quodlibet.qltk import Icons class Shuffle(PlaylistPlugin): PLUGIN_ID = "Shuffle Playlist" PLUGIN_NAME = _("Shuffle Playlist") PLUGIN_DESC = _("Randomly shuffles a playlist.") PLUGIN_ICON = Icons.MEDIA_PLAYLIST_SHUFFLE def plugin_playlist(self, playlist): playlist.shuffle() return True def plugin_handles(self, playlists): return len(playlists) == 1 and len(playlists[0].songs) > 1 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playlist/__init__.py��������������������������������������������������0000644�0001750�0001750�00000000317�13112005742�022500� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playlist/export_to_squeezebox.py��������������������������������������0000644�0001750�0001750�00000007626�13112005742�025250� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet import app from quodlibet import qltk from quodlibet.qltk.notif import Task from quodlibet.qltk import Icons from quodlibet.qltk.getstring import GetStringDialog from quodlibet.util import copool from quodlibet.util.dprint import print_d from quodlibet.plugins.playlist import PlaylistPlugin from quodlibet.ext._shared.squeezebox.base import SqueezeboxPluginMixin class SqueezeboxPlaylistPlugin(PlaylistPlugin, SqueezeboxPluginMixin): PLUGIN_ID = "Export to Squeezebox Playlist" PLUGIN_NAME = _(u"Export to Squeezebox") PLUGIN_DESC = \ _("Dynamically exports a playlist to Logitech Squeezebox " "playlist, provided both share a directory structure. " "Shares configuration with " "<a href=\"quodlibet:///prefs/plugins/Squeezebox Output\">" "Squeezebox Sync plugin" "</a>.") PLUGIN_ICON = Icons.NETWORK_WORKGROUP ELLIPSIZE_NAME = True _PERSIST_FUDGE = 100 TEMP_PLAYLIST = "_quodlibet" def __add_songs(self, task, songs, name): """Generator for copool to add songs to the temp playlist""" print_d("Backing up current Squeezebox playlist." "This can take a while if your current playlist is big...") self.__cancel = False # Arbitrarily assign playlist operations a value of 2 * addition task_total = float(len(songs) + 2 * self._PERSIST_FUDGE + 3 * 2) self.server.playlist_save(self.TEMP_PLAYLIST) task.update(self._PERSIST_FUDGE / task_total) yield True self.server.playlist_clear() task.update((self._PERSIST_FUDGE + 2.0) // task_total) yield True # Check if we're currently playing. stopped = self.server.is_stopped() total = len(songs) print_d("Adding %d song(s) to Squeezebox playlist. " "This might take a while..." % total) for i, song in enumerate(songs): if self.__cancel: print_d("Cancelled squeezebox export") self.__cancel = False break # Actually do the (slow) call self.server.playlist_add(self.get_sb_path(song)) task.update(float(i) / task_total) yield True print_d("Saving Squeezebox playlist \"%s\"" % name) self.server.playlist_save(name) task.update((task_total - 2) / task_total) yield True # Resume if we actually stopped self.server.playlist_resume(self.TEMP_PLAYLIST, not stopped, True) task.finish() def __cancel_add(self): """Tell the copool to stop (adding songs)""" self.__cancel = True @staticmethod def __get_playlist_name(name="Quod Libet playlist"): dialog = GetStringDialog(None, _("Export playlist to Squeezebox"), _("Playlist name (will overwrite existing)"), button_label=_("_Save"), button_icon=Icons.DOCUMENT_SAVE) name = dialog.run(text=name) return name def plugin_playlist(self, playlist): self.init_server() if not self.server.is_connected: qltk.ErrorMessage( app.window, _("Error finding Squeezebox server"), _("Error finding %s. Please check settings") % self.server.config ).run() else: name = self.__get_playlist_name(name=playlist.name) if name: task = Task("Squeezebox", _("Export to Squeezebox playlist"), stop=self.__cancel_add) copool.add(self.__add_songs, task, playlist.songs, name, funcid="squeezebox-playlist-save") ����������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/playlist/export_to_folder.py������������������������������������������0000644�0001750�0001750�00000013374�13112005742�024326� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Didier Villevalois # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet.pattern import FileFromPattern from quodlibet.plugins import PluginConfig, ConfProp from quodlibet.plugins.playlist import PlaylistPlugin from quodlibet.qltk import Icons from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk.notif import Task from quodlibet.qltk.window import Dialog from quodlibet.util import copool from quodlibet.util.dprint import print_d from shutil import copyfile class ExportToFolderDialog(Dialog): """A dialog to collect export settings""" def __init__(self, parent, pattern): super(ExportToFolderDialog, self).__init__( title=_("Export Playlist to Folder"), transient_for=parent, use_header_bar=True) self.set_default_size(400, -1) self.set_resizable(True) self.set_border_width(6) self.vbox.set_spacing(6) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_button(_("_Export"), Gtk.ResponseType.OK) self.set_default_response(Gtk.ResponseType.OK) box = Gtk.VBox(spacing=6) destination_label = Gtk.Label(_("Destination folder:")) destination_label.set_line_wrap(True) destination_label.set_xalign(0.0) box.pack_start(destination_label, False, False, 0) frame = Gtk.Frame() self.directory_chooser = Gtk.FileChooserWidget( action=Gtk.FileChooserAction.SELECT_FOLDER) self.directory_chooser.set_select_multiple(False) self.directory_chooser.set_border_width(1) frame.add(self.directory_chooser) frame.set_shadow_type(Gtk.ShadowType.IN) frame.set_border_width(0) box.pack_start(frame, True, True, 0) pattern_label = Gtk.Label(_("Filename pattern:")) pattern_label.set_line_wrap(True) pattern_label.set_xalign(0.0) box.pack_start(pattern_label, False, False, 0) self.pattern_entry = UndoEntry() self.pattern_entry.set_text(pattern) box.pack_start(self.pattern_entry, False, False, 0) self.vbox.pack_start(box, True, True, 0) self.set_response_sensitive(Gtk.ResponseType.OK, False) def changed(*args): has_directory = self.directory_chooser.get_filename() is not None self.set_response_sensitive(Gtk.ResponseType.OK, has_directory) pattern_text = self.pattern_entry.get_text() has_pattern = bool(pattern_text) self.set_response_sensitive(Gtk.ResponseType.OK, has_pattern) self.directory_chooser.connect("selection-changed", changed) self.pattern_entry.connect("changed", changed) self.get_child().show_all() class Config(object): _config = PluginConfig(__name__) DEFAULT_PATTERN = "<artist~title>" default_pattern = ConfProp(_config, "default_pattern", DEFAULT_PATTERN) CONFIG = Config() class ExportToFolder(PlaylistPlugin): PLUGIN_ID = "ExportToFolder" PLUGIN_NAME = _(u"Export Playlist to Folder") PLUGIN_DESC = \ _("Exports a playlist by copying files to a folder.") PLUGIN_ICON = Icons.FOLDER REQUIRES_ACTION = True def __copy_songs(self, task, songs, directory, pattern): """Generator for copool to copy songs to the folder""" self.__cancel = False total = len(songs) print_d("Copying %d song(s) to directory %s. " "This might take a while..." % (total, directory)) for i, song in enumerate(songs): if self.__cancel: print_d("Cancelled export to directory.") self.__cancel = False break # Actually do the copy self._copy_file(song, directory, i + 1, pattern) task.update(float(i) / total) yield True print_d("Finished export to directory.") task.finish() def __cancel_copy(self): """Tell the copool to stop copying songs""" self.__cancel = True def _copy_file(self, song, directory, index, pattern): filename = song["~filename"] print_d("Copying %s." % filename) new_name = pattern.format(song) copyfile(filename, "%s/%04d - %s" % (directory, index, new_name)) def plugin_playlist(self, playlist): pattern_text = CONFIG.default_pattern dialog = ExportToFolderDialog(self.plugin_window, pattern_text) if dialog.run() == Gtk.ResponseType.OK: directory = dialog.directory_chooser.get_filename() pattern = FileFromPattern(dialog.pattern_entry.get_text()) task = Task("Export", _("Export Playlist to Folder"), stop=self.__cancel_copy) copool.add(self.__copy_songs, task, playlist.songs, directory, pattern, funcid="export-playlist-folder") dialog.destroy() @classmethod def PluginPreferences(self, parent): def changed(entry): CONFIG.default_pattern = entry.get_text() vbox = Gtk.VBox(spacing=6) def create_pattern(): hbox = Gtk.HBox(spacing=6) hbox.set_border_width(6) label = Gtk.Label(label=_("Default filename pattern:")) hbox.pack_start(label, False, True, 0) entry = UndoEntry() if CONFIG.default_pattern: entry.set_text(CONFIG.default_pattern) entry.connect('changed', changed) hbox.pack_start(entry, True, True, 0) return hbox vbox.pack_start(create_pattern(), True, True, 0) return vbox ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/���������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020027� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mqtt.py��������������������������������������������������������0000644�0001750�0001750�00000017531�13112005742�021377� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. import os from quodlibet import _ from quodlibet.formats import AudioFile from quodlibet.util import monospace, escape from quodlibet.util.tags import _TAGS _TOTAL_MQTT_ITEMS = 3 try: import paho.mqtt.client as mqtt except ImportError as e: from quodlibet.plugins import MissingModulePluginException, \ PluginNotSupportedError if os.name == "nt": raise PluginNotSupportedError raise MissingModulePluginException('paho-mqtt') from gi.repository import Gtk from quodlibet.pattern import Pattern from quodlibet.qltk.entry import UndoEntry, ValidatingEntry from quodlibet import qltk, app from quodlibet.util import copool from quodlibet.plugins.events import EventPlugin from quodlibet.plugins import PluginConfigMixin from quodlibet.util.dprint import print_d, print_w, print_e from quodlibet.qltk import Icons, ErrorMessage, Message EXPAND = Gtk.AttachOptions.EXPAND FILL = Gtk.AttachOptions.FILL class Config(object): STATUS_SONGLESS = 'no_song_text', "" PAT_PLAYING = 'playing_pattern', "♫ <~artist~title> ♫" PAT_PAUSED = 'paused_pattern', "<~artist~title> [%s]" % _("paused") HOST = 'host', "localhost" PORT = 'port', 1883 TOPIC = 'topic', 'quodlibet/now-playing' _ACCEPTS_PATTERNS = (_("Accepts QL Patterns e.g. %s") % monospace(escape('<~artist~title>'))) class MqttPublisherPlugin(EventPlugin, PluginConfigMixin): PLUGIN_ID = "MQTT Status" PLUGIN_NAME = _("MQTT Publisher") PLUGIN_DESC = _("Publishes status messages to an MQTT topic.") PLUGIN_ICON = Icons.FACE_SMILE def on_connect(self, client, userdata, flags, rc): """Callback for when the client receives a CONNACK response from the server.""" print_d("Connected to %s at %s:%d with result code %s" % (self.topic, self.host, self.port, rc)) def _subscribe(self, client, topic): result = client.subscribe(topic) if result != mqtt.MQTT_ERR_SUCCESS: print_w("Couldn't connect to %s (%s)" % (self.topic, result)) # The callback for when a PUBLISH message is received from the server. def on_message(self, client, userdata, msg): print_d("%s: %s" % (msg.topic, msg.payload)) def _set_up_mqtt_client(self): self.client = client = mqtt.Client() client.on_connect = self.on_connect client.on_message = self.on_message client.connect(self.host, self.port, 60) # Uses Threading.Thread internally, so we don't have to... self.client.loop_start() def _set_status(self, text): print_d("Setting status to \"%s\"..." % text) result, mid = self.client.publish(self.topic, text) if result != mqtt.MQTT_ERR_SUCCESS: print_w("Couldn't publish to %s at %s:%d (%s)" % (self.topic, self.host, self.port, result)) self.status = text def plugin_on_song_started(self, song): self.song = song pat_str = self.config_get(*Config.PAT_PLAYING) pattern = Pattern(pat_str) status = (pattern.format(song) if song else self.config_get(Config.STATUS_SONGLESS, "")) self._set_status(status) def plugin_on_paused(self): pat_str = self.config_get(*Config.PAT_PAUSED) pattern = Pattern(pat_str) self.status = pattern.format(self.song) if self.song else "" self._set_status(self.status) def plugin_on_unpaused(self): self.plugin_on_song_started(self.song) def disabled(self): if self.status: self._set_status(self.config_get(Config.STATUS_SONGLESS)) self.client.disconnect() def enabled(self): self.song = None self.status = '' self.host = self.config_get(*Config.HOST) self.port = int(self.config_get(*Config.PORT)) self.topic = self.config_get(*Config.TOPIC) self._set_up_mqtt_client() _CONFIG = [ (_("Broker hostname"), Config.HOST, _("broker hostname / IP")), (_("Broker port"), Config.PORT, _("broker port")), (_("Topic"), Config.TOPIC, _("Topic")), (_("Playing Pattern"), Config.PAT_PLAYING, _("Status text when a song is started.") + _ACCEPTS_PATTERNS), (_("Paused Pattern"), Config.PAT_PAUSED, _("Text when a song is paused.") + _ACCEPTS_PATTERNS), (_("No-song Text"), Config.STATUS_SONGLESS, _("Plain text for when there is no current song")) ] @staticmethod def _is_pattern(cfg): return cfg[0] in (Config.PAT_PLAYING[0], Config.PAT_PAUSED[0]) def PluginPreferences(self, parent): outer_vb = Gtk.VBox(spacing=12) t = self.config_table_for(self._CONFIG[:_TOTAL_MQTT_ITEMS]) frame = qltk.Frame(_("MQTT Configuration"), child=t) outer_vb.pack_start(frame, False, True, 0) t = self.config_table_for(self._CONFIG[_TOTAL_MQTT_ITEMS:]) frame = qltk.Frame(_("Status Text"), child=t) outer_vb.pack_start(frame, False, True, 0) return outer_vb def config_table_for(self, config_data): t = Gtk.Table(n_rows=2, n_columns=len(config_data)) t.set_col_spacings(6) t.set_row_spacings(6) for i, (label, cfg, tooltip) in enumerate(config_data): entry = (ValidatingEntry(validator=validator) if self._is_pattern(cfg) else UndoEntry()) entry.set_text(str(self.config_get(*cfg))) entry.connect('changed', self._on_changed, cfg) lbl = Gtk.Label(label=label + ":") lbl.set_size_request(140, -1) lbl.set_alignment(xalign=0.0, yalign=0.5) entry.set_tooltip_markup(tooltip) lbl.set_mnemonic_widget(entry) t.attach(lbl, 0, 1, i, i + 1, xoptions=FILL) t.attach(entry, 1, 2, i, i + 1, xoptions=FILL | EXPAND) return t def _on_changed(self, entry, cfg): self.config_entry_changed(entry, cfg[0]) if cfg in [Config.HOST, Config.PORT]: self.disabled() copool.add(self.try_connecting, funcid="connect", timeout=1000) def try_connecting(self): try: self.enabled() msg = (_("Connected to broker at %(host)s:%(port)d") % {'host': self.host, 'port': self.port}) Message(Gtk.MessageType.INFO, app.window, "Success", msg).run() except IOError as e: template = _("Couldn't connect to %(host)s:%(port)d (%(msg)s") msg = template % {'host': self.host, 'port': self.port, 'msg': e} print_w(msg) ErrorMessage(app.window, _("Connection error"), msg).run() yield def validator(pat): """Validates Patterns a bit. TODO: Extract to somewhere good - see #1983""" try: str = Pattern(pat).format(DUMMY_AF) return bool(str) except Exception as e: print_e("Problem with %s" % (pat,), e) class FakeAudioFile(AudioFile): def __call__(self, *args, **kwargs): real = super(FakeAudioFile, self).__call__(*args, **kwargs) tag = args[0] return real or self.fake_value(tag) def get(self, key, default=None): if key not in self: return default or self.fake_value(key) return super(FakeAudioFile, self).get(key, default) def fake_value(self, key): if key.replace('~', '').replace('#', '') in _TAGS: if key.startswith('~#'): return 0 elif key.startswith('~'): return "The %s" % key if key.startswith('~'): raise ValueError("Unknown tag %s" % key) return "The %s" % key DUMMY_AF = FakeAudioFile({'~filename': '/dev/null'}) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/themeswitcher.py�����������������������������������������������0000644�0001750�0001750�00000011127�13112005742�023260� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011,2013 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import warnings import os from gi.repository import Gtk, Gio, GLib from quodlibet import _ from quodlibet import qltk from quodlibet import config from quodlibet.qltk import Icons from quodlibet.util.path import get_home_dir from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.plugins.events import EventPlugin class ThemeSwitcher(EventPlugin): PLUGIN_ID = "Theme Switcher" PLUGIN_NAME = _("Theme Switcher") PLUGIN_DESC = _("Changes the active GTK+ theme.") PLUGIN_ICON = Icons.PREFERENCES_DESKTOP_THEME __enabled = False __defaults = False CONFIG_THEME = PLUGIN_ID + "_theme" CONFIG_DARK = PLUGIN_ID + "_prefer_dark" def __init_defaults(self): if self.__defaults: return self.__defaults = True settings = Gtk.Settings.get_default() self.__default_theme = settings.get_property('gtk-theme-name') self.__default_dark = settings.get_property( 'gtk-application-prefer-dark-theme') def PluginPreferences(self, *args): self.__init_defaults() hb = Gtk.HBox(spacing=6) label = Gtk.Label(label=_("_Theme:")) combo = Gtk.ComboBoxText() theme = config.get("plugins", self.CONFIG_THEME, None) combo.append_text(_("Default Theme")) themes = self.__get_themes() select = 0 for i, name in enumerate(sorted(themes)): combo.append_text(name) if name == theme: select = i + 1 combo.set_active(select) combo.connect('changed', self.__changed) dark_button = ConfigCheckButton( _("Prefer dark theme version"), "plugins", self.CONFIG_DARK, populate=True, default=self.__get_dark()) def dark_cb(button): self.__set_dark(button.get_active()) dark_button.connect('toggled', dark_cb) label.set_mnemonic_widget(combo) label.set_use_underline(True) hb.pack_start(label, False, True, 0) hb.pack_start(combo, False, True, 0) vbox = Gtk.VBox(spacing=6) vbox.pack_start(hb, False, True, 0) vbox.pack_start(dark_button, False, True, 0) return qltk.Frame(_("Preferences"), child=vbox) def __changed(self, combo): index = combo.get_active() name = (index and combo.get_active_text()) or "" config.set("plugins", self.CONFIG_THEME, name) self.__set_theme(name) def __get_themes(self): # deprecated, but there is no public replacement with warnings.catch_warnings(): warnings.simplefilter("ignore") theme_dir = Gtk.rc_get_theme_dir() theme_dirs = [theme_dir, os.path.join(get_home_dir(), ".themes")] themes = set() for theme_dir in theme_dirs: try: subdirs = os.listdir(theme_dir) except OSError: continue for dir_ in subdirs: gtk_dir = os.path.join(theme_dir, dir_, "gtk-3.0") if os.path.isdir(gtk_dir): themes.add(dir_) try: resource_themes = Gio.resources_enumerate_children( "/org/gtk/libgtk/theme", 0) except GLib.GError: pass else: themes.update([t.rstrip("/") for t in resource_themes]) return themes def __set_theme(self, name): if not self.__enabled: return settings = Gtk.Settings.get_default() themes = self.__get_themes() name = ((name in themes) and name) or self.__default_theme settings.set_property('gtk-theme-name', name) def __set_dark(self, value): if not self.__enabled: return settings = Gtk.Settings.get_default() if value is None: value = self.__default_dark settings.set_property('gtk-application-prefer-dark-theme', value) def __get_dark(self): return config.getboolean( "plugins", self.CONFIG_DARK, self.__default_dark) def enabled(self): self.__enabled = True self.__init_defaults() theme = config.get("plugins", self.CONFIG_THEME, None) self.__set_theme(theme) self.__set_dark(self.__get_dark()) def disabled(self): self.__set_theme(None) self.__set_dark(None) self.__enabled = False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/toggle_menu.py�������������������������������������������������0000644�0001750�0001750�00000003575�13112005742�022722� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gdk from quodlibet import _ from quodlibet import app from quodlibet.plugins.events import EventPlugin from quodlibet.qltk import Icons class ToggleMenuBarPlugin(EventPlugin): PLUGIN_ID = "ToggleMenuBar" PLUGIN_NAME = _("Toggle Menu Bar") PLUGIN_DESC = _("Toggle the menu bar by pressing the Alt key.") PLUGIN_ICON = Icons.EDIT def enabled(self): window = app.window # Maybe this should be made directly accessible self._menubar = window.get_children()[0].get_children()[0] # Initially set hidden self._menubar.set_visible(False) # Menu bar visibility toggle def toggle_menubar(widget, event): # Test for the Alt key if event.state == Gdk.ModifierType.MOD1_MASK: self._menubar.set_visible(not self._menubar.get_visible()) # Select the menu bar if visible if self._menubar.get_visible(): self._menubar.select_first(False) self._menubar.deselect() self._key_release_handler = \ window.connect('key_release_event', toggle_menubar) # Menu bar hide after deactivation def hide_menubar(widget): self._menubar.set_visible(False) self._deactivate_handler = \ self._menubar.connect('deactivate', hide_menubar) def disabled(self): window = app.window window.disconnect(self._key_release_handler) del self._key_release_handler self._menubar.disconnect(self._deactivate_handler) self._menubar.set_visible(True) del self._deactivate_handler �����������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/telepathy_status.py��������������������������������������������0000644�0001750�0001750�00000014170�13112005742�024010� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Quod Libet Telepathy Plugin # Copyright 2012 Christoph Reiter # 2012,2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. import os import sys if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError import dbus from gi.repository import Gtk from quodlibet import _ from quodlibet.pattern import Pattern from quodlibet.qltk.entry import UndoEntry from quodlibet import util from quodlibet import qltk from quodlibet.plugins.events import EventPlugin from quodlibet.plugins import PluginConfigMixin from quodlibet.util.dprint import print_d from quodlibet.qltk import Icons AM_PATH = "/org/freedesktop/Telepathy/AccountManager" AM_NAME = "org.freedesktop.Telepathy.AccountManager" AM_IFACE = "org.freedesktop.Telepathy.AccountManager" AC_IFACE = "org.freedesktop.Telepathy.Account" PROPS_IFACE = "org.freedesktop.DBus.Properties" CONN_PRESENCE_TYPE_AVAILABLE = 2 is_valid_presence_type = lambda x: x not in [0, 7, 8] def get_active_account_paths(): bus = dbus.SessionBus() bus_object = bus.get_object(AM_NAME, AM_PATH) bus_iface = dbus.Interface(bus_object, dbus_interface=PROPS_IFACE) return bus_iface.Get(AM_IFACE, "ValidAccounts") def set_accounts_requested_presence(paths, message): bus = dbus.SessionBus() for path in paths: bus_object = bus.get_object(AM_NAME, path) bus_iface = dbus.Interface(bus_object, dbus_interface=PROPS_IFACE) presence_type, status = bus_iface.Get(AC_IFACE, "CurrentPresence")[:2] if not is_valid_presence_type(presence_type): presence_type = dbus.UInt32(CONN_PRESENCE_TYPE_AVAILABLE) value = dbus.Struct([presence_type, status, message]) bus_iface.Set(AC_IFACE, "RequestedPresence", value) class TelepathyStatusPlugin(EventPlugin, PluginConfigMixin): PLUGIN_ID = "Telepathy Status" PLUGIN_NAME = _("Telepathy Status Messages") PLUGIN_DESC = _("Updates all Telepathy-based IM accounts (as configured " "in Empathy etc) with a status message based on current " "song.") PLUGIN_ICON = Icons.FACE_SMILE DEFAULT_PAT = "♫ <~artist~title> ♫" DEFAULT_PAT_PAUSED = "<~artist~title> [%s]" % _("paused") CFG_STATUS_SONGLESS = 'no_song_text' CFG_LEAVE_STATUS = "leave_status" CFG_PAT_PLAYING = "playing_pattern" CFG_PAT_PAUSED = "paused_pattern" def _set_status(self, text): print_d("Setting status to \"%s\"..." % text) self.status = text try: accounts = get_active_account_paths() # TODO: account filtering set_accounts_requested_presence(accounts, text) except dbus.DBusException: print_d("...but setting failed") util.print_exc() def plugin_on_song_started(self, song): self.song = song pat_str = self.config_get(self.CFG_PAT_PLAYING, self.DEFAULT_PAT) pattern = Pattern(pat_str) status = (pattern.format(song) if song else self.config_get(self.CFG_STATUS_SONGLESS, "")) self._set_status(status) def plugin_on_paused(self): pat_str = self.config_get(self.CFG_PAT_PAUSED, self.DEFAULT_PAT_PAUSED) pattern = Pattern(pat_str) self.status = pattern.format(self.song) if self.song else "" self._set_status(self.status) def plugin_on_unpaused(self): self.plugin_on_song_started(self.song) def disabled(self): if self.status: self._set_status(self.config_get(self.CFG_STATUS_SONGLESS)) def enabled(self): self.song = None self.status = "" def PluginPreferences(self, parent): outer_vb = Gtk.VBox(spacing=12) vb = Gtk.VBox(spacing=12) # Playing hb = Gtk.HBox(spacing=6) entry = UndoEntry() entry.set_text(self.config_get(self.CFG_PAT_PLAYING, self.DEFAULT_PAT)) entry.connect('changed', self.config_entry_changed, self.CFG_PAT_PLAYING) lbl = Gtk.Label(label=_("Playing:")) entry.set_tooltip_markup(_("Status text when a song is started. " "Accepts QL Patterns e.g. %s") % util.monospace( util.escape("<~artist~title>"))) lbl.set_mnemonic_widget(entry) hb.pack_start(lbl, False, True, 0) hb.pack_start(entry, True, True, 0) vb.pack_start(hb, True, True, 0) # Paused hb = Gtk.HBox(spacing=6) entry = UndoEntry() entry.set_text(self.config_get(self.CFG_PAT_PAUSED, self.DEFAULT_PAT_PAUSED)) entry.connect('changed', self.config_entry_changed, self.CFG_PAT_PAUSED) lbl = Gtk.Label(label=_("Paused:")) entry.set_tooltip_markup(_("Status text when a song is paused. " "Accepts QL Patterns e.g. %s") % util.monospace( util.escape("<~artist~title>"))) lbl.set_mnemonic_widget(entry) hb.pack_start(lbl, False, True, 0) hb.pack_start(entry, True, True, 0) vb.pack_start(hb, True, True, 0) # No Song hb = Gtk.HBox(spacing=6) entry = UndoEntry() entry.set_text(self.config_get(self.CFG_STATUS_SONGLESS, "")) entry.connect('changed', self.config_entry_changed, self.CFG_STATUS_SONGLESS) entry.set_tooltip_text( _("Plain text for status when there is no current song")) lbl = Gtk.Label(label=_("No song:")) lbl.set_mnemonic_widget(entry) hb.pack_start(lbl, False, True, 0) hb.pack_start(entry, True, True, 0) vb.pack_start(hb, True, True, 0) # Frame frame = qltk.Frame(_("Status Patterns"), child=vb) outer_vb.pack_start(frame, False, True, 0) return outer_vb ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/advanced_preferences.py����������������������������������������0000644�0001750�0001750�00000012331�13112005742�024531� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # 2016-17 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet import config from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk import Icons from quodlibet.util.string import decode from quodlibet.util import gdecode from quodlibet.plugins.events import EventPlugin from quodlibet.compat import text_type def _config(section, option, label, tooltip=None, getter=None): def on_changed(entry, *args): config.settext(section, option, gdecode(entry.get_text())) entry = UndoEntry() if tooltip: entry.set_tooltip_text(tooltip) entry.set_text(config.gettext(section, option)) entry.connect("changed", on_changed) def on_reverted(*args): config.reset(section, option) entry.set_text(config.gettext(section, option)) revert = Gtk.Button() revert.add(Gtk.Image.new_from_icon_name( Icons.DOCUMENT_REVERT, Gtk.IconSize.BUTTON)) revert.connect("clicked", on_reverted) return (Gtk.Label(label=label), entry, revert) def text_config(section, option, label, tooltip=None): def getter(section, option): return decode(config.get(section, option)) return _config(section, option, label, tooltip, getter) def boolean_config(section, option, label, tooltip): def getter(section, option): return text_type(config.getboolean(section, option)) return _config(section, option, label, tooltip, getter) def int_config(section, option, label, tooltip): def getter(section, option): return text_type(config.getint(section, option)) return _config(section, option, label, tooltip, getter) class AdvancedPreferences(EventPlugin): PLUGIN_ID = "Advanced Preferences" PLUGIN_NAME = _("Advanced Preferences") PLUGIN_DESC = _("Allow editing of advanced config settings.") PLUGIN_CAN_ENABLE = False PLUGIN_ICON = Icons.PREFERENCES_SYSTEM def __init_defaults(self): self.__enabled = False def PluginPreferences(self, *args): def changed(entry, name, section="settings"): config.set(section, name, entry.get_text()) vb = Gtk.VBox(spacing=12) # Tabulate all settings for neatness table = Gtk.Table(n_rows=6, n_columns=2) table.set_col_spacings(6) table.set_row_spacings(6) rows = [] # We don't use translations as these things are internal and I don't # want to burden the translators... rows.append( text_config( "editing", "id3encoding", "ID3 encodings:", ("ID3 encodings separated by spaces. " "UTF-8 is always tried first, and Latin-1 " "is always tried last."))) rows.append( text_config( "settings", "search_tags", "Search tags:", ("Tags which get searched in addition to " "the ones present in the song list. Separate with \",\""))) rows.append( text_config( "settings", "rating_symbol_full", "Rating symbol (full):")) rows.append( text_config( "settings", "rating_symbol_blank", "Rating symbol (blank):")) rows.append( text_config( "player", "backend", "Backend:", "Identifier of the playback backend to use")) rows.append( boolean_config( "settings", "disable_hints", "Disable hints:", "Disable popup windows (treeview hints)")) rows.append( int_config( "browsers", "cover_size", "Album cover size:", ("Size of the album cover images in the album list browser " "(restart required)"))) rows.append( boolean_config( "settings", "disable_mmkeys", "Disable multimedia keys:", "(restart required)")) rows.append( text_config( "settings", "window_title_pattern", "Main window title:", ("A (tied) tag for the main window title, e.g. ~title~~people " "(restart required)"))) for (row, (label, entry, button)) in enumerate(rows): label.set_alignment(1.0, 0.5) table.attach(label, 0, 1, row, row + 1, xoptions=Gtk.AttachOptions.FILL) table.attach(entry, 1, 2, row, row + 1) table.attach(button, 2, 3, row, row + 1, xoptions=Gtk.AttachOptions.SHRINK) def on_click(button): button.hide() table.set_no_show_all(False) table.show_all() button = Gtk.Button(label=_("I know what I'm doing")) button.connect("clicked", on_click) vb.pack_start(button, True, True, 0) vb.pack_start(table, True, True, 0) table.set_no_show_all(True) return vb �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/write_cover.py�������������������������������������������������0000644�0001750�0001750�00000003700�13112005742�022733� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import shutil from gi.repository import Gtk import quodlibet from quodlibet import _ from quodlibet import app from quodlibet import config from quodlibet.plugins.events import EventPlugin from quodlibet.qltk import Icons def get_path(): out = os.path.join(quodlibet.get_user_dir(), "current.cover") return config.get("plugins", __name__, out) def set_path(value): config.set("plugins", __name__, value) class PictureSaver(EventPlugin): PLUGIN_ID = "Picture Saver" PLUGIN_NAME = _("Picture Saver") PLUGIN_DESC = _("Saves the cover image of the current song to a file.") PLUGIN_ICON = Icons.DOCUMENT_SAVE def plugin_on_song_started(self, song): outfile = get_path() if song is None: try: os.unlink(outfile) except EnvironmentError: pass else: cover = app.cover_manager.get_cover(song) if cover is None: try: os.unlink(outfile) except EnvironmentError: pass else: with open(outfile, "wb") as f: f.write(cover.read()) def PluginPreferences(self, parent): def changed(entry): fn = entry.get_text() try: shutil.move(get_path(), fn) except EnvironmentError: pass else: set_path(fn) hb = Gtk.HBox(spacing=6) hb.set_border_width(6) hb.pack_start(Gtk.Label(label=_("File:")), False, True, 0) e = Gtk.Entry() e.set_text(get_path()) e.connect('changed', changed) hb.pack_start(e, True, True, 0) return hb ����������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/clock.py�������������������������������������������������������0000644�0001750�0001750�00000010033�13112005742�021473� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import time from gi.repository import Gtk, GLib from quodlibet import _ from quodlibet import app from quodlibet import config from quodlibet.plugins.events import EventPlugin from quodlibet.qltk.entry import ValidatingEntry from quodlibet.qltk import Icons from quodlibet.util import connect_obj class Alarm(EventPlugin): PLUGIN_ID = "Alarm Clock" PLUGIN_NAME = _("Alarm Clock") PLUGIN_DESC = _("Wakes you up with loud music.") PLUGIN_ICON = Icons.APPOINTMENT_NEW _pref_name = "alarm_times" _times = ["HH:MM"] * 7 _enabled = False def __init__(self): try: self._times = config.get("plugins", self._pref_name).split(' ')[:7] except: pass else: self._times = (self._times + ["HH:MM"] * 7)[:7] GLib.timeout_add(30000, self._check) def enabled(self): self._enabled = True def disabled(self): self._enabled = False def is_valid_time(time): try: hour, minute = map(int, time.split(":")) except: return False else: return (hour < 24 and minute < 60) is_valid_time = staticmethod(is_valid_time) def plugin_on_song_started(self, song): pass def _entry_changed(self, entries): self._times = map(ValidatingEntry.get_text, entries) config.set("plugins", self._pref_name, " ".join(self._times)) def _ready(self): tdata = time.localtime() goal = self._times[tdata.tm_wday] try: ghour, gminute = map(int, goal.split(":")) except: return False else: return (tdata.tm_hour, tdata.tm_min) == (ghour, gminute) def _fire(self): if self._enabled: if app.player.paused: if app.player.song is None: app.player.next() else: app.player.paused = False GLib.timeout_add(60000, self._longer_check) def _longer_check(self): if self._ready(): self._fire() else: GLib.timeout_add(30000, self._check) def _check(self): if self._ready(): self._fire() else: return True def PluginPreferences(self, parent): t = Gtk.Table(n_rows=2, n_columns=7) t.set_col_spacings(6) entries = [] for i in range(7): e = ValidatingEntry(Alarm.is_valid_time) e.set_size_request(100, -1) e.set_text(self._times[i]) e.set_max_length(5) e.set_width_chars(6) day = Gtk.Label( label=time.strftime("_%A:", (2000, 1, 1, 0, 0, 0, i, 1, 0))) day.set_mnemonic_widget(e) day.set_use_underline(True) day.set_alignment(0.0, 0.5) t.attach(day, 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL) t.attach(e, 1, 2, i, i + 1, xoptions=Gtk.AttachOptions.FILL) entries.append(e) for e in entries: connect_obj(e, 'changed', self._entry_changed, entries) return t class Lullaby(Alarm): PLUGIN_ID = "Lullaby" PLUGIN_NAME = _("Lullaby") PLUGIN_DESC = _("Fades out and pauses your music.") PLUGIN_ICON = Icons.MEDIA_PLAYBACK_PAUSE _pref_name = "lullaby_times" def _fire(self): if self._enabled: GLib.timeout_add(500, self._fade_out) self.__was_volume = app.player.volume else: GLib.timeout_add(30000, self._check) def _fade_out(self): app.player.volume -= 0.005 if app.player.volume == 0: app.player.paused = True if app.player.paused: app.player.volume = self.__was_volume GLib.timeout_add(30000, self._check) else: return True �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/headphonemon.py������������������������������������������������0000644�0001750�0001750�00000012757�13112005742�023064� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys from quodlibet.qltk import Icons if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError import fcntl import subprocess from gi.repository import GLib, GObject from quodlibet import _ from quodlibet.plugins.events import EventPlugin from quodlibet.util import print_d from quodlibet import app def get_headphone_status(): """Returns if headphones are connected.""" # No idea if this is a good way... but works here :) try: data = subprocess.check_output(["pactl", "list", "sinks"]) except OSError: return False for line in data.splitlines(): if line.strip() == "Active Port: analog-output-headphones": return True else: return False class HeadphoneAction(object): DISCONNECTED = 0 CONNECTED = 1 class HeadphoneMonitor(GObject.Object): """Monitors the headphone connection state advertised by pulseaudio. After start() is called will emit a signal in case headphones get connected or disconnected. If pulseaudio isn't active this will work but always return a disconnected status. The changed signal will never be emitted with the same status multiple times. """ __gsignals__ = { 'action': (GObject.SignalFlags.RUN_LAST, None, (object,)), } def __init__(self): super(HeadphoneMonitor, self).__init__() self._subscribe_id = None self._process = None self._status = None def is_connected(self): """Returns whether headphones are currently connected""" if self._status is None: raise Exception("call start() first") return self._status def _emit(self): self.emit("action", HeadphoneAction.CONNECTED if self._status else HeadphoneAction.DISCONNECTED) def _update_status(self): assert self._status is not None new_status = get_headphone_status() if new_status != self._status: self._status = new_status self._emit() return def start(self): """Start the monitoring process. Once this gets called the "changed" signal will be emitted. """ NULL = open(os.devnull, 'wb') try: self._process = subprocess.Popen( ["pactl", "subscribe"], stdout=subprocess.PIPE, stderr=NULL) except OSError: self._status = False return f = self._process.stdout fcntl.fcntl(f, fcntl.F_SETFL, os.O_NONBLOCK) def can_read_cb(fd, flags): if flags & (GLib.IOCondition.HUP | GLib.IOCondition.ERR): f.close() self._subscribe_id = None return False data = f.read() if not data: f.close() self._subscribe_id = None return False # querying the status also results in client events which would # lead us into an endless loop. Instead just something if there # is a sink event if " on sink " in data: self._update_status() return True self._status = get_headphone_status() self._subscribe_id = GLib.io_add_watch( f, GLib.PRIORITY_HIGH, GLib.IOCondition.IN | GLib.IOCondition.ERR | GLib.IOCondition.HUP, can_read_cb) def stop(self): """Stop the monitoring process. After this returns no signal will be emitted. Can be called multiple times. start() can be called to start monitoring again after this returns. """ if self._subscribe_id is not None: GLib.source_remove(self._subscribe_id) self._subscribe_id = None if self._process is not None: self._process.terminate() self._process.wait() self._process = None self._status = None class HeadphoneMonitorPlugin(EventPlugin): PLUGIN_ID = "HeadphoneMonitor" PLUGIN_NAME = _("Pause on Headphone Unplug") PLUGIN_DESC = _("Pauses in case headphones get unplugged and unpauses in " "case they get plugged in again.") PLUGIN_ICON = Icons.MEDIA_PLAYBACK_PAUSE def enabled(self): self._was_paused = False self._do_act = False self._mon = HeadphoneMonitor() self._mon.connect("action", self._changed) self._mon.start() def _changed(self, mon, action): if action == HeadphoneAction.DISCONNECTED: print_d("Headphones disconnected") if self._do_act: do_act = self._do_act self._was_paused = app.player.paused app.player.paused = True self._do_act = do_act elif action == HeadphoneAction.CONNECTED: print_d("Headphones connected") if self._do_act: do_act = self._do_act app.player.paused = self._was_paused self._do_act = do_act def disabled(self): self._mon.stop() del self._mon def plugin_on_paused(self): self._do_act = False def plugin_on_unpaused(self): self._do_act = self._mon.is_connected() �����������������quodlibet-3.9.1/quodlibet/ext/events/autorating.py��������������������������������������������������0000644�0001750�0001750�00000002013�13112005742�022554� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.plugins.events import EventPlugin from quodlibet.qltk import Icons class AutoRating(EventPlugin): PLUGIN_ID = "Automatic Rating" PLUGIN_NAME = _("Automatic Rating") PLUGIN_DESC = _("Rates songs automatically when they are played or " "skipped. This uses the 'accelerated' algorithm from " "vux by Brian Nelson.") PLUGIN_ICON = Icons.USER_BOOKMARKS def plugin_on_song_ended(self, song, skipped): if song is not None: rating = song("~#rating") invrating = 1.0 - rating delta = min(rating, invrating) / 2.0 if skipped: rating -= delta else: rating += delta song["~#rating"] = rating ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/inhibit.py�����������������������������������������������������0000644�0001750�0001750�00000004635�13112005742�022041� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError import dbus from quodlibet import _ from quodlibet import app from quodlibet.qltk import Icons from quodlibet.plugins.events import EventPlugin def get_toplevel_xid(): if app.window.get_window(): try: return app.window.get_window().get_xid() except AttributeError: # non x11 pass return 0 class InhibitFlags(object): LOGOUT = 1 USERSWITCH = 1 << 1 SUSPEND = 1 << 2 IDLE = 1 << 3 class SessionInhibit(EventPlugin): PLUGIN_ID = "screensaver_inhibit" PLUGIN_NAME = _("Inhibit Screensaver") PLUGIN_DESC = _("Prevents the GNOME screensaver from activating while" " a song is playing.") PLUGIN_ICON = Icons.PREFERENCES_DESKTOP_SCREENSAVER DBUS_NAME = "org.gnome.SessionManager" DBUS_INTERFACE = "org.gnome.SessionManager" DBUS_PATH = "/org/gnome/SessionManager" APPLICATION_ID = "quodlibet" INHIBIT_REASON = _("Music is playing") __cookie = None def enabled(self): if not app.player.paused: self.plugin_on_unpaused() def disabled(self): if not app.player.paused: self.plugin_on_paused() def plugin_on_unpaused(self): xid = dbus.UInt32(get_toplevel_xid()) flags = dbus.UInt32(InhibitFlags.IDLE) try: bus = dbus.SessionBus() obj = bus.get_object(self.DBUS_NAME, self.DBUS_PATH) iface = dbus.Interface(obj, self.DBUS_INTERFACE) self.__cookie = iface.Inhibit( self.APPLICATION_ID, xid, self.INHIBIT_REASON, flags) except dbus.DBusException: pass def plugin_on_paused(self): if self.__cookie is None: return try: bus = dbus.SessionBus() obj = bus.get_object(self.DBUS_NAME, self.DBUS_PATH) iface = dbus.Interface(obj, self.DBUS_INTERFACE) iface.Uninhibit(self.__cookie) self.__cookie = None except dbus.DBusException: pass ���������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/notify.py������������������������������������������������������0000644�0001750�0001750�00000041322�13112005742�021715� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright (c) 2010 Felix Krull <f_krull@gmx.de> # 2011-2013 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # Note: This plugin is based on notify.py as distributed in the # quodlibet-plugins package; however, that file doesn't contain a copyright # note. As for the license, GPLv2 is the only choice anyway, as it calls # Quod Libet code, which is GPLv2 as well, so I thought it safe to add this. import os import sys if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError import re import dbus from gi.repository import Gtk, GObject, GLib from senf import fsn2uri from quodlibet import _ from quodlibet import config, qltk, app from quodlibet.plugins.events import EventPlugin from quodlibet.pattern import XMLFromPattern from quodlibet.qltk.textedit import TextView, TextBuffer from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk.msg import ErrorMessage from quodlibet.qltk import Icons from quodlibet.util import connect_obj, unescape, print_w from quodlibet.compat import text_type # configuration stuff DEFAULT_CONFIG = { "timeout": 4000, "show_notifications": "all", "show_only_when_unfocused": True, "show_next_button": True, "titlepattern": "<artist|<artist> - ><title>", "bodypattern": """<~length> <album|<album><discsubtitle| - <discsubtitle>> ><~year|<~year>>""", } def get_conf_value(name, accessor="get"): try: value = getattr(config, accessor)("plugins", "notify_%s" % name) except Exception: value = DEFAULT_CONFIG[name] return value get_conf_bool = lambda name: get_conf_value(name, "getboolean") get_conf_int = lambda name: get_conf_value(name, "getint") def set_conf_value(name, value): config.set("plugins", "notify_%s" % name, text_type(value)) class PreferencesWidget(Gtk.VBox): def __init__(self, parent, plugin_instance): GObject.GObject.__init__(self, spacing=12) self.plugin_instance = plugin_instance # notification text settings table = Gtk.Table(n_rows=2, n_columns=3) table.set_col_spacings(6) table.set_row_spacings(6) text_frame = qltk.Frame(_("Notification text"), child=table) title_entry = UndoEntry() title_entry.set_text(get_conf_value("titlepattern")) title_entry.connect("focus-out-event", self.on_entry_unfocused, "titlepattern") table.attach(title_entry, 1, 2, 0, 1) title_label = Gtk.Label(label=_("_Title:")) title_label.set_use_underline(True) title_label.set_alignment(0, 0.5) title_label.set_mnemonic_widget(title_entry) table.attach(title_label, 0, 1, 0, 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) title_revert = Gtk.Button() title_revert.add(Gtk.Image.new_from_icon_name( Icons.DOCUMENT_REVERT, Gtk.IconSize.MENU)) title_revert.set_tooltip_text(_("Revert to default pattern")) connect_obj(title_revert, "clicked", title_entry.set_text, DEFAULT_CONFIG["titlepattern"]) table.attach(title_revert, 2, 3, 0, 1, xoptions=Gtk.AttachOptions.SHRINK) body_textbuffer = TextBuffer() body_textview = TextView(buffer=body_textbuffer) body_textview.set_size_request(-1, 85) body_textview.get_buffer().set_text(get_conf_value("bodypattern")) body_textview.connect("focus-out-event", self.on_textview_unfocused, "bodypattern") body_scrollarea = Gtk.ScrolledWindow() body_scrollarea.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) body_scrollarea.set_shadow_type(Gtk.ShadowType.ETCHED_OUT) body_scrollarea.add(body_textview) table.attach(body_scrollarea, 1, 2, 1, 2) body_label = Gtk.Label(label=_("_Body:")) body_label.set_padding(0, 3) body_label.set_use_underline(True) body_label.set_alignment(0, 0) body_label.set_mnemonic_widget(body_textview) table.attach(body_label, 0, 1, 1, 2, xoptions=Gtk.AttachOptions.SHRINK) body_revert = Gtk.Button() body_revert.add(Gtk.Image.new_from_icon_name( Icons.DOCUMENT_REVERT, Gtk.IconSize.MENU)) body_revert.set_tooltip_text(_("Revert to default pattern")) connect_obj(body_revert, "clicked", body_textbuffer.set_text, DEFAULT_CONFIG["bodypattern"]) table.attach( body_revert, 2, 3, 1, 2, xoptions=Gtk.AttachOptions.SHRINK, yoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) # preview button preview_button = qltk.Button( _("_Show notification"), Icons.SYSTEM_RUN) preview_button.set_sensitive(app.player.info is not None) preview_button.connect("clicked", self.on_preview_button_clicked) self.qlplayer_connected_signals = [ app.player.connect("paused", self.on_player_state_changed, preview_button), app.player.connect("unpaused", self.on_player_state_changed, preview_button), ] table.attach( preview_button, 0, 3, 2, 3, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) self.pack_start(text_frame, True, True, 0) # notification display settings display_box = Gtk.VBox(spacing=12) display_frame = qltk.Frame(_("Show notifications"), child=display_box) radio_box = Gtk.VBox(spacing=6) display_box.pack_start(radio_box, True, True, 0) only_user_radio = Gtk.RadioButton(label=_( "Only on <i>_manual</i> song changes" ), use_underline=True) only_user_radio.get_child().set_use_markup(True) only_user_radio.connect("toggled", self.on_radiobutton_toggled, "show_notifications", "user") radio_box.pack_start(only_user_radio, True, True, 0) only_auto_radio = Gtk.RadioButton(group=only_user_radio, label=_( "Only on <i>_automatic</i> song changes" ), use_underline=True) only_auto_radio.get_child().set_use_markup(True) only_auto_radio.connect("toggled", self.on_radiobutton_toggled, "show_notifications", "auto") radio_box.pack_start(only_auto_radio, True, True, 0) all_radio = Gtk.RadioButton(group=only_user_radio, label=_( "On <i>a_ll</i> song changes" ), use_underline=True) all_radio.get_child().set_use_markup(True) all_radio.connect("toggled", self.on_radiobutton_toggled, "show_notifications", "all") radio_box.pack_start(all_radio, True, True, 0) try: { "user": only_user_radio, "auto": only_auto_radio, "all": all_radio }[get_conf_value("show_notifications")].set_active(True) except KeyError: all_radio.set_active(True) set_conf_value("show_notifications", "all") focus_check = Gtk.CheckButton( label=_("Only when the main window is not _focused"), use_underline=True) focus_check.set_active(get_conf_bool("show_only_when_unfocused")) focus_check.connect("toggled", self.on_checkbutton_toggled, "show_only_when_unfocused") display_box.pack_start(focus_check, True, True, 0) show_next = Gtk.CheckButton( label=_("Show \"_Next\" button"), use_underline=True) show_next.set_active(get_conf_bool("show_next_button")) show_next.connect("toggled", self.on_checkbutton_toggled, "show_next_button") display_box.pack_start(show_next, True, True, 0) self.pack_start(display_frame, True, True, 0) self.show_all() self.connect("destroy", self.on_destroyed) # callbacks def on_entry_unfocused(self, entry, event, cfgname): set_conf_value(cfgname, entry.get_text()) def on_textview_unfocused(self, textview, event, cfgname): text_buffer = textview.get_buffer() start, end = text_buffer.get_bounds() text = text_buffer.get_text(start, end, True) set_conf_value(cfgname, text) def on_radiobutton_toggled(self, radio, cfgname, value): if radio.get_active(): set_conf_value(cfgname, value) def on_checkbutton_toggled(self, button, cfgname): set_conf_value(cfgname, button.get_active()) def on_preview_button_clicked(self, button): if app.player.info is not None: if not self.plugin_instance.show_notification(app.player.info): ErrorMessage(self, _("Connection Error"), _("Couldn't connect to notification daemon.")).run() def on_player_state_changed(self, player, preview_button): preview_button.set_sensitive(player.info is not None) def on_destroyed(self, ev): for sig in self.qlplayer_connected_signals: app.player.disconnect(sig) self.qlplayer_connected_signals = [] self.plugin_instance = None class Notify(EventPlugin): PLUGIN_ID = "Notify" PLUGIN_NAME = _("Song Notifications") PLUGIN_DESC = _("Displays a notification when the song changes.") PLUGIN_ICON = Icons.DIALOG_INFORMATION DBUS_NAME = "org.freedesktop.Notifications" DBUS_IFACE = "org.freedesktop.Notifications" DBUS_PATH = "/org/freedesktop/Notifications" # these can all be used even if it wasn't enabled __enabled = False __last_id = 0 __image_fp = None __interface = None __action_sig = None __watch = None def enabled(self): self.__enabled = True # This works because: # - if paused, any on_song_started event will be generated by user # interaction # - if playing, an on_song_ended event will be generated before any # on_song_started event in any case. self.__was_stopped_by_user = True self.__force_notification = False self.__caps = None self.__spec_version = None self.__enable_watch() def disabled(self): self.__disable_watch() self.__disconnect() self.__enabled = False self._set_image_fileobj(None) def __enable_watch(self): """Enable events for dbus name owner change""" try: bus = dbus.Bus(dbus.Bus.TYPE_SESSION) # This also triggers for existing name owners self.__watch = bus.watch_name_owner(self.DBUS_NAME, self.__owner_changed) except dbus.DBusException: pass def __disable_watch(self): """Disable name owner change events""" if self.__watch: self.__watch.cancel() self.__watch = None def __disconnect(self): self.__interface = None if self.__action_sig: self.__action_sig.remove() self.__action_sig = None def __owner_changed(self, owner): # In case the owner gets removed, remove all references to it if not owner: self.__disconnect() def PluginPreferences(self, parent): return PreferencesWidget(parent, self) def __get_interface(self): """Returns a fresh proxy + info about the server""" obj = dbus.SessionBus().get_object(self.DBUS_NAME, self.DBUS_PATH) interface = dbus.Interface(obj, self.DBUS_IFACE) name, vendor, version, spec_version = \ map(str, interface.GetServerInformation()) spec_version = map(int, spec_version.split(".")) caps = map(str, interface.GetCapabilities()) return interface, caps, spec_version def close_notification(self): """Closes the last opened notification""" if not self.__last_id: return try: obj = dbus.SessionBus().get_object(self.DBUS_NAME, self.DBUS_PATH) interface = dbus.Interface(obj, self.DBUS_IFACE) interface.CloseNotification(self.__last_id) except dbus.DBusException: pass else: self.__last_id = 0 def _set_image_fileobj(self, fileobj): if self.__image_fp is not None: self.__image_fp.close() self.__image_fp = None self.__image_fp = fileobj def _get_image_uri(self, song): """A unicode file URI or an empty string""" fileobj = app.cover_manager.get_cover(song) self._set_image_fileobj(fileobj) if fileobj: return fsn2uri(fileobj.name) return u"" def show_notification(self, song): """Returns True if showing the notification was successful""" if not song: return True try: if self.__enabled: # we are enabled try to work with the data we have and # keep it fresh if not self.__interface: iface, caps, spec = self.__get_interface() self.__interface = iface self.__caps = caps self.__spec_version = spec if "actions" in caps: self.__action_sig = iface.connect_to_signal( "ActionInvoked", self.on_dbus_action) else: iface = self.__interface caps = self.__caps spec = self.__spec_version else: # not enabled, just get everything temporary, # propably preview iface, caps, spec = self.__get_interface() except dbus.DBusException: print_w("[notify] %s" % _("Couldn't connect to notification daemon.")) self.__disconnect() return False strip_markup = lambda t: re.subn("\</?[iub]\>", "", t)[0] strip_links = lambda t: re.subn("\</?a.*?\>", "", t)[0] strip_images = lambda t: re.subn("\<img.*?\>", "", t)[0] title = XMLFromPattern(get_conf_value("titlepattern")) % song title = unescape(strip_markup(strip_links(strip_images(title)))) body = "" if "body" in caps: body = XMLFromPattern(get_conf_value("bodypattern")) % song if "body-markup" not in caps: body = strip_markup(body) if "body-hyperlinks" not in caps: body = strip_links(body) if "body-images" not in caps: body = strip_images(body) actions = [] if get_conf_bool("show_next_button") and "actions" in caps: actions = ["next", _("Next")] hints = { "desktop-entry": "quodlibet", } image_uri = self._get_image_uri(song) if image_uri: hints["image_path"] = image_uri hints["image-path"] = image_uri try: self.__last_id = iface.Notify( "Quod Libet", self.__last_id, image_uri, title, body, actions, hints, get_conf_int("timeout")) except dbus.DBusException: print_w("[notify] %s" % _("Couldn't connect to notification daemon.")) self.__disconnect() return False # preview done, remove all references again if not self.__enabled: self.__disconnect() return True def on_dbus_action(self, notify_id, key): if notify_id == self.__last_id and key == "next": # Always show a new notification if the next button got clicked self.__force_notification = True app.player.next() def on_song_change(self, song, typ): if not song: self.close_notification() if get_conf_value("show_notifications") in [typ, "all"] \ and not (get_conf_bool("show_only_when_unfocused") and app.window.has_toplevel_focus()) \ or self.__force_notification: def idle_show(song): self.show_notification(song) GLib.idle_add(idle_show, song) self.__force_notification = False def plugin_on_song_started(self, song): typ = (self.__was_stopped_by_user and "user") or "auto" self.on_song_change(song, typ) def plugin_on_song_ended(self, song, stopped): # if `stopped` is `True`, this song was ended due to some kind of user # interaction. self.__was_stopped_by_user = stopped ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mpris/���������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021161� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mpris/util.py��������������������������������������������������0000644�0001750�0001750�00000001001�13112005742�022502� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010,2012 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import dbus class MPRISObject(dbus.service.Object): def paused(self): pass def unpaused(self): pass def song_started(self, song): pass def song_ended(self, song, skipped): pass �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mpris/__init__.py����������������������������������������������0000644�0001750�0001750�00000006001�13112005742�023271� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010,2012 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import os import sys if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError from gi.repository import Gtk import dbus try: import indicate except ImportError: indicate = None from quodlibet import _ from quodlibet import app from quodlibet import config from quodlibet import qltk from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.qltk import Icons from quodlibet.plugins.events import EventPlugin from .mpris1 import MPRIS1Root, MPRIS1DummyTracklist, MPRIS1Player from .mpris2 import MPRIS2 class MPRIS(EventPlugin): PLUGIN_ID = "mpris" PLUGIN_NAME = _("MPRIS D-Bus Support") PLUGIN_DESC = _("Allows control of Quod Libet using the " "MPRIS 1.0/2.0 D-Bus Interface Specification.") PLUGIN_ICON = Icons.NETWORK_WORKGROUP def PluginPreferences(self, parent): box = Gtk.HBox() ccb = ConfigCheckButton(_("Hide main window on close"), 'plugins', 'mpris_window_hide') ccb.set_active(self.__do_hide()) box.pack_start(qltk.Frame(_("Preferences"), child=ccb), True, True, 0) return box def __do_hide(self): return config.getboolean('plugins', 'mpris_window_hide', False) def __window_delete(self, win, event): if self.__do_hide(): win.hide() return True def enabled(self): self.__sig = app.window.connect('delete-event', self.__window_delete) self.objects = [] for service in [MPRIS1Root, MPRIS1DummyTracklist, MPRIS1Player, MPRIS2]: try: self.objects.append(service()) except dbus.DBusException: pass # Needed for sound menu support in some older Ubuntu versions if indicate: self.__indicate_server = s = indicate.indicate_server_ref_default() s.set_type("music.quodlibet") s.set_desktop_file("/usr/share/applications/quodlibet.desktop") s.show() def disabled(self): if indicate: self.__indicate_server.hide() for obj in self.objects: obj.remove_from_connection() self.objects = [] import gc gc.collect() app.window.disconnect(self.__sig) def plugin_on_paused(self): for obj in self.objects: obj.paused() def plugin_on_unpaused(self): for obj in self.objects: obj.unpaused() def plugin_on_song_started(self, song): for obj in self.objects: obj.song_started(song) def plugin_on_song_ended(self, song, skipped): for obj in self.objects: obj.song_ended(song, skipped) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mpris/mpris1.py������������������������������������������������0000644�0001750�0001750�00000020121�13112005742�022744� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010,2012 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import time import dbus import dbus.service from quodlibet import app from quodlibet.util.dbusutils import dbus_unicode_validate as unival from quodlibet.compat import iteritems from .util import MPRISObject # http://xmms2.org/wiki/MPRIS class MPRIS1Root(MPRISObject): PATH = "/" BUS_NAME = "org.mpris.quodlibet" IFACE = "org.freedesktop.MediaPlayer" def __init__(self): bus = dbus.SessionBus() name = dbus.service.BusName(self.BUS_NAME, bus) super(MPRIS1Root, self).__init__(name, self.PATH) @dbus.service.method(IFACE, out_signature="s") def Identity(self): return app.name @dbus.service.method(IFACE) def Quit(self): app.quit() @dbus.service.method(IFACE, out_signature="(qq)") def MprisVersion(self): return (1, 0) class MPRIS1DummyTracklist(MPRISObject): PATH = "/TrackList" BUS_NAME = "org.mpris.quodlibet" IFACE = "org.freedesktop.MediaPlayer" def __init__(self): bus = dbus.SessionBus() name = dbus.service.BusName(self.BUS_NAME, bus) super(MPRIS1DummyTracklist, self).__init__(name, self.PATH) @dbus.service.method(IFACE, in_signature="i", out_signature="a{sv}") def GetMetadata(self, position): song = app.player.info if position != 0: song = None return MPRIS1Player._get_metadata(song) @dbus.service.method(IFACE, out_signature="i") def GetCurrentTrack(self): return 0 @dbus.service.method(IFACE, out_signature="i") def GetLength(self): return 0 @dbus.service.method(IFACE, in_signature="sb", out_signature="i") def AddTrack(self, uri, play): return -1 @dbus.service.method(IFACE, in_signature="b") def SetLoop(self, value): app.player_options.repeat = value @dbus.service.method(IFACE, in_signature="b") def SetRandom(self, value): app.player_options.shuffle = value class MPRIS1Player(MPRISObject): PATH = "/Player" BUS_NAME = "org.mpris.quodlibet" IFACE = "org.freedesktop.MediaPlayer" def __init__(self): bus = dbus.SessionBus() name = dbus.service.BusName(self.BUS_NAME, bus) super(MPRIS1Player, self).__init__(name, self.PATH) player_options = app.player_options self.__sigs = [ player_options.connect("notify::repeat", self.__update_status), player_options.connect("notify::single", self.__update_status), player_options.connect("notify::shuffle", self.__update_status), ] self.__lsig = app.librarian.connect( "changed", self.__update_track_changed) def remove_from_connection(self, *arg, **kwargs): super(MPRIS1Player, self).remove_from_connection(*arg, **kwargs) for id_ in self.__sigs: app.player_options.disconnect(id_) app.librarian.disconnect(self.__lsig) def paused(self): self.StatusChange(self.__get_status()) unpaused = paused def song_started(self, song): self.TrackChange(self._get_metadata(song)) def __update_track_changed(self, library, songs): if app.player.info in songs: self.TrackChange(self._get_metadata(app.player.info)) def __update_status(self, *args): self.StatusChange(self.__get_status()) @staticmethod def _get_metadata(song): #http://xmms2.org/wiki/MPRIS_Metadata#MPRIS_v1.0_Metadata_guidelines metadata = dbus.Dictionary(signature="sv") if not song: return metadata # Missing: "audio-samplerate", "video-bitrate" strings = {"location": "~uri", "title": "title", "artist": "artist", "album": "album", "tracknumber": "tracknumber", "genre": "genre", "comment": "comment", "asin": "asin", "puid fingerprint": "musicip_puid", "mb track id": "musicbrainz_trackid", "mb artist id": "musicbrainz_artistid", "mb artist sort name": "artistsort", "mb album id": "musicbrainz_albumid", "mb release date": "date", "mb album artist": "albumartist", "mb album artist id": "musicbrainz_albumartistid", "mb album artist sort name": "albumartistsort", } for key, tag in iteritems(strings): val = song.comma(tag) if val: metadata[key] = unival(val) nums = [("audio-bitrate", 1024, "~#bitrate"), ("rating", 5, "~#rating"), ("year", 1, "~#year"), ("time", 1, "~#length"), ("mtime", 1000, "~#length")] for target, mul, key in nums: value = song(key, None) if value is None: continue value = int(value * mul) # dbus uses python types to guess the dbus type without # checking maxint, also we need uint (dbus always trys int) try: value = dbus.UInt32(value) except OverflowError: continue metadata[target] = value year = song("~year") if year: try: tuple_time = time.strptime(year, "%Y") except ValueError: pass else: try: date = int(time.mktime(tuple_time)) date = dbus.UInt32(date) except (ValueError, OverflowError): pass else: metadata["date"] = date return metadata def __get_status(self): if app.player.info is not None: play = 0 if not app.player.paused else 1 else: play = 2 shuffle = app.player_options.shuffle repeat_one = app.player_options.single repeat_all = app.player_options.repeat return (play, shuffle, repeat_one, repeat_all) @dbus.service.method(IFACE) def Next(self): app.player.next() @dbus.service.method(IFACE) def Prev(self): app.player.previous() @dbus.service.method(IFACE) def Pause(self): if app.player.song is None: app.player.reset() else: app.player.paused ^= True @dbus.service.method(IFACE) def Stop(self): app.player.stop() @dbus.service.method(IFACE) def Play(self): player = app.player if player.song is None: player.reset() else: if player.paused: player.paused = False else: player.seek(0) @dbus.service.method(IFACE, in_signature="b") def Repeat(self, value): app.player_options.single = value @dbus.service.method(IFACE, out_signature="(iiii)") def GetStatus(self): return self.__get_status() @dbus.service.method(IFACE, out_signature="a{sv}") def GetMetadata(self): return self._get_metadata(app.player.info) @dbus.service.method(IFACE, out_signature="i") def GetCaps(self): # everything except Tracklist return (1 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4 | 1 << 5) @dbus.service.method(IFACE, in_signature="i") def VolumeSet(self, volume): app.player.volume = volume / 100.0 @dbus.service.method(IFACE, out_signature="i") def VolumeGet(self): return int(round(app.player.volume * 100)) @dbus.service.method(IFACE, in_signature="i") def PositionSet(self, position): app.player.seek(position) @dbus.service.method(IFACE, out_signature="i") def PositionGet(self): return int(app.player.get_position()) @dbus.service.signal(IFACE, signature="a{sv}") def TrackChange(self, metadata): pass @dbus.service.signal(IFACE, signature="(iiii)") def StatusChange(self, status): pass @dbus.service.signal(IFACE, signature="i") def CapsChange(self, status): pass �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mpris/mpris2.py������������������������������������������������0000644�0001750�0001750�00000031673�13112005742�022763� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010,2012 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import time import tempfile import dbus import dbus.service from senf import fsn2uri from quodlibet import app from quodlibet.util.dbusutils import DBusIntrospectable, DBusProperty from quodlibet.util.dbusutils import dbus_unicode_validate as unival from quodlibet.compat import iteritems, listmap from .util import MPRISObject # TODO: OpenUri, CanXYZ # Date parsing (util?) # http://www.mpris.org/2.0/spec/ class MPRIS2(DBusProperty, DBusIntrospectable, MPRISObject): BUS_NAME = "org.mpris.MediaPlayer2.quodlibet" PATH = "/org/mpris/MediaPlayer2" ROOT_IFACE = "org.mpris.MediaPlayer2" ROOT_ISPEC = """ <method name="Raise"/> <method name="Quit"/>""" ROOT_PROPS = """ <property name="CanQuit" type="b" access="read"/> <property name="CanRaise" type="b" access="read"/> <property name="CanSetFullscreen" type="b" access="read"/> <property name="HasTrackList" type="b" access="read"/> <property name="Identity" type="s" access="read"/> <property name="DesktopEntry" type="s" access="read"/> <property name="SupportedUriSchemes" type="as" access="read"/> <property name="SupportedMimeTypes" type="as" access="read"/>""" PLAYER_IFACE = "org.mpris.MediaPlayer2.Player" PLAYER_ISPEC = """ <method name="Next"/> <method name="Previous"/> <method name="Pause"/> <method name="PlayPause"/> <method name="Stop"/> <method name="Play"/> <method name="Seek"> <arg direction="in" name="Offset" type="x"/> </method> <method name="SetPosition"> <arg direction="in" name="TrackId" type="o"/> <arg direction="in" name="Position" type="x"/> </method> <method name="OpenUri"> <arg direction="in" name="Uri" type="s"/> </method> <signal name="Seeked"> <arg name="Position" type="x"/> </signal>""" PLAYER_PROPS = """ <property name="PlaybackStatus" type="s" access="read"/> <property name="LoopStatus" type="s" access="readwrite"/> <property name="Rate" type="d" access="readwrite"/> <property name="Shuffle" type="b" access="readwrite"/> <property name="Metadata" type="a{sv}" access="read"/> <property name="Volume" type="d" access="readwrite"/> <property name="Position" type="x" access="read"> <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" \ value="false"/> </property> <property name="MinimumRate" type="d" access="read"/> <property name="MaximumRate" type="d" access="read"/> <property name="CanGoNext" type="b" access="read"/> <property name="CanGoPrevious" type="b" access="read"/> <property name="CanPlay" type="b" access="read"/> <property name="CanPause" type="b" access="read"/> <property name="CanSeek" type="b" access="read"/> <property name="CanControl" type="b" access="read"> <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" \ value="false"/> </property>""" def __init__(self): DBusIntrospectable.__init__(self) DBusProperty.__init__(self) self.set_introspection(MPRIS2.ROOT_IFACE, MPRIS2.ROOT_ISPEC) self.set_properties(MPRIS2.ROOT_IFACE, MPRIS2.ROOT_PROPS) self.set_introspection(MPRIS2.PLAYER_IFACE, MPRIS2.PLAYER_ISPEC) self.set_properties(MPRIS2.PLAYER_IFACE, MPRIS2.PLAYER_PROPS) bus = dbus.SessionBus() name = dbus.service.BusName(self.BUS_NAME, bus) MPRISObject.__init__(self, bus, self.PATH, name) player_options = app.player_options self.__repeat_id = player_options.connect( "notify::repeat", self.__repeat_changed) self.__random_id = player_options.connect( "notify::shuffle", self.__shuffle_changed) self.__single_id = player_options.connect( "notify::single", self.__single_changed) self.__lsig = app.librarian.connect("changed", self.__library_changed) self.__vsig = app.player.connect("notify::volume", self.__volume_changed) self.__seek_sig = app.player.connect("seek", self.__seeked) def remove_from_connection(self, *arg, **kwargs): super(MPRIS2, self).remove_from_connection(*arg, **kwargs) self.__cover = None player_options = app.player_options player_options.disconnect(self.__repeat_id) player_options.disconnect(self.__random_id) player_options.disconnect(self.__single_id) app.librarian.disconnect(self.__lsig) app.player.disconnect(self.__vsig) app.player.disconnect(self.__seek_sig) def __volume_changed(self, *args): self.emit_properties_changed(self.PLAYER_IFACE, ["Volume"]) def __repeat_changed(self, *args): self.emit_properties_changed(self.PLAYER_IFACE, ["LoopStatus"]) def __shuffle_changed(self, *args): self.emit_properties_changed(self.PLAYER_IFACE, ["Shuffle"]) def __single_changed(self, *args): self.emit_properties_changed(self.PLAYER_IFACE, ["LoopStatus"]) def __seeked(self, player, song, ms): self.Seeked(ms * 1000) def __library_changed(self, library, songs): if not songs or app.player.info not in songs: return self.emit_properties_changed(self.PLAYER_IFACE, ["Metadata"]) @dbus.service.method(ROOT_IFACE) def Raise(self): app.present() @dbus.service.method(ROOT_IFACE) def Quit(self): app.quit() @dbus.service.signal(PLAYER_IFACE, signature="x") def Seeked(self, position): pass @dbus.service.method(PLAYER_IFACE) def Next(self): player = app.player paused = player.paused player.next() player.paused = paused @dbus.service.method(PLAYER_IFACE) def Previous(self): player = app.player paused = player.paused player.previous() player.paused = paused @dbus.service.method(PLAYER_IFACE) def Pause(self): app.player.paused = True @dbus.service.method(PLAYER_IFACE) def Play(self): if app.player.song is None: app.player.reset() else: app.player.paused = False @dbus.service.method(PLAYER_IFACE) def PlayPause(self): player = app.player if player.song is None: player.reset() else: player.paused ^= True @dbus.service.method(PLAYER_IFACE) def Stop(self): app.player.stop() @dbus.service.method(PLAYER_IFACE, in_signature="x") def Seek(self, offset): new_pos = app.player.get_position() + offset / 1000 app.player.seek(new_pos) @dbus.service.method(PLAYER_IFACE, in_signature="ox") def SetPosition(self, track_id, position): if track_id == self.__get_current_track_id(): app.player.seek(position / 1000) def paused(self): self.emit_properties_changed(self.PLAYER_IFACE, ["PlaybackStatus"]) unpaused = paused def song_started(self, song): # so the position in clients gets updated faster self.Seeked(0) self.emit_properties_changed(self.PLAYER_IFACE, ["PlaybackStatus", "Metadata"]) def __get_current_track_id(self): path = "/net/sacredchao/QuodLibet" if not app.player.info: return dbus.ObjectPath(path + "/" + "NoTrack") return dbus.ObjectPath(path + "/" + str(id(app.player.info))) def __get_metadata(self): """http://xmms2.org/wiki/MPRIS_Metadata""" metadata = {} metadata["mpris:trackid"] = self.__get_current_track_id() song = app.player.info if not song: return metadata metadata["mpris:length"] = dbus.Int64(song("~#length") * 10 ** 6) self.__cover = cover = app.cover_manager.get_cover(song) is_temp = False if cover: name = cover.name is_temp = name.startswith(tempfile.gettempdir()) # This doesn't work for embedded images.. the file gets unlinked # after loosing the file handle metadata["mpris:artUrl"] = fsn2uri(name) if not is_temp: self.__cover = None # All list values list_val = {"artist": "artist", "albumArtist": "albumartist", "comment": "comment", "composer": "composer", "genre": "genre", "lyricist": "lyricist"} for xesam, tag in iteritems(list_val): vals = song.list(tag) if vals: metadata["xesam:" + xesam] = listmap(unival, vals) # All single values sing_val = {"album": "album", "title": "title", "asText": "~lyrics"} for xesam, tag in iteritems(sing_val): vals = song.comma(tag) if vals: metadata["xesam:" + xesam] = unival(vals) # URI metadata["xesam:url"] = song("~uri") # Integers num_val = {"audioBPM": "bpm", "discNumber": "disc", "trackNumber": "track", "useCount": "playcount"} for xesam, tag in iteritems(num_val): val = song("~#" + tag, None) if val is not None: metadata["xesam:" + xesam] = int(val) # Rating metadata["xesam:userRating"] = float(song("~#rating")) # Dates ISO_8601_format = "%Y-%m-%dT%H:%M:%S" tuple_time = time.gmtime(song("~#lastplayed")) iso_time = time.strftime(ISO_8601_format, tuple_time) metadata["xesam:lastUsed"] = iso_time year = song("~year") if year: try: tuple_time = time.strptime(year, "%Y") iso_time = time.strftime(ISO_8601_format, tuple_time) except ValueError: pass else: metadata["xesam:contentCreated"] = iso_time return metadata def set_property(self, interface, name, value): player = app.player player_options = app.player_options if interface == self.PLAYER_IFACE: if name == "LoopStatus": if value == "Playlist": player_options.repeat = True player_options.single = False elif value == "Track": player_options.repeat = True player_options.single = True elif value == "None": player_options.repeat = False player_options.single = False elif name == "Rate": pass elif name == "Shuffle": player_options.shuffle = value elif name == "Volume": player.volume = value def get_property(self, interface, name): player = app.player player_options = app.player_options if interface == self.ROOT_IFACE: if name == "CanQuit": return True elif name == "CanRaise": return True elif name == "CanSetFullscreen": return False elif name == "HasTrackList": return False elif name == "Identity": return app.name elif name == "DesktopEntry": return "quodlibet" elif name == "SupportedUriSchemes": # TODO: enable once OpenUri is done can = lambda s: False #can = lambda s: app.player.can_play_uri("%s://fake" % s) schemes = ["http", "https", "ftp", "file", "mms"] return filter(can, schemes) elif name == "SupportedMimeTypes": from quodlibet import formats return formats.mimes elif interface == self.PLAYER_IFACE: if name == "PlaybackStatus": if not player.song: return "Stopped" return ("Playing", "Paused")[int(player.paused)] elif name == "LoopStatus": if not player_options.repeat: return "None" else: if player_options.single: return "Track" return "Playlist" elif name == "Rate": return 1.0 elif name == "Shuffle": return player_options.shuffle elif name == "Metadata": return self.__get_metadata() elif name == "Volume": return player.volume elif name == "Position": return player.get_position() * 1000 elif name == "MinimumRate": return 1.0 elif name == "MaximumRate": return 1.0 elif name == "CanGoNext": return True elif name == "CanGoPrevious": return True elif name == "CanPlay": return True elif name == "CanPause": return True elif name == "CanSeek": return True elif name == "CanControl": return True ���������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/radioadmute.py�������������������������������������������������0000644�0001750�0001750�00000004174�13112005742�022707� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011-2013 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import re from quodlibet import _ from quodlibet import app from quodlibet.qltk import Icons from quodlibet.util import re_escape from quodlibet.plugins.events import EventPlugin class RadioAdMute(EventPlugin): PLUGIN_ID = "radio_ad_mute" PLUGIN_NAME = _("Mute Radio Ads") PLUGIN_DESC = _("Mutes output while radio advertisements are playing.\n" "Stations: di.fm.") PLUGIN_ICON = Icons.AUDIO_VOLUME_MUTED SPAM = ["www.webex.co.uk", "di.fm/premium", "There's more to Digitally Imported!", "Digitally Imported AMTAG_60 ADWTAG_30000_START=0", "Digitally Imported TSTAG_60 ADWTAG", "PhotonVPS.com", "Get Digitally Imported Premium", "More of the show after these messages", "Choose premium for the best audio experience", "www.di.fm/jobs", ] RE_SPAM = ["Sponsored Message\s+\([0-9]+\)", ] SPAM = list(map(re_escape, SPAM)) + RE_SPAM SPAM = [re.compile(s, re.I) for s in SPAM] __old_volume = 0 __muted = False def disabled(self): self.plugin_on_song_ended() def plugin_on_song_started(self, song): # only check stream info songs if not song or not song.streamsong: return player = app.player data = song("~title~artist") for spam in self.SPAM: if spam.search(data): self.__old_volume = player.volume self.__muted = True player.volume = 0 break def plugin_on_song_ended(self, *args): if not self.__muted: return self.__muted = False player = app.player if player.volume != 0: # volume changed, do nothing return # restore old volume player.volume = self.__old_volume ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/language.py����������������������������������������������������0000644�0001750�0001750�00000005052�13112005742�022170� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Pango from quodlibet import _ from quodlibet import config from quodlibet.qltk import Icons from quodlibet.util.i18n import get_available_languages from quodlibet.util import iso639, escape from quodlibet.plugins.events import EventPlugin from quodlibet.qltk.models import ObjectStore class LanguagePreference(EventPlugin): PLUGIN_ID = "Change Language" PLUGIN_NAME = _("Change Language") PLUGIN_DESC = _("Change the user interface language.") PLUGIN_CAN_ENABLE = False PLUGIN_ICON = Icons.PREFERENCES_SYSTEM def PluginPreferences(self, *args): current = config.gettext("settings", "language") if not current: current = None combo = Gtk.ComboBox() model = ObjectStore() combo.set_model(model) for lang_id in ([None] + sorted(get_available_languages("quodlibet"))): iter_ = model.append(row=[lang_id]) if lang_id == current: combo.set_active_iter(iter_) def cell_func(combo, render, model, iter_, *args): value = model.get_value(iter_) if value is None: text = escape(_("System Default")) else: if value == u"C": value = u"en" text = "%s <span weight='light'>(%s)</span>" % ( escape(value), escape(iso639.translate(value.split("_", 1)[0]))) render.set_property("markup", text) render = Gtk.CellRendererText() render.props.ellipsize = Pango.EllipsizeMode.END combo.pack_start(render, True) combo.set_cell_data_func(render, cell_func) def on_combo_changed(combo): new_language = model.get_value(combo.get_active_iter()) if new_language is None: new_language = u"" config.settext("settings", "language", new_language) combo.connect("changed", on_combo_changed) box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12) box.pack_start(combo, False, False, 0) box.pack_start( Gtk.Label( label=_( "A restart is required for any changes to take effect"), wrap=True, xalign=0), False, False, 0) return box ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/viewlyrics.py��������������������������������������������������0000644�0001750�0001750�00000007230�13112005742�022605� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # # View Lyrics: a Quod Libet plugin for viewing lyrics. # Copyright (C) 2008, 2011, 2012 Vasiliy Faronov <vfaronov@gmail.com> # 2013, 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License version 2 # as published by the Free Software Foundation. from gi.repository import Gtk, Gdk from quodlibet import _ from quodlibet import app from quodlibet.plugins.events import EventPlugin from quodlibet.qltk import Icons class ViewLyrics(EventPlugin): """The plugin for viewing lyrics in the main window.""" PLUGIN_ID = 'View Lyrics' PLUGIN_NAME = _('View Lyrics') PLUGIN_DESC = _('Automatically displays lyrics ' 'beneath the song list in the main window.') PLUGIN_ICON = Icons.FORMAT_JUSTIFY_FILL def enabled(self): self.expander = Gtk.Expander(label=_("_Lyrics"), use_underline=True) self.expander.set_expanded(True) self.scrolled_window = Gtk.ScrolledWindow() self.scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.scrolled_window.set_size_request(-1, 200) self.adjustment = self.scrolled_window.get_vadjustment() self.textview = Gtk.TextView() self.textbuffer = self.textview.get_buffer() self.textview.set_editable(False) self.textview.set_cursor_visible(False) self.textview.set_wrap_mode(Gtk.WrapMode.WORD) self.textview.set_justification(Gtk.Justification.CENTER) self.textview.connect('key-press-event', self.key_press_event_cb) self.scrolled_window.add_with_viewport(self.textview) self.textview.show() self.expander.add(self.scrolled_window) self.scrolled_window.show() app.window.get_child().pack_start(self.expander, False, True, 0) # We don't show the expander here because it will be shown when a song # starts playing (see plugin_on_song_started). def disabled(self): self.textview.destroy() self.scrolled_window.destroy() self.expander.destroy() def plugin_on_song_started(self, song): """Called when a song is started. Loads the lyrics. If there are lyrics associated with `song`, load them into the lyrics viewer. Otherwise, hides the lyrics viewer. """ lyrics = None if song is not None: lyrics = song("~lyrics") if lyrics: self.textbuffer.set_text(lyrics) self.adjustment.set_value(0) # Scroll to the top. self.expander.show() if not lyrics: self.expander.hide() def key_press_event_cb(self, widget, event): """Handles up/down "key-press-event" in the lyrics view.""" adj = self.scrolled_window.get_vadjustment().props if event.keyval == Gdk.KEY_Up: adj.value = max(adj.value - adj.step_increment, adj.lower) elif event.keyval == Gdk.KEY_Down: adj.value = min(adj.value + adj.step_increment, adj.upper - adj.page_size) elif event.keyval == Gdk.KEY_Page_Up: adj.value = max(adj.value - adj.page_increment, adj.lower) elif event.keyval == Gdk.KEY_Page_Down: adj.value = min(adj.value + adj.page_increment, adj.upper - adj.page_size) elif event.keyval == Gdk.KEY_Home: adj.value = adj.lower elif event.keyval == Gdk.KEY_End: adj.value = adj.upper - adj.page_size else: return False return True ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/automask.py����������������������������������������������������0000644�0001750�0001750�00000003226�13112005742�022232� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2014 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gio from quodlibet import _ from quodlibet.qltk import Icons from quodlibet import app from quodlibet.plugins.events import EventPlugin class AutoMasking(EventPlugin): PLUGIN_ID = "automask" PLUGIN_NAME = _("Automatic Masking") PLUGIN_DESC = _("Automatically masks and unmasks drives when they " "are unmounted or mounted.") PLUGIN_ICON = Icons.DRIVE_REMOVABLE_MEDIA __sigs = None __monitor = None def enabled(self): if self.__monitor is None: self.__monitor = Gio.VolumeMonitor.get() self.__sigs = [ self.__monitor.connect('mount-added', self.__mounted), self.__monitor.connect('mount-removed', self.__unmounted), ] else: for signal_id in self.__sigs: self.__monitor.handler_unblock(signal_id) def disabled(self): for signal_id in self.__sigs: self.__monitor.handler_unblock(signal_id) def __mounted(self, monitor, mount): path = mount.get_default_location().get_path() if path is not None: app.library.unmask(os.path.normpath(path)) def __unmounted(self, monitor, mount): path = mount.get_default_location().get_path() if path is not None: app.library.mask(os.path.normpath(path)) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/randomalbum.py�������������������������������������������������0000644�0001750�0001750�00000022065�13112005742�022711� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005-2009 Joe Wreschnig, Steven Robertson # 2012,2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import random from gi.repository import Gtk, GLib from quodlibet import _ from quodlibet import app from quodlibet import config from quodlibet.plugins.events import EventPlugin from quodlibet import util from quodlibet.util import print_d try: from quodlibet.qltk import notif, Icons except Exception: notif = None class RandomAlbum(EventPlugin): PLUGIN_ID = 'Random Album Playback' PLUGIN_NAME = _('Random Album Playback') PLUGIN_DESC = _("Starts a random album when your playlist reaches its " "end. It requires that your active browser supports " "filtering by album.") PLUGIN_ICON = Icons.MEDIA_SKIP_FORWARD weights = {} use_weights = False # Not a dict because we want to impose a particular order # Third item is to specify a non-default aggregation function keys = [ ("rating", _("Rated higher"), None), ("playcount", _("Played more often"), 'avg'), ("skipcount", _("Skipped more often"), 'avg'), ("lastplayed", _("Played more recently"), None), ("laststarted", _("Started more recently"), None), ("added", _("Added more recently"), None), ("length", _("Longer albums"), None), ] def __init__(self): for (key, text, func) in self.keys: val = config.getfloat("plugins", "randomalbum_%s" % key, 0.0) self.weights[key] = val use = config.getint("plugins", "randomalbum_use_weights", 0) self.use_weights = use delay = config.getint("plugins", "randomalbum_delay", 0) self.delay = delay def PluginPreferences(self, song): def changed_cb(hscale, key): val = hscale.get_value() self.weights[key] = val config.set("plugins", "randomalbum_%s" % key, val) def delay_changed_cb(spin): self.delay = int(spin.get_value()) config.set("plugins", "randomalbum_delay", str(self.delay)) def toggled_cb(check, widgets): self.use_weights = check.get_active() for w in widgets: w.set_sensitive(self.use_weights) config.set("plugins", "randomalbum_use_weights", str(int(self.use_weights))) vbox = Gtk.VBox(spacing=12) table = Gtk.Table(n_rows=len(self.keys) + 1, n_columns=3) table.set_border_width(3) hbox = Gtk.HBox(spacing=6) spin = Gtk.SpinButton( adjustment=Gtk.Adjustment.new(self.delay, 0, 3600, 1, 10, 0)) spin.connect("value-changed", delay_changed_cb) hbox.pack_start(spin, False, True, 0) lbl = Gtk.Label(label=_("seconds before starting next album")) hbox.pack_start(lbl, False, True, 0) vbox.pack_start(hbox, True, True, 0) frame = Gtk.Frame(label=_("Weights")) check = Gtk.CheckButton(label=_("Play some albums more than others")) vbox.pack_start(check, False, True, 0) # Toggle both frame and contained table; frame doesn't always work? check.connect("toggled", toggled_cb, [frame, table]) check.set_active(self.use_weights) toggled_cb(check, [frame, table]) frame.add(table) vbox.pack_start(frame, True, True, 0) # Less label less_lbl = Gtk.Label() arr = Gtk.Arrow(arrow_type=Gtk.ArrowType.LEFT, shadow_type=Gtk.ShadowType.OUT) less_lbl.set_markup("<i>%s</i>" % util.escape(_("avoid"))) less_lbl.set_alignment(0, 0) hb = Gtk.HBox(spacing=0) hb.pack_start(arr, False, True, 0) hb.pack_start(less_lbl, True, True, 0) table.attach(hb, 1, 2, 0, 1, xpadding=3, xoptions=Gtk.AttachOptions.FILL) # More label more_lbl = Gtk.Label() arr = Gtk.Arrow(arrow_type=Gtk.ArrowType.RIGHT, shadow_type=Gtk.ShadowType.OUT) more_lbl.set_markup("<i>%s</i>" % util.escape(_("prefer"))) more_lbl.set_alignment(1, 0) hb = Gtk.HBox(spacing=0) hb.pack_end(arr, False, True, 0) hb.pack_end(more_lbl, True, True, 0) table.attach(hb, 2, 3, 0, 1, xpadding=3, xoptions=Gtk.AttachOptions.FILL) for (idx, (key, text, func)) in enumerate(self.keys): lbl = Gtk.Label(label=text) lbl.set_alignment(0, 0) table.attach(lbl, 0, 1, idx + 1, idx + 2, xoptions=Gtk.AttachOptions.FILL, xpadding=3, ypadding=3) adj = Gtk.Adjustment(lower=-1.0, upper=1.0, step_increment=0.1) hscale = Gtk.HScale(adjustment=adj) hscale.set_value(self.weights[key]) hscale.set_draw_value(False) hscale.set_show_fill_level(False) hscale.connect("value-changed", changed_cb, key) lbl.set_mnemonic_widget(hscale) table.attach(hscale, 1, 3, idx + 1, idx + 2, xpadding=3, ypadding=3) return vbox def _score(self, albums): """Score each album. Returns a list of (score, name) tuples.""" # Score the album based on its weighted rank ordering for each key # Rank ordering is more resistant to clustering than weighting # based on normalized means, and also normalizes the scale of each # weight slider in the prefs pane. ranked = {} for (tag, text, func) in self.keys: tag_key = ("~#%s:%s" % (tag, func) if func else "~#%s" % tag) ranked[tag] = sorted(albums, key=lambda al: al.get(tag_key)) scores = {} for album in albums: scores[album] = 0 for (tag, text, func) in self.keys: rank = ranked[tag].index(album) scores[album] += rank * self.weights[tag] return [(score, name) for name, score in scores.items()] def plugin_on_song_started(self, song): one_song = app.player_options.single if song is None and not one_song and not app.player.paused: browser = app.window.browser if self.disabled_for_browser(browser): return albumlib = app.library.albums albumlib.load() if browser.can_filter_albums(): keys = browser.list_albums() values = [albumlib[k] for k in keys] else: keys = set(browser.list("album")) values = [a for a in albumlib if a("album") in keys] if self.use_weights: # Select 3% of albums, or at least 3 albums nr_albums = int(min(len(values), max(0.03 * len(values), 3))) chosen_albums = random.sample(values, nr_albums) album_scores = sorted(self._score(chosen_albums)) for score, album in album_scores: print_d("%0.2f scored by %s" % (score, album("album"))) album = max(album_scores)[1] else: album = random.choice(values) if album is not None: self.schedule_change(album) def schedule_change(self, album): if self.delay: srcid = GLib.timeout_add(1000 * self.delay, self.change_album, album) if notif is None: return task = notif.Task(_("Random Album"), _("Waiting to start %s") % util.bold(util.escape(album("album"))), stop=lambda: GLib.source_remove(srcid)) def countdown(): for i in range(10 * self.delay): task.update(i / (10. * self.delay)) yield True task.finish() yield False GLib.timeout_add(100, countdown().next) else: self.change_album(album) def change_album(self, album): browser = app.window.browser if self.disabled_for_browser(browser): return if browser.can_filter_albums(): browser.filter_albums([album.key]) else: browser.filter('album', [album("album")]) GLib.idle_add(self.unpause) def unpause(self): # Wait for the next GTK loop to make sure everything's tidied up # after the song ended. Also, if this is program startup and the # previous current song wasn't found, we'll get this condition # as well, so just leave the player paused if that's the case. try: app.player.next() except AttributeError: app.player.paused = True def disabled_for_browser(self, browser): return not browser.can_filter_albums() or browser == "Playlists" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/iradiolog.py���������������������������������������������������0000644�0001750�0001750�00000002274�13112005742�022361� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet import app from quodlibet.plugins.events import EventPlugin from quodlibet.qltk import Icons class IRadioLog(EventPlugin): PLUGIN_ID = "Internet Radio Log" PLUGIN_NAME = _("Internet Radio Log") PLUGIN_DESC = _("Records the last 10 songs played on radio stations, " "and lists them in the seek context menu.") PLUGIN_ICON = Icons.EDIT def plugin_on_song_started(self, song): if song is None: return player = app.player if player.song.multisong and not song.multisong: time = player.get_position() title = song("title") bookmarks = player.song.bookmarks bookmarks.append([time // 1000, title]) try: bookmarks.pop(-10) except IndexError: pass player.song.bookmarks = bookmarks elif song.multisong: song.bookmarks = [] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/visualisations.py����������������������������������������������0000644�0001750�0001750�00000006300�13112005742�023457� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import signal from gi.repository import Gtk from quodlibet import _ from quodlibet import app from quodlibet import print_d from quodlibet import print_w from quodlibet.plugins import PluginConfig from quodlibet.plugins.events import EventPlugin from quodlibet.qltk import Button from quodlibet.qltk import ErrorMessage from quodlibet.qltk import Icons from quodlibet.qltk.entry import UndoEntry from quodlibet.util import escape class ProjectM(EventPlugin): """Launch external visualisations, e.g. via projectM Try this first (Ubuntu/Debian): sudo apt-get install projectm-pulseaudio """ _config = PluginConfig(__name__) PLUGIN_ID = "visualisations" PLUGIN_NAME = _("Launch Visualisations") PLUGIN_ICON = Icons.IMAGE_X_GENERIC PLUGIN_DESC = _("Launch external visualisations.") DEFAULT_EXEC = 'projectM-pulseaudio' def __init__(self): self._pid = None def enabled(self): from gi.repository import GLib print_d("Starting %s" % self.PLUGIN_NAME) try: self._pid, fdin, fdout, fderr = GLib.spawn_async( argv=self.executable.split(), flags=GLib.SpawnFlags.SEARCH_PATH, standard_output=True, standard_input=True) except GLib.Error as e: msg = ((_("Couldn't run visualisations using '%s'") + " (%s)") % (escape(self.executable), escape(e.message))) ErrorMessage(title=_("Error"), description=msg, parent=app.window).run() else: # self._stdin = os.fdopen(fdin, mode='w') print_d("Launched with PID: %s" % self._pid) def disabled(self): if not self._pid: return print_d("Shutting down %s" % self.PLUGIN_NAME) try: os.kill(self._pid, signal.SIGTERM) os.kill(self._pid, signal.SIGKILL) except Exception as e: print_w("Couldn't shut down cleanly (%s)" % e) def PluginPreferences(self, *args): vbox = Gtk.VBox(spacing=12) label = Gtk.Label(label=_("Visualiser executable:")) def edited(widget): self.executable = widget.get_text() entry = UndoEntry() entry.connect('changed', edited) entry.set_text(self.executable) hbox = Gtk.HBox(spacing=6) hbox.pack_start(label, False, False, 0) hbox.pack_start(entry, True, True, 0) vbox.pack_start(hbox, True, True, 0) def refresh_clicked(widget): self.disabled() self.enabled() refresh_button = Button(_("Reload"), Icons.VIEW_REFRESH) refresh_button.connect('clicked', refresh_clicked) vbox.pack_start(refresh_button, False, False, 0) return vbox @property def executable(self): return self._config.get('executable', self.DEFAULT_EXEC) @executable.setter def executable(self, value): self._config.set('executable', value) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/__init__.py����������������������������������������������������0000644�0001750�0001750�00000000317�13112005742�022143� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/waveformseekbar.py���������������������������������������������0000644�0001750�0001750�00000037705�13115014063�023601� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 0x1777 # 2016 Nick Boultbee # 2017 Didier Villevalois # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Gdk, Gst import cairo from math import ceil, floor from quodlibet import _, app from quodlibet import print_w from quodlibet.plugins import PluginConfig, IntConfProp, \ ConfProp from quodlibet.plugins.events import EventPlugin from quodlibet.qltk import Align from quodlibet.qltk import Icons from quodlibet.qltk.seekbutton import TimeLabel from quodlibet.qltk.tracker import TimeTracker from quodlibet.qltk import get_fg_highlight_color from quodlibet.util import connect_destroy, print_d class WaveformSeekBar(Gtk.Box): """A widget containing labels and the seekbar.""" def __init__(self, player, library): super(WaveformSeekBar, self).__init__() self._player = player self._rms_vals = [] self._elapsed_label = TimeLabel() self._remaining_label = TimeLabel() self._waveform_scale = WaveformScale(player) self.pack_start(Align(self._elapsed_label, border=6), False, True, 0) self.pack_start(self._waveform_scale, True, True, 0) self.pack_start(Align(self._remaining_label, border=6), False, True, 0) for child in self.get_children(): child.show_all() self._waveform_scale.connect('size-allocate', self._update_redraw_interval) self._label_tracker = TimeTracker(player) self._label_tracker.connect('tick', self._on_tick_label, player) self._redraw_tracker = TimeTracker(player) self._redraw_tracker.connect('tick', self._on_tick_waveform, player) connect_destroy(player, 'seek', self._on_player_seek) connect_destroy(player, 'song-started', self._on_song_started) connect_destroy(player, 'song-ended', self._on_song_ended) connect_destroy(player, 'notify::seekable', self._on_seekable_changed) connect_destroy(library, 'changed', self._on_song_changed, player) self.connect('destroy', self._on_destroy) self._update(player) if player.info: self._create_waveform(player.info, CONFIG.max_data_points) def _create_waveform(self, song, points): # Close any existing pipeline to avoid leaks self._clean_pipeline() command_template = """ filesrc name=fs ! decodebin ! audioconvert ! level name=audiolevel interval={} post-messages=true ! fakesink sync=false""" interval = int(song("~#length") * 1E9 / points) print_d("Computing data for each %.3f seconds" % (interval / 1E9)) command = command_template.format(interval) pipeline = Gst.parse_launch(command) pipeline.get_by_name("fs").set_property("location", song("~filename")) bus = pipeline.get_bus() self._bus_id = bus.connect("message", self._on_bus_message) bus.add_signal_watch() pipeline.set_state(Gst.State.PLAYING) self._pipeline = pipeline self._new_rms_vals = [] def _on_bus_message(self, bus, message): if message.type == Gst.MessageType.ERROR: error, debug = message.parse_error() print_d("Error received from element {name}: {error}".format( name=message.src.get_name(), error=error)) print_d("Debugging information: {}".format(debug)) elif message.type == Gst.MessageType.ELEMENT: structure = message.get_structure() if structure.get_name() == "level": rms_db = structure.get_value("rms") # Calculate average of all channels (usually 2) rms_db_avg = sum(rms_db) / len(rms_db) # Normalize dB value to value between 0 and 1 rms = pow(10, (rms_db_avg / 20)) self._new_rms_vals.append(rms) else: print_w("Got unexpected message of type {}" .format(message.type)) elif message.type == Gst.MessageType.EOS: self._clean_pipeline() # Update the waveform with the new data self._rms_vals = self._new_rms_vals self._waveform_scale.reset(self._rms_vals) self._waveform_scale.set_placeholder(False) self._update_redraw_interval() # Clear temporary reference to the waveform data del self._new_rms_vals def _clean_pipeline(self): if hasattr(self, "_pipeline") and self._pipeline: self._pipeline.set_state(Gst.State.NULL) if self._bus_id: bus = self._pipeline.get_bus() bus.remove_signal_watch() bus.disconnect(self._bus_id) self._bus_id = None if self._pipeline: self._pipeline = None def _update_redraw_interval(self, *args): if self._player.info and self.is_visible(): # Must be recomputed when size is changed interval = self._waveform_scale.compute_redraw_interval() self._redraw_tracker.set_interval(interval) def _on_destroy(self, *args): self._clean_pipeline() self._label_tracker.destroy() self._redraw_tracker.destroy() def _on_tick_label(self, tracker, player): self._update_label(player) def _on_tick_waveform(self, tracker, player): self._update_waveform(player) def _on_seekable_changed(self, player, *args): self._update_label(player) def _on_player_seek(self, player, song, ms): self._update(player) def _on_song_changed(self, library, songs, player): # Check that the currently playing song has changed if player.info and player.info in songs: # Trigger a re-computation of the waveform self._create_waveform(player.info, CONFIG.max_data_points) # Only update the label if some tag value changed self._update_label(player) def _on_song_started(self, player, song): if player.info: # Trigger a re-computation of the waveform self._create_waveform(player.info, CONFIG.max_data_points) self._waveform_scale.set_placeholder(True) self._update(player, True) def _on_song_ended(self, player, song, ended): self._update(player) def _update(self, player, full_redraw=False): self._update_label(player) self._update_waveform(player, full_redraw) def _update_label(self, player): if player.info: # Position in ms, length in seconds position = player.get_position() / 1000.0 length = player.info("~#length") remaining = length - position self._elapsed_label.set_time(position) self._remaining_label.set_time(remaining) self._elapsed_label.set_disabled(not player.seekable) self._remaining_label.set_disabled(not player.seekable) self.set_sensitive(player.seekable) else: self._remaining_label.set_disabled(True) self._elapsed_label.set_disabled(True) self.set_sensitive(False) def _update_waveform(self, player, full_redraw=False): if player.info: # Position in ms, length in seconds position = player.get_position() / 1000.0 length = player.info("~#length") if length != 0: self._waveform_scale.set_position(position / length) else: print_d("Length reported as zero for %s" % player.info) self._waveform_scale.set_position(0) if position == 0 or full_redraw: self._waveform_scale.queue_draw() else: (x, y, w, h) = self._waveform_scale.compute_redraw_area() self._waveform_scale.queue_draw_area(x, y, w, h) else: self._waveform_scale.set_placeholder(True) self._waveform_scale.queue_draw() class WaveformScale(Gtk.EventBox): """The waveform widget.""" _rms_vals = [] _player = None _placeholder = True def __init__(self, player): super(WaveformScale, self).__init__() self._player = player self.set_size_request(40, 40) self.position = 0 self._last_drawn_position = 0 self.override_background_color( Gtk.StateFlags.NORMAL, Gdk.RGBA(alpha=0)) @property def width(self): return self.get_allocation().width def set_placeholder(self, placeholder): self._placeholder = placeholder def reset(self, rms_vals): self._rms_vals = rms_vals self.queue_draw() def compute_redraw_interval(self): allocation = self.get_allocation() width = allocation.width scale_factor = self.get_scale_factor() pixel_ratio = float(scale_factor) # Compute the coarsest time interval for redraws length = self._player.info("~#length") return length * 1000 / max(width * pixel_ratio, 1) def compute_redraw_area(self): allocation = self.get_allocation() width = allocation.width height = allocation.height scale_factor = self.get_scale_factor() pixel_ratio = float(scale_factor) line_width = 1.0 / pixel_ratio # Compute the thinnest rectangle to redraw last_position_x = self._last_drawn_position * width position_x = self.position * width x = max(0.0, min(last_position_x, position_x) - line_width * 5) w = min(width, abs(position_x - last_position_x) + line_width * 10) return x, 0.0, w, height def draw_waveform(self, cr, width, height, elapsed_color, remaining_color): if width == 0 or height == 0: return scale_factor = self.get_scale_factor() pixel_ratio = float(scale_factor) line_width = 1.0 / pixel_ratio half_height = self.compute_half_height(height, pixel_ratio) value_count = len(self._rms_vals) max_value = max(self._rms_vals) ratio_width = value_count / (float(width) * pixel_ratio) ratio_height = max_value / half_height cr.set_line_width(line_width) cr.set_line_cap(cairo.LINE_CAP_ROUND) cr.set_line_join(cairo.LINE_JOIN_ROUND) position_width = self.position * width * pixel_ratio hw = line_width / 2.0 # Avoiding object lookups is slightly faster data = self._rms_vals # There can't be more than one clip rectangle, due to the draws queued # But handle the other case anyway rectangle_list = cr.copy_clip_rectangle_list() (cx, cy, cw, ch) = rectangle_list[0] if len(rectangle_list) > 1: for i in range(1, len(rectangle_list), 1): (ox, oy, ow, oh) = rectangle_list[i] (cx, cy, cw, ch) = \ (min(cx, ox), min(cy, oy), max(cw, ow), max(ch, oh)) # Use that clip rectangle to redraw only what is necessary for x in range(int(floor(cx * pixel_ratio)), int(ceil((cx + cw) * pixel_ratio)), 1): fg_color = (elapsed_color if x < position_width else remaining_color) cr.set_source_rgba(*list(fg_color)) # Basic anti-aliasing / oversampling u1 = max(0, int(floor((x - hw) * ratio_width))) u2 = min(int(ceil((x + hw) * ratio_width)), len(data)) val = (sum(data[u1:u2]) / (ratio_height * (u2 - u1)) if u1 != u2 else 0.0) hx = x / pixel_ratio + hw cr.move_to(hx, half_height - val) cr.line_to(hx, half_height + val) cr.stroke() self._last_drawn_position = self.position def draw_placeholder(self, cr, width, height, color): if width == 0 or height == 0: return scale_factor = self.get_scale_factor() pixel_ratio = float(scale_factor) line_width = 1.0 / pixel_ratio half_height = self.compute_half_height(height, pixel_ratio) hw = line_width / 2.0 cr.set_line_width(line_width) cr.set_line_cap(cairo.LINE_CAP_ROUND) cr.set_line_join(cairo.LINE_JOIN_ROUND) cr.set_source_rgba(*list(color)) cr.move_to(hw, half_height) cr.line_to(width - hw, half_height) cr.stroke() @staticmethod def compute_half_height(height, pixel_ratio): # Ensure half_height is in the middle of a pixel (c.f. Cairo's FAQ) height_px = int(height * pixel_ratio) half_height = \ (height_px if height_px % 2 else height_px - 1) / pixel_ratio / 2 return half_height def do_draw(self, cr): context = self.get_style_context() # Get colors context.save() context.set_state(Gtk.StateFlags.NORMAL) bg_color = context.get_background_color(context.get_state()) fg_color = context.get_color(context.get_state()) context.restore() elapsed_color = get_fg_highlight_color(self) # Check if the user set a different color in the config elapsed_color_config = CONFIG.elapsed_color if elapsed_color_config and Gdk.RGBA().parse(elapsed_color_config): elapsed_color = Gdk.RGBA() elapsed_color.parse(elapsed_color_config) # Paint the background cr.set_source_rgba(*list(bg_color)) cr.paint() allocation = self.get_allocation() width = allocation.width height = allocation.height if not self._placeholder and len(self._rms_vals) > 0: self.draw_waveform(cr, width, height, elapsed_color, fg_color) else: self.draw_placeholder(cr, width, height, fg_color) def do_button_press_event(self, event): # Left mouse button if event.button == 1 and self._player: ratio = event.x / self.get_allocation().width length = self._player.info("~#length") self._player.seek(ratio * length * 1000) return True def set_position(self, position): self.position = position class Config(object): _config = PluginConfig(__name__) elapsed_color = ConfProp(_config, "elapsed_color", "") max_data_points = IntConfProp(_config, "max_data_points", 3000) CONFIG = Config() class WaveformSeekBarPlugin(EventPlugin): """The plugin class.""" PLUGIN_ID = "WaveformSeekBar" PLUGIN_NAME = _("Waveform Seek Bar") PLUGIN_ICON = Icons.GO_JUMP PLUGIN_CONFIG_SECTION = __name__ PLUGIN_DESC = _( "A seekbar in the shape of the waveform of the current song.") def enabled(self): self._bar = WaveformSeekBar(app.player, app.librarian) self._bar.show() app.window.set_seekbar_widget(self._bar) def disabled(self): app.window.set_seekbar_widget(None) self._bar.destroy() del self._bar def PluginPreferences(self, parent): red = Gdk.RGBA() red.parse("#ff0000") def changed(entry): text = entry.get_text() if not Gdk.RGBA().parse(text): # Invalid color, make text red entry.override_color(Gtk.StateFlags.NORMAL, red) else: # Reset text color entry.override_color(Gtk.StateFlags.NORMAL, None) CONFIG.elapsed_color = text vbox = Gtk.VBox(spacing=6) def create_color(): hbox = Gtk.HBox(spacing=6) hbox.set_border_width(6) label = Gtk.Label(label=_("Override foreground color:")) hbox.pack_start(label, False, True, 0) entry = Gtk.Entry() if CONFIG.elapsed_color: entry.set_text(CONFIG.elapsed_color) entry.connect('changed', changed) hbox.pack_start(entry, True, True, 0) return hbox vbox.pack_start(create_color(), True, True, 0) return vbox �����������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/auto_library_update.py�����������������������������������������0000644�0001750�0001750�00000015377�13112005742�024456� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Automatic library update plugin # # (c) 2009 Joe Higton # 2011 - 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import operator import os import sys from quodlibet.qltk import Icons if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError try: from pyinotify import WatchManager, EventsCodes, ProcessEvent from pyinotify import Notifier, ThreadedNotifier except ImportError as e: from quodlibet import plugins raise plugins.MissingModulePluginException("pyinotify") from quodlibet import _ from quodlibet.util.dprint import print_d, print_w from quodlibet.plugins.events import EventPlugin from quodlibet.util.library import get_scan_dirs from quodlibet.compat import reduce from quodlibet import app from gi.repository import GLib class LibraryEvent(ProcessEvent): """pynotify event handler for library changes""" # Slightly dodgy state mechanism for updates _being_created = set() def my_init(self, library=None): self._library = library def process_default(self, event): print_d('Uncaught event for %s' % (event.maskname if event else "??")) def process_IN_CLOSE_WRITE(self, event): path = os.path.join(event.path, event.name) # No need to add files for modifications only if path in self._being_created: GLib.idle_add(self.add, event) self._being_created.remove(path) elif event.path in self._being_created: # The first file per new-directory gets missed for me (bug?) # TODO: so work out how/when to remove parent path properly GLib.idle_add(self.add, event) self._being_created.remove(event.path) else: print_d("Ignoring modification on %s" % path) def process_IN_MOVED_TO(self, event): self._log(event) GLib.idle_add(self.add, event) def process_IN_CREATE(self, event): if not event.dir: self._log(event) # Just remember that they've been created, will process later path = os.path.join(event.path, event.name) if os.path.exists(path): self._being_created.add(path) else: print_w("Couldn't find %s" % path) def process_IN_DELETE(self, event): self._log(event) if event.dir: try: del self._moved[event.pathname] except KeyError: pass GLib.idle_add(self.update, event) def process_IN_MOVED_FROM(self, event): self._log(event) GLib.idle_add(self.update, event) def _log(self, event): print_d('%s for "%s" on %s' % (event.maskname, event.name, event.path)) def add(self, event): """Add a library file / folder based on an incoming event""" lib = self._library path = os.path.join(event.path, event.name) if event.dir: print_d('Scanning directories...') songs = [] for path, dnames, fnames in os.walk(path): print_d('Found %d file(s) in "%s"' % (len(fnames), path)) for filename in (os.path.join(path, fn) for fn in fnames): song = lib.add_filename(filename, add=False) if song: songs.append(song) lib.add(songs) else: lib.add_filename(path) return False def update(self, event): """Update a library / file. Typically this means deleting it""" lib = self._library path = os.path.join(event.path, event.name) if event.dir: print_d('Checking directory %s...' % path) to_reload = [] for filename in lib._contents: if filename.startswith(path): item = lib.get(filename, None) if item: # Don't modify whilst iterating... to_reload.append(item) print_d('Reloading %d matching songs(s)' % len(to_reload)) for item in to_reload: lib.reload(item) else: item = lib.get(path, None) if item: lib.reload(item) return False class AutoLibraryUpdate(EventPlugin): PLUGIN_ID = "Automatic library update" PLUGIN_NAME = _("Automatic Library Update") PLUGIN_DESC = _("Keeps your library up to date with inotify. " "Requires %s.") % "pyinotify" PLUGIN_ICON = Icons.VIEW_REFRESH # TODO: make a config option USE_THREADS = True event_handler = None running = False def enabled(self): if not self.running: wm = WatchManager() self.event_handler = LibraryEvent(library=app.library) FLAGS = ['IN_DELETE', 'IN_CLOSE_WRITE', # 'IN_MODIFY', 'IN_MOVED_FROM', 'IN_MOVED_TO', 'IN_CREATE'] masks = [EventsCodes.FLAG_COLLECTIONS['OP_FLAGS'][s] for s in FLAGS] mask = reduce(operator.or_, masks, 0) if self.USE_THREADS: print_d("Using threaded notifier") self.notifier = ThreadedNotifier(wm, self.event_handler) # Daemonize to ensure thread dies on exit self.notifier.daemon = True self.notifier.start() else: self.notifier = Notifier(wm, self.event_handler, timeout=100) GLib.timeout_add(1000, self.unthreaded_callback) for path in get_scan_dirs(): real_path = os.path.realpath(path) print_d('Watching directory %s for %s (mask: %x)' % (real_path, FLAGS, mask)) # See https://github.com/seb-m/pyinotify/wiki/ # Frequently-Asked-Questions wm.add_watch(real_path, mask, rec=True, auto_add=True) self.running = True def unthreaded_callback(self): """Processes as much of the inotify events as allowed""" assert self.notifier._timeout is not None, \ 'Notifier must be constructed with a [short] timeout' self.notifier.process_events() # loop in case more events appear while we are processing while self.notifier.check_events(): self.notifier.read_events() self.notifier.process_events() return True # disable hook, stop the notifier: def disabled(self): if self.running: self.running = False if self.notifier: print_d("Stopping inotify watch...") self.notifier.stop() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/equalizer.py���������������������������������������������������0000644�0001750�0001750�00000020122�13112005742�022401� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010 Steven Robertson # 2012 Christoph Reiter # 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation # TODO: Include saving and loading. from gi.repository import Gtk, Gdk from quodlibet import _ from quodlibet import app from quodlibet import config from quodlibet.qltk import Button, Icons from quodlibet.plugins.events import EventPlugin from quodlibet.compat import iteritems # Presets (roughly) taken from Pulseaudio equalizer PRESET_BANDS = [50, 100, 156, 220, 311, 440, 622, 880, 1250, 1750, 2500, 3500, 5000, 10000, 20000] PRESETS = { "flat": (_("Flat"), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), "live": (_("Live"), [-9.0, -5.5, 0.0, 1.5, 2.0, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.0, 1.5, 2.0]), "full_bass_treble": (_("Full Bass & Treble"), [5.0, 5.0, 3.5, 2.5, 0.0, -7.0, -14.0, -10.0, -10.0, -8.0, 1.0, 1.0, 5.0, 7.5, 9.5]), "club": (_("Club"), [0.0, 0.0, 0.0, 0.0, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 2.5, 2.5, 0.0, 0.0]), "large_hall": (_("Large Hall"), [7.0, 7.0, 7.0, 3.5, 3.0, 3.0, 3.0, 1.5, 0.0, -2.0, -3.5, -6.0, -9.0, -1.0, 0.0]), "party": (_("Party"), [5.0, 5.0, 5.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.5, 5.0]), "rock": (_("Rock"), [5.5, 2.5, 2.5, -8.5, -10.5, -11.0, -16.0, -14.5, -6.5, -5.5, -3.0, 3.0, 6.5, 7.0, 7.0]), "soft": (_("Soft"), [3.0, 3.0, 1.0, 1.0, 0.0, -2.5, -5.0, 1.5, 0.0, 1.0, 3.0, 3.0, 6.0, 8.0, 8.0]), "full_bass": (_("Full Bass"), [-16.0, -16.0, 6.5, 6.5, 6.0, 5.5, 4.5, 1.0, 1.0, 1.0, -8.0, -10.0, -16.0, -16.0, -20.5]), "classical": (_("Classical"), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21.0, -21.0, -27.0]), "reggae": (_("Reggae"), [0.0, 0.0, 0.0, 0.0, 0.0, -4.5, -10.0, -6.0, 0.5, 1.0, 2.0, 4.0, 4.0, 0.0, 0.0]), "headphones": (_("Headphones"), [3.0, 3.0, 7.0, 7.0, 3.0, -1.0, -6.5, -6.0, -4.5, -4.0, 1.0, 1.0, 6.0, 8.0, 9.0]), "soft_rock": (_("Soft Rock"), [3.0, 3.0, 3.0, 1.5, 1.5, 1.5, 0.0, -3.5, -8.0, -7.0, -10, -9.0, -6.5, 1.5, 6.0]), "full_treble": (_("Full Treble"), [5.0, -18.5, -18.5, -18.5, -18.5, -10.0, -8.0, -6.5, 1.5, 1.5, 1.5, 8.5, 10.5, 10.5, 10.5]), "dance": (_("Dance"), [6.0, 4.0, 4.0, 1.5, 1.5, 1.5, 0.0, 0.0, 0.0, 1.0, -10.5, -14.0, -15.0, -7.0, 0.0]), "pop": (_("Pop"), [-3.5, 1.0, 2.0, 3.0, 5.0, 5.5, 6.5, 5.0, 3.0, 1.5, 0.0, -2.5, -5.0, -5.0, -3.0]), "techno": (_("Techno"), [5.0, 4.0, 4.0, 3.0, 0.0, -4.5, -10.0, -9.0, -8.0, -5.5, -1.5, 3.0, 6.0, 6.0, 6.0]), "ska": (_("Ska"), [-4.5, -8.0, -9.0, -8.5, -8.0, -6.0, 0.0, 1.5, 2.5, 2.5, 3.0, 3.0, 6.0, 6.0, 6.0]), "laptop": (_("Laptop"), [-1, -1, -1, -1, -5, -10, -18, -15, -10, -5, -5, -5, -5, 0, 0]), } def interp_bands(src_band, target_band, src_gain): """Linear interp from one band to another. All must be sorted.""" gain = [] for i, b in enumerate(target_band): if b in src_band: gain.append(src_gain[i]) continue idx = sorted(src_band + [b]).index(b) idx = min(max(idx, 1), len(src_band) - 1) x1, x2 = src_band[idx - 1:idx + 1] y1, y2 = src_gain[idx - 1:idx + 1] g = y1 + ((y2 - y1) * (b - x1)) / float(x2 - x1) gain.append(min(12.0, g)) return gain def get_config(): try: eq_levels_str = config.get('plugins', 'equalizer_levels') return [float(s) for s in eq_levels_str.split(',')] except (config.Error, ValueError): return [] class Equalizer(EventPlugin): PLUGIN_ID = "Equalizer" PLUGIN_NAME = _("Equalizer") PLUGIN_DESC = _("Controls the tone of your music with an equalizer.\n" "Click or use keys to customise levels " "(right-click resets the band).") PLUGIN_ICON = Icons.AUDIO_CARD @property def player_has_eq(self): return hasattr(app.player, 'eq_bands') and app.player.eq_bands def __init__(self): super(Equalizer, self).__init__() self._enabled = False def apply(self): if not self.player_has_eq: return levels = self._enabled and get_config() or [] lbands = len(app.player.eq_bands) app.player.eq_values = (levels[:min(len(levels), lbands)] + [0.] * max(0, (lbands - len(levels)))) def enabled(self): self._enabled = True self.apply() def disabled(self): self._enabled = False self.apply() def PluginPreferences(self, win): vb = Gtk.VBox(spacing=6) if not self.player_has_eq: l = Gtk.Label() l.set_markup( _('The current backend does not support equalization.')) vb.pack_start(l, False, True, 0) return vb def format_hertz(band): if band >= 1000: return _('%.1f kHz') % (band / 1000.) return _('%d Hz') % band bands = [format_hertz(band) for band in app.player.eq_bands] levels = get_config() + [0.] * len(bands) table = Gtk.Table(rows=len(bands), columns=3) table.set_col_spacings(6) def set_band(adj, idx): rounded = int(adj.get_value() * 2) / 2.0 adj.set_value(rounded) levels[idx] = rounded config.set('plugins', 'equalizer_levels', ','.join(str(lv) for lv in levels)) self.apply() adjustments = [] for i, band in enumerate(bands): # align numbers and suffixes in separate rows for great justice lbl = Gtk.Label(label=band.split()[0]) lbl.set_alignment(1, 0.5) lbl.set_padding(0, 4) table.attach(lbl, 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL) lbl = Gtk.Label(label=band.split()[1]) lbl.set_alignment(1, 0.5) table.attach(lbl, 1, 2, i, i + 1, xoptions=Gtk.AttachOptions.FILL) adj = Gtk.Adjustment(levels[i], -24., 12., 0.5, 3, 0) adj.connect('value-changed', set_band, i) adjustments.append(adj) hs = Gtk.HScale(adjustment=adj) hs.connect('button-press-event', self.__rightclick) hs.set_draw_value(True) hs.set_value_pos(Gtk.PositionType.RIGHT) hs.connect('format-value', lambda s, v: _('%.1f dB') % v) table.attach(hs, 2, 3, i, i + 1) vb.pack_start(table, True, True, 0) def clicked_cb(button): [adj.set_value(0) for adj in adjustments] sorted_presets = sorted(iteritems(PRESETS)) def combo_changed(combo): # custom, skip if not combo.get_active(): return gain = sorted_presets[combo.get_active() - 1][1][1] gain = interp_bands(PRESET_BANDS, app.player.eq_bands, gain) for (g, a) in zip(gain, adjustments): a.set_value(g) combo = Gtk.ComboBoxText() combo.append_text(_("Custom")) combo.set_active(0) for key, (name, gain) in sorted_presets: combo.append_text(name) combo.connect("changed", combo_changed) bbox = Gtk.HButtonBox() clear = Button(_("_Clear"), Icons.EDIT_CLEAR) clear.connect('clicked', clicked_cb) bbox.pack_start(combo, True, True, 0) bbox.pack_start(clear, True, True, 0) vb.pack_start(bbox, True, True, 0) return vb def __rightclick(self, hs, event): if event.button == Gdk.BUTTON_SECONDARY: hs.set_value(0) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/squeezebox_sync.py���������������������������������������������0000644�0001750�0001750�00000006073�13112005742�023637� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011-2014 Nick Boultbee # # Inspired in parts by PySqueezeCenter (c) 2010 JingleManSweep # SqueezeCenter and SqueezeBox are copyright Logitech # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from quodlibet import _ from quodlibet import qltk, app from quodlibet.ext._shared.squeezebox.base import SqueezeboxPluginMixin from quodlibet.util.dprint import print_d from quodlibet.qltk import Icons from quodlibet.plugins.events import EventPlugin if os.name == "nt": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError class SqueezeboxSyncPlugin(EventPlugin, SqueezeboxPluginMixin): PLUGIN_ID = 'Squeezebox Output' PLUGIN_NAME = _('Squeezebox Sync') PLUGIN_DESC = _("Makes Logitech Squeezebox mirror Quod Libet output, " "provided both read from an identical library.") PLUGIN_ICON = Icons.MEDIA_PLAYBACK_START server = None active = False _debug = False def __init__(self): super(EventPlugin, self).__init__() super(SqueezeboxPluginMixin, self).__init__() @classmethod def post_reconnect(cls): cls.server.stop() SqueezeboxPluginMixin.post_reconnect() player = app.player cls.plugin_on_song_started(player.info) cls.plugin_on_seek(player.info, player.get_position()) def enabled(self): print_d("Debug is set to %s" % self._debug) self.active = True self.init_server() self.server.pause() if not self.server.is_connected: qltk.ErrorMessage( None, _("Error finding Squeezebox server"), _("Error finding %s. Please check settings") % self.server.config ).run() def disabled(self): # Stopping might be annoying in some situations, but seems more correct if self.server: self.server.stop() self.active = False @classmethod def plugin_on_song_started(cls, song): # Yucky hack to allow some form of immediacy on re-configuration cls.server._debug = cls._debug = cls.config_get_bool("debug", False) if cls._debug: print_d("Paused" if app.player.paused else "Not paused") if song and cls.server and cls.server.is_connected: path = cls.get_sb_path(song) print_d("Requesting to play %s..." % path) if app.player.paused: cls.server.change_song(path) else: cls.server.playlist_play(path) @classmethod def plugin_on_paused(cls): if cls.server: cls.server.pause() @classmethod def plugin_on_unpaused(cls): if cls.server: cls.server.unpause() @classmethod def plugin_on_seek(cls, song, msec): if not app.player.paused: if cls.server: cls.server.seek_to(msec) cls.server.play() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/trayicon/������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021657� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/trayicon/prefs.py����������������������������������������������0000644�0001750�0001750�00000006777�13112005742�023373� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2006 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012 Christoph Reiter # 2013,2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet import app from quodlibet import qltk from quodlibet.qltk import Icons from quodlibet.pattern import Pattern from quodlibet.qltk.entry import UndoEntry from quodlibet.util import gdecode from .util import pconfig class Preferences(Gtk.VBox): """A small window to configure the tray icon's tooltip.""" def __init__(self): super(Preferences, self).__init__(spacing=12) self.set_border_width(6) ccb = pconfig.ConfigCheckButton(_("Hide main window on close"), 'window_hide', populate=True) self.pack_start(qltk.Frame(_("Behavior"), child=ccb), False, True, 0) def on_scroll_changed(button, new_state): if button.get_active(): pconfig.set("modifier_swap", new_state) modifier_swap = pconfig.getboolean("modifier_swap") scrollwheel_box = Gtk.VBox(spacing=0) group = Gtk.RadioButton( group=None, label=_("Scroll wheel adjusts volume"), use_underline=True) group.connect("toggled", on_scroll_changed, False) group.set_active(not modifier_swap) scrollwheel_box.pack_start(group, False, True, 0) group = Gtk.RadioButton( group=group, label=_("Scroll wheel changes song"), use_underline=True) group.connect("toggled", on_scroll_changed, True) group.set_active(modifier_swap) scrollwheel_box.pack_start(group, False, True, 0) self.pack_start(qltk.Frame(_("Scroll _Wheel"), child=scrollwheel_box), True, True, 0) box = Gtk.VBox(spacing=6) entry_box = Gtk.HBox(spacing=6) entry = UndoEntry() entry_box.pack_start(entry, True, True, 0) def on_reverted(*args): pconfig.reset("tooltip") entry.set_text(pconfig.gettext("tooltip")) revert = Gtk.Button() revert.add(Gtk.Image.new_from_icon_name( Icons.DOCUMENT_REVERT, Gtk.IconSize.BUTTON)) revert.connect("clicked", on_reverted) entry_box.pack_start(revert, False, True, 0) box.pack_start(entry_box, False, True, 0) preview = Gtk.Label() preview.set_line_wrap(True) preview_frame = Gtk.Frame(label=_("Preview")) vbox = Gtk.VBox(margin=18) vbox.pack_start(preview, False, False, 0) preview_frame.add(vbox) box.pack_start(preview_frame, False, True, 0) tt_frame = qltk.Frame(_("Tooltip Display"), child=box) tt_frame.get_label_widget().set_mnemonic_widget(entry) self.pack_start(tt_frame, True, True, 0) entry.connect('changed', self.__changed_entry, preview, preview_frame) entry.set_text(pconfig.gettext("tooltip")) for child in self.get_children(): child.show_all() def __changed_entry(self, entry, label, frame): text = gdecode(entry.get_text()) if app.player.info is None: text = _("Not playing") else: text = Pattern(text) % app.player.info label.set_text(text) frame.set_tooltip_text(text) pconfig.set("tooltip", entry.get_text()) �quodlibet-3.9.1/quodlibet/ext/events/trayicon/base.py�����������������������������������������������0000644�0001750�0001750�00000002045�13112005742�023146� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2006 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012 Christoph Reiter # 2013 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation class BaseIndicator(object): def remove(self): """Remove the indicator""" raise NotImplementedError def set_paused(self, value): """Update the paused state of the indicator""" pass def set_song(self, song): """Update the provided state of the indicator using the passed song or None if no song is active. """ pass def set_info_song(self, song): """Update the provided information of the indicator using the passed song or None if no song is active. """ pass def popup_menu(self): """Show the context menu as if the icon was pressed. Mainly for testing """ pass �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/trayicon/util.py�����������������������������������������������0000644�0001750�0001750�00000002064�13112005742�023212� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2006 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012 Christoph Reiter # 2013 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import config from quodlibet.plugins import PluginConfig DEFAULT_PATTERN = ("<album|<album~discnumber~part~tracknumber~title~version>|" "<artist~title~version>>") def _get_plugin_config(): # migrate option if config.has_option('plugins', 'trayicon_window_hide'): value = config.getboolean('plugins', 'trayicon_window_hide') config.remove_option('plugins', 'trayicon_window_hide') config.set('plugins', 'icon_window_hide', value) pconfig = PluginConfig("icon") pconfig.defaults.set("window_hide", True) pconfig.defaults.set("tooltip", DEFAULT_PATTERN) pconfig.defaults.set("modifier_swap", False) return pconfig pconfig = _get_plugin_config() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/trayicon/systemtray.py�����������������������������������������0000644�0001750�0001750�00000025233�13112005742�024464� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2006 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012 Christoph Reiter # 2013 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys from gi.repository import Gtk, Gdk, GdkPixbuf, GLib from quodlibet import _ from quodlibet import app from quodlibet import config from quodlibet import util from quodlibet.pattern import Pattern from quodlibet.qltk import Icons from quodlibet.util.thumbnails import scale from .base import BaseIndicator from .menu import IndicatorMenu from .util import pconfig def get_paused_pixbuf(boundary, diff): """Returns a pixbuf for a paused icon from the current theme. The returned pixbuf can have a size of size->size+diff size needs to be > 0 """ size = min(boundary) if size <= 0: raise ValueError("size has to be > 0") if diff < 0: raise ValueError("diff has to be >= 0") names = (Icons.MEDIA_PLAYBACK_PAUSE,) theme = Gtk.IconTheme.get_default() # Get the suggested icon info = theme.choose_icon(names, size, Gtk.IconLookupFlags.USE_BUILTIN) if not info: return try: pixbuf = info.load_icon() except GLib.GError: pass else: # In case it is too big, rescale pb_size = min(pixbuf.get_height(), pixbuf.get_width()) if abs(pb_size - size) > diff: return scale(pixbuf, boundary) return pixbuf def new_with_paused_emblem(icon_pixbuf): """Returns a new pixbuf with a pause emblem in the right bottom corner (success, new pixbuf) """ padding = 1.0 / 15.0 size = 5.0 / 8.0 base = icon_pixbuf.copy() w, h = base.get_width(), base.get_height() hpad = int(h * padding) wpad = int(w * padding) # get the sqare area where we can place the icon hn = int((w - wpad) * size) wn = int((h - hpad) * size) if hn <= 0 or wn <= 0: return False, base # get a pixbuf with roughly the size we want overlay = get_paused_pixbuf((hn, wn), min(hn, wn) / 5) if not overlay: return False, base wo, ho = overlay.get_width(), overlay.get_height() # we expect below that the icon fits into the icon including padding wo = min(w - wpad, wo) ho = min(h - hpad, ho) overlay.composite(base, w - wo - wpad, h - ho - hpad, wo, ho, w - wo - wpad, h - ho - hpad, 1.0, 1.0, GdkPixbuf.InterpType.BILINEAR, 255) return True, base class SystemTray(BaseIndicator): """A wrapper for Gtk.StatusIcon with some added features, workarounds for bugs etc.. """ def __init__(self): self.__size = -1 self.__pixbuf = None self.__pixbuf_paused = None self.__menu = None self._icon = Gtk.StatusIcon() self.__icon_theme = Gtk.IconTheme.get_default() self.__theme_sig = self.__icon_theme.connect('changed', self.__theme_changed) self._icon.connect('size-changed', self.__size_changed) self._icon.connect("notify::embedded", self.__embedded_changed) self.__embedded_changed(self._icon) self._icon.connect('popup-menu', self.__popup_menu) self._icon.connect('activate', self.__button_left) self._icon.connect('scroll-event', self.__scroll) self._icon.connect('button-press-event', self.__button_middle) self.__w_sig_del = app.window.connect('delete-event', self.__window_delete) # If after the main loop is idle and 3 seconds have passed # the tray icon isn't embedded, assume it wont be and unhide # all windows, so QL isn't 'lost'.. def add_timeout(): def check_embedded(): is_embedded = self._icon.is_embedded() main_window_shown = app.window.get_visible() if not is_embedded and not main_window_shown: app.present() self.__emb_sig = None return False self.__emb_sig = GLib.timeout_add(3000, check_embedded) return False self.__emb_sig = GLib.idle_add(add_timeout) def remove(self): """Hides the tray icon and frees all resources. Can only be called once. """ if self.__menu: self.__menu.destroy() self.__menu = None if self.__emb_sig: GLib.source_remove(self.__emb_sig) self.__emb_sig = None self.__icon_theme.disconnect(self.__theme_sig) self.__icon_theme = None app.window.disconnect(self.__w_sig_del) self._icon.set_visible(False) self._icon = None self.__show_window() def set_info_song(self, song): """Updates the tooltip based on the passed song""" if not self._icon: return if song: try: pattern = Pattern(pconfig.get("tooltip")) except ValueError: tooltip = u"" else: tooltip = pattern % song else: tooltip = _("Not playing") self._icon.set_tooltip_markup(util.escape(tooltip)) def set_paused(self, paused): """Update the icon base on the paused state""" self.__update_icon() def popup_menu(self): """Show the context menu as if the icon was pressed. Mainly for testing """ if not self._icon: return self.__popup_menu( self._icon, Gdk.BUTTON_SECONDARY, Gtk.get_current_event_time()) def __embedded_changed(self, icon, *args): if icon.get_property("embedded"): size = icon.get_size() self.__size_changed(icon, size) def __user_can_unhide(self): """Return if the user has the possibility to show the Window somehow""" if sys.platform == "darwin": return False # Either if it's embedded, or if we are waiting for the embedded check return bool(self._icon.is_embedded() or self.__emb_sig) def __update_icon(self): if self.__size <= 0: return if not self.__pixbuf: flags = 0 if sys.platform == "win32": flags = Gtk.IconLookupFlags.FORCE_SIZE try: self.__pixbuf = self.__icon_theme.load_icon( Icons.QUODLIBET, self.__size, flags) except GLib.GError: util.print_exc() return # We need to fill the whole height that is given to us, or # the KDE panel will emit size-changed until we reach 0 w, h = self.__pixbuf.get_width(), self.__pixbuf.get_height() if h < self.__size: bg = GdkPixbuf.Pixbuf.new( GdkPixbuf.Colorspace.RGB, True, 8, w, self.__size) bg.fill(0) self.__pixbuf.copy_area(0, 0, w, h, bg, 0, (self.__size - h) / 2) self.__pixbuf = bg if app.player.paused and not self.__pixbuf_paused: self.__pixbuf_paused = new_with_paused_emblem(self.__pixbuf)[1] if app.player.paused: new_pixbuf = self.__pixbuf_paused else: new_pixbuf = self.__pixbuf self._icon.set_from_pixbuf(new_pixbuf) def __theme_changed(self, theme, *args): self.__pixbuf = None self.__pixbuf_paused = None self.__update_icon() def __size_changed(self, icon, req_size, *args): # https://bugzilla.gnome.org/show_bug.cgi?id=733647 # Workaround: if size < 16, create a 16px pixbuf anyway and return that # we didn't set the right size size = max(req_size, 16) if size != self.__size: self.__pixbuf = None self.__pixbuf_paused = None self.__size = size self.__update_icon() return size == req_size and self.__pixbuf is not None def __window_delete(self, win, event): if self.__user_can_unhide() and pconfig.getboolean("window_hide"): self.__hide_window() return True return False def __hide_window(self): app.hide() def __show_window(self): app.present() def __button_left(self, icon): if self.__destroy_win32_menu(): return if app.window.get_property('visible'): self.__hide_window() else: self.__show_window() def __button_middle(self, widget, event, _last_timestamp=[0]): if event.type == Gdk.EventType.BUTTON_PRESS and \ event.button == Gdk.BUTTON_MIDDLE: if self.__destroy_win32_menu(): return # work around gnome shell (3.14) bug, it sends middle clicks twice # with the same timestamp, so ignore the second event if event.time == _last_timestamp[0]: return _last_timestamp[0] = event.time self.__play_pause() def __play_pause(self, *args): player = app.player if player.song: player.paused ^= True else: player.reset() def __scroll(self, widget, event): state = event.get_state() try: state ^= pconfig.getboolean("modifier_swap") except config.Error: pass DIR = Gdk.ScrollDirection if event.direction in [DIR.LEFT, DIR.RIGHT]: state = Gdk.ModifierType.SHIFT_MASK player = app.player if state & Gdk.ModifierType.SHIFT_MASK: if event.direction in [DIR.UP, DIR.LEFT]: player.previous() elif event.direction in [DIR.DOWN, DIR.RIGHT]: player.next() else: if event.direction in [DIR.UP, DIR.LEFT]: player.volume += 0.05 elif event.direction in [DIR.DOWN, DIR.RIGHT]: player.volume -= 0.05 def __destroy_win32_menu(self): """Returns True if current action should only hide the menu""" if sys.platform in ("win32", "darwin") and self.__menu: self.__menu.destroy() self.__menu = None return True def __popup_menu(self, icon, button, time): if self.__destroy_win32_menu(): return self.__menu = menu = IndicatorMenu(app) menu.set_paused(app.player.paused) menu.set_song(app.player.song) menu.show_all() if sys.platform in ("win32", "darwin"): pos_func = pos_arg = None else: pos_func = Gtk.StatusIcon.position_menu pos_arg = self._icon menu.popup(None, None, pos_func, pos_arg, button, time) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/trayicon/__init__.py�������������������������������������������0000644�0001750�0001750�00000004564�13112005742�024003� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2006 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012 Christoph Reiter # 2013 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet import app from quodlibet.plugins.events import EventPlugin from quodlibet.qltk import is_wayland, Icons from quodlibet.util import (is_unity, is_osx, is_plasma, is_enlightenment, print_exc, print_w, print_d) from .prefs import Preferences from .systemtray import SystemTray if is_osx(): # Works, but not without problems: # https://github.com/quodlibet/quodlibet/issues/1870 # The dock menu is more useful so disable. from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError def get_indicator_impl(): """Returns a BaseIndicator implementation depending on the environ""" use_app_indicator = (is_unity() or is_wayland() or is_plasma() or is_enlightenment()) print_d("use app indicator: %s" % use_app_indicator) if not use_app_indicator: return SystemTray else: try: from .appindicator import AppIndicator except ImportError: print_w("importing app indicator failed") print_exc() # no indicator, fall back return SystemTray else: return AppIndicator class TrayIconPlugin(EventPlugin): PLUGIN_ID = "Tray Icon" PLUGIN_NAME = _("Tray Icon") PLUGIN_DESC = _("Controls Quod Libet from the system tray.") PLUGIN_ICON = Icons.USER_DESKTOP def enabled(self): impl = get_indicator_impl() self._tray = impl() self._tray.set_song(app.player.song) self._tray.set_info_song(app.player.info) self._tray.set_paused(app.player.paused) def disabled(self): self._tray.remove() del self._tray def PluginPreferences(self, parent): return Preferences() def plugin_on_song_started(self, song): self._tray.set_song(app.player.song) self._tray.set_info_song(app.player.info) def plugin_on_paused(self): self._tray.set_paused(True) def plugin_on_unpaused(self): self._tray.set_paused(False) ��������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/trayicon/appindicator.py���������������������������������������0000644�0001750�0001750�00000007773�13112005742�024726� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2006 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012 Christoph Reiter # 2013 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import gi try: gi.require_version("AppIndicator3", "0.1") except ValueError as e: raise ImportError(e) from gi.repository import AppIndicator3, Gdk import quodlibet from quodlibet import _ from quodlibet import app from quodlibet.util import is_plasma from quodlibet.pattern import Pattern from quodlibet.compat import xrange from .base import BaseIndicator from .util import pconfig from .menu import IndicatorMenu def get_next_app_id(state=[0]): """Returns an ever increasing app id variant.. I can't find a way to remove an indicator, so just hide old ones and add new different ones this way. """ state[0] += 1 return "%s-%d" % (app.id, state[0]) class AppIndicator(BaseIndicator): def __init__(self): # KDE doesn't support symbolic icons afaics icon_name = app.icon_name if is_plasma() else app.symbolic_icon_name self.indicator = AppIndicator3.Indicator.new( get_next_app_id(), icon_name, AppIndicator3.IndicatorCategory.APPLICATION_STATUS) self.indicator.set_icon_theme_path(quodlibet.get_image_dir()) self.indicator.set_title(app.name) self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE) self.menu = IndicatorMenu(app, add_show_item=True) def on_action_item_changed(menu, indicator): indicator.set_secondary_activate_target(menu.get_action_item()) self.menu.connect("action-item-changed", on_action_item_changed, self.indicator) action_item = self.menu.get_action_item() self.indicator.set_secondary_activate_target(action_item) self.indicator.set_menu(self.menu) self.__scroll_id = self.indicator.connect( "scroll_event", self.__on_scroll) self.__w_sig_del = app.window.connect('delete-event', self.__window_delete) def set_info_song(self, song): if song: try: pattern = Pattern(pconfig.get("tooltip")) except ValueError: tooltip = u"" else: tooltip = pattern % song else: tooltip = _("Not playing") self.indicator.set_title(tooltip) def set_paused(self, value): self.menu.set_paused(value) def set_song(self, song): self.menu.set_song(song) def remove(self): # No function to remove an Indicator so it can be added back :( # If there is we can get rid of get_next_app_id() app.window.disconnect(self.__w_sig_del) self.indicator.disconnect(self.__scroll_id) self.__scroll_id = None self.indicator.set_status(AppIndicator3.IndicatorStatus.PASSIVE) self.indicator = None self.menu.destroy() self.menu = None def __on_scroll(self, indicator, steps, direction): # If direction here is always UP you're hitting # https://bugs.launchpad.net/indicator-application/+bug/1075152 modifier_swap = pconfig.getboolean("modifier_swap") for step in xrange(steps): if direction == Gdk.ScrollDirection.UP: if modifier_swap: app.player.previous() else: app.player.volume += 0.05 elif direction == Gdk.ScrollDirection.DOWN: if modifier_swap: app.player.next() else: app.player.volume -= 0.05 def __window_delete(self, win, event): if pconfig.getboolean("window_hide"): self.__hide_window() return True return False def __hide_window(self): app.hide() �����quodlibet-3.9.1/quodlibet/ext/events/trayicon/menu.py�����������������������������������������������0000644�0001750�0001750�00000016565�13114753460�023225� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2009 Joe Wreschnig, Michael Urman, Steven Robertson # 2011-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import GObject, Gtk from quodlibet.browsers.playlists import PlaylistsBrowser from quodlibet.browsers.playlists.menu import PlaylistMenu from quodlibet import _ from quodlibet import browsers from quodlibet import qltk from quodlibet.qltk.ratingsmenu import RatingsMenuItem from quodlibet.qltk.x import SeparatorMenuItem, MenuItem from quodlibet.util import connect_obj, connect_destroy, is_plasma from quodlibet.qltk import Icons from quodlibet.qltk.browser import LibraryBrowser from quodlibet.qltk.information import Information from quodlibet.qltk.properties import SongProperties class IndicatorMenu(Gtk.Menu): __gsignals__ = { 'action-item-changed': (GObject.SignalFlags.RUN_LAST, None, tuple()), } def __init__(self, app, add_show_item=False): super(IndicatorMenu, self).__init__() self._app = app player = app.player show_item_bottom = is_plasma() if add_show_item: show_item = Gtk.CheckMenuItem.new_with_mnemonic( _("_Show %(application-name)s") % { "application-name": app.name}) def on_toggled(menuitem): if menuitem.get_active(): app.present() else: app.hide() self._toggle_id = show_item.connect("toggled", on_toggled) def on_visible_changed(*args): with show_item.handler_block(self._toggle_id): show_item.set_active(app.window.get_visible()) connect_destroy(app.window, "notify::visible", on_visible_changed) else: show_item = None self._play_item = MenuItem(_("_Play"), Icons.MEDIA_PLAYBACK_START) self._play_item.connect("activate", self._on_play_pause, player) self._play_item.set_no_show_all(True) self._pause_item = MenuItem(_("P_ause"), Icons.MEDIA_PLAYBACK_PAUSE) self._pause_item.connect("activate", self._on_play_pause, player) self._pause_item.set_no_show_all(True) self._action_item = None previous = MenuItem(_("Pre_vious"), Icons.MEDIA_SKIP_BACKWARD) previous.connect('activate', lambda *args: player.previous(force=True)) next = MenuItem(_("_Next"), Icons.MEDIA_SKIP_FORWARD) next.connect('activate', lambda *args: player.next()) player_options = app.player_options shuffle = Gtk.CheckMenuItem(label=_("_Shuffle"), use_underline=True) player_options.bind_property("shuffle", shuffle, "active", GObject.BindingFlags.BIDIRECTIONAL) player_options.notify("shuffle") repeat = Gtk.CheckMenuItem(label=_("_Repeat"), use_underline=True) player_options.bind_property("repeat", repeat, "active", GObject.BindingFlags.BIDIRECTIONAL) player_options.notify("repeat") safter = Gtk.CheckMenuItem(label=_("Stop _After This Song"), use_underline=True) player_options.bind_property("stop-after", safter, "active", GObject.BindingFlags.BIDIRECTIONAL) player_options.notify("stop-after") browse = qltk.MenuItem(_("Open _Browser"), Icons.EDIT_FIND) browse_sub = Gtk.Menu() for Kind in browsers.browsers: i = Gtk.MenuItem(label=Kind.accelerated_name, use_underline=True) connect_obj(i, 'activate', LibraryBrowser.open, Kind, app.library, app.player) browse_sub.append(i) browse.set_submenu(browse_sub) self._props = qltk.MenuItem(_("Edit _Tags"), Icons.EDIT) def on_properties(*args): song = player.song window = SongProperties(app.librarian, [song]) window.show() self._props.connect('activate', on_properties) self._info = MenuItem(_("_Information"), Icons.DIALOG_INFORMATION) self._playlists_item = MenuItem(_("Play_lists"), Icons.FOLDER_DRAG_ACCEPT) self._new_playlist_submenu_for(player.song) def on_information(*args): song = player.song window = Information(app.librarian, [song]) window.show() self._info.connect('activate', on_information) def set_rating(value): song = player.song song["~#rating"] = value app.librarian.changed([song]) self._rating_item = rating = RatingsMenuItem([], app.library) quit = MenuItem(_("_Quit"), Icons.APPLICATION_EXIT) quit.connect('activate', lambda *x: app.quit()) if not show_item_bottom and show_item: self.append(show_item) self.append(SeparatorMenuItem()) self.append(self._play_item) self.append(self._pause_item) self.append(previous) self.append(next) self.append(SeparatorMenuItem()) self.append(shuffle) self.append(repeat) self.append(safter) self.append(SeparatorMenuItem()) self.append(rating) self.append(self._playlists_item) self.append(self._props) self.append(self._info) self.append(SeparatorMenuItem()) self.append(browse) self.append(SeparatorMenuItem()) self.append(quit) if show_item_bottom and show_item: self.append(SeparatorMenuItem()) self.append(show_item) self.show_all() self.set_paused(True) self.set_song(None) def get_action_item(self): """Returns the 'Play' or 'Pause' action menu item (used for unity). 'action-item-changed' gets emitted if this changes. """ return self._action_item def set_paused(self, paused): """Update the menu based on the player paused state""" self._play_item.set_visible(paused) self._pause_item.set_visible(not paused) self._action_item = self._play_item if paused else self._pause_item self.emit("action-item-changed") def set_song(self, song): """Update the menu based on the passed song. Can be None. This should be the persistent song and not a stream/info one. """ self._rating_item.set_sensitive(song is not None) self._info.set_sensitive(song is not None) self._props.set_sensitive(song is not None) self._rating_item.set_songs([song]) self._new_playlist_submenu_for(song) def _new_playlist_submenu_for(self, song): submenu = self._playlists_item.get_submenu() if submenu: submenu.destroy() playlist_menu = PlaylistMenu([song], PlaylistsBrowser.playlists()) def on_new(widget, playlist): PlaylistsBrowser.changed(playlist) playlist_menu.connect('new', on_new) self._playlists_item.set_submenu(playlist_menu) self._playlists_item.set_sensitive(bool(song) and song.can_add) self._playlists_item.show_all() def _on_play_pause(self, menuitem, player): if player.song: player.paused ^= True else: player.reset() �������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/gajim_status.py������������������������������������������������0000644�0001750�0001750�00000015322�13112005742�023100� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005-2006 Sergey Fedoseev <fedoseev.sergey@gmail.com> # Copyright 2007 Simon Morgan <zen84964@zen.co.uk> # 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import os import sys if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError from gi.repository import Gtk import dbus from quodlibet import _ from quodlibet.plugins.events import EventPlugin from quodlibet.pattern import Pattern from quodlibet.qltk import Frame, Icons from quodlibet import config # Translators: statuses relating to Instant Messenger apps _STATUSES = {'online': _('online'), 'offline': _('offline'), 'chat': _('chat'), 'away': _('away'), 'xa': _('xa'), 'invisible': _('invisible')} class GajimStatusMessage(EventPlugin): PLUGIN_ID = 'Gajim status message' PLUGIN_NAME = _('Gajim Status Message') PLUGIN_DESC = _("Changes Gajim status message according to what " "you are currently listening to.") PLUGIN_ICON = Icons.FACE_SMILE c_accounts = __name__ + '_accounts' c_paused = __name__ + '_paused' c_statuses = __name__ + '_statuses' c_pattern = __name__ + '_pattern' def __init__(self): try: self.accounts = config.get('plugins', self.c_accounts).split() except: self.accounts = [] config.set('plugins', self.c_accounts, '') try: self.paused = config.getboolean('plugins', self.c_paused) except: self.paused = True config.set('plugins', self.c_paused, 'True') try: self.statuses = config.get('plugins', self.c_statuses).split() except: self.statuses = ['online', 'chat'] config.set('plugins', self.c_statuses, " ".join(self.statuses)) try: self.pattern = config.get('plugins', self.c_pattern) except: self.pattern = '<artist> - <title>' config.set('plugins', self.c_pattern, self.pattern) def enabled(self): self.interface = None self.current = '' def disabled(self): if self.current != '': self.change_status(self.accounts, '') def change_status(self, enabled_accounts, status_message): if not self.interface: try: bus = dbus.SessionBus() obj = bus.get_object( 'org.gajim.dbus', '/org/gajim/dbus/RemoteObject') self.interface = dbus.Interface( obj, 'org.gajim.dbus.RemoteInterface') except dbus.DBusException: self.interface = None if self.interface: try: for account in self.interface.list_accounts(): status = self.interface.get_status(account) if enabled_accounts != [] and \ account not in enabled_accounts: continue if status in self.statuses: self.interface.change_status( status, status_message, account) except dbus.DBusException: self.interface = None def plugin_on_song_started(self, song): if song: self.current = Pattern(self.pattern) % song else: self.current = '' self.change_status(self.accounts, self.current) def plugin_on_paused(self): if self.paused and self.current != '': self.change_status(self.accounts, "%s [%s]" % (self.current, _("paused"))) def plugin_on_unpaused(self): self.change_status(self.accounts, self.current) def accounts_changed(self, entry): self.accounts = entry.get_text().split() config.set('plugins', self.c_accounts, entry.get_text()) def pattern_changed(self, entry): self.pattern = entry.get_text() config.set('plugins', self.c_pattern, self.pattern) def paused_changed(self, c): config.set('plugins', self.c_paused, str(c.get_active())) def statuses_changed(self, b): if b.get_active() and b.get_name() not in self.statuses: self.statuses.append(b.get_name()) elif b.get_active() is False and b.get_name() in self.statuses: self.statuses.remove(b.get_name()) config.set('plugins', self.c_statuses, " ".join(self.statuses)) def PluginPreferences(self, parent): vb = Gtk.VBox(spacing=6) pattern_box = Gtk.HBox(spacing=6) pattern_box.set_border_width(3) pattern = Gtk.Entry() pattern.set_text(self.pattern) pattern.connect('changed', self.pattern_changed) pattern_box.pack_start(Gtk.Label(label="Pattern:"), False, True, 0) pattern_box.pack_start(pattern, True, True, 0) accounts_box = Gtk.HBox(spacing=3) accounts_box.set_border_width(3) accounts = Gtk.Entry() accounts.set_text(" ".join(self.accounts)) accounts.connect('changed', self.accounts_changed) accounts.set_tooltip_text( _("List accounts, separated by spaces, for " "changing status message. If none are specified, " "status message of all accounts will be changed.")) accounts_box.pack_start(Gtk.Label(label="Accounts:"), False, True, 0) accounts_box.pack_start(accounts, True, True, 0) c = Gtk.CheckButton(label=_("Add '[paused]'")) c.set_active(self.paused) c.connect('toggled', self.paused_changed) c.set_tooltip_text(_("If checked, '[paused]' will be added to " "status message on pause.")) table = Gtk.Table() self.list = [] i = 0 j = 0 for status, translated in _STATUSES.items(): button = Gtk.CheckButton(label=translated) button.set_name(status) if status in self.statuses: button.set_active(True) button.connect('toggled', self.statuses_changed) self.list.append(button) table.attach(button, i, i + 1, j, j + 1) if i == 2: i = 0 j += 1 else: i += 1 vb.pack_start(pattern_box, True, True, 0) vb.pack_start(accounts_box, True, True, 0) vb.pack_start(c, True, True, 0) frame = Frame(label=_("Statuses for which message will be changed"), child=table) vb.pack_start(frame, True, True, 6) return vb ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/seekbar.py�����������������������������������������������������0000644�0001750�0001750�00000010411�13112005742�022014� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import contextlib from gi.repository import GObject, Gtk from quodlibet import _ from quodlibet import app from quodlibet.plugins.events import EventPlugin from quodlibet.qltk import Icons from quodlibet.qltk.seekbutton import TimeLabel from quodlibet.qltk.tracker import TimeTracker from quodlibet.qltk import Align from quodlibet.util import connect_destroy class SeekBar(Gtk.Box): def __init__(self, player, library): super(SeekBar, self).__init__() self._elapsed_label = TimeLabel() self._remaining_label = TimeLabel() scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL) scale.set_adjustment(Gtk.Adjustment.new(0, 0, 0, 3, -15, 0)) scale.set_draw_value(False) self._scale = scale self.pack_start(Align(self._elapsed_label, border=6), False, True, 0) self.pack_start(scale, True, True, 0) self.pack_start(Align(self._remaining_label, border=6), False, True, 0) for child in self.get_children(): child.show_all() self._id = self._scale.connect( 'value-changed', self._on_user_changed, player) self._scale.connect( 'value-changed', self._on_scale_value_changed, player) self._tracker = TimeTracker(player) self._tracker.connect('tick', self._on_tick, player) connect_destroy(player, 'seek', self._on_player_seek) connect_destroy(player, 'song-started', self._on_song_started) connect_destroy(player, "notify::seekable", self._on_seekable_changed) connect_destroy( library, "changed", self._on_song_changed, player) self.connect("destroy", self._on_destroy) with self._inhibit(): self._update(player) self._tracker.tick() def _on_destroy(self, *args): self._tracker.destroy() @contextlib.contextmanager def _inhibit(self): with GObject.signal_handler_block(self._scale, self._id): yield def _on_user_changed(self, scale, player): if player.seekable: player.seek(scale.get_value() * 1000) def _on_scale_value_changed(self, scale, player): self._update(player) def _on_tick(self, tracker, player): position = player.get_position() // 1000 with self._inhibit(): self._scale.set_value(position) def _on_seekable_changed(self, player, *args): with self._inhibit(): self._update(player) def _on_song_changed(self, library, songs, player): if player.info in songs: with self._inhibit(): self._update(player) def _on_player_seek(self, player, song, ms): with self._inhibit(): self._scale.set_value(ms // 1000) self._update(player) def _on_song_started(self, player, song): with self._inhibit(): self._scale.set_value(0) self._update(player) def _update(self, player): if player.info: self._scale.set_range(0, player.info("~#length")) else: self._scale.set_range(0, 1) if not player.seekable: self._scale.set_value(0) value = self._scale.get_value() max_ = self._scale.get_adjustment().get_upper() remaining = value - max_ self._elapsed_label.set_time(value) self._remaining_label.set_time(remaining) self._remaining_label.set_disabled(not player.seekable) self._elapsed_label.set_disabled(not player.seekable) self.set_sensitive(player.seekable) class SeekBarPlugin(EventPlugin): PLUGIN_ID = "SeekBar" PLUGIN_NAME = _("Alternative Seek Bar") PLUGIN_DESC = _("Alternative seek bar which is always visible and spans " "the whole window width.") PLUGIN_ICON = Icons.GO_JUMP def enabled(self): self._bar = SeekBar(app.player, app.librarian) self._bar.show() app.window.set_seekbar_widget(self._bar) def disabled(self): app.window.set_seekbar_widget(None) self._bar.destroy() del self._bar �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/searchprovider.py����������������������������������������������0000644�0001750�0001750�00000012617�13112005742�023432� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. """ For this plugin to work GNOME Shell needs this file: /usr/share/gnome-shell/search-providers/quodlibet-search-provider.ini with the following content: [Shell Search Provider] DesktopId=quodlibet.desktop BusName=net.sacredchao.QuodLibet.SearchProvider ObjectPath=/net/sacredchao/QuodLibet/SearchProvider Version=2 """ import os import sys if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError import dbus import dbus.service from quodlibet import _ from quodlibet import app from quodlibet.util.dbusutils import dbus_unicode_validate from quodlibet.plugins.events import EventPlugin from quodlibet.query import Query from quodlibet.plugins import PluginImportException from quodlibet.util.path import xdg_get_system_data_dirs from quodlibet.qltk import Icons def get_gs_provider_files(): """Return all installed search provider files for GNOME Shell""" ini_files = [] for d in xdg_get_system_data_dirs(): path = os.path.join(d, "gnome-shell", "search-providers") try: for entry in os.listdir(path): if entry.endswith(".ini"): ini_files.append(os.path.join(path, entry)) except EnvironmentError: pass return ini_files def check_ini_installed(): """Raise if no GNOME Shell ini file for Quod Libet is found""" quodlibet_installed = False for path in get_gs_provider_files(): try: with open(path, "rb") as handle: data = handle.read().decode("utf-8", "replace") if SearchProvider.BUS_NAME in data: quodlibet_installed = True break except EnvironmentError: pass if not quodlibet_installed: raise PluginImportException( _("No GNOME Shell search provider for " "Quod Libet installed.")) class GnomeSearchProvider(EventPlugin): PLUGIN_ID = "searchprovider" PLUGIN_NAME = _("GNOME Search Provider") PLUGIN_DESC = _("Allows GNOME Shell to search the library.") PLUGIN_ICON = Icons.SYSTEM_SEARCH def enabled(self): self.obj = SearchProvider() def disabled(self): self.obj.remove_from_connection() del self.obj import gc gc.collect() ENTRY_ICON = (". GThemedIcon audio-mpeg gnome-mime-audio-mpeg " "audio-x-generic") def get_song_id(song): return str(id(song)) def get_songs_for_ids(library, ids): songs = [] ids = set(ids) for song in library: song_id = get_song_id(song) if song_id in ids: songs.append(song) ids.discard(song_id) if not ids: break return songs class SearchProvider(dbus.service.Object): PATH = "/net/sacredchao/QuodLibet/SearchProvider" BUS_NAME = "net.sacredchao.QuodLibet.SearchProvider" IFACE = "org.gnome.Shell.SearchProvider2" def __init__(self): bus = dbus.SessionBus() name = dbus.service.BusName(self.BUS_NAME, bus) super(SearchProvider, self).__init__(name, self.PATH) @dbus.service.method(IFACE, in_signature="as", out_signature="as") def GetInitialResultSet(self, terms): if terms: query = Query("") for term in terms: query &= Query(term) songs = filter(query.search, app.library) else: songs = app.library.values() ids = [get_song_id(s) for s in songs] return ids @dbus.service.method(IFACE, in_signature="asas", out_signature="as") def GetSubsearchResultSet(self, previous_results, terms): query = Query("") for term in terms: query &= Query(term) songs = get_songs_for_ids(app.library, previous_results) ids = [get_song_id(s) for s in songs if query.search(s)] return ids @dbus.service.method(IFACE, in_signature="as", out_signature="aa{sv}") def GetResultMetas(self, identifiers): metas = [] for song in get_songs_for_ids(app.library, identifiers): name = song("title") description = song("~artist~title") song_id = get_song_id(song) meta = dbus.Dictionary({ "name": dbus_unicode_validate(name), "id": song_id, "description": dbus_unicode_validate(description), "gicon": ENTRY_ICON, }, signature="ss") metas.append(meta) return metas @dbus.service.method(IFACE, in_signature="sasu") def ActivateResult(self, identifier, terms, timestamp): songs = get_songs_for_ids(app.library, [identifier]) if not songs: return if app.player.go_to(songs[0], True): app.player.paused = False @dbus.service.method(IFACE, in_signature="asu") def LaunchSearch(self, terms, timestamp): try: app.window.browser.filter_text(" ".join(terms)) except NotImplementedError: pass else: app.present() # the plugin is useless without the ini file... check_ini_installed() �����������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mpdserver/�����������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022036� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mpdserver/tcpserver.py�����������������������������������������0000644�0001750�0001750�00000017071�13112005742�024435� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. """A reactive tcp server""" import socket import errno from gi.repository import Gio, GLib from quodlibet.qltk import io_add_watch class ServerError(Exception): pass class BaseTCPServer(object): def __init__(self, port, connection_class, debug=False): """port -- IP port connection_class -- BaseTCPConnection subclass """ self._connections = [] self._port = port self._connection_class = connection_class self._sock_service = None self._debug = debug def log(self, msg): """Override for logging""" pass def start(self): """Start accepting connections. May raise ServerError. """ assert not self._sock_service service = Gio.SocketService.new() try: service.add_inet_port(self._port, None) except GLib.GError as e: raise ServerError(e) except OverflowError as e: raise ServerError("port: %s" % e) self._id = service.connect("incoming", self._incoming_connection_cb) service.start() self._sock_service = service def stop(self): """Stop accepting connections and close all existing connections. Can be called multiple times. """ if not self._sock_service: return self._sock_service.disconnect(self._id) if self._sock_service.is_active(): self._sock_service.stop() self._sock_service = None for conn in list(self._connections): conn.close() assert not self._connections, self._connections def handle_init(self): """Gets called if a new connection starts and there was none before""" pass def handle_idle(self): """Gets called once the last connection closes""" pass def _remove_connection(self, conn): """Called by the connection class on close""" self._connections.remove(conn) del conn._gio_connection if not self._connections: self.handle_idle() def _incoming_connection_cb(self, service, connection, *args): try: addr = connection.get_remote_address() except GLib.GError: addr_string = "?.?.?.?" else: addr_string = addr.get_address().to_string() fd = connection.get_socket().get_fd() sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM) sock.setblocking(0) msg = "New connection from %s at socket %d" % ( addr_string, sock.fileno()) if self._debug: self.log(msg) if not self._connections: self.handle_init() tcp_conn = self._connection_class(self, sock) self._connections.append(tcp_conn) # XXX: set unneeded `connection` to keep the reference tcp_conn._gio_connection = connection tcp_conn.handle_init(self) class BaseTCPConnection(object): """Abstract base class for TCP connections. Subclasses need to implement the handle_*() can_*() methods. """ def __init__(self, server, sock): self._server = server self._sock = sock self._in_id = None self._out_id = None self._closed = False @property def name(self): return str(self._sock.fileno()) def start_read(self): """Start to read and call handle_read() if data is available. Only call once. """ assert self._in_id is None and not self._closed def can_read_cb(sock, flags, *args): if flags & (GLib.IOCondition.HUP | GLib.IOCondition.ERR): self.close() return False if flags & GLib.IOCondition.IN: while True: try: data = sock.recv(4096) except (IOError, OSError) as e: if e.errno in (errno.EWOULDBLOCK, errno.EAGAIN): return True elif e.errno == errno.EINTR: continue else: self.close() return False break if not data: self.close() return False self.handle_read(data) # the implementation could close in handle_read() if not self._closed: self.start_write() return True self._in_id = io_add_watch( self._sock, GLib.PRIORITY_DEFAULT, GLib.IOCondition.IN | GLib.IOCondition.ERR | GLib.IOCondition.HUP, can_read_cb) def start_write(self): """Trigger at least one call to handle_write() if can_write is True. Used to start writing to a client not triggered by a client request. """ assert not self._closed write_buffer = bytearray() def can_write_cb(sock, flags, *args): if flags & (GLib.IOCondition.HUP | GLib.IOCondition.ERR): self.close() return False if flags & GLib.IOCondition.OUT: if self.can_write(): write_buffer.extend(self.handle_write()) if not write_buffer: self._out_id = None return False while True: try: result = sock.send(write_buffer) except (IOError, OSError) as e: if e.errno in (errno.EWOULDBLOCK, errno.EAGAIN): return True elif e.errno == errno.EINTR: continue else: self.close() return False break del write_buffer[:result] return True if self._out_id is None: self._out_id = io_add_watch( self._sock, GLib.PRIORITY_DEFAULT, GLib.IOCondition.OUT | GLib.IOCondition.ERR | GLib.IOCondition.HUP, can_write_cb) def close(self): """Close this connection. Can be called multiple times. handle_close() will be called last. """ if self._closed: return self._closed = True if self._in_id is not None: GLib.source_remove(self._in_id) self._in_id = None if self._out_id is not None: GLib.source_remove(self._out_id) self._out_id = None self.handle_close() self._server._remove_connection(self) self._sock.close() def handle_init(self, server): """Called first, gets passed the BaseServer instance""" raise NotImplementedError def handle_read(self, data): """Called if new data was read""" raise NotImplementedError def handle_write(self): """Called if new data can be written, should return the data""" raise NotImplementedError def can_write(self): """Should return True if handle_write() can return data""" raise NotImplementedError def handle_close(self): """Called last when the connection gets closed""" raise NotImplementedError �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mpdserver/__init__.py������������������������������������������0000644�0001750�0001750�00000014103�13112005742�024150� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import os if os.name == "nt": from quodlibet.plugins import PluginNotSupportedError # we are missing socket.fromfd on Windows raise PluginNotSupportedError import socket from gi.repository import Gtk from quodlibet import _ from quodlibet.plugins import PluginConfigMixin from quodlibet.plugins.events import EventPlugin from quodlibet import app from quodlibet import qltk from quodlibet import config from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk import Icons from quodlibet.util import print_w, print_d from quodlibet.util.thread import call_async, Cancellable from .main import MPDServer from .tcpserver import ServerError from .avahi import AvahiService, AvahiError def fetch_local_ip(): """Returns a guess for the local IP""" try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) addr = s.getsockname()[0] s.close() except EnvironmentError: addr = "?.?.?.?" return addr DEFAULT_PORT = 6600 def get_port_num(): return config.getint("plugins", "mpdserver_port", DEFAULT_PORT) def set_port_num(value): return config.set("plugins", "mpdserver_port", str(value)) class MPDServerPlugin(EventPlugin, PluginConfigMixin): PLUGIN_ID = "mpd_server" PLUGIN_NAME = _("MPD Server") PLUGIN_DESC = _("Allows remote control of Quod Libet using an MPD Client. " "Streaming, playlist and library management " "are not supported.") PLUGIN_ICON = Icons.NETWORK_WORKGROUP CONFIG_SECTION = "mpdserver" _server = None def PluginPreferences(self, parent): table = Gtk.Table(n_rows=3, n_columns=3) table.set_col_spacings(6) table.set_row_spacings(6) label = Gtk.Label(label=_("_Port:"), use_underline=True) label.set_alignment(0.0, 0.5) table.attach(label, 0, 1, 1, 2, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) entry = UndoEntry() entry.set_text(str(get_port_num())) def validate_port(entry, text, *args): try: int(text) except ValueError: entry.stop_emission("insert-text") entry.connect("insert-text", validate_port) def port_activate(entry, *args): try: port_num = int(entry.get_text()) except ValueError as e: print_w(e) else: if get_port_num() != port_num: set_port_num(port_num) self._refresh() entry.connect_after("activate", port_activate) entry.connect_after("focus-out-event", port_activate) table.attach(entry, 1, 2, 1, 2) port_revert = Gtk.Button() port_revert.add(Gtk.Image.new_from_icon_name( Icons.DOCUMENT_REVERT, Gtk.IconSize.MENU)) def port_revert_cb(button, entry): entry.set_text(str(DEFAULT_PORT)) entry.emit("activate") port_revert.connect("clicked", port_revert_cb, entry) table.attach( port_revert, 2, 3, 1, 2, xoptions=Gtk.AttachOptions.SHRINK) label = Gtk.Label(label=_("Local _IP:"), use_underline=True) label.set_alignment(0.0, 0.5) table.attach(label, 0, 1, 0, 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) label = Gtk.Label(label=_("P_assword:"), use_underline=True) label.set_alignment(0.0, 0.5) table.attach(label, 0, 1, 2, 3, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) entry = UndoEntry() entry.set_text(self.config_get("password")) entry.connect('changed', self.config_entry_changed, "password") table.attach(entry, 1, 3, 2, 3) label = Gtk.Label() label.set_padding(6, 6) label.set_alignment(0.0, 0.5) label.set_selectable(True) label.set_label("...") table.attach(label, 1, 3, 0, 1) cancel = Cancellable() label.connect("destroy", lambda *x: cancel.cancel()) call_async(fetch_local_ip, cancel, label.set_label) box = Gtk.VBox(spacing=12) clients = Gtk.Label() clients.set_padding(6, 6) clients.set_markup(u"""\ \u2022 <a href="https://play.google.com/store/apps/details?id=com.\ namelessdev.mpdroid">MPDroid</a> (Android) \u2022 <a href="https://play.google.com/store/apps/details?id=org.\ gateshipone.malp">M.A.L.P.</a> (Android) """) clients.set_alignment(0, 0) box.pack_start( qltk.Frame(_("Connection"), child=table), False, True, 0) box.pack_start( qltk.Frame(_("Tested Clients"), child=clients), True, True, 0) return box def _refresh(self): # only restart if it was running if self._server: self._disable_server() self._enable_server() self._update_avahi() def _enable_server(self): port_num = get_port_num() print_d("Starting MPD server on port %d" % port_num) self._server = MPDServer(app, self, port_num) try: self._server.start() except ServerError as e: print_w(e) def _disable_server(self): print_d("Stopping MPD server") self._server.stop() self._server = None def _update_avahi(self): assert self._avahi port_num = get_port_num() try: self._avahi.register(app.name, port_num, "_mpd._tcp") except AvahiError as e: print_w(e) def enabled(self): self._enable_server() self._avahi = AvahiService() self._update_avahi() def disabled(self): self._avahi.unregister() self._avahi = None self._disable_server() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mpdserver/avahi.py���������������������������������������������0000644�0001750�0001750�00000016367�13112005742�023517� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from contextlib import contextmanager try: import dbus except ImportError: dbus = None from quodlibet.util import print_d def alternative_service_name(name): if "#" in name: name, num = name.rsplit("#", 1) num = int(num) else: num = 1 return "%s#%d" % (name, num + 1) class AvahiPublishFlags(object): NONE = 0 UNIQUE = 1 << 0 NO_PROBE = 1 << 1 NO_ANNOUNCE = 1 << 2 ALLOW_MULTIPLE = 1 << 3 NO_REVERSE = 1 << 4 NO_COOKIE = 1 << 5 UPDATE = 1 << 6 USE_WIDE_AREA = 1 << 7 USE_MULTICAST = 1 << 8 class AvahiEntryGroupState(object): UNCOMMITED = 0 REGISTERING = 1 ESTABLISHED = 2 COLLISION = 3 FAILURE = 4 class AvahiServerState(object): INVALID = 0 REGISTERING = 1 RUNNING = 2 COLLISION = 3 FAILURE = 4 class AvahiProtocol(object): INET = 0 INET6 = 1 UNSPEC = -1 AVAHI_IF_UNSPEC = -1 class AvahiError(Exception): pass @contextmanager def ignored(*exceptions): try: yield except exceptions: pass class AvahiService(object): """Register a single network service using zeroconf/avahi service = AvahiService() service.register("foo", 4242, "_mpd._tcp") service.register("foo", 2424, "_mpd._tcp") service.unregister() http://avahi.org/download/doxygen/ """ DBUS_NAME = "org.freedesktop.Avahi" DBUS_PATH_SERVER = "/" DBUS_INTERFACE_ENTRY_GROUP = "org.freedesktop.Avahi.EntryGroup" DBUS_INTERFACE_SERVER = "org.freedesktop.Avahi.Server" def register(self, name, port, stype): """Register the service with avahi. Can be called multiple times and will update the service entry each time. In case Avahi isn't running or ready, the service will be registered when it is ready. Can raise AvahiError """ if not dbus: raise AvahiError("no dbus bindings") try: dbus.UInt16(port) except OverflowError as e: raise AvahiError(e) self.name = name self._real_name = name self.port = port self.stype = stype try: bus = dbus.SystemBus() if not self._watch: self._watch = bus.watch_name_owner( self.DBUS_NAME, self._owner_changed) else: self._try_update_service() except dbus.DBusException as e: raise AvahiError(e) def unregister(self): """Unregister the service. Can be called multiple times. In case you want to update, call register() with new data instead. Will not raise. """ if self._watch: with ignored(dbus.DBusException): self._watch.cancel() self._watch = None self._remove_server() def __init__(self): self.name = None self.stype = None self.port = None self._group = None self._group_id = None self._server_id = None self._watch = None self._real_name = None self._last_server_state = None def _group_state_change(self, state, *args): if state == AvahiEntryGroupState.COLLISION: self._real_name = alternative_service_name(self._real_name) self._try_update_service() def _add_service(self): assert not self._group assert not self._group_id try: bus = dbus.SystemBus() server_obj = bus.get_object(self.DBUS_NAME, self.DBUS_PATH_SERVER) server = dbus.Interface(server_obj, self.DBUS_INTERFACE_SERVER) group_path = server.EntryGroupNew() group_obj = bus.get_object(self.DBUS_NAME, group_path) group = dbus.Interface(group_obj, self.DBUS_INTERFACE_ENTRY_GROUP) self._group_id = group.connect_to_signal( "StateChanged", self._group_state_change) flags = AvahiPublishFlags.NONE print_d("name=%s, flags=%x, stype=%s, port=%d" % ( self._real_name, flags, self.stype, self.port)) group.AddService( AVAHI_IF_UNSPEC, AvahiProtocol.UNSPEC, dbus.UInt32(flags), self._real_name, self.stype, dbus.String(), dbus.String(), dbus.UInt16(self.port), []) group.Commit() self._group = group except dbus.DBusException: self._remove_service() def _try_update_service(self): if not self._group: return assert self._group_id try: group = self._group # XXX: http://markmail.org/message/b5d5wa2tdcplxpk2 # It's "documented" that Reset() shouldn't be called in this case # but it doesn't work otherwise... group.Reset() flags = AvahiPublishFlags.UPDATE print_d("name=%s, flags=%x, stype=%s, port=%d" % ( self._real_name, flags, self.stype, self.port)) group.AddService( AVAHI_IF_UNSPEC, AvahiProtocol.UNSPEC, dbus.UInt32(flags), self._real_name, self.stype, dbus.String(), dbus.String(), dbus.UInt16(self.port), []) group.Commit() except dbus.DBusException: self._remove_service() def _remove_service(self): if self._group_id: with ignored(dbus.DBusException): self._group_id.remove() self._group_id = None if self._group: with ignored(dbus.DBusException): self._group.Free() self._group = None def _remove_server(self): if self._server_id: with ignored(dbus.DBusException): self._server_id.remove() self._server_id = None self._last_server_state = None self._remove_service() def _add_server(self): assert not self._server_id try: bus = dbus.SystemBus() server_obj = bus.get_object(self.DBUS_NAME, self.DBUS_PATH_SERVER) server = dbus.Interface(server_obj, self.DBUS_INTERFACE_SERVER) self._server_id = server.connect_to_signal( "StateChanged", self._server_state_changed) self._server_state_changed(server.GetState()) except dbus.DBusException: self._remove_server() def _server_state_changed(self, state, *args): # protect from calling this twice in a row for the same state # because we have to call this manually on start and can't # be sure if the signal fires as well if state == self._last_server_state: return self._last_server_state = state if state == AvahiServerState.RUNNING: self._add_service() elif state in (AvahiServerState.COLLISION, AvahiServerState.REGISTERING): self._remove_service() def _owner_changed(self, owner): if owner: self._add_server() else: self._remove_server() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/mpdserver/main.py����������������������������������������������0000644�0001750�0001750�00000055536�13112005742�023354� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import re import shlex from senf import bytes2fsn, fsn2bytes from quodlibet import const from quodlibet.util import print_d, print_w from quodlibet.compat import text_type, iteritems from .tcpserver import BaseTCPServer, BaseTCPConnection class AckError(object): NOT_LIST = 1 ARG = 2 PASSWORD = 3 PERMISSION = 4 UNKNOWN = 5 NO_EXIST = 50 PLAYLIST_MAX = 51 SYSTEM = 52 PLAYLIST_LOAD = 53 UPDATE_ALREADY = 54 PLAYER_SYNC = 55 EXIST = 56 class Permissions(object): PERMISSION_NONE = 0 PERMISSION_READ = 1 PERMISSION_ADD = 2 PERMISSION_CONTROL = 4 PERMISSION_ADMIN = 8 PERMISSION_ALL = PERMISSION_NONE | \ PERMISSION_READ | \ PERMISSION_ADD | \ PERMISSION_CONTROL | \ PERMISSION_ADMIN TAG_MAPPING = [ (u"Artist", "artist"), (u"ArtistSort", "artistsort"), (u"Album", "album"), (u"AlbumArtist", "albumartist"), (u"AlbumArtistSort", "albumartistsort"), (u"Title", "title"), (u"Track", "tracknumber"), (u"Genre", "genre"), (u"Date", "~year"), (u"Composer", "composer"), (u"Performer", "performer"), (u"Comment", "commend"), (u"Disc", "discnumber"), (u"Name", "~basename"), (u"MUSICBRAINZ_ARTISTID", "musicbrainz_artistid"), (u"MUSICBRAINZ_ALBUMID", "musicbrainz_albumid"), (u"MUSICBRAINZ_ALBUMARTISTID", "musicbrainz_albumartistid"), (u"MUSICBRAINZ_TRACKID", "musicbrainz_trackid"), ] def format_tags(song): """Gives a tag list message for a song""" lines = [] for mpd_key, ql_key in TAG_MAPPING: value = song.comma(ql_key) or None if value is not None: lines.append(u"%s: %s" % (mpd_key, value)) return u"\n".join(lines) class ParseError(Exception): pass def parse_command(line): """Parses a MPD command (without trailing newline) Returns (command, [arguments]) or raises ParseError in case of an error. """ assert isinstance(line, bytes) parts = re.split(b"[ \\t]+", line, maxsplit=1) if not parts: raise ParseError("empty command") command = parts[0] if len(parts) > 1: lex = shlex.shlex(bytes2fsn(parts[1], "utf-8"), posix=True) lex.whitespace_split = True lex.commenters = "" lex.quotes = "\"" lex.whitespace = " \t" args = [fsn2bytes(a, "utf-8") for a in lex] else: args = [] try: command = command.decode("utf-8") except ValueError as e: raise ParseError(e) dec_args = [] for arg in args: try: arg = arg.decode("utf-8") except ValueError as e: raise ParseError(e) dec_args.append(arg) return command, dec_args class MPDService(object): """This is the actual shared MPD service which the clients talk to""" version = (0, 17, 0) def __init__(self, app, config): self._app = app self._connections = set() self._idle_subscriptions = {} self._idle_queue = {} self._pl_ver = 0 self._config = config self._options = app.player_options if not self._config.config_get("password"): self.default_permission = Permissions.PERMISSION_ALL else: self.default_permission = Permissions.PERMISSION_NONE def options_changed(*args): self.emit_changed("options") self._options.connect("notify::shuffle", options_changed) self._options.connect("notify::repeat", options_changed) self._options.connect("notify::single", options_changed) self._player_sigs = [] def volume_changed(*args): self.emit_changed("mixer") id_ = app.player.connect("notify::volume", volume_changed) self._player_sigs.append(id_) def player_changed(*args): self.emit_changed("player") id_ = app.player.connect("paused", player_changed) self._player_sigs.append(id_) id_ = app.player.connect("unpaused", player_changed) self._player_sigs.append(id_) id_ = app.player.connect("seek", player_changed) self._player_sigs.append(id_) def playlist_changed(*args): self._pl_ver += 1 self.emit_changed("playlist") id_ = app.player.connect("song-started", playlist_changed) self._player_sigs.append(id_) def _get_id(self, info): # XXX: we need a unique 31 bit ID, but don't have one. # Given that the heap is continuous and each object is >16 bytes # this should work return (id(info) & 0xFFFFFFFF) >> 1 def destroy(self): for id_ in self._player_sigs: self._app.player.disconnect(id_) del self._options del self._app def add_connection(self, connection): self._connections.add(connection) self._idle_queue[connection] = set() def remove_connection(self, connection): self._idle_subscriptions.pop(connection, None) self._idle_queue.pop(connection, None) self._connections.remove(connection) def register_idle(self, connection, subsystems): self._idle_subscriptions[connection] = set(subsystems) self.flush_idle() def flush_idle(self): flushed = [] for conn, subs in iteritems(self._idle_subscriptions): # figure out which subsystems to report for each connection queued = self._idle_queue[conn] if subs: to_send = subs & queued else: to_send = queued queued -= to_send # send out the response and remove the idle status for affected # connections for subsystem in to_send: conn.write_line(u"changed: %s" % subsystem) if to_send: flushed.append(conn) conn.ok() conn.start_write() for conn in flushed: self._idle_subscriptions.pop(conn, None) def unregister_idle(self, connection): self._idle_subscriptions.pop(connection, None) def emit_changed(self, subsystem): for conn, subs in iteritems(self._idle_queue): subs.add(subsystem) self.flush_idle() def play(self): if not self._app.player.song: self._app.player.reset() else: self._app.player.paused = False def playid(self, songid): self.play() def pause(self, value=None): if value is None: self._app.player.paused = not self._app.player.paused else: self._app.player.paused = value def stop(self): self._app.player.stop() def next(self): self._app.player.next() def previous(self): self._app.player.previous() def seek(self, songpos, time_): """time_ in seconds""" self._app.player.seek(time_ * 1000) def seekid(self, songid, time_): """time_ in seconds""" self._app.player.seek(time_ * 1000) def seekcur(self, value, relative): if relative: pos = self._app.player.get_position() self._app.player.seek(pos + value * 1000) else: self._app.player.seek(value * 1000) def setvol(self, value): """value: 0..100""" self._app.player.volume = (value / 100.0) ** 3.0 def repeat(self, value): self._options.repeat = value def random(self, value): self._options.shuffle = value def single(self, value): self._options.single = value def stats(self): has_song = int(bool(self._app.player.info)) stats = [ ("artists", has_song), ("albums", has_song), ("songs", has_song), ("uptime", 1), ("playtime", 1), ("db_playtime", 1), ("db_update", 1252868674), ] return stats def status(self): app = self._app info = app.player.info if info: if app.player.paused: state = "pause" else: state = "play" else: state = "stop" status = [ ("volume", int((app.player.volume ** (1.0 / 3.0)) * 100)), ("repeat", int(self._options.repeat)), ("random", int(self._options.shuffle)), ("single", int(self._options.single)), ("consume", 0), ("playlist", self._pl_ver), ("playlistlength", int(bool(app.player.info))), ("mixrampdb", 0.0), ("state", state), ] if info: total_time = int(info("~#length")) elapsed_time = int(app.player.get_position() / 1000) elapsed_exact = "%1.3f" % (app.player.get_position() / 1000.0) status.extend([ ("song", 0), ("songid", self._get_id(info)), ]) if state != "stop": status.extend([ ("time", "%d:%d" % (elapsed_time, total_time)), ("elapsed", elapsed_exact), ("bitrate", info("~#bitrate")), ]) return status def currentsong(self): info = self._app.player.info if info is None: return None parts = [] parts.append(u"file: %s" % info("~filename")) parts.append(format_tags(info)) parts.append(u"Time: %d" % int(info("~#length"))) parts.append(u"Pos: %d" % 0) parts.append(u"Id: %d" % self._get_id(info)) return u"\n".join(parts) def playlistinfo(self, start=None, end=None): if start is not None and start > 1: return None return self.currentsong() def playlistid(self, songid=None): return self.currentsong() def plchanges(self, version): if version != self._pl_ver: return self.currentsong() def plchangesposid(self, version): info = self._app.player.info if version != self._pl_ver and info: parts = [] parts.append(u"file: %s" % info("~filename")) parts.append(u"Pos: %d" % 0) parts.append(u"Id: %d" % self._get_id(info)) return u"\n".join(parts) class MPDServer(BaseTCPServer): def __init__(self, app, config, port): self._app = app self._config = config super(MPDServer, self).__init__(port, MPDConnection, const.DEBUG) def handle_init(self): print_d("Creating the MPD service") self.service = MPDService(self._app, self._config) def handle_idle(self): print_d("Destroying the MPD service") self.service.destroy() del self.service def log(self, msg): print_d(msg) class MPDRequestError(Exception): def __init__(self, msg, code=AckError.UNKNOWN, index=None): self.msg = msg self.code = code self.index = index class MPDConnection(BaseTCPConnection): # ------------ connection interface ------------ def handle_init(self, server): service = server.service self.service = service service.add_connection(self) str_version = u".".join(map(text_type, service.version)) self._buf = bytearray((u"OK MPD %s\n" % str_version).encode("utf-8")) self._read_buf = bytearray() # begin - command processing state self._use_command_list = False # everything below is only valid if _use_command_list is True self._command_list_ok = False self._command_list = [] self._command = None # end - command processing state self.permission = self.service.default_permission self.start_write() self.start_read() def handle_read(self, data): self._feed_data(data) while 1: line = self._get_next_line() if line is None: break self.log(u"-> " + repr(line)) try: cmd, args = parse_command(line) except ParseError: # TODO: not sure what to do here re command lists continue try: self._handle_command(cmd, args) except MPDRequestError as e: self._error(e.msg, e.code, e.index) self._use_command_list = False del self._command_list[:] def handle_write(self): data = self._buf[:] del self._buf[:] return data def can_write(self): return bool(self._buf) def handle_close(self): self.log("connection closed") self.service.remove_connection(self) del self.service # ------------ rest ------------ def authenticate(self, password): if password == self.service._config.config_get("password"): self.permission = Permissions.PERMISSION_ALL else: self.permission = self.service.default_permission raise MPDRequestError("Password incorrect", AckError.PASSWORD) def log(self, msg): if const.DEBUG: print_d("[%s] %s" % (self.name, msg)) def _feed_data(self, new_data): """Feed new data into the read buffer""" self._read_buf.extend(new_data) def _get_next_line(self): """Returns the next line from the read buffer or None""" try: index = self._read_buf.index(b"\n") except ValueError: return None line = bytes(self._read_buf[:index]) del self._read_buf[:index + 1] return line def write_line(self, line): """Writes a line to the client""" assert isinstance(line, text_type) self.log(u"<- " + repr(line)) self._buf.extend(line.encode("utf-8", errors="replace") + b"\n") def ok(self): self.write_line(u"OK") def _error(self, msg, code, index): error = [] error.append(u"ACK [%d" % code) if index is not None: error.append(u"@%d" % index) assert self._command is not None error.append(u"] {%s}" % self._command) if msg is not None: error.append(u" %s" % msg) self.write_line(u"".join(error)) def _handle_command(self, command, args): self._command = command if command == u"command_list_end": if not self._use_command_list: self._error(u"list_end without begin") return for i, (cmd, args) in enumerate(self._command_list): try: self._exec_command(cmd, args) except MPDRequestError as e: # reraise with index raise MPDRequestError(e.msg, e.code, i) self.ok() self._use_command_list = False del self._command_list[:] return if command in (u"command_list_begin", u"command_list_ok_begin"): if self._use_command_list: raise MPDRequestError(u"begin without end") self._use_command_list = True self._command_list_ok = command == u"command_list_ok_begin" assert not self._command_list return if self._use_command_list: self._command_list.append((command, args)) else: self._exec_command(command, args) def _exec_command(self, command, args, no_ack=False): self._command = command if command not in self._commands: print_w("Unhandled command %r, sending OK." % command) command = "ping" # Unhandled command, default to OK for now.. if not self._use_command_list: self.ok() elif self._command_list_ok: self.write_line(u"list_OK") return cmd, do_ack, permission = self._commands[command] if permission != (self.permission & permission): raise MPDRequestError("Insufficient permission", AckError.PERMISSION) cmd(self, self.service, args) if self._use_command_list: if self._command_list_ok: self.write_line(u"list_OK") elif do_ack: self.ok() _commands = {} @classmethod def Command(cls, name, ack=True, permission=Permissions.PERMISSION_ADMIN): def wrap(func): assert name not in cls._commands, name cls._commands[name] = (func, ack, permission) return func return wrap @classmethod def list_commands(cls): """A list of supported commands""" return cls._commands.keys() def _verify_length(args, length): if not len(args) >= length: raise MPDRequestError("Wrong arg count") def _parse_int(arg): try: return int(arg) except ValueError: raise MPDRequestError("invalid arg") def _parse_bool(arg): try: value = int(arg) if value not in (0, 1): raise ValueError except ValueError: raise MPDRequestError("invalid arg") else: return bool(value) def _parse_range(arg): try: values = [int(v) for v in arg.split(":")] except ValueError: raise MPDRequestError("arg in range not a number") if len(values) == 1: return (values[0], values[0] + 1) elif len(values) == 2: return values else: raise MPDRequestError("invalid range") @MPDConnection.Command("idle", ack=False) def _cmd_idle(conn, service, args): service.register_idle(conn, args) @MPDConnection.Command("ping", permission=Permissions.PERMISSION_NONE) def _cmd_ping(conn, service, args): return @MPDConnection.Command("password", permission=Permissions.PERMISSION_NONE) def _cmd_password(conn, service, args): _verify_length(args, 1) conn.authenticate(args[0]) @MPDConnection.Command("noidle") def _cmd_noidle(conn, service, args): service.unregister_idle(conn) @MPDConnection.Command("close", ack=False, permission=Permissions.PERMISSION_NONE) def _cmd_close(conn, service, args): conn.close() @MPDConnection.Command("play") def _cmd_play(conn, service, args): service.play() @MPDConnection.Command("listplaylists") def _cmd_listplaylists(conn, service, args): pass @MPDConnection.Command("list") def _cmd_list(conn, service, args): pass @MPDConnection.Command("playid") def _cmd_playid(conn, service, args): _verify_length(args, 1) songid = _parse_int(args[0]) service.playid(songid) @MPDConnection.Command("pause") def _cmd_pause(conn, service, args): value = None if args: _verify_length(args, 1) value = _parse_bool(args[0]) service.pause(value) @MPDConnection.Command("stop") def _cmd_stop(conn, service, args): service.stop() @MPDConnection.Command("next") def _cmd_next(conn, service, args): service.next() @MPDConnection.Command("previous") def _cmd_previous(conn, service, args): service.previous() @MPDConnection.Command("repeat") def _cmd_repeat(conn, service, args): _verify_length(args, 1) value = _parse_bool(args[0]) service.repeat(value) @MPDConnection.Command("random") def _cmd_random(conn, service, args): _verify_length(args, 1) value = _parse_bool(args[0]) service.random(value) @MPDConnection.Command("single") def _cmd_single(conn, service, args): _verify_length(args, 1) value = _parse_bool(args[0]) service.single(value) @MPDConnection.Command("setvol") def _cmd_setvol(conn, service, args): _verify_length(args, 1) value = _parse_int(args[0]) service.setvol(value) @MPDConnection.Command("status") def _cmd_status(conn, service, args): status = service.status() for k, v in status: conn.write_line(u"%s: %s" % (k, v)) @MPDConnection.Command("stats") def _cmd_stats(conn, service, args): status = service.stats() for k, v in status: conn.write_line(u"%s: %s" % (k, v)) @MPDConnection.Command("currentsong") def _cmd_currentsong(conn, service, args): stats = service.currentsong() if stats is not None: conn.write_line(stats) @MPDConnection.Command("count") def _cmd_count(conn, service, args): conn.write_line(u"songs: 0") conn.write_line(u"playtime: 0") @MPDConnection.Command("plchanges") def _cmd_plchanges(conn, service, args): _verify_length(args, 1) version = _parse_int(args[0]) changes = service.plchanges(version) if changes is not None: conn.write_line(changes) @MPDConnection.Command("plchangesposid") def _cmd_plchangesposid(conn, service, args): _verify_length(args, 1) version = _parse_int(args[0]) changes = service.plchangesposid(version) if changes is not None: conn.write_line(changes) @MPDConnection.Command("listallinfo") def _cmd_listallinfo(*args): _cmd_currentsong(*args) @MPDConnection.Command("seek") def _cmd_seek(conn, service, args): _verify_length(args, 2) songpos = _parse_int(args[0]) time_ = _parse_int(args[1]) service.seek(songpos, time_) @MPDConnection.Command("seekid") def _cmd_seekid(conn, service, args): _verify_length(args, 2) songid = _parse_int(args[0]) time_ = _parse_int(args[1]) service.seekid(songid, time_) @MPDConnection.Command("seekcur") def _cmd_seekcur(conn, service, args): _verify_length(args, 1) relative = False time_ = args[0] if time_.startswith(("+", "-")): relative = True try: time_ = int(time_) except ValueError: raise MPDRequestError("arg not a number") service.seekcur(time_, relative) @MPDConnection.Command("outputs") def _cmd_outputs(conn, service, args): conn.write_line(u"outputid: 0") conn.write_line(u"outputname: dummy") conn.write_line(u"outputenabled: 1") @MPDConnection.Command("commands", permission=Permissions.PERMISSION_NONE) def _cmd_commands(conn, service, args): for name in conn.list_commands(): conn.write_line(u"command: " + text_type(name)) @MPDConnection.Command("tagtypes") def _cmd_tagtypes(conn, service, args): for mpd_key, ql_key in TAG_MAPPING: conn.write_line(mpd_key) @MPDConnection.Command("lsinfo") def _cmd_lsinfo(conn, service, args): _verify_length(args, 1) @MPDConnection.Command("playlistinfo") def _cmd_playlistinfo(conn, service, args): if args: _verify_length(args, 1) start, end = _parse_range(args[0]) result = service.playlistinfo(start, end) else: result = service.playlistinfo() if result is not None: conn.write_line(result) @MPDConnection.Command("playlistid") def _cmd_playlistid(conn, service, args): if args: songid = _parse_int(args[0]) else: songid = None result = service.playlistid(songid) if result is not None: conn.write_line(result) ������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/animosd/�������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021461� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/animosd/config.py����������������������������������������������0000644�0001750�0001750�00000003305�13112005742�023303� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright (C) 2012-13 Nick Boultbee, Thomas Vogt # Copyright (C) 2008 Andreas Bombe # Copyright (C) 2005 Michael Urman # Based on osd.py (C) 2005 Ton van den Heuvel, Joe Wreshnig # (C) 2004 Gustavo J. A. M. Carneiro # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from quodlibet.plugins import (PluginConfig, ConfProp, IntConfProp, FloatConfProp, ColorConfProp) DEFAULT_PATTERN = (r"<album|[b]<album>[/b]<discnumber| - Disc " """<discnumber>><part| - [b]<part>[/b]><tracknumber| - <tracknumber>> >[span weight='bold' size='large']<title>[/span] - <~length><version| [small][i]<version>[/i][/small]><~people| by <~people>>""") def get_config(prefix): class AnimOsdConfig(object): plugin_conf = PluginConfig(prefix) font = ConfProp(plugin_conf, "font", "Sans 22") string = ConfProp(plugin_conf, "string", DEFAULT_PATTERN) pos_y = FloatConfProp(plugin_conf, "pos_y", 0.0) corners = IntConfProp(plugin_conf, "corners", 1) delay = IntConfProp(plugin_conf, "delay", 2500) monitor = IntConfProp(plugin_conf, "monitor", 0) align = IntConfProp(plugin_conf, "align", 1) coversize = IntConfProp(plugin_conf, "coversize", 120) text = ColorConfProp(plugin_conf, "text", (0.9, 0.9, 0.9, 0.0)) outline = ColorConfProp(plugin_conf, "outline", (-1.0, 0.0, 0.0, 0.2)) shadow = ColorConfProp(plugin_conf, "shadow", (-1.0, 0.0, 0.0, 0.1)) fill = ColorConfProp(plugin_conf, "fill", (0.25, 0.25, 0.25, 0.5)) return AnimOsdConfig() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/animosd/prefs.py�����������������������������������������������0000644�0001750�0001750�00000024240�13112005742�023156� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright (C) 2012-13 Nick Boultbee, Thomas Vogt # Copyright (C) 2008 Andreas Bombe # Copyright (C) 2005 Michael Urman # Based on osd.py (C) 2005 Ton van den Heuvel, Joe Wreshnig # (C) 2004 Gustavo J. A. M. Carneiro # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from gi.repository import Gtk, Gdk from quodlibet import _ from quodlibet import app from quodlibet import qltk from quodlibet.util import connect_obj from quodlibet.formats import DUMMY_SONG from quodlibet.qltk.textedit import PatternEdit from quodlibet.qltk import Icons class ConfigLabel(Gtk.Label): """Customised Label for configuration, tied to a widget""" def __init__(self, text, widget): super(Gtk.Label, self).__init__(label=text, use_underline=True) self.set_mnemonic_widget(widget) self.set_alignment(0.0, 0.5) class AnimOsdPrefs(Gtk.VBox): def __init__(self, plugin): super(AnimOsdPrefs, self).__init__(spacing=6) self.Conf = plugin.Conf self.plugin = plugin def __coltofloat(x): return x / 65535.0 def __floattocol(x): return int(x * 65535) def show_preview(): preview_song = (app.player.song if app.player.song else DUMMY_SONG) self.plugin.plugin_on_song_started(preview_song) def on_button_pressed(x=None, y=None): show_preview() def set_text(button): color = button.get_color() color = map(__coltofloat, (color.red, color.green, color.blue, 0.0)) self.Conf.text = tuple(color) show_preview() def set_fill(button): color = button.get_color() color = map(__coltofloat, (color.red, color.green, color.blue, button.get_alpha())) self.Conf.fill = tuple(color) show_preview() def set_font(button): font = button.get_font_name() self.Conf.font = font show_preview() def change_delay(button): value = int(button.get_value() * 1000) self.Conf.delay = value def change_monitor(button): """Monitor number config change handler""" value = int(button.get_value()) self.Conf.monitor = value show_preview() def change_position(button): value = button.get_active() / 2.0 self.Conf.pos_y = value show_preview() def change_align(button): value = button.get_active() self.Conf.align = value show_preview() def change_shadow(button): if button.get_active(): self.Conf.shadow = (0.0, 0.0, 0.0, self.Conf.fill[3]) else: self.Conf.shadow = (-1.0, 0.0, 0.0, 0.0) show_preview() def change_outline(button): if button.get_active(): # Vary with fill alpha to create a smoother outline edge alpha = (min(1.0, self.Conf.fill[3] * 1.25)) self.Conf.outline = (0.1, 0.1, 0.1, alpha) else: self.Conf.outline = (-1.0, 0.0, 0.0) show_preview() def change_rounded(button): if button.get_active(): self.Conf.corners = 1 else: self.Conf.corners = 0 show_preview() def change_coversize(button): value = int(button.get_value()) self.Conf.coversize = value show_preview() def edit_pattern(button): w = PatternEdit(button, self.Conf.string) w.set_default_size(520, 260) w.text = self.Conf.string connect_obj(w.apply, 'clicked', set_string, w) w.show() def set_string(window): value = window.text self.Conf.string = value show_preview() def build_display_widget(): vb2 = Gtk.VBox(spacing=3) hb = Gtk.HBox(spacing=6) # Set monitor to display OSD on if there's more than one monitor_cnt = Gdk.Screen.get_default().get_n_monitors() if monitor_cnt > 1: adj = Gtk.Adjustment(value=self.Conf.monitor, lower=0, upper=monitor_cnt - 1, step_incr=1) monitor = Gtk.SpinButton(adjustment=adj) monitor.set_numeric(True) monitor.connect('value-changed', change_monitor) l2 = ConfigLabel("_Monitor:", monitor) hb.pack_start(l2, False, True, 0) hb.pack_start(monitor, False, True, 0) vb2.pack_start(hb, True, True, 0) else: # should be this by default anyway self.Conf.monitor = 0 hb = Gtk.HBox(spacing=6) cb = Gtk.ComboBoxText() cb.append_text(_("Top of screen")) cb.append_text(_("Middle of screen")) cb.append_text(_("Bottom of screen")) cb.set_active(int(self.Conf.pos_y * 2.0)) cb.connect('changed', change_position) lbl = ConfigLabel(_("_Position:"), cb) hb.pack_start(lbl, False, True, 0) hb.pack_start(cb, False, True, 0) vb2.pack_start(hb, False, True, 0) hb = Gtk.HBox(spacing=6) coversize = Gtk.SpinButton( adjustment=Gtk.Adjustment.new( self.Conf.coversize, 120, 600, 1, 10, 0), climb_rate=1, digits=0) coversize.set_numeric(True) coversize.connect('value-changed', change_coversize) l1 = ConfigLabel(_("_Cover size:"), coversize) hb.pack_start(l1, False, True, 0) hb.pack_start(coversize, False, True, 0) vb2.pack_start(hb, False, True, 0) return vb2 frame = qltk.Frame(label=_("Display"), child=build_display_widget()) frame.set_border_width(6) self.pack_start(frame, False, True, 0) def build_text_widget(): t = Gtk.Table(n_rows=2, n_columns=2) t.props.expand = False t.set_col_spacings(6) t.set_row_spacings(3) font = Gtk.FontButton(show_style=True) font.set_font_name(self.Conf.font) font.connect('font-set', set_font) lbl = ConfigLabel(_("_Font:"), font) t.attach(lbl, 0, 1, 0, 1, xoptions=Gtk.AttachOptions.FILL) t.attach(font, 1, 2, 0, 1) align = Gtk.ComboBoxText() align.append_text(_("Left")) align.append_text(_("Center")) align.append_text(_("Right")) align.set_active(self.Conf.align) align.connect('changed', change_align) lbl = ConfigLabel(_("_Align text:"), align) t.attach(lbl, 0, 1, 1, 2, xoptions=Gtk.AttachOptions.FILL) t.attach(align, 1, 2, 1, 2) return t frame = qltk.Frame(label=_("Text"), child=build_text_widget()) frame.set_border_width(6) self.pack_start(frame, False, True, 0) def build_colors_widget(): t = Gtk.Table(n_rows=2, n_columns=2) t.props.expand = False t.set_col_spacings(6) t.set_row_spacings(3) b = Gtk.ColorButton( rgba=Gdk.RGBA(*map(__floattocol, self.Conf.text))) l = ConfigLabel(_("_Text:"), b) t.attach(l, 0, 1, 0, 1, xoptions=Gtk.AttachOptions.FILL) t.attach(b, 1, 2, 0, 1) b.connect('color-set', set_text) b = Gtk.ColorButton(color=Gdk.Color(*map(__floattocol, self.Conf.fill[0:3]))) b.set_use_alpha(True) b.set_alpha(__floattocol(self.Conf.fill[3])) b.connect('color-set', set_fill) l = ConfigLabel(_("_Fill:"), b) t.attach(l, 0, 1, 1, 2, xoptions=Gtk.AttachOptions.FILL) t.attach(b, 1, 2, 1, 2) return t f = qltk.Frame(label=_("Colors"), child=build_colors_widget()) f.set_border_width(6) self.pack_start(f, False, False, 0) def build_effects_widget(): vb2 = Gtk.VBox(spacing=3) hb = Gtk.HBox(spacing=6) toggles = [ (_("_Shadows"), self.Conf.shadow[0], change_shadow), (_("_Outline"), self.Conf.outline[0], change_outline), (_("Rou_nded Corners"), self.Conf.corners - 1, change_rounded)] for (label, current, callback) in toggles: checkb = Gtk.CheckButton(label=label, use_underline=True) checkb.set_active(current != -1) checkb.connect("toggled", callback) hb.pack_start(checkb, True, True, 0) vb2.pack_start(hb, True, True, 0) hb = Gtk.HBox(spacing=6) timeout = Gtk.SpinButton( adjustment=Gtk.Adjustment.new( self.Conf.delay / 1000.0, 0, 60, 0.1, 1.0, 0), climb_rate=0.1, digits=1) timeout.set_numeric(True) timeout.connect('value-changed', change_delay) l1 = ConfigLabel(_("_Delay:"), timeout) hb.pack_start(l1, False, True, 0) hb.pack_start(timeout, False, True, 0) vb2.pack_start(hb, False, True, 0) return vb2 frame = qltk.Frame(label=_("Effects"), child=build_effects_widget()) frame.set_border_width(6) self.pack_start(frame, False, True, 0) def build_buttons_widget(): hb = Gtk.HBox(spacing=6) edit_button = qltk.Button(_(u"Ed_it Display Pattern…"), Icons.EDIT) edit_button.connect('clicked', edit_pattern) hb.pack_start(edit_button, False, True, 0) preview_button = Gtk.Button(label=_("Preview")) preview_button.connect("button-press-event", on_button_pressed) hb.pack_start(preview_button, False, True, 0) return hb self.pack_start(build_buttons_widget(), False, True, 0) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/animosd/__init__.py��������������������������������������������0000644�0001750�0001750�00000000744�13112005742�023601� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright (C) 2012-13 Nick Boultbee, Thomas Vogt # Copyright (C) 2008 Andreas Bombe # Copyright (C) 2005 Michael Urman # Based on osd.py (C) 2005 Ton van den Heuvel, Joe Wreshnig # (C) 2004 Gustavo J. A. M. Carneiro # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from .main import AnimOsd AnimOsd ����������������������������quodlibet-3.9.1/quodlibet/ext/events/animosd/osdwindow.py�������������������������������������������0000644�0001750�0001750�00000025501�13112005742�024055� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright (C) 2012-13 Nick Boultbee, Thomas Vogt # Copyright (C) 2008 Andreas Bombe # Copyright (C) 2005 Michael Urman # Based on osd.py (C) 2005 Ton van den Heuvel, Joe Wreshnig # (C) 2004 Gustavo J. A. M. Carneiro # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. from collections import namedtuple from math import pi import gi gi.require_version("PangoCairo", "1.0") from gi.repository import Gtk, GObject, GLib from gi.repository import Gdk from gi.repository import Pango, PangoCairo import cairo from quodlibet.qltk.image import get_surface_for_pixbuf, get_surface_extents from quodlibet import qltk from quodlibet import app from quodlibet import pattern class OSDWindow(Gtk.Window): __gsignals__ = { 'fade-finished': (GObject.SignalFlags.RUN_LAST, None, (bool,)), } POS_X = 0.5 """position of window 0--1 horizontal""" MARGIN = 50 """never any closer to the screen edge than this""" BORDER = 20 """text/cover this far apart, from edge""" FADETIME = 0.3 """take this many seconds to fade in or out""" MS = 40 """wait this many milliseconds between steps""" def __init__(self, conf, song): Gtk.Window.__init__(self, Gtk.WindowType.POPUP) self.set_type_hint(Gdk.WindowTypeHint.NOTIFICATION) screen = self.get_screen() rgba = screen.get_rgba_visual() if rgba is not None: self.set_visual(rgba) self.conf = conf self.iteration_source = None self.fading_in = False self.fade_start_time = 0 mgeo = screen.get_monitor_geometry(conf.monitor) textwidth = mgeo.width - 2 * (self.BORDER + self.MARGIN) scale_factor = self.get_scale_factor() cover_pixbuf = app.cover_manager.get_pixbuf( song, conf.coversize * scale_factor, conf.coversize * scale_factor) coverheight = 0 coverwidth = 0 if cover_pixbuf: self.cover_surface = get_surface_for_pixbuf(self, cover_pixbuf) coverwidth = cover_pixbuf.get_width() // scale_factor coverheight = cover_pixbuf.get_height() // scale_factor textwidth -= coverwidth + self.BORDER else: self.cover_surface = None layout = self.create_pango_layout('') layout.set_alignment((Pango.Alignment.LEFT, Pango.Alignment.CENTER, Pango.Alignment.RIGHT)[conf.align]) layout.set_spacing(Pango.SCALE * 7) layout.set_font_description(Pango.FontDescription(conf.font)) try: layout.set_markup(pattern.XMLFromMarkupPattern(conf.string) % song) except pattern.error: layout.set_markup("") layout.set_width(Pango.SCALE * textwidth) layoutsize = layout.get_pixel_size() if layoutsize[0] < textwidth: layout.set_width(Pango.SCALE * layoutsize[0]) layoutsize = layout.get_pixel_size() self.title_layout = layout winw = layoutsize[0] + 2 * self.BORDER if coverwidth: winw += coverwidth + self.BORDER winh = max(coverheight, layoutsize[1]) + 2 * self.BORDER self.set_default_size(winw, winh) rect = namedtuple("Rect", ["x", "y", "width", "height"]) rect.x = self.BORDER rect.y = (winh - coverheight) // 2 rect.width = coverwidth rect.height = coverheight self.cover_rectangle = rect winx = int((mgeo.width - winw) * self.POS_X) winx = max(self.MARGIN, min(mgeo.width - self.MARGIN - winw, winx)) winy = int((mgeo.height - winh) * conf.pos_y) winy = max(self.MARGIN, min(mgeo.height - self.MARGIN - winh, winy)) self.move(winx + mgeo.x, winy + mgeo.y) def do_draw(self, cr): if self.is_composited(): self.draw_title_info(cr) else: # manual transparency rendering follows walloc = self.get_allocation() wpos = self.get_position() if not getattr(self, "_bg_sf", None): # copy the root surface into a temp image surface root_win = self.get_root_window() bg_sf = cairo.ImageSurface(cairo.FORMAT_ARGB32, walloc.width, walloc.height) pb = Gdk.pixbuf_get_from_window( root_win, wpos[0], wpos[1], walloc.width, walloc.height) bg_cr = cairo.Context(bg_sf) Gdk.cairo_set_source_pixbuf(bg_cr, pb, 0, 0) bg_cr.paint() self._bg_sf = bg_sf if not getattr(self, "_fg_sf", None): # draw the window content in another temp surface fg_sf = cairo.ImageSurface(cairo.FORMAT_ARGB32, walloc.width, walloc.height) fg_cr = cairo.Context(fg_sf) fg_cr.set_source_surface(fg_sf) self.draw_title_info(fg_cr) self._fg_sf = fg_sf # first draw the background so we have 'transparancy' cr.set_operator(cairo.OPERATOR_SOURCE) cr.set_source_surface(self._bg_sf) cr.paint() # then draw the window content with the right opacity cr.set_operator(cairo.OPERATOR_OVER) cr.set_source_surface(self._fg_sf) cr.paint_with_alpha(self.get_opacity()) @staticmethod def rounded_rectangle(cr, x, y, radius, width, height): cr.move_to(x + radius, y) cr.line_to(x + width - radius, y) cr.arc(x + width - radius, y + radius, radius, - 90.0 * pi / 180.0, 0.0 * pi / 180.0) cr.line_to(x + width, y + height - radius) cr.arc(x + width - radius, y + height - radius, radius, 0.0 * pi / 180.0, 90.0 * pi / 180.0) cr.line_to(x + radius, y + height) cr.arc(x + radius, y + height - radius, radius, 90.0 * pi / 180.0, 180.0 * pi / 180.0) cr.line_to(x, y + radius) cr.arc(x + radius, y + radius, radius, 180.0 * pi / 180.0, 270.0 * pi / 180.0) cr.close_path() @property def corners_factor(self): if self.conf.corners != 0: return 0.14 return 0.0 def draw_conf_rect(self, cr, x, y, width, height, radius): if self.conf.corners != 0: self.rounded_rectangle(cr, x, y, radius, width, height) else: cr.rectangle(x, y, width, height) def draw_title_info(self, cr): cr.save() do_shadow = (self.conf.shadow[0] != -1.0) do_outline = (self.conf.outline[0] != -1.0) self.set_name("osd_bubble") qltk.add_css(self, """ #osd_bubble { background-color:rgba(0,0,0,0); } """) cr.set_operator(cairo.OPERATOR_OVER) cr.set_source_rgba(*self.conf.fill) radius = min(25, self.corners_factor * min(*self.get_size())) self.draw_conf_rect(cr, 0, 0, self.get_size()[0], self.get_size()[1], radius) cr.fill() # draw border if do_outline: # Make border darker and more translucent than the fill f = self.conf.fill rgba = (f[0] / 1.25, f[1] / 1.25, f[2] / 1.25, f[3] / 2.0) cr.set_source_rgba(*rgba) self.draw_conf_rect(cr, 1, 1, self.get_size()[0] - 2, self.get_size()[1] - 2, radius) cr.set_line_width(2.0) cr.stroke() textx = self.BORDER if self.cover_surface is not None: rect = self.cover_rectangle textx += rect.width + self.BORDER surface = self.cover_surface transmat = cairo.Matrix() if do_shadow: cr.set_source_rgba(*self.conf.shadow) self.draw_conf_rect(cr, rect.x + 2, rect.y + 2, rect.width, rect.height, 0.6 * self.corners_factor * rect.width) cr.fill() if do_outline: cr.set_source_rgba(*self.conf.outline) self.draw_conf_rect(cr, rect.x, rect.y, rect.width, rect.height, 0.6 * self.corners_factor * rect.width) cr.stroke() cr.set_source_surface(surface, 0, 0) width, height = get_surface_extents(surface)[2:] transmat.scale(width / float(rect.width), height / float(rect.height)) transmat.translate(-rect.x, -rect.y) cr.get_source().set_matrix(transmat) self.draw_conf_rect(cr, rect.x, rect.y, rect.width, rect.height, 0.6 * self.corners_factor * rect.width) cr.fill() PangoCairo.update_layout(cr, self.title_layout) height = self.title_layout.get_pixel_size()[1] texty = (self.get_size()[1] - height) // 2 if do_shadow: cr.set_source_rgba(*self.conf.shadow) cr.move_to(textx + 2, texty + 2) PangoCairo.show_layout(cr, self.title_layout) if do_outline: cr.set_source_rgba(*self.conf.outline) cr.move_to(textx, texty) PangoCairo.layout_path(cr, self.title_layout) cr.stroke() cr.set_source_rgb(*self.conf.text[:3]) cr.move_to(textx, texty) PangoCairo.show_layout(cr, self.title_layout) cr.restore() def fade_in(self): self.do_fade_inout(True) def fade_out(self): self.do_fade_inout(False) def do_fade_inout(self, fadein): fadein = bool(fadein) self.fading_in = fadein now = GObject.get_current_time() fraction = self.get_opacity() if not fadein: fraction = 1.0 - fraction self.fade_start_time = now - fraction * self.FADETIME if self.iteration_source is None: self.iteration_source = GLib.timeout_add(self.MS, self.fade_iteration_callback) def fade_iteration_callback(self): delta = GObject.get_current_time() - self.fade_start_time fraction = delta / self.FADETIME if self.fading_in: self.set_opacity(fraction) else: self.set_opacity(1.0 - fraction) if not self.is_composited(): self.queue_draw() if fraction >= 1.0: self.iteration_source = None self.emit('fade-finished', self.fading_in) return False return True �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/animosd/main.py������������������������������������������������0000644�0001750�0001750�00000005707�13112005742�022772� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright (c) 2012,2013,2016 Nick Boultbee # Copyright (C) 2012-13 Thomas Vogt # Copyright (C) 2008 Andreas Bombe # Copyright (C) 2005 Michael Urman # Based on osd.py (C) 2005 Ton van den Heuvel, Joe Wreshnig # (C) 2004 Gustavo J. A. M. Carneiro # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gdk, GLib from quodlibet import _ from quodlibet.plugins.events import EventPlugin from quodlibet.qltk import Icons from quodlibet.util import cached_property from .osdwindow import OSDWindow from .config import get_config from .prefs import AnimOsdPrefs class AnimOsd(EventPlugin): PLUGIN_ID = "Animated On-Screen Display" PLUGIN_NAME = _("Animated On-Screen Display") PLUGIN_DESC = _("Displays song information on your screen when it " "changes.") PLUGIN_ICON = Icons.DIALOG_INFORMATION __current_window = None @cached_property def Conf(self): return get_config('animosd') def PluginPreferences(self, parent): return AnimOsdPrefs(self) def plugin_on_song_started(self, song): if self.__current_window is not None: if self.__current_window.is_composited(): self.__current_window.fade_out() else: self.__current_window.hide() self.__current_window.destroy() if song is None: self.__current_window = None return window = OSDWindow(self.Conf, song) window.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) window.connect('button-press-event', self.__buttonpress) window.connect('fade-finished', self.__fade_finished) self.__current_window = window window.set_opacity(0.0) window.show() window.fade_in() def plugin_on_error(self, song, error): if self.__current_window is not None: self.__current_window.destroy() self.__current_window = None @staticmethod def start_fade_out(window): window.fade_out() return False def __buttonpress(self, window, event): window.hide() if self.__current_window is window: self.__current_window = None window.destroy() def __fade_finished(self, window, fade_in): if fade_in: GLib.timeout_add(self.Conf.delay, self.start_fade_out, window) else: window.hide() if self.__current_window is window: self.__current_window = None # Delay destroy - apparently the hide does not quite register if # the destroy is done immediately. The compiz animation plugin # then sometimes triggers and causes undesirable effects while the # popup should already be invisible. GLib.timeout_add(1000, window.destroy) ���������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/lyricswindow.py������������������������������������������������0000644�0001750�0001750�00000030143�13112005742�023141� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # 2015 Joschua Gandert # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import threading from xml.dom import minidom from quodlibet import _ from quodlibet.util import gi_require_versions from quodlibet.plugins.events import EventPlugin from quodlibet.plugins import (PluginImportException, PluginConfig, ConfProp, BoolConfProp, IntConfProp, FloatConfProp, PluginNotSupportedError) try: gi_require_versions("WebKit2", ["4.0", "3.0"]) except ValueError as e: if os.name == "nt": raise PluginNotSupportedError raise PluginImportException("GObject Introspection: " + str(e)) from gi.repository import WebKit2, Gtk, GLib from quodlibet import app, qltk from quodlibet.util import escape, cached_property, connect_obj from quodlibet.qltk import Icons from quodlibet.qltk.window import Window from quodlibet.qltk.entry import UndoEntry from quodlibet.pattern import URLFromPattern from quodlibet.compat import quote, queue from quodlibet.util.urllib import urlopen # for the mobile version USER_AGENT = ("Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) " "AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0" "Chrome/43.0.2357.65 Mobile Safari/537.36") LYRICS_WIKIA_URL = ("https://lyrics.wikia.com/api.php?client=QuodLibet" "&action=lyrics&func=getSong&artist=%s&song=%s&fmt=xml") DEFAULT_ALTERNATE_SEARCH_URL = ("https://duckduckgo.com/" "?q=lyrics+<artist|<artist>+-+><title>") def create_api_search_url(song): artist, title = song("artist"), song("title") artist = quote(artist.encode('utf-8')) title = quote(title.encode('utf-8')) return LYRICS_WIKIA_URL % (artist, title) class LyricsWikiaSearchThread(threading.Thread): TIMEOUT = 4.0 def __init__(self): super(LyricsWikiaSearchThread, self).__init__() self.daemon = True self._queue = queue.Queue() self._stopped = False self._current = None def search_song(self, song, done_cb): """Trigger a new search, old ones will be canceled""" assert song assert done_cb if not self.is_alive(): self.start() self._current = song while not self._queue.empty(): self._queue.get_nowait() self._queue.put((song, done_cb)) def stop(self): """Stop all active searches, no callback will be called after this returns. """ self._stopped = True self._queue.put((None, None)) def __idle(self, song, func, *args, **kwargs): def delayed(): if self._stopped or song is not self._current: return func(song, *args, **kwargs) GLib.idle_add(delayed) def _do_search(self, song): """Returns a URL or None""" fetch_url = create_api_search_url(song) try: response = urlopen(fetch_url, timeout=self.TIMEOUT) except EnvironmentError: return try: xml = response.read() except IOError: return try: dom = minidom.parseString(xml) except Exception: # who knows... return page_id_nodes = dom.getElementsByTagName("page_id") if not page_id_nodes or not page_id_nodes[0].hasChildNodes(): return url_nodes = dom.getElementsByTagName("url") try: page = url_nodes[0].firstChild.data except (IndexError, AttributeError): return else: return page def run(self): while not self._stopped: song, cb = self._queue.get() if self._stopped: break result = self._do_search(song) self.__idle(song, cb, result) class LyricsWebViewWindow(Window): def __init__(self, conf): super(LyricsWebViewWindow, self).__init__(dialog=False) self.set_transient_for(app.window) self.conf = conf self.resize(conf.width, conf.height) self.move(conf.x, conf.y) self._thread = LyricsWikiaSearchThread() self.connect("destroy", lambda *x: self._thread.stop()) self._scrolled_window = Gtk.ScrolledWindow() self.add(self._scrolled_window) self.current_song = None self._reload_web_view() def _reload_web_view(self, web_view=None): if web_view is not None: self._scrolled_window.remove(web_view) self._view = view = WebKit2.WebView() self.set_zoom_level(self.conf.zoom_level) # stop alert windows view.connect('script-dialog', lambda *args: True) view.connect('web-process-crashed', self._reload_web_view) settings = view.get_settings() settings.set_property("user-agent", USER_AGENT) settings.set_media_playback_requires_user_gesture(True) def scroll_tp_lyrics(view, load_event): if load_event != WebKit2.LoadEvent.COMMITTED: return view.run_javascript(""" document.addEventListener('DOMContentLoaded', function() { var box = document.getElementsByClassName('lyricbox')[0]; box.scrollIntoView(true); }, false); """, None, None, None) view.connect('load-changed', scroll_tp_lyrics) self._scrolled_window.add(view) self._scrolled_window.show_all() if self.current_song is not None: self.set_song(self.current_song) def set_zoom_level(self, zoom_level): self._view.set_zoom_level(zoom_level) def set_song(self, song): """Display lyrics for the given song""" self.current_song = song if song is None: message = _("No active song") self._set_html(message) self._set_title(message) return self._thread.search_song(song, self._callback) def _set_html(self, message, details=None): html = "<center><h2>%s</h2></center>" % escape(message) if details: html += "<center><p>%s</p><center>" % escape(details) self._view.load_html(html, "http://foo.bar") def _callback(self, song, page): if page is None: message = _("No lyrics found") if self.conf.alternate_search_enabled: url = URLFromPattern(self.conf.alternate_search_url) % song self._view.load_uri(url) else: self._set_html(message, song("~artist~title")) self._set_title(message) else: self._view.load_uri(page) self._set_title(song("title")) def _set_title(self, message): self.set_title(_("Lyrics:") + " " + message) def get_config(prefix): class LyricsWindowConfig(object): plugin_conf = PluginConfig(prefix) alternate_search_url = ConfProp(plugin_conf, "alternate_search_url", DEFAULT_ALTERNATE_SEARCH_URL) alternate_search_enabled = BoolConfProp(plugin_conf, "alternate_search_enabled", True) zoom_level = FloatConfProp(plugin_conf, "zoom_level", 1.4) width = IntConfProp(plugin_conf, "width", 500) height = IntConfProp(plugin_conf, "height", 500) x = IntConfProp(plugin_conf, "x", 0) y = IntConfProp(plugin_conf, "y", 0) return LyricsWindowConfig() class ConfigLabel(Gtk.Label): """Customised Label for configuration, tied to a widget""" def __init__(self, text, widget): super(Gtk.Label, self).__init__(label=text, use_underline=True) self.set_mnemonic_widget(widget) self.set_alignment(0.0, 0.5) class LyricsWindowPrefs(Gtk.VBox): def __init__(self, plugin): super(LyricsWindowPrefs, self).__init__(spacing=6) self.Conf = plugin.Conf self.plugin = plugin def build_display_widget(): vb2 = Gtk.VBox(spacing=3) hb = Gtk.HBox(spacing=6) zoom_level = Gtk.SpinButton( adjustment=Gtk.Adjustment.new( self.Conf.zoom_level, -10, 10, 0.1, 1, 0), climb_rate=0.1, digits=2) zoom_level.set_numeric(True) def change_zoom_level(button): value = float(button.get_value()) self.Conf.zoom_level = value window = self.plugin._window if window: window.set_zoom_level(value) zoom_level.connect('value-changed', change_zoom_level) l1 = ConfigLabel(_("_Zoom level:"), zoom_level) hb.pack_start(l1, False, True, 0) hb.pack_start(zoom_level, False, True, 0) vb2.pack_start(hb, False, True, 0) return vb2 def build_alternate_search_widget(): vb2 = Gtk.VBox(spacing=3) hb = Gtk.HBox(spacing=6) def on_entry_changed(entry, *args): self.Conf.alternate_search_url = entry.get_text() URL_entry = UndoEntry() URL_entry.set_text(self.Conf.alternate_search_url) URL_entry.connect("changed", on_entry_changed) l1 = ConfigLabel(_("URL:"), URL_entry) URL_revert = Gtk.Button() URL_revert.add(Gtk.Image.new_from_icon_name( Icons.DOCUMENT_REVERT, Gtk.IconSize.MENU)) URL_revert.set_tooltip_text(_("Revert to default")) connect_obj(URL_revert, "clicked", URL_entry.set_text, DEFAULT_ALTERNATE_SEARCH_URL) hb.pack_start(l1, False, True, 0) hb.pack_start(URL_entry, True, True, 0) hb.pack_start(URL_revert, False, True, 0) vb2.pack_start(hb, False, True, 0) def on_alternate_search_toggled(button, *args): self.Conf.alternate_search_enabled = button.get_active() alternate_search_enabled = Gtk.CheckButton( label=_("Search via above URL if the lyrics " "couldn't be found in LyricsWikia."), use_underline=True) alternate_search_enabled.set_active( self.Conf.alternate_search_enabled) alternate_search_enabled.connect("toggled", on_alternate_search_toggled) vb2.pack_start(alternate_search_enabled, False, True, 0) return vb2 frame = qltk.Frame(label=_("Display"), child=build_display_widget()) frame.set_border_width(6) self.pack_start(frame, False, True, 0) frame = qltk.Frame(label=_("Alternate search"), child=build_alternate_search_widget()) frame.set_border_width(6) self.pack_start(frame, False, True, 0) class LyricsWindow(EventPlugin): PLUGIN_ID = 'lyricswindow' PLUGIN_NAME = _('Lyrics Window') PLUGIN_DESC = _("Shows a window containing lyrics of the playing song.") PLUGIN_ICON = Icons.APPLICATION_INTERNET _window = None def _destroy(self, *args): self._window = None def enabled(self): if self._window is None: self._open_webview_window() def disabled(self): if self._window is not None: self._window.close() @cached_property def Conf(self): return get_config(self.PLUGIN_ID) def PluginPreferences(self, parent): return LyricsWindowPrefs(self) def _save_window_size_and_position(self, *args): window = self._window if window is not None: conf = self.Conf conf.width, conf.height = window.get_size() conf.x, conf.y = window.get_position() def _open_webview_window(self): window = LyricsWebViewWindow(self.Conf) window.show() window.connect("destroy", self._destroy) window.connect("configure-event", self._save_window_size_and_position) self._window = window return window def plugin_on_song_started(self, song): window = self._window if window is not None: window.set_song(song) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/rbimport.py����������������������������������������������������0000644�0001750�0001750�00000010221�13112005742�022235� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import xml.sax from xml.sax.handler import ContentHandler from gi.repository import Gtk from senf import uri2fsn from quodlibet import _ from quodlibet import app from quodlibet import util from quodlibet.qltk import Icons from quodlibet.qltk.msg import WarningMessage, ErrorMessage from quodlibet.util.path import expanduser, normalize_path from quodlibet.plugins.events import EventPlugin class RBDBContentHandler(ContentHandler): def __init__(self, library): ContentHandler.__init__(self) self._library = library self._current = None self._tag = None self._changed_songs = [] def characters(self, content): if self._current is not None and self._tag is not None: self._current[self._tag] = content def startElement(self, name, attrs): self._tag = None if name == "entry" and attrs.get("type") == "song": self._current = {} elif name in ("location", "rating", "play-count", "last-played"): self._tag = name def endElement(self, name): self._tag = None if name == "entry" and self._current is not None: current = self._current self._current = None if len(current) > 1: uri = current.pop("location", "") try: filename = uri2fsn(uri) except ValueError: return self._process_song(normalize_path(filename), current) def _process_song(self, path, stats): song = self._library.get(path, None) if not song: return has_changed = False if "rating" in stats: try: value = int(stats["rating"]) / 5.0 except ValueError: pass else: song["~#rating"] = value has_changed = True if "play-count" in stats: try: value = int(stats["play-count"]) except ValueError: pass else: # we could sum them, but that would break on multiple imports song["~#playcount"] = value has_changed = True if "last-played" in stats: try: value = int(stats["last-played"]) except ValueError: pass else: if value > song("~#lastplayed", 0): song["~#lastplayed"] = value has_changed = True if has_changed: self._changed_songs.append(song) def finish(self): """Call at the end, also returns amount of imported songs""" count = len(self._changed_songs) self._library.changed(self._changed_songs) self._changed_songs = [] return count def do_import(parent, library): db_path = expanduser("~/.local/share/rhythmbox/rhythmdb.xml") handler = RBDBContentHandler(library) try: xml.sax.parse(db_path, handler) except Exception: util.print_exc() handler.finish() msg = _("Import Failed") # FIXME: don't depend on the plugin class here.. ErrorMessage(parent, RBImport.PLUGIN_NAME, msg).run() else: count = handler.finish() msg = _("Successfully imported ratings and statistics " "for %d songs") % count # FIXME: this is just a warning so it works with older QL WarningMessage(parent, RBImport.PLUGIN_NAME, msg).run() class RBImport(EventPlugin): PLUGIN_ID = "rbimport" PLUGIN_NAME = _("Rhythmbox Import") PLUGIN_DESC = _("Imports ratings and song statistics from Rhythmbox.") PLUGIN_ICON = Icons.DOCUMENT_OPEN def PluginPreferences(self, *args): button = Gtk.Button(label=_("Start Import")) def clicked_cb(button): do_import(button, app.library) button.connect("clicked", clicked_cb) return button �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/jep118.py������������������������������������������������������0000644�0001750�0001750�00000002771�13112005742�021422� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import quodlibet from quodlibet import _ from quodlibet import util from quodlibet.qltk import Icons from quodlibet.plugins.events import EventPlugin outfile = os.path.join(quodlibet.get_user_dir(), "jabber") format = """\ <tune xmlns='http://jabber.org/protocol/tune'> <artist>%s</artist> <title>%s %s %d %d """ class JEP118(EventPlugin): PLUGIN_ID = "JEP-118" PLUGIN_NAME = _("JEP-118") PLUGIN_DESC = _("Outputs a Jabber User Tunes file to ~/.quodlibet/jabber.") PLUGIN_ICON = Icons.DOCUMENT_SAVE def plugin_on_song_started(self, song): if song is None: try: with open(outfile, "w") as f: f.write("") except EnvironmentError: pass else: try: with open(outfile, "wb") as f: f.write(format % ( util.escape(song.comma("artist")), util.escape(song.comma("title")), util.escape(song.comma("album")), song("~#track", 0), song.get("~#length", 0))) except EnvironmentError: pass quodlibet-3.9.1/quodlibet/ext/events/mediaserver.py0000644000175000017500000005477413112005742022732 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import os import sys if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError import tempfile from gi.repository import Gtk, GdkPixbuf from senf import fsn2uri import dbus import dbus.service from quodlibet import _ from quodlibet import app from quodlibet.plugins.events import EventPlugin from quodlibet.pattern import Pattern from quodlibet.qltk import Icons from quodlibet.util.dbusutils import DBusIntrospectable, DBusProperty from quodlibet.util.dbusutils import dbus_unicode_validate as unival from quodlibet.compat import iteritems, itervalues BASE_PATH = "/org/gnome/UPnP/MediaServer2" BUS_NAME = "org.gnome.UPnP.MediaServer2.QuodLibet" class MediaServer(EventPlugin): PLUGIN_ID = "mediaserver" PLUGIN_NAME = _("UPnP AV Media Server") PLUGIN_DESC = _("Exposes all albums to the Rygel UPnP Media Server " "through the MediaServer2 D-Bus interface.") PLUGIN_ICON = Icons.NETWORK_WORKGROUP def enabled(self): try: dbus.SessionBus() except dbus.DBusException: self.objects = [] return entry = EntryObject() albums = AlbumsObject(entry, app.library) song = SongObject(app.library, [albums]) icon = Icon(entry) self.objects = [entry, albums, song, icon] def disabled(self): for obj in self.objects: obj.remove_from_connection() for obj in self.objects: obj.destroy() del self.objects import gc gc.collect() class DBusPropertyFilter(DBusProperty): """Adds some methods to support the MediaContainer property filtering.""" def get_properties_for_filter(self, interface, filter_): props = self.get_properties(interface) if "*" not in filter_: props = [p for p in props if p[1] in filter_] return props def get_values(self, properties, path="/"): result = {} for iface, prop in properties: result[prop] = self.get_value(iface, prop, path) return result class MediaContainer(object): IFACE = "org.gnome.UPnP.MediaContainer2" ISPEC_PROP = """ """ ISPEC = """ """ def __init__(self, optional=tuple()): self.set_introspection(MediaContainer.IFACE, MediaContainer.ISPEC) props = ["ChildCount", "ItemCount", "ContainerCount", "Searchable"] props += list(optional) self.set_properties(MediaContainer.IFACE, MediaContainer.ISPEC_PROP, wl=props) self.implement_interface(MediaContainer.IFACE, MediaObject.IFACE) def emit_updated(self, path="/"): self.Updated(rel=path) @dbus.service.method(IFACE, in_signature="uuas", out_signature="aa{sv}", rel_path_keyword="path") def ListChildren(self, offset, max_, filter_, path): if self.SUPPORTS_MULTIPLE_OBJECT_PATHS: return self.list_children(offset, max_, filter_, path) return self.list_children(offset, max_, filter_) @dbus.service.method(IFACE, in_signature="uuas", out_signature="aa{sv}", rel_path_keyword="path") def ListContainers(self, offset, max_, filter_, path): if self.SUPPORTS_MULTIPLE_OBJECT_PATHS: return self.list_containers(offset, max_, filter_, path) return self.list_containers(offset, max_, filter_) @dbus.service.method(IFACE, in_signature="uuas", out_signature="aa{sv}", rel_path_keyword="path") def ListItems(self, offset, max_, filter_, path): if self.SUPPORTS_MULTIPLE_OBJECT_PATHS: return self.list_items(offset, max_, filter_, path) return self.list_items(offset, max_, filter_) @dbus.service.method(IFACE, in_signature="suuas", out_signature="aa{sv}", rel_path_keyword="path") def SearchObjects(self, query, offset, max_, filter_, path): return [] @dbus.service.signal(IFACE, rel_path_keyword="rel") def Updated(self, rel=""): pass class MediaObject(object): IFACE = "org.gnome.UPnP.MediaObject2" ISPEC = """ """ parent = None def __init__(self, parent=None): self.set_properties(MediaObject.IFACE, MediaObject.ISPEC) self.parent = parent or self class MediaItem(object): IFACE = "org.gnome.UPnP.MediaItem2" ISPEC = """ """ def __init__(self, optional=tuple()): props = ["URLs", "MIMEType"] + list(optional) self.set_properties(MediaItem.IFACE, MediaItem.ISPEC, wl=props) self.implement_interface(MediaItem.IFACE, MediaObject.IFACE) class EntryObject(MediaContainer, MediaObject, DBusPropertyFilter, DBusIntrospectable, dbus.service.Object): PATH = BASE_PATH + "/QuodLibet" DISPLAY_NAME = "@REALNAME@'s Quod Libet on @HOSTNAME@" def __init__(self): self.__sub = [] DBusIntrospectable.__init__(self) DBusPropertyFilter.__init__(self) MediaObject.__init__(self) MediaContainer.__init__(self, optional=["Icon"]) bus = dbus.SessionBus() name = dbus.service.BusName(BUS_NAME, bus) dbus.service.Object.__init__(self, bus, self.PATH, name) def get_property(self, interface, name): if interface == MediaContainer.IFACE: if name == "ChildCount": return len(self.__sub) elif name == "ItemCount": return 0 elif name == "ContainerCount": return len(self.__sub) elif name == "Searchable": return False elif name == "Icon": return Icon.PATH elif interface == MediaObject.IFACE: if name == "Parent": return self.parent.PATH elif name == "Type": return "container" elif name == "Path": return self.PATH elif name == "DisplayName": return self.DISPLAY_NAME def destroy(self): # break cycle del self.__sub del self.parent def register_child(self, child): self.__sub.append(child) self.emit_properties_changed(MediaContainer.IFACE, ["ChildCount", "ContainerCount"]) def list_containers(self, offset, max_, filter_): props = self.get_properties_for_filter(MediaContainer.IFACE, filter_) end = (max_ and offset + max_) or None result = [] for sub in self.__sub[offset:end]: result.append(sub.get_values(props)) return result list_children = list_containers def list_items(self, offset, max_, filter_): return [] SUPPORTED_SONG_PROPERTIES = ("Size", "Artist", "Album", "Date", "Genre", "Duration", "TrackNumber") class DummySongObject(MediaItem, MediaObject, DBusPropertyFilter, DBusIntrospectable): """ A dummy song object that is not exported on the bus, but supports the usual interfaces. You need to assign a real song before using it, and have to pass a path prefix. The path of the song is /org/gnome/UPnP/MediaServer2/Song//SongID This lets us reconstruct the original parent path: /org/gnome/UPnP/MediaServer2/ atm. a prefix can look like "Albums/123456" """ SUPPORTS_MULTIPLE_OBJECT_PATHS = False __pattern = Pattern( ".>. ") def __init__(self, parent): DBusIntrospectable.__init__(self) DBusPropertyFilter.__init__(self) MediaObject.__init__(self, parent) MediaItem.__init__(self, optional=SUPPORTED_SONG_PROPERTIES) def set_song(self, song, prefix): self.__song = song self.__prefix = prefix def get_property(self, interface, name): if interface == MediaObject.IFACE: if name == "Parent": return BASE_PATH + "/" + self.__prefix elif name == "Type": return "music" elif name == "Path": path = SongObject.PATH path += "/" + self.__prefix + "/" + str(id(self.__song)) return path elif name == "DisplayName": return unival(self.__song.comma("title")) elif interface == MediaItem.IFACE: if name == "URLs": return [self.__song("~uri")] elif name == "MIMEType": mimes = self.__song.mimes return mimes and mimes[0] elif name == "Size": return self.__song("~#filesize") elif name == "Artist": return unival(self.__song.comma("artist")) elif name == "Album": return unival(self.__song.comma("album")) elif name == "Date": return unival(self.__song.comma("date")) elif name == "Genre": return unival(self.__song.comma("genre")) elif name == "Duration": return self.__song("~#length") elif name == "TrackNumber": return self.__song("~#track", 0) class DummyAlbumObject(MediaContainer, MediaObject, DBusPropertyFilter, DBusIntrospectable): SUPPORTS_MULTIPLE_OBJECT_PATHS = False __pattern = Pattern("<albumartist|<~albumartist~album>|<~artist~album>>") def __init__(self, parent): DBusIntrospectable.__init__(self) DBusPropertyFilter.__init__(self) MediaObject.__init__(self, parent) MediaContainer.__init__(self) self.__song = DummySongObject(self) def get_dummy(self, song): self.__song.set_song(song, "Albums/" + str(id(self.__album))) return self.__song def set_album(self, album): self.__album = album self.PATH = self.parent.PATH + "/" + str(id(album)) def get_property(self, interface, name): if interface == MediaContainer.IFACE: if name == "ChildCount" or name == "ItemCount": return len(self.__album.songs) elif name == "ContainerCount": return 0 elif name == "Searchable": return False elif interface == MediaObject.IFACE: if name == "Parent": return self.parent.PATH elif name == "Type": return "container" elif name == "Path": return self.PATH elif name == "DisplayName": return unival(self.__pattern % self.__album) def list_containers(self, offset, max_, filter_): return [] def list_items(self, offset, max_, filter_): songs = sorted(self.__album.songs, key=lambda s: s.sort_key) dummy = self.get_dummy(None) props = dummy.get_properties_for_filter(MediaItem.IFACE, filter_) end = (max_ and offset + max_) or None result = [] for song in songs[offset:end]: result.append(self.get_dummy(song).get_values(props)) return result list_children = list_items class SongObject(MediaItem, MediaObject, DBusProperty, DBusIntrospectable, dbus.service.FallbackObject): PATH = BASE_PATH + "/Song" def __init__(self, library, users): DBusIntrospectable.__init__(self) DBusProperty.__init__(self) MediaObject.__init__(self, None) MediaItem.__init__(self, optional=SUPPORTED_SONG_PROPERTIES) bus = dbus.SessionBus() self.ref = dbus.service.BusName(BUS_NAME, bus) dbus.service.FallbackObject.__init__(self, bus, self.PATH) self.__library = library self.__map = dict((id(v), v) for v in itervalues(self.__library)) self.__reverse = dict((v, k) for k, v in iteritems(self.__map)) self.__song = DummySongObject(self) self.__users = users signals = [ ("changed", self.__songs_changed), ("removed", self.__songs_removed), ("added", self.__songs_added), ] self.__sigs = map( lambda x: self.__library.connect(x[0], x[1]), signals) def __songs_changed(self, lib, songs): # We don't know what changed, so get all properties props = [p[1] for p in self.get_properties(MediaItem.IFACE)] for song in songs: song_id = str(id(song)) # https://github.com/quodlibet/quodlibet/issues/id=1127 # XXX: Something is emitting wrong changed events.. # ignore song_ids we don't know for now if song_id not in self.__map: continue for user in self.__users: # ask the user for the prefix whith which the song is used prefix = user.get_prefix(song) path = "/" + prefix + "/" + song_id self.emit_properties_changed(MediaItem.IFACE, props, path) def __songs_added(self, lib, songs): for song in songs: new_id = id(song) self.__map[new_id] = song self.__reverse[song] = new_id def __songs_removed(self, lib, songs): for song in songs: del self.__map[self.__reverse[song]] del self.__reverse[song] def destroy(self): for signal_id in self.__sigs: self.__library.disconnect(signal_id) def get_dummy(self, song, prefix): self.__song.set_song(song, prefix) return self.__song def get_property(self, interface, name, path): # extract the prefix prefix, song_id = path[1:].rsplit("/", 1) song = self.__map[int(song_id)] return self.get_dummy(song, prefix).get_property(interface, name) class AlbumsObject(MediaContainer, MediaObject, DBusPropertyFilter, DBusIntrospectable, dbus.service.FallbackObject): PATH = BASE_PATH + "/Albums" DISPLAY_NAME = "Albums" def __init__(self, parent, library): DBusIntrospectable.__init__(self) DBusPropertyFilter.__init__(self) MediaObject.__init__(self, parent) MediaContainer.__init__(self) bus = dbus.SessionBus() self.ref = dbus.service.BusName(BUS_NAME, bus) dbus.service.FallbackObject.__init__(self, bus, self.PATH) parent.register_child(self) self.__library = library.albums self.__library.load() self.__map = dict((id(v), v) for v in itervalues(self.__library)) self.__reverse = dict((v, k) for k, v in iteritems(self.__map)) signals = [ ("changed", self.__albums_changed), ("removed", self.__albums_removed), ("added", self.__albums_added), ] self.__sigs = map( lambda x: self.__library.connect(x[0], x[1]), signals) self.__dummy = DummyAlbumObject(self) def get_dummy(self, album): self.__dummy.set_album(album) return self.__dummy def get_path_dummy(self, path): return self.get_dummy(self.__map[int(path[1:])]) def __albums_changed(self, lib, albums): for album in albums: rel_path = "/" + str(id(album)) self.emit_updated(rel_path) self.emit_properties_changed( MediaContainer.IFACE, ["ChildCount", "ItemCount", "DisplayName"], rel_path) def __albums_added(self, lib, albums): for album in albums: new_id = id(album) self.__map[new_id] = album self.__reverse[album] = new_id self.emit_updated() self.emit_properties_changed(MediaContainer.IFACE, ["ChildCount", "ContainerCount"]) def __albums_removed(self, lib, albums): for album in albums: del self.__map[self.__reverse[album]] del self.__reverse[album] self.emit_updated() self.emit_properties_changed(MediaContainer.IFACE, ["ChildCount", "ContainerCount"]) def get_prefix(self, song): album = self.__library[song.album_key] return "Albums/" + str(id(album)) def destroy(self): for signal_id in self.__sigs: self.__library.disconnect(signal_id) def __get_albums_property(self, interface, name): if interface == MediaContainer.IFACE: if name == "ChildCount": return len(self.__library) elif name == "ItemCount": return 0 elif name == "ContainerCount": return len(self.__library) elif name == "Searchable": return False elif interface == MediaObject.IFACE: if name == "Parent": return self.parent.PATH elif name == "Type": return "container" elif name == "Path": return self.PATH elif name == "DisplayName": return self.DISPLAY_NAME def get_property(self, interface, name, path): if path == "/": return self.__get_albums_property(interface, name) return self.get_path_dummy(path).get_property(interface, name) def __list_albums(self, offset, max_, filter_): props = self.get_properties_for_filter(MediaContainer.IFACE, filter_) albums = sorted(self.__library, key=lambda a: a.sort) end = (max_ and offset + max_) or None result = [] for album in albums[offset:end]: result.append(self.get_dummy(album).get_values(props)) return result def list_containers(self, offset, max_, filter_, path): if path == "/": return self.__list_albums(offset, max_, filter_) return [] def list_items(self, offset, max_, filter_, path): if path != "/": return self.get_path_dummy(path).list_items(offset, max_, filter_) return [] def list_children(self, offset, max_, filter_, path): if path == "/": return self.__list_albums(offset, max_, filter_) return self.get_path_dummy(path).list_children(offset, max_, filter_) class Icon(MediaItem, MediaObject, DBusProperty, DBusIntrospectable, dbus.service.Object): PATH = BASE_PATH + "/Icon" SIZE = 160 def __init__(self, parent): DBusIntrospectable.__init__(self) DBusProperty.__init__(self) MediaObject.__init__(self, parent=parent) MediaItem.__init__(self, optional=["Height", "Width", "ColorDepth"]) bus = dbus.SessionBus() name = dbus.service.BusName(BUS_NAME, bus) dbus.service.Object.__init__(self, bus, self.PATH, name) # https://bugzilla.gnome.org/show_bug.cgi?id=669677 self.implement_interface("org.gnome.UPnP.MediaItem1", MediaItem.IFACE) # load into a pixbuf theme = Gtk.IconTheme.get_default() pixbuf = theme.load_icon("quodlibet", Icon.SIZE, 0) # make sure the size is right pixbuf = pixbuf.scale_simple(Icon.SIZE, Icon.SIZE, GdkPixbuf.InterpType.BILINEAR) self.__depth = pixbuf.get_bits_per_sample() # save and keep reference self.__f = f = tempfile.NamedTemporaryFile() pixbuf.savev(f.name, "png", [], []) def get_property(self, interface, name): if interface == MediaObject.IFACE: if name == "Parent": return EntryObject.PATH elif name == "Type": return "image" elif name == "Path": return Icon.PATH elif name == "DisplayName": return "I'm an icon \o/" elif interface == MediaItem.IFACE: if name == "URLs": return [fsn2uri(self.__f.name)] elif name == "MIMEType": return "image/png" elif name == "Width" or name == "Height": return Icon.SIZE elif name == "ColorDepth": return self.__depth def destroy(self): pass ����quodlibet-3.9.1/quodlibet/ext/events/screensaver.py�������������������������������������������������0000644�0001750�0001750�00000005457�13112005742�022736� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011,2014 Christoph Reiter <reiter.christoph@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import os import sys if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError import dbus from quodlibet import _ from quodlibet import app from quodlibet.qltk import Icons from quodlibet.plugins.events import EventPlugin class ScreensaverPause(EventPlugin): PLUGIN_ID = "screensaver_pause" PLUGIN_NAME = _("Screensaver Pause") PLUGIN_DESC = _("Pauses playback while the GNOME screensaver is active.") PLUGIN_ICON = Icons.MEDIA_PLAYBACK_PAUSE DBUS_NAME = "org.gnome.ScreenSaver" DBUS_INTERFACE = "org.gnome.ScreenSaver" DBUS_PATH = "/org/gnome/ScreenSaver" __was_paused = False __ignore_next = False __interface = None __active = False __watch = None def __screensaver_changed(self, active): # Gnome-Shell fires ActiveChanged even if it doesn't change # (aborted transition to lock screen), so handle that if active == self.__active: return self.__active = active if active: self.__was_paused = app.player.paused app.player.paused = True elif not self.__was_paused and not self.__ignore_next: app.player.paused = False self.__ignore_next = False def plugin_on_unpaused(self): # In case pause/unpause happens while the session is inactive # (mpris, remote, etc.) don't unpause when it gets active again self.__ignore_next = True plugin_on_paused = plugin_on_unpaused def __remove_interface(self): if self.__interface: self.__sig.remove() self.__interface = None def __owner_changed(self, owner): if not owner: self.__remove_interface() elif not self.__interface: bus = dbus.SessionBus() obj = bus.get_object(self.DBUS_NAME, self.DBUS_PATH) iface = dbus.Interface(obj, self.DBUS_INTERFACE) self.__sig = iface.connect_to_signal("ActiveChanged", self.__screensaver_changed) self.__active = iface.GetActive() self.__interface = iface def enabled(self): try: bus = dbus.SessionBus() self.__watch = bus.watch_name_owner(self.DBUS_NAME, self.__owner_changed) except dbus.DBusException: pass def disabled(self): if self.__watch: self.__watch.cancel() self.__remove_interface() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/synchronizedlyrics.py������������������������������������������0000644�0001750�0001750�00000024105�13112005742�024352� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Synchronized Lyrics: a Quod Libet plugin for showing synchronized lyrics. # Copyright (C) 2015 elfalem # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Provides `Synchronized Lyrics` plugin for showing synchronized lyrics.""" import os from datetime import datetime from gi.repository import Gtk, Gdk, GLib from quodlibet.qltk import Icons from quodlibet.util.dprint import print_d from quodlibet import _ from quodlibet import app from quodlibet import qltk from quodlibet.plugins import PluginConfigMixin from quodlibet.plugins.events import EventPlugin class SynchronizedLyrics(EventPlugin, PluginConfigMixin): PLUGIN_ID = 'SynchronizedLyrics' PLUGIN_NAME = _('Synchronized Lyrics') PLUGIN_DESC = _('Shows synchronized lyrics from .lrc file with same name \ as the track.') PLUGIN_ICON = Icons.FORMAT_JUSTIFY_FILL SYNC_PERIOD = 3000 DEFAULT_BGCOLOR = '#343428282C2C' DEFAULT_TXTCOLOR = '#FFFFFFFFFFFF' DEFAULT_FONTSIZE = 25 CFG_BGCOLOR_KEY = "backgroundColor" CFG_TXTCOLOR_KEY = "textColor" CFG_FONTSIZE_KEY = "fontSize" _lines = [] _timers = [] _currentLrc = "" def PluginPreferences(cls, window): vb = Gtk.VBox(spacing=6) vb.set_border_width(6) t = Gtk.Table(n_rows=5, n_columns=2, homogeneous=True) t.set_col_spacings(6) t.set_row_spacings(3) clrSection = Gtk.Label() clrSection.set_markup("<b>" + _("Colors") + "</b>") t.attach(clrSection, 0, 2, 0, 1) l = Gtk.Label(label=_("Text:")) l.set_alignment(xalign=1.0, yalign=0.5) t.attach(l, 0, 1, 1, 2, xoptions=Gtk.AttachOptions.FILL) c = Gdk.RGBA() c.parse(cls._get_text_color()) b = Gtk.ColorButton(rgba=c) t.attach(b, 1, 2, 1, 2) b.connect('color-set', cls._set_text_color) l = Gtk.Label(label=_("Background:")) l.set_alignment(xalign=1.0, yalign=0.5) t.attach(l, 0, 1, 2, 3, xoptions=Gtk.AttachOptions.FILL) c = Gdk.RGBA() c.parse(cls._get_background_color()) b = Gtk.ColorButton(rgba=c) t.attach(b, 1, 2, 2, 3) b.connect('color-set', cls._set_background_color) fontSection = Gtk.Label() fontSection.set_markup("<b>" + _("Font") + "</b>") t.attach(fontSection, 0, 2, 3, 4) l = Gtk.Label(label=_("Size (px):")) l.set_alignment(xalign=1.0, yalign=0.5) t.attach(l, 0, 1, 4, 5, xoptions=Gtk.AttachOptions.FILL) a = Gtk.Adjustment.new(cls._get_font_size(), 6, 36, 1, 3, 0) s = Gtk.SpinButton(adjustment=a) s.set_numeric(True) s.set_text(str(cls._get_font_size())) t.attach(s, 1, 2, 4, 5) s.connect('value-changed', cls._set_font_size) vb.pack_start(t, False, False, 0) return vb def _get_text_color(self): v = self.config_get(self.CFG_TXTCOLOR_KEY, self.DEFAULT_TXTCOLOR) return v[:3] + v[5:7] + v[9:11] def _get_background_color(self): v = self.config_get(self.CFG_BGCOLOR_KEY, self.DEFAULT_BGCOLOR) return v[:3] + v[5:7] + v[9:11] def _get_font_size(self): return int(self.config_get(self.CFG_FONTSIZE_KEY, self.DEFAULT_FONTSIZE)) def _set_text_color(self, button): self.config_set(self.CFG_TXTCOLOR_KEY, button.get_color().to_string()) self._style_lyrics_window() def _set_background_color(self, button): self.config_set(self.CFG_BGCOLOR_KEY, button.get_color().to_string()) self._style_lyrics_window() def _set_font_size(self, sButton): self.config_set(self.CFG_FONTSIZE_KEY, sButton.get_value_as_int()) self._style_lyrics_window() def enabled(self): self.scrolled_window = Gtk.ScrolledWindow() self.scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.adjustment = self.scrolled_window.get_vadjustment() self.textview = Gtk.TextView() self.textbuffer = self.textview.get_buffer() self.textview.set_editable(False) self.textview.set_cursor_visible(False) self.textview.set_wrap_mode(Gtk.WrapMode.WORD) self.textview.set_justification(Gtk.Justification.CENTER) self.scrolled_window.add_with_viewport(self.textview) self.textview.show() app.window.get_child().pack_start(self.scrolled_window, False, True, 0) app.window.get_child().reorder_child(self.scrolled_window, 2) self._style_lyrics_window() self.adjustment.set_value(0) self.scrolled_window.show() self._syncTimer = GLib.timeout_add(self.SYNC_PERIOD, self._sync) self._build_data() self._timer_control() def disabled(self): self._clear_timers() GLib.source_remove(self._syncTimer) self.textview.destroy() self.scrolled_window.destroy() def _style_lyrics_window(self): qltk.add_css(self.textview, """ * {{ background-color: {0}; color: {1}; font-size: {2}px; font-weight: bold; }} """.format(self._get_background_color(), self._get_text_color(), self._get_font_size())) def _cur_position(self): return app.player.get_position() def _build_data(self): self.textbuffer.set_text("") if app.player.song is not None: #check in same location as track trackName = app.player.song.get("~filename") newLrc = os.path.splitext(trackName)[0] + ".lrc" print_d("Checking for lyrics file %s" % newLrc) if self._currentLrc != newLrc: self._lines = [] if os.path.exists(newLrc): print_d("Found lyrics: %s" % newLrc) self._parse_lrc_file(newLrc) self._currentLrc = newLrc def _parse_lrc_file(self, filename): rawFile = "" with open(filename, 'r') as lrcfile: rawFile = lrcfile.read() rawFile = rawFile.replace("\n", "") begin = 0 keepReading = len(rawFile) != 0 tmp_dict = {} compressed = [] while keepReading: lyricsLine = "" nextFind = rawFile.find("[", begin + 1) if(nextFind == -1): keepReading = False lyricsLine = rawFile[begin:] else: lyricsLine = rawFile[begin:nextFind] begin = nextFind #parse lyricsLine if not lyricsLine[1].isdigit(): continue closeBracket = lyricsLine.find("]") timeObject = datetime.strptime(lyricsLine[1:closeBracket], '%M:%S.%f') timeStamp = (timeObject.minute * 60000 + timeObject.second * 1000 + timeObject.microsecond / 1000) words = lyricsLine[closeBracket + 1:] if words == "": compressed.append(timeStamp) else: tmp_dict[timeStamp] = words for t in compressed: tmp_dict[t] = words compressed = [] keys = tmp_dict.keys() keys.sort() for key in keys: self._lines.append((key, tmp_dict[key])) del keys del tmp_dict def _set_timers(self): if len(self._timers) == 0: curTime = self._cur_position() curIndex = self._greater(self._lines, curTime) if curIndex != -1: while (curIndex < len(self._lines) and self._lines[curIndex][0] < curTime + self.SYNC_PERIOD): timeStamp = self._lines[curIndex][0] lyricsLine = self._lines[curIndex][1] timerId = GLib.timeout_add(timeStamp - curTime, self._show, lyricsLine) self._timers.append((timeStamp, timerId)) curIndex += 1 def _sync(self): if not app.player.paused: self._clear_timers() self._set_timers() return True def _timer_control(self): if app.player.paused: self._clear_timers() else: self._set_timers() return False def _clear_timers(self): curIndex = 0 while curIndex < len(self._timers): GLib.source_remove(self._timers[curIndex][1]) curIndex += 1 self._timers = [] def _show(self, line): self.textbuffer.set_text(line) print_d("♪ %s ♪" % line.strip()) return False def plugin_on_song_started(self, song): self._build_data() #delay so that current position is for current track, not previous one GLib.timeout_add(5, self._timer_control) def plugin_on_song_ended(self, song, stopped): self._clear_timers() def plugin_on_paused(self): self._timer_control() def plugin_on_unpaused(self): self._timer_control() def plugin_on_seek(self, song, msec): if not app.player.paused: self._clear_timers() self._set_timers() def _greater(self, array, probe): length = len(array) if length == 0: return -1 elif probe < array[0][0]: return 0 elif probe >= array[length - 1][0]: return length else: return self._search(array, probe, 0, length - 1) def _search(self, array, probe, lower, upper): if lower == upper: if array[lower][0] <= probe: return lower + 1 else: return lower else: middle = int((lower + upper) / 2) if array[middle][0] <= probe: return self._search(array, probe, middle + 1, upper) else: return self._search(array, probe, lower, middle) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/events/qlscrobbler.py�������������������������������������������������0000644�0001750�0001750�00000050735�13112005742�022727� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # QLScrobbler: an Audioscrobbler client plugin for Quod Libet. # version 0.11 # (C) 2005-2016 by Joshua Kwan <joshk@triplehelix.org>, # Joe Wreschnig <piman@sacredchao.net>, # Franz Pletyz <fpletz@franz-pletz.org>, # Nicholas J. Michalek <djphazer@gmail.com>, # Steven Robertson <steven@strobe.cc> # Nick Boultbee <nick.boultbee@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import threading import time from gi.repository import Gtk, GLib try: from hashlib import md5 except ImportError: from md5 import md5 import quodlibet from quodlibet import _ from quodlibet import const, app, util, qltk from quodlibet.pattern import Pattern from quodlibet.query import Query from quodlibet.plugins.events import EventPlugin from quodlibet.plugins import PluginConfig from quodlibet.qltk.entry import ValidatingEntry, UndoEntry from quodlibet.qltk.msg import Message from quodlibet.qltk import Icons from quodlibet.util.dprint import print_d from quodlibet.util.picklehelper import pickle_load, pickle_dump, PickleError from quodlibet.compat import urlencode from quodlibet.util.urllib import urlopen SERVICES = { 'Last.fm': 'http://post.audioscrobbler.com/', 'Libre.fm': 'http://turtle.libre.fm/' } DEFAULT_SERVICE = 'Last.fm' DEFAULT_TITLEPAT = '<title><version| (<version>)>' DEFAULT_ARTISTPAT = '<artist|<artist>|<composer|<composer>|<performer>>>' plugin_config = PluginConfig("scrobbler") defaults = plugin_config.defaults defaults.set("service", DEFAULT_SERVICE) defaults.set("titlepat", "") defaults.set("artistpat", "") defaults.set("url", "") defaults.set("username", "") defaults.set("password", "") defaults.set("exclude", "") defaults.set("offline", False) def config_get_url(): """Gets the URL for the currently configured service. This logic was used often enough to be split out from generic config """ # TODO: share this between the classes better service = plugin_config.get('service') if service in SERVICES: return SERVICES[service] else: return plugin_config.get('url') def config_get_title_pattern(): return plugin_config.get('titlepat') or DEFAULT_TITLEPAT def config_get_artist_pattern(): return plugin_config.get('artistpat') or DEFAULT_ARTISTPAT class QLSubmitQueue(object): """Manages the submit queue for scrobbles. Works independently of the QLScrobbler plugin being enabled; other plugins may use submit() to queue songs for scrobbling. """ CLIENT = "qlb" CLIENT_VERSION = const.VERSION PROTOCOL_VERSION = "1.2" DUMP = os.path.join(quodlibet.get_user_dir(), "scrobbler_cache") # These objects are shared across instances, to allow other plugins to # queue scrobbles in future versions of QL queue = [] changed_event = threading.Event() def set_nowplaying(self, song): """Send a Now Playing notification.""" formatted = self._format_song(song) if not formatted or self.nowplaying_song == formatted: return self.nowplaying_song = formatted self.nowplaying_sent = False self.changed() def submit(self, song, timestamp=0): """Submit a song. If 'timestamp' is 0, the current time will be used.""" formatted = self._format_song(song) if formatted is None: return if timestamp > 0: formatted['i'] = str(timestamp) elif timestamp == 0: formatted['i'] = str(int(time.time())) else: # TODO: Forging timestamps for submission from PMPs return self.queue.append(formatted) self.changed() def _format_song(self, song): """Returns a dict with the keys formatted as required by spec.""" store = { "l": str(song.get("~#length", 0)), "n": str(song("~#track")), "b": song.comma("album"), "m": song("musicbrainz_trackid"), "t": self.titlepat.format(song), "a": self.artpat.format(song), } # Spec requires title and artist at minimum if not (store.get("a") and store.get("t")): return None return store def __init__(self): self.nowplaying_song = None self.nowplaying_sent = False self.sessionid = None self.broken = False self.username, self.password, self.base_url = ('', '', '') # These need to be set early for _format_song to work self.titlepat = Pattern(config_get_title_pattern()) self.artpat = Pattern(config_get_artist_pattern()) try: with open(self.DUMP, 'rb') as disk_queue_file: disk_queue = pickle_load(disk_queue_file) os.unlink(self.DUMP) self.queue += disk_queue except (EnvironmentError, PickleError): pass @classmethod def dump_queue(klass): if klass.queue: try: with open(klass.DUMP, 'wb') as disk_queue_file: pickle_dump(klass.queue, disk_queue_file) except (EnvironmentError, PickleError): pass def _check_config(self): user = plugin_config.get('username') passw = md5(plugin_config.get('password')).hexdigest() url = config_get_url() if not user or not passw or not url: if self.queue and not self.broken: self.quick_dialog(_("Please visit the Plugins window to set " "QLScrobbler up. Until then, songs will not be " "submitted."), Gtk.MessageType.INFO) self.broken = True elif (self.username, self.password, self.base_url) != (user, passw, url): self.username, self.password, self.base_url = (user, passw, url) self.broken = False self.handshake_sent = False self.offline = plugin_config.getboolean('offline') self.titlepat = Pattern(config_get_title_pattern()) self.artpat = Pattern(config_get_artist_pattern()) def changed(self): """Signal that settings or queue contents were changed.""" self._check_config() if not self.broken and not self.offline and (self.queue or (self.nowplaying_song and not self.nowplaying_sent)): self.changed_event.set() return self.changed_event.clear() def run(self): """Submit songs from the queue. Call from a daemon thread.""" # The spec calls for exponential backoff of failed handshakes, with a # minimum of 1m and maximum of 120m delay between attempts. self.handshake_sent = False self.handshake_event = threading.Event() self.handshake_event.set() self.handshake_delay = 1 self.failures = 0 while True: self.changed_event.wait() if not self.handshake_sent: self.handshake_event.wait() if self.send_handshake(): self.failures = 0 self.handshake_delay = 1 self.handshake_sent = True else: self.handshake_event.clear() self.handshake_delay = min(self.handshake_delay * 2, 120) GLib.timeout_add(self.handshake_delay * 60 * 1000, self.handshake_event.set) continue self.changed_event.wait() if self.queue: if self.send_submission(): self.failures = 0 else: self.failures += 1 if self.failures >= 3: self.handshake_sent = False elif self.nowplaying_song and not self.nowplaying_sent: self.send_nowplaying() self.nowplaying_sent = True else: # Nothing left to do; wait until something changes self.changed_event.clear() def send_handshake(self, show_dialog=False): # construct url stamp = int(time.time()) auth = md5(self.password + str(stamp)).hexdigest() url = "%s/?hs=true&p=%s&c=%s&v=%s&u=%s&a=%s&t=%d" % ( self.base_url, self.PROTOCOL_VERSION, self.CLIENT, self.CLIENT_VERSION, self.username, auth, stamp) print_d("Sending handshake to service.") try: resp = urlopen(url) except EnvironmentError: if show_dialog: self.quick_dialog( _("Could not contact service '%s'.") % util.escape(self.base_url), Gtk.MessageType.ERROR) else: print_d("Could not contact service. Queueing submissions.") return False except ValueError: self.quick_dialog(_("Authentication failed: invalid URL."), Gtk.MessageType.ERROR) self.broken = True return False # check response lines = resp.read().rstrip().split("\n") status = lines.pop(0) print_d("Handshake status: %s" % status) if status == "OK": self.session_id, self.nowplaying_url, self.submit_url = lines self.handshake_sent = True print_d("Session ID: %s, NP URL: %s, Submit URL: %s" % ( self.session_id, self.nowplaying_url, self.submit_url)) return True elif status == "BADAUTH": self.quick_dialog(_("Authentication failed: Invalid username '%s' " "or bad password.") % util.escape(self.username), Gtk.MessageType.ERROR) self.broken = True elif status == "BANNED": self.quick_dialog(_("Client is banned. Contact the author."), Gtk.MessageType.ERROR) self.broken = True elif status == "BADTIME": self.quick_dialog(_("Wrong system time. Submissions may fail " "until it is corrected."), Gtk.MessageType.ERROR) else: # "FAILED" self.quick_dialog(util.escape(status), Gtk.MessageType.ERROR) self.changed() return False def _check_submit(self, url, data): data_str = urlencode(data) try: resp = urlopen(url, data_str) except EnvironmentError: print_d("Audioscrobbler server not responding, will try later.") return False resp_save = resp.read() status = resp_save.rstrip().split("\n")[0] print_d("Submission status: %s" % status) if status == "OK": return True elif status == "BADSESSION": self.handshake_sent = False return False else: return False def send_submission(self): data = {'s': self.session_id} to_submit = self.queue[:min(len(self.queue), 50)] for idx, song in enumerate(to_submit): for key, val in song.items(): data['%s[%d]' % (key, idx)] = val.encode('utf-8') data['o[%d]' % idx] = 'P' data['r[%d]' % idx] = '' print_d('Submitting song(s): %s' % ('\n\t'.join(['%s - %s' % (s['a'], s['t']) for s in to_submit]))) if self._check_submit(self.submit_url, data): del self.queue[:len(to_submit)] return True else: return False def send_nowplaying(self): data = {'s': self.session_id} for key, val in self.nowplaying_song.items(): data[key] = val.encode('utf-8') print_d('Now playing song: %s - %s' % (self.nowplaying_song['a'], self.nowplaying_song['t'])) return self._check_submit(self.nowplaying_url, data) def quick_dialog_helper(self, dialog_type, msg): dialog = Message(dialog_type, app.window, "QLScrobbler", msg) dialog.connect('response', lambda dia, resp: dia.destroy()) dialog.show() def quick_dialog(self, msg, dialog_type): GLib.idle_add(self.quick_dialog_helper, dialog_type, msg) class QLScrobbler(EventPlugin): PLUGIN_ID = "QLScrobbler" PLUGIN_NAME = _("AudioScrobbler Submission") PLUGIN_DESC = _("Audioscrobbler client for Last.fm, Libre.fm and other " "Audioscrobbler services.") PLUGIN_ICON = Icons.NETWORK_WORKGROUP def __init__(self): self.__enabled = False self.queue = QLSubmitQueue() queue_thread = threading.Thread(None, self.queue.run) queue_thread.setDaemon(True) queue_thread.start() self.start_time = 0 self.unpaused_time = 0 self.elapsed = 0 self.nowplaying = None self.exclude = plugin_config.get('exclude') def plugin_on_song_ended(self, song, stopped): if song is None or not self.__enabled: return if self.unpaused_time > 0: self.elapsed += time.time() - self.unpaused_time # Spec: * don't submit when song length < 00:30 # * submit at end of playback (not in the middle, as with v1.1) # * submit if played for >= .5*length or >= 240s # we check 'elapsed' rather than 'length' to work around wrong ~#length if self.elapsed < 30: return if self.elapsed < 240 and self.elapsed <= .5 * song.get("~#length", 0): return print_d("Checking against filter %s" % self.exclude) if self.exclude and Query(self.exclude).search(song): print_d("Not submitting: %s" % song("~artist~title")) return self.queue.submit(song, self.start_time) def song_excluded(self, song): if self.exclude and Query(self.exclude).search(song): print_d("%s is excluded by %s" % (song("~artist~title"), self.exclude)) return True return False def send_nowplaying(self, song): if not self.song_excluded(song): self.queue.set_nowplaying(song) def plugin_on_song_started(self, song): if song is None: return self.start_time = int(time.time()) if app.player.paused: self.unpaused_time = 0 else: self.unpaused_time = time.time() self.elapsed = 0 if self.__enabled and not app.player.paused: self.send_nowplaying(song) else: self.nowplaying = song def plugin_on_paused(self): if self.unpaused_time > 0: self.elapsed += time.time() - self.unpaused_time self.unpaused_time = 0 def plugin_on_unpaused(self): self.unpaused_time = time.time() if self.__enabled and self.nowplaying: self.send_nowplaying(self.nowplaying) self.nowplaying = None def enabled(self): self.__enabled = True print_d("Plugin enabled - accepting new songs.") def disabled(self): self.__enabled = False print_d("Plugin disabled - not accepting any new songs.") QLSubmitQueue.dump_queue() def PluginPreferences(self, parent): def changed(entry, key): if entry.get_property('sensitive'): plugin_config.set(key, entry.get_text()) def combo_changed(widget, urlent): service = widget.get_active_text() plugin_config.set("service", service) urlent.set_sensitive((service not in SERVICES)) urlent.set_text(config_get_url()) def check_login(*args): queue = QLSubmitQueue() queue.changed() status = queue.send_handshake(show_dialog=True) if status: queue.quick_dialog(_("Authentication successful."), Gtk.MessageType.INFO) box = Gtk.VBox(spacing=12) # first frame table = Gtk.Table(n_rows=5, n_columns=2) table.props.expand = False table.set_col_spacings(6) table.set_row_spacings(6) labels = [] label_names = [_("_Service:"), _("_URL:"), _("User_name:"), _("_Password:")] for idx, name in enumerate(label_names): label = Gtk.Label(label=name) label.set_alignment(0.0, 0.5) label.set_use_underline(True) table.attach(label, 0, 1, idx, idx + 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) labels.append(label) row = 0 service_combo = Gtk.ComboBoxText() table.attach(service_combo, 1, 2, row, row + 1) cur_service = plugin_config.get('service') # Translators: Other service other_label = _(u"Other…") for idx, serv in enumerate(sorted(SERVICES.keys()) + [other_label]): service_combo.append_text(serv) if cur_service == serv: service_combo.set_active(idx) if service_combo.get_active() == -1: service_combo.set_active(0) labels[row].set_mnemonic_widget(service_combo) row += 1 # url entry = UndoEntry() entry.set_text(plugin_config.get('url')) entry.connect('changed', changed, 'url') service_combo.connect('changed', combo_changed, entry) service_combo.emit('changed') table.attach(entry, 1, 2, row, row + 1) labels[row].set_mnemonic_widget(entry) row += 1 # username entry = UndoEntry() entry.set_text(plugin_config.get('username')) entry.connect('changed', changed, 'username') table.attach(entry, 1, 2, row, row + 1) labels[row].set_mnemonic_widget(entry) row += 1 # password entry = UndoEntry() entry.set_text(plugin_config.get('password')) entry.set_visibility(False) entry.connect('changed', changed, 'password') table.attach(entry, 1, 2, row, row + 1) labels[row].set_mnemonic_widget(entry) row += 1 # verify data button = qltk.Button(_("_Verify account data"), Icons.DIALOG_INFORMATION) button.connect('clicked', check_login) table.attach(button, 0, 2, 4, 5) box.pack_start(qltk.Frame(_("Account"), child=table), True, True, 0) # second frame table = Gtk.Table(n_rows=4, n_columns=2) table.props.expand = False table.set_col_spacings(6) table.set_row_spacings(6) label_names = [_("_Artist pattern:"), _("_Title pattern:"), _("Exclude _filter:")] labels = [] for idx, name in enumerate(label_names): label = Gtk.Label(label=name) label.set_alignment(0.0, 0.5) label.set_use_underline(True) table.attach(label, 0, 1, idx, idx + 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) labels.append(label) row = 0 # artist pattern entry = UndoEntry() entry.set_text(plugin_config.get('artistpat')) entry.connect('changed', changed, 'artistpat') table.attach(entry, 1, 2, row, row + 1) entry.set_tooltip_text(_("The pattern used to format " "the artist name for submission. Leave blank for default.")) labels[row].set_mnemonic_widget(entry) row += 1 # title pattern entry = UndoEntry() entry.set_text(plugin_config.get('titlepat')) entry.connect('changed', changed, 'titlepat') table.attach(entry, 1, 2, row, row + 1) entry.set_tooltip_text(_("The pattern used to format " "the title for submission. Leave blank for default.")) labels[row].set_mnemonic_widget(entry) row += 1 # exclude filter entry = ValidatingEntry(Query.validator) entry.set_text(plugin_config.get('exclude')) entry.set_tooltip_text( _("Songs matching this filter will not be submitted.")) entry.connect('changed', changed, 'exclude') table.attach(entry, 1, 2, row, row + 1) labels[row].set_mnemonic_widget(entry) row += 1 # offline mode offline = plugin_config.ConfigCheckButton( _("_Offline mode (don't submit anything)"), 'offline', populate=True) table.attach(offline, 0, 2, row, row + 1) box.pack_start(qltk.Frame(_("Submission"), child=table), True, True, 0) return box �����������������������������������quodlibet-3.9.1/quodlibet/ext/query/����������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017670� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/query/pythonexpression.py���������������������������������������������0000644�0001750�0001750�00000001713�13112005742�023707� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Ryan Dellenbaugh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.plugins.query import QueryPlugin, QueryPluginError class PythonQuery(QueryPlugin): PLUGIN_ID = "python_query" PLUGIN_NAME = _("Python Query") PLUGIN_DESC = _("Use Python expressions in queries. Syntax is '@(python: " "expression)'. The variable 's' is the song being matched.") key = 'python' def search(self, data, body): try: return eval(body, {'s': data}) except: return False def parse_body(self, body): if body is None: raise QueryPluginError try: return compile(body.strip(), 'query', 'eval') except SyntaxError: raise QueryPluginError �����������������������������������������������������quodlibet-3.9.1/quodlibet/ext/query/savedsearch.py��������������������������������������������������0000644�0001750�0001750�00000003607�13112005742�022542� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Ryan Dellenbaugh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os.path from quodlibet import _ from quodlibet.plugins.query import QueryPlugin, QueryPluginError from quodlibet.query import Query from quodlibet.query._match import error as QueryError from quodlibet import get_user_dir class IncludeSavedSearchQuery(QueryPlugin): PLUGIN_ID = "include_saved" PLUGIN_NAME = _("Include Saved Search") PLUGIN_DESC = _("Include the results of a saved search as part of another " "query. Syntax is '@(saved: search name)'.") key = 'saved' def search(self, data, body): return body.search(data) def parse_body(self, body, query_path_=None): if body is None: raise QueryPluginError body = body.strip().lower() # Use provided query file for testing if query_path_: query_path = query_path_ else: query_path = os.path.join(get_user_dir(), 'lists', 'queries.saved') try: with open(query_path, 'rU') as query_file: for query_string in query_file: name = next(query_file).strip().lower() if name == body: try: return Query(query_string.strip()) except QueryError: raise QueryPluginError # We've searched the whole file and haven't found a match raise QueryPluginError except IOError: raise QueryPluginError except StopIteration: # The file has an odd number of lines. This shouldn't happen unless # it has been externally modified raise QueryPluginError �������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/query/__init__.py�����������������������������������������������������0000644�0001750�0001750�00000000317�13112005742�022004� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/query/conditional.py��������������������������������������������������0000644�0001750�0001750�00000002072�13112005742�022550� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Ryan Dellenbaugh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.plugins.query import QueryPlugin, QueryPluginError from quodlibet.query._parser import QueryParser class ConditionalQuery(QueryPlugin): PLUGIN_ID = "conditional_query" PLUGIN_NAME = _("Conditional Query") PLUGIN_DESC = _("Chooses the query to match based on a condition query. " "Syntax is '@(if: condition, then, else)'.") key = 'if' def search(self, data, body): if body[0].search(data): return body[1].search(data) else: return body[2].search(data) def parse_body(self, body): if body is None: raise QueryPluginError parser = QueryParser(body) queries = parser.match_list(parser.Query) if len(queries) != 3: raise QueryPluginError return queries ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020541� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/filterbrowser.py��������������������������������������������0000644�0001750�0001750�00000002107�13112005742�024006� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet import app from quodlibet import browsers from quodlibet.plugins.songshelpers import any_song, is_a_file from quodlibet.qltk.browser import LibraryBrowser from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin class FilterBrowser(SongsMenuPlugin): PLUGIN_ID = 'filterbrowser' PLUGIN_NAME = _('Filter on Directory') PLUGIN_DESC = _("Filters on directory in a new browser window.") PLUGIN_ICON = Icons.EDIT_SELECT_ALL plugin_songs = any_song(is_a_file) def plugin_songs(self, songs): tag = "~dirname" values = [] for song in songs: values.extend(song.list(tag)) browser = LibraryBrowser.open( browsers.get("SearchBar"), app.library, app.player) browser.browser.filter(tag, set(values)) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/wikipedia.py������������������������������������������������0000644�0001750�0001750�00000004301�13112005742�023061� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Inigo Serna # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet import config from quodlibet.util import website from quodlibet.qltk.entry import Entry from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.compat import quote WIKI_URL = "https://%s.wikipedia.org/wiki/Special:Search/" def get_lang(): return config.get("plugins", __name__, "en") def set_lang(value): config.set("plugins", __name__, value) class WikiSearch(object): PLUGIN_ICON = Icons.APPLICATION_INTERNET @classmethod def changed(self, e): set_lang(e.get_text()) @classmethod def PluginPreferences(self, parent): hb = Gtk.HBox(spacing=3) hb.set_border_width(6) e = Entry(max_length=2) e.set_width_chars(3) e.set_max_width_chars(3) e.set_text(get_lang()) e.connect('changed', self.changed) hb.pack_start( Gtk.Label(label=_("Search at %(website)s") % { "website": "https://"}), False, True, 0) hb.pack_start(e, False, True, 0) hb.pack_start(Gtk.Label(label=".wikipedia.org"), False, True, 0) hb.show_all() return hb def plugin_songs(self, songs): l = dict.fromkeys([song(self.k) for song in songs]).keys() for a in l: a = quote(str(a).title().replace(' ', '_')) website(WIKI_URL % get_lang() + a) class WikiArtist(WikiSearch, SongsMenuPlugin): PLUGIN_ID = 'Search artist in Wikipedia' PLUGIN_NAME = _('Search Artist in Wikipedia') PLUGIN_DESC = _('Opens a browser window with Wikipedia article ' 'on the playing song artist.') k = 'artist' class WikiAlbum(WikiSearch, SongsMenuPlugin): PLUGIN_ID = 'Search album in Wikipedia' PLUGIN_NAME = _('Search Album in Wikipedia') PLUGIN_DESC = _('Opens a browser window with Wikipedia article ' 'on the playing song album.') k = 'album' �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/tapbpm.py���������������������������������������������������0000644�0001750�0001750�00000014422�13112005742�022403� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Didier Villevalois, # 2010 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gdk, Gtk from quodlibet import _ from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk import Icons from quodlibet.qltk.window import Dialog class TapBpmPanel(Gtk.VBox): def __init__(self, parent, song): super(Gtk.VBox, self).__init__() self.dialog = parent self.song = song self.original_bpm = float(song["bpm"]) if "bpm" in song else 0.0 self.set_margin_bottom(6) self.set_spacing(6) box = Gtk.HBox() box.set_spacing(6) # TRANSLATORS: BPM mean "beats per minute" box.pack_start(Gtk.Label(_("BPM:")), False, True, 0) self.bpm_label = Gtk.Label(_("n/a")) self.bpm_label.set_xalign(0.5) box.pack_start(self.bpm_label, True, True, 0) self.reset_btn = Gtk.Button(label=_("Reset")) self.reset_btn.connect('clicked', lambda *x: self.reset()) box.pack_end(self.reset_btn, False, True, 0) self.pack_start(box, False, True, 0) self.tap_btn = Gtk.Button(label=_("Tap")) self.tap_btn.connect('button-press-event', self.tap) self.tap_btn.connect('key-press-event', self.key_tap) self.pack_start(self.tap_btn, True, True, 0) self.init_tap() self.update() self.show_all() def update(self): has_new_bpm = self.floating_bpm != self.original_bpm self.dialog.set_response_sensitive(Gtk.ResponseType.OK, has_new_bpm) self.reset_btn.set_sensitive(has_new_bpm) if self.floating_bpm != 0.0: self.bpm_label.set_text("%.1f" % self.floating_bpm) else: self.bpm_label.set_text(_("n/a")) # Give focus back to the tap button even if reset was pressed self.tap_btn.grab_focus() def tap(self, widget, event): self.count_tap(event.time) self.update() def key_tap(self, widget, event): if event.keyval != Gdk.KEY_space \ and event.keyval != Gdk.KEY_Return: return False self.count_tap(event.time) self.update() return True def reset(self): self.init_tap() self.update() def save(self): self.song["bpm"] = "%.0f" % self.floating_bpm self.song.write() def init_tap(self): self.bpm = 0.0 self.clicks = 0 self.last = 0 self.last_times = [] self.last_bpms = [] self.last_floating_bpms = [] self.last_floating_squares = [] self.bpms_sum = 0.0 self.squares_sum = 0.0 self.average_count = 0 self.min = 0 self.max = 0 self.floating_bpm = self.original_bpm self.floating_square = 0.0 self.keep = 100 self.pause = 3 self.min_weight = 0.01 def count_tap(self, now): now = now / 1000. # reset? if now - self.last > self.pause: self.clicks = 0 self.bpm = 0.0 self.last_times = [] self.last_bpms = [] self.last_floating_bpms = [] self.last_floating_squares = [] self.bpms_sum = 0.0 self.squares_sum = 0.0 self.average_count = 0 self.min = 0 self.max = 0 self.floating_bpm = 0.0 self.floating_square = 0.0 elif now > self.last: # Use previous 5 values to average BPM bpms = [] bpms.append(60.0 / (now - self.last)) # and four out of the list for i in iter(range(1, 5)): if len(self.last_times) <= i: break bpms.append((i + 1) * 60.0 / (now - self.last_times[-i])) self.bpm = sum(bpms) / len(bpms) # Exponentially weighted floating average weight = (1.0 / self.clicks) ** .5 if weight < self.min_weight: weight = self.min_weight self.floating_bpm = \ self.floating_bpm * (1.0 - weight) \ + self.bpm * weight self.floating_square = \ self.floating_square * (1.0 - weight) \ + self.bpm * self.bpm * weight if self.bpm < self.min or self.average_count == 0: self.min = self.bpm if self.bpm > self.max or self.average_count == 0: self.max = self.bpm self.bpms_sum += self.bpm self.squares_sum += self.bpm * self.bpm self.average_count += 1 # Update history self.last_times = self.last_times[-(self.keep - 1):] + [self.last] self.last_bpms = self.last_bpms[-(self.keep - 1):] + [self.bpm] self.last_floating_bpms = \ self.last_floating_bpms[-(self.keep - 1):] \ + [self.floating_bpm] self.last_floating_squares = \ self.last_floating_squares[-(self.keep - 1):] \ + [self.floating_square] self.last = now self.clicks += 1 class TapBpm(SongsMenuPlugin): PLUGIN_ID = "Tap BPM" PLUGIN_NAME = _("Tap BPM") PLUGIN_DESC = _("Tap BPM for the selected song.") PLUGIN_ICON = Icons.EDIT PLUGIN_VERSION = "0.1" def plugin_song(self, song): self._window = window = \ Dialog(title=_("Tap BPM"), parent=self.plugin_window) window.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) window.add_icon_button(_("_Save"), Icons.DOCUMENT_SAVE, Gtk.ResponseType.OK) window.set_default_size(300, 100) window.set_border_width(6) window.connect('response', self.response) self._panel = TapBpmPanel(window, song) window.vbox.pack_start(self._panel, False, True, 0) window.vbox.show_all() window.present() def response(self, win, response): if response == Gtk.ResponseType.OK: # Save metadata self._panel.save() self._window.hide() self._window.destroy() del self._window del self._panel ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/migratemetadata.py������������������������������������������0000644�0001750�0001750�00000013030�13112005742�024243� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013-2015 Ryan "ZDBioHazard" Turner <zdbiohazard2@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import math from gi.repository import Gtk from quodlibet import _, ngettext from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.formats._audio import MIGRATE from quodlibet.util.tags import readable from quodlibet.qltk import Icons from quodlibet.qltk.window import Dialog # This global info variable is where the song metadata # is stored so we can use it between plugin activations. # I know it's kinda ugly, but it's a lot more convenient # for the user than writing and parsing temporary files. songinfo = {} class MetadataCopier(SongsMenuPlugin): PLUGIN_ID = "Migrate Metadata" PLUGIN_NAME = _("Migrate Metadata") PLUGIN_VERSION = "1.0" PLUGIN_ICON = Icons.EDIT_COPY PLUGIN_DESC = _("Copies the quodlibet-specific metadata between songs.") def plugin_songs(self, songs): global songinfo # Create a dialog. dlg = Dialog(title=_("Migrate Metadata"), transient_for=self.plugin_window, flags=(Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT)) dlg.set_border_width(4) dlg.vbox.set_spacing(4) dlg.add_icon_button(_("_Copy"), Icons.EDIT_COPY, Gtk.ResponseType.OK) dlg.add_icon_button( _("_Paste"), Icons.EDIT_PASTE, Gtk.ResponseType.APPLY) # Default to the "Copy" button when the songsinfo # list is empty, default to "Paste" button otherwise. if len(songinfo) == 0: dlg.set_default_response(Gtk.ResponseType.OK) else: dlg.set_default_response(Gtk.ResponseType.APPLY) # Create the tag table. frame = Gtk.Frame(label=_("Information to copy/paste")) # Try to make a nice even square-ish table. bias = 3 # Columns count for 3 rows, due to label text using space. columns = int(max(1, math.ceil(math.sqrt(len(MIGRATE) / bias)))) rows = int(max(1, math.ceil(len(MIGRATE) / columns))) table = Gtk.Table(rows=rows, columns=columns, homogeneous=True) table.set_border_width(4) table.set_row_spacings(4) table.set_col_spacings(4) # Create check boxes. tags = {} for ctr, tag in enumerate(sorted(MIGRATE)): tags[tag] = Gtk.CheckButton(label=readable(tag).capitalize()) tags[tag].set_active(True) # These floors and casts make sure we don't get floats. col = int(math.floor(ctr % columns)) row = int(math.floor(ctr / columns)) table.attach(tags[tag], col, col + 1, row, row + 1) # Create the indexing box. index = Gtk.CheckButton(label=_("Map tracks by disc and track number")) index.set_tooltip_markup(_("Enable this when you want to migrate " "metadata from one album to another while " "matching the disc and track numbers." "\n\n" "<b>Note:</b> this must be enabled when " "metadata is copied for track information " "to be stored.")) # Automatically check when there is more # than one song in the songs or songinfo lists. if len(songs) > 1 or len(songinfo) > 1: index.set_active(True) # Assemble the window. frame.add(table) dlg.vbox.add(frame) dlg.vbox.add(index) dlg.vbox.add(Gtk.Label(ngettext("There is %d stored track.", "There are %d stored tracks.", len(songinfo)) % len(songinfo))) dlg.show_all() response = dlg.run() # Only accept expected responses. if response not in [Gtk.ResponseType.OK, Gtk.ResponseType.APPLY]: dlg.destroy() return # If copying, erase the currently stored metadata. if response == Gtk.ResponseType.OK: songinfo = {} # Go through the songs list and process it. for tid, song in enumerate(songs): # This tid will be what we index all of our tracks by, # so they will be easier to find when pasting metadata. if index.get_active() is True: tid = "%d-%d" % (int(song.get("discnumber", 0)), int(song.get("tracknumber", 0).split("/")[0])) # Erase track info if copying. if response == Gtk.ResponseType.OK: songinfo[tid] = {} for tag in tags.keys(): if tags[tag].get_active() is False: continue # Skip unchecked tags. try: if response == Gtk.ResponseType.OK: # Copy information. songinfo[tid][tag] = song[tag] elif response == Gtk.ResponseType.APPLY: # Paste information. song[tag] = songinfo[tid][tag] except KeyError: continue # Just leave out tags that aren't present. # Erase songinfo after pasting. if response == Gtk.ResponseType.APPLY: songinfo = {} # Aaaaaand we're done. dlg.destroy() return ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/website_search.py�������������������������������������������0000644�0001750�0001750�00000013474�13112005742�024115� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011-2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import quodlibet from quodlibet import _ from quodlibet import qltk from quodlibet.formats import AudioFile from quodlibet.pattern import Pattern from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk.cbes import StandaloneEditor from quodlibet.qltk.x import SeparatorMenuItem from quodlibet.qltk import Icons from quodlibet.util import website from quodlibet.util.tags import USER_TAGS, MACHINE_TAGS from quodlibet.util import connect_obj, print_w, print_d from quodlibet.util.path import uri_is_valid from quodlibet.compat import quote_plus, text_type from gi.repository import Gtk import os class WebsiteSearch(SongsMenuPlugin): """Loads a browser with a URL designed to search on tags of the song. This may include a standard web search engine, eg Google, or a more specific site look-up. The URLs are customisable using tag patterns. """ PLUGIN_ICON = Icons.APPLICATION_INTERNET PLUGIN_ID = "Website Search" PLUGIN_NAME = _("Website Search") PLUGIN_DESC = _("Searches your choice of website using any song tags.\n" "Supports patterns e.g. %(pattern-example)s.") % { "pattern-example": "https://google.com?q=<~artist~title>"} # Here are some starters... DEFAULT_URL_PATS = [ ("Google song search", "https://google.com/search?q=<artist~title>"), ("Wikipedia (en) artist entry", "https://wikipedia.org/wiki/<albumartist|<albumartist>|<artist>>"), ("Musicbrainz album listing", "https://musicbrainz.org/<musicbrainz_albumid|release/" "<musicbrainz_albumid>|search?query=<album>&type=release>"), ("Discogs album search", "https://www.discogs.com/search?type=release&artist=" "<albumartist|<albumartist>|<artist>>&title=<album>"), ("Youtube video search", "https://www.youtube.com/results?search_query=<artist~title>"), ("Go to ~website", "<website>"), ] PATTERNS_FILE = os.path.join( quodlibet.get_user_dir(), 'lists', 'searchsites') def __set_site(self, name): self.chosen_site = name def get_url_pattern(self, key): """Gets the pattern for a given key""" return dict(self._url_pats).get(key, self.DEFAULT_URL_PATS[0][1]) @classmethod def edit_patterns(cls, button): def valid_uri(s): # TODO: some pattern validation too (that isn't slow) try: p = Pattern(s) return (p and uri_is_valid(s)) except ValueError: return False win = StandaloneEditor(filename=cls.PATTERNS_FILE, title=_("Search URL patterns"), initial=cls.DEFAULT_URL_PATS, validator=valid_uri) win.show() @classmethod def PluginPreferences(cls, parent): hb = Gtk.HBox(spacing=3) hb.set_border_width(0) button = qltk.Button(_("Edit search URLs"), Icons.EDIT) button.connect("clicked", cls.edit_patterns) hb.pack_start(button, True, True, 0) hb.show_all() return hb def _get_saved_searches(self): filename = self.PATTERNS_FILE + ".saved" self._url_pats = StandaloneEditor.load_values(filename) # Failing all else... if not len(self._url_pats): print_d("No saved searches found in %s. Using defaults." % filename) self._url_pats = self.DEFAULT_URL_PATS def __init__(self, *args, **kwargs): super(WebsiteSearch, self).__init__(*args, **kwargs) self.chosen_site = None self._url_pats = [] submenu = Gtk.Menu() self._get_saved_searches() for name, url_pat in self._url_pats: item = Gtk.MenuItem(label=name) connect_obj(item, 'activate', self.__set_site, name) submenu.append(item) # Add link to editor configure = Gtk.MenuItem(label=_(u"Configure Searches…")) connect_obj(configure, 'activate', self.edit_patterns, configure) submenu.append(SeparatorMenuItem()) submenu.append(configure) if submenu.get_children(): self.set_submenu(submenu) else: self.set_sensitive(False) def plugin_songs(self, songs): # Check this is a launch, not a configure if self.chosen_site: url_pat = self.get_url_pattern(self.chosen_site) pat = Pattern(url_pat) urls = set() for song in songs: # Generate a sanitised AudioFile; allow through most tags subs = AudioFile() for k in (USER_TAGS + MACHINE_TAGS): vals = song.comma(k) if vals: try: encoded = text_type(vals).encode('utf-8') subs[k] = (encoded if k == 'website' else quote_plus(encoded)) # Dodgy unicode problems except KeyError: print_d("Problem with %s tag values: %r" % (k, vals)) url = str(pat.format(subs)) if not url: print_w("Couldn't build URL using \"%s\"." "Check your pattern?" % url_pat) return # Grr, set.add() should return boolean... if url not in urls: urls.add(url) website(url) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/fingerprint/������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�023070� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/fingerprint/util.py�����������������������������������������0000644�0001750�0001750�00000002217�13112005742�024423� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011,2013,2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import time import threading from quodlibet import config def get_api_key(): """The user API key for submissions""" return config.get("plugins", "fingerprint_acoustid_api_key", "") def get_write_mb_tags(): return config.getboolean("plugins", "fingerprint_write_mb_tags", False) def get_group_by_dir(): return config.getboolean("plugins", "fingerprint_group_by_dir", True) class GateKeeper(object): def __init__(self, requests_per_sec): self._period = 1 / float(requests_per_sec) self._last = 0 self._lock = threading.Lock() def wait(self): """Block until a new request can be made.""" while 1: with self._lock: current = time.time() if abs(current - self._last) >= self._period: self._last = current break time.sleep(self._period / 10) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/fingerprint/__init__.py�������������������������������������0000644�0001750�0001750�00000006223�13112005742�025206� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011,2013 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Gst if not Gst.ElementFactory.find("chromaprint"): from quodlibet import plugins raise plugins.MissingGstreamerElementPluginException("chromaprint") from .submit import FingerprintDialog from .util import get_api_key from quodlibet import _ from quodlibet import config from quodlibet import util from quodlibet.qltk import Button, Frame, Icons from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk.msg import ErrorMessage from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.plugins.songshelpers import is_writable, is_finite, each_song class AcoustidSearch(SongsMenuPlugin): PLUGIN_ID = "AcoustidSearch" PLUGIN_NAME = _("Acoustic Fingerprint Lookup") PLUGIN_DESC = _("Looks up song metadata through acoustic fingerprinting.") PLUGIN_ICON = Icons.NETWORK_WORKGROUP plugin_handles = each_song(is_finite, is_writable) def plugin_songs(self, songs): from .search import SearchWindow window = SearchWindow(songs, title=self.PLUGIN_NAME) window.show() # plugin_done checks for metadata changes and opens the write dialog window.connect("destroy", self.__plugin_done) def __plugin_done(self, *args): self.plugin_finish() class AcoustidSubmit(SongsMenuPlugin): PLUGIN_ID = "AcoustidSubmit" PLUGIN_NAME = _("Submit Acoustic Fingerprints") PLUGIN_DESC = _("Generates acoustic fingerprints using chromaprint " "and submits them to acoustid.org.") PLUGIN_ICON = Icons.NETWORK_WORKGROUP plugin_handles = each_song(is_finite, is_writable) def plugin_songs(self, songs): if not get_api_key(): ErrorMessage(self, _("API Key Missing"), _("You have to specify an acoustid.org API key in the plugin " "preferences before you can submit fingerprints.")).run() else: FingerprintDialog(songs) @classmethod def PluginPreferences(self, win): box = Gtk.VBox(spacing=12) # api key section def key_changed(entry, *args): config.set("plugins", "fingerprint_acoustid_api_key", entry.get_text()) button = Button(_("Request API key"), Icons.NETWORK_WORKGROUP) button.connect("clicked", lambda s: util.website("https://acoustid.org/api-key")) key_box = Gtk.HBox(spacing=6) entry = UndoEntry() entry.set_text(get_api_key()) entry.connect("changed", key_changed) label = Gtk.Label(label=_("API _key:")) label.set_use_underline(True) label.set_mnemonic_widget(entry) key_box.pack_start(label, False, True, 0) key_box.pack_start(entry, True, True, 0) key_box.pack_start(button, False, True, 0) box.pack_start(Frame(_("AcoustID Web Service"), child=key_box), True, True, 0) return box �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/fingerprint/search.py���������������������������������������0000644�0001750�0001750�00000034730�13112005742�024720� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from contextlib import contextmanager from gi.repository import Gtk, Pango, Gdk from .analyze import FingerPrintPool from .acoustid import AcoustidLookupThread from .util import get_write_mb_tags, get_group_by_dir from quodlibet import _ from quodlibet.qltk.models import ObjectStore from quodlibet.qltk.views import AllTreeView from quodlibet.qltk.window import Window from quodlibet.qltk import Button, Icons from quodlibet import util from quodlibet.util import print_w from quodlibet.qltk.ccb import ConfigCheckButton class Status(object): QUEUED = 0 ANALYZING = 1 LOOKUP = 2 DONE = 3 ERROR = 4 UNKNOWN = 5 @classmethod def to_string(cls, value): if value == cls.QUEUED: return _("Queued") elif value == cls.ANALYZING: return _("Analyzing") elif value == cls.LOOKUP: return _("Lookup") elif value == cls.DONE: return _("Done") elif value == cls.ERROR: return _("Error") elif value == cls.UNKNOWN: return _("Unknown") class SearchEntry(object): def __init__(self, song): self.song = song self.status = Status.QUEUED self.result = None self.active_release = 0 self._write = True def toggle_write(self): if self.status == Status.DONE and self.release: self._write ^= True @property def can_write(self): return self.status == Status.DONE and self.release and self._write def apply_tags(self, write_musicbrainz=True, write_album=True): """Add the tags of the active release to the song""" non_album_tags = [ "artist", "title", "musicbrainz_trackid", "musicbrainz_artistid" ] if not self.can_write: return # To reduce chaotic results with half tagged albums, delete # all tags for which we could have written values, but don't # or the value would be empty for key, value in self.release.tags.items(): if not write_musicbrainz and key.startswith("musicbrainz_"): value = u"" if not write_album and key not in non_album_tags: value = u"" if not value: self.song.pop(key, None) else: self.song[key] = value @property def releases(self): if self.result: return self.result.releases return [] @property def release(self): result = self.result if not result: return if result.releases: return result.releases[self.active_release] class ResultView(AllTreeView): def __init__(self): super(ResultView, self).__init__() self._release_ids = {} render = Gtk.CellRendererPixbuf() column = Gtk.TreeViewColumn(_("Write"), render) def cell_data(column, cell, model, iter_, data): entry = model.get_value(iter_) cell.set_property('icon-name', Icons.EDIT) cell.set_sensitive(entry.can_write) column.set_cell_data_func(render, cell_data) column.set_expand(False) column.set_min_width(60) self.append_column(column) self.connect('button-press-event', self.__button_press, column) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) column = Gtk.TreeViewColumn(util.tag("~basename"), render) def cell_data(column, cell, model, iter_, data): entry = model.get_value(iter_) cell.set_property('text', entry.song("~basename")) column.set_cell_data_func(render, cell_data) column.set_expand(True) self.append_column(column) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) column = Gtk.TreeViewColumn(_("Status"), render) def cell_data(column, cell, model, iter_, data): entry = model.get_value(iter_) cell.set_property('text', Status.to_string(entry.status)) column.set_cell_data_func(render, cell_data) column.set_expand(False) column.set_fixed_width(100) self.append_column(column) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) # Translators: album release ID column = Gtk.TreeViewColumn(_("Release"), render) self._release_column = column def cell_data(column, cell, model, iter_, data): entry = model.get_value(iter_) release = entry.release if not release: cell.set_property("text", "-") else: id_ = self.get_release_id(release) cell.set_property("text", str(id_)) column.set_cell_data_func(render, cell_data) column.set_expand(False) self.append_column(column) for tag in ["tracknumber", "artist", "title"]: render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) column = Gtk.TreeViewColumn(util.tag(tag), render) def cell_data(column, cell, model, iter_, data, tag=tag): entry = model.get_value(iter_) release = entry.release if not release: cell.set_property("text", "-") else: value = release.tags.get(tag, "-") value = ", ".join(value.split("\n")) cell.set_property("text", value) column.set_cell_data_func(render, cell_data) self.append_column(column) if tag == "tracknumber": self._track_column = column column.set_expand(False) column.set_fixed_width(80) else: column.set_expand(True) for column in self.get_columns(): column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) column.set_resizable(True) if column.get_min_width() < 50: column.set_min_width(50) self.set_fixed_height_mode(True) def __button_press(self, view, event, edit_column): x, y = map(int, [event.x, event.y]) try: path, col, cellx, celly = view.get_path_at_pos(x, y) except TypeError: return False # header clicks go to the first cell otherwise if event.window is not view.get_bin_window(): return False if event.button == Gdk.BUTTON_PRIMARY and \ event.type == Gdk.EventType.BUTTON_PRESS and \ col == edit_column: model = view.get_model() row = model[path] entry = row[0] entry.toggle_write() model.row_changed(row.path, row.iter) return True return False def set_album_visible(self, value): self._release_column.set_visible(value) self._track_column.set_visible(value) def get_release_id(self, release): return self._release_ids.setdefault( release.id, len(self._release_ids) + 1) def score_release(release): return (float(release.sources) / release.all_sources) * release.score class SearchWindow(Window): def __init__(self, songs, title=None): super(SearchWindow, self).__init__( default_width=800, default_height=400, border_width=12, title=title) self._thread = AcoustidLookupThread(self.__lookup_cb) sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) model = ObjectStore() self.view = view = ResultView() view.set_model(model) self.model = model self._iter_map = {} for song in songs: iter_ = self.model.append([SearchEntry(song)]) self._iter_map[song] = iter_ sw.add(view) self.pool = pool = FingerPrintPool() pool.connect('fingerprint-done', self.__fp_done_cb) pool.connect('fingerprint-error', self.__fp_error_cb) pool.connect('fingerprint-started', self.__fp_started_cb) for song in songs: pool.push(song) outer_box = Gtk.VBox(spacing=12) bbox = Gtk.HButtonBox() bbox.set_layout(Gtk.ButtonBoxStyle.END) bbox.set_spacing(6) self.__save = save = Button(_("_Save"), Icons.DOCUMENT_SAVE) save.connect("clicked", self.__on_save) save.set_sensitive(False) cancel = Button(_("_Cancel")) cancel.connect("clicked", lambda *x: self.destroy()) bbox.pack_start(save, True, True, 0) bbox.pack_start(cancel, True, True, 0) inner_box = Gtk.VBox(spacing=6) inner_box.pack_start(sw, True, True, 0) ccb = ConfigCheckButton( _("Write MusicBrainz tags"), "plugins", "fingerprint_write_mb_tags") ccb.set_active(get_write_mb_tags()) inner_box.pack_start(ccb, False, True, 0) ccb = ConfigCheckButton( _("Group by directory"), "plugins", "fingerprint_group_by_dir") ccb.set_active(get_group_by_dir()) ccb.connect("toggled", self.__group_toggled) self._group_ccb = ccb outer_box.pack_start(inner_box, True, True, 0) bottom_box = Gtk.HBox(spacing=12) mode_button = Gtk.ToggleButton(label=_("Album Mode")) mode_button.set_tooltip_text( _("Write album related tags and try to " "reduce the number of different album releases")) mode_button.set_active(True) mode_button.connect("toggled", self.__mode_toggle) bottom_box.pack_start(mode_button, False, True, 0) bottom_box.pack_start(self._group_ccb, False, True, 0) bottom_box.pack_start(bbox, True, True, 0) outer_box.pack_start(bottom_box, False, True, 0) outer_box.show_all() self.add(outer_box) self.__album_mode = True self.__group_by_dir = True self._release_scores = {} self._directory_scores = {} self.__done = 0 self.connect("destroy", self.__destroy) def __group_toggled(self, button): self.__group_by_dir = button.get_active() self.__update_active_releases() def __mode_toggle(self, button): self.__album_mode = button.get_active() self._group_ccb.set_sensitive(self.__album_mode) self.view.set_album_visible(self.__album_mode) self.__update_active_releases() def __destroy(self, *args): self.pool.stop() self.pool = None self._thread.stop() self._thread = None def __on_save(self, *args): write_mb = get_write_mb_tags() write_album = self.__album_mode for row in self.model: row[0].apply_tags(write_mb, write_album) # the plugin wrapper will handle the rest self.destroy() @contextmanager def __update_row(self, song): iter_ = self._iter_map[song] row = self.model[iter_] yield row[0] self.model.row_changed(row.path, row.iter) def __inc_done(self): self.__done += 1 if self.__done == len(self._iter_map): self.__save.set_sensitive(True) def __update_active_releases(self): """Go through all songs and recalculate the best release""" def sort_key(entry, r): # good if there are many other songs that could be in the # same release and this release is likely as well. # Also sort by id to have a winner in case of a tie. score = score_release(r) if self.__album_mode: if self.__group_by_dir: song = entry.song scores = self._directory_scores[song("~dirname")] else: scores = self._release_scores score = (scores[r.id], score) return (score, r.id) for row in self.model: entry = row[0] if not entry.releases: continue active_release = entry.active_release best_release = sorted( entry.releases, key=lambda r: sort_key(entry, r))[-1] entry.active_release = entry.releases.index(best_release) if entry.active_release != active_release: self.model.row_changed(row.path, row.iter) def __lookup_cb(self, lresult): with self.__update_row(lresult.song) as entry: entry.status = Status.DONE entry.result = lresult # count how many times each release ID is present and weight by the # score for release in lresult.releases: id_ = release.id # to prevent favoring releases which are a superset of # the release we actually want (say 8 CD box containing # every song of an artist), try to reduce the medium count. score = score_release(release) / release.medium_count self._release_scores.setdefault(id_, 0) self._release_scores[id_] += score # do the same again but group by directory dir_ = lresult.song("~dirname") release_scores = self._directory_scores.setdefault(dir_, {}) release_scores.setdefault(id_, 0) release_scores[id_] += score # update display if lresult.releases: self.__update_active_releases() elif lresult.error: entry.status = Status.ERROR # we don't expose in the UI, so at least print it print_w(lresult.error) else: entry.status = Status.UNKNOWN self.__inc_done() def __fp_done_cb(self, pool, result): self._thread.put(result) with self.__update_row(result.song) as entry: entry.status = Status.LOOKUP def __fp_error_cb(self, pool, song, error_msg): print_w(error_msg) with self.__update_row(song) as entry: entry.status = Status.ERROR self.__inc_done() def __fp_started_cb(self, pool, song): with self.__update_row(song) as entry: entry.status = Status.ANALYZING ����������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/fingerprint/submit.py���������������������������������������0000644�0001750�0001750�00000014714�13112005742�024756� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011,2013 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Pango, GLib from quodlibet import _ from quodlibet.compat import listfilter from quodlibet.qltk import Button, Window from quodlibet.util import connect_obj, print_w from .acoustid import AcoustidSubmissionThread from .analyze import FingerPrintPool def get_stats(results): got_mbid = got_meta = 0 for result in results: song = result.song got_mbid += bool(song("musicbrainz_trackid")) got_meta += bool( song("artist") and song.get("title") and song("album")) return got_mbid, got_meta def can_submit(result): got_mbid, got_meta = get_stats([result]) return bool(got_mbid or got_meta) class FingerprintDialog(Window): def __init__(self, songs): super(FingerprintDialog, self).__init__() self.set_border_width(12) self.set_title(_("Submit Acoustic Fingerprints")) self.set_default_size(300, 0) outer_box = Gtk.VBox(spacing=12) box = Gtk.VBox(spacing=6) self.__label = label = Gtk.Label() label.set_markup("<b>%s</b>" % _("Generating fingerprints:")) label.set_alignment(0, 0.5) box.pack_start(label, False, True, 0) self.__bar = bar = Gtk.ProgressBar() self.__set_fraction(0) box.pack_start(bar, False, True, 0) self.__label_song = label_song = Gtk.Label() label_song.set_alignment(0, 0.5) label_song.set_ellipsize(Pango.EllipsizeMode.MIDDLE) box.pack_start(label_song, False, True, 0) self.__stats = stats = Gtk.Label() stats.set_alignment(0, 0.5) expand = Gtk.Expander.new_with_mnemonic(_("_Details")) expand.add(stats) def expand_cb(expand, *args): self.resize(self.get_size()[0], 1) stats.connect("unmap", expand_cb) box.pack_start(expand, False, False, 0) self.__fp_results = {} self.__fp_done = 0 self.__songs = songs self.__musicdns_thread = None self.__acoustid_thread = None self.__update_stats() pool = FingerPrintPool() bbox = Gtk.HButtonBox() bbox.set_layout(Gtk.ButtonBoxStyle.END) bbox.set_spacing(6) self.__submit = submit = Button(_("_Submit")) submit.set_sensitive(False) submit.connect('clicked', self.__submit_cb) cancel = Button(_("_Cancel")) connect_obj(cancel, 'clicked', self.__cancel_cb, pool) bbox.pack_start(submit, True, True, 0) bbox.pack_start(cancel, True, True, 0) outer_box.pack_start(box, True, True, 0) outer_box.pack_start(bbox, False, True, 0) pool.connect('fingerprint-done', self.__fp_done_cb) pool.connect('fingerprint-error', self.__fp_error_cb) pool.connect('fingerprint-started', self.__fp_started_cb) for song in songs: pool.push(song) connect_obj(self, 'delete-event', self.__cancel_cb, pool) self.add(outer_box) self.show_all() def __update_stats(self): all_ = len(self.__songs) results = self.__fp_results.values() to_send = len(listfilter(can_submit, results)) valid_fp = len(results) got_mbid, got_meta = get_stats(results) text = _("Songs either need a <i><b>musicbrainz_trackid</b></i>, " "or <i><b>artist</b></i> / " "<i><b>title</b></i> / <i><b>album</b></i> tags to get submitted.") text += "\n\n" + "<i>%s</i>" % _("Fingerprints:") text += " %d/%d" % (valid_fp, all_) text += "\n" + "<i>%s</i>" % _("Songs with MBIDs:") text += " %d/%d" % (got_mbid, all_) text += "\n" + "<i>%s</i>" % _("Songs with sufficient tags:") text += " %d/%d" % (got_meta, all_) text += "\n" + "<i>%s</i>" % _("Songs to submit:") text += " %d/%d" % (to_send, all_) self.__stats.set_markup(text) def __set_fraction(self, progress): self.__bar.set_fraction(progress) self.__bar.set_text("%d%%" % round(progress * 100)) def __inc_fp_fraction(self): self.__fp_done += 1 frac = self.__fp_done / float(len(self.__songs)) self.__set_fraction(frac) if self.__fp_done == len(self.__songs): self.__submit.set_sensitive(True) self.__show_final_stats() def __fp_started_cb(self, pool, song): # increase by an amount smaller than one song, so that the user can # see some progress from the beginning. self.__set_fraction(0.5 / len(self.__songs) + self.__bar.get_fraction()) self.__label_song.set_text(song("~filename")) def __fp_done_cb(self, pool, result): self.__fp_results[result.song] = result self.__inc_fp_fraction() self.__update_stats() def __fp_error_cb(self, pool, song, error): print_w("[fingerprint] " + error) self.__inc_fp_fraction() self.__update_stats() def __show_final_stats(self): all_ = len(self.__songs) results = self.__fp_results.values() to_send = len(list(filter(can_submit, results))) self.__label_song.set_text( _("Done. %(to-send)d/%(all)d songs to submit.") % { "to-send": to_send, "all": all_}) def __cancel_cb(self, pool, *args): self.destroy() def idle_cancel(): pool.stop() if self.__acoustid_thread: self.__acoustid_thread.stop() # pool.stop can block a short time because the CV might be locked # during starting the pipeline -> idle_add -> no GUI blocking GLib.idle_add(idle_cancel) def __submit_cb(self, *args): self.__submit.set_sensitive(False) self.__label.set_markup("<b>%s</b>" % _("Submitting fingerprints:")) self.__set_fraction(0) self.__acoustid_thread = AcoustidSubmissionThread( list(filter(can_submit, self.__fp_results.values())), self.__acoustid_update, self.__acoustid_done) def __acoustid_update(self, progress): self.__set_fraction(progress) self.__label_song.set_text(_(u"Submitting…")) def __acoustid_done(self): self.__acoustid_thread.join() self.__set_fraction(1.0) GLib.timeout_add(500, self.destroy) ����������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/fingerprint/analyze.py��������������������������������������0000644�0001750�0001750�00000016226�13112005742�025116� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011,2013,2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import multiprocessing from gi.repository import Gst, GObject from quodlibet.util import connect_obj class FingerPrintResult(object): def __init__(self, song, chromaprint, length): self.song = song self.chromaprint = chromaprint # in seconds self.length = length class FingerPrintPipeline(object): def __init__(self): super(FingerPrintPipeline, self).__init__() self._song = None self._setup_pipe() def _finish(self, result, error): song = self._song callback = self._callback self._reset() callback(self, song, result, error) def _setup_pipe(self): # pipeline self._pipe = pipe = Gst.Pipeline() # decode part self._filesrc = filesrc = Gst.ElementFactory.make("filesrc", None) pipe.add(filesrc) decode = Gst.ElementFactory.make("decodebin", None) pipe.add(decode) Gst.Element.link(filesrc, decode) # convert to right format convert = Gst.ElementFactory.make("audioconvert", None) resample = Gst.ElementFactory.make("audioresample", None) pipe.add(convert) pipe.add(resample) Gst.Element.link(convert, resample) def new_decoded_pad(convert, pad, *args): pad.link(convert.get_static_pad("sink")) # decodebin creates pad, we link it self._dec = decode self._dec_id = connect_obj(decode, "pad-added", new_decoded_pad, convert) def sort_decoders(decode, pad, caps, factories): # Example (atom CPU) 248 sec song: # mpg123: 3.5s / ffdec_mp3: 5.5s / mad: 7.2s / flump3dec: 13.3s def set_prio(x): i, f = x i = { "mad": -1, "avdec_mp3": -2, "avdec_mp3float": -3, "mpegaudioparse": -4, "mpg123audiodec": -5, }.get(f.get_name(), i) return (i, f) return list(zip(*sorted(map(set_prio, enumerate(factories)))))[1] self._dec_id2 = decode.connect("autoplug-sort", sort_decoders) chroma = Gst.ElementFactory.make("chromaprint", None) fake = Gst.ElementFactory.make("fakesink", None) pipe.add(chroma) pipe.add(fake) Gst.Element.link(resample, chroma) Gst.Element.link(chroma, fake) # bus self._bus = bus = pipe.get_bus() self._bus_id = bus.connect("message", self._bus_message) bus.add_signal_watch() def start(self, song, callback): """Start processing a new song""" assert self.is_idle() self._song = song self._callback = callback # use mutagen one, but replace if gstreamer gives us a duration self._length = song("~#length") self._filesrc.set_property("location", song["~filename"]) self._pipe.set_state(Gst.State.PLAYING) def _reset(self): """Reset, so start() can be called again""" if self.is_idle(): return self._pipe.set_state(Gst.State.NULL) self._song = None self._callback = None def stop(self): """Abort processing. Can be called multiple times. After this returns the pipeline isn't usable any more. """ self._reset() if not self._pipe: return self._bus.remove_signal_watch() self._bus.disconnect(self._bus_id) self._dec.disconnect(self._dec_id) self._dec.disconnect(self._dec_id2) self._dec = None self._filesrc = None self._bus = None self._pipe = None def is_idle(self): """If start() can be called""" return not self._song def _bus_message(self, bus, message): error = None if message.type == Gst.MessageType.TAG: tags = message.parse_tag() ok, value = tags.get_string("chromaprint-fingerprint") if ok: res = FingerPrintResult(self._song, value, self._length) self._finish(res, None) elif message.type == Gst.MessageType.ASYNC_DONE: # GStreamer probably knows song durations better than we do. ok, d = self._pipe.query_duration(Gst.Format.TIME) if ok: self._length = float(d) / Gst.SECOND elif message.type == Gst.MessageType.EOS: error = "EOS but no fingerprint" elif message.type == Gst.MessageType.ERROR: error = str(message.parse_error()[0]) if error: self._finish(None, error) class FingerPrintPool(GObject.GObject): __gsignals__ = { # FingerPrintResult "fingerprint-done": ( GObject.SignalFlags.RUN_LAST, None, (object,)), # AudioFile "fingerprint-started": ( GObject.SignalFlags.RUN_LAST, None, (object,)), # AudioFile, str "fingerprint-error": ( GObject.SignalFlags.RUN_LAST, None, (object, object)), } def __init__(self, max_workers=None): super(FingerPrintPool, self).__init__() if max_workers is None: max_workers = int(multiprocessing.cpu_count() * 1.5) self._max_workers = max_workers self._idle = set() self._workers = set() self._queue = [] def _get_worker(self): """An idle FingerPrintPipeline or None""" for worker in self._workers: if worker in self._idle: self._idle.discard(worker) break else: worker = None if len(self._workers) < self._max_workers: worker = FingerPrintPipeline() self._workers.add(worker) if worker: assert worker.is_idle() return worker def _start_song(self, worker, song): assert worker.is_idle() worker.start(song, self._callback) self.emit("fingerprint-started", song) def push(self, song): """Add a new song to the queue""" worker = self._get_worker() if worker: self._start_song(worker, song) else: self._queue.append(song) def stop(self): """Stop everything. callback will not be called after this. Can be called multiple times. """ for worker in self._workers: worker.stop() self._workers.clear() self._idle.clear() def _callback(self, worker, song, result, error): self._idle.add(worker) if result: self.emit("fingerprint-done", result) else: self.emit("fingerprint-error", song, error) if self._queue: song = self._queue.pop(0) worker = self._get_worker() assert worker self._start_song(worker, song) elif len(self._idle) == len(self._workers): # all done, all idle, kill em self.stop() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/fingerprint/acoustid.py�������������������������������������0000644�0001750�0001750�00000025737�13112005742�025275� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import json import collections import threading import gzip from xml.dom.minidom import parseString from gi.repository import GLib from quodlibet.util import print_w from quodlibet.compat import iteritems, urlencode, queue, cBytesIO from quodlibet.util.urllib import urlopen, Request from .util import get_api_key, GateKeeper APP_KEY = "C6IduH7D" gatekeeper = GateKeeper(requests_per_sec=3) class AcoustidSubmissionThread(threading.Thread): URL = "https://api.acoustid.org/v2/submit" SONGS_PER_SUBMISSION = 50 TIMEOUT = 10.0 def __init__(self, results, progress_cb, done_cb): super(AcoustidSubmissionThread, self).__init__() self.__callback = done_cb self.__results = results self.__stopped = False self.__progress_cb = progress_cb self.__done = 0 self.start() def __idle(self, func, *args, **kwargs): def delayed(): if self.__stopped: return func(*args, **kwargs) GLib.idle_add(delayed) def __send(self, urldata): if self.__stopped: return gatekeeper.wait() self.__done += len(urldata) basedata = urlencode({ "format": "xml", "client": APP_KEY, "user": get_api_key(), }) urldata = "&".join([basedata] + map(urlencode, urldata)) obj = cBytesIO() gzip.GzipFile(fileobj=obj, mode="wb").write(urldata) urldata = obj.getvalue() headers = { "Content-Encoding": "gzip", "Content-type": "application/x-www-form-urlencoded" } req = Request(self.URL, urldata, headers) error = None try: response = urlopen(req, timeout=self.TIMEOUT) except EnvironmentError as e: error = "urllib error: " + str(e) else: xml = response.read() try: dom = parseString(xml) except: error = "xml error" else: status = dom.getElementsByTagName("status") if not status or not status[0].childNodes or not \ status[0].childNodes[0].nodeValue == "ok": error = "response status error" if error: print_w("[fingerprint] Submission failed: " + error) # emit progress self.__idle(self.__progress_cb, float(self.__done) / len(self.__results)) def run(self): urldata = [] for i, result in enumerate(self.__results): song = result.song track = { "duration": int(round(result.length)), "fingerprint": result.chromaprint, "bitrate": song("~#bitrate"), "fileformat": song("~format"), "mbid": song("musicbrainz_trackid"), "artist": song.list("artist"), "album": song("album"), "albumartist": song("albumartist"), "year": song("~year"), "trackno": song("~#track"), "discno": song("~#disc"), } tuples = [] for key, value in iteritems(track): # this also dismisses 0.. which should be ok here. if not value: continue # the postfixes don't have to start at a specific point, # they just need to be different and numbers key += ".%d" % i if isinstance(value, list): for val in value: tuples.append((key, val)) else: tuples.append((key, value)) urldata.append(tuples) if len(urldata) >= self.SONGS_PER_SUBMISSION: self.__send(urldata) urldata = [] if self.__stopped: return if urldata: self.__send(urldata) self.__idle(self.__callback) def stop(self): self.__stopped = True class LookupResult(object): def __init__(self, fresult, releases, error): self.fresult = fresult self.releases = releases self.error = error @property def song(self): return self.fresult.song Release = collections.namedtuple( "Release", ["id", "score", "sources", "all_sources", "medium_count", "tags"]) def parse_acoustid_response(json_data): """Get all possible tag combinations including the release ID and score. The idea is that for multiple songs the variant for each wins where the release ID is present for more songs and if equal (one song for example) the score wins. Needs meta=releases+recordings+tracks responses. """ VARIOUS_ARTISTS_ARTISTID = "89ad4ac3-39f7-470e-963a-56509c546377" releases = [] for res in json_data.get("results", []): score = res["score"] all_sources = 0 recordings = [] for rec in res.get("recordings", []): sources = rec["sources"] all_sources += sources rec_id = rec["id"] artists = [a["name"] for a in rec.get("artists", [])] artist_ids = [a["id"] for a in rec.get("artists", [])] for release in rec.get("releases", []): # release id_ = release["id"] date = release.get("date", {}) album = release.get("title", "") album_id = release["id"] parts = [date.get(k) for k in ["year", "month", "day"]] date = "-".join([u"%02d" % p for p in parts if p is not None]) albumartists = [] albumartist_ids = [] for artist in release.get("artists", []): if artist["id"] != VARIOUS_ARTISTS_ARTISTID: albumartists.append(artist["name"]) albumartist_ids.append(artist["id"]) discs = release.get("medium_count", 1) # meadium medium = release["mediums"][0] disc = medium.get("position", 0) tracks = medium.get("track_count", 1) # track track_info = medium["tracks"][0] track_id = track_info["id"] track = track_info.get("position", 0) title = track_info.get("title", "") if disc and discs > 1: discnumber = u"%d/%d" % (disc, discs) else: discnumber = u"" if track and tracks > 1: tracknumber = u"%d/%d" % (track, tracks) else: tracknumber = u"" tags = { "title": title, "artist": "\n".join(artists), "albumartist": "\n".join(albumartists), "date": date, "discnumber": discnumber, "tracknumber": tracknumber, "album": album, } mb = { "musicbrainz_releasetrackid": track_id, "musicbrainz_trackid": rec_id, "musicbrainz_albumid": album_id, "musicbrainz_albumartistid": "\n".join(albumartist_ids), "musicbrainz_artistid": "\n".join(artist_ids), } # not that useful, ignore for now del mb["musicbrainz_releasetrackid"] tags.update(mb) recordings.append([id_, score, sources, 0, discs, tags]) for rec in recordings: rec[3] = all_sources releases.append(Release(*rec)) return releases class AcoustidLookupThread(threading.Thread): URL = "https://api.acoustid.org/v2/lookup" MAX_SONGS_PER_SUBMISSION = 5 TIMEOUT = 10.0 def __init__(self, progress_cb): super(AcoustidLookupThread, self).__init__() self.__progress_cb = progress_cb self.__queue = queue.Queue() self.__stopped = False self.start() def put(self, result): """Queue a FingerPrintResult""" self.__queue.put(result) def __idle(self, func, *args, **kwargs): def delayed(): if self.__stopped: return func(*args, **kwargs) GLib.idle_add(delayed) def __process(self, results): req_data = [] req_data.append(urlencode({ "format": "json", "client": APP_KEY, "batch": "1", })) for i, result in enumerate(results): postfix = ".%d" % i req_data.append(urlencode({ "duration" + postfix: str(int(round(result.length))), "fingerprint" + postfix: result.chromaprint, })) req_data.append("meta=releases+recordings+tracks+sources") urldata = "&".join(req_data) obj = cBytesIO() gzip.GzipFile(fileobj=obj, mode="wb").write(urldata) urldata = obj.getvalue() headers = { "Content-Encoding": "gzip", "Content-type": "application/x-www-form-urlencoded" } req = Request(self.URL, urldata, headers) releases = {} error = "" try: response = urlopen(req, timeout=self.TIMEOUT) except EnvironmentError as e: error = "urllib error: " + str(e) else: try: data = response.read() data = json.loads(data) except ValueError as e: error = str(e) else: if data["status"] == "ok": for result_data in data.get("fingerprints", []): if "index" not in result_data: continue index = result_data["index"] releases[index] = parse_acoustid_response(result_data) for i, result in enumerate(results): yield LookupResult(result, releases.get(str(i), []), error) def run(self): while 1: gatekeeper.wait() results = [] results.append(self.__queue.get()) while len(results) < self.MAX_SONGS_PER_SUBMISSION: # wait a bit to reduce overall request count. timeout = 0.5 / len(results) try: results.append(self.__queue.get(timeout=timeout)) except queue.Empty: break if self.__stopped: return for lookup_result in self.__process(results): self.__idle(self.__progress_cb, lookup_result) self.__queue.task_done() def stop(self): self.__stopped = True self.__queue.put(None) ���������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/ape2id3.py��������������������������������������������������0000644�0001750�0001750�00000002535�13112005742�022351� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import mutagen.apev2 from quodlibet import _ from quodlibet.formats import AudioFileError from quodlibet.formats._apev2 import APEv2File from quodlibet.plugins.songshelpers import each_song, is_writable from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk import Icons from quodlibet.util import print_exc def is_an_mp3(song): return song.get("~filename", "").lower().endswith(".mp3") class APEv2toID3v2(SongsMenuPlugin): PLUGIN_ID = "APEv2 to ID3v2" PLUGIN_NAME = _("APEv2 to ID3v2") PLUGIN_DESC = _("Converts your APEv2 tags to ID3v2 tags. This will delete " "the APEv2 tags after conversion.") PLUGIN_ICON = Icons.EDIT_FIND_REPLACE plugin_handles = each_song(is_an_mp3, is_writable) def plugin_song(self, song): try: apesong = APEv2File(song["~filename"]) except: return # File doesn't have an APEv2 tag song.update(apesong) mutagen.apev2.delete(song["~filename"]) try: song._song.write() except AudioFileError: print_exc() �������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/bookmarks.py������������������������������������������������0000644�0001750�0001750�00000005362�13112005742�023113� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig, 2010 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet import app from quodlibet import qltk from quodlibet.plugins.songshelpers import any_song, has_bookmark from quodlibet.qltk.bookmarks import EditBookmarks from quodlibet.qltk.x import SeparatorMenuItem from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin class Bookmarks(SongsMenuPlugin): PLUGIN_ID = "Go to Bookmark" PLUGIN_NAME = _(u"Go to Bookmark") PLUGIN_DESC = _("Manages bookmarks in the selected files.") PLUGIN_ICON = Icons.GO_JUMP plugin_handles = any_song(has_bookmark) def __init__(self, songs, *args, **kwargs): super(Bookmarks, self).__init__(songs, *args, **kwargs) self.__menu = Gtk.Menu() self.__menu.connect('map', self.__create_children, songs) self.set_submenu(self.__menu) class FakePlayer(object): def __init__(self, song): self.song = song def seek(self, time): if app.player.go_to(self.song._song, explicit=True): app.player.seek(time) def get_position(self, *args): return 0 def __create_children(self, menu, songs): self.__remove_children(menu) for song in songs: marks = song.bookmarks if marks: fake_player = self.FakePlayer(song) song_item = Gtk.MenuItem(song.comma("title")) song_menu = Gtk.Menu() song_item.set_submenu(song_menu) menu.append(song_item) items = qltk.bookmarks.MenuItems(marks, fake_player, True) for item in items: song_menu.append(item) song_menu.append(SeparatorMenuItem()) i = qltk.MenuItem(_(u"_Edit Bookmarks…"), Icons.EDIT) def edit_bookmarks_cb(menu_item): window = EditBookmarks(self.plugin_window, app.library, fake_player) window.show() i.connect('activate', edit_bookmarks_cb) song_menu.append(i) if menu.get_active() is None: no_marks = Gtk.MenuItem(_("No Bookmarks")) no_marks.set_sensitive(False) menu.append(no_marks) menu.show_all() def __remove_children(self, menu): for child in menu.get_children(): menu.remove(child) def plugin_songs(self, songs): pass ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/duplicates.py�����������������������������������������������0000644�0001750�0001750�00000041316�13112005742�023257� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # # Duplicates songs plugin. # # Copyright (C) 2011-2017 Nick Boultbee # # Finds "duplicates" of songs selected by searching the library for # others with the same user-configurable "key", presenting a browser-like # dialog for further interaction with these. # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # import unicodedata import sys from gi.repository import Gtk, Pango from quodlibet import app from quodlibet import print_d, util, qltk, _ from quodlibet.plugins import PluginConfigMixin from quodlibet.plugins.songshelpers import any_song, is_finite from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.qltk.edittags import AudioFileGroup from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.views import RCMHintedTreeView from quodlibet.qltk import Icons, Button from quodlibet.util import connect_obj, connect_destroy, cached_func from quodlibet.util.i18n import numeric_phrase from quodlibet.compat import text_type, xrange, unichr class DuplicateSongsView(RCMHintedTreeView): """Allows full tree-like functionality on top of underlying features""" def get_selected_songs(self): selection = self.get_selection() if selection is None: return [] model, rows = selection.get_selected_rows() if not rows: return [] selected = [] for row in rows: row = model[row] if row.parent is None: for child in row.iterchildren(): selected.append(child[0]) else: selected.append(row[0]) return selected def Menu(self, library): songs = self.get_selected_songs() if not songs: return menu = SongsMenu( library, songs, delete=True, plugins=False, devices=False, playlists=False) menu.show_all() return menu def __select_song(self, player, path, col): if len(path) == 1: if self.row_expanded(path): self.collapse_row(path) else: self.expand_row(path, False) else: songs = self.get_selected_songs() if songs and player.go_to(songs[0], True): player.paused = False def _removed(self, library, songs): model = self.get_model() if not model: return for song in songs: row = model.find_row(song) if row: group_row = model.iter_parent(row.iter) print_d("Found parent group = %s" % group_row) model.remove(row.iter) num_kids = model.iter_n_children(group_row) if num_kids < Duplicates.MIN_GROUP_SIZE: print_d("Removing group %s" % group_row) model.remove(group_row) else: pass def _added(self, library, songs): model = self.get_model() if not model: return for song in songs: key = Duplicates.get_key(song) model.add_to_existing_group(key, song) # TODO: handle creation of new groups based on songs that were # in original list but not as a duplicate def _changed(self, library, songs): model = self.get_model() if not model: # Keeps happening on next song - bug / race condition? return for song in songs: key = Duplicates.get_key(song) row = model.find_row(song) if row: print_d("Changed duplicated file \"%s\" (Row=%s)" % (song("~artist~title"), row)) parent = model.iter_parent(row.iter) old_key = model[parent][0] if old_key != key: print_d("Key changed from \"%s\" -> \"%s\"" % (old_key, key)) self._removed(library, [song]) self._added(library, [song]) else: # Still might be a displayable change print_d("Calling model.row_changed(%s, %s)..." % (row.path, row.iter)) model.row_changed(row.path, row.iter) else: model.add_to_existing_group(key, song) def __init__(self, model): super(DuplicateSongsView, self).__init__(model) connect_obj(self, 'row-activated', self.__select_song, app.player) # Selecting multiple is a nice feature it turns out. self.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) # Handle signals propagated from the underlying library self.connected_library_sigs = [] SIGNAL_MAP = { 'removed': self._removed, 'added': self._added, 'changed': self._changed } for (sig, callback) in SIGNAL_MAP.items(): print_d("Listening to library.%s signals" % sig) connect_destroy(app.library, sig, callback) class DuplicatesTreeModel(Gtk.TreeStore): """A tree store to model duplicated song information""" # Define columns to display (and how, in lieu of using qltk.browsers) def i(x): return x TAG_MAP = [ ("artist", i), ("title", i), ("album", i), ("~#length", lambda s: util.format_time_display(int(s))), ("~#filesize", lambda s: util.format_size(int(s))), ("~#bitrate", i), ("~filename", i)] # Now make a dict. This seems clunky. tag_functions = {} for t, f in TAG_MAP: tag_functions[t] = f @classmethod def group_value(cls, group, tag): """Gets a formatted aggregated value/dummy for a set of tag values""" try: vals = [] for comment in group[tag]: vals.append(comment.get_markup()) group_val = "\n".join(vals) except KeyError: return "" else: try: group_val = cls.tag_functions[tag](group_val) except (ValueError, TypeError): pass return group_val.replace("\n", ", ") def find_row(self, song): """Returns the row in the model from song, or None""" for parent in self: for row in parent.iterchildren(): if row[0] == song: self.__iter = row.iter self.sourced = True return row return None def add_to_existing_group(self, key, song): """Tries to add a song to an existing group. Returns None if not able """ for parent in self: if key == parent[0]: print_d("Found group", self) return self.append(parent.iter, self.__make_row(song)) # TODO: update group return None @classmethod def __make_row(cls, song): """Construct GTK row for a song, with all columns""" return [song] + [util.escape(str(f(song.comma(tag)))) for (tag, f) in cls.TAG_MAP] def add_group(self, key, songs): """Adds a new group, returning the row created""" group = AudioFileGroup(songs, real_keys_only=False) # Add the group first. parent = self.append(None, [key] + [self.group_value(group, tag) for tag, f in self.TAG_MAP]) for s in songs: self.append(parent, self.__make_row(s)) def go_to(self, song, explicit=False): self.__iter = None if isinstance(song, Gtk.TreeIter): self.__iter = song self.sourced = True elif not self.find_row(song): print_d("Failed to find song") return self.__iter def remove(self, itr): if self.__iter and self[itr].path == self[self.__iter].path: self.__iter = None super(DuplicatesTreeModel, self).remove(itr) def get(self): return [row[0] for row in self] @property def get_current(self): if self.__iter is None: return None elif self.is_empty(): return None else: return self[self.__iter][0] @property def get_current_path(self): if self.__iter is None: return None elif self.is_empty(): return None else: return self[self.__iter].path @property def get_current_iter(self): if self.__iter is None: return None elif self.is_empty(): return None else: return self.__iter def is_empty(self): return not len(self) def __init__(self): super(DuplicatesTreeModel, self).__init__( object, str, str, str, str, str, str, str) class DuplicateDialog(Gtk.Window): """Main dialog for browsing duplicate results""" def __quit(self, widget=None, response=None): if response == Gtk.ResponseType.OK or \ response == Gtk.ResponseType.CLOSE: print_d("Exiting plugin on user request...") self.finished = True self.destroy() return def __songs_popup_menu(self, songlist): path, col = songlist.get_cursor() menu = songlist.Menu(app.library) if menu is not None: return songlist.popup_menu(menu, 0, Gtk.get_current_event_time()) def __init__(self, model): songs_text = numeric_phrase("%d duplicate group", "%d duplicate groups", len(model)) super(DuplicateDialog, self).__init__() self.set_destroy_with_parent(True) self.set_title("Quod Libet - %s (%s)" % (Duplicates.PLUGIN_NAME, songs_text)) self.finished = False self.set_default_size(960, 480) self.set_border_width(6) swin = Gtk.ScrolledWindow() swin.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) swin.set_shadow_type(Gtk.ShadowType.IN) # Set up the browser view view = DuplicateSongsView(model) def cell_text(column, cell, model, iter_, index): text = model[iter_][index] cell.markup = text cell.set_property("markup", text) # Set up the columns for i, (tag, f) in enumerate(DuplicatesTreeModel.TAG_MAP): e = (Pango.EllipsizeMode.START if tag == '~filename' else Pango.EllipsizeMode.END) render = Gtk.CellRendererText() render.set_property("ellipsize", e) col = Gtk.TreeViewColumn(util.tag(tag), render) # Numeric columns are better smaller here. if tag.startswith("~#"): col.set_fixed_width(80) col.set_sizing(Gtk.TreeViewColumnSizing.FIXED) else: col.set_expand(True) col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) col.set_resizable(True) col.set_cell_data_func(render, cell_text, i + 1) view.append_column(col) view.connect('popup-menu', self.__songs_popup_menu) swin.add(view) # A basic information area hbox = Gtk.HBox(spacing=6) def expand_all(*args): model = view.get_model() for row in model: if view.row_expanded(row.path): view.collapse_row(row.path) else: for row in model: view.expand_row(row.path, False) expand = Gtk.Button(_("Collapse / Expand all")) connect_obj(expand, "clicked", expand_all, view) hbox.pack_start(expand, False, True, 0) label = Gtk.Label(label=_("Duplicate key expression is '%s'") % Duplicates.get_key_expression()) hbox.pack_start(label, True, True, 0) close = Button(_("_Close"), Icons.WINDOW_CLOSE) close.connect('clicked', self.__quit) hbox.pack_start(close, False, True, 0) vbox = Gtk.VBox(spacing=6) vbox.pack_start(swin, True, True, 0) vbox.pack_start(hbox, False, True, 0) self.add(vbox) self.show_all() @cached_func def _remove_punctuation_trans(): """Lookup all Unicode punctuation, and remove it""" return dict.fromkeys( i for i in xrange(sys.maxunicode) if unicodedata.category(unichr(i)).startswith('P')) class Duplicates(SongsMenuPlugin, PluginConfigMixin): PLUGIN_ID = 'Duplicates' PLUGIN_NAME = _('Duplicates Browser') PLUGIN_DESC = _('Finds and displays similarly tagged versions of songs.') PLUGIN_ICON = Icons.EDIT_SELECT_ALL MIN_GROUP_SIZE = 2 _CFG_KEY_KEY = "key_expression" __DEFAULT_KEY_VALUE = "~artist~title~version" _CFG_REMOVE_WHITESPACE = 'remove_whitespace' _CFG_REMOVE_DIACRITICS = 'remove_diacritics' _CFG_REMOVE_PUNCTUATION = 'remove_punctuation' _CFG_CASE_INSENSITIVE = 'case_insensitive' plugin_handles = any_song(is_finite) # Cached values key_expression = None __cfg_cache = {} @classmethod def get_key_expression(cls): if not cls.key_expression: cls.key_expression = ( cls.config_get(cls._CFG_KEY_KEY, cls.__DEFAULT_KEY_VALUE)) return cls.key_expression @classmethod def PluginPreferences(cls, window): def key_changed(entry): cls.key_expression = None cls.config_set(cls._CFG_KEY_KEY, entry.get_text().strip()) vb = Gtk.VBox(spacing=10) vb.set_border_width(0) hbox = Gtk.HBox(spacing=6) # TODO: construct a decent validator and use ValidatingEntry e = UndoEntry() e.set_text(cls.get_key_expression()) e.connect("changed", key_changed) e.set_tooltip_markup(_("Accepts QL tag expressions like " "<tt>~artist~title</tt> or <tt>musicbrainz_track_id</tt>")) lbl = Gtk.Label(label=_("_Group duplicates by:")) lbl.set_mnemonic_widget(e) lbl.set_use_underline(True) hbox.pack_start(lbl, False, True, 0) hbox.pack_start(e, True, True, 0) frame = qltk.Frame(label=_("Duplicate Key"), child=hbox) vb.pack_start(frame, True, True, 0) # Matching Option toggles = [ (cls._CFG_REMOVE_WHITESPACE, _("Remove _Whitespace")), (cls._CFG_REMOVE_DIACRITICS, _("Remove _Diacritics")), (cls._CFG_REMOVE_PUNCTUATION, _("Remove _Punctuation")), (cls._CFG_CASE_INSENSITIVE, _("Case _Insensitive")), ] vb2 = Gtk.VBox(spacing=6) for key, label in toggles: ccb = ConfigCheckButton(label, 'plugins', cls._config_key(key)) ccb.set_active(cls.config_get_bool(key)) vb2.pack_start(ccb, True, True, 0) frame = qltk.Frame(label=_("Matching options"), child=vb2) vb.pack_start(frame, False, True, 0) vb.show_all() return vb @staticmethod def remove_accents(s): return "".join(c for c in unicodedata.normalize('NFKD', text_type(s)) if not unicodedata.combining(c)) @classmethod def get_key(cls, song): key = song(cls.get_key_expression()) if cls.config_get_bool(cls._CFG_REMOVE_DIACRITICS): key = cls.remove_accents(key) if cls.config_get_bool(cls._CFG_CASE_INSENSITIVE): key = key.lower() if cls.config_get_bool(cls._CFG_REMOVE_PUNCTUATION): key = (key.translate(_remove_punctuation_trans())) if cls.config_get_bool(cls._CFG_REMOVE_WHITESPACE): key = "_".join(key.split()) return key def plugin_songs(self, songs): model = DuplicatesTreeModel() self.__cfg_cache = {} # Index all songs by our custom key # TODO: make this cache-friendly print_d("Calculating duplicates for %d song(s)..." % len(songs)) groups = {} for song in songs: key = self.get_key(song) if key and key in groups: print_d("Found duplicate based on '%s'" % key) groups[key].add(song._song) elif key: groups[key] = {song._song} for song in app.library: key = self.get_key(song) if key in groups: groups[key].add(song) # Now display the grouped duplicates for (key, children) in groups.items(): if len(children) < self.MIN_GROUP_SIZE: continue # The parent (group) label model.add_group(key, children) dialog = DuplicateDialog(model) dialog.show() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/filterall.py������������������������������������������������0000644�0001750�0001750�00000006275�13112005742�023105� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.tags import MACHINE_TAGS from quodlibet.util import build_filter_query from quodlibet.qltk import Window, Icons, Button class SelectionWindow(Window): def __init__(self, filters, browser, parent=None): super(SelectionWindow, self).__init__() self.set_border_width(10) self.set_title(FilterAll.PLUGIN_NAME) self.set_default_size(200, 250) self.set_transient_for(parent) model = Gtk.ListStore(bool, str, str) for key, value in sorted(filters.items()): model.append(row=[False, key, value]) toggle = Gtk.CellRendererToggle() toggle.connect("toggled", self.__toggeled, model, browser) text = Gtk.CellRendererText() toggle_column = Gtk.TreeViewColumn("", toggle, active=0) column = Gtk.TreeViewColumn(_("Tag"), text, text=1) view = Gtk.TreeView(model) view.append_column(toggle_column) view.append_column(column) sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(view) buttons = Gtk.HButtonBox() buttons.set_spacing(6) buttons.set_layout(Gtk.ButtonBoxStyle.END) close = Button(_("_Close"), Icons.WINDOW_CLOSE) close.connect('clicked', lambda *x: self.destroy()) buttons.pack_start(close, True, True, 0) box = Gtk.VBox(spacing=12) box.pack_start(sw, True, True, 0) box.pack_start(buttons, False, True, 0) self.add(box) self.show_all() def __filter(self, model, browser): selected = {} for row in model: sel, key, value = row if sel: selected[key] = value joined = ", ".join(sorted(selected.values())) if len(selected) >= 2: joined = "&(%s)" % joined browser.filter_text(joined) def __toggeled(self, render, path, model, browser): model[path][0] = not model[path][0] self.__filter(model, browser) class FilterAll(SongsMenuPlugin): PLUGIN_ID = "FilterAll" PLUGIN_NAME = _("Filter on Any Tag") PLUGIN_DESC = _("Creates a search query based on " "tags of the selected songs.") PLUGIN_ICON = Icons.EDIT_FIND REQUIRES_ACTION = True def plugin_songs(self, songs): browser = self.plugin_window.browser if not browser.can_filter_text(): return keys = {key for song in songs for key in song.realkeys()} keys.difference_update(MACHINE_TAGS) filters = {} for key in keys: values = set() for song in songs: values.update(song.list(key)) filters[key] = build_filter_query(key, values) SelectionWindow(filters, browser, parent=self.plugin_window) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/forcewrite.py�����������������������������������������������0000644�0001750�0001750�00000001514�13112005742�023267� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.plugins.songshelpers import any_song, is_writable class ForceWrite(SongsMenuPlugin): PLUGIN_ID = "Force Write" PLUGIN_NAME = _("Update Tags in Files") PLUGIN_DESC = _("Update modified tags in files. " "This will ensure play counts and ratings are up to date.") PLUGIN_ICON = Icons.DOCUMENT_SAVE plugin_handles = any_song(is_writable) def plugin_song(self, song): song._needs_write = True ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/splitting.py������������������������������������������������0000644�0001750�0001750�00000004144�13112005742�023135� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.plugins.songshelpers import any_song from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.string.splitters import split_title, split_album from quodlibet.qltk import Icons def has_album_splittable(song): return ("album" in song and "discnumber" not in song and song.can_change("album") and song.can_change("discnumber")) def has_title_splittable(song): return ("title" in song and song.can_change("title") and song.can_change("version")) class SplitTags(SongsMenuPlugin): PLUGIN_ID = "Split Tags" PLUGIN_NAME = _("Split Tags") PLUGIN_DESC = _("Splits the disc number from the album and the version " "from the title at the same time.") PLUGIN_ICON = Icons.EDIT_FIND_REPLACE plugin_handles = any_song(has_title_splittable) def plugin_song(self, song): if has_title_splittable(song): title, versions = split_title(song["title"]) if title: song["title"] = title if versions: song["version"] = "\n".join(versions) if has_album_splittable(song): album, disc = split_album(song["album"]) if album: song["album"] = album if disc: song["discnumber"] = disc class SplitAlbum(SongsMenuPlugin): PLUGIN_ID = "Split Album" PLUGIN_NAME = _("Split Album") PLUGIN_DESC = _("Split out disc number.") PLUGIN_ICON = Icons.EDIT_FIND_REPLACE plugin_handles = any_song(has_album_splittable) def plugin_song(self, song): if has_album_splittable(song): album, disc = split_album(song["album"]) if album: song["album"] = album if disc: song["discnumber"] = disc ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/replaygain.py�����������������������������������������������0000644�0001750�0001750�00000053723�13112005742�023262� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # ReplayGain Album Analysis using gstreamer rganalysis element # Copyright (C) 2005,2007,2009 Michael Urman # 2012,2014,2016 Nick Boultbee # 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # from gi.repository import Gtk from gi.repository import GObject from gi.repository import Pango from gi.repository import Gst from gi.repository import GLib from quodlibet import print_d, ngettext, _ from quodlibet.plugins import PluginConfigMixin from quodlibet.browsers.collection.models import EMPTY from quodlibet.qltk.views import HintedTreeView from quodlibet.qltk.x import Frame from quodlibet.qltk import Icons, Dialog from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.plugins.songshelpers import is_writable, is_finite, each_song from quodlibet.util import cached_property, print_w, print_e, format_int_locale from quodlibet.compat import xrange __all__ = ['ReplayGain'] def get_num_threads(): # multiprocessing is >= 2.6. # Default to 2 threads if cpu_count isn't implemented for the current arch # or multiprocessing isn't available try: import multiprocessing threads = multiprocessing.cpu_count() except (ImportError, NotImplementedError): threads = 2 return threads class UpdateMode(object): """Enum-like class for update strategies""" ALWAYS = "always" ALBUM_MISSING = "album_tags_missing" ANY_MISSING = "any_tags_missing" class RGAlbum(object): def __init__(self, rg_songs, process_mode): self.songs = rg_songs self.gain = None self.peak = None self.__should_process = None self.__process_mode = process_mode @property def progress(self): all_ = 0.0 done = 0.0 for song in self.songs: all_ += song.length done += song.length * song.progress try: return max(min(done / all_, 1.0), 0.0) except ZeroDivisionError: return 0.0 @property def done(self): for song in self.songs: if not song.done: return False return True @property def title(self): if not self.songs: return "" # It's ok - any() + generator is short-cut-logic-friendly if not any(rgs.song("album") for rgs in self.songs): return "(%s)" % EMPTY return self.songs[0].song.comma('~artist~album') @property def error(self): for song in self.songs: if song.error: return True return False def write(self): # Don't write incomplete data if not self.done: return for song in self.songs: song._write(self.gain, self.peak) @classmethod def from_songs(cls, songs, process_mode=UpdateMode.ALWAYS): return RGAlbum([RGSong(s) for s in songs], process_mode) @cached_property def should_process(self): """Returns true if the album needs analysis, according to prefs""" mode = self.__process_mode if mode == UpdateMode.ALWAYS: return True elif mode == UpdateMode.ANY_MISSING: return not all([s.has_all_rg_tags for s in self.songs]) elif mode == UpdateMode.ALBUM_MISSING: return not all([s.album_gain for s in self.songs]) else: print_w("Invalid setting for update mode: " + mode) # Safest to re-process probably. return True class RGSong(object): def __init__(self, song): self.song = song self.error = False self.gain = None self.peak = None self.progress = 0.0 self.done = False # TODO: support prefs for not overwriting individual existing tags # e.g. to re-run over entire library but keeping files untouched self.overwrite_existing = True def _write(self, album_gain, album_peak): if self.error or not self.done: return song = self.song def write_to_song(tag, pattern, value): if value is None or value == "": return existing = song(tag, None) if existing and not self.overwrite_existing: print_d("Not overwriting existing tag %s (=%s) for %s" % (tag, existing, self.song("~filename"))) return song[tag] = pattern % value write_to_song('replaygain_track_gain', '%.2f dB', self.gain) write_to_song('replaygain_track_peak', '%.4f', self.peak) write_to_song('replaygain_album_gain', '%.2f dB', album_gain) write_to_song('replaygain_album_peak', '%.4f', album_peak) # bs1770gain writes those and since we still do old replaygain # just delete them so players use the defaults. song.pop("replaygain_reference_loudness", None) song.pop("replaygain_algorithm", None) song.pop("replaygain_album_range", None) song.pop("replaygain_track_range", None) @property def title(self): return self.song('~tracknumber~title~version') @property def filename(self): return self.song("~filename") @property def length(self): return self.song("~#length") def _get_rg_tag(self, suffix): ret = self.song("~#replaygain_%s" % suffix) return None if ret == "" else ret @property def track_gain(self): return self._get_rg_tag("track_gain") @property def album_gain(self): return self._get_rg_tag("album_gain") @property def track_peak(self): return self._get_rg_tag('track_peak') @property def album_peak(self): return self._get_rg_tag('album_peak') @property def has_track_tags(self): return not (self.track_gain is None or self.track_peak is None) @property def has_album_tags(self): return not (self.album_gain is None or self.album_peak is None) @property def has_all_rg_tags(self): return self.has_track_tags and self.has_album_tags def __str__(self): vals = {k: self._get_rg_tag(k) for k in 'track_gain album_gain album_peak track_peak'.split()} return "<Song=%s RG data=%s>" % (self.song, vals) class ReplayGainPipeline(GObject.Object): __gsignals__ = { # done(self, album) 'done': (GObject.SignalFlags.RUN_LAST, None, (object,)), # update(self, album, song) 'update': (GObject.SignalFlags.RUN_LAST, None, (object, object,)), } def __init__(self): super(ReplayGainPipeline, self).__init__() self._current = None self._setup_pipe() def _setup_pipe(self): # gst pipeline for replay gain analysis: # filesrc!decodebin!audioconvert!audioresample!rganalysis!fakesink self.pipe = Gst.Pipeline() self.filesrc = Gst.ElementFactory.make("filesrc", "source") self.pipe.add(self.filesrc) self.decode = Gst.ElementFactory.make("decodebin", "decode") def new_decoded_pad(dbin, pad): pad.link(self.convert.get_static_pad("sink")) def sort_decoders(decode, pad, caps, factories): def set_prio(x): i, f = x i = {"mad": -1, "mpg123audiodec": -2}.get(f.get_name(), i) return (i, f) return list(zip(*sorted(map(set_prio, enumerate(factories)))))[1] self.decode.connect("autoplug-sort", sort_decoders) self.decode.connect("pad-added", new_decoded_pad) self.pipe.add(self.decode) self.filesrc.link(self.decode) self.convert = Gst.ElementFactory.make("audioconvert", "convert") self.pipe.add(self.convert) self.resample = Gst.ElementFactory.make("audioresample", "resample") self.pipe.add(self.resample) self.convert.link(self.resample) self.analysis = Gst.ElementFactory.make("rganalysis", "analysis") self.pipe.add(self.analysis) self.resample.link(self.analysis) self.sink = Gst.ElementFactory.make("fakesink", "sink") self.pipe.add(self.sink) self.analysis.link(self.sink) self.bus = bus = self.pipe.get_bus() bus.add_signal_watch() bus.connect("message", self._bus_message) def request_update(self): if not self._current: return ok, p = self.pipe.query_position(Gst.Format.TIME) if ok: length = self._current.length try: progress = float(p / Gst.SECOND) / length except ZeroDivisionError: progress = 0.0 progress = max(min(progress, 1.0), 0.0) self._current.progress = progress self._emit_update() def _emit_update(self): self.emit("update", self._album, self._current) def start(self, album): self._album = album self._songs = list(album.songs) self._done = [] self._next_song(first=True) def quit(self): self.bus.remove_signal_watch() self.pipe.set_state(Gst.State.NULL) def _next_song(self, first=False): if self._current: self._current.progress = 1.0 self._current.done = True self._emit_update() self._done.append(self._current) self._current = None if not self._songs: self.pipe.set_state(Gst.State.NULL) self.emit("done", self._album) return if first: self.analysis.set_property("num-tracks", len(self._songs)) else: self.analysis.set_locked_state(True) self.pipe.set_state(Gst.State.NULL) self._current = self._songs.pop(0) self.filesrc.set_property("location", self._current.filename) if not first: # flush, so the element takes new data after EOS pad = self.analysis.get_static_pad("src") pad.send_event(Gst.Event.new_flush_start()) pad.send_event(Gst.Event.new_flush_stop(True)) self.analysis.set_locked_state(False) self.pipe.set_state(Gst.State.PLAYING) def _bus_message(self, bus, message): if message.type == Gst.MessageType.TAG: tags = message.parse_tag() ok, value = tags.get_double(Gst.TAG_TRACK_GAIN) if ok: self._current.gain = value ok, value = tags.get_double(Gst.TAG_TRACK_PEAK) if ok: self._current.peak = value ok, value = tags.get_double(Gst.TAG_ALBUM_GAIN) if ok: self._album.gain = value ok, value = tags.get_double(Gst.TAG_ALBUM_PEAK) if ok: self._album.peak = value self._emit_update() elif message.type == Gst.MessageType.EOS: self._next_song() elif message.type == Gst.MessageType.ERROR: gerror, debug = message.parse_error() if gerror: print_e(gerror.message) print_e(debug) self._current.error = True self._next_song() class RGDialog(Dialog): def __init__(self, albums, parent, process_mode): super(RGDialog, self).__init__( title=_('ReplayGain Analyzer'), parent=parent) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Save"), Icons.DOCUMENT_SAVE, Gtk.ResponseType.OK) self.process_mode = process_mode self.set_default_size(600, 400) self.set_border_width(6) hbox = Gtk.HBox(spacing=6) info = Gtk.Label() hbox.pack_start(info, True, True, 0) self.vbox.pack_start(hbox, False, False, 6) swin = Gtk.ScrolledWindow() swin.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) swin.set_shadow_type(Gtk.ShadowType.IN) self.vbox.pack_start(swin, True, True, 0) view = HintedTreeView() swin.add(view) def icon_cdf(column, cell, model, iter_, *args): item = model[iter_][0] if item.error: cell.set_property('icon-name', Icons.DIALOG_ERROR) else: cell.set_property('icon-name', Icons.NONE) column = Gtk.TreeViewColumn() column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) icon_render = Gtk.CellRendererPixbuf() column.pack_start(icon_render, True) column.set_cell_data_func(icon_render, icon_cdf) view.append_column(column) def track_cdf(column, cell, model, iter_, *args): item = model[iter_][0] cell.set_property('text', item.title) cell.set_sensitive(model[iter_][1]) column = Gtk.TreeViewColumn(_("Track")) column.set_expand(True) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) track_render = Gtk.CellRendererText() track_render.set_property('ellipsize', Pango.EllipsizeMode.END) column.pack_start(track_render, True) column.set_cell_data_func(track_render, track_cdf) view.append_column(column) def progress_cdf(column, cell, model, iter_, *args): item = model[iter_][0] cell.set_property('value', int(item.progress * 100)) cell.set_sensitive(model[iter_][1]) column = Gtk.TreeViewColumn(_("Progress")) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) progress_render = Gtk.CellRendererProgress() column.pack_start(progress_render, True) column.set_cell_data_func(progress_render, progress_cdf) view.append_column(column) def gain_cdf(column, cell, model, iter_, *args): item = model[iter_][0] if item.gain is None or not item.done: cell.set_property('text', "-") else: cell.set_property('text', "%.2f db" % item.gain) cell.set_sensitive(model[iter_][1]) column = Gtk.TreeViewColumn(_("Gain")) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) gain_renderer = Gtk.CellRendererText() column.pack_start(gain_renderer, True) column.set_cell_data_func(gain_renderer, gain_cdf) view.append_column(column) def peak_cdf(column, cell, model, iter_, *args): item = model[iter_][0] if item.gain is None or not item.done: cell.set_property('text', "-") else: cell.set_property('text', "%.2f" % item.peak) cell.set_sensitive(model[iter_][1]) column = Gtk.TreeViewColumn(_("Peak")) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) peak_renderer = Gtk.CellRendererText() column.pack_start(peak_renderer, True) column.set_cell_data_func(peak_renderer, peak_cdf) view.append_column(column) self.create_pipelines() self._timeout = None self._sigs = {} self._done = [] self.__fill_view(view, albums) num_to_process = sum(int(rga.should_process) for rga in self._todo) template = ngettext( "There is <b>%(to-process)s</b> album to update (of %(all)s)", "There are <b>%(to-process)s</b> albums to update (of %(all)s)", num_to_process) info.set_markup(template % { "to-process": format_int_locale(num_to_process), "all": format_int_locale(len(self._todo)), }) self.connect("destroy", self.__destroy) self.connect('response', self.__response) def create_pipelines(self): # create as many pipelines as threads self.pipes = [ReplayGainPipeline() for _ in xrange(get_num_threads())] def __fill_view(self, view, albums): self._todo = [RGAlbum.from_songs(a, self.process_mode) for a in albums] self._count = len(self._todo) self.model = model = Gtk.TreeStore(object, bool) insert = model.insert for album in reversed(self._todo): enabled = album.should_process base = insert(None, 0, row=[album, enabled]) for song in reversed(album.songs): insert(base, 0, row=[song, enabled]) view.set_model(model) if len(self._todo) == 1: view.expand_all() def start_analysis(self): self._timeout = GLib.idle_add(self.__request_update) # fill the pipelines for p in self.pipes: if not self._todo: break self._sigs[p] = [ p.connect("done", self.__done), p.connect("update", self.__update), ] album = self.get_next_album() if not album: return p.start(album) def get_next_album(self): next_album = None while not next_album: if not self._todo: print_d("No more albums to process") return None next_album = self._todo.pop(0) if not next_album.should_process: print_d("%s needs no processing" % next_album.title) self._done.append(next_album) self.__update_view_for(next_album) next_album = None return next_album def __response(self, win, response): if response == Gtk.ResponseType.CANCEL: self.destroy() elif response == Gtk.ResponseType.OK: for album in self._done: album.write() self.destroy() def __destroy(self, *args): # shut down any active processing and clean up resources, timeouts if self._timeout: GLib.source_remove(self._timeout) for p in self.pipes: if p in self._sigs: for s in self._sigs.get(p, []): p.disconnect(s) p.quit() def __update(self, pipeline, album, song): for row in self.model: row_album = row[0] if row_album is album: self.model.row_changed(row.path, row.iter) for child in row.iterchildren(): row_song = child[0] if row_song is song: self.model.row_changed(child.path, child.iter) break break def __done(self, pipeline, album): self._done.append(album) if self._todo: pipeline.start(self._todo.pop(0)) self.__update_view_for(album) def __update_view_for(self, album): for row in self.model: row_album = row[0] if row_album is album: self.model.row_changed(row.path, row.iter) break def __request_update(self): GLib.source_remove(self._timeout) self._timeout = None # all done, stop if len(self._done) < self._count: for p in self.pipes: p.request_update() self._timeout = GLib.timeout_add(400, self.__request_update) return False class ReplayGain(SongsMenuPlugin, PluginConfigMixin): PLUGIN_ID = 'ReplayGain' PLUGIN_NAME = _('Replay Gain') PLUGIN_DESC = _('Analyzes and updates ReplayGain information, ' 'using GStreamer. Results are grouped by album.') PLUGIN_ICON = Icons.MULTIMEDIA_VOLUME_CONTROL CONFIG_SECTION = 'replaygain' plugin_handles = each_song(is_finite, is_writable) def plugin_albums(self, albums): mode = self.config_get("process_if", UpdateMode.ALWAYS) win = RGDialog(albums, parent=self.plugin_window, process_mode=mode) win.show_all() win.start_analysis() # plugin_done checks for metadata changes and opens the write dialog win.connect("destroy", self.__plugin_done) def __plugin_done(self, win): self.plugin_finish() @classmethod def PluginPreferences(cls, parent): vb = Gtk.VBox(spacing=12) # Tabulate all settings for neatness table = Gtk.Table(n_rows=1, n_columns=2) table.props.expand = False table.set_col_spacings(6) table.set_row_spacings(6) rows = [] def process_option_changed(combo): #xcode = combo.get_child().get_text() model = combo.get_model() lbl, value = model[combo.get_active()] cls.config_set("process_if", value) def create_model(): model = Gtk.ListStore(str, str) model.append(["<b>%s</b>" % _("always"), UpdateMode.ALWAYS]) model.append([_("if <b>any</b> RG tags are missing"), UpdateMode.ANY_MISSING]) model.append([_("if <b>album</b> RG tags are missing"), UpdateMode.ALBUM_MISSING]) return model def set_active(value): for i, item in enumerate(model): if value == item[1]: combo.set_active(i) model = create_model() combo = Gtk.ComboBox(model=model) set_active(cls.config_get("process_if", UpdateMode.ALWAYS)) renderer = Gtk.CellRendererText() combo.connect('changed', process_option_changed) combo.pack_start(renderer, True) combo.add_attribute(renderer, "markup", 0) rows.append((_("_Process albums:"), combo)) for (row, (label_text, entry)) in enumerate(rows): label = Gtk.Label(label=label_text) label.set_alignment(0.0, 0.5) label.set_use_underline(True) label.set_mnemonic_widget(entry) table.attach(label, 0, 1, row, row + 1, xoptions=Gtk.AttachOptions.FILL) table.attach(entry, 1, 2, row, row + 1) # Server settings Frame frame = Frame(_("Existing Tags"), table) vb.pack_start(frame, True, True, 0) return vb if not Gst.Registry.get().find_plugin("replaygain"): __all__ = [] del ReplayGain raise ImportError("GStreamer replaygain plugin not found") ���������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/albumart.py�������������������������������������������������0000644�0001750�0001750�00000075164�13112005742�022741� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Eduardo Gonzalez <wm.eddie@gmail.com>, Niklas Janlert # 2006 Joe Wreschnig # 2008 Antonio Riva, Eduardo Gonzalez <wm.eddie@gmail.com>, # Anthony Bretaudeau <wxcover@users.sourceforge.net>, # Jeremy Cantrell <jmcantrell@gmail.com> # 2010 Aymeric Mansoux <aymeric@goto10.org> # 2008-2013 Christoph Reiter # 2011-2017 Nick Boultbee # 2016 Mice Pápai # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import json import os import re import time import threading import gzip from xml.dom import minidom from gi.repository import Gtk, Pango, GLib, Gdk, GdkPixbuf from quodlibet.pattern import ArbitraryExtensionFileFromPattern from quodlibet.pattern import Pattern from quodlibet.plugins import PluginConfigMixin from quodlibet.plugins.songshelpers import any_song, is_a_file from quodlibet.util import format_size, print_exc from quodlibet.util.dprint import print_d, print_w from quodlibet import _ from quodlibet import util, qltk, app from quodlibet.qltk.msg import ConfirmFileReplace from quodlibet.qltk.x import Paned, Align, Button from quodlibet.qltk.views import AllTreeView from quodlibet.qltk import Icons from quodlibet.qltk.image import scale, add_border_widget, \ get_surface_for_pixbuf from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.path import iscommand from quodlibet.util.urllib import urlopen, Request from quodlibet.compat import urlencode, cBytesIO USER_AGENT = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) " \ "Gecko/20101210 Iceweasel/3.6.13 (like Firefox/3.6.13)" PLUGIN_CONFIG_SECTION = 'cover' CONFIG_ENG_PREFIX = 'engine_' SEARCH_PATTERN = Pattern( '<albumartist|<albumartist>|<artist>> - <album|<album>|<title>>') def get_encoding_from_socket(socket): content_type = socket.headers.get("Content-Type", "") p = map(str.strip, map(str.lower, content_type.split(";"))) enc = [t.split("=")[-1].strip() for t in p if t.startswith("charset")] return (enc and enc[0]) or "utf-8" def get_url(url, post=None, get=None): post_params = urlencode(post or {}) get_params = urlencode(get or {}) if get: get_params = '?' + get_params # add post, get data and headers url = '%s%s' % (url, get_params) if post_params: request = Request(url, post_params) else: request = Request(url) # for discogs request.add_header('Accept-Encoding', 'gzip') request.add_header('User-Agent', USER_AGENT) url_sock = urlopen(request) enc = get_encoding_from_socket(url_sock) # unzip the response if needed data = url_sock.read() if url_sock.headers.get("content-encoding", "") == "gzip": data = gzip.GzipFile(fileobj=cBytesIO(data)).read() url_sock.close() content_type = url_sock.headers.get('Content-Type', '').split(';', 1)[0] domain = re.compile('\w+://([^/]+)/').search(url).groups(0)[0] print_d("Got %s data from %s" % (content_type, domain)) return (data if content_type.startswith('image') else data.decode(enc)) def get_encoding(url): request = Request(url) request.add_header('Accept-Encoding', 'gzip') request.add_header('User-Agent', USER_AGENT) url_sock = urlopen(request) return get_encoding_from_socket(url_sock) class AmazonParser(object): """A class for searching covers from Amazon""" def __init__(self): self.page_count = 1 self.covers = [] self.limit = 0 def __parse_page(self, page, query): """Gets all item tags and calls the item parsing function for each""" # Amazon now requires that all requests be signed. # I have built a webapp on AppEngine for this purpose. -- wm_eddie # url = 'https://webservices.amazon.com/onca/xml' url = 'https://qlwebservices.appspot.com/onca/xml' parameters = { 'Service': 'AWSECommerceService', 'AWSAccessKeyId': '0RKH4ZH1JCFZHMND91G2', # Now Ignored. 'Operation': 'ItemSearch', 'ResponseGroup': 'Images,Small', 'SearchIndex': 'Music', 'Keywords': query, 'ItemPage': page, # This specifies where the money goes and needed since 1.11.2011 # (What a good reason to break API..) # ...so use the gnome.org one 'AssociateTag': 'gnomestore-20', } data = get_url(url, get=parameters) dom = minidom.parseString(data) pages = dom.getElementsByTagName('TotalPages') if pages: self.page_count = int(pages[0].firstChild.data) items = dom.getElementsByTagName('Item') print_d("Amazon: got %d search result(s)" % len(items)) for item in items: self.__parse_item(item) if len(self.covers) >= self.limit: break def __parse_item(self, item): """Extract all information and add the covers to the list.""" large = item.getElementsByTagName('LargeImage') small = item.getElementsByTagName('SmallImage') title = item.getElementsByTagName('Title') if large and small and title: cover = {} artist = item.getElementsByTagName('Artist') creator = item.getElementsByTagName('Creator') text = '' if artist: text = artist[0].firstChild.data elif creator: if len(creator) > 1: text = ', '.join([i.firstChild.data for i in creator]) else: text = creator[0].firstChild.data title_text = title[0].firstChild.data if len(text) and len(title_text): text += ' - ' cover['name'] = text + title_text url_tag = small[0].getElementsByTagName('URL')[0] cover['thumbnail'] = url_tag.firstChild.data url_tag = large[0].getElementsByTagName('URL')[0] cover['cover'] = url_tag.firstChild.data #Since we don't know the size, use the one from the HTML header. cover['size'] = get_size_of_url(cover['cover']) h_tag = large[0].getElementsByTagName('Height')[0] height = h_tag.firstChild.data w_tag = large[0].getElementsByTagName('Width')[0] width = w_tag.firstChild.data cover['resolution'] = '%s x %s px' % (width, height) cover['source'] = 'https://www.amazon.com' self.covers.append(cover) def start(self, query, limit=5): """Start the search and returns the covers""" self.page_count = 0 self.covers = [] self.limit = limit page = 1 while len(self.covers) < limit: self.__parse_page(page, query) if page >= self.page_count: break page += 1 return self.covers class DiscogsParser(object): """A class for searching covers from Amazon""" def __init__(self): self.page_count = 0 self.covers = [] self.limit = 0 self.creds = {'key': 'aWfZGjHQvkMcreUECGAp', 'secret': 'VlORkklpdvAwJMwxUjNNSgqicjuizJAl'} def __parse_page(self, page, query): """Gets all item tags and calls the item parsing function for each""" url = 'https://api.discogs.com/database/search' parameters = { 'type': 'release', 'q': query, 'page': page, # Assume that not all results are useful 'per_page': self.limit * 2, } parameters.update(self.creds) data = get_url(url, get=parameters) json_dict = json.loads(data) # TODO: rate limiting pages = json_dict.get('pagination', {}).get('pages', 0) if not pages: return self.page_count = int(pages) items = json_dict.get('results', {}) print_d("Discogs: got %d search result(s)" % len(items)) for item in items: self.__parse_item(item) if len(self.covers) >= self.limit: break def __parse_item(self, item): """Extract all information and add the covers to the list.""" thumbnail = item.get('thumb', '') if thumbnail is None: print_d("Release doesn't have a cover") return res_url = item.get('resource_url', '') data = get_url(res_url, get=self.creds) json_dict = json.loads(data) images = json_dict.get('images', []) for i, image in enumerate(images): type = image.get('type', '') if type != 'primary': continue uri = image.get('uri', '') cover = {'source': 'https://www.discogs.com', 'name': item.get('title', ''), 'thumbnail': image.get('uri150', thumbnail), 'cover': uri, 'size': get_size_of_url(uri)} width = image.get('width', 0) height = image.get('height', 0) cover['resolution'] = '%s x %s px' % (width, height) self.covers.append(cover) if len(self.covers) >= self.limit: break def start(self, query, limit=3): """Start the search and returns the covers""" self.page_count = 0 self.covers = [] self.limit = limit page = 1 while len(self.covers) < limit: self.__parse_page(page, query) if page < self.page_count: break page += 1 return self.covers class CoverArea(Gtk.VBox, PluginConfigMixin): """The image display and saving part.""" CONFIG_SECTION = PLUGIN_CONFIG_SECTION def __init__(self, parent, song): super(CoverArea, self).__init__() self.song = song self.dirname = song("~dirname") self.main_win = parent self.data_cache = [] self.current_data = None self.current_pixbuf = None self.image = Gtk.Image() self.button = Button(_("_Save"), Icons.DOCUMENT_SAVE_AS) self.button.set_sensitive(False) self.button.connect('clicked', self.__save) close_button = Button(_("_Close"), Icons.WINDOW_CLOSE) close_button.connect('clicked', lambda x: self.main_win.destroy()) self.window_fit = self.ConfigCheckButton(_('Fit image to _window'), 'fit', True) self.window_fit.connect('toggled', self.__scale_pixbuf) self.name_combo = Gtk.ComboBoxText() self.cmd = qltk.entry.ValidatingEntry(iscommand) # Both labels label_open = Gtk.Label(label=_('_Program:')) label_open.set_use_underline(True) label_open.set_mnemonic_widget(self.cmd) label_open.set_justify(Gtk.Justification.LEFT) self.open_check = self.ConfigCheckButton(_('_Edit image after saving'), 'edit', False) label_name = Gtk.Label(label=_('File_name:'), use_underline=True) label_name.set_use_underline(True) label_name.set_mnemonic_widget(self.name_combo) label_name.set_justify(Gtk.Justification.LEFT) self.cmd.set_text(self.config_get('edit_cmd', 'gimp')) # Create the filename combo box fn_list = ['cover.jpg', 'folder.jpg', '.folder.jpg'] # Issue 374 - add dynamic file names artist = song("artist") alartist = song("albumartist") album = song("album") labelid = song("labelid") if album: fn_list.append("<album>.jpg") if alartist: fn_list.append("<albumartist> - <album>.jpg") else: fn_list.append("<artist> - <album>.jpg") else: print_w(u"No album for \"%s\". Could be difficult " u"finding art…" % song("~filename")) title = song("title") if title and artist: fn_list.append("<artist> - <title>.jpg") if labelid: fn_list.append("<labelid>.jpg") set_fn = self.config_get('fn', fn_list[0]) for i, fn in enumerate(fn_list): self.name_combo.append_text(fn) if fn == set_fn: self.name_combo.set_active(i) if self.name_combo.get_active() < 0: self.name_combo.set_active(0) table = Gtk.Table(n_rows=2, n_columns=2, homogeneous=False) table.props.expand = False table.set_row_spacing(0, 5) table.set_row_spacing(1, 5) table.set_col_spacing(0, 5) table.set_col_spacing(1, 5) table.attach(label_open, 0, 1, 0, 1) table.attach(label_name, 0, 1, 1, 2) table.attach(self.cmd, 1, 2, 0, 1) table.attach(self.name_combo, 1, 2, 1, 2) self.scrolled = Gtk.ScrolledWindow() self.scrolled.add_with_viewport(self.image) self.scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) bbox = Gtk.HButtonBox() bbox.set_spacing(6) bbox.set_layout(Gtk.ButtonBoxStyle.END) bbox.pack_start(self.button, True, True, 0) bbox.pack_start(close_button, True, True, 0) bb_align = Align(valign=Gtk.Align.END, right=6) bb_align.add(bbox) main_hbox = Gtk.HBox() main_hbox.pack_start(table, False, True, 6) main_hbox.pack_start(bb_align, True, True, 0) top_hbox = Gtk.HBox() top_hbox.pack_start(self.open_check, True, True, 0) top_hbox.pack_start(self.window_fit, False, True, 0) main_vbox = Gtk.VBox() main_vbox.pack_start(top_hbox, True, True, 2) main_vbox.pack_start(main_hbox, True, True, 0) self.pack_start(self.scrolled, True, True, 0) self.pack_start(main_vbox, False, True, 5) # 5 MB image cache size self.max_cache_size = 1024 * 1024 * 5 # For managing fast selection switches of covers.. self.stop_loading = False self.loading = False self.current_job = 0 self.connect('destroy', self.__save_config) def __save(self, *data): """Save the cover and spawn the program to edit it if selected""" save_format = self.name_combo.get_active_text() # Allow use of patterns in creating cover filenames pattern = ArbitraryExtensionFileFromPattern(save_format) filename = pattern.format(self.song) print_d("Using '%s' as filename based on %s" % (filename, save_format)) file_path = os.path.join(self.dirname, filename) if os.path.exists(file_path): resp = ConfirmFileReplace(self, file_path).run() if resp != ConfirmFileReplace.RESPONSE_REPLACE: return try: f = open(file_path, 'wb') f.write(self.current_data) f.close() except IOError: qltk.ErrorMessage(None, _('Saving failed'), _('Unable to save "%s".') % file_path).run() else: if self.open_check.get_active(): try: util.spawn([self.cmd.get_text(), file_path]) except: pass app.cover_manager.cover_changed([self.song._song]) self.main_win.destroy() def __save_config(self, widget): self.config_set('edit_cmd', self.cmd.get_text()) self.config_set('fn', self.name_combo.get_active_text()) def __update(self, loader, *data): """Update the picture while it's loading""" if self.stop_loading: return pixbuf = loader.get_pixbuf() def idle_set(): if pixbuf is not None: surface = get_surface_for_pixbuf(self, pixbuf) self.image.set_from_surface(surface) GLib.idle_add(idle_set) def __scale_pixbuf(self, *data): if not self.current_pixbuf: return pixbuf = self.current_pixbuf if self.window_fit.get_active(): alloc = self.scrolled.get_allocation() width = alloc.width height = alloc.height scale_factor = self.get_scale_factor() boundary = (width * scale_factor, height * scale_factor) pixbuf = scale(pixbuf, boundary, scale_up=False) surface = get_surface_for_pixbuf(self, pixbuf) self.image.set_from_surface(surface) def __close(self, loader, *data): if self.stop_loading: return self.current_pixbuf = loader.get_pixbuf() GLib.idle_add(self.__scale_pixbuf) def set_cover(self, url): thr = threading.Thread(target=self.__set_async, args=(url,)) thr.setDaemon(True) thr.start() def __set_async(self, url): """Manages various things: Fast switching of covers (aborting old HTTP requests), The image cache, etc.""" self.current_job += 1 job = self.current_job self.stop_loading = True while self.loading: time.sleep(0.05) self.stop_loading = False if job != self.current_job: return self.loading = True GLib.idle_add(self.button.set_sensitive, False) self.current_pixbuf = None pbloader = GdkPixbuf.PixbufLoader() pbloader.connect('closed', self.__close) # Look for cached images raw_data = None for entry in self.data_cache: if entry[0] == url: raw_data = entry[1] break if not raw_data: pbloader.connect('area-updated', self.__update) data_store = cBytesIO() try: request = Request(url) request.add_header('User-Agent', USER_AGENT) url_sock = urlopen(request) except EnvironmentError: print_w(_("[albumart] HTTP Error: %s") % url) else: while not self.stop_loading: tmp = url_sock.read(1024 * 10) if not tmp: break pbloader.write(tmp) data_store.write(tmp) url_sock.close() if not self.stop_loading: raw_data = data_store.getvalue() self.data_cache.insert(0, (url, raw_data)) while 1: cache_sizes = [len(data[1]) for data in self.data_cache] if sum(cache_sizes) > self.max_cache_size: del self.data_cache[-1] else: break data_store.close() else: # Sleep for fast switching of cached images time.sleep(0.05) if not self.stop_loading: pbloader.write(raw_data) try: pbloader.close() except GLib.GError: pass self.current_data = raw_data if not self.stop_loading: GLib.idle_add(self.button.set_sensitive, True) self.loading = False class AlbumArtWindow(qltk.Window, PluginConfigMixin): """The main window including the search list""" CONFIG_SECTION = PLUGIN_CONFIG_SECTION THUMB_SIZE = 50 def __init__(self, songs): super(AlbumArtWindow, self).__init__() self.image_cache = [] self.image_cache_size = 10 self.search_lock = False self.set_title(_('Album Art Downloader')) self.set_icon_name(Icons.EDIT_FIND) self.set_default_size(800, 550) image = CoverArea(self, songs[0]) self.liststore = Gtk.ListStore(object, object) self.treeview = treeview = AllTreeView(model=self.liststore) self.treeview.set_headers_visible(False) self.treeview.set_rules_hint(True) targets = [("text/uri-list", 0, 0)] targets = [Gtk.TargetEntry.new(*t) for t in targets] treeview.drag_source_set( Gdk.ModifierType.BUTTON1_MASK, targets, Gdk.DragAction.COPY) treeselection = self.treeview.get_selection() treeselection.set_mode(Gtk.SelectionMode.SINGLE) treeselection.connect('changed', self.__select_callback, image) self.treeview.connect("drag-data-get", self.__drag_data_get, treeselection) rend_pix = Gtk.CellRendererPixbuf() img_col = Gtk.TreeViewColumn('Thumb') img_col.pack_start(rend_pix, False) def cell_data_pb(column, cell, model, iter_, *args): surface = model[iter_][0] cell.set_property("surface", surface) img_col.set_cell_data_func(rend_pix, cell_data_pb, None) treeview.append_column(img_col) rend_pix.set_property('xpad', 2) rend_pix.set_property('ypad', 2) border_width = self.get_scale_factor() * 2 rend_pix.set_property('width', self.THUMB_SIZE + 4 + border_width) rend_pix.set_property('height', self.THUMB_SIZE + 4 + border_width) def escape_data(data): for rep in ('\n', '\t', '\r', '\v'): data = data.replace(rep, ' ') return util.escape(' '.join(data.split())) def cell_data(column, cell, model, iter, data): cover = model[iter][1] esc = escape_data txt = '<b><i>%s</i></b>' % esc(cover['name']) txt += "\n<small>%s</small>" % ( _('from %(source)s') % { "source": util.italic(esc(cover['source']))}) if 'resolution' in cover: txt += "\n" + _('Resolution: %s') % util.italic( esc(cover['resolution'])) if 'size' in cover: txt += "\n" + _('Size: %s') % util.italic(esc(cover['size'])) cell.markup = txt cell.set_property('markup', cell.markup) rend = Gtk.CellRendererText() rend.set_property('ellipsize', Pango.EllipsizeMode.END) info_col = Gtk.TreeViewColumn('Info', rend) info_col.set_cell_data_func(rend, cell_data) treeview.append_column(info_col) sw_list = Gtk.ScrolledWindow() sw_list.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw_list.set_shadow_type(Gtk.ShadowType.IN) sw_list.add(treeview) self.search_field = Gtk.Entry() self.search_button = Button(_("_Search"), Icons.EDIT_FIND) self.search_button.connect('clicked', self.start_search) self.search_field.connect('activate', self.start_search) widget_space = 5 search_hbox = Gtk.HBox(spacing=widget_space) search_hbox.pack_start(self.search_field, True, True, 0) search_hbox.pack_start(self.search_button, False, True, 0) self.progress = Gtk.ProgressBar() left_vbox = Gtk.VBox(spacing=widget_space) left_vbox.pack_start(search_hbox, False, True, 0) left_vbox.pack_start(sw_list, True, True, 0) hpaned = Paned() hpaned.set_border_width(widget_space) hpaned.pack1(left_vbox, shrink=False) hpaned.pack2(image, shrink=False) hpaned.set_position(275) self.add(hpaned) self.show_all() left_vbox.pack_start(self.progress, False, True, 0) song = songs[0] text = SEARCH_PATTERN.format(song) self.set_text(text) self.start_search() def __drag_data_get(self, view, ctx, sel, tid, etime, treeselection): model, iter = treeselection.get_selected() if not iter: return cover = model.get_value(iter, 1) sel.set_uris([cover['cover']]) def start_search(self, *data): """Start the search using the text from the text entry""" text = self.search_field.get_text() if not text or self.search_lock: return self.search_lock = True self.search_button.set_sensitive(False) self.progress.set_fraction(0) self.progress.set_text(_(u'Searching…')) self.progress.show() self.liststore.clear() self.search = search = CoverSearch(self.__search_callback) for eng in ENGINES: if self.config_get_bool( CONFIG_ENG_PREFIX + eng['config_id'], True): search.add_engine(eng['class'], eng['replace']) search.start(text) # Focus the list self.treeview.grab_focus() self.connect("destroy", self.__destroy) def __destroy(self, *args): self.search.stop() def set_text(self, text): """set the text and move the cursor to the end""" self.search_field.set_text(text) self.search_field.emit('move-cursor', Gtk.MovementStep.BUFFER_ENDS, 0, False) def __select_callback(self, selection, image): model, iter = selection.get_selected() if not iter: return cover = model.get_value(iter, 1) image.set_cover(cover['cover']) def __add_cover_to_list(self, cover): try: pbloader = GdkPixbuf.PixbufLoader() pbloader.write(get_url(cover['thumbnail'])) pbloader.close() scale_factor = self.get_scale_factor() size = self.THUMB_SIZE * scale_factor - scale_factor * 2 pixbuf = pbloader.get_pixbuf().scale_simple(size, size, GdkPixbuf.InterpType.BILINEAR) pixbuf = add_border_widget(pixbuf, self) surface = get_surface_for_pixbuf(self, pixbuf) except (GLib.GError, IOError): pass else: def append(data): self.liststore.append(data) GLib.idle_add(append, [surface, cover]) def __search_callback(self, covers, progress): for cover in covers: self.__add_cover_to_list(cover) if self.progress.get_fraction() < progress: self.progress.set_fraction(progress) if progress >= 1: self.progress.set_text(_('Done')) GLib.timeout_add(700, self.progress.hide) self.search_button.set_sensitive(True) self.search_lock = False class CoverSearch(object): """Class for glueing the search engines together. No UI stuff.""" def __init__(self, callback): self.engine_list = [] self._stop = False def wrap(*args, **kwargs): if not self._stop: return callback(*args, **kwargs) self.callback = wrap self.finished = 0 def add_engine(self, engine, query_replace): """Adds a new search engine, query_replace is the string with which all special characters get replaced""" self.engine_list.append((engine, query_replace)) def stop(self): """After stop the progress callback will no longer be called""" self._stop = True def start(self, query): """Start search. The callback function will be called after each of the search engines has finished.""" for engine, replace in self.engine_list: thr = threading.Thread(target=self.__search_thread, args=(engine, query, replace)) thr.setDaemon(True) thr.start() #tell the other side that we are finished if there is nothing to do. if not len(self.engine_list): GLib.idle_add(self.callback, [], 1) def __search_thread(self, engine, query, replace): """Creates searching threads which call the callback function after they are finished""" clean_query = self.__cleanup_query(query, replace) result = [] try: result = engine().start(clean_query) except Exception: print_w("[AlbumArt] %s: %r" % (engine.__name__, query)) print_exc() self.finished += 1 #progress is between 0..1 progress = float(self.finished) / len(self.engine_list) GLib.idle_add(self.callback, result, progress) def __cleanup_query(self, query, replace): """split up at '-', remove some chars, only keep the longest words.. more false positives but much better results""" query = query.lower() if query.startswith("the "): query = query[4:] split = query.split('-') replace_str = ('+', '&', ',', '.', '!', '´', '\'', ':', ' and ', '(', ')') new_query = '' for part in split: for stri in replace_str: part = part.replace(stri, replace) p_split = part.split() p_split.sort(key=len, reverse=True) end = max(int(len(p_split) / 4), max(4 - len(p_split), 2)) p_split = p_split[:end] new_query += ' '.join(p_split) + ' ' return new_query.rstrip() def get_size_of_url(url): request = Request(url) request.add_header('Accept-Encoding', 'gzip') request.add_header('User-Agent', USER_AGENT) url_sock = urlopen(request) size = url_sock.headers.get('content-length') url_sock.close() return format_size(int(size)) if size else '' ENGINES = [ { 'class': AmazonParser, 'url': 'https://www.amazon.com/', 'replace': ' ', 'config_id': 'amazon', }, { 'class': DiscogsParser, 'url': 'https://www.discogs.com/', 'replace': ' ', 'config_id': 'discogs', }, ] class DownloadAlbumArt(SongsMenuPlugin, PluginConfigMixin): """Download and save album (cover) art from a variety of sources""" PLUGIN_ID = 'Download Album Art' PLUGIN_NAME = _('Download Album Art') PLUGIN_DESC = _('Downloads album covers from various websites.') PLUGIN_ICON = Icons.INSERT_IMAGE CONFIG_SECTION = PLUGIN_CONFIG_SECTION REQUIRES_ACTION = True plugin_handles = any_song(is_a_file) @classmethod def PluginPreferences(cls, window): table = Gtk.Table(n_rows=len(ENGINES), n_columns=2) table.props.expand = False table.set_col_spacings(6) table.set_row_spacings(6) frame = qltk.Frame(_("Sources"), child=table) for i, eng in enumerate(sorted(ENGINES, key=lambda x: x["url"])): check = cls.ConfigCheckButton( eng['config_id'].title(), CONFIG_ENG_PREFIX + eng['config_id'], True) table.attach(check, 0, 1, i, i + 1) button = Gtk.Button(label=eng['url']) button.connect('clicked', lambda s: util.website(s.get_label())) table.attach(button, 1, 2, i, i + 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) return frame def plugin_album(self, songs): return AlbumArtWindow(songs) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/__init__.py�������������������������������������������������0000644�0001750�0001750�00000000317�13112005742�022655� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/lastfmsync.py�����������������������������������������������0000644�0001750�0001750�00000025745�13112005742�023315� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010 Steven Robertson # 2016 Mice Pápai # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import shelve import time from datetime import date from threading import Thread from gi.repository import Gtk, GLib import quodlibet from quodlibet import _ from quodlibet import config, util, qltk from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.compat import urlencode from quodlibet.util.urllib import urlopen try: import json except ImportError: import simplejson as json API_KEY = "f536cdadb4c2aec75ae15e2b719cb3a1" def log(msg): util.print_d('[lastfmsync] %s' % msg) def apicall(method, **kwargs): """Performs Last.fm API call.""" real_args = { 'api_key': API_KEY, 'format': 'json', 'method': method, } real_args.update(kwargs) url = ''.join(["https://ws.audioscrobbler.com/2.0/?", urlencode(real_args)]) log(url) uobj = urlopen(url) resp = json.load(uobj) if 'error' in resp: errmsg = 'Last.fm API error: %s' % resp.get('message', '') log(errmsg) raise EnvironmentError(resp['error'], errmsg) return resp def config_get(key, default=None): return config.get('plugins', 'lastfmsync_%s' % key, default) class LastFMSyncCache(object): """Stores the Last.fm charts for a particular user.""" registered = 0 lastupdated = None def __init__(self, username): self.username = username self.charts = {} self.songs = {} def update_charts(self, progress=None): """Updates Last.fm charts for the given user. Returns True if an update was attempted, False otherwise. progress is a callback func (msg, frac) that will be called to update a UI. 'frac' may be None to indicate no change should be made. If the function returns False, this thread will stop early.""" def prog(msg, frac): if progress: if not progress(msg, frac): # this gets caught later raise ValueError() try: # Last.fm updates their charts weekly; we only poll for new # charts if it's been more than a day since the last poll if not self.registered: resp = apicall('user.getinfo', user=self.username) self.registered = int(resp['user']['registered']['unixtime']) now = time.time() if not self.lastupdated or self.lastupdated + (24 * 60 * 60) < now: prog(_("Updating chart list."), 0) resp = apicall('user.getweeklychartlist', user=self.username) charts = resp['weeklychartlist']['chart'] for chart in charts: # Charts keys are 2-tuple (from_timestamp, to_timestamp); # values are whether we still need to fetch the chart fro, to = map(lambda s: int(chart[s]), ('from', 'to')) # If the chart is older than the register date of the # user, don't download it. (So the download doesn't start # with ~2005 every time.) if to < self.registered: continue self.charts.setdefault((fro, to), True) self.lastupdated = now elif not filter(None, self.charts.values()): # No charts to fetch, no update scheduled. prog(_("Already up-to-date."), 1.) return False new_charts = filter(lambda k: self.charts[k], self.charts.keys()) for idx, (fro, to) in enumerate(sorted(new_charts)): chart_week = date.fromtimestamp(fro).isoformat() prog(_("Fetching chart for week of %s.") % chart_week, (idx + 1.) / (len(new_charts) + 2.)) args = {'user': self.username, 'from': fro, 'to': to} try: resp = apicall('user.getweeklytrackchart', **args) except EnvironmentError as err: msg = "HTTP error %d, retrying in %d seconds." log(msg % (err.code, 15)) for i in range(15, 0, -1): time.sleep(1) prog(msg % (err.code, i), None) resp = apicall('user.getweeklytrackchart', **args) try: tracks = resp['weeklytrackchart']['track'] except KeyError: tracks = [] # Delightfully, the API JSON frontend unboxes 1-element lists. if isinstance(tracks, dict): tracks = [tracks] for track in tracks: self._update_stats(track, fro, to) self.charts[(fro, to)] = False prog(_("Sync complete."), 1.) except ValueError: # this is probably from prog() pass except Exception: util.print_exc() prog(_("Error during sync"), None) return False return True def _update_stats(self, track, chart_fro, chart_to): """Updates a single track's stats. 'track' is as returned by API; 'chart_fro' and 'chart_to' are the chart's timestamp range.""" # we try track mbid, (artist mbid, name), (artist name, name) as keys keys = [] if track['mbid']: keys.append(track['mbid']) for artist in (track['artist']['mbid'], track['artist']['#text']): if artist: keys.append((artist.lower(), track['name'].lower())) stats = filter(None, map(self.songs.get, keys)) if stats: # Not sure if last.fm ever changes their tag values, but this # should map all changed values to the same object correctly plays = max(map(lambda d: d.get('playcount', 0), stats)) last = max(map(lambda d: d.get('lastplayed', 0), stats)) added = max(map(lambda d: d.get('added', chart_to), stats)) stats = stats[0] stats.update( {'playcount': plays, 'lastplayed': last, 'added': added}) else: stats = {'playcount': 0, 'lastplayed': 0, 'added': chart_to} stats['playcount'] = stats['playcount'] + int(track['playcount']) stats['lastplayed'] = max(stats['lastplayed'], chart_fro) stats['added'] = min(stats['added'], chart_to) for key in keys: self.songs[key] = stats def update_songs(self, songs): """Updates each SongFile in songs from the cache.""" for song in songs: keys = [] if 'musicbrainz_trackid' in song: keys.append(song['musicbrainz_trackid'].lower()) if 'musiscbrainz_artistid' in song: keys.append((song['musicbrainz_artistid'].lower(), song.get('title', '').lower())) keys.append((song.get('artist', '').lower(), song.get('title', '').lower())) stats = filter(None, map(self.songs.get, keys)) if not stats: continue stats = stats[0] playcount = max(song.get('~#playcount', 0), stats['playcount']) if playcount != 0: song['~#playcount'] = playcount lastplayed = max(song.get('~#lastplayed', 0), stats['lastplayed']) if lastplayed != 0: song['~#lastplayed'] = lastplayed song['~#added'] = min(song['~#added'], stats['added']) class LastFMSyncWindow(qltk.Dialog): def __init__(self, parent): super(LastFMSyncWindow, self).__init__( _("Last.fm Sync"), parent) self.add_button(_("_Cancel"), Gtk.ResponseType.REJECT) self.add_icon_button(_("_Save"), Icons.DOCUMENT_SAVE, Gtk.ResponseType.ACCEPT) self.set_border_width(5) self.set_default_size(300, 100) vbox = Gtk.VBox() vbox.set_spacing(12) self.progbar = Gtk.ProgressBar() vbox.pack_start(self.progbar, False, True, 0) self.status = Gtk.Label(label="") vbox.pack_start(self.status, True, True, 0) self.get_content_area().pack_start(vbox, True, True, 0) self.set_response_sensitive(Gtk.ResponseType.ACCEPT, False) self.show_all() def progress(self, message, fraction): self.status.set_text(message) if fraction is not None: self.progbar.set_fraction(fraction) self.progbar.set_text("%2.1f%%" % (fraction * 100)) if fraction == 1: self.set_response_sensitive(Gtk.ResponseType.ACCEPT, True) class LastFMSync(SongsMenuPlugin): PLUGIN_ID = "Last.fm Sync" PLUGIN_NAME = _("Last.fm Sync") PLUGIN_DESC = _("Updates your library's statistics from your " "Last.fm profile.") PLUGIN_ICON = Icons.EMBLEM_SHARED CACHE_PATH = os.path.join(quodlibet.get_user_dir(), "lastfmsync.db") def runner(self, cache): changed = True try: changed = cache.update_charts(self.progress) except: pass if changed: self.cache_shelf[cache.username] = cache self.cache_shelf.close() def progress(self, msg, frac): if self.running: GLib.idle_add(self.dialog.progress, msg, frac) return True else: return False def plugin_songs(self, songs): self.cache_shelf = shelve.open(self.CACHE_PATH) user = config_get('username', '') try: cache = self.cache_shelf.setdefault(user, LastFMSyncCache(user)) except Exception: # unpickle can fail in many ways. this is just cache, so ignore cache = self.cache_shelf[user] = LastFMSyncCache(user) self.dialog = LastFMSyncWindow(self.plugin_window) self.running = True thread = Thread(target=self.runner, args=(cache,)) thread.daemon = True thread.start() resp = self.dialog.run() if resp == Gtk.ResponseType.ACCEPT: cache.update_songs(songs) self.running = False self.dialog.destroy() @classmethod def PluginPreferences(klass, win): def entry_changed(entry): config.set('plugins', 'lastfmsync_username', entry.get_text()) label = Gtk.Label(label=_("_Username:"), use_underline=True) entry = UndoEntry() entry.set_text(config_get('username', '')) entry.connect('changed', entry_changed) label.set_mnemonic_widget(entry) hbox = Gtk.HBox() hbox.set_spacing(6) hbox.pack_start(label, False, True, 0) hbox.pack_start(entry, True, True, 0) return qltk.Frame(_("Account"), child=hbox) ���������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/html.py�����������������������������������������������������0000644�0001750�0001750�00000004200�13112005742�022055� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Eduardo Gonzalez # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.qltk import Icons from quodlibet.util import tag, escape from quodlibet.qltk.songlist import get_columns from quodlibet.qltk.chooser import choose_target_file from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.compat import text_type HTML = '''<html> <head><title>Quod Libet Playlist

My Quod Libet Playlist


%(headers)s %(songs)s
''' def to_html(songs): cols = get_columns() cols_s = "" for col in cols: cols_s += '%s' % tag(col) songs_s = "" for song in songs: s = '' for col in cols: col = {"~#rating": "~rating", "~#length": "~length"}.get( col, col) s += '\n%s' % ( escape(text_type(song.comma(col))) or ' ') s += '' songs_s += s return HTML % {'headers': cols_s, 'songs': songs_s} class ExportToHTML(SongsMenuPlugin): PLUGIN_ID = "Export to HTML" PLUGIN_NAME = _("Export to HTML") PLUGIN_DESC = _("Exports the selected song list to HTML.") REQUIRES_ACTION = True PLUGIN_ICON = Icons.TEXT_HTML def plugin_songs(self, songs): if not songs: return target = choose_target_file( self.plugin_window, _("Export to HTML"), _("_Save")) if target is not None: with open(target, "wb") as f: f.write(to_html(songs).encode("utf-8")) quodlibet-3.9.1/quodlibet/ext/songsmenu/embedded.py0000644000175000017500000000567013112005742022656 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # 2013, 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet import app from quodlibet import util from quodlibet.plugins.songshelpers import any_song, has_writable_image from quodlibet.qltk.x import MenuItem from quodlibet.qltk import Icons from quodlibet.qltk.wlw import WritingWindow from quodlibet.formats import EmbeddedImage, AudioFileError from quodlibet.plugins.songsmenu import SongsMenuPlugin class EditEmbedded(SongsMenuPlugin): PLUGIN_ID = "embedded_edit" PLUGIN_NAME = _("Edit Embedded Images") PLUGIN_DESC = _("Removes or replaces embedded images.") PLUGIN_ICON = Icons.INSERT_IMAGE plugin_handles = any_song(has_writable_image) """if any song supports editing, we are active""" def __init__(self, songs, *args, **kwargs): super(EditEmbedded, self).__init__(songs, *args, **kwargs) self.__menu = Gtk.Menu() self.__menu.connect('map', self.__map, songs) self.__menu.connect('unmap', self.__unmap) self.set_submenu(self.__menu) def __remove_images(self, menu_item, songs): win = WritingWindow(self.plugin_window, len(songs)) win.show() for song in songs: if song.has_images and song.can_change_images: try: song.clear_images() except AudioFileError: util.print_exc() if win.step(): break win.destroy() self.plugin_finish() def __set_image(self, menu_item, songs): win = WritingWindow(self.plugin_window, len(songs)) win.show() for song in songs: if song.can_change_images: fileobj = app.cover_manager.get_cover(song) if fileobj: path = fileobj.name image = EmbeddedImage.from_path(path) if image: try: song.set_image(image) except AudioFileError: util.print_exc() if win.step(): break win.destroy() self.plugin_finish() def __map(self, menu, songs): remove_item = MenuItem(_("_Remove all Images"), "edit-delete") remove_item.connect('activate', self.__remove_images, songs) menu.append(remove_item) set_item = MenuItem(_("_Embed Current Image"), "edit-paste") set_item.connect('activate', self.__set_image, songs) menu.append(set_item) menu.show_all() def __unmap(self, menu): for child in self.__menu.get_children(): self.__menu.remove(child) def plugin_songs(self, songs): return True quodlibet-3.9.1/quodlibet/ext/songsmenu/exact_rating.py0000644000175000017500000000354613112005742023575 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2014 Jan Path # 2014 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet import config from quodlibet.plugins.songshelpers import any_song from quodlibet.qltk.getstring import GetStringDialog from quodlibet.qltk import Icons from quodlibet.qltk.ratingsmenu import ConfirmRateMultipleDialog from quodlibet.plugins.songsmenu import SongsMenuPlugin class ExactRating(SongsMenuPlugin): PLUGIN_ID = "exact-rating" PLUGIN_NAME = _("Set Exact Rating") PLUGIN_DESC = _("Allows setting the rating of songs with a number.") REQUIRES_ACTION = True PLUGIN_ICON = Icons.USER_BOOKMARKS plugin_handles = any_song(lambda s: s.can_change()) def plugin_songs(self, songs): value = -1 while not 0 <= value <= 1: input_string = GetStringDialog( self.plugin_window, self.PLUGIN_NAME, _("Please give your desired rating on a scale " "from 0.0 to 1.0"), _("_Apply"), Icons.NONE ).run() if input_string is None: return try: value = float(input_string) except ValueError: continue count = len(songs) if (count > 1 and config.getboolean("browsers", "rating_confirm_multiple")): confirm_dialog = ConfirmRateMultipleDialog( self.plugin_window, count, value) if confirm_dialog.run() != Gtk.ResponseType.YES: return for song in songs: song["~#rating"] = value quodlibet-3.9.1/quodlibet/ext/songsmenu/custom_commands.py0000644000175000017500000002505113112005742024313 0ustar lazkalazka00000000000000# -*- coding: utf-8 -*- # Copyright 2012-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk import os from quodlibet.util.songwrapper import SongWrapper from quodlibet.qltk.songsmenu import ConfirmMultiSongInvoke import quodlibet from quodlibet import _ from quodlibet import qltk from quodlibet import util from quodlibet.pattern import Pattern from quodlibet.plugins import PluginConfigMixin from quodlibet.plugins.playlist import PlaylistPlugin from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk.data_editors import JSONBasedEditor from quodlibet.qltk.x import SeparatorMenuItem from quodlibet.qltk import ErrorMessage, Icons from quodlibet.qltk.getstring import GetStringDialog from quodlibet.util.dprint import print_w, print_d, print_e from quodlibet.util.json_data import JSONObject, JSONObjectDict from quodlibet.util import connect_obj, print_exc Field = JSONObject.Field class Command(JSONObject): """ Wraps an arbitrary shell command and its argument pattern. Serialises as JSON for some editability """ NAME = _("Command") FIELDS = { "name": Field(_("name"), _("The name of this command")), "command": Field(_("command"), _("The shell command syntax to run")), "parameter": Field(_("parameter"), _("If specified, a parameter whose occurrences in " "the command will be substituted with a " "user-supplied value, e.g. by using 'PARAM' " "all instances of '{PARAM}' in your command will " "have the value prompted for when run")), "pattern": Field(_("pattern"), _("The QL pattern, e.g. <~filename>, to use to " "compute a value for the command. For playlists, " "this also supports virtual tags <~playlistname> " "and <~#playlistindex>.")), "unique": Field(_("unique"), _("If set, this will remove duplicate computed values " "of the pattern")), "max_args": Field(_("max args"), _("The maximum number of argument to pass to the " "command at one time (like xargs)")), } def __init__(self, name=None, command=None, pattern="<~filename>", unique=False, parameter=None, max_args=10000, warn_threshold=50): JSONObject.__init__(self, name) self.command = str(command or "") self.pattern = str(pattern) self.unique = bool(unique) self.max_args = max_args self.parameter = str(parameter or "") self.__pat = Pattern(self.pattern) self.warn_threshold = warn_threshold def run(self, songs, playlist_name=None): """ Runs this command on `songs`, splitting into multiple calls if necessary. `playlist_name` if populated contains the Playlist's name. """ args = [] template_vars = {} if self.parameter: value = GetStringDialog(None, _("Input value"), _("Value for %s?") % self.parameter).run() template_vars[self.parameter] = value if playlist_name: print_d("Playlist command for %s" % playlist_name) template_vars["PLAYLIST"] = playlist_name self.command = self.command.format(**template_vars) print_d("Actual command=%s" % self.command) for i, song in enumerate(songs): wrapped = SongWrapper(song) if playlist_name: wrapped["~playlistname"] = playlist_name wrapped["~playlistindex"] = str(i + 1) wrapped["~#playlistindex"] = i + 1 arg = str(self.__pat.format(wrapped)) if not arg: print_w("Couldn't build shell command using \"%s\"." "Check your pattern?" % self.pattern) break if not self.unique: args.append(arg) elif arg not in args: args.append(arg) max = int((self.max_args or 10000)) com_words = self.command.split(" ") while args: print_d("Running %s with %d substituted arg(s) (of %d%s total)..." % (self.command, min(max, len(args)), len(args), " unique" if self.unique else "")) util.spawn(com_words + args[:max]) args = args[max:] @property def playlists_only(self): return ("~playlistname" in self.pattern or "playlistindex" in self.pattern) def __str__(self): return 'Command: "{command} {pattern}"'.format(**dict(self.data)) class CustomCommands(PlaylistPlugin, SongsMenuPlugin, PluginConfigMixin): PLUGIN_ICON = Icons.APPLICATION_UTILITIES PLUGIN_ID = "CustomCommands" PLUGIN_NAME = _("Custom Commands") PLUGIN_DESC = _("Runs custom commands (in batches if required) on songs " "using any of their tags.") # Here are some starters... DEFAULT_COMS = [ Command("Compress files", "file-roller -d"), Command("Browse folders (Thunar)", "thunar", "<~dirname>", unique=True, max_args=50, warn_threshold=20), Command(name="Flash notification", command="notify-send" " -t 2000" " -i /usr/share/icons/hicolor/scalable/apps/quodlibet.svg", pattern="<~rating> \"<version| (<version>)>\"" "<~people| by <~people>>" "<album|, from <album><discnumber| : disk <discnumber>>" "<~length| (<~length>)>", max_args=1, warn_threshold=10), Command(name="Output playlist to stdout", command="echo -e", pattern="<~playlistname>: <~playlistindex>. " " <~artist~title>\\\\n", warn_threshold=20), Command("Fix MP3 VBR with mp3val", "mp3val -f", unique=True, max_args=1), ] COMS_FILE = os.path.join( quodlibet.get_user_dir(), 'lists', 'customcommands.json') _commands = None """Commands known to the class""" def __set_pat(self, name): self.com_index = name def get_data(self, key): """Gets the pattern for a given key""" try: return self.all_commands()[key] except (KeyError, TypeError): print_d("Invalid key %s" % key) return None @classmethod def edit_patterns(cls, button): win = JSONBasedEditor(Command, cls.all_commands(), filename=cls.COMS_FILE, title=_("Edit Custom Commands")) # Cache busting cls._commands = None win.show() @classmethod def PluginPreferences(cls, parent): hb = Gtk.HBox(spacing=3) hb.set_border_width(0) button = qltk.Button(_("Edit Custom Commands") + "…", Icons.EDIT) button.set_tooltip_markup(_("Supports QL patterns\neg " "<tt><~artist~title></tt>")) button.connect("clicked", cls.edit_patterns) hb.pack_start(button, True, True, 0) hb.show_all() return hb @classmethod def all_commands(cls): if cls._commands is None: cls._commands = cls._get_saved_commands() return cls._commands @classmethod def _get_saved_commands(cls): filename = cls.COMS_FILE print_d("Loading saved commands from '%s'..." % filename) coms = None try: with open(filename) as f: coms = JSONObjectDict.from_json(Command, f.read()) except (IOError, ValueError) as e: print_w("Couldn't parse saved commands (%s)" % e) # Failing all else... if not coms: print_d("No commands found in %s. Using defaults." % filename) coms = {c.name: c for c in cls.DEFAULT_COMS} print_d("Loaded commands: %s" % coms.keys()) return coms def __init__(self, *args, **kwargs): super(CustomCommands, self).__init__(**kwargs) pl_mode = hasattr(self, '_playlists') and bool(len(self._playlists)) self.com_index = None self.unique_only = False submenu = Gtk.Menu() for name, c in self.all_commands().items(): item = Gtk.MenuItem(label=name) connect_obj(item, 'activate', self.__set_pat, name) if pl_mode and not c.playlists_only: continue item.set_sensitive(c.playlists_only == pl_mode) submenu.append(item) self.add_edit_item(submenu) if submenu.get_children(): self.set_submenu(submenu) else: self.set_sensitive(False) @classmethod def add_edit_item(cls, submenu): config = Gtk.MenuItem(label=_("Edit Custom Commands") + "…") connect_obj(config, 'activate', cls.edit_patterns, config) config.set_sensitive(not JSONBasedEditor.is_not_unique()) submenu.append(SeparatorMenuItem()) submenu.append(config) def plugin_songs(self, songs): self._handle_songs(songs) def plugin_playlist(self, playlist): print_d("Running playlist plugin for %s" % playlist) return self._handle_songs(playlist.songs, playlist) def _handle_songs(self, songs, playlist=None): # Check this is a launch, not a configure if self.com_index: com = self.get_data(self.com_index) if len(songs) > com.warn_threshold: if not ConfirmMultiSongInvoke.confirm( self, com.name, len(songs)): print_d("User decided not to run on %d songs" % len(songs)) return print_d("Running %s on %d song(s)" % (com, len(songs))) try: com.run(songs, playlist and playlist.name) except Exception as err: print_e("Couldn't run command %s: %s %s at:" % (com.name, type(err), err, )) print_exc() ErrorMessage( self.plugin_window, _("Unable to run custom command %s" % util.escape(self.com_index)), util.escape(str(err))).run() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/refresh.py��������������������������������������������������0000644�0001750�0001750�00000002510�13112005742�022551� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import app from quodlibet import _ from quodlibet.qltk.notif import Task from quodlibet.qltk import Icons from quodlibet.util import copool from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.i18n import numeric_phrase class RefreshSongs(SongsMenuPlugin): PLUGIN_ID = "refresh-songs" # Translators: Plugin name PLUGIN_NAME = _("Rescan Songs") PLUGIN_DESC = _("Checks for file changes and reloads / removes " "the songs if needed.") PLUGIN_ICON = Icons.VIEW_REFRESH def plugin_songs(self, songs): def check_songs(): desc = numeric_phrase("%d song", "%d songs", len(songs)) with Task(_("Rescan songs"), desc) as task: task.copool(check_songs) for i, song in enumerate(songs): song = song._song if song in app.library: app.library.reload(song) task.update((float(i) + 1) / len(songs)) yield copool.add(check_songs) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/editplaycount.py��������������������������������������������0000644�0001750�0001750�00000011231�13112005742�023777� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012-2015 Ryan "ZDBioHazard" Turner <zdbiohazard2@gmail.com> # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet.plugins.songshelpers import each_song, is_writable from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk import Icons class EditPlaycount(SongsMenuPlugin): PLUGIN_ID = "editplaycount" PLUGIN_NAME = _("Edit Playcount") PLUGIN_DESC = _("Edit a song's ~#playcount and ~#skipcount." "\n\n" "When multiple songs are selected, counts will be " "incremented, rather than set." "\n\n" "When setting a song's ~#playcount to 0, the " "~#lastplayed and ~#laststarted entries will be cleared. " "However, when setting a 0-play song to a positive play " "count, no play times will be created.") PLUGIN_ICON = Icons.EDIT REQUIRES_ACTION = True plugin_handles = each_song(is_writable) def plugin_songs(self, songs): # This is just here so the spinner has something to call. >.> def response(win, response_id): dlg.response(response_id) return # Create a dialog. dlg = Gtk.Dialog(title=_("Edit Playcount"), flags=(Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT)) dlg.add_button(_("_Cancel"), Gtk.ResponseType.REJECT) dlg.add_button(_("_Apply"), Gtk.ResponseType.APPLY) dlg.set_default_response(Gtk.ResponseType.APPLY) dlg.set_border_width(4) dlg.vbox.set_spacing(4) # Create some spinners. play = Gtk.SpinButton() play.set_adjustment(Gtk.Adjustment(0, -1000, 1000, 1, 1)) skip = Gtk.SpinButton() skip.set_adjustment(Gtk.Adjustment(0, -1000, 1000, 1, 1)) # Connect the signals. play.connect("activate", response, Gtk.ResponseType.APPLY) skip.connect("activate", response, Gtk.ResponseType.APPLY) # Set some defaults. play.set_numeric(True) skip.set_numeric(True) # Put all this stuff in a pretty table. table = Gtk.Table(rows=2, columns=2) table.set_row_spacings(4) table.set_col_spacings(4) table.attach(Gtk.Label(_("Play Count")), 0, 1, 0, 1) table.attach(Gtk.Label(_("Skip Count")), 0, 1, 1, 2) table.attach(play, 1, 2, 0, 1) table.attach(skip, 1, 2, 1, 2) dlg.vbox.add(table) # Make a couple tweaks based on the current mode. if len(songs) == 1: play.set_adjustment(Gtk.Adjustment(0, 0, 9999, 1, 1)) skip.set_adjustment(Gtk.Adjustment(0, 0, 9999, 1, 1)) play.set_value(songs[0].get('~#playcount', 0)) skip.set_value(songs[0].get('~#skipcount', 0)) else: note = Gtk.Label() note.set_justify(Gtk.Justification.CENTER) note.set_markup("<b>Multiple files selected.</b>\n" "Counts will be incremented.") dlg.vbox.add(note) dlg.show_all() # Only operate if apply is pressed. if dlg.run() == Gtk.ResponseType.APPLY: for song in songs: # Increment when not in single mode. if len(songs) == 1: song['~#playcount'] = play.get_value_as_int() song['~#skipcount'] = skip.get_value_as_int() else: # Can't use += here because these tags might not exist. song['~#playcount'] = max(0, (song.get('~#playcount', 0) + play.get_value_as_int())) song['~#skipcount'] = max(0, (song.get('~#skipcount', 0) + skip.get_value_as_int())) # When the playcount is set to 0, delete the playcount # itself and the last played/started time. We don't # want unused or impossible data floating around. if song.get('~#playcount', 0) == 0: for tag in ['~#playcount', '~#lastplayed', '~#laststarted']: song.pop(tag, None) # Also delete the skip count if it's zero. if song.get('~#skipcount', 0) == 0: song.pop('~#skipcount', None) dlg.destroy() return �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/playlist.py�������������������������������������������������0000644�0001750�0001750�00000012576�13112005742�022771� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2009 Christoph Reiter # 2014-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation # The Unofficial M3U and PLS Specification (Winamp): # http://forums.winamp.com/showthread.php?threadid=65772 import os from gi.repository import Gtk from os.path import relpath from quodlibet.plugins.playlist import PlaylistPlugin from quodlibet import _ from quodlibet import util, qltk from quodlibet.util.path import glib2fsn, get_home_dir from quodlibet.qltk.msg import ConfirmFileReplace from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin lastfolder = get_home_dir() class PlaylistExport(PlaylistPlugin, SongsMenuPlugin): PLUGIN_ID = 'Playlist Export' PLUGIN_NAME = _('Export as Playlist') PLUGIN_DESC = _('Exports songs to an M3U or PLS playlist.') PLUGIN_ICON = Icons.DOCUMENT_SAVE_AS REQUIRES_ACTION = True lastfolder = None def plugin_single_playlist(self, playlist): return self.__save_playlist(playlist.songs, playlist.name) def plugin_songs(self, songs): self.__save_playlist(songs) def __save_playlist(self, songs, name=None): dialog = Gtk.FileChooserDialog(self.PLUGIN_NAME, None, Gtk.FileChooserAction.SAVE) dialog.set_show_hidden(False) dialog.set_create_folders(True) dialog.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) dialog.add_button(_("_Save"), Gtk.ResponseType.OK) dialog.set_default_response(Gtk.ResponseType.OK) if name: dialog.set_current_name(name) ffilter = Gtk.FileFilter() ffilter.set_name("m3u") ffilter.add_mime_type("audio/x-mpegurl") ffilter.add_pattern("*.m3u") dialog.add_filter(ffilter) ffilter = Gtk.FileFilter() ffilter.set_name("pls") ffilter.add_mime_type("audio/x-scpls") ffilter.add_pattern("*.pls") dialog.add_filter(ffilter) dialog.set_current_folder(lastfolder) diag_cont = dialog.get_child() hbox_path = Gtk.HBox() combo_path = Gtk.ComboBoxText() hbox_path.pack_end(combo_path, False, False, 6) diag_cont.pack_start(hbox_path, False, False, 0) diag_cont.show_all() for option_text in [_("Use relative paths"), _("Use absolute paths")]: combo_path.append_text(option_text) combo_path.set_active(0) response = dialog.run() if response == Gtk.ResponseType.OK: file_path = glib2fsn(dialog.get_filename()) dir_path = os.path.dirname(file_path) file_format = dialog.get_filter().get_name() extension = "." + file_format if not file_path.endswith(extension): file_path += extension if os.path.exists(file_path): resp = ConfirmFileReplace(self.plugin_window, file_path).run() if resp != ConfirmFileReplace.RESPONSE_REPLACE: return relative = combo_path.get_active() == 0 files = self.__get_files(songs, dir_path, relative) if file_format == "m3u": self.__m3u_export(file_path, files) elif file_format == "pls": self.__pls_export(file_path, files) self.lastfolder = dir_path dialog.destroy() def __get_files(self, songs, dir_path, relative=False): files = [] for song in songs: f = {} if "~uri" in song: f['path'] = song('~filename') f['title'] = song("title") f['length'] = -1 else: path = song('~filename') if relative: path = relpath(path, dir_path) f['path'] = path f['title'] = "%s - %s" % ( song('~people').replace("\n", ", "), song('~title~version')) f['length'] = song('~#length') files.append(f) return files def __file_error(self, file_path): qltk.ErrorMessage( None, _("Unable to export playlist"), _("Writing to <b>%s</b> failed.") % util.escape(file_path)).run() def __m3u_export(self, file_path, files): try: fhandler = open(file_path, "w") except IOError: self.__file_error(file_path) else: text = "#EXTM3U\n" for f in files: text += "#EXTINF:%d,%s\n" % (f['length'], f['title']) text += f['path'] + "\n" fhandler.write(text.encode("utf-8")) fhandler.close() def __pls_export(self, file_path, files): try: fhandler = open(file_path, "w") except IOError: self.__file_error(file_path) else: text = "[playlist]\n" for num, f in enumerate(files): num += 1 text += "File%d=%s\n" % (num, f['path']) text += "Title%d=%s\n" % (num, f['title']) text += "Length%d=%s\n" % (num, f['length']) text += "NumberOfEntries=%d\n" % len(files) text += "Version=2\n" fhandler.write(text.encode("utf-8")) fhandler.close() ����������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/importexport.py���������������������������������������������0000644�0001750�0001750�00000013613�13112005742�023675� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Michael Urman # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from os.path import splitext, extsep, dirname from quodlibet import _ from quodlibet import app from quodlibet.plugins.songshelpers import each_song, is_writable, is_a_file, \ is_finite from quodlibet.qltk import ErrorMessage, Icons from quodlibet.util.path import get_home_dir from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.compat import cmp, iteritems __all__ = ['Export', 'Import'] lastfolder = get_home_dir() def filechooser(save, title): chooser = Gtk.FileChooserDialog( title=(save and "Export %s Metadata to ..." or "Import %s Metadata from ...") % title, action=(save and Gtk.FileChooserAction.SAVE or Gtk.FileChooserAction.OPEN)) chooser.add_button(_("_OK"), Gtk.ResponseType.ACCEPT) chooser.add_button(_("_Cancel"), Gtk.ResponseType.REJECT) for name, pattern in [('Tag files (*.tags)', '*.tags'), ('All Files', '*')]: filter = Gtk.FileFilter() filter.set_name(name) filter.add_pattern(pattern) chooser.add_filter(filter) chooser.set_current_folder(lastfolder) chooser.set_default_response(Gtk.ResponseType.ACCEPT) return chooser class Export(SongsMenuPlugin): PLUGIN_ID = "ExportMeta" PLUGIN_NAME = _("Export Metadata") PLUGIN_DESC = _("Exports metadata of selected songs as a .tags file.") PLUGIN_ICON = Icons.DOCUMENT_SAVE_AS REQUIRES_ACTION = True plugin_handles = each_song(is_finite) def plugin_album(self, songs): songs.sort(lambda a, b: cmp(a('~#track'), b('~#track')) or cmp(a('~basename'), b('~basename')) or cmp(a, b)) chooser = filechooser(save=True, title=songs[0]('album')) resp = chooser.run() fn = chooser.get_filename() chooser.destroy() if resp != Gtk.ResponseType.ACCEPT: return base, ext = splitext(fn) if not ext: fn = extsep.join([fn, 'tags']) global lastfolder lastfolder = dirname(fn) out = open(fn, 'w') for song in songs: print>>out, str(song('~basename')) keys = song.keys() keys.sort() for key in keys: if key.startswith('~'): continue for val in song.list(key): print>>out, '%s=%s' % (key, val.encode('utf-8')) print>>out class Import(SongsMenuPlugin): PLUGIN_ID = "ImportMeta" PLUGIN_NAME = _("Import Metadata") PLUGIN_DESC = _("Imports metadata for selected songs from a .tags file.") PLUGIN_ICON = Icons.DOCUMENT_OPEN REQUIRES_ACTION = True plugin_handles = each_song(is_writable, is_a_file) # Note: the usage of plugin_album here is sometimes NOT what you want. It # supports fixing up tags on several already-known albums just by walking # them via the plugin system and just selecting a new .tags; this mimics # export of several albums. # # However if one of the songs in your album is different from the rest # (e.g. # one isn't tagged, or only one is) it will be passed in as two different # invocations, neither of which has the right size. If you find yourself in # that scenario a lot more than the previous one, change this to # def plugin_songs(self, songs): # and comment out the songs.sort line for safety. def plugin_album(self, songs): songs.sort(lambda a, b: cmp(a('~#track'), b('~#track')) or cmp(a('~basename'), b('~basename')) or cmp(a, b)) chooser = filechooser(save=False, title=songs[0]('album')) box = Gtk.HBox() rename = Gtk.CheckButton("Rename Files") rename.set_active(False) box.pack_start(rename, True, True, 0) append = Gtk.CheckButton("Append Metadata") append.set_active(True) box.pack_start(append, True, True, 0) box.show_all() chooser.set_extra_widget(box) resp = chooser.run() append = append.get_active() rename = rename.get_active() fn = chooser.get_filename() chooser.destroy() if resp != Gtk.ResponseType.ACCEPT: return global lastfolder lastfolder = dirname(fn) metadata = [] names = [] index = 0 for line in open(fn, 'rU'): if index == len(metadata): names.append(line[:line.rfind('.')]) metadata.append({}) elif line == '\n': index = len(metadata) else: key, value = line[:-1].split('=', 1) value = value.decode('utf-8') try: metadata[index][key].append(value) except KeyError: metadata[index][key] = [value] if not (len(songs) == len(metadata) == len(names)): ErrorMessage(None, "Songs mismatch", "There are %(select)d songs selected, but %(meta)d " "songs in the file. Aborting." % dict(select=len(songs), meta=len(metadata))).run() return for song, meta, name in zip(songs, metadata, names): for key, values in iteritems(meta): if append and key in song: values = song.list(key) + values song[key] = '\n'.join(values) if rename: origname = song['~filename'] newname = name + origname[origname.rfind('.'):] app.library.rename(origname, newname) ���������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/makesorttags.py���������������������������������������������0000644�0001750�0001750�00000003104�13112005742�023617� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2008 Joe Wreschnig # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.plugins.songshelpers import any_song, is_finite, is_writable from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk import Icons def artist_to_sort(artist): try: rest, last = artist.rsplit(" ", 1) except ValueError: return None else: return ", ".join([last, rest]) def album_to_sort(album): try: first, rest = album.split(" ", 1) except ValueError: return None else: if first.lower() in ["a", "the"]: return ", ".join([rest, first]) class MakeSortTags(SongsMenuPlugin): PLUGIN_ID = "SortTags" PLUGIN_NAME = _("Create Sort Tags") PLUGIN_DESC = _("Converts album and artist names to sort names, poorly.") PLUGIN_ICON = Icons.EDIT plugin_handles = any_song(is_writable, is_finite) def plugin_song(self, song): for tag in ["album"]: values = filter(None, map(album_to_sort, song.list(tag))) if values and (tag + "sort") not in song: song[tag + "sort"] = "\n".join(values) for tag in ["artist", "albumartist", "performer"]: values = filter(None, map(artist_to_sort, song.list(tag))) if values and (tag + "sort") not in song: song[tag + "sort"] = "\n".join(values) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/brainz/�����������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022026� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/brainz/mb.py������������������������������������������������0000644�0001750�0001750�00000013167�13112005742�023010� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation try: # https://github.com/alastair/python-musicbrainzngs/issues/157 # Work around warnings getting enabled in musicbrainzngs import warnings f = list(warnings.filters) import musicbrainzngs warnings.filters[:] = f except ImportError: from quodlibet import plugins raise plugins.MissingModulePluginException("musicbrainzngs") # musicbrainzngs.get_url_by_id was added in version 0.5 if not hasattr(musicbrainzngs, "get_url_by_id"): from quodlibet import plugins raise plugins.MissingModulePluginException("musicbrainzngs >= 0.5") from quodlibet import app from quodlibet import const from quodlibet import util VARIOUS_ARTISTS_ARTISTID = '89ad4ac3-39f7-470e-963a-56509c546377' def is_mbid(id_): return len(id_) == 36 def search_releases(query): """Returns a list of ReleaseResult or raises MusicBrainzError""" musicbrainzngs.set_useragent(app.name, const.VERSION) return [Release(r) for r in musicbrainzngs.search_releases(query)["release-list"]] def _get_release(release_id): """Returns a release containing all recordings and artists or raises MusicBrainzError """ assert is_mbid(release_id) return musicbrainzngs.get_release_by_id( release_id, includes=["recordings", "artists", "artist-credits", "labels"] )["release"] class Artist(object): def __init__(self, name, sort_name, id_): self.name = name self.sort_name = sort_name self.id = id_ # MusicBrainz Artist ID / Album Artist ID @property def is_various(self): return self.id == VARIOUS_ARTISTS_ARTISTID @classmethod def from_credit(cls, mbcredit): artists = [] for credit in mbcredit: try: artist = credit["artist"] except TypeError: # join strings pass else: artists.append( Artist(artist["name"], artist["sort-name"], artist["id"])) return artists class ReleaseTrack(object): """Part of a Release, combines per track and per medium data""" def __init__(self, mbtrack, discnumber, track_count, disctitle): self._mbtrack = mbtrack self.discnumber = discnumber self.track_count = track_count self.disctitle = disctitle @property def id(self): """MusicBrainz release track ID""" return self._mbtrack["id"] @property def artists(self): return Artist.from_credit(self._mbtrack["artist-credit"]) @property def title(self): return self._mbtrack["recording"]["title"] @property def tracknumber(self): return self._mbtrack["position"] class Release(object): def __init__(self, mbrelease): self._mbrelease = mbrelease @property def labelid(self): label_list = self._mbrelease.get("label-info-list", []) if not label_list: return u"" return label_list[0].get("catalog-number", u"") @property def id(self): """MusicBrainz release ID""" return self._mbrelease["id"] @property def date(self): return self._mbrelease.get("date", u"") @property def medium_format(self): formats = [] for medium in self._mbrelease["medium-list"]: format_ = medium.get("format", u"") if format_: formats.append(format_) formats = util.list_unique(formats) return u"/".join(formats) @property def country(self): return self._mbrelease.get("country", u"") @property def disc_count(self): return self._mbrelease["medium-count"] @property def track_count(self): """Number of tracks for all included mediums""" track_count = 0 for medium in self._mbrelease["medium-list"]: if "track-count" in medium: track_count += medium["track-count"] if "pregap" in medium: track_count += 1 return track_count @property def tracks(self): tracks = [] for medium in self._mbrelease["medium-list"]: disc = medium["position"] title = medium.get("title", u"") track_count = medium["track-count"] if "pregap" in medium: track_count += 1 tracks.append( ReleaseTrack(medium["pregap"], disc, track_count, title)) for track in medium["track-list"]: tracks.append(ReleaseTrack(track, disc, track_count, title)) return tracks @property def title(self): return self._mbrelease["title"] @property def is_single_artist(self): """If all tracks have the same artists as the release""" ids = [a.id for a in self.artists] for track in self.tracks: track_ids = [a.id for a in track.artists] if ids != track_ids: return False return True @property def is_various_artists(self): artists = self.artists return len(artists) == 1 and artists[0].is_various @property def artists(self): return Artist.from_credit(self._mbrelease["artist-credit"]) def fetch_full(self): """Returns a new Release instance containing more info or raises MusicBrainzError This method is blocking.. """ return Release(_get_release(self.id)) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/brainz/util.py����������������������������������������������0000644�0001750�0001750�00000001346�13112005742�023363� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005-2010 Joshua Kwan <joshk@triplehelix.org>, # Michael Ball <michael.ball@gmail.com>, # Steven Robertson <steven@strobe.cc> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.plugins import PluginConfig def get_config(): pc = PluginConfig("brainz") defaults = pc.defaults defaults.set("year_only", False) defaults.set("albumartist", True) defaults.set("artist_sort", False) defaults.set("standard", True) defaults.set("labelid2", False) return pc pconfig = get_config() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/brainz/__init__.py������������������������������������������0000644�0001750�0001750�00000004032�13112005742�024140� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005-2010 Joshua Kwan <joshk@triplehelix.org>, # Michael Ball <michael.ball@gmail.com>, # Steven Robertson <steven@strobe.cc> # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet.qltk import Icons from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.plugins.songshelpers import is_writable, each_song, is_finite from .util import pconfig from .widgets import SearchWindow class MyBrainz(SongsMenuPlugin): PLUGIN_ID = "MusicBrainz lookup" PLUGIN_NAME = _("MusicBrainz Lookup") PLUGIN_ICON = Icons.MEDIA_OPTICAL PLUGIN_DESC = _('Re-tags an album based on a MusicBrainz search.') plugin_handles = each_song(is_writable, is_finite) def plugin_albums(self, albums): if not albums: return def win_finished_cb(widget, *args): if albums: start_processing(albums.pop(0)) else: self.plugin_finish() def start_processing(disc): win = SearchWindow(self.plugin_window, disc) win.connect("destroy", win_finished_cb) win.show() start_processing(albums.pop(0)) @classmethod def PluginPreferences(self, win): items = [ ('year_only', _('Only use year for "date" tag')), ('albumartist', _('Write "_albumartist" when needed')), ('artist_sort', _('Write sort tags for artist names')), ('standard', _('Write _standard MusicBrainz tags')), ('labelid2', _('Write "labelid" tag')), ] vb = Gtk.VBox() vb.set_spacing(8) for key, label in items: ccb = pconfig.ConfigCheckButton(label, key, populate=True) vb.pack_start(ccb, True, True, 0) return vb ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/brainz/query.py���������������������������������������������0000644�0001750�0001750�00000003341�13112005742�023550� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005-2010 Joshua Kwan <joshk@triplehelix.org>, # Michael Ball <michael.ball@gmail.com>, # Steven Robertson <steven@strobe.cc> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import threading import time from gi.repository import GLib from quodlibet.util import print_exc class QueryThread(object): """Daemon thread which does HTTP retries and avoids flooding.""" def __init__(self): self.running = True self.queue = [] thread = threading.Thread(target=self.__run) thread.daemon = True thread.start() def add(self, callback, func, *args, **kwargs): """Add a func to be evaluated in a background thread. Callback will be called with the result from the main thread. """ self.queue.append((callback, func, args, kwargs)) def stop(self): """Stop the background thread.""" self.running = False def __run(self): while self.running: if self.queue: callback, func, args, kwargs = self.queue.pop(0) try: res = func(*args, **kwargs) except: time.sleep(2) try: res = func(*args, **kwargs) except: print_exc() res = None def idle_check(cb, res): if self.running: cb(res) GLib.idle_add(idle_check, callback, res) time.sleep(1) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/brainz/widgets.py�������������������������������������������0000644�0001750�0001750�00000040334�13112005742�024054� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005-2010 Joshua Kwan <joshk@triplehelix.org>, # Michael Ball <michael.ball@gmail.com>, # Steven Robertson <steven@strobe.cc> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Pango from senf import fsn2text from quodlibet import _ from quodlibet import util from quodlibet.qltk import Dialog, Icons from quodlibet.qltk.models import ObjectStore from quodlibet.qltk.views import HintedTreeView, MultiDragTreeView from quodlibet.compat import iteritems, text_type from quodlibet.util.i18n import numeric_phrase from .query import QueryThread from .util import pconfig from .mb import search_releases def get_artist(album): """Returns a single artist likely to be the MB AlbumArtist, or None.""" for tag in ["albumartist", "artist", "performer"]: names = set() for song in album: for single in filter(None, song.get(tag, "").split("\n")): names.add(single) if len(names) == 1: return names.pop() elif len(names) > 1: return None return None def get_trackcount(album): """Returns the track count, hammered into submission.""" parts = [] for song in album: parts.extend(song.get("tracknumber", "0").split("/")) max_count = len(album) for part in parts: try: tracks = int(part) except ValueError: continue max_count = max(max_count, tracks) return max_count def build_query(album): """Builds an initial mb release search query. See: https://musicbrainz.org/doc/Development/XML%20Web%20Service/ Version%202/Search#Release """ if not album: return u"" alb = '"%s"' % album[0].comma("album").replace('"', '') art = get_artist(album) if art: alb = '%s AND artist:"%s"' % (alb, art.replace('"', '')) return u'%s AND tracks:%d' % (alb, get_trackcount(album)) class ResultComboBox(Gtk.ComboBox): """Formatted picker for different Result entries.""" def __init__(self, model): super(ResultComboBox, self).__init__(model=model) render = Gtk.CellRendererText() render.set_fixed_height_from_font(2) def celldata(layout, cell, model, iter_, data): release = model.get_value(iter_) extra_info = ", ".join( filter(None, [util.escape(release.date), util.escape(release.country), util.escape(release.medium_format), util.escape(release.labelid)])) artist_names = [a.name for a in release.artists] disc_count = release.disc_count track_count = release.track_count discs_text = numeric_phrase("%d disc", "%d discs", disc_count) tracks_text = numeric_phrase("%d track", "%d tracks", track_count) markup = "<b>%s</b>\n%s - %s, %s (%s)" % ( util.escape(release.title), util.escape(", ".join(artist_names)), util.escape(discs_text), util.escape(tracks_text), extra_info) cell.set_property('markup', markup) self.pack_start(render, True) self.set_cell_data_func(render, celldata, None) class ResultTreeView(HintedTreeView, MultiDragTreeView): """The result treeview""" def __init__(self, album): self.album = album self._release = None self.model = ObjectStore() self.model.append_many(album) super(ResultTreeView, self).__init__(self.model) self.set_headers_clickable(True) self.set_rules_hint(True) self.set_reorderable(True) self.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) mode = Pango.EllipsizeMode cols = [ (_('Filename'), self.__name_datafunc, True, mode.MIDDLE), (_('Disc'), self.__disc_datafunc, False, mode.END), (_('Track'), self.__track_datafunc, False, mode.END), (_('Title'), self.__title_datafunc, True, mode.END), (_('Artist'), self.__artist_datafunc, True, mode.END), ] for title, func, resize, mode in cols: render = Gtk.CellRendererText() render.set_property('ellipsize', mode) col = Gtk.TreeViewColumn(title, render) col.set_cell_data_func(render, func) col.set_resizable(resize) col.set_expand(resize) self.append_column(col) def iter_tracks(self): """Yields tuples of (release, track, song) combinations as they are shown in the list. """ tracks = self._tracks for idx, (song, ) in enumerate(self.model): if song is None: continue if idx >= len(tracks): continue track = tracks[idx] yield (self._release, track, song) def update_release(self, full_release): """Updates the TreeView, handling results with a different number of tracks than the album being tagged. Passing in None will reset the list. """ if full_release is not None: tracks = full_release.tracks else: tracks = [] for i in range(len(self.model), len(tracks)): self.model.append((None, )) for i in range(len(self.model), len(tracks), -1): if self.model[-1][0] is not None: break itr = self.model.get_iter_from_string(str(len(self.model) - 1)) self.model.remove(itr) self._release = full_release for row in self.model: self.model.row_changed(row.path, row.iter) # Only show artists if we have any has_artists = bool(filter(lambda t: t.artists, tracks)) col = self.get_column(4) col.set_visible(has_artists) # Only show discs column if we have more than one disc col = self.get_column(1) col.set_visible( bool(full_release) and bool(full_release.disc_count > 1)) self.columns_autosize() @property def _tracks(self): if self._release is None: return [] return self._release.tracks def __name_datafunc(self, col, cell, model, itr, data): song = model[itr][0] if song: cell.set_property('text', fsn2text(song("~basename"))) else: cell.set_property('text', '') def __track_datafunc(self, col, cell, model, itr, data): idx = model.get_path(itr)[0] if idx >= len(self._tracks): cell.set_property('text', '') else: cell.set_property('text', self._tracks[idx].tracknumber) def __disc_datafunc(self, col, cell, model, itr, data): idx = model.get_path(itr)[0] if idx >= len(self._tracks): cell.set_property('text', '') else: cell.set_property('text', self._tracks[idx].discnumber) def __title_datafunc(self, col, cell, model, itr, data): idx = model.get_path(itr)[0] if idx >= len(self._tracks): cell.set_property('text', '') else: cell.set_property('text', self._tracks[idx].title) def __artist_datafunc(self, col, cell, model, itr, data): idx = model.get_path(itr)[0] if idx >= len(self._tracks): cell.set_property('text', '') else: names = [a.name for a in self._tracks[idx].artists] cell.set_property('text', ", ".join(names)) def build_song_data(release, track): """Returns a dict of tags to apply to a song. All the values are unicode. If the value is empty it means the tag should be deleted. """ meta = {} join = lambda l: "\n".join(l) # track/disc data meta["tracknumber"] = "%s/%d" % (track.tracknumber, track.track_count) if release.disc_count > 1: meta["discnumber"] = "%s/%d" % (track.discnumber, release.disc_count) else: meta["discnumber"] = "" meta["title"] = track.title meta["musicbrainz_releasetrackid"] = track.id meta["musicbrainz_trackid"] = u"" # we used to write those, so delete # disc data meta["discsubtitle"] = track.disctitle # release data meta["album"] = release.title meta["date"] = release.date meta["musicbrainz_albumid"] = release.id meta["labelid"] = release.labelid if not release.is_single_artist and not release.is_various_artists: artists = release.artists meta["albumartist"] = join([a.name for a in artists]) meta["albumartistsort"] = join([a.sort_name for a in artists]) meta["musicbrainz_albumartistid"] = join([a.id for a in artists]) else: meta["albumartist"] = "" meta["albumartistsort"] = "" meta["musicbrainz_albumartistid"] = "" meta["artist"] = join([a.name for a in track.artists]) meta["artistsort"] = join([a.sort_name for a in track.artists]) meta["musicbrainz_artistid"] = join([a.id for a in track.artists]) meta["musicbrainz_releasetrackid"] = track.id # clean up "redundant" data if meta["albumartist"] == meta["albumartistsort"]: meta["albumartistsort"] = "" if meta["artist"] == meta["artistsort"]: meta["artistsort"] = "" # finally, as musicbrainzngs returns str values if it's ascii, we force # everything to unicode now for key, value in iteritems(meta): meta[key] = text_type(value) return meta def apply_options(meta, year_only, albumartist, artistsort, musicbrainz, labelid): """Takes the tags extracted from musicbrainz and adjusts them according to the user preferences. """ if year_only: meta["date"] = meta["date"].split('-', 1)[0] if not albumartist: meta["albumartist"] = u"" if not artistsort: meta["albumartistsort"] = u"" meta["artistsort"] = u"" if not musicbrainz: for key in meta: if key.startswith("musicbrainz_"): meta[key] = u"" if not labelid: meta["labelid"] = "" def apply_to_song(meta, song): """Applies the tags to a AudioFile instance""" for key, value in iteritems(meta): if not value: song.remove(key) else: assert isinstance(value, text_type) song[key] = value def sort_key(song): """Sort by path so untagged albums have a good start order. Also take into account the directory in case it's split in different folders by medium. """ return util.human_sort_key(fsn2text(song("~filename"))) class SearchWindow(Dialog): def __init__(self, parent, album): self.album = album self.album.sort(key=lambda s: sort_key(s)) self._resultlist = ObjectStore() self._releasecache = {} self._qthread = QueryThread() self.current_release = None super(SearchWindow, self).__init__(_("MusicBrainz lookup")) self.add_button(_("_Cancel"), Gtk.ResponseType.REJECT) self.add_icon_button(_("_Save"), Icons.DOCUMENT_SAVE, Gtk.ResponseType.ACCEPT) self.set_default_size(650, 500) self.set_border_width(5) self.set_transient_for(parent) save_button = self.get_widget_for_response(Gtk.ResponseType.ACCEPT) save_button.set_sensitive(False) vb = Gtk.VBox() vb.set_spacing(8) hb = Gtk.HBox() hb.set_spacing(8) sq = self.search_query = Gtk.Entry() sq.connect('activate', self._do_query) sq.set_text(build_query(album)) lbl = Gtk.Label(label=_("_Query:")) lbl.set_use_underline(True) lbl.set_mnemonic_widget(sq) stb = self.search_button = Gtk.Button(_('S_earch'), use_underline=True) stb.connect('clicked', self._do_query) hb.pack_start(lbl, False, True, 0) hb.pack_start(sq, True, True, 0) hb.pack_start(stb, False, True, 0) vb.pack_start(hb, False, True, 0) self.result_combo = ResultComboBox(self._resultlist) self.result_combo.connect('changed', self._result_changed) vb.pack_start(self.result_combo, False, True, 0) rhb = Gtk.HBox() rl = Gtk.Label() rl.set_markup(_("Results <i>(drag to reorder)</i>")) rl.set_alignment(0, 0.5) rhb.pack_start(rl, False, True, 0) rl = self.result_label = Gtk.Label(label="") rhb.pack_end(rl, False, True, 0) vb.pack_start(rhb, False, True, 0) sw = Gtk.ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.ALWAYS) rtv = self.result_treeview = ResultTreeView(self.album) rtv.set_border_width(8) sw.add(rtv) vb.pack_start(sw, True, True, 0) self.get_action_area().set_border_width(4) self.get_content_area().pack_start(vb, True, True, 0) self.connect('response', self._on_response) self.connect("destroy", self._on_destroy) stb.emit('clicked') self.get_child().show_all() def _on_destroy(self, *args): self._qthread.stop() def _on_response(self, widget, response): if response != Gtk.ResponseType.ACCEPT: self.destroy() return self._save() def _save(self): """Writes values to Song objects.""" year_only = pconfig.getboolean("year_only") albumartist = pconfig.getboolean("albumartist") artistsort = pconfig.getboolean("artist_sort") musicbrainz = pconfig.getboolean("standard") labelid = pconfig.getboolean("labelid2") for release, track, song in self.result_treeview.iter_tracks(): meta = build_song_data(release, track) apply_options( meta, year_only, albumartist, artistsort, musicbrainz, labelid) apply_to_song(meta, song) self.destroy() def _do_query(self, *args): """Search for album using the query text.""" query = util.gdecode(self.search_query.get_text()) if not query: self.result_label.set_markup( "<b>%s</b>" % _("Please enter a query.")) self.search_button.set_sensitive(True) return self.result_label.set_markup("<i>%s</i>" % _(u"Searching…")) self._qthread.add(self._process_results, search_releases, query) def _process_results(self, results): """Called when a query result is returned. `results` is None if an error occurred. """ self._resultlist.clear() self.search_button.set_sensitive(True) if results is None: self.result_label.set_text(_("Error encountered. Please retry.")) self.search_button.set_sensitive(True) return self._resultlist.append_many(results) if len(results) > 0: self.result_label.set_markup("<i>%s</i>" % _(u"Loading result…")) self.result_combo.set_active(0) else: self.result_label.set_markup(_("No results found.")) def _result_changed(self, combo): """Called when a release is chosen from the result combo.""" idx = combo.get_active() if idx == -1: return release = self._resultlist[idx][0] if release.id in self._releasecache: self._update_result(self._releasecache[release.id]) else: self.result_label.set_markup("<i>%s</i>" % _(u"Loading result…")) self.result_treeview.update_release(None) self._qthread.add(self._update_result, release.fetch_full) def _update_result(self, full_release): """Callback for release detail download from result combo.""" if full_release is None: self.result_label.set_text(_("Error encountered. Please retry.")) return self.result_label.set_text(u"") self._releasecache.setdefault(full_release.id, full_release) self.result_treeview.update_release(full_release) self.current_release = full_release save_button = self.get_widget_for_response(Gtk.ResponseType.ACCEPT) save_button.set_sensitive(True) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/browsefolders.py��������������������������������������������0000644�0001750�0001750�00000013425�13112005742�024002� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2016 Nick Boultbee # 2012,2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import subprocess from gi.repository import Gtk from senf import fsn2uri, fsnative from quodlibet.plugins.songshelpers import any_song, is_a_file try: import dbus except ImportError: dbus = None from quodlibet import _ from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk.msg import ErrorMessage from quodlibet.qltk import Icons from quodlibet.util.dprint import print_d class BrowseError(Exception): pass def group_songs(songs): """Groups a sequence of songs per dirname. The value order is the same as with the passed in songs. """ dirs = {} for s in songs: dirs.setdefault(s("~dirname"), []).append(s) return dirs def get_startup_id(): from quodlibet import app app_name = type(app.window).__name__ return "%s_TIME%d" % (app_name, Gtk.get_current_event_time()) def browse_folders_fdo(songs): # http://www.freedesktop.org/wiki/Specifications/file-manager-interface FDO_PATH = "/org/freedesktop/FileManager1" FDO_NAME = "org.freedesktop.FileManager1" FDO_IFACE = "org.freedesktop.FileManager1" if not dbus: raise BrowseError("no dbus") try: bus = dbus.SessionBus() bus_object = bus.get_object(FDO_NAME, FDO_PATH) bus_iface = dbus.Interface(bus_object, dbus_interface=FDO_IFACE) # open each folder and select the first file we have selected for dirname, sub_songs in group_songs(songs).items(): bus_iface.ShowItems([sub_songs[0]("~uri")], get_startup_id()) except dbus.DBusException as e: raise BrowseError(e) def browse_folders_thunar(songs, display=""): # http://git.xfce.org/xfce/thunar/tree/thunar/thunar-dbus-service-infos.xml XFCE_PATH = "/org/xfce/FileManager" XFCE_NAME = "org.xfce.FileManager" XFCE_IFACE = "org.xfce.FileManager" if not dbus: raise BrowseError("no dbus") try: bus = dbus.SessionBus() bus_object = bus.get_object(XFCE_NAME, XFCE_PATH) bus_iface = dbus.Interface(bus_object, dbus_interface=XFCE_IFACE) # open each folder and select the first file we have selected for dirname, sub_songs in group_songs(songs).items(): bus_iface.DisplayFolderAndSelect( fsn2uri(dirname), sub_songs[0]("~basename"), display, get_startup_id()) except dbus.DBusException as e: raise BrowseError(e) def browse_folders_gnome_open(songs): try: for dir_ in group_songs(songs).keys(): if subprocess.call(["gnome-open", dir_]) != 0: raise EnvironmentError("gnome-open error return status") except EnvironmentError as e: raise BrowseError(e) def browse_folders_xdg_open(songs): try: for dir_ in group_songs(songs).keys(): if subprocess.call(["xdg-open", dir_]) != 0: raise EnvironmentError("xdg-open error return status") except EnvironmentError as e: raise BrowseError(e) def show_files_win32(path, files): """Takes a path to a directory and a list of filenames in that directory to display. Returns True on success. """ assert os.name == "nt" assert isinstance(path, fsnative) assert all(isinstance(f, fsnative) for f in files) from quodlibet.util.windows import open_folder_and_select_items try: open_folder_and_select_items(path, files) except WindowsError: return False return True def browse_folders_win_explorer(songs): if os.name != "nt": raise BrowseError("windows only") for path, sub_songs in group_songs(songs).items(): if not show_files_win32(path, [s("~basename") for s in sub_songs]): raise BrowseError def browse_folders_finder(songs): if sys.platform != "darwin": raise BrowseError("OS X only") try: for dir_ in group_songs(songs).keys(): if subprocess.call(["open", "-R", dir_]) != 0: raise EnvironmentError("open error return status") except EnvironmentError as e: raise BrowseError(e) class BrowseFolders(SongsMenuPlugin): PLUGIN_ID = 'Browse Folders' PLUGIN_NAME = _('Browse Folders') PLUGIN_DESC = _("Opens the songs' folders in a file manager.") PLUGIN_ICON = Icons.DOCUMENT_OPEN _HANDLERS = [browse_folders_fdo, browse_folders_thunar, browse_folders_xdg_open, browse_folders_gnome_open, browse_folders_win_explorer, browse_folders_finder] def plugin_songs(self, songs): songs = [s for s in songs if s.is_file] print_d("Trying to browse folders...") if not self._handle(songs): ErrorMessage(self.plugin_window, _("Unable to open folders"), _("No program available to open folders.")).run() plugin_handles = any_song(is_a_file) """By default, any single song being a file is good enough""" def _handle(self, songs): """ Uses the first successful handler in callable list `_HANDLERS` to handle `songs` Returns False if none could be used """ for handler in self._HANDLERS: name = handler.__name__ try: print_d("Trying %r..." % name) handler(songs) except BrowseError as e: print_d("...failed: %r" % e) else: print_d("...success!") return True print_d("No handlers could be used.") return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/ifp.py������������������������������������������������������0000644�0001750�0001750�00000004407�13112005742�021700� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from quodlibet import _ from quodlibet import util, qltk from quodlibet.plugins.songshelpers import each_song, is_a_file from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk import Icons class IFPUpload(SongsMenuPlugin): PLUGIN_ID = "Send to iFP" PLUGIN_NAME = _("Send to iFP") PLUGIN_DESC = _("Uploads songs to an iRiver iFP device.") PLUGIN_ICON = Icons.MULTIMEDIA_PLAYER plugin_handles = each_song(is_a_file) def plugin_songs(self, songs): if os.system("ifp typestring"): qltk.ErrorMessage( None, "No iFP device found", "Unable to contact your iFP device. Check " "that the device is powered on and plugged " "in, and that you have ifp-line " "(http://ifp-driver.sf.net) installed.").run() return True self.__madedir = [] w = qltk.WaitLoadWindow( None, len(songs), "Uploading %d/%d", (0, len(songs))) w.show() for i, song in enumerate(songs): if self.__upload(song) or w.step(i, len(songs)): w.destroy() return True else: w.destroy() def __upload(self, song): filename = song["~filename"] basename = song("~basename") dirname = os.path.basename(os.path.dirname(filename)) target = os.path.join(dirname, basename) # Avoid spurious calls to ifp mkdir; this can take a long time # on a noisy USB line. if dirname not in self.__madedir: os.system("ifp mkdir %r> /dev/null 2>/dev/null" % dirname) self.__madedir.append(dirname) if os.system("ifp upload %r %r > /dev/null" % (filename, target)): qltk.ErrorMessage( None, "Error uploading", "Unable to upload <b>%s</b>. The device may be " "out of space, or turned off." % ( util.escape(filename))).run() return True ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/k3b.py������������������������������������������������������0000644�0001750�0001750�00000003771�13112005742�021604� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, # 2009,2012 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet import util from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.plugins.songshelpers import is_a_file, each_song from quodlibet.util.path import iscommand from quodlibet.qltk import Icons from quodlibet.util import connect_obj class BurnCD(SongsMenuPlugin): PLUGIN_ID = 'Burn CD' PLUGIN_NAME = _('Burn CD') PLUGIN_DESC = _('Burns CDs with K3b, Brasero or xfburn.') PLUGIN_ICON = Icons.MEDIA_OPTICAL plugin_handles = each_song(is_a_file) burn_programs = { # args, reverse order 'K3b': (['k3b', '--audiocd'], False), 'Brasero': (['brasero', '--audio'], False), 'Xfburn': (['xfburn', '--audio-composition'], True), } def __init__(self, *args, **kwargs): super(BurnCD, self).__init__(*args, **kwargs) self.prog_name = None items = self.burn_programs.items() progs = [(iscommand(x[1][0][0]), x) for x in items] progs.sort(reverse=True) submenu = Gtk.Menu() for (is_cmd, (name, (args, reverse))) in progs: item = Gtk.MenuItem(label=name) if not is_cmd: item.set_sensitive(False) else: connect_obj(item, 'activate', self.__set, name) submenu.append(item) self.set_submenu(submenu) def __set(self, name): self.prog_name = name def plugin_songs(self, songs): if self.prog_name is None: return args, reverse = self.burn_programs[self.prog_name] songs = sorted(songs, key=lambda s: s.sort_key, reverse=reverse) util.spawn(args + [song['~filename'] for song in songs]) �������quodlibet-3.9.1/quodlibet/ext/songsmenu/id3tlen.py��������������������������������������������������0000644�0001750�0001750�00000002745�13112005742�022467� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from mutagen.id3 import ID3 from quodlibet import _ from quodlibet import app from quodlibet import util from quodlibet.formats._id3 import ID3File from quodlibet.plugins.songshelpers import any_song, is_writable, is_an_id3 from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk import Icons class RemoveID3TLEN(SongsMenuPlugin): PLUGIN_ID = "RemoveID3TLEN" PLUGIN_NAME = _("Fix MP3 Duration") PLUGIN_DESC = _("Removes TLEN frames from ID3 tags which can be the cause " "for invalid song durations.") PLUGIN_ICON = Icons.EDIT_CLEAR plugin_handles = any_song(is_an_id3, is_writable) def plugin_songs(self, songs): for song in songs: song = song._song if not isinstance(song, ID3File): continue filename = song["~filename"] try: tag = ID3(filename) except Exception: util.print_exc() continue if not tag.getall("TLEN"): continue tag.delall("TLEN") try: tag.save() except Exception: util.print_exc() continue app.librarian.reload(song) ���������������������������quodlibet-3.9.1/quodlibet/ext/songsmenu/console.py��������������������������������������������������0000644�0001750�0001750�00000032454�13112005742�022567� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright (C) 2006 - Steve Frécinaux # 2016 - Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # Parts from "Interactive Python-GTK Console" # (stolen from epiphany's console.py) # Copyright (C), 1998 James Henstridge <james@daa.com.au> # Copyright (C), 2005 Adam Hooper <adamh@densi.com> # Bits from gedit Python Console Plugin # Copyright (C), 2005 Raphaël Slinckx # PythonConsole taken from totem # Plugin parts: # Copyright 2009,2010,2013 Christoph Reiter # 2016 Nick Boultbee import sys import re import traceback from gi.repository import Gtk, Pango, Gdk, GLib from quodlibet import _ from quodlibet import const from quodlibet.qltk import Icons from quodlibet.compat import exec_, PY2 from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.collection import Collection from quodlibet.util import print_ class PyConsole(SongsMenuPlugin): PLUGIN_ID = 'Python Console' PLUGIN_NAME = _('Python Console') PLUGIN_DESC = _('Interactive Python console.') PLUGIN_ICON = Icons.UTILITIES_TERMINAL def plugin_songs(self, songs): win = ConsoleWindow(songs) win.set_icon_name(self.PLUGIN_ICON) win.set_title(self.PLUGIN_DESC + " (Quod Libet)") win.show_all() class ConsoleWindow(Gtk.Window): def __init__(self, songs): Gtk.Window.__init__(self) files = [song('~filename') for song in songs] song_dicts = [song._song for song in songs] collection = Collection() collection.songs = song_dicts self.set_size_request(700, 500) from quodlibet import app console = PythonConsole( namespace={ 'songs': songs, 'files': files, 'sdict': song_dicts, 'col': collection, 'app': app}) self.add(console) access_string = _("You can access the following objects by default:") access_string += "\\n".join([ "", " %5s: SongWrapper objects", " %5s: Song dictionaries", " %5s: Filename list", " %5s: Songs Collection", " %5s: Application instance"]) % ( "songs", "sdict", "files", "col", "app") dir_string = _("Your current working directory is:") if PY2: console.eval("from __future__ import print_function", False) console.eval("import mutagen", False) console.eval("import os", False) console.eval("print(\"Python: %s / Quod Libet: %s\")" % (sys.version.split()[0], const.VERSION), False) console.eval("print(\"%s\")" % access_string, False) console.eval("print(\"%s \"+ os.getcwd())" % dir_string, False) console.connect("destroy", lambda *x: self.destroy()) class PythonConsole(Gtk.ScrolledWindow): def __init__(self, namespace=None, destroy_cb=None): Gtk.ScrolledWindow.__init__(self) self.destroy_cb = destroy_cb self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.set_shadow_type(Gtk.ShadowType.IN) self.view = Gtk.TextView() self.view.modify_font(Pango.font_description_from_string('Monospace')) self.view.set_editable(True) self.view.set_wrap_mode(Gtk.WrapMode.CHAR) self.add(self.view) self.view.show() buffer = self.view.get_buffer() self.normal = buffer.create_tag("normal") self.error = buffer.create_tag("error") self.error.set_property("foreground", "red") self.command = buffer.create_tag("command") self.command.set_property("foreground", "blue") self.__spaces_pattern = re.compile(r'^\s+') self.namespace = namespace or {} self.block_command = False # Init first line buffer.create_mark("input-line", buffer.get_end_iter(), True) buffer.insert(buffer.get_end_iter(), ">>> ") buffer.create_mark("input", buffer.get_end_iter(), True) # Init history self.history = [''] self.history_pos = 0 self.current_command = '' self.namespace['__history__'] = self.history # Set up hooks for standard output. self.stdout = OutFile(self, sys.stdout.fileno(), self.normal) self.stderr = OutFile(self, sys.stderr.fileno(), self.error) # Signals self.view.connect("key-press-event", self.__key_press_event_cb) buffer.connect("mark-set", self.__mark_set_cb) def __key_press_event_cb(self, view, event): modifier_mask = Gtk.accelerator_get_default_mod_mask() event_state = event.state & modifier_mask if event.keyval == Gdk.KEY_d and \ event_state == Gdk.ModifierType.CONTROL_MASK: self.destroy() elif event.keyval == Gdk.KEY_Return and \ event_state == Gdk.ModifierType.CONTROL_MASK: # Get the command buffer = view.get_buffer() inp_mark = buffer.get_mark("input") inp = buffer.get_iter_at_mark(inp_mark) cur = buffer.get_end_iter() line = buffer.get_text(inp, cur, True) self.current_command = self.current_command + line + "\n" self.history_add(line) # Prepare the new line cur = buffer.get_end_iter() buffer.insert(cur, "\n... ") cur = buffer.get_end_iter() buffer.move_mark(inp_mark, cur) # Keep indentation of preceding line spaces = re.match(self.__spaces_pattern, line) if spaces is not None: buffer.insert(cur, line[spaces.start():spaces.end()]) cur = buffer.get_end_iter() buffer.place_cursor(cur) GLib.idle_add(self.scroll_to_end) return True elif event.keyval == Gdk.KEY_Return: # Get the marks buffer = view.get_buffer() lin_mark = buffer.get_mark("input-line") inp_mark = buffer.get_mark("input") # Get the command line inp = buffer.get_iter_at_mark(inp_mark) cur = buffer.get_end_iter() line = buffer.get_text(inp, cur, True) self.current_command = self.current_command + line + "\n" self.history_add(line) # Make the line blue lin = buffer.get_iter_at_mark(lin_mark) buffer.apply_tag(self.command, lin, cur) buffer.insert(cur, "\n") cur_strip = self.current_command.rstrip() if (cur_strip.endswith(":") or (self.current_command[-2:] != "\n\n" and self.block_command)): # Unfinished block command self.block_command = True com_mark = "... " elif cur_strip.endswith("\\"): com_mark = "... " else: # Eval the command self.__run(self.current_command) self.current_command = '' self.block_command = False com_mark = ">>> " # Prepare the new line cur = buffer.get_end_iter() buffer.move_mark(lin_mark, cur) buffer.insert(cur, com_mark) cur = buffer.get_end_iter() buffer.move_mark(inp_mark, cur) buffer.place_cursor(cur) GLib.idle_add(self.scroll_to_end) return True elif event.keyval == Gdk.KEY_KP_Down or event.keyval == Gdk.KEY_Down: # Next entry from history view.emit_stop_by_name("key_press_event") self.history_down() GLib.idle_add(self.scroll_to_end) return True elif event.keyval == Gdk.KEY_KP_Up or event.keyval == Gdk.KEY_Up: # Previous entry from history view.emit_stop_by_name("key_press_event") self.history_up() GLib.idle_add(self.scroll_to_end) return True elif event.keyval == Gdk.KEY_KP_Left or \ event.keyval == Gdk.KEY_Left or \ event.keyval == Gdk.KEY_BackSpace: buffer = view.get_buffer() inp = buffer.get_iter_at_mark(buffer.get_mark("input")) cur = buffer.get_iter_at_mark(buffer.get_insert()) return inp.compare(cur) == 0 elif event.keyval == Gdk.KEY_Home: # Go to the begin of the command instead of the begin of the line buffer = view.get_buffer() inp = buffer.get_iter_at_mark(buffer.get_mark("input")) if event_state == Gdk.ModifierType.SHIFT_MASK: buffer.move_mark_by_name("insert", inp) else: buffer.place_cursor(inp) return True def __mark_set_cb(self, buffer, iter, name): input = buffer.get_iter_at_mark(buffer.get_mark("input")) pos = buffer.get_iter_at_mark(buffer.get_insert()) self.view.set_editable(pos.compare(input) != -1) def get_command_line(self): buffer = self.view.get_buffer() inp = buffer.get_iter_at_mark(buffer.get_mark("input")) cur = buffer.get_end_iter() return buffer.get_text(inp, cur, True) def set_command_line(self, command): buffer = self.view.get_buffer() mark = buffer.get_mark("input") inp = buffer.get_iter_at_mark(mark) cur = buffer.get_end_iter() buffer.delete(inp, cur) buffer.insert(inp, command) buffer.select_range(buffer.get_iter_at_mark(mark), buffer.get_end_iter()) self.view.grab_focus() def history_add(self, line): if line.strip() != '': self.history_pos = len(self.history) self.history[self.history_pos - 1] = line self.history.append('') def history_up(self): if self.history_pos > 0: self.history[self.history_pos] = self.get_command_line() self.history_pos -= 1 self.set_command_line(self.history[self.history_pos]) def history_down(self): if self.history_pos < len(self.history) - 1: self.history[self.history_pos] = self.get_command_line() self.history_pos += 1 self.set_command_line(self.history[self.history_pos]) def scroll_to_end(self): iter = self.view.get_buffer().get_end_iter() self.view.scroll_to_iter(iter, 0.0, False, 0.5, 0.5) return False def write(self, text, tag=None): buf = self.view.get_buffer() if tag is None: buf.insert(buf.get_end_iter(), text) else: buf.insert_with_tags(buf.get_end_iter(), text, tag) GLib.idle_add(self.scroll_to_end) def eval(self, command, display_command=False): buffer = self.view.get_buffer() lin = buffer.get_mark("input-line") buffer.delete(buffer.get_iter_at_mark(lin), buffer.get_end_iter()) if isinstance(command, list) or isinstance(command, tuple): for c in command: if display_command: self.write(">>> " + c + "\n", self.command) self.__run(c) else: if display_command: self.write(">>> " + c + "\n", self.command) self.__run(command) cur = buffer.get_end_iter() buffer.move_mark_by_name("input-line", cur) buffer.insert(cur, ">>> ") cur = buffer.get_end_iter() buffer.move_mark_by_name("input", cur) self.view.scroll_to_iter(buffer.get_end_iter(), 0.0, False, 0.5, 0.5) def __run(self, command): sys.stdout, self.stdout = self.stdout, sys.stdout sys.stderr, self.stderr = self.stderr, sys.stderr try: try: r = eval(command, self.namespace, self.namespace) if r is not None: print_(repr(r)) except SyntaxError: exec_(command, self.namespace) except: if hasattr(sys, 'last_type') and sys.last_type == SystemExit: self.destroy() else: traceback.print_exc() sys.stdout, self.stdout = self.stdout, sys.stdout sys.stderr, self.stderr = self.stderr, sys.stderr class OutFile(object): """A fake output file object. It sends output to a TK test widget, and if asked for a file number, returns one set on instance creation""" def __init__(self, console, fn, tag): self.fn = fn self.console = console self.tag = tag def close(self): pass def flush(self): pass def fileno(self): return self.fn def isatty(self): return 0 def read(self, a): return '' def readline(self): return '' def readlines(self): return [] def write(self, s): self.console.write(s, self.tag) def writelines(self, l): self.console.write(l, self.tag) def seek(self, a): raise IOError(29, 'Illegal seek') def tell(self): raise IOError(29, 'Illegal seek') truncate = tell ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/editing/��������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020146� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/editing/resub.py������������������������������������������������������0000644�0001750�0001750�00000003113�13112005742�021640� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import re from gi.repository import Gtk, GObject from quodlibet import _ from quodlibet.plugins.editing import RenameFilesPlugin, TagsFromPathPlugin from quodlibet.util import connect_obj, gdecode from quodlibet.qltk import Icons class RegExpSub(Gtk.HBox, RenameFilesPlugin, TagsFromPathPlugin): PLUGIN_ID = "Regex Substitution" PLUGIN_NAME = _("Regex Substitution") PLUGIN_DESC = _("Allows arbitrary regex substitutions (s///) when " "tagging or renaming files.") PLUGIN_ICON = Icons.EDIT_FIND_REPLACE __gsignals__ = { "changed": (GObject.SignalFlags.RUN_LAST, None, ()) } active = True def __init__(self): super(RegExpSub, self).__init__() self._from = Gtk.Entry() self._to = Gtk.Entry() self.pack_start(Gtk.Label("s/"), True, True, 0) self.pack_start(self._from, True, True, 0) self.pack_start(Gtk.Label("/"), True, True, 0) self.pack_start(self._to, True, True, 0) self.pack_start(Gtk.Label("/"), True, True, 0) connect_obj(self._from, 'changed', self.emit, 'changed') connect_obj(self._to, 'changed', self.emit, 'changed') def filter(self, orig_or_tag, value): fr = gdecode(self._from.get_text()) to = gdecode(self._to.get_text()) try: return re.sub(fr, to, value) except: return value �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/editing/titlecase.py��������������������������������������������������0000644�0001750�0001750�00000004443�13112005742�022504� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010-14 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet import util from quodlibet.qltk import Icons from quodlibet.plugins.editing import EditTagsPlugin from quodlibet.plugins import PluginConfigMixin from quodlibet.util.string.titlecase import _humanise class TitleCase(EditTagsPlugin, PluginConfigMixin): PLUGIN_ID = "Title Case" PLUGIN_NAME = _("Title Case") PLUGIN_DESC = _("Title-cases tag values in the tag editor.") PLUGIN_ICON = Icons.TOOLS_CHECK_SPELLING CONFIG_SECTION = "titlecase" # Issue 753: Allow all caps (as before). # Set to False means you get Run Dmc, Ac/Dc, Cd 1/2 etc allow_all_caps = True def process_tag(self, value): if not self.allow_all_caps: value = value.lower() value = util.title(value) return _humanise(value) if self.human else value def __init__(self, tag, value): self.allow_all_caps = self.config_get_bool('allow_all_caps', True) self.human = self.config_get_bool('human_title_case', True) super(TitleCase, self).__init__( label=_("Title-_case Value"), use_underline=True) self.set_image( Gtk.Image.new_from_icon_name(Icons.TOOLS_CHECK_SPELLING, Gtk.IconSize.MENU)) self.set_sensitive(self.process_tag(value) != value) @classmethod def PluginPreferences(cls, window): vb = Gtk.VBox() vb.set_spacing(8) config_toggles = [ ('allow_all_caps', _("Allow _ALL-CAPS in tags"), None, True), ('human_title_case', _("_Human title case"), _("Uses common English rules for title casing, as in" " \"Dark Night of the Soul\""), True), ] for key, label, tooltip, default in config_toggles: ccb = cls.ConfigCheckButton(label, key, default) if tooltip: ccb.set_tooltip_text(tooltip) vb.pack_start(ccb, True, True, 0) return vb def activated(self, tag, value): return [(tag, self.process_tag(value))] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/editing/__init__.py���������������������������������������������������0000644�0001750�0001750�00000000317�13112005742�022262� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/editing/iconv.py������������������������������������������������������0000644�0001750�0001750�00000004351�13112005742�021643� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation # Encoding magic. Show off the submenu stuff. from gi.repository import Gtk from quodlibet import _ from quodlibet.qltk import Icons from quodlibet.plugins.editing import EditTagsPlugin ENCODINGS = """\ big5 cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 euc_jp euc_jis_2004 euc_jisx0213 euc_kr gb2312 gbk gb18030 iso2022_jp iso2022_kr iso8859_2 iso8859_3 iso8859_4 iso8859_5 iso8859_6 iso8859_7 iso8859_8 iso8859_9 iso8859_10 iso8859_13 iso8859_14 iso8859_15 johab koi8_r koi8_u ptcp154 shift_jis utf_16_be utf_16_le""".split() class Iconv(EditTagsPlugin): PLUGIN_ID = "Convert Encodings" PLUGIN_NAME = _("Convert Encodings") PLUGIN_DESC = _("Fixes misinterpreted tag value encodings in the " "tag editor.") PLUGIN_ICON = Icons.EDIT_FIND_REPLACE def __init__(self, tag, value): super(Iconv, self).__init__( _(u"_Convert Encoding…"), use_underline=True) submenu = Gtk.Menu() items = [] # Ok, which encodings do work on this string? for enc in ENCODINGS: try: new = value.encode('latin1').decode(enc) except (UnicodeEncodeError, UnicodeDecodeError, LookupError): continue else: if new == value: continue if not new in items: items.append(new) if not items: self.set_sensitive(False) for i in items: item = Gtk.MenuItem() item.value = i item_label = Gtk.Label(label=i) item_label.set_alignment(0.0, 0.5) item.add(item_label) item.connect('activate', self.__convert) submenu.append(item) self.set_submenu(submenu) def __convert(self, item): self.__value = item.value self.activate() def activated(self, tag, value): try: return [(tag, self.__value)] except AttributeError: return [(tag, value)] ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/ext/editing/kakasi.py�����������������������������������������������������0000644�0001750�0001750�00000003626�13112005742�021774� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys from quodlibet.qltk import Icons if os.name == "nt" or sys.platform == "darwin": from quodlibet.plugins import PluginNotSupportedError raise PluginNotSupportedError from gi.repository import Gtk, GObject from quodlibet import _ from quodlibet.plugins.editing import RenameFilesPlugin from quodlibet.util.path import iscommand from quodlibet.util import connect_obj class Kakasi(RenameFilesPlugin, Gtk.CheckButton): PLUGIN_ID = "Kana/Kanji Simple Inverter" PLUGIN_NAME = _("Kana/Kanji Simple Inverter") PLUGIN_DESC = _("Converts kana/kanji to romaji before renaming.") PLUGIN_ICON = Icons.EDIT_FIND_REPLACE __gsignals__ = { "preview": (GObject.SignalFlags.RUN_LAST, None, ()) } def __init__(self): super(Kakasi, self).__init__( _("Romanize _Japanese text"), use_underline=True) connect_obj(self, 'toggled', self.emit, 'preview') @property def active(self): return self.get_active() # Use filter list rather than filter to avoid starting a new process # for each filename. def filter_list(self, originals, values): value = "\n".join(values) try: data = value.encode('shift-jis', 'replace') except None: return value line = ("kakasi -isjis -osjis -Ha -Ka -Ja -Ea -ka -s") w, r = os.popen2(line.split()) w.write(data) w.close() try: return r.read().decode('shift-jis').strip().split("\n") except: return values if not iscommand("kakasi"): from quodlibet import plugins raise plugins.PluginImportException( _("Couldn't find the 'Kanji Kana Simple Inverter' (kakasi).")) ����������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/unisearch/����������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017704� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/unisearch/parser.py�������������������������������������������������������0000644�0001750�0001750�00000021522�13112005742�021556� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import re import sre_parse import unicodedata from quodlibet import print_d from quodlibet.util import re_escape from quodlibet.compat import text_type, xrange, unichr from .db import get_replacement_mapping def _fixup_literal(literal, in_seq, mapping): u = unichr(literal) if u in mapping: u = u + u"".join(mapping[u]) need_seq = len(u) > 1 u = re_escape(u) if need_seq and not in_seq: u = u"[%s]" % u return u def _fixup_literal_list(literals, mapping): u = u"".join(map(unichr, literals)) # longest matches first, we will handle contained ones in the replacement # function reg = u"(%s)" % u"|".join( map(re_escape, sorted(mapping.keys(), key=len, reverse=True))) def replace_func(match): text = match.group(1) all_ = u"" for c in text: all_ += _fixup_literal(ord(c), False, mapping) if len(text) > 1: multi = u"".join(mapping[text]) if len(multi) > 1: multi = "[%s]" % re_escape(multi) else: multi = re_escape(multi) return "(?:%s|%s)" % (all_, multi) return all_ new = u"" pos = 0 for match in re.finditer(reg, u): new += re_escape(u[pos:match.start()]) new += replace_func(match) pos = match.end() new += re_escape(u[pos:]) return new def _fixup_not_literal(literal, mapping): u = unichr(literal) return u"[^%s]" % u"".join(re_escape(u + u"".join(mapping.get(u, [])))) def _fixup_range(start, end, mapping): extra = [] for i in xrange(start, end + 1): u = unichr(i) if u in mapping: extra.append(re_escape(u"".join(mapping[u]))) start = re_escape(unichr(start)) end = re_escape(unichr(end)) return u"%s%s-%s" % ("".join(extra), start, end) def _merge_literals(pattern): done = [] current = [] for op, av in pattern: op = str(op).lower() if op == "literal": current.append(av) else: if current: done.append(("literals", tuple(current))) current = [] done.append((op, av)) if current: done.append(("literals", tuple(current))) return done def _construct_in(pattern, mapping): negate = False parts = [] for op, av in _merge_literals(pattern): op = str(op).lower() if op == "range": start, end = av parts.append(_fixup_range(start, end, mapping)) elif op == "literals": expanded = [] for c in av: v = _fixup_literal(c, True, mapping) if v not in expanded: expanded.append(v) parts.extend(expanded) elif op == "negate": negate = True elif op == "category": av = str(av).lower() cats = { "category_word": u"\\w", "category_not_word": u"\\W", "category_digit": u"\\d", "category_not_digit": u"\\D", "category_space": u"\\s", "category_not_space": u"\\S", } try: parts.append(cats[av]) except KeyError: raise NotImplementedError(av) else: raise NotImplementedError(op) return "[%s%s]" % ("^" if negate else "", u"".join(parts)) def _construct_regexp(pattern, mapping): """Raises NotImplementedError""" parts = [] for op, av in _merge_literals(pattern): op = str(op).lower() assert op != "literal" if op == "not_literal": parts.append(_fixup_not_literal(av, mapping)) elif op == "literals": parts.append(_fixup_literal_list(av, mapping)) elif op == "category": av = str(av).lower() cats = { "category_word": u"\\w", "category_not_word": u"\\W", "category_digit": u"\\d", "category_not_digit": u"\\D", "category_space": u"\\s", "category_not_space": u"\\S", } try: parts.append(cats[av]) except KeyError: raise NotImplementedError(av) elif op == "any": parts.append(u".") elif op == "in": parts.append(_construct_in(av, mapping)) elif op == "max_repeat" or op == "min_repeat": min_, max_, pad = av pad = _construct_regexp(pad, mapping) if min_ == 1 and max_ == sre_parse.MAXREPEAT: parts.append(u"%s+" % pad) elif min_ == 0 and max_ == sre_parse.MAXREPEAT: parts.append(u"%s*" % pad) elif min_ == 0 and max_ == 1: parts.append(u"%s?" % pad) else: parts.append(u"%s{%d,%d}" % (pad, min_, max_)) if op == "min_repeat": parts[-1] = parts[-1] + u"?" elif op == "at": av = str(av).lower() ats = { "at_beginning": u"^", "at_end": u"$", "at_beginning_string": u"\\A", "at_boundary": u"\\b", "at_non_boundary": u"\\B", "at_end_string": u"\\Z", } try: parts.append(ats[av]) except KeyError: raise NotImplementedError(av) elif op == "subpattern": group, pad = av pad = _construct_regexp(pad, mapping) if group is None: parts.append(u"(?:%s)" % pad) else: parts.append(u"(%s)" % pad) elif op == "assert": direction, pad = av pad = _construct_regexp(pad, mapping) if direction == 1: parts.append(u"(?=%s)" % pad) elif direction == -1: parts.append(u"(?<=%s)" % pad) else: raise NotImplementedError(direction) elif op == "assert_not": direction, pad = av pad = _construct_regexp(pad, mapping) if direction == 1: parts.append(u"(?!%s)" % pad) elif direction == -1: parts.append(u"(?<!%s)" % pad) else: raise NotImplementedError(direction) elif op == "branch": dummy, branches = av branches = map(lambda b: _construct_regexp(b, mapping), branches) parts.append(u"%s" % (u"|".join(branches))) else: raise NotImplementedError(op) return u"".join(parts) def re_replace_literals(text, mapping): """Raises NotImplementedError or re.error""" assert isinstance(text, text_type) pattern = sre_parse.parse(text) return _construct_regexp(pattern, mapping) def re_add_variants(text): """Will replace all occurrences of ascii chars by a bracket expression containing the character and all its variants with a diacritic mark. "föhn" -> "[fḟ]ö[hĥȟḣḥḧḩḫẖ][nñńņňǹṅṇṉṋ]" In case the passed in regex is invalid raises re.error. Supports all regexp except ones with group references. In case something is not supported NotImplementedError gets raised. """ assert isinstance(text, text_type) text = unicodedata.normalize("NFC", text) return re_replace_literals(text, get_replacement_mapping()) def compile(pattern, ignore_case=True, dot_all=False, asym=False): """ Args: pattern (text_type): a unicode regex ignore_case (bool): if case shouuld be ignored when matching dot_all (bool): if "." should match newlines asym (bool): if ascii should match similar looking unicode chars Returns: A callable which will return True if the pattern is contained in the passed text. Raises: ValueError: In case the regex is invalid """ assert isinstance(pattern, text_type) pattern = unicodedata.normalize("NFC", pattern) if asym: try: pattern = re_add_variants(pattern) except NotImplementedError: # too complex, just skip this step print_d("regex not supported: %s" % pattern) except re.error as e: raise ValueError(e) mods = re.MULTILINE | re.UNICODE if ignore_case: mods |= re.IGNORECASE if dot_all: mods |= re.DOTALL try: reg = re.compile(pattern, mods) except re.error as e: raise ValueError(e) normalize = unicodedata.normalize def search(text): return reg.search(normalize("NFC", text)) return search ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/unisearch/__init__.py�����������������������������������������������������0000644�0001750�0001750�00000001346�13112005742�022023� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """ Functions for adjusting regular expressions so that ASCII characters in them match similar looking unicode characters. re_add_variants(u"Mum") => u"[MḾṀṂ][uùúûüũūŭůűųưǔǖǘǚǜȕȗṳṵṷṹṻụủứừửữự][mḿṁṃ]" This is similar to Asymmetric Search: http://unicode.org/reports/tr10/#Asymmetric_Search The goal is to make searching easy using a english keyboard without any knowledge of other languages. """ from .parser import compile compile ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/unisearch/db.py�����������������������������������������������������������0000644�0001750�0001750�00000033162�13112005742�020652� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import unicodedata import sys from quodlibet.util import cached_func from quodlibet.compat import iteritems, urlopen, xrange, unichr _DIACRITIC_CACHE = { u'\u0300': (u'AEINOUWYaeinouwy\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9' u'\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0415\u0418' u'\u0435\u0438'), u'\u0300\u0345': u'\u03b1\u03b7\u03c9', u'\u0301': (u'ACEGIKLMNOPRSUWYZacegiklmnoprsuwyz\xc6\xd8\xe6\xf8\u0391' u'\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7' u'\u03b9\u03bf\u03c5\u03c9\u0413\u041a\u0433\u043a'), u'\u0301\u0307': u'Ss', u'\u0301\u0345': u'\u03b1\u03b7\u03c9', u'\u0302': u'ACEGHIJOSUWYZaceghijosuwyz', u'\u0302\u0300': u'AEOaeo', u'\u0302\u0301': u'AEOaeo', u'\u0302\u0303': u'AEOaeo', u'\u0302\u0309': u'AEOaeo', u'\u0303': u'AEINOUVYaeinouvy', u'\u0303\u0301': u'OUou', u'\u0303\u0304': u'Oo', u'\u0303\u0308': u'Oo', u'\u0304': (u'AEGIOUYaegiouy\xc6\xe6\u0391\u0399\u03a5\u03b1\u03b9' u'\u03c5\u0418\u0423\u0438\u0443'), u'\u0304\u0300': u'EOeo', u'\u0304\u0301': u'EOeo', u'\u0304\u0308': u'Uu', u'\u0306': (u'AEGIOUaegiou\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410' u'\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443'), u'\u0306\u0300': u'Aa', u'\u0306\u0301': u'Aa', u'\u0306\u0303': u'Aa', u'\u0306\u0309': u'Aa', u'\u0307': u'ABCDEFGHIMNOPRSTWXYZabcdefghmnoprstwxyz', u'\u0307\u0304': u'AOao', u'\u0308': (u'AEHIOUWXYaehiotuwxy\u0399\u03a5\u03b9\u03c5\u0406\u0410' u'\u0415\u0416\u0417\u0418\u041e\u0423\u0427\u042b\u042d' u'\u0430\u0435\u0436\u0437\u0438\u043e\u0443\u0447\u044b' u'\u044d\u0456\u04d8\u04d9\u04e8\u04e9'), u'\u0308\u0300': u'Uu\u03b9\u03c5', u'\u0308\u0301': u'IUiu\u03b9\u03c5', u'\u0308\u0304': u'AOUaou', u'\u0308\u030c': u'Uu', u'\u0308\u0342': u'\u03b9\u03c5', u'\u0309': u'AEIOUYaeiouy', u'\u030a': u'AUauwy', u'\u030a\u0301': u'Aa', u'\u030b': u'OUou\u0423\u0443', u'\u030c': u'ACDEGHIKLNORSTUZacdeghijklnorstuz\u01b7\u0292', u'\u030c\u0307': u'Ss', u'\u030f': u'AEIORUaeioru\u0474\u0475', u'\u0311': u'AEIORUaeioru', u'\u0313': (u'\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7' u'\u03b9\u03bf\u03c1\u03c5\u03c9'), u'\u0313\u0300': (u'\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5' u'\u03b7\u03b9\u03bf\u03c5\u03c9'), u'\u0313\u0300\u0345': u'\u0391\u0397\u03a9\u03b1\u03b7\u03c9', u'\u0313\u0301': (u'\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5' u'\u03b7\u03b9\u03bf\u03c5\u03c9'), u'\u0313\u0301\u0345': u'\u0391\u0397\u03a9\u03b1\u03b7\u03c9', u'\u0313\u0342': u'\u0391\u0397\u0399\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9', u'\u0313\u0342\u0345': u'\u0391\u0397\u03a9\u03b1\u03b7\u03c9', u'\u0313\u0345': u'\u0391\u0397\u03a9\u03b1\u03b7\u03c9', u'\u0314': (u'\u0391\u0395\u0397\u0399\u039f\u03a1\u03a5\u03a9\u03b1' u'\u03b5\u03b7\u03b9\u03bf\u03c1\u03c5\u03c9'), u'\u0314\u0300': (u'\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1' u'\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9'), u'\u0314\u0300\u0345': u'\u0391\u0397\u03a9\u03b1\u03b7\u03c9', u'\u0314\u0301': (u'\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1' u'\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9'), u'\u0314\u0301\u0345': u'\u0391\u0397\u03a9\u03b1\u03b7\u03c9', u'\u0314\u0342': (u'\u0391\u0397\u0399\u03a5\u03a9\u03b1\u03b7\u03b9' u'\u03c5\u03c9'), u'\u0314\u0342\u0345': u'\u0391\u0397\u03a9\u03b1\u03b7\u03c9', u'\u0314\u0345': u'\u0391\u0397\u03a9\u03b1\u03b7\u03c9', u'\u031b': u'OUou', u'\u031b\u0300': u'OUou', u'\u031b\u0301': u'OUou', u'\u031b\u0303': u'OUou', u'\u031b\u0309': u'OUou', u'\u031b\u0323': u'OUou', u'\u0323': u'ABDEHIKLMNORSTUVWYZabdehiklmnorstuvwyz', u'\u0323\u0302': u'AEOaeo', u'\u0323\u0304': u'LRlr', u'\u0323\u0306': u'Aa', u'\u0323\u0307': u'Ss', u'\u0324': u'Uu', u'\u0325': u'Aa', u'\u0326': u'STst', u'\u0327': u'CDEGHKLNRSTcdeghklnrst', u'\u0327\u0301': u'Cc', u'\u0327\u0306': u'Ee', u'\u0328': u'AEIOUaeiou', u'\u0328\u0304': u'Oo', u'\u032d': u'DELNTUdelntu', u'\u032e': u'Hh', u'\u0330': u'EIUeiu', u'\u0331': u'BDKLNRTZbdhklnrtz', u'\u0342': u'\u03b1\u03b7\u03b9\u03c5\u03c9', u'\u0342\u0345': u'\u03b1\u03b7\u03c9', u'\u0345': u'\u0391\u0397\u03a9\u03b1\u03b7\u03c9' } # See misc/uca_decomps.py _UCA_DECOMPS_CACHE = { u'AA': u'\ua732', u'AE': u'\xc6\u01e2\u01fc', u'AO': u'\ua734', u'AU': u'\ua736', u'AV': u'\ua738\ua73a', u'AY': u'\ua73c', u'D': u'\xd0\u0110\ua779', u'DZ': u'\u01c4\u01f1', u'Dz': u'\u01c5\u01f2', u'F': u'\ua77b', u'G': u'\ua77d', u'H': u'\u0126', u'IJ': u'\u0132', u'L': u'\u0141', u'LJ': u'\u01c7', u'LL': u'\u1efa', u'Lj': u'\u01c8', u'NJ': u'\u01ca', u'Nj': u'\u01cb', u'O': u'\xd8\u01fe', u'OE': u'\u0152', u'OO': u'\ua74e', u'R': u'\ua782', u'S': u'\ua784', u'SS': u'\u1e9e', u'T': u'\ua786', u'Tz': u'\ua728', u'VY': u'\ua760', u'aa': u'\ua733', u'ae': u'\xe6\u01e3\u01fd', u'ao': u'\ua735', u'au': u'\ua737', u'av': u'\ua739\ua73b', u'ay': u'\ua73d', u'd': u'\xf0\u0111\ua77a', u'db': u'\u0238', u'dz': u'\u01c6\u01f3\u02a3', u'd\u0291': u'\u02a5', u'd\u0292': u'\u02a4', u'f': u'\ua77c', u'ff': u'\ufb00', u'ffi': u'\ufb03', u'ffl': u'\ufb04', u'fi': u'\ufb01', u'fl': u'\ufb02', u'f\u014b': u'\u02a9', u'g': u'\u1d79', u'h': u'\u0127\u210f', u'ij': u'\u0133', u'l': u'\u0142', u'lj': u'\u01c9', u'll': u'\u1efb', u'ls': u'\u02aa', u'lz': u'\u02ab', u'n': u'\u0149', u'nj': u'\u01cc', u'o': u'\xf8\u01ff', u'oe': u'\u0153', u'oo': u'\ua74f', u'qp': u'\u0239', u'r': u'\ua783', u's': u'\ua785', u'ss': u'\xdf', u'st': u'\ufb05\ufb06', u't': u'\ua787', u'th': u'\u1d7a', u'ts': u'\u01be\u02a6', u'tz': u'\ua729', u't\u0255': u'\u02a8', u't\u0283': u'\u02a7', u'vy': u'\ua761', u'zw': u'\u018d', u'\u039a\u03b1\u03b9': u'\u03cf', u'\u03ba\u03b1\u03b9': u'\u03d7', u'\u03c3': u'\u03c2\u03f2\U0001d6d3\U0001d70d' u'\U0001d747\U0001d781\U0001d7bb', u'\u0413': u'\u0490', u'\u041e': u'\ua668\ua66a\ua66c', u'\u0433': u'\u0491', u'\u043e': u'\ua669\ua66b\ua66d', u'\u0565\u0582': u'\u0587', u'\u0574\u0565': u'\ufb14', u'\u0574\u056b': u'\ufb15', u'\u0574\u056d': u'\ufb17', u'\u0574\u0576': u'\ufb13', u'\u057e\u0576': u'\ufb16', u'\u2c95\u2c81\u2c93': u'\u2ce4', } _PUNCT_CONFUSABLES_CACHE = { u'!': u'\uff01\u01c3\u2d51', u'!!': u'\u203c', u'!?': u'\u2049', u'"': (u'\u1cd3\uff02\u201c\u201d\u201f\u2033\u2036\u3003\u05f4\u02dd' u'\u02ba\u02f6\u02ee\u05f2'), u'&': u'\ua778', u"'": (u'\u055d\uff07\u2018\u2019\u201b\u2032\u2035\u055a\u05f3`\u1fef' u'\uff40\xb4\u0384\u1ffd\u1fbd\u1fbf\u1ffe\u02b9\u0374\u02c8\u02ca' u'\u02cb\u02f4\u02bb\u02bd\u02bc\u02be\ua78c\u05d9\u07f4\u07f5' u'\u144a\u16cc'), u"''": (u'\u1cd3"\uff02\u201c\u201d\u201f\u2033\u2036\u3003\u05f4\u02dd' u'\u02ba\u02f6\u02ee\u05f2'), u"'''": u'\u2034\u2037', u"''''": u'\u2057', u'(': u'\uff3b\u2768\u2772\u3014\ufd3e', u'((': u'\u2e28', u')': u'\uff3d\u2769\u2773\u3015\ufd3f', u'))': u'\u2e29', u'*': u'\u204e\u066d\u2217\U0001031f', u',': u'\u060d\u066b\u201a\xb8\ua4f9', u'-': (u'\u2010\u2011\u2012\u2013\ufe58\u06d4\u2043\u02d7\u2212\u2796' u'\u2cba'), u'-.': u'\ua4fe', u'.': u'\U0001d16d\u2024\u0701\u0702\ua60e\U00010a50\u0660\u06f0\ua4f8', u'.,': u'\ua4fb', u'..': u'\u2025\ua4fa', u'...': u'\u2026', u'/': (u'\u1735\u2041\u2215\u2044\u2571\u27cb\u29f8\U0001d23a\u31d3\u3033' u'\u2cc6\u30ce\u4e3f\u2f03'), u'//': u'\u2afd', u'///': u'\u2afb', u':': (u'\u0903\u0a83\uff1a\u0589\u0703\u0704\u16ec\ufe30\u1803\u1809' u'\u205a\u05c3\u02f8\ua789\u2236\u02d0\ua4fd'), u';': u'\u037e', u'?': u'\u0294\u0241\u097d\u13ae\ua6eb', u'?!': u'\u2048', u'??': u'\u2047', u'\\': (u'\uff3c\ufe68\u2216\u27cd\u29f5\u29f9\U0001d20f\U0001d23b\u31d4' u'\u4e36\u2f02'), u'\\\\': u'\u2cf9\u244a', u'_': u'\u07fa\ufe4d\ufe4e\ufe4f', u'{': u'\u2774\U0001d114', u'}': u'\u2775', } def get_decomps_mapping(regenerate=False): """This takes the decomps.txt file of the Unicode UCA and gives us a cases where a letter can be decomposed for collation and that mapping isn't in NFKD. """ if not regenerate: return _UCA_DECOMPS_CACHE mapping = {} h = urlopen("http://unicode.org/Public/UCA/8.0.0/decomps.txt") for line in h.read().splitlines(): if line.startswith("#"): continue to_uni = lambda x: unichr(int(x, 16)) is_letter = lambda x: unicodedata.category(x) in ("Lu", "Ll", "Lt") cp, line = line.split(";", 1) tag, line = line.split(";", 1) decomp, line = line.split("#", 1) decomp = map(to_uni, decomp.strip().split()) cp = to_uni(cp) if not is_letter(cp): continue decomp = filter(is_letter, decomp) simple = "".join(decomp) if not simple: continue # skip anything we get from normalization if unicodedata.normalize("NFKD", cp)[0] == simple: continue mapping[simple] = mapping.get(simple, "") + cp return mapping def get_punctuation_mapping(regenerate=False): """This takes the unicode confusables set and extracts punctuation which looks similar to one or more ASCII punctuation. e.g. ' --> ' """ if not regenerate: return _PUNCT_CONFUSABLES_CACHE h = urlopen("http://www.unicode.org/Public/security/9.0.0/confusables.txt") data = h.read() mapping = {} for line in data.decode("utf-8-sig").splitlines(): line = line.strip() if not line: continue if line.startswith(u"#"): continue char, repls = line.split(";", 2)[:2] char = char.strip() repls = repls.split() to_uni = lambda x: unichr(int(x, 16)) char = to_uni(char) repls = [to_uni(r) for r in repls] def is_ascii(char): try: char.encode("ascii") except UnicodeEncodeError: return False return True def is_punct(char): return unicodedata.category(char).startswith("P") if all(is_ascii(c) and is_punct(c) for c in repls) and char: repls = u"".join(repls) mapping[repls] = mapping.get(repls, u"") + char # if any of the equal chars is also ascii + punct we can replace # it aswell for ascii_, uni in mapping.items(): also_ascii = [c for c in uni if is_ascii(c) and is_punct(c)] for c in also_ascii: mapping[c] = uni.replace(c, u"") return mapping def diacritic_for_letters(regenerate=False): """Returns a mapping for combining diacritic mark to ascii characters for which they can be used to combine to a single unicode char. (actually not ascii, but unicode from the Lu/Ll/Lt categories, but mainly ascii) Since this is quite expensive to compute, the result is a cached version unless regenerate != True. regenerate = True is used for unittests to validate the cache. """ if not regenerate: return _DIACRITIC_CACHE d = {} for i in xrange(sys.maxunicode): u = unichr(i) n = unicodedata.normalize("NFKD", u) if len(n) <= 1: continue if unicodedata.category(u) not in ("Lu", "Ll", "Lt"): continue if not all(map(unicodedata.combining, n[1:])): continue d.setdefault(n[1:], set()).add(n[0]) for k, v in d.items(): d[k] = u"".join(sorted(v)) return d def generate_re_mapping(_diacritic_for_letters): letter_to_variants = {} # combine combining characters with the ascii chars for dia, letters in iteritems(_diacritic_for_letters): for c in letters: unichar = unicodedata.normalize("NFKC", c + dia) letter_to_variants.setdefault(c, []).append(unichar) # create strings to replace ascii with for k, v in letter_to_variants.items(): letter_to_variants[k] = u"".join(sorted(v)) return letter_to_variants @cached_func def get_replacement_mapping(): """Returns a dict mapping a sequence of characters to another sequence of chracters. If a key occurs in a text, it should also match any of the characters in in the value. """ mapping = {} # use _DIACRITIC_CACHE and create a lookup table for cp, repl in iteritems( generate_re_mapping(diacritic_for_letters(regenerate=False))): mapping.setdefault(cp, []).extend(repl) # add more from the UCA decomp dataset for cp, repl in iteritems(get_decomps_mapping(regenerate=False)): mapping.setdefault(cp, []).extend(repl) # and some punctuation for cp, repl in iteritems(get_punctuation_mapping(regenerate=False)): mapping.setdefault(cp, []).extend(repl) return mapping ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/���������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�016676� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/maskedbox.py���������������������������������������������������������0000644�0001750�0001750�00000011264�13112005742�021233� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Pango from senf import fsn2text from quodlibet import ngettext, _ from quodlibet import qltk from quodlibet.qltk.views import RCMHintedTreeView from quodlibet.qltk import Icons from quodlibet.util import connect_obj class ConfirmMaskedRemoval(qltk.Message): def __init__(self, parent): title = _("Are you sure you want to remove all songs?") description = _("The selected songs will be removed from the library.") super(ConfirmMaskedRemoval, self).__init__( Gtk.MessageType.WARNING, parent, title, description, Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Delete"), Icons.EDIT_DELETE, Gtk.ResponseType.YES) class MaskedBox(Gtk.HBox): def __init__(self, library): super(MaskedBox, self).__init__(spacing=6) self.model = model = Gtk.ListStore(object) view = RCMHintedTreeView(model=model) view.set_fixed_height_mode(True) view.set_headers_visible(False) self.view = view menu = Gtk.Menu() unhide_item = qltk.MenuItem(_("Unhide"), Icons.LIST_ADD) connect_obj(unhide_item, 'activate', self.__unhide, view, library) menu.append(unhide_item) remove_item = qltk.MenuItem(_("_Remove"), Icons.LIST_REMOVE) connect_obj(remove_item, 'activate', self.__remove, view, library) menu.append(remove_item) menu.show_all() view.connect('popup-menu', self.__popup, menu) sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(view) sw.set_size_request(-1, max(sw.size_request().height, 80)) def cdf(column, cell, model, iter, data): row = model[iter] cell.set_property('text', fsn2text(row[0])) def cdf_count(column, cell, model, iter, data): mount = model[iter][0] song_count = len(library.get_masked(mount)) text = ngettext("%d song", "%d songs", song_count) % song_count cell.set_property('text', text) column = Gtk.TreeViewColumn(None) column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) column.pack_start(render, True) column.set_cell_data_func(render, cdf) render = Gtk.CellRendererText() render.props.sensitive = False column.pack_start(render, False) column.set_cell_data_func(render, cdf_count) view.append_column(column) unhide = qltk.Button(_("_Unhide"), Icons.LIST_ADD) connect_obj(unhide, "clicked", self.__unhide, view, library) remove = qltk.Button(_("_Remove"), Icons.LIST_REMOVE) selection = view.get_selection() selection.set_mode(Gtk.SelectionMode.MULTIPLE) selection.connect("changed", self.__select_changed, remove, unhide) selection.emit("changed") connect_obj(remove, "clicked", self.__remove, view, library) vbox = Gtk.VBox(spacing=6) vbox.pack_start(unhide, False, True, 0) vbox.pack_start(remove, False, True, 0) self.pack_start(sw, True, True, 0) self.pack_start(vbox, False, True, 0) for path in library.masked_mount_points: model.append(row=[path]) if not len(model): self.set_sensitive(False) for child in self.get_children(): child.show_all() def __popup(self, view, menu): return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __unhide(self, view, library): selection = view.get_selection() model, paths = selection.get_selected_rows() for path in paths: library.unmask(model[path][0]) view.remove_selection() def __select_changed(self, selection, *buttons): active = bool(selection.count_selected_rows()) for button in buttons: button.set_sensitive(active) def __remove(self, view, library): dialog = ConfirmMaskedRemoval(self) response = dialog.run() if response == Gtk.ResponseType.YES: selection = view.get_selection() model, paths = selection.get_selected_rows() for path in paths: library.remove_masked(model[path][0]) view.remove_selection() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/browser.py�����������������������������������������������������������0000644�0001750�0001750�00000030262�13112005742�020740� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Pango from quodlibet import config from quodlibet import util from quodlibet import browsers from quodlibet import app from quodlibet import _ from quodlibet.compat import listfilter, text_type from quodlibet.qltk.songlist import SongList from quodlibet.qltk.x import ScrolledWindow, Action from quodlibet.qltk import Icons from quodlibet.qltk.window import Window, PersistentWindowMixin from quodlibet.util.library import background_filter class FilterMenu(object): MENU = """ <menu action='Filters'> <menuitem action='FilterGenre' always-show-image='true'/> <menuitem action='FilterArtist' always-show-image='true'/> <menuitem action='FilterAlbum' always-show-image='true'/> <separator/> <menuitem action='RandomGenre' always-show-image='true'/> <menuitem action='RandomArtist' always-show-image='true'/> <menuitem action='RandomAlbum' always-show-image='true'/> <separator/> <menuitem action='All' always-show-image='true'/> <menuitem action='PlayedRecently' always-show-image='true'/> <menuitem action='AddedRecently' always-show-image='true'/> <menuitem action='TopRated' always-show-image='true'/> </menu>""" __OUTER_MENU = """ <ui> <menubar name='Menu'> %s </menubar> </ui>""" % MENU def __init__(self, library, player, ui=None): self._browser = None self._library = library self._player = player self._standalone = not ui ag = Gtk.ActionGroup.new('QuodLibetFilterActions') for name, icon_name, label, cb in [ ('Filters', "", _("_Filters"), None), ("PlayedRecently", Icons.EDIT_FIND, _("Recently _Played"), self.__filter_menu_actions), ("AddedRecently", Icons.EDIT_FIND, _("Recently _Added"), self.__filter_menu_actions), ("TopRated", Icons.EDIT_FIND, _("_Top 40"), self.__filter_menu_actions), ("All", Icons.EDIT_FIND, _("All _Songs"), self.__filter_menu_actions)]: action = Action(name=name, icon_name=icon_name, label=label) if cb: action.connect('activate', cb) ag.add_action(action) for tag_, lab in [ ("genre", _("On Current _Genre(s)")), ("artist", _("On Current _Artist(s)")), ("album", _("On Current Al_bum"))]: act = Action( name="Filter%s" % util.capitalize(tag_), label=lab, icon_name=Icons.EDIT_SELECT_ALL) act.connect('activate', self.__filter_on, tag_, None, player) ag.add_action(act) for (tag_, accel, label) in [ ("genre", "G", _("Random _Genre")), ("artist", "T", _("Random _Artist")), ("album", "M", _("Random Al_bum"))]: act = Action(name="Random%s" % util.capitalize(tag_), label=label, icon_name=Icons.DIALOG_QUESTION) act.connect('activate', self.__random, tag_) ag.add_action_with_accel(act, "<Primary>" + accel) if self._standalone: ui = Gtk.UIManager() ui.add_ui_from_string(self.__OUTER_MENU) ui.insert_action_group(ag, -1) self._ui = ui self._get_child_widget("TopRated").set_tooltip_text( _("The 40 songs you've played most (more than 40 may " "be chosen if there are ties)")) # https://git.gnome.org/browse/gtk+/commit/?id=b44df22895c79 menu_item = self._get_child_widget('/Menu/Filters') if isinstance(menu_item, Gtk.ImageMenuItem): menu_item.set_image(None) self._player_id = player.connect("song-started", self._on_song_started) self.set_song(player.song) self._hide_menus() def destroy(self): if self._player: self._player.disconnect(self._player_id) self._player = None self._browser = None self._library = None def _on_song_started(self, player, song): self.set_song(song) def __random(self, item, key): self._browser.filter_random(key) def __filter_on(self, action, header, songs, player): # Fall back to the playing song if songs is None: if player.song: songs = [player.song] else: return self._browser.filter_on(songs, header) def __filter_menu_actions(self, menuitem): name = menuitem.get_name() if name == "PlayedRecently": self._make_query(u"#(lastplayed < 7 days ago)") elif name == "AddedRecently": self._make_query(u"#(added < 7 days ago)") elif name == "TopRated": bg = background_filter() songs = (bg and filter(bg, self._library)) or self._library songs = [song.get("~#playcount", 0) for song in songs] if len(songs) == 0: return songs.sort() if len(songs) < 40: self._make_query(u"#(playcount > %d)" % (songs[0] - 1)) else: self._make_query(u"#(playcount > %d)" % (songs[-40] - 1)) elif name == "All": self._browser.unfilter() def _make_query(self, query): assert isinstance(query, text_type) if self._browser.can_filter_text(): self._browser.filter_text(query) self._browser.activate() def _hide_menus(self): menus = { 'genre': [ "FilterGenre", "RandomGenre", ], 'artist': [ "FilterArtist", "RandomArtist", ], 'album': [ "FilterAlbum", "RandomAlbum", ], None: [ "PlayedRecently", "AddedRecently", "TopRated", "All", ], } for key, widget_names in menus.items(): if self._browser: can_filter = self._browser.can_filter(key) else: can_filter = False for name in widget_names: self._get_child_widget(name).set_property('visible', can_filter) def set_browser(self, browser): self._browser = browser self._hide_menus() def set_song(self, song): for wid in ["FilterAlbum", "FilterArtist", "FilterGenre"]: self._get_child_widget(wid).set_sensitive(bool(song)) if song: for h in ['genre', 'artist', 'album']: widget = self._get_child_widget("Filter%s" % h.capitalize()) widget.set_sensitive(h in song) def _get_child_widget(self, name=None): path = '/Menu%s/Filters' % ('' if self._standalone else '/Browse') if name: path += "/" + name return self._ui.get_widget(path) def get_widget(self): path = '/Menu' if self._standalone else '/Menu/Browse' return self._ui.get_widget(path) def get_accel_group(self): return self._ui.get_accel_group() class LibraryBrowser(Window, util.InstanceTracker, PersistentWindowMixin): @classmethod def open(cls, Kind, library, player): """Creates and shows a new browser instance""" browser = cls(Kind, library, player) browser.show() return browser @classmethod def save(cls): """See which browser windows are open and save their names so we can restore them on start. """ names = [] for browser in cls.instances(): names.append(browser.name) config.set("memory", "open_browsers", "\n".join(names)) @classmethod def restore(cls, library, player): """restore saved browser windows""" value = config.get("memory", "open_browsers", "") for name in value.split(): kind = browsers.get(name) browser = cls(kind, library, player) browser.show_maybe() def __init__(self, Kind, library, player): super(LibraryBrowser, self).__init__(dialog=False) self._register_instance() self.name = Kind.__name__ self.set_default_size(600, 400) self.enable_window_tracking("browser_" + self.name) self.set_title(Kind.name + " - Quod Libet") self.add(Gtk.VBox()) view = SongList(library, update=True) view.info.connect("changed", self.__set_totals) self.songlist = view sw = ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(view) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.browser = browser = Kind(library) if browser.can_reorder: view.enable_drop() elif browser.dropped: view.enable_drop(False) if browser.accelerators: self.add_accel_group(browser.accelerators) self.__container = browser.pack(sw) self.get_child().pack_start(self.__container, True, True, 0) main = self.get_child() bottom = Gtk.HBox() main.pack_end(bottom, False, True, 0) self._filter_menu = filter_menu = FilterMenu(library, player) filter_menu.set_browser(self.browser) self.add_accel_group(filter_menu.get_accel_group()) bottom.pack_start(filter_menu.get_widget(), False, True, 0) filter_menu.get_widget().show() self.__statusbar = Gtk.Label() self.__statusbar.set_alignment(1.0, 0.5) self.__statusbar.set_padding(6, 3) self.__statusbar.set_ellipsize(Pango.EllipsizeMode.START) bottom.pack_end(self.__statusbar, True, True, 0) self.__statusbar.show() bottom.show() browser.connect('songs-selected', self.__browser_cb) browser.finalize(False) view.connect('popup-menu', self.__menu, library) view.connect('drag-data-received', self.__drag_data_recv) view.connect('row-activated', self.__enqueue, player) if browser.headers is not None: view.connect('columns-changed', self.__cols_changed, browser) self.__cols_changed(view, browser) sw.show_all() for c in self.get_child().get_children(): c.show() self.get_child().show() self.connect("destroy", self._on_destroy) def _on_destroy(self, *args): self._filter_menu.destroy() def __browser_cb(self, browser, songs, sorted): if browser.background: bg = background_filter() if bg: songs = listfilter(bg, songs) self.songlist.set_songs(songs, sorted) def __enqueue(self, view, path, column, player): app.window.playlist.enqueue([view.get_model()[path][0]]) if player.song is None: player.next() def __drag_data_recv(self, view, *args): if self.browser.can_reorder: songs = view.get_songs() self.browser.reordered(songs) view.clear_sort() def __cols_changed(self, view, browser): for header in view.get_columns(): tag = header.header_name for t in util.tagsplit(tag): if t in browser.headers: header.set_visible(True) break else: header.set_visible(False) def __menu(self, view, library): path, col = view.get_cursor() header = col.header_name menu = view.Menu(header, self.browser, library) if menu is not None: view.popup_menu(menu, 0, Gtk.get_current_event_time()) return True def __set_totals(self, info, songs): i = len(songs) length = sum(song.get("~#length", 0) for song in songs) t = self.browser.status_text(count=i, time=util.format_time_preferred(length)) self.__statusbar.set_text(t) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/session.py�����������������������������������������������������������0000644�0001750�0001750�00000003035�13112005742�020736� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation try: import dbus dbus except ImportError: dbus = None from quodlibet import app from quodlibet.util import print_d def init(app_id): if not dbus: return try: bus = dbus.Bus(dbus.Bus.TYPE_SESSION) manager = bus.get_object("org.gnome.SessionManager", "/org/gnome/SessionManager") iface = dbus.Interface(manager, "org.gnome.SessionManager") client_path = iface.RegisterClient(app_id, "") client = bus.get_object("org.gnome.SessionManager", client_path) client_priv = dbus.Interface(client, "org.gnome.SessionManager.ClientPrivate") def end_session_cb(*args): print_d("GSM sent EndSession: going down") client_priv.EndSessionResponse(True, "") app.quit() def query_end_session_cb(*args): print_d("GSM sent QueryEndSession") client_priv.EndSessionResponse(True, "") client_priv.connect_to_signal("QueryEndSession", query_end_session_cb) client_priv.connect_to_signal("EndSession", end_session_cb) except dbus.DBusException: print_d("Connecting with the gnome session manager failed") else: print_d("Connected with gnome session manager: %s" % client_path) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/completion.py��������������������������������������������������������0000644�0001750�0001750�00000013745�13112005742�021435� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman, # 2011 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import formats, config, print_d from quodlibet.util import copool, gdecode, massagers from quodlibet.util.tags import MACHINE_TAGS class EntryWordCompletion(Gtk.EntryCompletion): """Entry completion for simple words, where a word boundary is roughly equivalent to the separators in the QL query language. You need to manually set a model containing the available words.""" leftsep = ["&(", "|(", ",", ", "] rightsep = [" ", ")", ","] def __init__(self): super(EntryWordCompletion, self).__init__() self.set_match_func(self.__match_filter, None) self.connect('match-selected', self.__match_selected) def __match_filter(self, completion, entrytext, iter, data): model = completion.get_model() entry = self.get_entry() entrytext = gdecode(entrytext) if entry is None: return False cursor = entry.get_position() if (cursor != len(entrytext) and not max([entrytext[cursor:].startswith(s) for s in self.rightsep])): return False # find the border to the left left, f = max( [(entrytext.rfind(c, 0, cursor), c) for c in self.leftsep]) if left < 0: left += 1 else: left += len(f) if left == cursor: return False key = entrytext[left:cursor] value = model.get_value(iter, self.get_property('text-column')) return bool(value and value.startswith(key)) def __match_selected(self, completion, model, iter): value = model.get_value(iter, self.get_property('text-column')) entry = self.get_entry() cursor = entry.get_position() text = entry.get_text() text = gdecode(text) left, f = max( [(text.rfind(c, 0, cursor), c) for c in self.leftsep]) if left == -1: left += 1 else: left += len(f) offset = cursor - left entry.insert_text(value[offset:], cursor) entry.set_position(left + len(value)) return True class LibraryTagCompletion(EntryWordCompletion): """A completion for text entries tied to a library's tag list.""" __tags = set() def __init__(self, library): super(LibraryTagCompletion, self).__init__() try: model = self.__model except AttributeError: model = type(self).__model = Gtk.ListStore(str) library.connect('changed', self.__update_song, model) library.connect('added', self.__update_song, model) library.connect('removed', self.__update_song, model) copool.add(self.__build_model, library, model) self.set_model(model) self.set_text_column(0) @classmethod def __update_song(klass, library, songs, model): print_d("Updating tag model for %d songs" % len(songs)) tags = klass.__tags for song in songs: for tag in song.keys(): if not (tag.startswith("~#") or tag in MACHINE_TAGS or tag in tags): klass.__tags.add(tag) model.append([tag]) print_d("Done updating tag model for %d songs" % len(songs)) @classmethod def __build_model(klass, library, model): print_d("Updating tag model for whole library") all_tags = klass.__tags model.clear() tags = set() songs = list(library) for count, song in enumerate(songs): for tag in song.keys(): if not (tag.startswith("~#") or tag in MACHINE_TAGS): tags.add(tag) if count % 500 == 0 or count + 1 == len(songs): tags -= all_tags for tag in tags: model.append([tag]) all_tags.update(tags) tags.clear() yield True tags.update(["~dirname", "~basename", "~people", "~format"]) for tag in ["track", "disc", "playcount", "skipcount", "lastplayed", "mtime", "added", "rating", "length"]: tags.add("#(" + tag) for tag in ["date", "bpm"]: if tag in all_tags: tags.add("#(" + tag) tags -= all_tags for tag in tags: model.append([tag]) all_tags.update(tags) print_d("Done updating tag model for whole library") class LibraryValueCompletion(Gtk.EntryCompletion): """Entry completion for a library value, for a specific tag. Will add valid values from the tag massager where available""" def __init__(self, tag, library): super(LibraryValueCompletion, self).__init__() self.set_model(Gtk.ListStore(str)) self.set_text_column(0) self.set_tag(tag, library) def set_tag(self, tag, library): if not config.getboolean("settings", "eager_search"): return elif tag is None: return elif tag in ("bpm date discnumber isrc originaldate recordingdate " "tracknumber title").split() + MACHINE_TAGS: return elif tag in formats.PEOPLE: tag = "~people" copool.add(self.__fill_tag, tag, library) def __fill_tag(self, tag, library): model = self.get_model() model.clear() yield True # Issue 439: pre-fill with valid values if available values = massagers.get_options(tag) values = sorted(set(values) | library.tag_values(tag)) self.set_minimum_key_length(int(len(values) > 100)) yield True for count, value in enumerate(values): model.append(row=[value]) if count % 1000 == 0: yield True ���������������������������quodlibet-3.9.1/quodlibet/qltk/renamefiles.py�������������������������������������������������������0000644�0001750�0001750�00000025725�13112005742�021557� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import unicodedata from gi.repository import Gtk, Gdk from senf import fsn2text, text2fsn import quodlibet from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.plugins import PluginManager from quodlibet.pattern import FileFromPattern from quodlibet.qltk._editutils import FilterPluginBox, FilterCheckButton from quodlibet.qltk._editutils import EditingPluginHandler from quodlibet.qltk.views import TreeViewColumn from quodlibet.qltk.cbes import ComboBoxEntrySave from quodlibet.qltk.models import ObjectStore from quodlibet.qltk import Icons, Button from quodlibet.qltk.wlw import WritingWindow from quodlibet.util import connect_obj, gdecode from quodlibet.util.path import strip_win32_incompat_from_path from quodlibet.compat import itervalues NBP = os.path.join(quodlibet.get_user_dir(), "lists", "renamepatterns") NBP_EXAMPLES = """\ <tracknumber>. <title> <tracknumber|<tracknumber>. ><title> <tracknumber> - <title> <tracknumber> - <artist> - <title> /path/<artist> - <album>/<tracknumber>. <title> ~/<artist>/<album>/<tracknumber> - <title> <albumartist|<albumartist>|<artist>>/(<~year>) <album>\ /<tracknumber|<tracknumber> - ><title>""" class SpacesToUnderscores(FilterCheckButton): _label = _("Replace spaces with _underscores") _section = "rename" _key = "spaces" _order = 1.0 def filter(self, original, filename): return filename.replace(" ", "_") class StripWindowsIncompat(FilterCheckButton): _label = _("Strip _Windows-incompatible characters") _section = "rename" _key = "windows" _order = 1.1 def __init__(self): super(StripWindowsIncompat, self).__init__() # If on Windows, force this to be inactive (and hidden) if os.name == 'nt': self.set_active(False) self.set_sensitive(False) self.set_no_show_all(True) def filter(self, original, filename): return strip_win32_incompat_from_path(filename) class StripDiacriticals(FilterCheckButton): _label = _("Strip _diacritical marks") _section = "rename" _key = "diacriticals" _order = 1.2 def filter(self, original, filename): return u"".join(filter(lambda s: not unicodedata.combining(s), unicodedata.normalize('NFKD', filename))) class StripNonASCII(FilterCheckButton): _label = _("Strip non-_ASCII characters") _section = "rename" _key = "ascii" _order = 1.3 def filter(self, original, filename): return u"".join(map(lambda s: (s <= "~" and s) or u"_", filename)) class Lowercase(FilterCheckButton): _label = _("Use only _lowercase characters") _section = "rename" _key = "lowercase" _order = 1.4 def filter(self, original, filename): return filename.lower() class RenameFilesPluginHandler(EditingPluginHandler): from quodlibet.plugins.editing import RenameFilesPlugin Kind = RenameFilesPlugin class Entry(object): def __init__(self, song): self.song = song new_name = None """new name as unicode or None if not set""" @property def name(self): return fsn2text(self.song("~basename")) class RenameFiles(Gtk.VBox): title = _("Rename Files") FILTERS = [SpacesToUnderscores, StripWindowsIncompat, StripDiacriticals, StripNonASCII, Lowercase] handler = RenameFilesPluginHandler() @classmethod def init_plugins(cls): PluginManager.instance.register_handler(cls.handler) def __init__(self, parent, library): super(RenameFiles, self).__init__(spacing=6) self.set_border_width(12) hbox = Gtk.HBox(spacing=6) cbes_defaults = NBP_EXAMPLES.split("\n") self.combo = ComboBoxEntrySave(NBP, cbes_defaults, title=_("Path Patterns"), edit_title=_(u"Edit saved patterns…")) self.combo.show_all() hbox.pack_start(self.combo, True, True, 0) self.preview = qltk.Button(_("_Preview"), Icons.VIEW_REFRESH) self.preview.show() hbox.pack_start(self.preview, False, True, 0) self.pack_start(hbox, False, True, 0) self.combo.get_child().connect('changed', self._changed) model = ObjectStore() self.view = Gtk.TreeView(model=model) self.view.show() sw = Gtk.ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.add(self.view) self.pack_start(sw, True, True, 0) self.pack_start(Gtk.VBox(), False, True, 0) filter_box = FilterPluginBox(self.handler, self.FILTERS) filter_box.connect("preview", self.__filter_preview) filter_box.connect("changed", self.__filter_changed) self.filter_box = filter_box self.pack_start(filter_box, False, True, 0) # Save button self.save = Button(_("_Save"), Icons.DOCUMENT_SAVE) self.save.show() bbox = Gtk.HButtonBox() bbox.set_layout(Gtk.ButtonBoxStyle.END) bbox.pack_start(self.save, True, True, 0) self.pack_start(bbox, False, True, 0) render = Gtk.CellRendererText() column = TreeViewColumn(title=_('File')) column.pack_start(render, True) def cell_data_file(column, cell, model, iter_, data): entry = model.get_value(iter_) cell.set_property("text", entry.name) column.set_cell_data_func(render, cell_data_file) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) self.view.append_column(column) render = Gtk.CellRendererText() render.set_property('editable', True) column = TreeViewColumn(title=_('New Name')) column.pack_start(render, True) def cell_data_new_name(column, cell, model, iter_, data): entry = model.get_value(iter_) cell.set_property("text", entry.new_name or u"") column.set_cell_data_func(render, cell_data_new_name) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) self.view.append_column(column) connect_obj(self.preview, 'clicked', self.__preview, None) connect_obj(parent, 'changed', self.__class__.__preview, self) connect_obj(self.save, 'clicked', self.__rename, library) render.connect('edited', self.__row_edited) for child in self.get_children(): child.show() def __filter_preview(self, *args): Gtk.Button.clicked(self.preview) def __filter_changed(self, *args): self._changed(self.combo.get_child()) def _changed(self, entry): self.save.set_sensitive(False) self.preview.set_sensitive(bool(entry.get_text())) def __row_edited(self, renderer, path, new): path = Gtk.TreePath.new_from_string(path) model = self.view.get_model() entry = model[path][0] new = gdecode(new) if entry.new_name != new: entry.new_name = new self.preview.set_sensitive(True) self.save.set_sensitive(True) model.path_changed(path) def __rename(self, library): model = self.view.get_model() win = WritingWindow(self, len(model)) win.show() was_changed = set() skip_all = False self.view.freeze_child_notify() for entry in itervalues(model): song = entry.song new_name = entry.new_name old_name = entry.name if new_name is None: continue try: library.rename(song, text2fsn(new_name), changed=was_changed) except Exception: util.print_exc() if skip_all: continue RESPONSE_SKIP_ALL = 1 msg = qltk.Message( Gtk.MessageType.ERROR, win, _("Unable to rename file"), _("Renaming <b>%(old-name)s</b> to <b>%(new-name)s</b> " "failed. Possibly the target file already exists, " "or you do not have permission to make the " "new file or remove the old one.") % { "old-name": util.escape(old_name), "new-name": util.escape(new_name), }, buttons=Gtk.ButtonsType.NONE) msg.add_button(_("Ignore _All Errors"), RESPONSE_SKIP_ALL) msg.add_icon_button(_("_Stop"), Icons.PROCESS_STOP, Gtk.ResponseType.CANCEL) msg.add_button(_("_Continue"), Gtk.ResponseType.OK) msg.set_default_response(Gtk.ResponseType.OK) resp = msg.run() skip_all |= (resp == RESPONSE_SKIP_ALL) # Preserve old behavior: shift-click is Ignore All mods = Gdk.Display.get_default().get_pointer()[3] skip_all |= mods & Gdk.ModifierType.SHIFT_MASK library.reload(song, changed=was_changed) if resp != Gtk.ResponseType.OK and resp != RESPONSE_SKIP_ALL: break if win.step(): break self.view.thaw_child_notify() win.destroy() library.changed(was_changed) self.save.set_sensitive(False) def __preview(self, songs): model = self.view.get_model() if songs is None: songs = [e.song for e in itervalues(model)] pattern_text = gdecode(self.combo.get_child().get_text()) try: pattern = FileFromPattern(pattern_text) except ValueError: qltk.ErrorMessage( self, _("Path is not absolute"), _("The pattern\n\t<b>%s</b>\ncontains / but " "does not start from root. To avoid misnamed " "folders, root your pattern by starting " "it with / or ~/.") % ( util.escape(pattern_text))).run() return else: if pattern: self.combo.prepend_text(pattern_text) self.combo.write(NBP) # native paths orignames = [song["~filename"] for song in songs] newnames = [fsn2text(pattern.format(song)) for song in songs] for f in self.filter_box.filters: if f.active: newnames = f.filter_list(orignames, newnames) model.clear() for song, newname in zip(songs, newnames): entry = Entry(song) entry.new_name = newname model.append(row=[entry]) self.preview.set_sensitive(False) self.save.set_sensitive(bool(pattern_text)) for song in songs: if not song.is_file: self.set_sensitive(False) break else: self.set_sensitive(True) �������������������������������������������quodlibet-3.9.1/quodlibet/qltk/textedit.py����������������������������������������������������������0000644�0001750�0001750�00000014222�13112005742�021105� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GLib, Pango from senf import fsnative from quodlibet import _ from quodlibet import qltk from quodlibet import util from quodlibet.qltk import Button, Icons from quodlibet.formats import AudioFile from quodlibet.pattern import XMLFromPattern, XMLFromMarkupPattern, \ error as PatternError from quodlibet.util import connect_obj, gdecode from quodlibet.compat import text_type try: import gi gi.require_version("GtkSource", "3.0") from gi.repository import GtkSource except (ValueError, ImportError): TextView = Gtk.TextView TextBuffer = Gtk.TextBuffer else: TextView = GtkSource.View class TextBuffer(GtkSource.Buffer): def __init__(self, *args): super(TextBuffer, self).__init__(*args) self.set_highlight_matching_brackets(False) self.set_highlight_syntax(False) def set_text(self, *args): self.begin_not_undoable_action() super(TextBuffer, self).set_text(*args) self.end_not_undoable_action() class TextEditBox(Gtk.HBox): """A simple text editing area with a default value, a revert button, and an apply button. The 'buffer' attribute is the text buffer, the 'apply' attribute is the apply button. FIXME: Button text should changable (without poking the buttons directly). """ def __init__(self, default=""): super(TextEditBox, self).__init__(spacing=6) sw = Gtk.ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.add(TextView(buffer=TextBuffer())) self.pack_start(sw, True, True, 0) self.buffer = sw.get_child().get_buffer() box = Gtk.VBox(spacing=6) rev = Button(_("_Revert"), Icons.DOCUMENT_REVERT) app = Button(_("_Apply")) box.pack_start(rev, False, True, 0) box.pack_start(app, False, True, 0) self.pack_start(box, False, True, 0) connect_obj(rev, 'clicked', self.buffer.set_text, default) self.revert = rev self.apply = app @property def text(self): start, end = self.buffer.get_bounds() return gdecode(self.buffer.get_text(start, end, True)) @text.setter def text(self, value): self.buffer.set_text(value, -1) def validate_markup_pattern(text, alternative_markup=True, links=False): """Check whether a passed pattern results in a valid pango markup. Args: text (unicode): the pattern alternative_markup (bool): if "[b]" gets mapped to "\<b\>" links (bool): if link tags are allowed (for Gtk.Label only) Raises: ValueError: In case the pattern isn't valid """ assert isinstance(text, text_type) f = AudioFile({"~filename": fsnative(u"dummy")}) try: if alternative_markup: pattern = XMLFromMarkupPattern(text) else: pattern = XMLFromPattern(text) text = pattern % f except PatternError as e: return ValueError(e) try: Pango.parse_markup(text, -1, u"\u0000") except GLib.GError as e: if not links: raise ValueError(e) # Gtk.Label supports links on top of pango markup but doesn't # provide a way to verify them. We can check if the markup # was accepted by seeing if get_text() returns something. l = Gtk.Label() # add a character in case text is empty. # this might print a warning to stderr.. no idea how to prevent that.. l.set_markup(text + " ") if not l.get_text(): raise ValueError(e) class PatternEditBox(TextEditBox): """A TextEditBox that stops the apply button's clicked signal if the pattern is invalid. You need to use connect_after to connect to it, to get this feature.""" def __init__(self, default="", alternative_markup=True, links=False): super(PatternEditBox, self).__init__(default) self._alternative_markup = alternative_markup self._links = links self.apply.connect('clicked', self.__check_markup) def __check_markup(self, apply): try: validate_markup_pattern( self.text, self._alternative_markup, self._links) except ValueError as e: qltk.ErrorMessage( self, _("Invalid pattern"), _("The pattern you entered was invalid. Make sure you enter " "< and > as \\< and \\> and that your tags are " "balanced.\n\n%s") % util.escape(str(e))).run() apply.stop_emission('clicked') return False class TextEdit(qltk.UniqueWindow): """A window with a text editing box in it.""" Box = TextEditBox def __init__(self, parent, default="", **kwargs): if self.is_not_unique(): return super(TextEdit, self).__init__() self.set_title(_("Edit Display")) self.set_transient_for(qltk.get_top_parent(parent)) self.set_border_width(12) self.set_default_size(420, 190) vbox = Gtk.VBox(spacing=12) close = Button(_("_Close"), Icons.WINDOW_CLOSE) close.connect('clicked', lambda *x: self.destroy()) b = Gtk.HButtonBox() b.set_layout(Gtk.ButtonBoxStyle.END) b.pack_start(close, True, True, 0) self.box = box = self.Box(default, **kwargs) vbox.pack_start(box, True, True, 0) self.use_header_bar() if not self.has_close_button(): vbox.pack_start(b, False, True, 0) self.add(vbox) self.apply = box.apply self.revert = box.revert close.grab_focus() self.get_child().show_all() @property def text(self): return self.box.text @text.setter def text(self, value): self.box.text = value class PatternEdit(TextEdit): """A window with a pattern editing box in it.""" Box = PatternEditBox ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/prefs.py�������������������������������������������������������������0000644�0001750�0001750�00000073734�13112005742�020407� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2009 Joe Wreschnig, Michael Urman, Iñigo Serna, # Steven Robertson # 2011-2016 Nick Boultbee # 2013 Christoph Reiter # 2014 Jan Path # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import config from quodlibet import qltk from quodlibet import util from quodlibet import app from quodlibet import C_, _ from quodlibet.config import RATINGS, DurationFormat, DURATION from quodlibet.qltk.ccb import ConfigCheckButton as CCB from quodlibet.qltk.data_editors import TagListEditor from quodlibet.qltk.entry import ValidatingEntry, UndoEntry from quodlibet.query._query import Query from quodlibet.qltk.scanbox import ScanBox from quodlibet.qltk.maskedbox import MaskedBox from quodlibet.qltk.songlist import SongList, get_columns from quodlibet.qltk.window import UniqueWindow from quodlibet.qltk.x import Button, Align from quodlibet.qltk import Icons from quodlibet.util import copool, format_time_preferred from quodlibet.util.dprint import print_d from quodlibet.util.library import emit_signal, get_scan_dirs, scan_library from quodlibet.util import connect_obj class PreferencesWindow(UniqueWindow): """The tabbed container window for the main preferences GUI. Individual tabs are encapsulated as inner classes inheriting from `VBox`""" class SongList(Gtk.VBox): name = "songlist" PREDEFINED_TAGS = [ ("~#disc", _("_Disc")), ("~#track", _("_Track")), ("grouping", _("Grou_ping")), ("artist", _("_Artist")), ("album", _("Al_bum")), ("title", util.tag("title")), ("genre", _("_Genre")), ("date", _("_Date")), ("~basename", _("_Filename")), ("~#length", _("_Length")), ("~rating", _("_Rating")), ("~#filesize", util.tag("~#filesize"))] def __init__(self): def create_behaviour_frame(): vbox = Gtk.VBox(spacing=6) c = CCB(_("_Jump to playing song automatically"), 'settings', 'jump', populate=True, tooltip=_("When the playing song changes, " "scroll to it in the song list")) vbox.pack_start(c, False, True, 0) return qltk.Frame(_("Behavior"), child=vbox) def create_visible_columns_frame(): buttons = {} vbox = Gtk.VBox(spacing=12) table = Gtk.Table.new(3, 3, True) for i, (k, t) in enumerate(self.PREDEFINED_TAGS): x, y = i % 3, i / 3 buttons[k] = Gtk.CheckButton(label=t, use_underline=True) table.attach(buttons[k], x, x + 1, y, y + 1) vbox.pack_start(table, False, True, 0) # Other columns hbox = Gtk.HBox(spacing=6) l = Gtk.Label(label=_("_Others:"), use_underline=True) hbox.pack_start(l, False, True, 0) self.others = others = UndoEntry() others.set_sensitive(False) # Stock edit doesn't have ellipsis chars. edit_button = Gtk.Button( label=_(u"_Edit…"), use_underline=True) edit_button.connect("clicked", self.__config_cols, buttons) edit_button.set_tooltip_text( _("Add or remove additional column " "headers")) l.set_mnemonic_widget(edit_button) l.set_use_underline(True) hbox.pack_start(others, True, True, 0) vbox.pack_start(hbox, False, True, 0) b = Gtk.HButtonBox() b.set_layout(Gtk.ButtonBoxStyle.END) b.pack_start(edit_button, True, True, 0) vbox.pack_start(b, True, True, 0) return qltk.Frame(_("Visible Columns"), child=vbox), buttons def create_columns_prefs_frame(): tiv = Gtk.CheckButton(label=_("Title includes _version"), use_underline=True) aio = Gtk.CheckButton(label=_("Artist includes all _people"), use_underline=True) aip = Gtk.CheckButton(label=_("Album includes _disc subtitle"), use_underline=True) fip = Gtk.CheckButton(label=_("Filename includes _folder"), use_underline=True) self._toggle_data = [ (tiv, "title", "~title~version"), (aip, "album", "~album~discsubtitle"), (fip, "~basename", "~filename"), (aio, "artist", "~people") ] t = Gtk.Table.new(2, 2, True) t.attach(tiv, 0, 1, 0, 1) t.attach(aip, 0, 1, 1, 2) t.attach(aio, 1, 2, 0, 1) t.attach(fip, 1, 2, 1, 2) return qltk.Frame(_("Column Preferences"), child=t) def create_apply_button(): vbox = Gtk.VBox(spacing=12) apply = Button(_("_Apply")) apply.set_tooltip_text( _("Apply current configuration to song list, " "adding new columns to the end")) apply.connect('clicked', self.__apply, buttons) # Apply on destroy, else config gets mangled self.connect('destroy', self.__apply, buttons) b = Gtk.HButtonBox() b.set_layout(Gtk.ButtonBoxStyle.END) b.pack_start(apply, True, True, 0) vbox.pack_start(b, True, True, 0) return vbox super(PreferencesWindow.SongList, self).__init__(spacing=12) self.set_border_width(12) self.title = _("Song List") self.pack_start(create_behaviour_frame(), False, True, 0) columns_frame, buttons = create_visible_columns_frame() self.pack_start(columns_frame, False, True, 0) self.pack_start(create_columns_prefs_frame(), False, True, 0) self.pack_start(create_apply_button(), True, True, 0) self.__update(buttons, self._toggle_data, get_columns()) for child in self.get_children(): child.show_all() def __update(self, buttons, toggle_data, columns): """Updates all widgets based on the passed column list""" columns = list(columns) for key, widget in buttons.items(): widget.set_active(key in columns) if key in columns: columns.remove(key) for (check, off, on) in toggle_data: if on in columns: buttons[off].set_active(True) check.set_active(True) columns.remove(on) self.others.set_text(", ".join(columns)) self.other_cols = columns def __get_current_columns(self, buttons): """Given the current column list and the widgets states compute a new column list. """ new_headers = set() # Get the checked headers for key, name in self.PREDEFINED_TAGS: if buttons[key].get_active(): new_headers.add(key) # And the customs new_headers.update(set(self.other_cols)) on_to_off = dict((on, off) for (w, off, on) in self._toggle_data) result = [] cur_cols = get_columns() for h in cur_cols: if h in new_headers: result.append(h) else: try: alternative = on_to_off[h] if alternative in new_headers: result.append(alternative) except KeyError: pass # Add new ones on the end result.extend(new_headers - set(result)) # After this, do the substitutions for (check, off, on) in self._toggle_data: if check.get_active(): try: result[result.index(off)] = on except ValueError: pass return result def __apply(self, button, buttons): result = self.__get_current_columns(buttons) SongList.set_all_column_headers(result) def __config_cols(self, button, buttons): def __closed(widget): cols = widget.get_strings() self.__update(buttons, self._toggle_data, cols) columns = self.__get_current_columns(buttons) m = TagListEditor(_("Edit Columns"), columns) m.set_transient_for(qltk.get_top_parent(self)) m.connect('destroy', __closed) m.show() class Browsers(Gtk.VBox): name = "browser" def __init__(self): def create_display_frame(): vbox = Gtk.VBox(spacing=6) model = Gtk.ListStore(str, str) def on_changed(combo): it = combo.get_active_iter() if it is None: return DURATION.format = model[it][0] app.window.songlist.info.refresh() app.window.qexpander.refresh() # TODO: refresh info windows ideally too (but see #2019) def draw_duration(column, cell, model, it, data): df, example = model[it] cell.set_property('text', example) for df in sorted(DurationFormat.values): # 4954s == longest ever CD, FWIW model.append([df, format_time_preferred(4954, df)]) duration = Gtk.ComboBox(model=model) cell = Gtk.CellRendererText() duration.pack_start(cell, True) duration.set_cell_data_func(cell, draw_duration, None) index = sorted(DurationFormat.values).index(DURATION.format) duration.set_active(index) duration.connect('changed', on_changed) hbox = Gtk.HBox(spacing=6) label = Gtk.Label(label=_("Duration totals") + ":", use_underline=True) label.set_mnemonic_widget(duration) hbox.pack_start(label, False, True, 0) hbox.pack_start(duration, False, True, 0) vbox.pack_start(hbox, False, True, 0) return qltk.Frame(_("Display"), child=vbox) def create_search_frame(): vb = Gtk.VBox(spacing=6) hb = Gtk.HBox(spacing=6) l = Gtk.Label(label=_("_Global filter:")) l.set_use_underline(True) e = ValidatingEntry(Query.validator) e.set_text(config.get("browsers", "background")) e.connect('changed', self._entry, 'background', 'browsers') e.set_tooltip_text( _("Apply this query in addition to all others")) l.set_mnemonic_widget(e) hb.pack_start(l, False, True, 0) hb.pack_start(e, True, True, 0) vb.pack_start(hb, False, True, 0) # Translators: The heading of the preference group, no action return qltk.Frame(C_("heading", "Search"), child=vb) super(PreferencesWindow.Browsers, self).__init__(spacing=12) self.set_border_width(12) self.title = _("Browsers") self.pack_start(create_search_frame(), False, True, 0) self.pack_start(create_display_frame(), False, True, 0) # Ratings vb = Gtk.VBox(spacing=6) c1 = CCB(_("Confirm _multiple ratings"), 'browsers', 'rating_confirm_multiple', populate=True, tooltip=_("Ask for confirmation before changing the " "rating of multiple songs at once")) c2 = CCB(_("Enable _one-click ratings"), 'browsers', 'rating_click', populate=True, tooltip=_("Enable rating by clicking on the rating " "column in the song list")) vbox = Gtk.VBox(spacing=6) vbox.pack_start(c1, False, True, 0) vbox.pack_start(c2, False, True, 0) f = qltk.Frame(_("Ratings"), child=vbox) self.pack_start(f, False, True, 0) vb = Gtk.VBox(spacing=6) # Filename choice algorithm config cb = CCB(_("Prefer _embedded art"), 'albumart', 'prefer_embedded', populate=True, tooltip=_("Choose to use artwork embedded in the audio " "(where available) over other sources")) vb.pack_start(cb, False, True, 0) hb = Gtk.HBox(spacing=3) cb = CCB(_("_Fixed image filename:"), 'albumart', 'force_filename', populate=True, tooltip=_("The single image filename to use if " "selected")) hb.pack_start(cb, False, True, 0) entry = UndoEntry() entry.set_tooltip_text( _("The album art image file to use when forced")) entry.set_text(config.get("albumart", "filename")) entry.connect('changed', self.__changed_text, 'filename') # Disable entry when not forcing entry.set_sensitive(cb.get_active()) cb.connect('toggled', self.__toggled_force_filename, entry) hb.pack_start(entry, True, True, 0) vb.pack_start(hb, False, True, 0) f = qltk.Frame(_("Album Art"), child=vb) self.pack_start(f, False, True, 0) for child in self.get_children(): child.show_all() def __changed_text(self, entry, name): config.set('albumart', name, entry.get_text()) def __toggled_force_filename(self, cb, fn_entry): fn_entry.set_sensitive(cb.get_active()) def _entry(self, entry, name, section="settings"): config.set(section, name, entry.get_text()) class Player(Gtk.VBox): name = "playback" def __init__(self): super(PreferencesWindow.Player, self).__init__(spacing=12) self.set_border_width(12) self.title = _("Playback") # player backend if app.player and hasattr(app.player, 'PlayerPreferences'): player_prefs = app.player.PlayerPreferences() f = qltk.Frame(_("Output Configuration"), child=player_prefs) self.pack_start(f, False, True, 0) # replaygain fallback_gain = config.getfloat("player", "fallback_gain", 0.0) adj = Gtk.Adjustment.new(fallback_gain, -12.0, 12.0, 0.5, 0.5, 0.0) fb_spin = Gtk.SpinButton(adjustment=adj) fb_spin.set_digits(1) fb_spin.connect('changed', self.__changed, 'player', 'fallback_gain') fb_spin.set_tooltip_text( _("If no Replay Gain information is available " "for a song, scale the volume by this value")) fb_label = Gtk.Label(label=_("_Fall-back gain (dB):")) fb_label.set_use_underline(True) fb_label.set_mnemonic_widget(fb_spin) pre_amp_gain = config.getfloat("player", "pre_amp_gain", 0.0) adj = Gtk.Adjustment.new(pre_amp_gain, -6, 6, 0.5, 0.5, 0.0) adj.connect('value-changed', self.__changed, 'player', 'pre_amp_gain') pre_spin = Gtk.SpinButton(adjustment=adj) pre_spin.set_digits(1) pre_spin.set_tooltip_text( _("Scale volume for all songs by this value, " "as long as the result will not clip")) pre_label = Gtk.Label(label=_("_Pre-amp gain (dB):")) pre_label.set_use_underline(True) pre_label.set_mnemonic_widget(pre_spin) widgets = [pre_label, pre_spin, fb_label, fb_spin] c = CCB(_("_Enable Replay Gain volume adjustment"), "player", "replaygain", populate=True) c.connect('toggled', self.__toggled_gain, widgets) # packing table = Gtk.Table.new(3, 2, False) table.set_col_spacings(6) table.set_row_spacings(6) table.attach(c, 0, 2, 0, 1) fb_label.set_alignment(0, 0.5) table.attach(fb_label, 0, 1, 1, 2, xoptions=Gtk.AttachOptions.FILL) pre_label.set_alignment(0, 0.5) table.attach(pre_label, 0, 1, 2, 3, xoptions=Gtk.AttachOptions.FILL) fb_align = Align(halign=Gtk.Align.START) fb_align.add(fb_spin) table.attach(fb_align, 1, 2, 1, 2) pre_align = Align(halign=Gtk.Align.START) pre_align.add(pre_spin) table.attach(pre_align, 1, 2, 2, 3) f = qltk.Frame(_("Replay Gain Volume Adjustment"), child=table) c.emit('toggled') self.pack_start(f, False, True, 0) for child in self.get_children(): child.show_all() def __toggled_gain(self, activator, widgets): if app.player: # tests app.player.reset_replaygain() for widget in widgets: widget.set_sensitive(activator.get_active()) def __changed(self, adj, section, name): config.set(section, name, str(adj.get_value())) app.player.reset_replaygain() class Tagging(Gtk.VBox): name = "tagging" def ratings_vbox(self): """Returns a new VBox containing all ratings widgets""" vb = Gtk.VBox(spacing=6) # Default Rating model = Gtk.ListStore(float) default_combo = Gtk.ComboBox(model=model) default_lab = Gtk.Label(label=_("_Default rating:")) default_lab.set_use_underline(True) default_lab.set_alignment(0, 0.5) def draw_rating(column, cell, model, it, data): num = model[it][0] text = "%0.2f: %s" % (num, util.format_rating(num)) cell.set_property('text', text) def default_rating_changed(combo, model): it = combo.get_active_iter() if it is None: return RATINGS.default = model[it][0] qltk.redraw_all_toplevels() def populate_default_rating_model(combo, num): model = combo.get_model() model.clear() deltas = [] default = RATINGS.default precision = RATINGS.precision for i in range(0, num + 1): r = i * precision model.append(row=[r]) deltas.append((abs(default - r), i)) active = sorted(deltas)[0][1] print_d("Choosing #%d (%.2f), closest to current %.2f" % (active, precision * active, default)) combo.set_active(active) cell = Gtk.CellRendererText() default_combo.pack_start(cell, True) default_combo.set_cell_data_func(cell, draw_rating, None) default_combo.connect('changed', default_rating_changed, model) default_lab.set_mnemonic_widget(default_combo) def refresh_default_combo(num): populate_default_rating_model(default_combo, num) # Rating Scale model = Gtk.ListStore(int) scale_combo = Gtk.ComboBox(model=model) scale_lab = Gtk.Label(label=_("Rating _scale:")) scale_lab.set_use_underline(True) scale_lab.set_mnemonic_widget(scale_combo) cell = Gtk.CellRendererText() scale_combo.pack_start(cell, False) num = RATINGS.number for i in [1, 2, 3, 4, 5, 6, 8, 10]: it = model.append(row=[i]) if i == num: scale_combo.set_active_iter(it) def draw_rating_scale(column, cell, model, it, data): num_stars = model[it][0] text = "%d: %s" % (num_stars, RATINGS.full_symbol * num_stars) cell.set_property('text', text) def rating_scale_changed(combo, model): it = combo.get_active_iter() if it is None: return RATINGS.number = num = model[it][0] refresh_default_combo(num) refresh_default_combo(RATINGS.number) scale_combo.set_cell_data_func(cell, draw_rating_scale, None) scale_combo.connect('changed', rating_scale_changed, model) default_align = Align(halign=Gtk.Align.START) default_align.add(default_lab) scale_align = Align(halign=Gtk.Align.START) scale_align.add(scale_lab) grid = Gtk.Grid(column_spacing=6, row_spacing=6) grid.add(scale_align) grid.add(scale_combo) grid.attach(default_align, 0, 1, 1, 1) grid.attach(default_combo, 1, 1, 1, 1) vb.pack_start(grid, False, False, 6) # Bayesian Factor bayesian_factor = config.getfloat("settings", "bayesian_rating_factor", 0.0) adj = Gtk.Adjustment.new(bayesian_factor, 0.0, 10.0, 0.5, 0.5, 0.0) bayes_spin = Gtk.SpinButton(adjustment=adj, numeric=True) bayes_spin.set_digits(1) bayes_spin.connect('changed', self.__changed_and_signal_library, 'settings', 'bayesian_rating_factor') bayes_spin.set_tooltip_text( _("Bayesian Average factor (C) for aggregated ratings.\n" "0 means a conventional average, higher values mean that " "albums with few tracks will have less extreme ratings. " "Changing this value triggers a re-calculation for all " "albums.")) bayes_label = Gtk.Label(label=_("_Bayesian averaging amount:")) bayes_label.set_use_underline(True) bayes_label.set_mnemonic_widget(bayes_spin) # Save Ratings hb = Gtk.HBox(spacing=6) hb.pack_start(bayes_label, False, True, 0) hb.pack_start(bayes_spin, False, True, 0) vb.pack_start(hb, True, True, 0) cb = CCB(_("Save ratings and play _counts"), "editing", "save_to_songs", populate=True) vb.pack_start(cb, True, True, 0) hb = Gtk.HBox(spacing=6) lab = Gtk.Label(label=_("_Email:")) entry = UndoEntry() entry.set_tooltip_text(_("Ratings and play counts will be set " "for this email address")) entry.set_text(config.get("editing", "save_email")) entry.connect('changed', self.__changed, 'editing', 'save_email') hb.pack_start(lab, False, True, 0) hb.pack_start(entry, True, True, 0) lab.set_mnemonic_widget(entry) lab.set_use_underline(True) vb.pack_start(hb, True, True, 0) return vb def tag_editing_vbox(self): """Returns a new VBox containing all tag editing widgets""" vbox = Gtk.VBox(spacing=6) cb = CCB(_("Auto-save tag changes"), 'editing', 'auto_save_changes', populate=True, tooltip=_("Save changes to tags without confirmation " "when editing multiple files")) vbox.pack_start(cb, False, True, 0) hb = Gtk.HBox(spacing=6) e = UndoEntry() e.set_text(config.get("editing", "split_on")) e.connect('changed', self.__changed, 'editing', 'split_on') e.set_tooltip_text( _("A set of separators to use when splitting tag values " "in the tag editor. " "The list is space-separated")) def do_revert_split(button, section, option): config.reset(section, option) e.set_text(config.get(section, option)) split_revert = Button(_("_Revert"), Icons.DOCUMENT_REVERT) split_revert.connect("clicked", do_revert_split, "editing", "split_on") l = Gtk.Label(label=_("Split _on:")) l.set_use_underline(True) l.set_mnemonic_widget(e) hb.pack_start(l, False, True, 0) hb.pack_start(e, True, True, 0) hb.pack_start(split_revert, False, True, 0) vbox.pack_start(hb, False, True, 0) return vbox def __init__(self): super(PreferencesWindow.Tagging, self).__init__(spacing=12) self.set_border_width(12) self.title = _("Tags") self._songs = [] f = qltk.Frame(_("Tag Editing"), child=(self.tag_editing_vbox())) self.pack_start(f, False, True, 0) f = qltk.Frame(_("Ratings"), child=self.ratings_vbox()) self.pack_start(f, False, True, 0) for child in self.get_children(): child.show_all() def __changed(self, entry, section, name): config.set(section, name, entry.get_text()) def __changed_and_signal_library(self, entry, section, name): config.set(section, name, str(entry.get_value())) print_d("Signalling \"changed\" to entire library. Hold tight...") # Cache over clicks self._songs = self._songs or app.library.values() copool.add(emit_signal, self._songs, funcid="library changed", name=_("Updating for new ratings")) class Library(Gtk.VBox): name = "library" def __init__(self): super(PreferencesWindow.Library, self).__init__(spacing=12) self.set_border_width(12) self.title = _("Library") cb = CCB(_("Scan library _on start"), "library", "refresh_on_start", populate=True) scan_dirs = ScanBox() vb3 = Gtk.VBox(spacing=6) vb3.pack_start(scan_dirs, True, True, 0) def refresh_cb(button): scan_library(app.library, force=False) refresh = qltk.Button(_("_Scan Library"), Icons.VIEW_REFRESH) refresh.connect("clicked", refresh_cb) refresh.set_tooltip_text(_("Check for changes in your library")) def reload_cb(button): scan_library(app.library, force=True) reload_ = qltk.Button(_("Re_build Library"), Icons.VIEW_REFRESH) reload_.connect("clicked", reload_cb) reload_.set_tooltip_text( _("Reload all songs in your library. " "This can take a long time.")) grid = Gtk.Grid(column_spacing=6, row_spacing=6) cb.props.hexpand = True grid.attach(cb, 0, 0, 1, 1) grid.attach(refresh, 1, 0, 1, 1) grid.attach(reload_, 1, 1, 1, 1) vb3.pack_start(grid, False, True, 0) f = qltk.Frame(_("Scan Directories"), child=vb3) self.pack_start(f, False, True, 0) # during testing if app.library is not None: masked = MaskedBox(app.library) f = qltk.Frame(_("Hidden Songs"), child=masked) self.pack_start(f, False, True, 0) for child in self.get_children(): child.show_all() def __init__(self, parent): if self.is_not_unique(): return super(PreferencesWindow, self).__init__() self.current_scan_dirs = get_scan_dirs() self.set_title(_("Preferences")) self.set_resizable(False) self.set_transient_for(qltk.get_top_parent(parent)) self.__notebook = notebook = qltk.Notebook() for Page in [self.SongList, self.Browsers, self.Player, self.Library, self.Tagging]: page = Page() page.show() notebook.append_page(page) page_name = config.get("memory", "prefs_page", "") self.set_page(page_name) def on_switch_page(notebook, page, page_num): config.set("memory", "prefs_page", page.name) notebook.connect("switch-page", on_switch_page) close = Button(_("_Close"), Icons.WINDOW_CLOSE) connect_obj(close, 'clicked', lambda x: x.destroy(), self) button_box = Gtk.HButtonBox() button_box.set_layout(Gtk.ButtonBoxStyle.END) button_box.pack_start(close, True, True, 0) self.use_header_bar() if self.has_close_button(): self.set_border_width(0) notebook.set_show_border(False) self.add(notebook) else: self.set_border_width(12) vbox = Gtk.VBox(spacing=12) vbox.pack_start(notebook, True, True, 0) vbox.pack_start(button_box, False, True, 0) self.add(vbox) connect_obj(self, 'destroy', PreferencesWindow.__destroy, self) self.get_child().show_all() def set_page(self, name): notebook = self.__notebook for p in range(notebook.get_n_pages()): if notebook.get_nth_page(p).name == name: notebook.set_current_page(p) def __destroy(self): config.save() if self.current_scan_dirs != get_scan_dirs(): print_d("Library paths have changed, re-scanning...") scan_library(app.library, force=False) ������������������������������������quodlibet-3.9.1/quodlibet/qltk/cbes.py��������������������������������������������������������������0000644�0001750�0001750�00000034465�13112005742�020202� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005-2011 Joe Wreschnig, Michael Urman, Christoph Reiter, # Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk, Pango, GObject from quodlibet import _ from quodlibet import qltk from quodlibet.qltk.views import RCMHintedTreeView from quodlibet.util import connect_obj from quodlibet.qltk import entry from quodlibet.qltk import Icons class _KeyValueEditor(qltk.Window): """Base class for key-value edit widgets""" _WIDTH = 400 _HEIGHT = 300 def __init__(self, title, validator=None): super(_KeyValueEditor, self).__init__() self.set_border_width(12) self.set_title(title) self.set_default_size(self._WIDTH, self._HEIGHT) self.add(Gtk.VBox(spacing=6)) t = Gtk.Table(n_rows=2, n_columns=3) t.set_row_spacings(3) t.set_col_spacing(0, 3) t.set_col_spacing(1, 12) l = Gtk.Label(label=_("_Name:")) name = entry.UndoEntry() l.set_mnemonic_widget(name) l.set_use_underline(True) l.set_alignment(0.0, 0.5) t.attach(l, 0, 1, 0, 1, xoptions=Gtk.AttachOptions.FILL) t.attach(name, 1, 2, 0, 1) l = Gtk.Label(label=_("_Value:")) self.value = entry.ValidatingEntry(validator) l.set_mnemonic_widget(self.value) l.set_use_underline(True) l.set_alignment(0.0, 0.5) t.attach(l, 0, 1, 1, 2, xoptions=Gtk.AttachOptions.FILL) t.attach(self.value, 1, 2, 1, 2) add = qltk.Button(_("_Add"), Icons.LIST_ADD) add.set_sensitive(False) t.attach(add, 2, 3, 1, 2, xoptions=Gtk.AttachOptions.FILL) self.get_child().pack_start(t, False, True, 0) # Set up the model for this widget self.model = Gtk.ListStore(str, str) self.fill_values() view = RCMHintedTreeView(model=self.model) view.set_headers_visible(False) view.set_reorderable(True) view.set_rules_hint(True) render = Gtk.CellRendererText() render.props.ellipsize = Pango.EllipsizeMode.END column = Gtk.TreeViewColumn("", render) column.set_cell_data_func(render, self.__cdf, None) view.append_column(column) sw = Gtk.ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.add(view) self.get_child().pack_start(sw, True, True, 0) menu = Gtk.Menu() remove = qltk.MenuItem(_("_Remove"), Icons.LIST_REMOVE) connect_obj(remove, 'activate', self.__remove, view) qltk.add_fake_accel(remove, "Delete") menu.append(remove) menu.show_all() bbox = Gtk.HButtonBox() rem_b = qltk.Button(_("_Remove"), Icons.LIST_REMOVE) rem_b.set_sensitive(False) bbox.pack_start(rem_b, True, True, 0) self.use_header_bar() close = qltk.Button(_("_Close"), Icons.WINDOW_CLOSE) if not self.has_close_button(): bbox.pack_start(close, True, True, 0) else: bbox.set_layout(Gtk.ButtonBoxStyle.START) self.get_child().pack_start(bbox, False, True, 0) selection = view.get_selection() connect_obj(name, 'activate', Gtk.Entry.grab_focus, self.value) connect_obj(self.value, 'activate', Gtk.Button.clicked, add) self.value.connect('changed', self.__changed, [add]) connect_obj(add, 'clicked', self.__add, selection, name, self.value, self.model) selection.connect('changed', self.__set_text, name, self.value, rem_b) view.connect('popup-menu', self.__popup, menu) connect_obj(rem_b, 'clicked', self.__remove, view) connect_obj(close, 'clicked', qltk.Window.destroy, self) view.connect('key-press-event', self.__view_key_press) connect_obj(self, 'destroy', Gtk.Menu.destroy, menu) name.grab_focus() self.get_child().show_all() def fill_values(self): """Responsible for populating self.model (eg with values from disk)""" raise NotImplementedError def __view_key_press(self, view, event): if qltk.is_accel(event, "Delete"): self.__remove(view) def __popup(self, view, menu): return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __remove(self, view): view.remove_selection() def __set_text(self, selection, name, value, remove): model, iter = selection.get_selected() remove.set_sensitive(bool(iter)) if iter is not None: name.set_text(model[iter][1]) value.set_text(model[iter][0]) def __cdf(self, column, cell, model, iter, data): row = model[iter] content, name = row[0], row[1] cell.set_property('text', '%s\n\t%s' % (name, content)) def __changed(self, entry, buttons): for b in buttons: b.set_sensitive(bool(entry.get_text())) def __add(self, selection, name, value, model): value = value.get_text() if value: name = name.get_text() or value iter = model.append(row=[value, name]) selection.select_iter(iter) class CBESEditor(_KeyValueEditor): def __init__(self, cbes, title, validator=None): # Do this before calling parent constructor self.cbes = cbes super(CBESEditor, self).__init__(title, validator) self.set_transient_for(qltk.get_top_parent(cbes)) connect_obj(self, 'destroy', self.__finish, cbes) self.value.set_text(cbes.get_child().get_text()) def fill_values(self): for row in self.cbes.get_model(): if row[2] is not None: break else: self.model.append((row[0], row[1])) def __finish(self, cbes): cbes_model = cbes.get_model() iter = cbes_model.get_iter_first() while cbes_model[iter][2] is None: cbes_model.remove(iter) iter = cbes_model.get_iter_first() for row in self.model: cbes_model.insert_before(iter, row=[row[0], row[1], None]) cbes.write() class StandaloneEditor(_KeyValueEditor): """A key-value pair editor that can be used without CBES. Saves to disk in a single file of the same format with suffix '.saved' """ # Make this editor a bit bigger _WIDTH = 500 _HEIGHT = 350 @classmethod def load_values(cls, filename): """Returns a list of tuples representing k,v pairs of the given file""" ret = [] if os.path.exists(filename): fileobj = open(filename, "rU") lines = list(fileobj.readlines()) for i in range(len(lines) // 2): ret.append((lines[i * 2 + 1].strip(), lines[i * 2].strip())) return ret def __init__(self, filename, title, initial=None, validator=None): self.filename = filename self.initial = initial or [] super(StandaloneEditor, self).__init__(title, validator) connect_obj(self, 'destroy', self.write, True) def fill_values(self): filename = self.filename + ".saved" if os.path.exists(filename): fileobj = open(filename, "rU") lines = list(fileobj.readlines()) lines.reverse() while len(lines) > 1: self.model.prepend( row=[lines.pop(1).strip(), lines.pop(0).strip()]) if not len(self.model) and self.initial: for (k, v) in self.initial: self.model.append(row=[v.strip(), k.strip()]) def write(self, create=True): """Save to a filename. If create is True, any needed parent directories will be created.""" try: if create: if not os.path.isdir(os.path.dirname(self.filename)): os.makedirs(os.path.dirname(self.filename)) with open(self.filename + ".saved", "w") as saved: for row in self.model: saved.write(row[0] + "\n") saved.write(row[1] + "\n") except EnvironmentError: pass def clone_css_classes(src, dest): """Makes dest have the same css classes as src""" src_ctx = src.get_style_context() dest_ctx = dest.get_style_context() for class_ in dest_ctx.list_classes(): dest_ctx.remove_class(class_) for class_ in src_ctx.list_classes(): dest_ctx.add_class(class_) class ComboBoxEntrySave(Gtk.ComboBox): """A ComboBoxEntry that remembers the past 'count' strings entered, and can save itself to (and load itself from) a filename or file-like.""" # gets emited if the text entry changes # mainly to filter out model changes that don't have any effect __gsignals__ = { 'text-changed': (GObject.SignalFlags.RUN_LAST, None, ()), } __models = {} __last = "" def __init__(self, filename=None, initial=[], count=5, id=None, validator=None, title=_("Saved Values"), edit_title=_(u"Edit saved values…")): self.count = count self.filename = filename id = filename or id try: model = self.__models[id] except KeyError: model = type(self).__models[id] = Gtk.ListStore(str, str, str) super(ComboBoxEntrySave, self).__init__( model=model, entry_text_column=0, has_entry=True) self.clear() render = Gtk.CellRendererPixbuf() self.pack_start(render, False) self.add_attribute(render, 'icon-name', 2) render = Gtk.CellRendererText() self.pack_start(render, True) self.add_attribute(render, 'text', 1) self.set_row_separator_func(self.__separator_func, None) if not len(model): self.__fill(filename, initial, edit_title) old_entry = self.get_child() new_entry = entry.ValidatingEntry(validator) clone_css_classes(old_entry, new_entry) old_entry.destroy() self.add(new_entry) connect_obj(self, 'destroy', self.set_model, None) connect_obj(self, 'changed', self.__changed, model, validator, title) def enable_clear_button(self): self.get_child().enable_clear_button() def __changed(self, model, validator, title): iter = self.get_active_iter() if iter: if model[iter][2]: self.get_child().set_text(self.__last) win = CBESEditor(self, title, validator) win.show() self.set_active(-1) else: self.__focus_entry() new = self.get_child().get_text() if new != self.__last: self.emit("text-changed") self.__last = new def __focus_entry(self): self.get_child().grab_focus() self.get_child().emit('move-cursor', Gtk.MovementStep.BUFFER_ENDS, 0, False) def __fill(self, filename, initial, edit_title): model = self.get_model() model.append(row=["", edit_title, Icons.DOCUMENT_PROPERTIES]) model.append(row=[None, None, None]) if filename is None: return if os.path.exists(filename + ".saved"): with open(filename + ".saved", "rU") as fileobj: lines = list(fileobj.readlines()) lines.reverse() while len(lines) > 1: model.prepend( row=[lines.pop(1).strip(), lines.pop(0).strip(), None]) if os.path.exists(filename): with open(filename, "rU") as fileobj: for line in fileobj.readlines(): line = line.strip() model.append(row=[line, line, None]) for c in initial: model.append(row=[c, c, None]) self.__shorten() def __separator_func(self, model, iter, userdata): return model[iter][1] is None def __shorten(self): model = self.get_model() for row in model: if row[0] is None: offset = row.path.get_indices()[0] + 1 break to_remove = (len(model) - offset) - self.count while to_remove > 0: model.remove(model.get_iter((len(model) - 1,))) to_remove -= 1 def write(self, filename=None, create=True): """Save to a filename. If create is True, any needed parent directories will be created.""" if filename is None: filename = self.filename try: if create: if not os.path.isdir(os.path.dirname(filename)): os.makedirs(os.path.dirname(filename)) with open(filename + ".saved", "w") as saved: with open(filename, "w") as memory: target = saved for row in self.get_model(): if row[0] is None: target = memory elif row[2] is None: target.write(row[0] + "\n") if target is saved: target.write(row[1] + "\n") except EnvironmentError: pass def __remove_if_present(self, text): # Removes an item from the list if it's present in the remembered # values, or returns true if it's in the saved values. removable = False model = self.get_model() for row in model: if row[0] is None: # Not found in the saved values, so if we find it from now # on, remove it and return false. removable = True elif row[2] is None and row[0] == text: # Found the value, and it's not the magic value -- remove # it if necessary, and return whether or not to continue. if removable: model.remove(row.iter) return not removable def prepend_text(self, text): # If we find the value in the saved values, don't prepend it. if self.__remove_if_present(text): return model = self.get_model() for row in model: if row[0] is None: model.insert_after(row.iter, row=[text, text, None]) break self.__shorten() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/image.py�������������������������������������������������������������0000644�0001750�0001750�00000012151�13112005742�020334� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Some helper function for loading and converting image data.""" import math from gi.repository import GdkPixbuf, Gtk, Gdk, GLib import cairo def get_surface_for_pixbuf(widget, pixbuf): """Returns a cairo surface""" scale_factor = widget.get_scale_factor() return Gdk.cairo_surface_create_from_pixbuf( pixbuf, scale_factor, widget.get_window()) def get_surface_extents(surface): """Gives (x, y, width, height) for a surface, scale independent""" ctx = cairo.Context(surface) x1, y1, x2, y2 = ctx.clip_extents() x1 = int(math.floor(x1)) y1 = int(math.floor(y1)) x2 = int(math.ceil(x2)) y2 = int(math.ceil(y2)) x2 -= x1 y2 -= y1 return (x1, y1, x2, y2) def get_border_radius(_widgets=[]): """Returns the border radius commonly used in the current theme. If there are no rounded corners 0 will be returned. """ if not _widgets: b = Gtk.Button() b.show() e = Gtk.Entry() e.show() _widgets += [b, e] radii = [] for widget in _widgets: style_context = widget.get_style_context() radii.append(style_context.get_property( Gtk.STYLE_PROPERTY_BORDER_RADIUS, style_context.get_state())) radius = max(radii) # Doesn't work on the default Ubuntu theme. # Not sure why, so fix manually for now theme_name = Gtk.Settings.get_default().props.gtk_theme_name if theme_name in ("Ambiance", "Radiance"): radius = int(radius / 1.5) return radius def add_border(pixbuf, color, width=1, radius=0): """Add a border to the pixbuf and round of the edges. color is a Gdk.RGBA The resulting pixbuf will be width * 2px higher and wider. Can not fail. """ w, h = pixbuf.get_width(), pixbuf.get_height() w += width * 2 h += width * 2 surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) ctx = cairo.Context(surface) pi = math.pi r = min(radius, min(w, h) / 2) ctx.new_path() ctx.arc(w - r, r, r, -pi / 2, 0) ctx.arc(w - r, h - r, r, 0, pi / 2) ctx.arc(r, h - r, r, pi / 2, pi) ctx.arc(r, r, r, pi, pi * 3 / 2) ctx.close_path() Gdk.cairo_set_source_pixbuf(ctx, pixbuf, width, width) ctx.clip_preserve() ctx.paint() ctx.set_source_rgba(color.red, color.green, color.blue, color.alpha) ctx.set_line_width(width * 2) ctx.stroke() return Gdk.pixbuf_get_from_surface(surface, 0, 0, w, h) def add_border_widget(pixbuf, widget): """Like add_border() but uses the widget to get a border color and a border width. """ context = widget.get_style_context() color = context.get_color(context.get_state()) scale_factor = widget.get_scale_factor() border_radius = get_border_radius() * scale_factor return add_border(pixbuf, color, width=scale_factor, radius=border_radius) def scale(pixbuf, boundary, scale_up=True, force_copy=False): """Scale a pixbuf so it fits into the boundary. (preserves image aspect ratio) If `scale_up` is True, the resulting pixbuf can be larger than the original one. If `force_copy` is False the resulting pixbuf might be the passed one. Can not fail. """ size = pixbuf.get_width(), pixbuf.get_height() scale_w, scale_h = calc_scale_size(boundary, size, scale_up) if (scale_w, scale_h) == size: if force_copy: return pixbuf.copy() return pixbuf return pixbuf.scale_simple(scale_w, scale_h, GdkPixbuf.InterpType.BILINEAR) def calc_scale_size(boundary, size, scale_up=True): """Returns the biggest possible size to fit into the boundary, respecting the aspect ratio. If `scale_up` is True the result can be larger than size. All sizes have to be > 0. """ bwidth, bheight = boundary iwidth, iheight = size if bwidth <= 0 or bheight <= 0 or iwidth <= 0 or iheight <= 0: raise ValueError scale_w, scale_h = iwidth, iheight if iwidth > bwidth or iheight > bheight or scale_up: bratio = float(bwidth) / bheight iratio = float(iwidth) / iheight if iratio > bratio: scale_w = bwidth scale_h = int(bwidth / iratio) else: scale_w = int(bheight * iratio) scale_h = bheight return scale_w, scale_h def pixbuf_from_file(fileobj, boundary, scale_factor=1): """Returns a pixbuf with the maximum size defined by boundary. Can raise GLib.GError and return None """ try: pixbuf = GdkPixbuf.Pixbuf.new_from_file(fileobj.name) except GLib.GError: try: loader = GdkPixbuf.PixbufLoader() loader.write(fileobj.read()) loader.close() fileobj.seek(0, 0) pixbuf = loader.get_pixbuf() except EnvironmentError: return w, h = boundary w *= scale_factor h *= scale_factor return scale(pixbuf, (w, h), scale_up=False) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/info.py��������������������������������������������������������������0000644�0001750�0001750�00000013162�13112005742�020210� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2011-2014 Nick Boultbee # 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk, Gdk, Pango from quodlibet import _ from quodlibet import print_w from quodlibet import qltk from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.x import SeparatorMenuItem, Align from quodlibet.qltk import Icons from quodlibet.util import connect_destroy from quodlibet.pattern import XMLFromMarkupPattern from quodlibet.qltk.textedit import PatternEdit class SongInfo(Gtk.EventBox): """A widget for showing information about the currently playing song. Provides a way to change the display pattern for formatting the song information and a song context menu. """ _pattern = (u"""\ [span weight='bold' size='large']<title>[/span]\ <~length| (<~length>)><version| [small][b]<version>[/b][/small]><~people| %(people)s><album| [b]<album>[/b]<discnumber| - %(disc)s>\ <discsubtitle| - [b]<discsubtitle>[/b]><tracknumber| - %(track)s>>""" % { # Translators: As in "by Artist Name" "people": _("by %s") % "<~people>", "disc": _("Disc %s") % "<discnumber>", "track": _("Track %s") % "<tracknumber>" }) _not_playing = "<span size='xx-large'>%s</span>" % _("Not playing") def __init__(self, library, player, pattern_filename): super(SongInfo, self).__init__() self._pattern_filename = pattern_filename self.set_visible_window(False) align = Align(halign=Gtk.Align.START, valign=Gtk.Align.START) label = Gtk.Label() label.set_ellipsize(Pango.EllipsizeMode.MIDDLE) label.set_track_visited_links(False) label.set_selectable(True) align.add(label) label.set_alignment(0.0, 0.0) self._label = label connect_destroy(library, 'changed', self._on_library_changed, player) connect_destroy(player, 'song-started', self._on_song_started) label.connect('populate-popup', self._on_label_popup, player, library) self.connect('button-press-event', self._on_button_press_event, player, library) try: with open(self._pattern_filename, "rb") as h: self._pattern = h.read().strip().decode("utf-8") except (EnvironmentError, UnicodeDecodeError): pass self._compiled = XMLFromMarkupPattern(self._pattern) align.show_all() self.add(align) def _on_button_press_event(self, widget, event, player, library): if event.button == Gdk.BUTTON_SECONDARY: menu = self._get_menu(player, library) menu.attach_to_widget(widget, None) menu.popup(None, None, None, None, event.button, event.time) return True return False def _on_label_popup(self, label, menu, player, library): song_menu = self._get_menu(player, library) has_selection = label.get_selection_bounds()[0] if not has_selection: for child in menu.get_children(): child.destroy() for item in song_menu: song_menu.remove(item) menu.append(item) else: sub = Gtk.MenuItem.new_with_mnemonic(("Current _Song")) sub.set_submenu(song_menu) sub.set_sensitive(player.song is not None) sub.show_all() sep = SeparatorMenuItem() sep.show() menu.append(sep) menu.append(sub) def _get_menu(self, player, library): item = qltk.MenuItem(_(u"_Edit Display…"), Icons.EDIT) item.connect('activate', self._on_edit_display, player) songs = [player.song] if player.song else [] song_menu = SongsMenu(library, songs, remove=False, delete=True, accels=False, items=[[item]]) song_menu.show_all() return song_menu def _on_edit_display(self, menu_item, player): editor = PatternEdit( self, SongInfo._pattern, alternative_markup=True, links=True) editor.text = self._pattern editor.apply.connect('clicked', self._on_set_pattern, editor, player) editor.show() def _on_set_pattern(self, button, edit, player): self._pattern = edit.text.rstrip() if self._pattern == SongInfo._pattern: try: os.unlink(self._pattern_filename) except OSError: pass else: try: with open(self._pattern_filename, "wb") as h: h.write(self._pattern.encode("utf-8") + b"\n") except EnvironmentError as e: print_w("Couldn't save display pattern '%s' (%s)" % (self._pattern, e)) self._compiled = XMLFromMarkupPattern(self._pattern) self._update_info(player) def _on_library_changed(self, library, songs, player): if player.info in songs: self._update_info(player) def _on_song_started(self, player, song): self._update_info(player) def _update_info(self, player, _last={}): text = (self._not_playing if player.info is None else self._compiled % player.info) # some radio streams update way too often and updating the label # destroys the text selection if text not in _last: self._label.set_markup(text) _last.clear() _last[text] = True ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/views.py�������������������������������������������������������������0000644�0001750�0001750�00000133673�13112005742�020424� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 2012, 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import contextlib from gi.repository import Gtk, Gdk, GObject, Pango, GLib import cairo from senf import environ from quodlibet import _, print_e from quodlibet import config from quodlibet.qltk import get_top_parent, is_accel, is_wayland, gtk_version, \ menu_popup, get_primary_accel_mod from quodlibet.qltk.image import get_surface_extents class TreeViewHints(Gtk.Window): """Handle 'hints' for treeviews. This includes expansions of truncated columns, and in the future, tooltips.""" class _MinLabel(Gtk.Label): def do_get_preferred_width(*args): return (0, Gtk.Label.do_get_preferred_width(*args)[0]) # input_shape_combine_region does not work under Windows, we have # to pass all events to the treeview. In case it does work, this handlers # will never be called. __gsignals__ = dict.fromkeys( ['button-press-event', 'button-release-event', 'motion-notify-event', 'scroll-event', 'enter-notify-event', 'leave-notify-event'], 'override') def __init__(self): try: # gtk+ 3.20 TreeViewHints.set_css_name("tooltip") except AttributeError: pass super(TreeViewHints, self).__init__(type=Gtk.WindowType.POPUP) # set the type hint so the wayland backend maps it as a subsurface # which supports relative positioning self.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) self.__clabel = Gtk.Label() self.__clabel.show() self.__clabel.set_alignment(0, 0.5) self.__clabel.set_ellipsize(Pango.EllipsizeMode.NONE) screen = self.get_screen() rgba = screen.get_rgba_visual() if rgba is not None: self.set_visual(rgba) self.__label = label = self._MinLabel() label.set_alignment(0, 0.5) label.set_ellipsize(Pango.EllipsizeMode.NONE) label.show() self.add(label) self.add_events( Gdk.EventMask.BUTTON_MOTION_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK | Gdk.EventMask.ENTER_NOTIFY_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.SCROLL_MASK | Gdk.EventMask.POINTER_MOTION_MASK) context = self.get_style_context() context.add_class("tooltip") context.add_class("ql-tooltip") self.set_accept_focus(False) self.set_resizable(False) self.set_name("gtk-tooltip") if gtk_version < (3, 13): self.set_border_width(1) self.connect('leave-notify-event', self.__undisplay) self.__handlers = {} self.__current_path = self.__current_col = None self.__current_renderer = None self.__view = None self.__hide_id = None def connect_view(self, view): # don't depend on padding set by theme, we need the text coordinates # to match in all cases self._style_provider = style_provider = Gtk.CssProvider() style_provider.load_from_data(b""" .ql-tooltip * { border-width: 0px; padding: 0px; } .ql-tooltip { padding: 0px; } """) # somehow this doesn't apply if we set it on the window, only # if set for the screen. gets reverted again in disconnect_view() Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) self.__handlers[view] = [ view.connect('motion-notify-event', self.__motion), view.connect('leave-notify-event', self.__motion), view.connect('scroll-event', self.__undisplay), view.connect('key-press-event', self.__undisplay), view.connect('unmap', self.__undisplay), view.connect('destroy', self.disconnect_view), ] def disconnect_view(self, view): try: for handler in self.__handlers[view]: view.disconnect(handler) del self.__handlers[view] except KeyError: pass # Hide if the active treeview is going away if view is self.__view: self.__undisplay() self.set_transient_for(None) if self.__hide_id: GLib.source_remove(self.__hide_id) self.__hide_id = None self.hide() Gtk.StyleContext.remove_provider_for_screen( Gdk.Screen.get_default(), self._style_provider) def __motion(self, view, event): label = self.__label clabel = self.__clabel # trigger over row area, not column headers if event.window is not view.get_bin_window(): self.__undisplay() return False x, y = map(int, [event.x, event.y]) # For gtk3.16 overlay scrollbars: if our event x coordinate # is contained in the scrollbar, hide the tooltip. Unlike other # hiding events we don't want to send a leave event to the scrolled # window so the overlay scrollbar does't hide and can be interacted # with. parent = view.get_parent() # We only need to check if the tooltip is there since events # on the scrollbars don't get forwarded to us anyway. if self.__view and parent and isinstance(parent, Gtk.ScrolledWindow): vscrollbar = parent.get_vscrollbar() res = vscrollbar.translate_coordinates(view, 0, 0) if res is not None: x_offset = res[0] vbar_width = vscrollbar.get_allocation().width if x_offset <= x <= x_offset + vbar_width: self.__undisplay(send_leave=False) return False # hide if any modifier is active. mask = Gtk.accelerator_get_default_mod_mask() mask = Gdk.Keymap.get_default().map_virtual_modifiers(mask)[1] if event.get_state() & mask: self.__undisplay() return False # get the cell at the mouse position try: path, col, cellx, celly = view.get_path_at_pos(x, y) except TypeError: # no hints where no rows exist self.__undisplay() return False col_area = view.get_cell_area(path, col) # make sure we are on the same level if x < col_area.x: self.__undisplay() return False # hide for partial hidden rows at the bottom if y > view.get_visible_rect().height: self.__undisplay() return False # get the renderer at the mouse position and get the xpos/width renderers = col.get_cells() pos = sorted(zip(map(col.cell_get_position, renderers), renderers)) pos = list(filter(lambda p: p[0][0] < cellx, pos)) if not pos: self.__undisplay() return False (render_offset, render_width), renderer = pos[-1] if self.__current_renderer == renderer and self.__current_path == path: return False # only ellipsized text renderers if not isinstance(renderer, Gtk.CellRendererText): self.__undisplay() return False ellipsize = renderer.get_property('ellipsize') if ellipsize == Pango.EllipsizeMode.END: expand_left = False elif ellipsize == Pango.EllipsizeMode.MIDDLE: # depending on where the cursor is expand_left = x > col_area.x + render_offset + render_width / 2 elif ellipsize == Pango.EllipsizeMode.START: expand_left = True else: self.__undisplay() return False # don't display if the renderer is in editing mode if renderer.props.editing: self.__undisplay() return False # set the cell renderer attributes for the active cell model = view.get_model() col.cell_set_cell_data(model, model.get_iter(path), False, False) # the markup attribute is write only, so the markup text needs # to be saved on the python side, so we can copy it to the label markup = getattr(renderer, "markup", None) if markup is None: text = renderer.get_property('text') set_text = lambda l: l.set_text(text) else: # markup can also be column index if isinstance(markup, int): markup = model[path][markup] set_text = lambda l: l.set_markup(markup) # Use the renderer padding as label padding so the text offset matches render_xpad = renderer.get_property("xpad") # the renderer xpad is not enough for the tooltip, especially with # rounded corners the label gets nearly clipped. MIN_HINT_X_PAD = 4 if render_xpad < MIN_HINT_X_PAD: extra_xpad = MIN_HINT_X_PAD - render_xpad else: extra_xpad = 0 label.set_padding(render_xpad + extra_xpad, 0) set_text(clabel) clabel.set_padding(render_xpad, 0) label_width = clabel.get_layout().get_pixel_size()[0] label_width += clabel.get_layout_offsets()[0] or 0 # layout offset includes the left padding, so add one more label_width += render_xpad # CellRenderer width is too large if it's the last one in a column. # Use cell_area width as a maximum and limit render_width. max_width = col_area.width if render_width + render_offset > max_width: render_width = max_width - render_offset # don't display if it doesn't need expansion if label_width < render_width: self.__undisplay() return False dummy, ox, oy = view.get_window().get_origin() bg_area = view.get_background_area(path, None) # save for adjusting passthrough events self.__dx, self.__dy = col_area.x + render_offset, bg_area.y self.__dx -= extra_xpad if expand_left: # shift to the left # FIXME: ellipsize start produces a space at the end depending # on the text. I don't know how to compute it.. self.__dx -= (label_width - render_width) # final window coordinates/size x = ox + self.__dx y = oy + self.__dy x, y = view.convert_bin_window_to_widget_coords(x, y) w = label_width + extra_xpad * 2 h = bg_area.height if not is_wayland(): # clip if it's bigger than the monitor mon_border = 5 # leave some space screen = Gdk.Screen.get_default() if not expand_left: monitor_idx = screen.get_monitor_at_point(x, y) mon = screen.get_monitor_geometry(monitor_idx) space_right = mon.x + mon.width - x - w - mon_border if space_right < 0: w += space_right label.set_ellipsize(Pango.EllipsizeMode.END) else: label.set_ellipsize(Pango.EllipsizeMode.NONE) else: monitor_idx = screen.get_monitor_at_point(x + w, y) mon = screen.get_monitor_geometry(monitor_idx) space_left = x - mon.x - mon_border if space_left < 0: x -= space_left self.__dx -= space_left w += space_left label.set_ellipsize(Pango.EllipsizeMode.START) else: label.set_ellipsize(Pango.EllipsizeMode.NONE) else: label.set_ellipsize(Pango.EllipsizeMode.NONE) # Don't show if the resulting tooltip would be smaller # than the visible area (if not all is on the display) if w < render_width: self.__undisplay() return False self.__view = view self.__current_renderer = renderer self.__edit_id = renderer.connect('editing-started', self.__undisplay) self.__current_path = path self.__current_col = col if self.__hide_id: GLib.source_remove(self.__hide_id) self.__hide_id = None self.set_transient_for(get_top_parent(view)) set_text(label) self.set_size_request(w, h) window = self.get_window() if self.get_visible() and window: window.move_resize(x, y, w, h) else: self.move(x, y) self.resize(w, h) self.show() return False def __undisplay(self, *args, **kwargs): if not self.__view: return send_leave = kwargs.pop("send_leave", True) # XXXXXXXX!: for overlay scrollbars the parent scrolled window # listens to notify-leave events to hide them. In case we show # the tooltip and leave the SW through the tooltip the SW will never # get an event and the scrollbar stays visible forever. # This creates a half broken leave event which is just enough # to make this work. parent = self.__view.get_parent() fake_event = None if parent and isinstance(parent, Gtk.ScrolledWindow) and send_leave: fake_event = Gdk.Event.new(Gdk.EventType.LEAVE_NOTIFY) fake_event.any.window = parent.get_window() struct = fake_event.crossing struct.time = Gtk.get_current_event_time() ok, state = Gtk.get_current_event_state() if ok: struct.state = state device = Gtk.get_current_event_device() if device is not None: struct.set_device(device) if self.__current_renderer and self.__edit_id: self.__current_renderer.disconnect(self.__edit_id) self.__current_renderer = self.__edit_id = None self.__current_path = self.__current_col = None self.__view = None def hide(fake_event): if fake_event is not None: Gtk.main_do_event(fake_event) self.__hide_id = None self.hide() return False if gtk_version < (3, 13): # https://bugzilla.gnome.org/show_bug.cgi?id=731055 # Work around Gnome Shell redraw bugs: it doesn't like # multiple hide()/show(), so we try to reduce calls to hide # by aborting it if the pointer is on a new cell shortly after. self.__hide_id = GLib.timeout_add(20, hide, fake_event) else: # mutter3.12 and gtk3.14 are a bit broken together, so it's safe # to assume we have a fixed mutter release.. hide(fake_event) def __event(self, event): if not self.__view: return True # hack: present the main window on key press if event.type == Gdk.EventType.BUTTON_PRESS: # hack: present is overridden to present all windows. # bypass to only select one Gtk.Window.present(get_top_parent(self.__view)) def translate_enter_leave_event(event): # enter/leave events have different x/y values as motion events # so it makes sense to push them to the underlying view as # additional motion events. # Warning: this may result in motion events outside of the # view window.. ? new_event = Gdk.Event.new(Gdk.EventType.MOTION_NOTIFY) struct = new_event.motion for attr in ["x", "y", "x_root", "y_root", "time", "window", "state", "send_event"]: setattr(struct, attr, getattr(event.crossing, attr)) device = Gtk.get_current_event_device() if device is not None: struct.set_device(device) return new_event # FIXME: We should translate motion events on the tooltip # to crossing events for the underlying view. # (I think, no tested) Currently the hover scrollbar stays visible # if the mouse leaves the view through the tooltip without the # knowledge of the view. type_ = event.type real_event = None if type_ == Gdk.EventType.BUTTON_PRESS: real_event = event.button elif type_ == Gdk.EventType.BUTTON_RELEASE: real_event = event.button elif type_ == Gdk.EventType.MOTION_NOTIFY: real_event = event.motion elif type_ == Gdk.EventType.ENTER_NOTIFY: event = translate_enter_leave_event(event) real_event = event.motion elif type_ == Gdk.EventType.LEAVE_NOTIFY: event = translate_enter_leave_event(event) real_event = event.motion if real_event: real_event.x += self.__dx real_event.y += self.__dy # modifying event.window is a necessary evil, made okay because # nobody else should tie to any TreeViewHints events ever. event.any.window = self.__view.get_bin_window() Gtk.main_do_event(event) return True def do_button_press_event(self, event): return self.__event(event) def do_button_release_event(self, event): return self.__event(event) def do_motion_notify_event(self, event): return self.__event(event) def do_enter_notify_event(self, event): return self.__event(event) def do_leave_notify_event(self, event): return self.__event(event) def do_scroll_event(self, event): return self.__event(event) class DragScroll(object): """A treeview mixin for smooth drag and scroll (needs BaseView). Call scroll_motion in the 'drag-motion' handler and scroll_disable in the 'drag-leave' handler. """ __scroll_delay = None __scroll_periodic = None __scroll_args = (0, 0, 0, 0) __scroll_length = 0 __scroll_last = None def __enable_scroll(self): """Start scrolling if it hasn't already""" if self.__scroll_periodic is not None or \ self.__scroll_delay is not None: return def periodic_scroll(): """Get the tree coords for 0,0 and scroll from there""" wx, wy, dist, ref = self.__scroll_args x, y = self.convert_widget_to_tree_coords(0, 0) x, y = self.convert_bin_window_to_widget_coords(x, y) # We reached an end, stop if self.__scroll_last == y: self.scroll_disable() return self.__scroll_last = y # If we went full speed for a while.. speed up # .. every number is made up here if self.__scroll_length >= 50 * ref: dist *= self.__scroll_length / (ref * 10) if self.__scroll_length < 2000 * ref: self.__scroll_length += abs(dist) try: self.scroll_to_point(-1, y + dist) except OverflowError: pass self.set_drag_dest(wx, wy) # we have to re-add the timeout.. otherwise they could add up # because scroll can last longer than 50ms GLib.source_remove(self.__scroll_periodic) self.__scroll_periodic = None enable_periodic_scroll() def enable_periodic_scroll(): self.__scroll_periodic = GLib.timeout_add(50, periodic_scroll) self.__scroll_delay = None self.__scroll_delay = GLib.timeout_add(350, enable_periodic_scroll) def scroll_disable(self): """Disable all scrolling""" if self.__scroll_periodic is not None: GLib.source_remove(self.__scroll_periodic) self.__scroll_periodic = None if self.__scroll_delay is not None: GLib.source_remove(self.__scroll_delay) self.__scroll_delay = None self.__scroll_length = 0 self.__scroll_last = None def scroll_motion(self, x, y): """Call with current widget coords during a dnd action to update scrolling speed""" visible_rect = self.get_visible_rect() if visible_rect is None: self.scroll_disable() return # I guess the bin to visible_rect difference is the header height # but this could be wrong start = self.convert_bin_window_to_widget_coords(0, 0)[1] end = visible_rect.height + start # Get the font height as size reference reference = max(self.create_pango_layout("").get_pixel_size()[1], 1) # If the drag is in the scroll area, adjust the speed scroll_offset = int(reference * 3) in_upper_scroll = (start < y < start + scroll_offset) in_lower_scroll = (y > end - scroll_offset) # thanks TI200 def accel(x): try: return int(1.1 ** (x * 12 / reference)) - (x / reference) except ValueError: return 0 if in_lower_scroll: diff = accel(y - end + scroll_offset) elif in_upper_scroll: diff = - accel(start + scroll_offset - y) else: self.scroll_disable() return # The area where we can go to full speed full_offset = int(reference * 0.8) in_upper_full = (start < y < start + full_offset) in_lower_full = (y > end - full_offset) if not in_upper_full and not in_lower_full: self.__scroll_length = 0 # For the periodic scroll function self.__scroll_args = (x, y, diff, reference) # The area to trigger a scroll is a bit smaller trigger_offset = int(reference * 2.5) in_upper_trigger = (start < y < start + trigger_offset) in_lower_trigger = (y > end - trigger_offset) if in_upper_trigger or in_lower_trigger: self.__enable_scroll() class BaseView(Gtk.TreeView): __gsignals__ = { # like the tree selection changed signal but doesn't emit twice in case # a row is activated 'selection-changed': ( GObject.SignalFlags.RUN_LAST, None, (object, )), } def __init__(self, *args, **kwargs): super(BaseView, self).__init__(*args, **kwargs) self.connect("key-press-event", self.__key_pressed) self._setup_selection_signal() def _setup_selection_signal(self): # Forwards selection changed events except in case row-activated # just happened and the selection changed event is a result of the # button release after the row-activated event. # This makes the selection change only once in case of double clicking # a row. self._sel_ignore_next = False self._sel_ignore_time = -1 def on_selection_changed(selection): if self._sel_ignore_time != Gtk.get_current_event_time(): self.emit("selection-changed", selection) self._sel_ignore_time = -1 id_ = self.get_selection().connect('changed', on_selection_changed) def on_destroy(self): self.get_selection().disconnect(id_) self.connect('destroy', on_destroy) def on_row_activated(*args): self._sel_ignore_next = True self.connect_after("row-activated", on_row_activated) def on_button_release_event(self, event): if self._sel_ignore_next: self._sel_ignore_time = Gtk.get_current_event_time() self._sel_ignore_next = False self.connect("button-release-event", on_button_release_event) def do_key_press_event(self, event): if is_accel(event, "space", "KP_Space"): return False return Gtk.TreeView.do_key_press_event(self, event) def __key_pressed(self, view, event): def get_first_selected(): selection = self.get_selection() model, paths = selection.get_selected_rows() return paths and paths[0] or None if is_accel(event, "Right") or is_accel(event, "<Primary>Right"): first = get_first_selected() if first: self.expand_row(first, False) elif is_accel(event, "Left") or is_accel(event, "<Primary>Left"): first = get_first_selected() if first: if self.row_expanded(first): self.collapse_row(first) else: # if we can't collapse, move the selection to the parent, # so that a second attempt collapses the parent model = self.get_model() parent = model.iter_parent(model.get_iter(first)) if parent: self.set_cursor(model.get_path(parent)) def remove_paths(self, paths): """Remove rows and restore the selection if it got removed""" model = self.get_model() self.remove_iters([model.get_iter(p) for p in paths]) def remove_iters(self, iters): """Remove rows and restore the selection if it got removed""" self.__remove_iters(iters) def remove_selection(self): """Remove all currently selected rows and select the position of the first removed one.""" selection = self.get_selection() mode = selection.get_mode() if mode in (Gtk.SelectionMode.SINGLE, Gtk.SelectionMode.BROWSE): model, iter_ = selection.get_selected() if iter_: self.__remove_iters([iter_], force_restore=True) elif mode == Gtk.SelectionMode.MULTIPLE: model, paths = selection.get_selected_rows() iters = list(map(model.get_iter, paths or [])) self.__remove_iters(iters, force_restore=True) def select_by_func(self, func, scroll=True, one=False): """Calls func with every Gtk.TreeModelRow in the model and selects it if func returns True. In case func never returned True, the selection will not be changed. Returns True if the selection was changed.""" model = self.get_model() if not model: return False selection = self.get_selection() first = True for row in model: if func(row): if not first: selection.select_path(row.path) continue self.set_cursor(row.path) if scroll: self.scroll_to_cell(row.path, use_align=True, row_align=0.5) first = False if one: break return not first def iter_select_by_func(self, func, scroll=True): """Selects the next row after the current selection for which func returns True, removing the selection of all other rows. func gets passed Gtk.TreeModelRow and should return True if the row should be selected. If scroll=True then scroll to the selected row if the selection changes. Returns True if the selection was changed. """ model = self.get_model() if not model: return False if not model.get_iter_first(): # empty model return False selection = self.get_selection() model, paths = selection.get_selected_rows() # get the last iter we shouldn't be looking at if not paths: last_iter = model[-1].iter else: last_iter = model.get_iter(paths[-1]) # get the first iter we should be looking at start_iter = model.iter_next(last_iter) if start_iter is None: start_iter = model.get_iter_first() row_iter = Gtk.TreeModelRowIter(model, start_iter) for row in row_iter: if not func(row): continue self.set_cursor(row.path) if scroll: self.scroll_to_cell(row.path, use_align=True, row_align=0.5) return True last_path = model.get_path(last_iter) for row in model: if row.path.compare(last_path) == 0: return False if not func(row): continue self.set_cursor(row.path) if scroll: self.scroll_to_cell(row.path, use_align=True, row_align=0.5) return True return False def set_drag_dest(self, x, y, into_only=False): """Sets a drag destination for widget coords into_only will only highlight rows or the whole widget and no lines between rows. """ dest_row = self.get_dest_row_at_pos(x, y) if dest_row is None: rows = len(self.get_model()) if not rows: (self.get_parent() or self).drag_highlight() else: self.set_drag_dest_row(Gtk.TreePath(rows - 1), Gtk.TreeViewDropPosition.AFTER) else: path, pos = dest_row if into_only: if pos == Gtk.TreeViewDropPosition.BEFORE: pos = Gtk.TreeViewDropPosition.INTO_OR_BEFORE elif pos == Gtk.TreeViewDropPosition.AFTER: pos = Gtk.TreeViewDropPosition.INTO_OR_AFTER self.set_drag_dest_row(path, pos) def __remove_iters(self, iters, force_restore=False): if not iters: return selection = self.get_selection() model = self.get_model() if force_restore: for iter_ in iters: model.remove(iter_) else: old_count = selection.count_selected_rows() for iter_ in iters: model.remove(iter_) # only restore a selection if all selected rows are gone afterwards if not old_count or selection.count_selected_rows(): return # model.remove makes the removed iter point to the next row if possible # so check if the last iter is a valid one and select it or # simply select the last row if model.iter_is_valid(iters[-1]): selection.select_iter(iters[-1]) elif len(model): selection.select_path(model[-1].path) @contextlib.contextmanager def without_model(self): """Conext manager which removes the model from the view and adds it back afterwards. Tries to preserve all state that gets reset on a model change. """ old_model = self.get_model() search_column = self.get_search_column() sorts = [column.get_sort_indicator() for column in self.get_columns()] self.set_model(None) yield old_model self.set_model(old_model) self.set_search_column(search_column) for column, value in zip(self.get_columns(), sorts): column.set_sort_indicator(value) class DragIconTreeView(BaseView): """TreeView that sets the selected rows as drag icons - Drag icons include 3 rows/2 plus a "and more" count """ def __init__(self, *args, **kwargs): super(DragIconTreeView, self).__init__(*args, **kwargs) self.connect('drag-begin', self.__begin) def __begin(self, view, drag_ctx): model, paths = view.get_selection().get_selected_rows() surface = self.create_multi_row_drag_icon(paths, max_rows=3) if surface is not None: Gtk.drag_set_icon_surface(drag_ctx, surface) def create_multi_row_drag_icon(self, paths, max_rows): """Similar to create_row_drag_icon() but creates a drag icon for multiple paths or None. The resulting surface will draw max_rows rows and point out if there are more rows selected. """ if not paths: return if len(paths) == 1: return self.create_row_drag_icon(paths[0]) # create_row_drag_icon can return None icons = [self.create_row_drag_icon(p) for p in paths[:max_rows]] icons = [i for i in icons if i is not None] if not icons: return sizes = [get_surface_extents(s) for s in icons] if None in sizes: return width = max([s[2] for s in sizes]) height = sum([s[3] for s in sizes]) # this is the border width we see in the gtk provided surface, not # much we can do besides hardcoding it here bw = 1 layout = None if len(paths) > max_rows: more = _(u"and %d more…") % (len(paths) - max_rows) more = "<i>%s</i>" % more layout = self.create_pango_layout("") layout.set_markup(more) layout.set_alignment(Pango.Alignment.CENTER) layout.set_width(Pango.SCALE * (width - 2 * bw)) lw, lh = layout.get_pixel_size() height += lh height += 6 # padding surface = icons[0].create_similar( cairo.CONTENT_COLOR_ALPHA, width, height) ctx = cairo.Context(surface) # render background style_ctx = self.get_style_context() Gtk.render_background(style_ctx, ctx, 0, 0, width, height) # render rows count_y = 0 for icon, (x, y, icon_width, icon_height) in zip(icons, sizes): ctx.save() ctx.set_source_surface(icon, -x, count_y + -y) ctx.rectangle(bw, count_y + bw, icon_width - 2 * bw, icon_height - 2 * bw) ctx.clip() ctx.paint() ctx.restore() count_y += icon_height if layout: Gtk.render_layout(style_ctx, ctx, bw, count_y, layout) # render border Gtk.render_line(style_ctx, ctx, 0, 0, 0, height - 1) Gtk.render_line(style_ctx, ctx, 0, height - 1, width - 1, height - 1) Gtk.render_line(style_ctx, ctx, width - 1, height - 1, width - 1, 0) Gtk.render_line(style_ctx, ctx, width - 1, 0, 0, 0) return surface class MultiDragTreeView(BaseView): """TreeView with multirow drag support. Button press events which would result in a row getting unselected get delayed until the next button release event. This makes it possible to drag one or more selected rows without changing the selection. """ def __init__(self, *args, **kwargs): super(MultiDragTreeView, self).__init__(*args, **kwargs) self.connect('button-press-event', self.__button_press) self.connect('button-release-event', self.__button_release) self.__pending_action = None def __button_press(self, view, event): if event.button == Gdk.BUTTON_PRIMARY: return self.__block_selection(event) def __block_selection(self, event): x, y = map(int, [event.x, event.y]) try: path, col, cellx, celly = self.get_path_at_pos(x, y) except TypeError: return True selection = self.get_selection() is_selected = selection.path_is_selected(path) mod_active = event.get_state() & ( get_primary_accel_mod() | Gdk.ModifierType.SHIFT_MASK) if is_selected: self.__pending_action = (path, col, mod_active) selection.set_select_function(lambda *args: False, None) else: self.__pending_action = None selection.set_select_function(lambda *args: True, None) def __button_release(self, view, event): if self.__pending_action: path, col, single_unselect = self.__pending_action selection = self.get_selection() selection.set_select_function(lambda *args: True, None) if single_unselect: selection.unselect_path(path) else: self.set_cursor(path, col, 0) self.__pending_action = None class RCMTreeView(BaseView): """Emits popup-menu when a row is right-clicked on.""" def __init__(self, *args, **kwargs): super(RCMTreeView, self).__init__(*args, **kwargs) self.connect('button-press-event', self.__button_press) def __button_press(self, view, event): if event.button == Gdk.BUTTON_SECONDARY: return self.__check_popup(event) def __check_popup(self, event): x, y = map(int, [event.x, event.y]) try: path, col, cellx, celly = self.get_path_at_pos(x, y) except TypeError: return True self.grab_focus() selection = self.get_selection() if not selection.path_is_selected(path): self.set_cursor(path, col, 0) else: col.focus_cell(col.get_cells()[0]) self.__position_at_mouse = True self.emit('popup-menu') return True def ensure_popup_selection(self): try: self.__position_at_mouse except AttributeError: path, col = self.get_cursor() if path is None: return False self.scroll_to_cell(path, col) # ensure current cursor path is selected, just like right-click selection = self.get_selection() if not selection.path_is_selected(path): selection.unselect_all() selection.select_path(path) return True def popup_menu(self, menu, button, time): try: del self.__position_at_mouse except AttributeError: # suppress menu if the cursor isn't on a real path if not self.ensure_popup_selection(): return False pos_func = self.__popup_position else: pos_func = None # force attach the menu to the view attached_widget = menu.get_attach_widget() if attached_widget != self: if attached_widget is not None: menu.detach() menu.attach_to_widget(self, None) menu_popup(menu, None, None, pos_func, None, button, time) return True def __popup_position(self, menu, *args): path, col = self.get_cursor() # get a rectangle describing the cell render area (assume 3 px pad) rect = self.get_cell_area(path, col) padding = 3 rect.x += padding rect.width = max(rect.width - padding * 2, 0) rect.y += padding rect.height = max(rect.height - padding * 2, 0) x, y = self.get_window().get_origin()[1:] x, y = self.convert_bin_window_to_widget_coords(x + rect.x, y + rect.y) menu.realize() ma = menu.get_allocation() menu_y = rect.height + y if self.get_direction() == Gtk.TextDirection.LTR: menu_x = x else: menu_x = x - ma.width + rect.width # on X11/win32 we can use the screen size if not is_wayland(): # fit menu to screen, aligned per text direction screen = self.get_screen() screen_width = screen.get_width() screen_height = screen.get_height() # show above row if no space below and enough above if menu_y + ma.height > screen_height and y - ma.height > 0: menu_y = y - ma.height # make sure it's not outside of the screen if self.get_direction() == Gtk.TextDirection.LTR: menu_x = max(0, min(menu_x, screen_width - ma.width)) else: menu_x = min(max(0, menu_x), screen_width) return (menu_x, menu_y, True) # x, y, move_within_screen class HintedTreeView(BaseView): """A TreeView that pops up a tooltip when you hover over a cell that contains ellipsized text.""" def __init__(self, *args, **kwargs): super(HintedTreeView, self).__init__(*args, **kwargs) if self.supports_hints(): try: tvh = HintedTreeView.hints except AttributeError: tvh = HintedTreeView.hints = TreeViewHints() tvh.connect_view(self) def set_tooltip_text(self, *args, **kwargs): print_e("Setting a tooltip on the view breaks tv hints. Set it" " on the parent scrolled window instead") return super(HintedTreeView, self).set_tooltip_text(*args, **kwargs) def supports_hints(self): """If the treeview hints support is enabled. Can be used to display scroll bars instead for example. """ if "QUODLIBET_NO_HINTS" in environ: return False return not config.state('disable_hints') class _TreeViewColumnLabel(Gtk.Label): """A label which fades into the background at the end; for use only in TreeViewColumns. The hackery with using the parents allocation is needed because the label always gets the allocation it has requested, ignoring the actual width of the column header. """ def do_draw(self, ctx): alloc = self.get_allocation() # in case there are no parents use the same alloc which should # result in no custom drawing. p1 = self.get_parent() or self p2 = p1.get_parent() or p1 p3 = p2.get_parent() or p2 p2_alloc = p2.get_allocation() p3_alloc = p3.get_allocation() # remove the space needed by the arrow and add the space # added by the padding so we only start drawing when we clip # the text directly available_width = p2_alloc.width - \ abs(p2_alloc.x - alloc.x) + (p2_alloc.x - p3_alloc.x) if alloc.width <= available_width: return Gtk.Label.do_draw(self, ctx) req_height = self.get_requisition().height w, h = alloc.width, alloc.height aw = available_width # possible when adding new columns.... create_similar will fail # in this case below, so just skip. if min(w, h) < 0: return Gtk.Label.do_draw(self, ctx) surface = ctx.get_target() # draw label to image surface label_surface = surface.create_similar(cairo.CONTENT_COLOR_ALPHA, w, h) label_ctx = cairo.Context(label_surface) res = Gtk.Label.do_draw(self, label_ctx) # create a gradient. # make the gradient width depend roughly on the font size gradient_width = min(req_height * 0.8, aw) if self.get_direction() == Gtk.TextDirection.RTL: start = (w - aw) end = start + gradient_width else: end = (aw - gradient_width) start = end + gradient_width pat = cairo.LinearGradient(start, 0, end, 0) pat.add_color_stop_rgba(0, 0, 0, 0, 0) pat.add_color_stop_rgba(gradient_width, 1, 1, 1, 1) # gradient surface grad_surface = surface.create_similar(cairo.CONTENT_COLOR_ALPHA, w, h) imgctx = cairo.Context(grad_surface) imgctx.set_source(pat) imgctx.paint() # draw label using the gradient as the alpha channel mask ctx.save() ctx.set_source_surface(label_surface) ctx.mask_surface(grad_surface) ctx.restore() return res class TreeViewColumn(Gtk.TreeViewColumn): __gsignals__ = { # tree-view-changed(old_tree_view, new_tree_view) # Triggers when the columns gets added/removed from a tree view. # The passed values are either a TreeView or None 'tree-view-changed': ( GObject.SignalFlags.RUN_LAST, None, (object, object)), } def __init__(self, **kwargs): title = kwargs.pop("title", u"") # skip overrides which don't allow to set properties GObject.Object.__init__(self, **kwargs) label = _TreeViewColumnLabel(label=title) label.set_padding(1, 1) label.show() self.set_widget(label) # the button gets created once the widget gets realized self._button = None self._tooltip_text = None label.__realize = label.connect('realize', self.__realized) def __realized(self, widget): widget.disconnect(widget.__realize) self._button = widget.get_ancestor(Gtk.Button) self.set_tooltip_text(self._tooltip_text) def on_parent_set(button, old_parent): new_parent = button.get_parent() assert new_parent is None or isinstance(new_parent, Gtk.TreeView) self.emit("tree-view-changed", old_parent, new_parent) # parent already set, emit manually on_parent_set(self._button, None) self._button.connect("parent-set", on_parent_set) def set_tooltip_text(self, text): if self._button: self._button.props.tooltip_text = text else: self._tooltip_text = text def set_use_markup(self, value): widget = self.get_widget() if isinstance(widget, Gtk.Label): widget.set_use_markup(value) class TreeViewColumnButton(TreeViewColumn): """A TreeViewColumn that forwards its header events: button-press-event and popup-menu""" __gsignals__ = { 'button-press-event': (GObject.SignalFlags.RUN_LAST, bool, (object,)), 'popup-menu': (GObject.SignalFlags.RUN_LAST, bool, ()), } def __init__(self, **kwargs): super(TreeViewColumnButton, self).__init__(**kwargs) label = self.get_widget() label.__realize = label.connect('realize', self.__connect_menu_event) def __connect_menu_event(self, widget): widget.disconnect(widget.__realize) del widget.__realize button = widget.get_ancestor(Gtk.Button) if button: button.connect('button-press-event', self.button_press_event) button.connect('popup-menu', self.popup_menu) def button_press_event(self, widget, event): return self.emit('button-press-event', event) def popup_menu(self, widget): return self.emit('popup-menu') class RCMHintedTreeView(HintedTreeView, RCMTreeView, DragIconTreeView): """A TreeView that has hints and a context menu.""" pass class AllTreeView(HintedTreeView, RCMTreeView, DragIconTreeView, MultiDragTreeView): """A TreeView that has hints, a context menu, and multi-selection dragging support.""" pass ���������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/delete.py������������������������������������������������������������0000644�0001750�0001750�00000021115�13112005742�020514� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 2013-2017 Nick Boultbee # 2013,2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """ Functions for deleting files and songs with user interaction. Only use trash_files() or trash_songs() and TrashMenuItem(). """ import os from gi.repository import Gtk from senf import fsn2text from quodlibet import _ from quodlibet import print_w from quodlibet.util import trash from quodlibet.qltk import get_top_parent from quodlibet.qltk import Icons from quodlibet.qltk.msg import ErrorMessage, WarningMessage from quodlibet.qltk.wlw import WaitLoadWindow from quodlibet.qltk.x import MenuItem, Align from quodlibet.util.i18n import numeric_phrase from quodlibet.util.path import unexpand class FileListExpander(Gtk.Expander): """A widget for showing a static list of file paths""" def __init__(self, paths): super(FileListExpander, self).__init__(label=_("Files:")) self.set_resize_toplevel(True) paths = [fsn2text(unexpand(p)) for p in paths] lab = Gtk.Label(label="\n".join(paths)) lab.set_alignment(0.0, 0.0) lab.set_selectable(True) win = Gtk.ScrolledWindow() win.add_with_viewport(Align(lab, border=6)) win.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) win.set_shadow_type(Gtk.ShadowType.ETCHED_OUT) win.set_size_request(-1, 100) self.add(win) win.show_all() class DeleteDialog(WarningMessage): RESPONSE_DELETE = 1 """"Return value of DeleteDialog.run() in case the passed files should be deleted""" @classmethod def for_songs(cls, parent, songs): """Create a delete dialog for deleting songs""" description = _("The selected songs will be removed from the " "library and their files deleted from disk.") paths = [s("~filename") for s in songs] return cls(parent, paths, description) @classmethod def for_files(cls, parent, paths): """Create a delete dialog for deleting files""" description = _("The selected files will be deleted from disk.") return cls(parent, paths, description) def __init__(self, parent, paths, description): title = numeric_phrase("Delete %(file_count)d file permanently?", "Delete %(file_count)d files permanently?", len(paths), "file_count") super(DeleteDialog, self).__init__( get_top_parent(parent), title, description, buttons=Gtk.ButtonsType.NONE) area = self.get_message_area() exp = FileListExpander(paths) exp.show() area.pack_start(exp, False, True, 0) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Delete Files"), Icons.EDIT_DELETE, self.RESPONSE_DELETE) self.set_default_response(Gtk.ResponseType.CANCEL) class TrashDialog(WarningMessage): RESPONSE_TRASH = 1 """"Return value of TrashDialog.run() in case the passed files should be moved to the trash""" @classmethod def for_songs(cls, parent, songs): """Create a trash dialog for trashing songs""" description = _("The selected songs will be removed from the " "library and their files moved to the trash.") paths = [s("~filename") for s in songs] return cls(parent, paths, description) @classmethod def for_files(cls, parent, paths): """Create a trash dialog for trashing files""" description = _("The selected files will be moved to the trash.") return cls(parent, paths, description) def __init__(self, parent, paths, description): title = numeric_phrase("Move %(file_count)d file to the trash?", "Move %(file_count)d files to the trash?", len(paths), "file_count") super(TrashDialog, self).__init__( get_top_parent(parent), title, description, buttons=Gtk.ButtonsType.NONE) area = self.get_message_area() exp = FileListExpander(paths) exp.show() area.pack_start(exp, False, True, 0) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Move to Trash"), Icons.USER_TRASH, self.RESPONSE_TRASH) self.set_default_response(Gtk.ResponseType.CANCEL) def TrashMenuItem(): if trash.use_trash(): return MenuItem(_("_Move to Trash"), Icons.USER_TRASH) else: return MenuItem(_("_Delete"), Icons.EDIT_DELETE) def _do_trash_songs(parent, songs, librarian): dialog = TrashDialog.for_songs(parent, songs) resp = dialog.run() if resp != TrashDialog.RESPONSE_TRASH: return window_title = _("Moving %(current)d/%(total)d.") w = WaitLoadWindow(parent, len(songs), window_title) w.show() ok = [] failed = [] for song in songs: filename = song("~filename") try: trash.trash(filename) except trash.TrashError as e: print_w("Couldn't trash file (%s)" % e) failed.append(song) else: ok.append(song) w.step() w.destroy() if failed: ErrorMessage(parent, _("Unable to move to trash"), _("Moving one or more files to the trash failed.") ).run() if ok: librarian.remove(ok) def _do_trash_files(parent, paths): dialog = TrashDialog.for_files(parent, paths) resp = dialog.run() if resp != TrashDialog.RESPONSE_TRASH: return window_title = _("Moving %(current)d/%(total)d.") w = WaitLoadWindow(parent, len(paths), window_title) w.show() ok = [] failed = [] for path in paths: try: trash.trash(path) except trash.TrashError: failed.append(path) else: ok.append(path) w.step() w.destroy() if failed: ErrorMessage(parent, _("Unable to move to trash"), _("Moving one or more files to the trash failed.") ).run() def _do_delete_songs(parent, songs, librarian): dialog = DeleteDialog.for_songs(parent, songs) resp = dialog.run() if resp != DeleteDialog.RESPONSE_DELETE: return window_title = _("Deleting %(current)d/%(total)d.") w = WaitLoadWindow(parent, len(songs), window_title) w.show() ok = [] failed = [] for song in songs: filename = song("~filename") try: os.unlink(filename) except EnvironmentError: failed.append(song) else: ok.append(song) w.step() w.destroy() if failed: ErrorMessage(parent, _("Unable to delete files"), _("Deleting one or more files failed.") ).run() if ok: librarian.remove(ok) def _do_delete_files(parent, paths): dialog = DeleteDialog.for_files(parent, paths) resp = dialog.run() if resp != DeleteDialog.RESPONSE_DELETE: return window_title = _("Deleting %(current)d/%(total)d.") w = WaitLoadWindow(parent, len(paths), window_title) w.show() ok = [] failed = [] for path in paths: try: os.unlink(path) except EnvironmentError: failed.append(path) else: ok.append(path) w.step() w.destroy() if failed: ErrorMessage(parent, _("Unable to delete files"), _("Deleting one or more files failed.") ).run() def trash_files(parent, paths): """Will try to move the files to the trash, or if not possible, delete them permanently. Will ask for confirmation in each case. """ if not paths: return # depends on the platform if we can if trash.use_trash(): _do_trash_files(parent, paths) else: _do_delete_files(parent, paths) def trash_songs(parent, songs, librarian): """Will try to move the files associated with the songs to the trash, or if not possible, delete them permanently. Will ask for confirmation in each case. The deleted songs will be removed from the librarian. """ if not songs: return # depends on the platform if we can if trash.use_trash(): _do_trash_songs(parent, songs, librarian) else: _do_delete_songs(parent, songs, librarian) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/_editutils.py��������������������������������������������������������0000644�0001750�0001750�00000014214�13112005742�021421� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2006 Joe Wreschnig, Michael Urman, Iñigo Serna # 2014 Nick Boultbee # 2017 Fredrik Strupe # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GObject from senf import fsn2text from quodlibet import config from quodlibet import util from quodlibet import _ from quodlibet.plugins import PluginHandler from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.qltk.msg import WarningMessage, ErrorMessage from quodlibet.qltk import Icons from quodlibet.util import connect_obj class OverwriteWarning(WarningMessage): RESPONSE_SAVE = 1 def __init__(self, parent, song): title = _("Tag may not be accurate") fn_format = "<b>%s</b>" % util.escape(fsn2text(song("~basename"))) description = _("%(file-name)s changed while the program was running. " "Saving without refreshing your library may " "overwrite other changes to the song.") % {"file-name": fn_format} super(OverwriteWarning, self).__init__( parent, title, description, buttons=Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Save"), Icons.DOCUMENT_SAVE, self.RESPONSE_SAVE) self.set_default_response(Gtk.ResponseType.CANCEL) class WriteFailedError(ErrorMessage): def __init__(self, parent, song): title = _("Unable to save song") fn_format = "<b>%s</b>" % util.escape(fsn2text(song("~basename"))) description = _("Saving %(file-name)s failed. The file may be " "read-only, corrupted, or you do not have " "permission to edit it.") % {"file-name": fn_format} super(WriteFailedError, self).__init__( parent, title, description) class EditingPluginHandler(GObject.GObject, PluginHandler): __gsignals__ = { "changed": (GObject.SignalFlags.RUN_LAST, None, ()) } Kind = None def __init__(self): super(EditingPluginHandler, self).__init__() self.__plugins = [] @property def plugins(self): return list(self.__plugins) def plugin_handle(self, plugin): return issubclass(plugin.cls, self.Kind) def plugin_enable(self, plugin): self.__plugins.append(plugin.cls) self.changed() def plugin_disable(self, plugin): self.__plugins.remove(plugin.cls) self.changed() def changed(self): self.emit("changed") class FilterCheckButton(ConfigCheckButton): __gsignals__ = { "preview": (GObject.SignalFlags.RUN_LAST, None, ()) } def __init__(self): super(FilterCheckButton, self).__init__( self._label, self._section, self._key) try: self.set_active(config.getboolean(self._section, self._key)) except: pass connect_obj(self, 'toggled', self.emit, 'preview') @property def active(self): return self.get_active() def filter(self, original, filename): raise NotImplementedError def filter_list(self, origs, names): return list(map(self.filter, origs, names)) def __lt__(self, other): return (self._order, type(self).__name__) < \ (other._order, type(other).__name__) class FilterPluginBox(Gtk.VBox): __gsignals__ = { # the list should be updated "changed": (GObject.SignalFlags.RUN_LAST, None, ()), # the preview button should be made sensitive "preview": (GObject.SignalFlags.RUN_LAST, None, ()), } def __init__(self, plugin_handler, filter_types=None): super(FilterPluginBox, self).__init__() # static filters if filter_types is None: filter_types = [] filters = [Kind() for Kind in filter_types] filters.sort() for f in filters: self.pack_start(f, True, True, 0) self.__filters = filters # plugins self.__plugins = [] hb = Gtk.HBox() expander = Gtk.Expander(label=_(u"_More options…")) expander.set_use_underline(True) hb.pack_start(expander, True, True, 0) self.pack_start(hb, False, True, 0) for filt in filters: filt.connect('preview', lambda *x: self.emit("preview")) vbox = Gtk.VBox() expander.add(vbox) plugin_handler.connect( "changed", self.__refresh_plugins, vbox, expander) expander.connect("notify::expanded", self.__notify_expanded, vbox) expander.set_expanded(False) for child in self.get_children(): child.show() plugin_handler.changed() def __notify_expanded(self, expander, event, vbox): vbox.set_property('visible', expander.get_property('expanded')) def __refresh_plugins(self, handler, vbox, expander): instances = [] for Kind in handler.plugins: try: f = Kind() except: util.print_exc() continue else: instances.append(f) instances.sort() for child in vbox.get_children(): child.destroy() del self.__plugins[:] for f in instances: try: vbox.pack_start(f, True, True, 0) except: util.print_exc() f.destroy() continue try: f.connect('preview', lambda *x: self.emit('preview')) except: try: f.connect('changed', lambda *x: self.emit('changed')) except: util.print_exc() continue self.__plugins.append(f) vbox.show_all() # Don't display the expander if there aren't any plugins. if not self.__plugins: expander.set_expanded(False) expander.hide() else: expander.show() @property def filters(self): return self.__filters + self.__plugins ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/songsmenu.py���������������������������������������������������������0000644�0001750�0001750�00000037155�13114753475�021322� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2013-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet.compat import listvalues from quodlibet.qltk.pluginwin import PluginWindow from quodlibet import ngettext, _ from quodlibet import qltk from quodlibet.util import print_exc, print_e, print_w from quodlibet.qltk.msg import WarningMessage from quodlibet.qltk.delete import TrashMenuItem, trash_songs from quodlibet.qltk.information import Information from quodlibet.qltk.properties import SongProperties from quodlibet.qltk.x import SeparatorMenuItem from quodlibet.qltk.ratingsmenu import RatingsMenuItem from quodlibet.qltk import get_top_parent, get_menu_item_top_parent, Icons from quodlibet.plugins import PluginManager, PluginHandler from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.util.songwrapper import ListWrapper, check_wrapper_changed class ConfirmMultiSongInvoke(WarningMessage): """Dialog to confirm invoking a plugin with X songs in case X is high""" RESPONSE_INVOKE = 1 def __init__(self, parent, plugin_name, count): title = ngettext("Run the plugin \"%(name)s\" on %(count)d song?", "Run the plugin \"%(name)s\" on %(count)d songs?", count) % {"name": plugin_name, "count": count} super(ConfirmMultiSongInvoke, self).__init__( get_top_parent(parent), title, "", buttons=Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Run Plugin"), Icons.SYSTEM_RUN, self.RESPONSE_INVOKE) self.set_default_response(Gtk.ResponseType.CANCEL) @classmethod def confirm(cls, parent, plugin_name, count): """Returns if the action was confirmed""" resp = cls(parent, plugin_name, count).run() return resp == cls.RESPONSE_INVOKE class ConfirmMultiAlbumInvoke(WarningMessage): """Dialog to confirm invoking a plugin with X albums in case X is high""" RESPONSE_INVOKE = 1 def __init__(self, parent, plugin_name, count): title = ngettext("Run the plugin \"%(name)s\" on %(count)d album?", "Run the plugin \"%(name)s\" on %(count)d albums?", count) % {'name': plugin_name, 'count': count} super(ConfirmMultiAlbumInvoke, self).__init__( get_top_parent(parent), title, "", buttons=Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Run Plugin"), Icons.SYSTEM_RUN, self.RESPONSE_INVOKE) self.set_default_response(Gtk.ResponseType.CANCEL) @classmethod def confirm(cls, parent, plugin_name, count): """Returns if the action was confirmed""" resp = cls(parent, plugin_name, count).run() return resp == cls.RESPONSE_INVOKE class SongsMenuPluginHandler(PluginHandler): def __init__(self, song_confirmer=None, album_confirmer=None): """custom confirmers for testing""" self.__plugins = [] self._confirm_multiple_songs = ConfirmMultiSongInvoke.confirm if song_confirmer is not None: self._confirm_multiple_songs = song_confirmer self._confirm_multiple_albums = ConfirmMultiAlbumInvoke.confirm if album_confirmer is not None: self._confirm_multiple_albums = album_confirmer def Menu(self, library, songs): songs = ListWrapper(songs) attrs = ['plugin_song', 'plugin_songs', 'plugin_album', 'plugin_albums'] if len(songs) == 1: attrs.append('plugin_single_song') last = (songs and songs[-1]) or None for song in songs: if song.album_key != last.album_key: break last = song else: attrs.append('plugin_single_album') items = [] kinds = self.__plugins kinds.sort(key=lambda plugin: plugin.PLUGIN_ID) for Kind in kinds: usable = any(callable(getattr(Kind, s)) for s in attrs) if usable: try: items.append(Kind(songs, library)) except: print_e("Couldn't initialise song plugin %s. Stack trace:" % Kind) print_exc() items = [i for i in items if i.initialized] if items: menu = Gtk.Menu() for item in items: try: menu.append(item) args = (library, songs) if item.get_submenu(): for subitem in item.get_submenu().get_children(): subitem.connect( 'activate', self.__on_activate, item, *args) else: item.connect( 'activate', self.__on_activate, item, *args) except: print_exc() item.destroy() menu.append(SeparatorMenuItem()) prefs = Gtk.MenuItem(label=_("Configure Plugins…")) prefs.connect("activate", lambda _: PluginWindow().show()) menu.append(prefs) else: menu = None return menu def __get_albums(self, songs): albums = {} for song in songs: key = song.album_key if key not in albums: albums[key] = [] albums[key].append(song) albums = listvalues(albums) for album in albums: album.sort() return albums def handle(self, plugin_id, library, parent, songs): """Start a song menu plugin directly without a menu""" parent = get_top_parent(parent) for plugin in self.__plugins: if plugin.PLUGIN_ID == plugin_id: songs = ListWrapper(songs) try: plugin = plugin(songs, library) except Exception: print_exc() else: self.__handle(plugin, plugin, library, songs, parent) return def __on_activate(self, item, plugin, library, songs): parent = get_menu_item_top_parent(item) self.__handle(item, plugin, library, songs, parent) def __handle(self, item, plugin, library, songs, parent): if len(songs) == 0: return try: if len(songs) == 1 and callable(plugin.plugin_single_song): try: ret = plugin.plugin_single_song(songs[0]) except Exception: print_exc() else: if ret: return if callable(plugin.plugin_song): total = len(songs) if total > plugin.MAX_INVOCATIONS: if not self._confirm_multiple_songs( parent, plugin.PLUGIN_NAME, total): return try: ret = map(plugin.plugin_song, songs) except Exception: print_exc() else: if any(ret): return if callable(plugin.plugin_songs): try: ret = plugin.plugin_songs(songs) except Exception: print_exc() else: if ret: return if plugin.handles_albums: albums = self.__get_albums(songs) total = len(albums) if total > plugin.MAX_INVOCATIONS: if not self._confirm_multiple_albums( parent, plugin.PLUGIN_NAME, total): return if callable(plugin.plugin_single_album) and len(albums) == 1: try: ret = plugin.plugin_single_album(albums[0]) except Exception: print_exc() else: if ret: return if callable(plugin.plugin_album): try: ret = map(plugin.plugin_album, albums) except Exception: print_exc() else: if any(ret): return if callable(plugin.plugin_albums): try: ret = plugin.plugin_albums(albums) except Exception: print_exc() else: if ret: return finally: check_wrapper_changed(library, parent, filter(None, songs)) def plugin_handle(self, plugin): return issubclass(plugin.cls, SongsMenuPlugin) def plugin_enable(self, plugin): self.__plugins.append(plugin.cls) def plugin_disable(self, plugin): self.__plugins.remove(plugin.cls) class SongsMenu(Gtk.Menu): plugins = SongsMenuPluginHandler() @classmethod def init_plugins(cls): PluginManager.instance.register_handler(cls.plugins) def __init__(self, library, songs, plugins=True, playlists=True, queue=True, devices=True, remove=True, delete=False, edit=True, ratings=True, items=None, accels=True): super(SongsMenu, self).__init__() # The library may actually be a librarian; if it is, use it, # otherwise find the real librarian. librarian = getattr(library, 'librarian', library) if ratings: ratings_item = RatingsMenuItem(songs, librarian) ratings_item.set_sensitive(bool(songs)) self.append(ratings_item) self.separate() # external item groups for subitems in reversed(items or []): self.separate() for item in subitems: self.append(item) self.separate() if plugins: submenu = self.plugins.Menu(librarian, songs) if submenu is not None: b = qltk.MenuItem(_("_Plugins"), Icons.SYSTEM_RUN) b.set_sensitive(bool(songs)) self.append(b) b.set_submenu(submenu) self.append(SeparatorMenuItem()) in_lib = True can_add = True is_file = True for song in songs: if song not in library: in_lib = False if not song.can_add: can_add = False if not song.is_file: is_file = False if playlists: # Needed here to avoid a circular import; most browsers use # a SongsMenu, but SongsMenu needs access to the playlist # browser for this item. # FIXME: Two things are now importing browsers, so we need # some kind of inversion of control here. from quodlibet.browsers.playlists.menu import PlaylistMenu from quodlibet.browsers.playlists import PlaylistsBrowser try: submenu = PlaylistMenu(songs, PlaylistsBrowser.playlists()) def on_new(widget, playlist): PlaylistsBrowser.changed(playlist) submenu.connect('new', on_new) except AttributeError as e: print_w("Couldn't get Playlists menu: %s" % e) else: b = qltk.MenuItem(_("Play_lists"), Icons.FOLDER_DRAG_ACCEPT) b.set_sensitive(can_add and bool(songs)) b.set_submenu(submenu) self.append(b) if queue: b = qltk.MenuItem(_("Add to _Queue"), Icons.LIST_ADD) def enqueue_cb(item, songs): songs = [s for s in songs if s.can_add] if songs: from quodlibet import app app.window.playlist.enqueue(songs) b.connect('activate', enqueue_cb, songs) if accels: qltk.add_fake_accel(b, "<Primary>Return") self.append(b) b.set_sensitive(can_add and bool(songs)) if devices: from quodlibet import browsers try: browsers.media except AttributeError: pass else: if browsers.media.MediaDevices in browsers.browsers: submenu = browsers.media.Menu(songs, library) b = qltk.MenuItem(_("_Copy to Device"), Icons.MULTIMEDIA_PLAYER) if can_add and len(submenu) > 0 and bool(songs): b.set_sensitive(True) b.set_submenu(submenu) self.append(b) if remove or delete: self.separate() if remove: b = qltk.MenuItem(_("_Remove from Library"), Icons.LIST_REMOVE) if callable(remove): b.connect('activate', lambda item: remove(songs)) else: def remove_cb(item, songs, library): library.remove(set(songs)) b.connect('activate', remove_cb, songs, library) b.set_sensitive(in_lib and bool(songs)) self.append(b) if delete: if callable(delete): b = qltk.MenuItem(_("_Delete"), Icons.EDIT_DELETE) b.connect('activate', lambda item: delete(songs)) if accels: qltk.add_fake_accel(b, "<Primary>Delete") else: b = TrashMenuItem() if accels: qltk.add_fake_accel(b, "<Primary>Delete") def trash_cb(item): parent = get_menu_item_top_parent(item) trash_songs(parent, songs, librarian) b.connect('activate', trash_cb) b.set_sensitive(is_file and bool(songs)) self.append(b) if edit: self.separate() b = qltk.MenuItem(_("Edit _Tags"), Icons.EDIT) b.set_sensitive(bool(songs)) if accels: qltk.add_fake_accel(b, "<alt>Return") def song_properties_cb(menu_item): parent = get_menu_item_top_parent(menu_item) window = SongProperties(librarian, songs, parent) window.show() b.connect('activate', song_properties_cb) self.append(b) b = qltk.MenuItem(_("_Information"), Icons.DIALOG_INFORMATION) b.set_sensitive(bool(songs)) if accels: qltk.add_fake_accel(b, "<Primary>I") def information_cb(menu_item): parent = get_menu_item_top_parent(menu_item) window = Information(librarian, songs, parent) window.show() b.connect('activate', information_cb) self.append(b) def selection_done_cb(menu): menu.destroy() self.connect('selection-done', selection_done_cb) def separate(self): if not self.get_children(): return elif not isinstance(self.get_children()[-1], Gtk.SeparatorMenuItem): self.append(SeparatorMenuItem()) def preseparate(self): if not self.get_children(): return elif not isinstance(self.get_children()[0], Gtk.SeparatorMenuItem): self.prepend(SeparatorMenuItem()) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/ratingsmenu.py�������������������������������������������������������0000644�0001750�0001750�00000010567�13112005742�021617� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011-2016 Nick Boultbee # 2005 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import _ from quodlibet import util from quodlibet import config from quodlibet import qltk from quodlibet.config import RATINGS from quodlibet.qltk import Icons from quodlibet.qltk import SeparatorMenuItem class ConfirmRateMultipleDialog(qltk.Message): def __init__(self, parent, action_title, count, value): assert count > 1 title = (_("Are you sure you want to change the " "rating of all %d songs?") % count) desc = (_("The saved ratings will be removed") if value is None else _("The rating of all selected songs will be changed to " "'%s'") % util.format_rating(value)) super(ConfirmRateMultipleDialog, self).__init__( Gtk.MessageType.WARNING, parent, title, desc, Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_button(action_title, Gtk.ResponseType.YES) class RatingsMenuItem(Gtk.ImageMenuItem): def __init__(self, songs, library, label=_("_Rating")): super(RatingsMenuItem, self).__init__(label=label, use_underline=True) self._songs = songs image = Gtk.Image.new_from_icon_name(Icons.FAVORITE, Gtk.IconSize.MENU) image.show() self.set_image(image) submenu = Gtk.Menu() self.set_submenu(submenu) self._rating_menu_items = [] for i in RATINGS.all: text = "%0.2f\t%s" % (i, util.format_rating(i)) itm = Gtk.CheckMenuItem(label=text) itm.rating = i submenu.append(itm) handler = itm.connect( 'toggled', self._on_rating_change, i, library) self._rating_menu_items.append((itm, handler)) reset = Gtk.MenuItem(label=_("_Remove Rating"), use_underline=True) reset.connect('activate', self._on_rating_remove, library) self._select_ratings() submenu.append(SeparatorMenuItem()) submenu.append(reset) submenu.show_all() def set_songs(self, songs): """Set a new set of songs affected by the rating menu""" self._songs = songs self._select_ratings() def _select_ratings(self): ratings = [song("~#rating") for song in self._songs if song and song.has_rating] song_count = len(self._songs) for (menu_item, handler) in self._rating_menu_items: rating_val = menu_item.rating rated_count = ratings.count(rating_val) menu_item.handler_block(handler) if rated_count == 0: menu_item.set_active(False) elif rated_count == song_count: menu_item.set_active(True) else: menu_item.set_inconsistent(True) menu_item.handler_unblock(handler) def _on_rating_change(self, menuitem, value, library): self.set_rating(value, self._songs, library) def _on_rating_remove(self, menutitem, library): self.remove_rating(self._songs, library) def set_rating(self, value, songs, librarian): count = len(songs) if (count > 1 and config.getboolean("browsers", "rating_confirm_multiple")): parent = qltk.get_menu_item_top_parent(self) dialog = ConfirmRateMultipleDialog( parent, _("Change _Rating"), count, value) if dialog.run() != Gtk.ResponseType.YES: return for song in songs: song["~#rating"] = value librarian.changed(songs) def remove_rating(self, songs, librarian): count = len(songs) if (count > 1 and config.getboolean("browsers", "rating_confirm_multiple")): parent = qltk.get_menu_item_top_parent(self) dialog = ConfirmRateMultipleDialog( parent, _("_Remove Rating"), count, None) if dialog.run() != Gtk.ResponseType.YES: return reset = [] for song in songs: if "~#rating" in song: del song["~#rating"] reset.append(song) librarian.changed(reset) �����������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/wlw.py���������������������������������������������������������������0000644�0001750�0001750�00000020665�13112005742�020074� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import math import time from gi.repository import Gtk, Pango, Gdk from quodlibet import _ from quodlibet.qltk import get_top_parent, Icons, Button, ToggleButton from quodlibet.util import format_int_locale, format_time_display from quodlibet.compat import iteritems class WaitLoadBase(object): """Abstract class providing a label, a progressbar, pause/stop buttons, and the stepping logic.""" def __init__(self, count=0, text="", initial={}, limit=3): """count: the total amount of items expected, 0 for unknown/indefinite text: text to display in the label; may contain % formats initial: initial values for % formats (text % initial) limit: count must be greater than limit (or 0) for pause/stop to appear The current iteration of the counter can be gotten as self.current. count can be gotten as self.count. """ super(WaitLoadBase, self).__init__() self._label = Gtk.Label() self._label.set_use_markup(True) self._progress = Gtk.ProgressBar() self._progress.set_pulse_step(0.08) self.pulse = self._progress.pulse self.set_fraction = self._progress.set_fraction self.set_text = self._label.set_markup self.setup(count, text, initial) if self.count > limit or self.count == 0: # Add stop/pause buttons. count = 0 means an indefinite # number of steps. self._cancel_button = Button(_("_Stop"), Icons.PROCESS_STOP) self._pause_button = ToggleButton(_("P_ause"), Icons.MEDIA_PLAYBACK_PAUSE) self._cancel_button.connect('clicked', self.__cancel_clicked) self._pause_button.connect('clicked', self.__pause_clicked) else: self._cancel_button = None self._pause_button = None def setup(self, count=0, text="", initial=None): self.current = 0 self.count = count self._text = text self.paused = False self.quit = False self._start_time = time.time() initial = initial or {} initial.setdefault("total", self.count) initial.setdefault("current", self.current) initial.setdefault("remaining", _("Unknown")) def localeify(k, v): foo = '%(' + k + ')d' if foo in self._text: self._text = self._text.replace(foo, '%(' + k + ')s') return k, format_int_locale(int(v)) return k, v localed = dict([localeify(k, v) for k, v in iteritems(initial)]) self._label.set_markup(self._text % localed) self._progress.set_fraction(0.0) def __pause_clicked(self, button): self.paused = button.get_active() def __cancel_clicked(self, button): self.quit = True def step(self, **values): """Advance the counter by one. Arguments are applied to the originally-supplied text as a format string. This function doesn't return if the dialog is paused (though the GTK main loop will still run), and returns True if stop was pressed. """ if self.count: self.current += 1 self._progress.set_fraction( max(0, min(1, self.current / float(self.count)))) else: self._progress.pulse() values.setdefault("total", format_int_locale(self.count)) values.setdefault("current", format_int_locale(self.current)) if self.count: t = (time.time() - self._start_time) / self.current remaining = math.ceil((self.count - self.current) * t) values.setdefault("remaining", format_time_display(remaining)) self._label.set_markup(self._text % values) while not self.quit and (self.paused or Gtk.events_pending()): Gtk.main_iteration() return self.quit class WaitLoadWindow(WaitLoadBase, Gtk.Window): """A window with a progress bar and some nice updating text, as well as pause/stop buttons. Example: w = WaitLoadWindow(None, 5, "%(current)d/%(total)d") for i in range(1, 6): w.step() w.destroy() """ def __init__(self, parent, *args): """parent: the parent window, or None""" Gtk.Window.__init__(self, type=Gtk.WindowType.TOPLEVEL) self.set_decorated(False) WaitLoadBase.__init__(self) self.setup(*args) parent = get_top_parent(parent) if parent: sig = parent.connect('configure-event', self.__recenter) self.connect('destroy', self.__reset_cursor, parent) self.connect('destroy', self.__disconnect, sig, parent) sig_vis = parent.connect( 'visibility-notify-event', self.__update_visible) self.connect('destroy', self.__disconnect, sig_vis, parent) self.set_transient_for(parent) window = parent.get_window() if window: window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) self.set_modal(True) self.add(Gtk.Frame()) self.get_child().set_shadow_type(Gtk.ShadowType.OUT) vbox = Gtk.VBox(spacing=12) vbox.set_border_width(12) self._label.set_size_request(170, -1) self._label.set_line_wrap(True) self._label.set_justify(Gtk.Justification.CENTER) vbox.pack_start(self._label, True, True, 0) vbox.pack_start(self._progress, True, True, 0) if self._cancel_button and self._pause_button: # Display a stop/pause box. count = 0 means an indefinite # number of steps. hbox = Gtk.HBox(spacing=6, homogeneous=True) hbox.pack_start(self._cancel_button, True, True, 0) hbox.pack_start(self._pause_button, True, True, 0) vbox.pack_start(hbox, True, True, 0) self.get_child().add(vbox) self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.get_child().show_all() while Gtk.events_pending(): Gtk.main_iteration() def __update_visible(self, parent, event): if event.state == Gdk.VisibilityState.FULLY_OBSCURED: self.hide() else: self.show() def __recenter(self, parent, event): x, y = parent.get_position() dx, dy = parent.get_size() dx2, dy2 = self.get_size() self.move(x + dx // 2 - dx2 // 2, y + dy // 2 - dy2 // 2) def __disconnect(self, widget, sig, parent): parent.disconnect(sig) def __reset_cursor(self, widget, parent): if parent.get_window(): parent.get_window().set_cursor(None) class WritingWindow(WaitLoadWindow): """A WaitLoadWindow that defaults to text suitable for saving files.""" def __init__(self, parent, count): super(WritingWindow, self).__init__( parent, count, (_("Saving the songs you changed.") + "\n\n" + _("%(current)d/%(total)d songs saved\n(%(remaining)s remaining)") )) def step(self): return super(WritingWindow, self).step() class WaitLoadBar(WaitLoadBase, Gtk.HBox): def __init__(self): super(WaitLoadBar, self).__init__() self._label.set_alignment(0.0, 0.5) self._label.set_ellipsize(Pango.EllipsizeMode.END) self._cancel_button.remove(self._cancel_button.get_child()) self._cancel_button.add(Gtk.Image.new_from_icon_name( Icons.PROCESS_STOP, Gtk.IconSize.MENU)) self._pause_button.remove(self._pause_button.get_child()) self._pause_button.add(Gtk.Image.new_from_icon_name( Icons.MEDIA_PLAYBACK_PAUSE, Gtk.IconSize.MENU)) self.pack_start(self._label, True, True, 0) self.pack_start(self._progress, False, True, 6) self.pack_start(self._pause_button, False, True, 0) self.pack_start(self._cancel_button, False, True, 0) for child in self.get_children(): child.show_all() def step(self, **values): ret = super(WaitLoadBar, self).step(**values) params = {"current": format_int_locale(self.current), "all": format_int_locale(self.count)} self._progress.set_text(_("%(current)s of %(all)s") % params) return ret ���������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/information.py�������������������������������������������������������0000644�0001750�0001750�00000055244�13112005742�021611� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import time from collections import defaultdict from gi.repository import Gtk, Pango from quodlibet.formats import PEOPLE from senf import fsn2text from quodlibet import ngettext, _ from quodlibet import qltk from quodlibet import util from quodlibet import app from quodlibet.qltk.bookmarks import EditBookmarksPane from quodlibet.qltk.cover import CoverImage from quodlibet.qltk.lyrics import LyricsPane from quodlibet.qltk.window import Window, PersistentWindowMixin from quodlibet.qltk.x import Align from quodlibet.util import tag, connect_destroy from quodlibet.util.i18n import numeric_phrase from quodlibet.util.tags import readable from quodlibet.util.path import filesize, unexpand from quodlibet.compat import text_type def Label(label=None, markup=None, ellipsize=False): if markup: l = Gtk.Label() l.set_markup(markup) else: l = Gtk.Label(label=label) l.set_selectable(True) l.set_alignment(0, 0) if ellipsize: l.set_ellipsize(Pango.EllipsizeMode.END) return l class TitleLabel(Gtk.Label): def __init__(self, text, is_markup=False): super(TitleLabel, self).__init__() self.set_ellipsize(Pango.EllipsizeMode.END) markup = text if is_markup else ("<i>%s</i>" % util.escape(text)) text = "<span size='xx-large'>%s</span>" % markup self.set_markup(text) class ReactiveCoverImage(CoverImage): def __init__(self, resize=False, size=125, song=None, tooltip=None): super(ReactiveCoverImage, self).__init__(resize, size, song) self.set_property('no-show-all', True) def show_cover(cover, success): if success: cover.show() cover.disconnect(signal_id) signal_id = self.connect('cover-visible', show_cover) self.set_song(song) if tooltip: self.get_child().set_tooltip_text(tooltip) def Frame(name, widget): def hx(value): return hex(int(value * 255))[2:] f = Gtk.Frame() qltk.add_css(f, '* {opacity: 0.9}') l = Gtk.Label() l.set_markup(util.escape(name)) qltk.add_css(l, " * {opacity: 0.6; padding: 0px 2px;}") f.set_label_widget(l) a = Align(top=6, left=12, bottom=6, right=6) f.add(a) a.add(widget) return f def Table(rows): t = Gtk.Table(n_rows=rows, n_columns=2) t.set_col_spacings(6) t.set_row_spacings(6) t.set_homogeneous(False) return t def SW(): swin = Gtk.ScrolledWindow() swin.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) return swin class NoSongs(Gtk.Label): def __init__(self): super(NoSongs, self).__init__(label=_("No songs are selected.")) self.title = _("No Songs") class OneSong(qltk.Notebook): def __init__(self, library, song, lyrics=True, bookmarks=True): super(OneSong, self).__init__() vbox = Gtk.VBox(spacing=12) vbox.set_border_width(12) self._title(song, vbox) self._album(song, vbox) self._people(song, vbox) self._library(song, vbox) self._file(song, vbox) self._additional(song, vbox) sw = SW() sw.title = _("Information") sw.add_with_viewport(vbox) self.append_page(sw) if lyrics: lyrics = LyricsPane(song) lyrics.title = _("Lyrics") self.append_page(lyrics) if bookmarks: bookmarks = EditBookmarksPane(None, song) bookmarks.title = _("Bookmarks") bookmarks.set_border_width(12) self.append_page(bookmarks) connect_destroy(library, 'changed', self.__check_changed, vbox, song) def __check_changed(self, library, songs, vbox, song): if song in songs: for c in vbox.get_children(): vbox.remove(c) c.destroy() self._title(song, vbox) self._album(song, vbox) self._people(song, vbox) self._library(song, vbox) self._file(song, vbox) self._additional(song, vbox) parent = qltk.get_top_parent(self) if parent: parent.set_title(self.title + " - Quod Libet") vbox.show_all() def _title(self, song, box): text = song.comma("title") if "version" in song: text += "\n" + util.escape(song.comma("version")) box.pack_start(TitleLabel(text), False, False, 0) self.title = song.comma("title") def _album(self, song, box): if "album" not in song: return text = ["<span size='x-large'><i>%s</i></span>" % util.escape(song.comma("album"))] secondary = [] if "discnumber" in song: secondary.append(_("Disc %s") % song["discnumber"]) if "discsubtitle" in song: secondary.append("<i>%s</i>" % util.escape(song.comma("discsubtitle"))) if "tracknumber" in song: secondary.append(_("Track %s") % song["tracknumber"]) if secondary: text.append(" - ".join(secondary)) if "date" in song: text.append(util.escape(song.comma("date"))) if "organization" in song or "labelid" in song: t = util.escape(song.comma("~organization~labelid")) text.append(t) if "producer" in song: text.append(_("Produced by %s") % ( util.escape(song.comma("producer")))) w = Label(markup="\n".join(text), ellipsize=True) hb = Gtk.HBox(spacing=12) hb.pack_start(w, True, True, 0) box.pack_start(Frame(tag("album"), hb), False, False, 0) cover = ReactiveCoverImage(song=song) hb.pack_start(cover, False, True, 0) def _people(self, song, box): data = [] if "artist" in song: title = (_("artist") if len(song.list("artist")) == 1 else _("artists")) title = util.capitalize(title) data.append((title, song["artist"])) for tag_ in ["performer", "lyricist", "arranger", "composer", "conductor", "author"]: if tag_ in song: name = (tag(tag_) if len(song.list(tag_)) == 1 else readable(tag_, plural=True)) data.append((name, song[tag_])) performers = defaultdict(list) for tag_ in song: if "performer:" in tag_: for person in song.list(tag_): role = util.title(tag_.split(':', 1)[1]) performers[role].append(person) if performers: text = '\n'.join("%s (%s)" % (', '.join(names), part) for part, names in performers.iteritems()) name = (tag("performer") if len(performers) == 1 else _("performers")) data.append((name, text)) table = Table(len(data)) for i, (key, text) in enumerate(data): key = util.capitalize(util.escape(key) + ":") table.attach(Label(markup=key), 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL) label = Label(text, ellipsize=True) table.attach(label, 1, 2, i, i + 1) box.pack_start(Frame(tag("~people"), table), False, False, 0) def _library(self, song, box): def counter(i): return _("Never") if i == 0 \ else numeric_phrase("%(n)d time", "%(n)d times", i, "n") def ftime(t): if t == 0: return _("Unknown") else: return text_type(time.strftime("%c", time.localtime(t))) playcount = counter(song.get("~#playcount", 0)) skipcount = counter(song.get("~#skipcount", 0)) lastplayed = ftime(song.get("~#lastplayed", 0)) if lastplayed == _("Unknown"): lastplayed = _("Never") added = ftime(song.get("~#added", 0)) rating = song("~rating") has_rating = "~#rating" in song t = Table(5) table = [(_("added"), added, True), (_("last played"), lastplayed, True), (_("plays"), playcount, True), (_("skips"), skipcount, True), (_("rating"), rating, has_rating)] for i, (l, r, s) in enumerate(table): l = util.capitalize(l + ":") lab = Label(l) t.attach(lab, 0, 1, i + 1, i + 2, xoptions=Gtk.AttachOptions.FILL) label = Label(r) label.set_sensitive(s) t.attach(label, 1, 2, i + 1, i + 2) box.pack_start(Frame(_("Library"), t), False, False, 0) def _file(self, song, box): def ftime(t): if t == 0: return _("Unknown") else: return text_type(time.strftime("%c", time.localtime(t))) fn = fsn2text(unexpand(song["~filename"])) length = util.format_time_preferred(song.get("~#length", 0)) size = util.format_size( song.get("~#filesize") or filesize(song["~filename"])) mtime = ftime(util.path.mtime(song["~filename"])) format_ = song("~format") codec = song("~codec") encoding = song.comma("~encoding") bitrate = song("~bitrate") table = [(_("path"), fn), (_("length"), length), (_("format"), format_), (_("codec"), codec), (_("encoding"), encoding), (_("bitrate"), bitrate), (_("file size"), size), (_("modified"), mtime)] t = Table(len(table)) for i, (tag_, text) in enumerate(table): tag_ = util.capitalize(util.escape(tag_) + ":") lab = Label(text) lab.set_ellipsize(Pango.EllipsizeMode.MIDDLE) t.attach(Label(tag_), 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL) t.attach(lab, 1, 2, i, i + 1) box.pack_start(Frame(_("File"), t), False, False, 0) def _additional(self, song, box): if "website" not in song and "comment" not in song: return data = [] if "comment" in song: comments = song.list("comment") markups = ["<i>%s</i>" % c for c in comments] data.append(("comment", markups)) if "website" in song: markups = ["<a href=\"%(url)s\">%(text)s</a>" % {"text": util.escape(website), "url": util.escape(website)} for website in song.list("website")] data.append(("website", markups)) table = Table(1) for i, (key, markups) in enumerate(data): title = readable(key, plural=len(markups) > 1) lab = Label(markup=util.capitalize(util.escape(title) + ":")) table.attach(lab, 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL) lab = Label(markup="\n".join(markups), ellipsize=True) table.attach(lab, 1, 2, i, i + 1) box.pack_start(Frame(_("Additional"), table), False, False, 0) class OneAlbum(qltk.Notebook): def __init__(self, songs): super(OneAlbum, self).__init__() swin = SW() swin.title = _("Information") vbox = Gtk.VBox(spacing=12) vbox.set_border_width(12) swin.add_with_viewport(vbox) # Needed to get proper track/disc/part ordering songs = sorted(songs) self._title(songs, vbox) self._album(songs, vbox) self._people(songs, vbox) self._description(songs, vbox) self.append_page(swin) def _title(self, songs, box): song = songs[0] self.title = text = song["album"] markup = "<i>%s</i>" % text if "date" in song: markup += " <small>(%s)</small>" % song("~year") box.pack_start(TitleLabel(markup, is_markup=True), False, False, 0) def _album(self, songs, box): text = [] discs = {} for song in songs: try: discs[song("~#disc")] = int( song["tracknumber"].split("/")[1]) except (AttributeError, ValueError, IndexError, KeyError): discs[song("~#disc")] = max([ song("~#track", discs.get(song("~#disc"), 0))]) tracks = sum(discs.values()) discs = len(discs) length = sum([song.get("~#length", 0) for song in songs]) if tracks == 0 or tracks < len(songs): tracks = len(songs) parts = [] if discs > 1: parts.append( ngettext("%d disc", "%d discs", discs) % discs) parts.append( ngettext("%d track", "%d tracks", tracks) % tracks) if tracks != len(songs): parts.append(ngettext("%d selected", "%d selected", len(songs)) % len(songs)) text.append(", ".join(parts)) text.append("(%s)" % util.format_time_preferred(length)) if "location" in song: text.append(util.escape(song["location"])) if "organization" in song or "labelid" in song: t = util.escape(song.comma("~organization~labelid")) text.append(t) if "producer" in song: text.append(_("Produced by %s") % ( util.escape(song.comma("producer")))) w = Label(markup="\n".join(text), ellipsize=True) hb = Gtk.HBox(spacing=12) hb.pack_start(w, True, True, 0) hb.pack_start(ReactiveCoverImage(song=song), False, True, 0) box.pack_start(hb, False, False, 0) def _people(self, songs, box): tags_ = PEOPLE people = defaultdict(set) for song in songs: for t in tags_: if t in song: people[t] |= set(song.list(t)) data = [] # Preserve order of people for tag_ in tags_: values = people.get(tag_) if values: name = readable(tag_, plural=len(values) > 1) data.append((name, "\n".join(values))) table = Table(len(data)) for i, (key, text) in enumerate(data): key = util.capitalize(util.escape(key) + ":") table.attach(Label(markup=key), 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL) label = Label(text, ellipsize=True) table.attach(label, 1, 2, i, i + 1) box.pack_start(Frame(tag("~people"), table), False, False, 0) def _description(self, songs, box): text = [] cur_disc = songs[0]("~#disc", 1) - 1 cur_part = None cur_track = songs[0]("~#track", 1) - 1 for song in songs: track = song("~#track", 0) disc = song("~#disc", 0) part = song.get("part") if disc != cur_disc: if cur_disc: text.append("") cur_track = song("~#track", 1) - 1 cur_part = None cur_disc = disc if disc: text.append("%s" % (_("Disc %s") % disc)) if part != cur_part: ts = " " * bool(disc) cur_part = part if part: text.append("%s%s" % (ts, util.escape(part))) cur_track += 1 ts = " " * (bool(disc) + bool(part)) while cur_track < track: text.append("{ts}{cur: >2}. {text}".format( ts=ts, cur=cur_track, text=_("Track unavailable"))) cur_track += 1 markup = util.escape(song.comma("~title~version")) text.append("{ts}{cur: >2}. <i>{text}</i>".format( ts=ts, cur=track, text=markup)) l = Label(markup="\n".join(text), ellipsize=True) box.pack_start(Frame(_("Track List"), l), False, False, 0) class OneArtist(qltk.Notebook): def __init__(self, songs): super(OneArtist, self).__init__() swin = SW() swin.title = _("Information") vbox = Gtk.VBox(spacing=12) vbox.set_border_width(12) swin.add_with_viewport(vbox) self._title(songs, vbox) self._album(songs, vbox) self.append_page(swin) def _title(self, songs, box): self.title = songs[0]("artist") l = TitleLabel(self.title) box.pack_start(l, False, False, 0) def _album(self, songs, box): noalbum = 0 albums = {} for song in songs: if "album" in song: albums[song.list("album")[0]] = song else: noalbum += 1 albums = [(song.get("date"), song, album) for album, song in albums.items()] albums.sort() def format(args): date, song, album = args markup = "<big><i>%s</i></big>" % util.escape(album) return "%s (%s)" % (markup, date[:4]) if date else markup get_cover = app.cover_manager.get_cover covers = [(a, get_cover(s), s) for d, s, a in albums] albums = [format(a) for a in albums] if noalbum: albums.append(ngettext("%d song with no album", "%d songs with no album", noalbum) % noalbum) l = Label(markup="\n".join(albums), ellipsize=True) box.pack_start(Frame(_("Selected Discography"), l), False, False, 0) covers = [ac for ac in covers if bool(ac[1])] t = Gtk.Table(n_rows=4, n_columns=(len(covers) // 4) + 1) t.set_col_spacings(12) t.set_row_spacings(12) added = set() for i, (album, cover, song) in enumerate(covers): if cover.name in added: continue cov = ReactiveCoverImage(song=song, tooltip=album) c = i % 4 r = i // 4 t.attach(cov, c, c + 1, r, r + 1, xoptions=Gtk.AttachOptions.EXPAND, yoptions=0) added.add(cover.name) box.pack_start(t, True, True, 0) class ManySongs(qltk.Notebook): def __init__(self, songs): super(ManySongs, self).__init__() swin = SW() swin.title = _("Information") vbox = Gtk.VBox(spacing=12) vbox.set_border_width(12) swin.add_with_viewport(vbox) self._title(songs, vbox) self._people(songs, vbox) self._album(songs, vbox) self._file(songs, vbox) self.append_page(swin) def _title(self, songs, box): self.title = ngettext("%d song", "%d songs", len(songs)) % len(songs) markup = util.escape(self.title) box.pack_start(TitleLabel(markup, is_markup=True), False, False, 0) def _people(self, songs, box): artists = set() none = 0 for song in songs: if "artist" in song: artists.update(song.list("artist")) else: none += 1 artists = sorted(artists) num_artists = len(artists) if none: artists.append(ngettext("%d song with no artist", "%d songs with no artist", none) % none) label = Label(markup=util.escape("\n".join(artists)), ellipsize=True) frame = Frame("%s (%d)" % (util.capitalize(_("artists")), num_artists), label) box.pack_start(frame, False, False, 0) def _album(self, songs, box): albums = set() none = 0 for song in songs: if "album" in song: albums.update(song.list("album")) else: none += 1 albums = sorted(albums) num_albums = len(albums) markup = "\n".join("<i>%s</i>" % util.escape(a) for a in albums) if none: text = ngettext("%d song with no album", "%d songs with no album", none) % none markup += "\n%s" % util.escape(text) label = Label() label.set_markup(markup) box.pack_start(Frame( "%s (%d)" % (util.capitalize(_("albums")), num_albums), label), False, False, 0) def _file(self, songs, box): length = 0 size = 0 for song in songs: length += song.get("~#length", 0) try: size += filesize(song["~filename"]) except EnvironmentError: pass table = Table(2) table.attach(Label(_("Total length:")), 0, 1, 0, 1, xoptions=Gtk.AttachOptions.FILL) table.attach( Label(util.format_time_preferred(length)), 1, 2, 0, 1) table.attach(Label(_("Total size:")), 0, 1, 1, 2, xoptions=Gtk.AttachOptions.FILL) table.attach(Label(util.format_size(size)), 1, 2, 1, 2) box.pack_start(Frame(_("Files"), table), False, False, 0) class Information(Window, PersistentWindowMixin): def __init__(self, library, songs, parent=None): super(Information, self).__init__(dialog=False) self.set_default_size(400, 400) self.set_transient_for(qltk.get_top_parent(parent)) self.enable_window_tracking("quodlibet_information") if len(songs) > 1: connect_destroy(library, 'changed', self.__check_changed) if len(songs) > 0: connect_destroy(library, 'removed', self.__check_removed) self.__songs = songs self.__update(library) self.get_child().show_all() def __check_changed(self, library, songs): changed = set(songs) for song in self.__songs: if song in changed: self.__update(library) break def __check_removed(self, library, songs): gone = set(songs) old = len(self.__songs) self.__songs = filter(lambda s: s not in gone, self.__songs) if len(self.__songs) != old: self.__update(library) def __update(self, library): songs = self.__songs if self.get_child(): self.get_child().destroy() self.__songs = songs if not songs: self.add(NoSongs()) elif len(songs) == 1: self.add(OneSong(library, songs[0])) else: tags = [(s.get("artist", u""), s.get("album", u"")) for s in songs] artists, albums = zip(*tags) if min(albums) == max(albums) and albums[0]: self.add(OneAlbum(songs)) elif min(artists) == max(artists) and artists[0]: self.add(OneArtist(songs)) else: self.add(ManySongs(songs)) self.set_title(self.get_child().title + " - Quod Libet") self.get_child().show_all() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/bookmarks.py���������������������������������������������������������0000644�0001750�0001750�00000017744�13112005742�021257� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation # FIXME: Only allow one bookmark window per song. from gi.repository import Gtk, Pango from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.qltk.views import RCMHintedTreeView from quodlibet.util import connect_obj from quodlibet.qltk import Icons def MenuItems(marks, player, seekable): sizes = Gtk.SizeGroup(mode=Gtk.SizeGroupMode.HORIZONTAL) items = [] if not marks or marks[0][0] != 0: # Translators: Refers to the beginning of the playing song. marks.insert(0, (0, _("Beginning"))) for time, mark in marks: i = Gtk.MenuItem() # older pygobject (~3.2) added a child on creation if i.get_child(): i.remove(i.get_child()) connect_obj(i, 'activate', player.seek, time * 1000) i.set_sensitive(time >= 0 and seekable) hbox = Gtk.HBox(spacing=12) i.add(hbox) if time < 0: l = Gtk.Label(label=_("N/A")) else: l = Gtk.Label(label=util.format_time(time)) l.set_alignment(0.0, 0.5) sizes.add_widget(l) hbox.pack_start(l, False, True, 0) text = Gtk.Label(mark) text.set_max_width_chars(80) text.set_ellipsize(Pango.EllipsizeMode.END) text.set_alignment(0.0, 0.5) hbox.pack_start(text, True, True, 0) i.show_all() items.append(i) return items class EditBookmarksPane(Gtk.VBox): def __init__(self, library, song, close=False): super(EditBookmarksPane, self).__init__(spacing=6) hb = Gtk.HBox(spacing=12) self.time = time = Gtk.Entry() time.set_width_chars(5) self.markname = name = Gtk.Entry() add = qltk.Button(_("_Add"), Icons.LIST_ADD, Gtk.IconSize.MENU) hb.pack_start(time, False, True, 0) hb.pack_start(name, True, True, 0) hb.pack_start(add, False, True, 0) self.pack_start(hb, False, True, 0) model = Gtk.ListStore(int, str) sw = Gtk.ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.add(RCMHintedTreeView(model=model)) render = Gtk.CellRendererText() def cdf(column, cell, model, iter, data): if model[iter][0] < 0: cell.set_property('text', _("N/A")) else: cell.set_property('text', util.format_time(model[iter][0])) render.set_property('editable', True) render.connect('edited', self.__edit_time, model) col = Gtk.TreeViewColumn(_("Time"), render) col.set_cell_data_func(render, cdf, None) sw.get_child().append_column(col) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) col = Gtk.TreeViewColumn(_("Bookmark Name"), render, text=1) render.set_property('editable', True) render.connect('edited', self.__edit_name, model) sw.get_child().append_column(col) self.pack_start(sw, True, True, 0) self.accels = Gtk.AccelGroup() hbox = Gtk.HButtonBox() remove = qltk.Button(_("_Remove"), Icons.LIST_REMOVE) remove.set_sensitive(False) hbox.pack_start(remove, True, True, 0) if close: self.close = qltk.Button(_("_Close"), Icons.WINDOW_CLOSE) hbox.pack_start(self.close, True, True, 0) else: hbox.set_layout(Gtk.ButtonBoxStyle.END) self.pack_start(hbox, False, True, 0) connect_obj(add, 'clicked', self.__add, model, time, name) model.set_sort_column_id(0, Gtk.SortType.ASCENDING) model.connect('row-changed', self.__set_bookmarks, library, song) model.connect('row-inserted', self.__set_bookmarks, library, song) selection = sw.get_child().get_selection() selection.set_mode(Gtk.SelectionMode.MULTIPLE) selection.connect('changed', self.__check_selection, remove) remove.connect('clicked', self.__remove, selection, library, song) connect_obj(time, 'changed', self.__check_entry, add, time, name) connect_obj(name, 'changed', self.__check_entry, add, time, name) connect_obj(name, 'activate', Gtk.Button.clicked, add) time.set_text(_("MM:SS")) connect_obj(time, 'activate', Gtk.Entry.grab_focus, name) name.set_text(_("Bookmark Name")) menu = Gtk.Menu() remove = qltk.MenuItem(_("_Remove"), Icons.LIST_REMOVE) remove.connect('activate', self.__remove, selection, library, song) keyval, mod = Gtk.accelerator_parse("Delete") remove.add_accelerator( 'activate', self.accels, keyval, mod, Gtk.AccelFlags.VISIBLE) menu.append(remove) menu.show_all() sw.get_child().connect('popup-menu', self.__popup, menu) sw.get_child().connect('key-press-event', self.__view_key_press, remove) connect_obj(self, 'destroy', Gtk.Menu.destroy, menu) self.__fill(model, song) def __view_key_press(self, view, event, remove): if event.keyval == Gtk.accelerator_parse("Delete")[0]: remove.activate() def __popup(self, view, menu): return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __edit_name(self, render, path, new, model): if new: model[path][1] = new def __edit_time(self, render, path, new, model): try: time = util.parse_time(new, None) except: pass else: model[path][0] = time def __check_entry(self, add, time, name): try: util.parse_time(time.get_text(), None) except: add.set_sensitive(False) else: add.set_sensitive(bool(name.get_text())) def __add(self, model, time, name): try: time = util.parse_time(time.get_text(), None) except: pass else: model.append([time, name.get_text()]) def __check_selection(self, selection, remove): remove.set_sensitive(bool(selection.get_selected_rows()[1])) def __remove(self, remove, selection, library, song): model, paths = selection.get_selected_rows() if model: for path in paths: model.remove(model.get_iter(path)) self.__set_bookmarks(model, None, None, library, song) def __set_bookmarks(self, model, a, b, library, song): try: song.bookmarks = [(r[0], r[1].decode('utf-8')) for r in model] except (AttributeError, ValueError): pass else: if library is not None: library.changed([song]) def __fill(self, model, song): model.clear() for time, mark in song.bookmarks: model.append([time, mark]) class EditBookmarks(qltk.Window): def __init__(self, parent, library, player): super(EditBookmarks, self).__init__() self.set_transient_for(qltk.get_top_parent(parent)) self.set_border_width(12) self.set_default_size(350, 250) self.set_title(_("Bookmarks") + " - %s" % player.song.comma("title")) pane = EditBookmarksPane(library, player.song, close=True) self.add(pane) s = library.connect('removed', self.__check_lock, player.song) connect_obj(self, 'destroy', library.disconnect, s) position = player.get_position() // 1000 pane.time.set_text(util.format_time(position)) pane.markname.grab_focus() pane.close.connect('clicked', lambda *x: self.destroy()) self.get_child().show_all() def __check_lock(self, library, songs, song): if song in songs: for c in self.get_child().get_children()[:-1]: c.set_sensitive(False) ����������������������������quodlibet-3.9.1/quodlibet/qltk/dbus_.py�������������������������������������������������������������0000644�0001750�0001750�00000007326�13112005742�020356� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Federico Pelloni <federico.pelloni@gmail.com> # 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. import dbus import dbus.service from dbus import DBusException from quodlibet.util import dbusutils from quodlibet.query import Query from quodlibet.qltk.songlist import SongList from quodlibet.formats import decode_value from quodlibet.compat import itervalues class DBusHandler(dbus.service.Object): def __init__(self, player, library): try: self.library = library bus = dbus.SessionBus() name = dbus.service.BusName('net.sacredchao.QuodLibet', bus=bus) path = '/net/sacredchao/QuodLibet' super(DBusHandler, self).__init__(name, path) except DBusException: pass else: player.connect('song-started', self.__song_started) player.connect('song-ended', self.__song_ended) player.connect('paused', lambda player: self.Paused()) player.connect('unpaused', lambda player: self.Unpaused()) self._player = player def __dict(self, song): dict = {} for key, value in (song or {}).items(): value = decode_value(key, value) dict[key] = dbusutils.dbus_unicode_validate(value) if song: dict["~uri"] = song("~uri") return dict def __song_started(self, player, song): if song is not None: song = self.__dict(song) self.SongStarted(song) def __song_ended(self, player, song, skipped): if song is not None: song = self.__dict(song) self.SongEnded(song, skipped) @dbus.service.signal('net.sacredchao.QuodLibet') def SongStarted(self, song): pass @dbus.service.signal('net.sacredchao.QuodLibet') def SongEnded(self, song, skipped): pass @dbus.service.signal('net.sacredchao.QuodLibet') def Paused(self): pass @dbus.service.signal('net.sacredchao.QuodLibet') def Unpaused(self): pass @dbus.service.method('net.sacredchao.QuodLibet') def GetPosition(self): return self._player.get_position() @dbus.service.method('net.sacredchao.QuodLibet') def IsPlaying(self): return not self._player.paused @dbus.service.method('net.sacredchao.QuodLibet') def CurrentSong(self): return self.__dict(self._player.song) @dbus.service.method('net.sacredchao.QuodLibet') def Next(self): self._player.next() @dbus.service.method('net.sacredchao.QuodLibet') def Previous(self): self._player.previous() @dbus.service.method('net.sacredchao.QuodLibet') def Pause(self): self._player.paused = True @dbus.service.method('net.sacredchao.QuodLibet') def Play(self): if self._player.song is None: self._player.reset() else: self._player.paused = False @dbus.service.method('net.sacredchao.QuodLibet') def PlayPause(self): if self._player.song is None: self._player.reset() else: self._player.paused ^= True return self._player.paused @dbus.service.method('net.sacredchao.QuodLibet', in_signature='s') def Query(self, query): if query is not None: try: results = Query(query, star=SongList.star).search except Query.error: pass else: return [self.__dict(s) for s in itervalues(self.library) if results(s)] return None ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/quodlibetwindow.py���������������������������������������������������0000644�0001750�0001750�00000145552�13112005742�022506� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012 Christoph Reiter # 2012-2016 Nick Boultbee # 2017 Uriel Zajaczkovski # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk, Gdk, GLib, Gio, GObject from senf import uri2fsn, fsnative, path2fsn import quodlibet from quodlibet import browsers from quodlibet import config from quodlibet import const from quodlibet import formats from quodlibet import qltk from quodlibet import util from quodlibet import app from quodlibet import _ from quodlibet.compat import listfilter from quodlibet.qltk.appwindow import AppWindow from quodlibet.update import UpdateDialog from quodlibet.formats.remote import RemoteFile from quodlibet.qltk.browser import LibraryBrowser, FilterMenu from quodlibet.qltk.chooser import choose_folders, choose_files, \ create_chooser_filter from quodlibet.qltk.controls import PlayControls from quodlibet.qltk.cover import CoverImage from quodlibet.qltk.getstring import GetStringDialog from quodlibet.qltk.bookmarks import EditBookmarks from quodlibet.qltk.shortcuts import show_shortcuts from quodlibet.qltk.info import SongInfo from quodlibet.qltk.information import Information from quodlibet.qltk.msg import ErrorMessage, WarningMessage from quodlibet.qltk.notif import StatusBar, TaskController from quodlibet.qltk.playorder import PlayOrderWidget, RepeatSongForever, \ RepeatListForever from quodlibet.qltk.pluginwin import PluginWindow from quodlibet.qltk.properties import SongProperties from quodlibet.qltk.prefs import PreferencesWindow from quodlibet.qltk.queue import QueueExpander from quodlibet.qltk.songlist import SongList, get_columns, set_columns from quodlibet.qltk.songmodel import PlaylistMux from quodlibet.qltk.x import RVPaned, Align, ScrolledWindow, Action from quodlibet.qltk.x import ToggleAction, RadioAction from quodlibet.qltk.x import SeparatorMenuItem, MenuItem, CellRendererPixbuf from quodlibet.qltk import Icons from quodlibet.qltk.about import AboutDialog from quodlibet.util import copool, connect_destroy, connect_after_destroy from quodlibet.util.library import get_scan_dirs from quodlibet.util import connect_obj, print_d from quodlibet.util.library import background_filter, scan_library from quodlibet.util.path import uri_is_valid from quodlibet.qltk.window import PersistentWindowMixin, Window, on_first_map from quodlibet.qltk.songlistcolumns import SongListColumn class PlayerOptions(GObject.Object): """Provides a simplified interface for playback options. This currently provides a limited view on the play order state which is useful for external interfaces (mpd, mpris, etc.) and for reducing the dependency on the state holding widgets in the main window. Usable as long as the main window is not destroyed, or until `destroy()` is called. """ __gproperties__ = { 'shuffle': (bool, '', '', False, GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE), 'repeat': (bool, '', '', False, GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE), 'single': (bool, '', '', False, GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE), 'stop-after': ( bool, '', '', False, GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE), } def __init__(self, window): """`window` is a QuodLibetWindow""" super(PlayerOptions, self).__init__() self._stop_after = window.stop_after self._said = self._stop_after.connect( "toggled", lambda *x: self.notify("stop-after")) def order_changed(*args): self.notify("shuffle") self.notify("single") self._order_widget = window.order self._oid = self._order_widget.connect("changed", order_changed) window.connect("destroy", self._window_destroy) def _window_destroy(self, window): self.destroy() def destroy(self): if self._order_widget: self._order_widget.disconnect(self._oid) self._order_widget = None if self._stop_after: self._stop_after.disconnect(self._said) self._stop_after = None def do_get_property(self, param): return getattr(self, param.name.replace("-", "_")) def do_set_property(self, param, value): setattr(self, param.name.replace("-", "_"), value) @property def single(self): """If only the current song is considered as next track When `repeat` is False the playlist will end after this song finishes. When `repeat` is True the current song will be replayed. """ return (self._order_widget.repeated and self._order_widget.repeater is RepeatSongForever) @single.setter def single(self, value): if value: self.repeat = True self._order_widget.repeater = RepeatSongForever else: self.repeat = False self._order_widget.repeater = RepeatListForever @property def shuffle(self): """If a shuffle-like (reordering) play order is active""" return self._order_widget.shuffled @shuffle.setter def shuffle(self, value): self._order_widget.shuffled = value @property def repeat(self): """If the player is in some kind of repeat mode""" return self._order_widget.repeated @repeat.setter def repeat(self, value): print_d("setting repeated to %s" % value) self._order_widget.repeated = value @property def stop_after(self): """If the player will pause after the current song ends""" return self._stop_after.get_active() @stop_after.setter def stop_after(self, value): self._stop_after.set_active(value) class DockMenu(Gtk.Menu): """Menu used for the OSX dock and the tray icon""" def __init__(self, app): super(DockMenu, self).__init__() player = app.player play_item = MenuItem(_("_Play"), Icons.MEDIA_PLAYBACK_START) play_item.connect("activate", self._on_play, player) pause_item = MenuItem(_("P_ause"), Icons.MEDIA_PLAYBACK_PAUSE) pause_item.connect("activate", self._on_pause, player) self.append(play_item) self.append(pause_item) previous = MenuItem(_("Pre_vious"), Icons.MEDIA_SKIP_BACKWARD) previous.connect('activate', lambda *args: player.previous()) self.append(previous) next_ = MenuItem(_("_Next"), Icons.MEDIA_SKIP_FORWARD) next_.connect('activate', lambda *args: player.next()) self.append(next_) browse = qltk.MenuItem(_("_Browse Library"), Icons.EDIT_FIND) browse_sub = Gtk.Menu() for Kind in browsers.browsers: i = Gtk.MenuItem(label=Kind.accelerated_name, use_underline=True) connect_obj(i, 'activate', LibraryBrowser.open, Kind, app.library, app.player) browse_sub.append(i) browse.set_submenu(browse_sub) self.append(SeparatorMenuItem()) self.append(browse) self.show_all() self.hide() def _on_play(self, item, player): player.paused = False def _on_pause(self, item, player): player.paused = True class CurrentColumn(SongListColumn): """Displays the current song indicator, either a play or pause icon.""" def __init__(self): super(CurrentColumn, self).__init__("~current") self._render = CellRendererPixbuf() self.pack_start(self._render, True) self._render.set_property('xalign', 0.5) self.set_fixed_width(24) self.set_expand(False) self.set_cell_data_func(self._render, self._cdf) def _format_title(self, tag): return u"" def _cdf(self, column, cell, model, iter_, user_data): PLAY = "media-playback-start" PAUSE = "media-playback-pause" STOP = "media-playback-stop" ERROR = "dialog-error" row = model[iter_] if row.path == model.current_path: player = app.player if player.error: name = ERROR elif model.sourced: name = [PLAY, PAUSE][player.paused] else: name = STOP else: name = None if not self._needs_update(name): return if name is not None: gicon = Gio.ThemedIcon.new_from_names( [name + "-symbolic", name]) else: gicon = None cell.set_property('gicon', gicon) class MainSongList(SongList): """SongList for the main browser's displayed songs.""" _activated = False def __init__(self, library, player): super(MainSongList, self).__init__(library, player, update=True) self.set_first_column_type(CurrentColumn) self.connect('row-activated', self.__select_song, player) # ugly.. so the main window knows if the next song-started # comes from an row-activated or anything else. def reset_activated(*args): self._activated = False connect_after_destroy(player, 'song-started', reset_activated) self.connect("orders-changed", self.__orders_changed) def __orders_changed(self, *args): l = [] for tag, reverse in self.get_sort_orders(): l.append("%d%s" % (int(reverse), tag)) config.setstringlist('memory', 'sortby', l) def __select_song(self, widget, indices, col, player): self._activated = True iter = self.model.get_iter(indices) if player.go_to(iter, explicit=True, source=self.model): player.paused = False class TopBar(Gtk.Toolbar): def __init__(self, parent, player, library): super(TopBar, self).__init__() # play controls control_item = Gtk.ToolItem() self.insert(control_item, 0) t = PlayControls(player, library.librarian) self.volume = t.volume # only restore the volume in case it is managed locally, otherwise # this could affect the system volume if not player.has_external_volume: player.volume = config.getfloat("memory", "volume") connect_destroy(player, "notify::volume", self._on_volume_changed) control_item.add(t) self.insert(Gtk.SeparatorToolItem(), 1) info_item = Gtk.ToolItem() self.insert(info_item, 2) info_item.set_expand(True) box = Gtk.Box(spacing=6) info_item.add(box) qltk.add_css(self, "GtkToolbar {padding: 3px;}") self._pattern_box = Gtk.VBox() # song text info_pattern_path = os.path.join(quodlibet.get_user_dir(), "songinfo") text = SongInfo(library.librarian, player, info_pattern_path) self._pattern_box.pack_start(Align(text, border=3), True, True, 0) box.pack_start(self._pattern_box, True, True, 0) # cover image self.image = CoverImage(resize=True) connect_destroy(player, 'song-started', self.__new_song) # FIXME: makes testing easier if app.cover_manager: connect_destroy( app.cover_manager, 'cover-changed', self.__song_art_changed, library) box.pack_start(Align(self.image, border=2), False, True, 0) # On older Gtk+ (3.4, at least) # setting a margin on CoverImage leads to errors and result in the # QL window not beeing visible for some reason. assert self.image.props.margin == 0 for child in self.get_children(): child.show_all() context = self.get_style_context() context.add_class("primary-toolbar") def set_seekbar_widget(self, widget): children = self._pattern_box.get_children() if len(children) > 1: self._pattern_box.remove(children[-1]) if widget: self._pattern_box.pack_start(widget, False, True, 0) def _on_volume_changed(self, player, *args): config.set("memory", "volume", str(player.volume)) def __new_song(self, player, song): self.image.set_song(song) def __song_art_changed(self, player, songs, library): self.image.refresh() class QueueButton(Gtk.ToggleButton): def __init__(self): # XXX: view-list isn't part of the fdo spec, so fall back t justify.. gicon = Gio.ThemedIcon.new_from_names( ["view-list-symbolic", "format-justify-fill-symbolic", "view-list", "format-justify"]) image = Gtk.Image.new_from_gicon(gicon, Gtk.IconSize.SMALL_TOOLBAR) super(QueueButton, self).__init__(image=image) self.set_name("ql-queue-button") qltk.add_css(self, """ #ql-queue-button { padding: 0px; } """) self.set_size_request(26, 26) self.set_tooltip_text(_("Toggle queue visibility")) class StatusBarBox(Gtk.HBox): def __init__(self, play_order, queue): super(StatusBarBox, self).__init__(spacing=6) self.pack_start(play_order, False, True, 0) self.statusbar = StatusBar(TaskController.default_instance) self.pack_start(self.statusbar, True, True, 0) queue_button = QueueButton() queue_button.bind_property("active", queue, "visible", GObject.BindingFlags.BIDIRECTIONAL) queue_button.props.active = queue.props.visible self.pack_start(queue_button, False, True, 0) class AppMenu(object): """Implements a app menu proxy mirroring some main menu items to a new menu and exporting it on the session bus. Activation gets proxied back to the main menu actions. """ def __init__(self, window, action_group): window.realize() self._bus = None self._ag_id = None self._am_id = None window.connect("destroy", self._unexport) if window.get_realized(): self._export(window, action_group) else: self._id = window.connect("realize", self._realized, action_group) def _realized(self, window, ag): window.disconnect(self._id) self._export(window, ag) def _export(self, window, gtk_group): actions = [ ["Preferences", "Plugins"], ["RefreshLibrary"], ["OnlineHelp", "About", "Quit"], ] # build the new menu menu = Gio.Menu() action_names = [] for group in actions: section = Gio.Menu() for name in group: action = gtk_group.get_action(name) assert action label = action.get_label() section.append(label, "app." + name) action_names.append(name) menu.append_section(None, section) menu.freeze() # proxy activate to the old group def callback(action, data): name = action.get_name() gtk_action = gtk_group.get_action(name) gtk_action.activate() action_group = Gio.SimpleActionGroup() for name in action_names: action = Gio.SimpleAction.new(name, None) action_group.insert(action) action.connect("activate", callback) # export on the bus ag_object_path = "/net/sacredchao/QuodLibet" am_object_path = "/net/sacredchao/QuodLibet/menus/appmenu" app_id = "net.sacredchao.QuodLibet" win = window.get_window() if not hasattr(win, "set_utf8_property"): # not a GdkX11.X11Window print_d("Registering appmenu failed: X11 only") return # FIXME: this doesn't fail on Windows but takes for ages. # Maybe remove some deps to make it fail fast? # We don't need dbus anyway there. try: bus = Gio.bus_get_sync(Gio.BusType.SESSION, None) self._ag_id = bus.export_action_group(ag_object_path, action_group) self._am_id = bus.export_menu_model(am_object_path, menu) except GLib.GError as e: print_d("Registering appmenu failed: %r" % e) return self._bus = bus win.set_utf8_property("_GTK_UNIQUE_BUS_NAME", bus.get_unique_name()) win.set_utf8_property("_GTK_APPLICATION_ID", app_id) win.set_utf8_property("_GTK_APPLICATION_OBJECT_PATH", ag_object_path) win.set_utf8_property("_GTK_APP_MENU_OBJECT_PATH", am_object_path) def _unexport(self, window): if self._bus: self._bus.unexport_action_group(self._ag_id) self._bus.unexport_menu_model(self._am_id) self._bus = None class PlaybackErrorDialog(ErrorMessage): def __init__(self, parent, player_error): add_full_stop = lambda s: s and (s.rstrip(".") + ".") description = add_full_stop(util.escape(player_error.short_desc)) details = add_full_stop(util.escape(player_error.long_desc or "")) if details: description += " " + details super(PlaybackErrorDialog, self).__init__( parent, _("Playback Error"), description) class ConfirmLibDirSetup(WarningMessage): RESPONSE_SETUP = 1 def __init__(self, parent): title = _("Set up library directories?") description = _("You don't have any music library set up. " "Would you like to do that now?") super(ConfirmLibDirSetup, self).__init__( parent, title, description, buttons=Gtk.ButtonsType.NONE) self.add_button(_("_Not Now"), Gtk.ResponseType.CANCEL) self.add_button(_("_Set Up"), self.RESPONSE_SETUP) self.set_default_response(Gtk.ResponseType.CANCEL) MENU = """ <ui> <menubar name='Menu'> <menu action='File'> <menuitem action='AddFolders' always-show-image='true'/> <menuitem action='AddFiles' always-show-image='true'/> <menuitem action='AddLocation' always-show-image='true'/> <separator/> <menuitem action='Preferences' always-show-image='true'/> <menuitem action='Plugins' always-show-image='true'/> <separator/> <menuitem action='RefreshLibrary' always-show-image='true'/> <separator/> <menuitem action='Quit' always-show-image='true'/> </menu> <menu action='Song'> <menuitem action='EditBookmarks' always-show-image='true'/> <menuitem action='EditTags' always-show-image='true'/> <separator/> <menuitem action='Information' always-show-image='true'/> <separator/> <menuitem action='Jump' always-show-image='true'/> </menu> <menu action='Control'> <menuitem action='Previous' always-show-image='true'/> <menuitem action='PlayPause' always-show-image='true'/> <menuitem action='Next' always-show-image='true'/> <menuitem action='StopAfter' always-show-image='true'/> </menu> <menu action='Browse'> %(filters_menu)s <separator/> <menu action='BrowseLibrary' always-show-image='true'> %(browsers)s </menu> <separator /> %(views)s </menu> <menu action='Help'> <menuitem action='OnlineHelp' always-show-image='true'/> <menuitem action='Shortcuts' always-show-image='true'/> <menuitem action='SearchHelp' always-show-image='true'/> <separator/> <menuitem action='CheckUpdates' always-show-image='true'/> <menuitem action='About' always-show-image='true'/> </menu> </menubar> </ui> """ def secondary_browser_menu_items(): items = (_browser_items('Browser') + ["<separator />"] + _browser_items('Browser', True)) return "\n".join(items) def browser_menu_items(): items = (_browser_items('View') + ["<separator />"] + _browser_items('View', True)) return "\n".join(items) def _browser_items(prefix, external=False): return ["<menuitem action='%s%s'/>" % (prefix, kind.__name__) for kind in browsers.browsers if kind.uses_main_library ^ external] DND_URI_LIST, = range(1) class SongListPaned(RVPaned): def __init__(self, song_scroller, qexpander): super(SongListPaned, self).__init__() self.pack1(song_scroller, resize=True, shrink=False) self.pack2(qexpander, resize=True, shrink=False) self.set_relative(config.getfloat("memory", "queue_position", 0.75)) self.connect( 'notify::position', self._changed, "memory", "queue_position") self._handle_position = self.get_relative() qexpander.connect('notify::visible', self._expand_or) qexpander.connect('notify::expanded', self._expand_or) qexpander.connect('draw', self._check_minimize) self.connect("button-press-event", self._on_button_press) self.connect('notify', self._moved_pane_handle) @property def _expander(self): return self.get_child2() def _on_button_press(self, pane, event): # If we start to drag the pane handle while the # queue expander is unexpanded, expand it and move the handle # to the bottom, so we can 'drag' the queue out if event.window != pane.get_handle_window(): return False if not self._expander.get_expanded(): self._expander.set_expanded(True) pane.set_relative(1.0) return False def _expand_or(self, widget, prop): if self._expander.get_property('expanded'): self.set_relative(self._handle_position) def _moved_pane_handle(self, widget, prop): if self._expander.get_property('expanded'): self._handle_position = self.get_relative() def _check_minimize(self, *args): if not self._expander.get_property('expanded'): p_max = self.get_property("max-position") p_cur = self.get_property("position") if p_max != p_cur: self.set_property("position", p_max) def _changed(self, widget, event, section, option): if self._expander.get_expanded() and self.get_property('position-set'): config.set(section, option, str(self.get_relative())) class QuodLibetWindow(Window, PersistentWindowMixin, AppWindow): def __init__(self, library, player, headless=False, restore_cb=None): super(QuodLibetWindow, self).__init__(dialog=False) self.__destroyed = False self.__update_title(player) self.set_default_size(600, 480) main_box = Gtk.VBox() self.add(main_box) self.__player = player # create main menubar, load/restore accelerator groups self.__library = library ui = self.__create_menu(player, library) accel_group = ui.get_accel_group() self.add_accel_group(accel_group) def scroll_and_jump(*args): self.__jump_to_current(True, True) keyval, mod = Gtk.accelerator_parse("<Primary><shift>J") accel_group.connect(keyval, mod, 0, scroll_and_jump) # dbus app menu # Unity puts the app menu next to our menu bar. Since it only contains # menu items also available in the menu bar itself, don't add it. if not util.is_unity(): AppMenu(self, ui.get_action_groups()[0]) # custom accel map accel_fn = os.path.join(quodlibet.get_user_dir(), "accels") Gtk.AccelMap.load(accel_fn) # save right away so we fill the file with example comments of all # accels Gtk.AccelMap.save(accel_fn) menubar = ui.get_widget("/Menu") # Since https://git.gnome.org/browse/gtk+/commit/?id=b44df22895c79 # toplevel menu items show an empty 16x16 image. While we don't # need image items there UIManager creates them by default. # Work around by removing the empty GtkImages for child in menubar.get_children(): if isinstance(child, Gtk.ImageMenuItem): child.set_image(None) main_box.pack_start(menubar, False, True, 0) # get the playlist up before other stuff self.songlist = MainSongList(library, player) self.songlist.connect("key-press-event", self.__songlist_key_press) self.songlist.connect_after( 'drag-data-received', self.__songlist_drag_data_recv) self.song_scroller = ScrolledWindow() self.song_scroller.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.song_scroller.set_shadow_type(Gtk.ShadowType.IN) self.song_scroller.add(self.songlist) self.qexpander = QueueExpander(library, player) self.qexpander.set_no_show_all(True) self.qexpander.set_visible(config.getboolean("memory", "queue")) def on_queue_visible(qex, param): config.set("memory", "queue", str(qex.get_visible())) self.qexpander.connect("notify::visible", on_queue_visible) self.playlist = PlaylistMux( player, self.qexpander.model, self.songlist.model) top_bar = TopBar(self, player, library) main_box.pack_start(top_bar, False, True, 0) self.top_bar = top_bar self.__browserbox = Align(bottom=3) main_box.pack_start(self.__browserbox, True, True, 0) play_order = PlayOrderWidget(self.songlist.model, player) statusbox = StatusBarBox(play_order, self.qexpander) self.order = play_order self.statusbar = statusbox.statusbar main_box.pack_start( Align(statusbox, border=3, top=-3), False, True, 0) self.songpane = SongListPaned(self.song_scroller, self.qexpander) self.songpane.show_all() try: orders = [] for e in config.getstringlist('memory', 'sortby', []): orders.append((e[1:], int(e[0]))) except ValueError: pass else: self.songlist.set_sort_orders(orders) self.browser = None self.ui = ui main_box.show_all() self._playback_error_dialog = None connect_destroy(player, 'song-started', self.__song_started) connect_destroy(player, 'paused', self.__update_paused, True) connect_destroy(player, 'unpaused', self.__update_paused, False) # make sure we redraw all error indicators before opening # a dialog (blocking the main loop), so connect after default handlers connect_after_destroy(player, 'error', self.__player_error) # connect after to let SongTracker update stats connect_after_destroy(player, "song-ended", self.__song_ended) # set at least the playlist. the song should be restored # after the browser emits the song list player.setup(self.playlist, None, 0) self.__restore_cb = restore_cb self.__first_browser_set = True restore_browser = not headless try: self._select_browser( self, config.get("memory", "browser"), library, player, restore_browser) except: config.set("memory", "browser", browsers.name(browsers.default)) config.save() raise self.songlist.connect('popup-menu', self.__songs_popup_menu) self.songlist.connect('columns-changed', self.__cols_changed) self.songlist.connect('columns-changed', self.__hide_headers) self.songlist.info.connect("changed", self.__set_totals) lib = library.librarian connect_destroy(lib, 'changed', self.__song_changed, player) targets = [("text/uri-list", Gtk.TargetFlags.OTHER_APP, DND_URI_LIST)] targets = [Gtk.TargetEntry.new(*t) for t in targets] self.drag_dest_set( Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY) self.connect('drag-data-received', self.__drag_data_received) if not headless: on_first_map(self, self.__configure_scan_dirs, library) if config.getboolean('library', 'refresh_on_start'): self.__rebuild(None, False) self.connect("key-press-event", self.__key_pressed, player) self.connect("destroy", self.__destroy) self.enable_window_tracking("quodlibet") def set_seekbar_widget(self, widget): """Add an alternative seek bar widget. Args: widget (Gtk.Widget): a new widget or None to remove the current one """ self.top_bar.set_seekbar_widget(widget) def set_as_osx_window(self, osx_app): assert osx_app self._dock_menu = DockMenu(app) osx_app.set_dock_menu(self._dock_menu) menu = self.ui.get_widget("/Menu") menu.hide() osx_app.set_menu_bar(menu) # Reparent some items to the "Application" menu item = self.ui.get_widget('/Menu/Help/About') osx_app.insert_app_menu_item(item, 0) osx_app.insert_app_menu_item(Gtk.SeparatorMenuItem(), 1) item = self.ui.get_widget('/Menu/File/Preferences') osx_app.insert_app_menu_item(item, 2) quit_item = self.ui.get_widget('/Menu/File/Quit') quit_item.hide() def get_is_persistent(self): return True def open_file(self, filename): assert isinstance(filename, fsnative) song = self.__library.add_filename(filename, add=False) if song is not None: if self.__player.go_to(song): self.__player.paused = False return True else: return False def __player_error(self, player, song, player_error): # it's modal, but mmkeys etc. can still trigger new ones if self._playback_error_dialog: self._playback_error_dialog.destroy() dialog = PlaybackErrorDialog(self, player_error) self._playback_error_dialog = dialog dialog.run() self._playback_error_dialog = None def __configure_scan_dirs(self, library): """Get user to configure scan dirs, if none is set up""" if not get_scan_dirs() and not len(library) and \ quodlibet.is_first_session("quodlibet"): print_d("Couldn't find any scan dirs") resp = ConfirmLibDirSetup(self).run() if resp == ConfirmLibDirSetup.RESPONSE_SETUP: prefs = PreferencesWindow(self) prefs.set_page("library") prefs.show() def __keyboard_shortcuts(self, action): show_shortcuts(self) def __edit_bookmarks(self, librarian, player): if player.song: window = EditBookmarks(self, librarian, player) window.show() def __key_pressed(self, widget, event, player): if not player.song: return def seek_relative(seconds): current = player.get_position() current += seconds * 1000 current = min(player.song("~#length") * 1000 - 1, current) current = max(0, current) player.seek(current) if qltk.is_accel(event, "<alt>Right"): seek_relative(10) return True elif qltk.is_accel(event, "<alt>Left"): seek_relative(-10) return True def __destroy(self, *args): self.playlist.destroy() # The tray icon plugin tries to unhide QL because it gets disabled # on Ql exit. The window should stay hidden after destroy. self.show = lambda: None self.present = self.show def __drag_data_received(self, widget, ctx, x, y, sel, tid, etime): assert tid == DND_URI_LIST uris = sel.get_uris() dirs = [] error = False for uri in uris: try: filename = uri2fsn(uri) except ValueError: filename = None if filename is not None: loc = os.path.normpath(filename) if os.path.isdir(loc): dirs.append(loc) else: loc = os.path.realpath(loc) if loc not in self.__library: self.__library.add_filename(loc) elif app.player.can_play_uri(uri): if uri not in self.__library: self.__library.add([RemoteFile(uri)]) else: error = True break Gtk.drag_finish(ctx, not error, False, etime) if error: ErrorMessage( self, _("Unable to add songs"), _("%s uses an unsupported protocol.") % util.bold(uri)).run() else: if dirs: copool.add( self.__library.scan, dirs, cofuncid="library", funcid="library") def __songlist_key_press(self, songlist, event): return self.browser.key_pressed(event) def __songlist_drag_data_recv(self, view, *args): if self.browser.can_reorder: songs = view.get_songs() self.browser.reordered(songs) self.songlist.clear_sort() def __create_menu(self, player, library): def add_view_items(ag): act = Action(name="Information", label=_('_Information'), icon_name=Icons.DIALOG_INFORMATION) act.connect('activate', self.__current_song_info) ag.add_action(act) act = Action(name="Jump", label=_('_Jump to Playing Song'), icon_name=Icons.GO_JUMP) act.connect('activate', self.__jump_to_current) ag.add_action_with_accel(act, "<Primary>J") def add_top_level_items(ag): ag.add_action(Action(name="File", label=_("_File"))) ag.add_action(Action(name="Song", label=_("_Song"))) ag.add_action(Action(name="View", label=_('_View'))) ag.add_action(Action(name="Browse", label=_("_Browse"))) ag.add_action(Action(name="Control", label=_('_Control'))) ag.add_action(Action(name="Help", label=_('_Help'))) ag = Gtk.ActionGroup.new('QuodLibetWindowActions') add_top_level_items(ag) add_view_items(ag) act = Action(name="AddFolders", label=_(u'_Add a Folder…'), icon_name=Icons.LIST_ADD) act.connect('activate', self.open_chooser) ag.add_action_with_accel(act, "<Primary>O") act = Action(name="AddFiles", label=_(u'_Add a File…'), icon_name=Icons.LIST_ADD) act.connect('activate', self.open_chooser) ag.add_action(act) act = Action(name="AddLocation", label=_(u'_Add a Location…'), icon_name=Icons.LIST_ADD) act.connect('activate', self.open_location) ag.add_action(act) act = Action(name="BrowseLibrary", label=_('Open _Browser'), icon_name=Icons.EDIT_FIND) ag.add_action(act) act = Action(name="Preferences", label=_('_Preferences'), icon_name=Icons.PREFERENCES_SYSTEM) act.connect('activate', self.__preferences) ag.add_action(act) act = Action(name="Plugins", label=_('_Plugins'), icon_name=Icons.SYSTEM_RUN) act.connect('activate', self.__plugins) ag.add_action(act) act = Action(name="Quit", label=_('_Quit'), icon_name=Icons.APPLICATION_EXIT) act.connect('activate', lambda *x: self.destroy()) ag.add_action_with_accel(act, "<Primary>Q") act = Action(name="EditTags", label=_('Edit _Tags'), icon_name=Icons.DOCUMENT_PROPERTIES) act.connect('activate', self.__current_song_prop) ag.add_action(act) act = Action(name="EditBookmarks", label=_(u"Edit Bookmarks…")) connect_obj(act, 'activate', self.__edit_bookmarks, library.librarian, player) ag.add_action_with_accel(act, "<Primary>B") act = Action(name="Previous", label=_('Pre_vious'), icon_name=Icons.MEDIA_SKIP_BACKWARD) act.connect('activate', self.__previous_song) ag.add_action_with_accel(act, "<Primary>comma") act = Action(name="PlayPause", label=_('_Play'), icon_name=Icons.MEDIA_PLAYBACK_START) act.connect('activate', self.__play_pause) ag.add_action_with_accel(act, "<Primary>space") act = Action(name="Next", label=_('_Next'), icon_name=Icons.MEDIA_SKIP_FORWARD) act.connect('activate', self.__next_song) ag.add_action_with_accel(act, "<Primary>period") act = ToggleAction(name="StopAfter", label=_("Stop After This Song")) ag.add_action_with_accel(act, "<shift>space") # access point for the tray icon self.stop_after = act act = Action(name="Shortcuts", label=_("_Keyboard Shortcuts")) act.connect('activate', self.__keyboard_shortcuts) ag.add_action_with_accel(act, "<Primary>question") act = Action(name="About", label=_("_About"), icon_name=Icons.HELP_ABOUT) act.connect('activate', self.__show_about) ag.add_action_with_accel(act, None) act = Action(name="OnlineHelp", label=_("Online Help"), icon_name=Icons.HELP_BROWSER) def website_handler(*args): util.website(const.ONLINE_HELP) act.connect('activate', website_handler) ag.add_action_with_accel(act, "F1") act = Action(name="SearchHelp", label=_("Search Help")) def search_help_handler(*args): util.website(const.SEARCH_HELP) act.connect('activate', search_help_handler) ag.add_action_with_accel(act, None) act = Action(name="CheckUpdates", label=_("_Check for Updates…"), icon_name=Icons.NETWORK_SERVER) def check_updates_handler(*args): d = UpdateDialog(self) d.run() d.destroy() act.connect('activate', check_updates_handler) ag.add_action_with_accel(act, None) act = Action( name="RefreshLibrary", label=_("_Scan Library"), icon_name=Icons.VIEW_REFRESH) act.connect('activate', self.__rebuild, False) ag.add_action(act) current = config.get("memory", "browser") try: browsers.get(current) except ValueError: current = browsers.name(browsers.default) first_action = None for Kind in browsers.browsers: name = browsers.name(Kind) index = browsers.index(name) action_name = "View" + Kind.__name__ act = RadioAction(name=action_name, label=Kind.accelerated_name, value=index) act.join_group(first_action) first_action = first_action or act if name == current: act.set_active(True) ag.add_action_with_accel(act, "<Primary>%d" % ((index + 1) % 10,)) assert first_action self._browser_action = first_action def action_callback(view_action, current_action): current = browsers.name( browsers.get(current_action.get_current_value())) self._select_browser(view_action, current, library, player) first_action.connect("changed", action_callback) for Kind in browsers.browsers: action = "Browser" + Kind.__name__ label = Kind.accelerated_name name = browsers.name(Kind) index = browsers.index(name) act = Action(name=action, label=label) def browser_activate(action, Kind): LibraryBrowser.open(Kind, library, player) act.connect('activate', browser_activate, Kind) ag.add_action_with_accel(act, "<Primary><alt>%d" % ((index + 1) % 10,)) ui = Gtk.UIManager() ui.insert_action_group(ag, -1) menustr = MENU % { "views": browser_menu_items(), "browsers": secondary_browser_menu_items(), "filters_menu": FilterMenu.MENU } ui.add_ui_from_string(menustr) self._filter_menu = FilterMenu(library, player, ui) # Cute. So. UIManager lets you attach tooltips, but when they're # for menu items, they just get ignored. So here I get to actually # attach them. ui.get_widget("/Menu/File/RefreshLibrary").set_tooltip_text( _("Check for changes in your library")) return ui def __show_about(self, *args): about = AboutDialog(self, app) about.run() about.destroy() def select_browser(self, browser_key, library, player): """Given a browser name (see browsers.get()) changes the current browser. Returns True if the passed browser ID is known and the change was initiated. """ try: Browser = browsers.get(browser_key) except ValueError: return False action_name = "View%s" % Browser.__name__ for action in self._browser_action.get_group(): if action.get_name() == action_name: action.set_active(True) return True return False def _select_browser(self, activator, current, library, player, restore=False): Browser = browsers.get(current) config.set("memory", "browser", current) if self.browser: if not (self.browser.uses_main_library and Browser.uses_main_library): self.songlist.clear() container = self.browser.__container self.browser.unpack(container, self.songpane) if self.browser.accelerators: self.remove_accel_group(self.browser.accelerators) container.destroy() self.browser.destroy() self.browser = Browser(library) self.browser.connect('songs-selected', self.__browser_cb, library, player) self.browser.connect('songs-activated', self.__browser_activate) if restore: self.browser.restore() self.browser.activate() self.browser.finalize(restore) if self.browser.can_reorder: self.songlist.enable_drop() elif self.browser.dropped: self.songlist.enable_drop(False) else: self.songlist.disable_drop() if self.browser.accelerators: self.add_accel_group(self.browser.accelerators) container = self.browser.__container = self.browser.pack(self.songpane) player.replaygain_profiles[1] = self.browser.replaygain_profiles player.reset_replaygain() self.__browserbox.add(container) container.show() self._filter_menu.set_browser(self.browser) self.__hide_headers() def __update_paused(self, player, paused): menu = self.ui.get_widget("/Menu/Control/PlayPause") image = menu.get_image() if paused: label, icon = _("_Play"), Icons.MEDIA_PLAYBACK_START else: label, icon = _("P_ause"), Icons.MEDIA_PLAYBACK_PAUSE menu.set_label(label) image.set_from_icon_name(icon, Gtk.IconSize.MENU) def __song_ended(self, player, song, stopped): # Check if the song should be removed, based on the # active filter of the current browser. active_filter = self.browser.active_filter if song and active_filter and not active_filter(song): iter_ = self.songlist.model.find(song) if iter_: self.songlist.remove_iters([iter_]) if self.stop_after.get_active(): player.paused = True self.stop_after.set_active(False) def __song_changed(self, library, songs, player): if player.info in songs: self.__update_title(player) def __update_title(self, player): song = player.info title = "Quod Libet" if song: tag = config.gettext("settings", "window_title_pattern") if tag: title = song.comma(tag) + " - " + title self.set_title(title) def __song_started(self, player, song): self.__update_title(player) for wid in ["Control/Next", "Control/StopAfter", "Song/EditTags", "Song/Information", "Song/EditBookmarks", "Song/Jump"]: self.ui.get_widget('/Menu/' + wid).set_sensitive(bool(song)) # don't jump on stream changes (player.info != player.song) should_jump = (song and player.song is song and not self.songlist._activated and config.getboolean("settings", "jump") and self.songlist.sourced) if should_jump: self.__jump_to_current(False) def __play_pause(self, *args): if app.player.song is None: app.player.reset() else: app.player.paused ^= True def __jump_to_current(self, explicit, force_scroll=False): """Select/scroll to the current playing song in the playlist. If it can't be found tell the browser to properly fill the playlist with an appropriate selection containing the song. explicit means that the jump request comes from the user and not from an event like song-started. force_scroll will ask the browser to refill the playlist in any case. """ def idle_jump_to(song, select): ok = self.songlist.jump_to_song(song, select=select) if ok: self.songlist.grab_focus() return False song = app.player.song # We are not playing a song if song is None: return if not force_scroll: ok = self.songlist.jump_to_song(song, select=explicit) else: assert explicit ok = False if ok: self.songlist.grab_focus() elif explicit: # if we can't find it and the user requested it, try harder self.browser.scroll(song) # We need to wait until the browser has finished # scrolling/filling and the songlist is ready. # Not perfect, but works for now. GLib.idle_add( idle_jump_to, song, explicit, priority=GLib.PRIORITY_LOW) def __next_song(self, *args): app.player.next() def __previous_song(self, *args): app.player.previous() def __rebuild(self, activator, force): scan_library(self.__library, force) # Set up the preferences window. def __preferences(self, activator): window = PreferencesWindow(self) window.show() def __plugins(self, activator): window = PluginWindow(self) window.show() def open_location(self, action): name = GetStringDialog(self, _("Add a Location"), _("Enter the location of an audio file:"), button_label=_("_Add"), button_icon=Icons.LIST_ADD).run() if name: if not uri_is_valid(name): ErrorMessage( self, _("Unable to add location"), _("%s is not a valid location.") % ( util.bold(util.escape(name)))).run() elif not app.player.can_play_uri(name): ErrorMessage( self, _("Unable to add location"), _("%s uses an unsupported protocol.") % ( util.bold(util.escape(name)))).run() else: if name not in self.__library: self.__library.add([RemoteFile(name)]) def open_chooser(self, action): if action.get_name() == "AddFolders": fns = choose_folders(self, _("Add Music"), _("_Add Folders")) if fns: # scan them copool.add(self.__library.scan, fns, cofuncid="library", funcid="library") else: patterns = ["*" + path2fsn(k) for k in formats.loaders.keys()] choose_filter = create_chooser_filter(_("Music Files"), patterns) fns = choose_files( self, _("Add Music"), _("_Add Files"), choose_filter) if fns: for filename in fns: self.__library.add_filename(filename) def __songs_popup_menu(self, songlist): path, col = songlist.get_cursor() header = col.header_name menu = self.songlist.Menu(header, self.browser, self.__library) if menu is not None: return self.songlist.popup_menu(menu, 0, Gtk.get_current_event_time()) def __current_song_prop(self, *args): song = app.player.song if song: librarian = self.__library.librarian window = SongProperties(librarian, [song], parent=self) window.show() def __current_song_info(self, *args): song = app.player.song if song: librarian = self.__library.librarian window = Information(librarian, [song], self) window.show() def __browser_activate(self, browser): app.player.reset() def __browser_cb(self, browser, songs, sorted, library, player): if browser.background: bg = background_filter() if bg: songs = listfilter(bg, songs) self.songlist.set_songs(songs, sorted) # After the first time the browser activates, which should always # happen if we start up and restore, restore the playing song. # Because the browser has send us songs we can be sure it has # registered all its libraries. if self.__first_browser_set: self.__first_browser_set = False song = library.librarian.get(config.get("memory", "song")) seek_pos = config.getfloat("memory", "seek", 0) config.set("memory", "seek", 0) if song is not None: player.setup(self.playlist, song, seek_pos) if self.__restore_cb: self.__restore_cb() self.__restore_cb = None def __hide_headers(self, activator=None): for column in self.songlist.get_columns(): if self.browser.headers is None: column.set_visible(True) else: for tag in util.tagsplit(column.header_name): if tag in self.browser.headers: column.set_visible(True) break else: column.set_visible(False) def __cols_changed(self, songlist): headers = [col.header_name for col in songlist.get_columns()] try: headers.remove('~current') except ValueError: pass if len(headers) == len(get_columns()): # Not an addition or removal (handled separately) set_columns(headers) SongList.headers = headers def __make_query(self, query): if self.browser.can_filter_text(): self.browser.filter_text(query.encode('utf-8')) self.browser.activate() def __set_totals(self, info, songs): length = sum(song.get("~#length", 0) for song in songs) t = self.browser.status_text(count=len(songs), time=util.format_time_preferred(length)) self.statusbar.set_default_text(t) ������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/downloader.py��������������������������������������������������������0000644�0001750�0001750�00000013544�13114571372�021430� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005, 2009 Joe Wreschnig, Steven Robertson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk, Pango, GLib from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.util import connect_obj from quodlibet.qltk.views import AllTreeView from quodlibet.qltk.x import MenuItem from quodlibet.qltk import Icons from quodlibet.util.urllib import urlopen class DownloadWindow(qltk.UniqueWindow): downloads = None @classmethod def download(klass, source, target, parent=None): if klass.downloads is None: # source fileobj, target fileobj, I/O watch callback ID, source uri klass.downloads = Gtk.ListStore(object, object, int, object) win = DownloadWindow(parent) win.show() win._download(source, target) def __init__(self, parent=None): if self.is_not_unique(): return super(DownloadWindow, self).__init__() self.set_title("Quod Libet - " + _("Downloads")) self.set_default_size(300, 150) self.set_border_width(12) self.set_transient_for(qltk.get_top_parent(parent)) self.__timeout = None view = AllTreeView() view.connect('popup-menu', self.__popup_menu) view.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) view.set_model(self.downloads) view.set_rules_hint(True) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.START) column = Gtk.TreeViewColumn(_("Filename"), render) column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) column.set_expand(True) def cell_data_name(column, cell, model, iter, data): cell.set_property('text', model[iter][1].name) column.set_cell_data_func(render, cell_data_name) view.append_column(column) render = Gtk.CellRendererText() column = Gtk.TreeViewColumn(_("Size"), render) column.set_sizing(Gtk.TreeViewColumnSizing.GROW_ONLY) def cell_data_size(column, cell, model, iter, data): if model[iter][2] == 0: size = _("Queued") else: size = util.format_size(model[iter][1].tell()) cell.set_property('text', size) column.set_cell_data_func(render, cell_data_size) view.append_column(column) sw = Gtk.ScrolledWindow() sw.add(view) sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.add(sw) connect_obj(self, 'delete-event', DownloadWindow.__delete_event, self) self.get_child().show_all() def __update(self): for row in self.downloads: self.downloads.row_changed(row.path, row.iter) return True def __popup_menu(self, view): selection = view.get_selection() model, paths = selection.get_selected_rows() if model: iters = map(model.get_iter, paths) menu = Gtk.Menu() item = MenuItem(_("_Stop"), Icons.PROCESS_STOP) connect_obj(item, 'activate', self.__stop_download, iters) menu.append(item) menu.connect('selection-done', lambda m: m.destroy()) menu.show_all() return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __start_next(self): started = len([r for r in self.downloads if r[2] != 0]) iter = self.downloads.get_iter_first() while iter is not None: if started >= 2: break if self.downloads[iter][2] == 0: url = urlopen(self.downloads[iter][3]) sock = url.fp._sock sock.setblocking(0) self.downloads[iter][0] = sock sig_id = qltk.io_add_watch( sock, GLib.PRIORITY_DEFAULT, GLib.IO_IN | GLib.IO_ERR | GLib.IO_HUP, self.__got_data, self.downloads[iter][1], iter) self.downloads[iter][2] = sig_id started += 1 iter = self.downloads.iter_next(iter) def __stop_download(self, iters): for iter in iters: if self.downloads[iter][2] != 0: GLib.source_remove(self.downloads[iter][2]) if self.downloads[iter][0]: self.downloads[iter][0].close() self.downloads[iter][1].close() os.unlink(self.downloads[iter][1].name) self.downloads.remove(iter) self.__start_next() def present(self): super(DownloadWindow, self).present() if self.__timeout is None: self.__timeout = GLib.timeout_add(1000, self.__update) def __delete_event(self, event): self.hide() if self.__timeout is not None: GLib.source_remove(self.__timeout) self.__timeout = None return True def _download(self, source, target): # FIXME # https://github.com/quodlibet/quodlibet/issues/2401 return fileobj = open(target, "wb") self.downloads.append(row=[None, fileobj, 0, source]) self.__start_next() def __got_data(self, src, condition, fileobj, iter): if condition in [GLib.IO_ERR, GLib.IO_HUP]: fileobj.close() src.close() self.downloads.remove(iter) self.__start_next() return False else: buf = src.recv(1024 * 1024) if buf: fileobj.write(buf) else: fileobj.close() src.close() self.downloads.remove(iter) self.__start_next() return bool(buf) ������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/util.py��������������������������������������������������������������0000644�0001750�0001750�00000006112�13112005742�020227� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Gdk from quodlibet.qltk import is_wayland def window_grab_and_map(window, mask): """Returns a list of devices that have a grab or an empty list if something failed. If somethings failed the window will be hidden. """ device = Gtk.get_current_event_device() event_time = Gtk.get_current_event_time() if not device: return [] # On wayland we need to grab before mapping and on X11 and everywhere else # we can grab after we are mapped if not is_wayland(): window.show() else: window.realize() Gtk.device_grab_add(window, device, True) status = device.grab( window.get_window(), Gdk.GrabOwnership.WINDOW, True, mask, None, event_time) if status != Gdk.GrabStatus.SUCCESS: Gtk.device_grab_remove(window, device) window.hide() return [] associated_device = device.get_associated_device() if associated_device is None: if is_wayland(): window.show() return [device] Gtk.device_grab_add(window, associated_device, True) status = associated_device.grab( window.get_window(), Gdk.GrabOwnership.WINDOW, True, mask, None, event_time) if status != Gdk.GrabStatus.SUCCESS: Gtk.device_grab_remove(window, associated_device) Gtk.device_grab_remove(window, device) device.ungrab(event_time) window.hide() return [] if is_wayland(): window.show() return [device, associated_device] def window_ungrab_and_unmap(window, devices): """Takes the result of window_grab_and_map() and removes the grabs""" event_time = Gtk.get_current_event_time() for device in devices: Gtk.device_grab_remove(window, device) device.ungrab(event_time) window.hide() #gtk3.8 bug: https://bugzilla.gnome.org/show_bug.cgi?id=700185 window.unrealize() def position_window_beside_widget(window, widget, end=True, pad=3): """Positions `window` left or right beside `widget` on the screen. `padding` is the space between the widget and the window. If `end` is True the window will be placed on the right side in LTR mode or on the left side in RTL mode. """ if Gtk.Widget.get_default_direction() != Gtk.TextDirection.LTR: right = not end else: right = end assert widget.get_realized() toplevel = widget.get_toplevel() dx, dy = widget.translate_coordinates(toplevel, 0, 0) x, y = toplevel.get_window().get_origin()[1:] x += dx y += dy widget_alloc = widget.get_allocation() w, h = widget_alloc.width, widget_alloc.height window.size_request() ww, wh = window.get_size() if right: sx, sy = ((x + w + pad), (y + (h - wh) // 2)) else: sx, sy = ((x - (ww + pad)), (y + (h - wh) // 2)) window.move(sx, sy) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/tracknumbers.py������������������������������������������������������0000644�0001750�0001750�00000017431�13112005742�021760� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from senf import fsn2text from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.formats import AudioFileError from quodlibet.qltk._editutils import OverwriteWarning, WriteFailedError from quodlibet.qltk.views import HintedTreeView, TreeViewColumn from quodlibet.qltk.wlw import WritingWindow from quodlibet.qltk.x import Button, Align from quodlibet.qltk.models import ObjectStore from quodlibet.qltk import Icons from quodlibet.util import connect_obj, gdecode from quodlibet.compat import text_type, itervalues class Entry(object): def __init__(self, song): self.song = song self.tracknumber = song("tracknumber") @property def name(self): return fsn2text(self.song("~basename")) class TrackNumbers(Gtk.VBox): def __init__(self, prop, library): super(TrackNumbers, self).__init__(spacing=6) self.title = _("Track Numbers") self.set_border_width(12) label_start = Gtk.Label(label=_("Start fro_m:"), halign=Gtk.Align.END) label_start.set_use_underline(True) spin_start = Gtk.SpinButton() spin_start.set_range(0, 999) spin_start.set_increments(1, 10) spin_start.set_value(1) label_start.set_mnemonic_widget(spin_start) label_total = Gtk.Label( label=_("_Total tracks:"), halign=Gtk.Align.END) label_total.set_use_underline(True) spin_total = Gtk.SpinButton() spin_total.set_range(0, 999) spin_total.set_increments(1, 10) label_total.set_mnemonic_widget(spin_total) preview = qltk.Button(_("_Preview"), Icons.VIEW_REFRESH) grid = Gtk.Grid(row_spacing=4, column_spacing=4) grid.add(label_start) grid.attach_next_to( spin_start, label_start, Gtk.PositionType.RIGHT, 1, 1) grid.attach_next_to( label_total, label_start, Gtk.PositionType.BOTTOM, 1, 1) grid.attach_next_to( spin_total, label_total, Gtk.PositionType.RIGHT, 1, 1) grid.attach_next_to( Align(preview, halign=Gtk.Align.END), spin_start, Gtk.PositionType.RIGHT, 1, 1) preview.props.hexpand = True model = ObjectStore() view = HintedTreeView(model=model) self.pack_start(grid, False, True, 0) render = Gtk.CellRendererText() column = TreeViewColumn(title=_('File')) column.pack_start(render, True) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) def cell_data_file(column, cell, model, iter_, data): entry = model.get_value(iter_) cell.set_property("text", entry.name) column.set_cell_data_func(render, cell_data_file) view.append_column(column) render = Gtk.CellRendererText() render.set_property('editable', True) column = TreeViewColumn(title=_('Track')) column.pack_start(render, True) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) def cell_data_track(column, cell, model, iter_, data): entry = model.get_value(iter_) cell.set_property("text", entry.tracknumber) column.set_cell_data_func(render, cell_data_track) view.append_column(column) view.set_reorderable(True) w = Gtk.ScrolledWindow() w.set_shadow_type(Gtk.ShadowType.IN) w.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) w.add(view) self.pack_start(w, True, True, 0) bbox = Gtk.HButtonBox() bbox.set_spacing(6) bbox.set_layout(Gtk.ButtonBoxStyle.END) save = Button(_("_Save"), Icons.DOCUMENT_SAVE) self.save = save connect_obj(save, 'clicked', self.__save_files, prop, model, library) revert = Button(_("_Revert"), Icons.DOCUMENT_REVERT) self.revert = revert bbox.pack_start(revert, True, True, 0) bbox.pack_start(save, True, True, 0) self.pack_start(bbox, False, True, 0) preview_args = [spin_start, spin_total, model, save, revert] preview.connect('clicked', self.__preview_tracks, *preview_args) connect_obj(revert, 'clicked', self.__update, None, *preview_args[1:]) spin_total.connect( 'value-changed', self.__preview_tracks, *preview_args) spin_start.connect( 'value-changed', self.__preview_tracks, *preview_args) connect_obj(view, 'drag-end', self.__class__.__preview_tracks, self, *preview_args) render.connect('edited', self.__row_edited, model, preview, save) connect_obj(prop, 'changed', self.__class__.__update, self, spin_total, model, save, revert) for child in self.get_children(): child.show_all() def __row_edited(self, render, path, new, model, preview, save): path = Gtk.TreePath.new_from_string(path) row = model[path] entry = row[0] new = gdecode(new) if entry.tracknumber != new: entry.tracknumber = new preview.set_sensitive(True) save.set_sensitive(True) model.path_changed(path) def __save_files(self, parent, model, library): win = WritingWindow(parent, len(model)) was_changed = set() all_done = False for entry in itervalues(model): song, track = entry.song, entry.tracknumber if song.get("tracknumber") == track: win.step() continue if not song.valid(): win.hide() dialog = OverwriteWarning(self, song) resp = dialog.run() win.show() if resp != OverwriteWarning.RESPONSE_SAVE: break song["tracknumber"] = track try: song.write() except AudioFileError: util.print_exc() WriteFailedError(self, song).run() library.reload(song, changed=was_changed) break was_changed.add(song) if win.step(): break else: all_done = True library.changed(was_changed) win.destroy() self.save.set_sensitive(not all_done) self.revert.set_sensitive(not all_done) def __preview_tracks(self, ctx, start, total, model, save, revert): start = start.get_value_as_int() total = total.get_value_as_int() for row in model: if total: s = u"%d/%d" % (row.path.get_indices()[0] + start, total) else: s = text_type(row.path.get_indices()[0] + start) entry = row[0] entry.tracknumber = s model.row_changed(row.path, row.iter) save.set_sensitive(True) revert.set_sensitive(True) def __update(self, songs, total, model, save, revert): if songs is None: songs = [e.song for e in itervalues(model)] else: songs = list(songs) def sort_key(song): return song("~#track", 0), song("~basename"), song songs.sort(key=sort_key) model.clear() total.set_value(len(songs)) for song in songs: if not song.can_change("tracknumber"): self.set_sensitive(False) break else: self.set_sensitive(True) for song in songs: model.append([Entry(song)]) save.set_sensitive(False) revert.set_sensitive(False) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/controls.py����������������������������������������������������������0000644�0001750�0001750�00000024740�13112005742�021124� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Gdk, GObject from quodlibet import config from quodlibet import qltk from quodlibet import _ from quodlibet.util import connect_obj, connect_destroy from quodlibet.qltk.x import SymbolicIconImage, RadioMenuItem from quodlibet.qltk.seekbutton import SeekButton from quodlibet.util.dprint import print_e class Volume(Gtk.VolumeButton): def __init__(self, player): super(Volume, self).__init__(size=Gtk.IconSize.MENU, use_symbolic=True) # https://bugzilla.gnome.org/show_bug.cgi?id=781605 scales = qltk.find_widgets(self.get_popup(), Gtk.Scale) if scales: scales[0].props.round_digits = -1 self.set_relief(Gtk.ReliefStyle.NORMAL) self.set_adjustment(Gtk.Adjustment.new(0, 0, 1, 0.05, 0.1, 0)) popup = self.get_popup() if hasattr(Gtk, "Popover") and isinstance(popup, Gtk.Popover): popup.set_position(Gtk.PositionType.BOTTOM) self._id = self.connect('value-changed', self.__volume_changed, player) self._id2 = player.connect('notify::volume', self.__volume_notify) self._id3 = player.connect('notify::mute', self.__mute_notify) self._orig_icon_list = self.props.icons player.notify("volume") player.notify("mute") self.connect("event", self._on_button_event, player) replaygain_menu = VolumeMenu(player) self.connect('popup-menu', self.__popup, replaygain_menu) connect_obj(self, 'button-press-event', self.__volume_button_press, replaygain_menu, player) def __popup(self, widget, menu): time = Gtk.get_current_event_time() button = 3 qltk.popup_menu_under_widget(menu, widget, button, time) return True def __volume_button_press(self, menu, event, player): if event.type != Gdk.EventType.BUTTON_PRESS: return False if event.button == Gdk.BUTTON_SECONDARY: qltk.popup_menu_at_widget(menu, self, event.button, event.time) return True elif event.button == Gdk.BUTTON_MIDDLE: # toggle the muted state, if the backend doesn't support it # this action will just be ignored player.mute = not player.mute return True def __iadd__(self, v): self.set_value(self.get_value() + v) return self def __isub__(self, v): self.set_value(self.get_value() - v) return self def __volume_changed(self, button, volume, player): player.handler_block(self._id2) player.volume = volume ** 3.0 player.handler_unblock(self._id2) def __volume_notify(self, player, prop): self.handler_block(self._id) self.set_value(player.volume ** (1.0 / 3.0)) self.handler_unblock(self._id) def __mute_notify(self, player, prop): self._update_mute(player) def _update_mute(self, player): if player.mute: # remove all icons except the mute one to show a muted state # that is not affected by the volume slider self.props.icons = [self._orig_icon_list[0]] else: self.props.icons = self._orig_icon_list def _on_button_event(self, widget, event, player): # pulsesink doesn't emit volume changes when it's paused, but # fetching the value works. To prevent user volume changes based on a # false starting point update the slider on any action on the # volume button. self.handler_block(self._id) self.set_value(player.volume ** (1.0 / 3.0)) self.handler_unblock(self._id) # same with mute self._update_mute(player) class VolumeMenu(Gtk.Menu): __modes = ( ("auto", _("Auto_matic"), None), ("track", _("_Track Mode"), ["track"]), ("album", _("_Album Mode"), ["album", "track"]) ) def __init__(self, player): super(VolumeMenu, self).__init__() # ubuntu 12.04.. if hasattr(player, "bind_property"): # Translators: player state, no action item = Gtk.CheckMenuItem(label=_("_Mute"), use_underline=True) player.bind_property("mute", item, "active", GObject.BindingFlags.BIDIRECTIONAL) self.append(item) item.show() item = Gtk.MenuItem(label=_("_Replay Gain Mode"), use_underline=True) self.append(item) item.show() # Set replaygain mode as saved in configuration replaygain_mode = config.gettext("player", "replaygain_mode", "auto") self.__set_mode(player, replaygain_mode) rg = Gtk.Menu() rg.show() item.set_submenu(rg) item = None for mode, title, profile in self.__modes: item = RadioMenuItem(group=item, label=title, use_underline=True) rg.append(item) item.connect("toggled", self.__changed, player, mode) if replaygain_mode == mode: item.set_active(True) item.show() def __set_mode(self, player, mode): selected_mode = next((m for m in self.__modes if m[0] == mode), None) if selected_mode is None: print_e("Invalid selected replaygain mode: %r" % mode) selected_mode = self.__modes[0] print_e("Falling back to replaygain mode: %r" % selected_mode[0]) player.replaygain_profiles[0] = selected_mode[2] player.reset_replaygain() def __changed(self, item, player, mode): if item.get_active(): config.settext("player", "replaygain_mode", mode) self.__set_mode(player, mode) def popup(self, *args): gain = config.getboolean("player", "replaygain") for child in self.get_children(): child.set_sensitive(gain) return super(VolumeMenu, self).popup(*args) class PlayPauseButton(Gtk.Button): __gsignals__ = { 'toggled': (GObject.SignalFlags.RUN_LAST, None, tuple()), } def __init__(self): super(PlayPauseButton, self).__init__(relief=Gtk.ReliefStyle.NONE) self._pause_image = SymbolicIconImage("media-playback-pause", Gtk.IconSize.LARGE_TOOLBAR) self._play_image = SymbolicIconImage("media-playback-start", Gtk.IconSize.LARGE_TOOLBAR) self._set_active(False) self.connect("clicked", self._on_clicked) def _on_clicked(self, *args): self.set_active(not self.get_active()) def _set_active(self, is_active): if self.get_child(): self.remove(self.get_child()) if is_active: self.add(self._pause_image) else: self.add(self._play_image) self.get_child().show() self.emit("toggled") def set_active(self, is_active): if self.get_active() == is_active: return self._set_active(is_active) def get_active(self): return self.get_child() is self._pause_image class PlayControls(Gtk.VBox): def __init__(self, player, library): super(PlayControls, self).__init__(spacing=3) upper = Gtk.Table(n_rows=1, n_columns=3, homogeneous=True) upper.set_row_spacings(3) upper.set_col_spacings(3) prev = Gtk.Button(relief=Gtk.ReliefStyle.NONE) prev.add(SymbolicIconImage("media-skip-backward", Gtk.IconSize.LARGE_TOOLBAR)) upper.attach(prev, 0, 1, 0, 1) play = PlayPauseButton() upper.attach(play, 1, 2, 0, 1) next_ = Gtk.Button(relief=Gtk.ReliefStyle.NONE) next_.add(SymbolicIconImage("media-skip-forward", Gtk.IconSize.LARGE_TOOLBAR)) upper.attach(next_, 2, 3, 0, 1) lower = Gtk.Table(n_rows=1, n_columns=3, homogeneous=True) lower.set_row_spacings(3) lower.set_col_spacings(3) self.volume = Volume(player) self.volume.set_relief(Gtk.ReliefStyle.NONE) lower.attach(self.volume, 0, 1, 0, 1) # XXX: Adwaita defines a different padding for GtkVolumeButton # We force it to 0 here, which works because the other (normal) buttons # in the grid set the width/height qltk.add_css(self.volume, """ .button { padding: 0px; } """) seekbutton = SeekButton(player, library) seekbutton.set_relief(Gtk.ReliefStyle.NONE) lower.attach(seekbutton, 1, 3, 0, 1) self.pack_start(upper, False, True, 0) self.pack_start(lower, False, True, 0) connect_obj(prev, 'clicked', self.__previous, player) self._toggle_id = play.connect('toggled', self.__playpause, player) play.add_events(Gdk.EventMask.SCROLL_MASK) connect_obj(play, 'scroll-event', self.__scroll, player) connect_obj(next_, 'clicked', self.__next, player) connect_destroy( player, 'song-started', self.__song_started, next_, play) connect_destroy( player, 'paused', self.__on_set_paused_unpaused, play, False) connect_destroy( player, 'unpaused', self.__on_set_paused_unpaused, play, True) def __on_set_paused_unpaused(self, player, button, state): # block to prevent a signal cycle in case the paused signal and state # get out of sync (shouldn't happen.. but) button.handler_block(self._toggle_id) button.set_active(state) button.handler_unblock(self._toggle_id) def __scroll(self, player, event): if event.direction in [Gdk.ScrollDirection.UP, Gdk.ScrollDirection.LEFT]: player.previous() elif event.direction in [Gdk.ScrollDirection.DOWN, Gdk.ScrollDirection.RIGHT]: player.next() def __song_started(self, player, song, next, play): play.set_active(not player.paused) def __playpause(self, button, player): if button.get_active() and player.song is None: player.reset() button.set_active(not player.paused) else: player.paused = not button.get_active() def __previous(self, player): player.previous() def __next(self, player): player.next() ��������������������������������quodlibet-3.9.1/quodlibet/qltk/menubutton.py��������������������������������������������������������0000644�0001750�0001750�00000002550�13112005742�021454� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011, 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from . import add_css class MenuButton(Gtk.MenuButton): """TODO: remove. This used to be an implementation of Gtk.MenuButton when it wasn't available in gtk+ """ def __init__(self, widget=None, arrow=False, down=True): super(MenuButton, self).__init__() bbox = Gtk.HBox(spacing=3) if widget: bbox.pack_start(widget, True, True, 0) if arrow: arrow_type = Gtk.ArrowType.DOWN if down else Gtk.ArrowType.UP bbox.pack_start( Gtk.Arrow.new(arrow_type, Gtk.ShadowType.IN), True, True, 0) self.add(bbox) self.set_direction(Gtk.ArrowType.DOWN if down else Gtk.ArrowType.UP) def get_menu(self): return self.get_popup() def set_menu(self, menu): self.set_popup(menu) class SmallMenuButton(MenuButton): def __init__(self, *args, **kwargs): super(SmallMenuButton, self).__init__(*args, **kwargs) self.set_size_request(26, 26) add_css(self, """ * { padding: 0px 4px; } """) ��������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/__init__.py����������������������������������������������������������0000644�0001750�0001750�00000041220�13112005742�021010� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 2012 Christoph Reiter # 2016-17 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import signal import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GLib, GObject from senf import fsn2bytes, bytes2fsn from quodlibet.util import gdecode, print_d, print_w from quodlibet.compat import urlparse def show_uri(label, uri): """Shows a uri. The uri can be anything handled by GIO or a quodlibet specific one. Currently handled quodlibet uris: - quodlibet:///prefs/plugins/<plugin id> Args: label (str) uri (str) the uri to show Returns: True on success, False on error """ parsed = urlparse(uri) if parsed.scheme == "quodlibet": if parsed.netloc != "": print_w("Unknown QuodLibet URL format (%s)" % uri) return False else: return __show_quodlibet_uri(parsed) else: # Gtk.show_uri_on_window exists since 3.22 if hasattr(Gtk, "show_uri_on_window"): from quodlibet.qltk import get_top_parent return Gtk.show_uri_on_window(get_top_parent(label), uri, 0) else: return Gtk.show_uri(None, uri, 0) def __show_quodlibet_uri(uri): if uri.path.startswith("/prefs/plugins/"): from .pluginwin import PluginWindow print_d("Showing plugin prefs resulting from URI (%s)" % (uri, )) return PluginWindow().move_to(uri.path[len("/prefs/plugins/"):]) else: return False def get_fg_highlight_color(widget): """Returns a color useable for highlighting things on top of the standard background color. Args: widget (Gtk.Widget) Returns: Gdk.RGBA """ context = widget.get_style_context() if hasattr(Gtk.StateFlags, "LINK"): # gtk+ >=3.12 context.save() context.set_state(Gtk.StateFlags.LINK) color = context.get_color(context.get_state()) context.restore() else: value = GObject.Value() value.init(Gdk.Color) value.set_boxed(None) context.get_style_property("link-color", value) color = Gdk.RGBA() old_color = value.get_boxed() if old_color is not None: color.parse(old_color.to_string()) return color def get_primary_accel_mod(): """Returns the primary Gdk.ModifierType modifier. cmd on osx, ctrl everywhere else. """ return Gtk.accelerator_parse("<Primary>")[1] def redraw_all_toplevels(): """A hack to trigger redraws for all windows and widgets.""" for widget in Gtk.Window.list_toplevels(): if not widget.get_realized(): continue if widget.is_active(): widget.queue_draw() continue sensitive = widget.get_sensitive() widget.set_sensitive(not sensitive) widget.set_sensitive(sensitive) def selection_set_songs(selection_data, songs): """Stores filenames of the passed songs in a Gtk.SelectionData""" filenames = [] for filename in (song["~filename"] for song in songs): filenames.append(fsn2bytes(filename, "utf-8")) type_ = Gdk.atom_intern("text/x-quodlibet-songs", True) selection_data.set(type_, 8, b"\x00".join(filenames)) def selection_get_filenames(selection_data): """Extracts the filenames of songs set with selection_set_songs() from a Gtk.SelectionData. """ data_type = selection_data.get_data_type() assert data_type.name() == "text/x-quodlibet-songs" items = selection_data.get_data().split(b"\x00") return [bytes2fsn(i, "utf-8") for i in items] def get_top_parent(widget): """Return the ultimate parent of a widget; the assumption that code using this makes is that it will be a Gtk.Window, i.e. the widget is fully packed when this is called.""" parent = widget and widget.get_toplevel() if parent and parent.is_toplevel(): return parent else: return None def get_menu_item_top_parent(widget): """Returns the toplevel for a menu item or None if the menu and none of its parents isn't attached to a widget """ while isinstance(widget, Gtk.MenuItem): menu = widget.get_parent() if not menu: return widget = menu.get_attach_widget() return get_top_parent(widget) def find_widgets(widget, type_): """Given a widget, find all children that are a subclass of type_ (including itself) Args: widget (Gtk.Widget) type_ (type) Returns: List[Gtk.Widget] """ found = [] if isinstance(widget, type_): found.append(widget) if isinstance(widget, Gtk.Container): for child in widget.get_children(): found.extend(find_widgets(child, type_)) return found def menu_popup(menu, shell, item, func, *args): """Wrapper to fix API break: https://git.gnome.org/browse/gtk+/commit/?id=8463d0ee62b4b22fa """ if func is not None: def wrap_pos_func(menu, *args): return func(menu, args[-1]) else: wrap_pos_func = None return menu.popup(shell, item, wrap_pos_func, *args) def _popup_menu_at_widget(menu, widget, button, time, under): def pos_func(menu, data, widget=widget): screen = widget.get_screen() ref = get_top_parent(widget) menu.set_screen(screen) x, y = widget.translate_coordinates(ref, 0, 0) dx, dy = ref.get_window().get_origin()[1:] wa = widget.get_allocation() # fit menu to screen, aligned per text direction screen_width = screen.get_width() screen_height = screen.get_height() menu.realize() ma = menu.get_allocation() menu_y_under = y + dy + wa.height menu_y_above = y + dy - ma.height if under: menu_y = menu_y_under if menu_y + ma.height > screen_height and menu_y_above > 0: menu_y = menu_y_above else: menu_y = menu_y_above if menu_y < 0 and menu_y_under + ma.height < screen_height: menu_y = menu_y_under if Gtk.Widget.get_default_direction() == Gtk.TextDirection.LTR: menu_x = min(x + dx, screen_width - ma.width) else: menu_x = max(0, x + dx - ma.width + wa.width) return (menu_x, menu_y, True) # x, y, move_within_screen menu_popup(menu, None, None, pos_func, None, button, time) def _ensure_menu_attached(menu, widget): assert widget is not None # Workaround the menu inheriting the wrong colors with the Ubuntu 12.04 # default themes. Attaching to the parent kinda works... submenus still # have the wrong color. if isinstance(widget, Gtk.Button): widget = widget.get_parent() or widget attached_widget = menu.get_attach_widget() if attached_widget is widget: return if attached_widget is not None: menu.detach() menu.attach_to_widget(widget, None) def popup_menu_under_widget(menu, widget, button, time): _ensure_menu_attached(menu, widget) _popup_menu_at_widget(menu, widget, button, time, True) def popup_menu_above_widget(menu, widget, button, time): _ensure_menu_attached(menu, widget) _popup_menu_at_widget(menu, widget, button, time, False) def popup_menu_at_widget(menu, widget, button, time): _ensure_menu_attached(menu, widget) menu_popup(menu, None, None, None, None, button, time) def add_fake_accel(widget, accel): """Accelerators are only for window menus and global keyboard shortcuts. Since we want to use them in context menus as well, to indicate which key events the parent widget knows about, we use a global fake accelgroup without any actions.. """ if not hasattr(add_fake_accel, "_group"): add_fake_accel._group = Gtk.AccelGroup() group = add_fake_accel._group key, val = Gtk.accelerator_parse(accel) assert key is not None assert val is not None widget.add_accelerator( 'activate', group, key, val, Gtk.AccelFlags.VISIBLE) def is_accel(event, *accels): """Checks if the given keypress Gdk.Event matches any of accelerator strings. example: is_accel(event, "<shift><ctrl>z") Args: *accels: one ore more `str` Returns: bool Raises: ValueError: in case any of the accels could not be parsed """ assert accels if event.type != Gdk.EventType.KEY_PRESS: return False # ctrl+shift+x gives us ctrl+shift+X and accelerator_parse returns # lowercase values for matching, so lowercase it if possible keyval = event.keyval if not keyval & ~0xFF: keyval = ord(chr(keyval).lower()) default_mod = Gtk.accelerator_get_default_mod_mask() keymap = Gdk.Keymap.get_default() for accel in accels: accel_keyval, accel_mod = Gtk.accelerator_parse(accel) if accel_keyval == 0 and accel_mod == 0: raise ValueError("Invalid accel: %s" % accel) # If the accel contains non default modifiers matching will # never work and since no one should use them, complain non_default = accel_mod & ~default_mod if non_default: print_w("Accelerator '%s' contains a non default modifier '%s'." % (accel, Gtk.accelerator_name(0, non_default) or "")) # event.state contains the real mod mask + the virtual one, while # we usually pass only virtual one as text. This adds the real one # so they match in the end. accel_mod = keymap.map_virtual_modifiers(accel_mod)[1] # Remove everything except default modifiers and compare if (accel_keyval, accel_mod) == (keyval, event.state & default_mod): return True return False def add_css(widget, css): """Add css for the widget, overriding the theme. Can raise GLib.GError in case the css is invalid """ if not isinstance(css, bytes): css = css.encode("utf-8") provider = Gtk.CssProvider() provider.load_from_data(css) context = widget.get_style_context() context.add_provider(provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) def remove_padding(widget): """Removes padding on supplied widget""" return add_css(widget, " * { padding: 0px; } ") def is_wayland(): # FIXME: Is there no better way? display = Gdk.Display.get_default() if display: return display.get_name() == "Wayland" return False def get_backend_name(): """The GDK backend name""" display = Gdk.Display.get_default() if display is not None: name = gdecode(display.__gtype__.name) if name.startswith("Gdk"): name = name[3:] if name.endswith("Display"): name = name[:-7] return name return u"Unknown" gtk_version = (Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) try: pygobject_version = gi.version_info except AttributeError: # older gi versions try: pygobject_version = gi._gobject.pygobject_version except AttributeError: pygobject_version = (-1,) def io_add_watch(fd, prio, condition, func, *args, **kwargs): try: # The new gir bindings don't fail with an invalid fd, # and we can't do the same with the static ones (return a valid # source ID..) so fail with newer pygobject as well. if isinstance(fd, int) and fd < 0: raise ValueError("invalid fd") elif hasattr(fd, "fileno") and fd.fileno() < 0: raise ValueError("invalid fd") return GLib.io_add_watch(fd, prio, condition, func, *args, **kwargs) except TypeError: # older pygi kwargs["priority"] = prio return GLib.io_add_watch(fd, condition, func, *args, **kwargs) def add_signal_watch(signal_action): """Catches signals which should exit the program and calls `signal_action` after the main loop has started, even if the signal occurred before the main loop has started. """ sig_names = ["SIGINT", "SIGTERM", "SIGHUP"] if os.name == "nt": sig_names = ["SIGINT", "SIGTERM"] signals = {} for name in sig_names: id_ = getattr(signal, name, None) if id_ is None: continue signals[id_] = name # in case Python catches a signal, wake up the mainloop. # this makes signal handling work with older pygobject/glib (Ubuntu 12.04) # no idea why.. rfd, wfd = os.pipe() def wakeup_notify(source, condition): # just read and do nothing so we can keep the watch around if condition == GLib.IO_IN: try: os.read(rfd, 1) except EnvironmentError: pass return True else: return False try: import fcntl except ImportError: pass else: fcntl.fcntl(wfd, fcntl.F_SETFL, os.O_NONBLOCK) signal.set_wakeup_fd(wfd) io_add_watch(rfd, GLib.PRIORITY_HIGH, GLib.IO_IN | GLib.IO_ERR | GLib.IO_HUP, wakeup_notify) # set a python handler for each signal, used before the mainloop for signum, name in signals.items(): # Before the mainloop starts we catch signals in python # directly and idle_add the app.quit def idle_handler(signum, frame): print_d("Python signal handler activated: %s" % signals[signum]) GLib.idle_add(signal_action, priority=GLib.PRIORITY_HIGH) print_d("Register Python signal handler: %r" % name) signal.signal(signum, idle_handler) if os.name == "nt": return # also try to use the official glib handling if available, # can't hurt I guess unix_signal_add = None if hasattr(GLib, "unix_signal_add"): unix_signal_add = GLib.unix_signal_add elif hasattr(GLib, "unix_signal_add_full"): unix_signal_add = GLib.unix_signal_add_full else: print_d("Can't install GLib signal handler, too old gi or wrong OS") return for signum, name in signals.items(): def handler(signum): print_d("GLib signal handler activated: %s" % signals[signum]) signal_action() print_d("Register GLib signal handler: %r" % name) unix_signal_add(GLib.PRIORITY_HIGH, signum, handler, signum) class ThemeOverrider(object): """Allows registering global Gtk.StyleProviders for a specific theme. They get activated when the theme gets active and removed when the theme changes to something else. """ def __init__(self): self._providers = {} self._active_providers = [] settings = Gtk.Settings.get_default() settings.connect("notify::gtk-theme-name", self._on_theme_name_notify) self._update_providers() def register_provider(self, theme_name, provider): """ Args: theme_name (str): A gtk+ theme name e.g. "Adwaita" or empty to apply to all themes provider (Gtk.StyleProvider) """ self._providers.setdefault(theme_name, []).append(provider) self._update_providers() def _update_providers(self): settings = Gtk.Settings.get_default() theme_name = settings.get_property("gtk-theme-name") wanted_providers = \ self._providers.get(theme_name, []) + self._providers.get("", []) for provider in list(self._active_providers): if provider not in wanted_providers: Gtk.StyleContext.remove_provider_for_screen( Gdk.Screen.get_default(), provider) self._active_providers.remove(provider) for provider in wanted_providers: if provider not in self._active_providers: Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) self._active_providers.append(provider) def _on_theme_name_notify(self, settings, gparam): self._update_providers() from .msg import Message, ErrorMessage, WarningMessage from .x import Align, Button, ToggleButton, Notebook, SeparatorMenuItem, \ WebImage, MenuItem, Frame, EntryCompletion from .icons import Icons from .window import Window, UniqueWindow, Dialog from .paned import ConfigRPaned, ConfigRHPaned Message, ErrorMessage, WarningMessage Align, Button, ToggleButton, Notebook, SeparatorMenuItem, \ WebImage, MenuItem, Frame, EntryCompletion Icons Window, UniqueWindow, Dialog ConfigRPaned, ConfigRHPaned ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/songlistcolumns.py���������������������������������������������������0000644�0001750�0001750�00000035700�13112005742�022522� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # 2012 Christoph Reiter # 2011-2014 Nick Boultbee # 2014 Jan Path # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import time import datetime from gi.repository import Gtk, Pango, GLib from senf import fsnative, fsn2text from quodlibet import _ from quodlibet import util from quodlibet import config from quodlibet.pattern import Pattern from quodlibet.qltk.views import TreeViewColumnButton from quodlibet.qltk import add_css from quodlibet.util.path import unexpand from quodlibet.formats._audio import FILESYSTEM_TAGS from quodlibet.compat import text_type, string_types, listvalues, listitems def create_songlist_column(t): """Returns a SongListColumn instance for the given tag""" if t in ["~#added", "~#mtime", "~#lastplayed", "~#laststarted"]: return DateColumn(t) elif t in ["~length", "~#length"]: return LengthColumn() elif t == "~#filesize": return FilesizeColumn() elif t in ["~rating"]: return RatingColumn() elif t.startswith("~#"): return NumericColumn(t) elif t in FILESYSTEM_TAGS: return FSColumn(t) elif "<" in t: return PatternColumn(t) elif "~" not in t and t != "title": return NonSynthTextColumn(t) else: return WideTextColumn(t) def _highlight_current_cell(cr, background_area, cell_area, flags): """Draws a 'highlighting' background for the cell. Look depends on the active theme. """ # Use drawing code/CSS for Entry (reason being that it looks best here) dummy_widget = Gtk.Entry() style_context = dummy_widget.get_style_context() style_context.save() # Make it less prominent state = Gtk.StateFlags.INSENSITIVE | Gtk.StateFlags.BACKDROP style_context.set_state(state) color = style_context.get_border_color(state) add_css(dummy_widget, "* { border-color: rgba(%d, %d, %d, 0.3); }" % ( color.red * 255, color.green * 255, color.blue * 255)) ba = background_area ca = cell_area # Draw over the left and right border so we don't see the rounded corners # and borders. Use height for the overshoot as rounded corners + border # should never be larger than the height.. # Ideally we would draw over the whole background but the cell area only # redraws the cell_area so we get leftover artifacts if we draw # above/below. draw_area = (ba.x - ca.height, ca.y, ba.width + ca.height * 2, ca.height) cr.save() cr.new_path() cr.rectangle(ba.x, ca.y, ba.width, ca.height) cr.clip() Gtk.render_background(style_context, cr, *draw_area) Gtk.render_frame(style_context, cr, *draw_area) cr.restore() style_context.restore() class SongListCellAreaBox(Gtk.CellAreaBox): highlight = False def do_render(self, context, widget, cr, background_area, cell_area, flags, paint_focus): if self.highlight and not flags & Gtk.CellRendererState.SELECTED: _highlight_current_cell(cr, background_area, cell_area, flags) return Gtk.CellAreaBox.do_render( self, context, widget, cr, background_area, cell_area, flags, paint_focus) def do_apply_attributes(self, tree_model, iter_, is_expander, is_expanded): self.highlight = tree_model.get_path(iter_) == tree_model.current_path return Gtk.CellAreaBox.do_apply_attributes( self, tree_model, iter_, is_expander, is_expanded) class SongListColumn(TreeViewColumnButton): def __init__(self, tag): """tag e.g. 'artist'""" title = self._format_title(tag) super(SongListColumn, self).__init__( title=title, cell_area=SongListCellAreaBox()) self.set_tooltip_text(title) self.header_name = tag self.set_sizing(Gtk.TreeViewColumnSizing.FIXED) self.set_visible(True) self.set_sort_indicator(False) self._last_rendered = None def _format_title(self, tag): """Format the column title based on the tag""" return util.tag(tag) def _needs_update(self, value): """Call to check if the last passed value was the same. This is used to reduce formatting if the input is the same either because of redraws or all columns have the same value """ if self._last_rendered == value: return False self._last_rendered = value return True class TextColumn(SongListColumn): """Base text column""" def __init__(self, tag): super(TextColumn, self).__init__(tag) self._render = Gtk.CellRendererText() self.pack_start(self._render, True) self.set_cell_data_func(self._render, self._cdf) self.set_clickable(True) # We check once in a while if the font size has changed. If it has # we reset the min/fixed width and force at least one cell to update # (which might trigger other column size changes..) self._last_width = None self._force_update = False self._deferred_width_check = util.DeferredSignal( self._check_width_update, timeout=500) def on_tv_changed(column, old, new): if new is None: self._deferred_width_check.abort() else: self._deferred_width_check.call() self.connect("tree-view-changed", on_tv_changed) def _get_min_width(self): return -1 def _cell_width(self, text): """Returns the column width needed for the passed text""" widget = self.get_tree_view() assert widget is not None layout = widget.create_pango_layout(text) text_width = layout.get_pixel_size()[0] cell_pad = self._render.get_property('xpad') return text_width + 8 + cell_pad def _check_width_update(self): width = self._cell_width(u"abc 123") if self._last_width == width: self._force_update = False return self._last_width = width self._force_update = True self.queue_resize() def _needs_update(self, value): return self._force_update or \ super(TextColumn, self)._needs_update(value) def _cdf(self, column, cell, model, iter_, user_data): self._deferred_width_check() if self._force_update: min_width = self._get_min_width() self.set_min_width(min_width) if not self.get_resizable(): self.set_fixed_width(min_width) # calling it in the cell_data_func leads to broken drawing.. GLib.idle_add(self.queue_resize) value = self._fetch_value(model, iter_) if not self._needs_update(value): return self._apply_value(model, iter_, cell, value) def _fetch_value(self, model, iter_): """Should return everything needed for formating the final value""" raise NotImplementedError def _apply_value(self, model, iter_, cell, value): """Should format the value and set it on the cell renderer""" raise NotImplementedError class RatingColumn(TextColumn): """Render ~rating directly (simplifies filtering, saves a function call). """ def __init__(self, *args, **kwargs): super(RatingColumn, self).__init__("~rating", *args, **kwargs) self.set_expand(False) self.set_resizable(False) def _get_min_width(self): return self._cell_width(util.format_rating(1.0)) def _fetch_value(self, model, iter_): song = model.get_value(iter_) rating = song.get("~#rating") default = config.RATINGS.default return (rating, default) def _apply_value(self, model, iter_, cell, value): rating, default = value cell.set_sensitive(rating is not None) value = rating if rating is not None else default cell.set_property('text', util.format_rating(value)) class WideTextColumn(TextColumn): """Resizable and ellipsized at the end. Used for any key with a '~' in it, and 'title'. """ def __init__(self, *args, **kwargs): super(WideTextColumn, self).__init__(*args, **kwargs) self._render.set_property('ellipsize', Pango.EllipsizeMode.END) self.set_resizable(True) def _get_min_width(self): return self._cell_width("000") def _fetch_value(self, model, iter_): return model.get_value(iter_).comma(self.header_name) def _apply_value(self, model, iter_, cell, value): cell.set_property('text', value) class DateColumn(WideTextColumn): """The '~#' keys that are dates.""" def _fetch_value(self, model, iter_): return model.get_value(iter_)(self.header_name) def _apply_value(self, model, iter_, cell, stamp): if not stamp: cell.set_property('text', _("Never")) else: date = datetime.datetime.fromtimestamp(stamp).date() today = datetime.datetime.now().date() days = (today - date).days if days == 0: format_ = "%X" elif days < 7: format_ = "%A" else: format_ = "%x" stamp = time.localtime(stamp) text = time.strftime(format_, stamp) cell.set_property('text', text) class NonSynthTextColumn(WideTextColumn): """Optimize for non-synthesized keys by grabbing them directly. Used for any tag without a '~' except 'title'. """ def _fetch_value(self, model, iter_): return model.get_value(iter_).get(self.header_name, "") def _apply_value(self, model, iter_, cell, value): cell.set_property('text', value.replace("\n", ", ")) class FSColumn(WideTextColumn): """Contains text in the filesystem encoding, so needs to be decoded safely (and also more slowly). """ def __init__(self, *args, **kwargs): super(FSColumn, self).__init__(*args, **kwargs) self._render.set_property('ellipsize', Pango.EllipsizeMode.MIDDLE) def _fetch_value(self, model, iter_): values = model.get_value(iter_).list(self.header_name) return values[0] if values else fsnative(u"") def _apply_value(self, model, iter_, cell, value): cell.set_property('text', fsn2text(unexpand(value))) class PatternColumn(WideTextColumn): def __init__(self, *args, **kwargs): super(PatternColumn, self).__init__(*args, **kwargs) try: self._pattern = Pattern(self.header_name) except ValueError: self._pattern = None def _format_title(self, tag): return util.pattern(tag) def _fetch_value(self, model, iter_): song = model.get_value(iter_) if self._pattern is not None: return self._pattern % song return u"" def _apply_value(self, model, iter_, cell, value): cell.set_property('text', value) class NumericColumn(TextColumn): """Any '~#' keys except dates.""" def __init__(self, *args, **kwargs): super(NumericColumn, self).__init__(*args, **kwargs) self._render.set_property('xalign', 1.0) self.set_alignment(1.0) self.set_expand(False) self.set_resizable(False) self._texts = {} self._timeout = None def on_tv_changed(column, old, new): if new is None and self._timeout is not None: GLib.source_remove(self._timeout) self._timeout = None self.connect("tree-view-changed", on_tv_changed) def _get_min_width(self): """Give the initial and minimum width. override if needed""" # Best efforts for the general minimum width case # Allows well for >=1000 Kbps, -12.34 dB RG values, "Length" etc return self._cell_width("-22.22") def _fetch_value(self, model, iter_): return model.get_value(iter_).comma(self.header_name) def _apply_value(self, model, iter_, cell, value): if isinstance(value, float): text = u"%.2f" % round(value, 2) else: text = text_type(value) cell.set_property('text', text) self._recalc_width(model.get_path(iter_), text) def _delayed_recalc(self): self._timeout = None tv = self.get_tree_view() assert tv is not None range_ = tv.get_visible_range() if not range_: return start, end = range_ start = start[0] end = end[0] # compute the cell width for all drawn cells in range +/- 3 for key, value in listitems(self._texts): if not (start - 3) <= key <= (end + 3): del self._texts[key] elif isinstance(value, string_types): self._texts[key] = self._cell_width(value) # resize if too small or way too big and above the minimum width = self.get_width() needed_width = max([self._get_min_width()] + listvalues(self._texts)) if width < needed_width: self._resize(needed_width) elif width - needed_width >= self._cell_width("0"): self._resize(needed_width) def _resize(self, width): # In case the treeview has no other expanding columns, setting the # width will have no effect on the actual width. Calling queue_resize() # in that case would result in an endless recalc loop. So stop here. if width == self.get_fixed_width() and width == self.get_max_width(): return self.set_fixed_width(width) self.set_max_width(width) self.queue_resize() def _recalc_width(self, path, text): self._texts[path[0]] = text if self._timeout is not None: GLib.source_remove(self._timeout) self._timeout = None self._timeout = GLib.idle_add(self._delayed_recalc, priority=GLib.PRIORITY_LOW) class LengthColumn(NumericColumn): def __init__(self): super(LengthColumn, self).__init__("~#length") def _get_min_width(self): # 1:22:22, allows entire albums as files (< 75mins) return self._cell_width(util.format_time_display(60 * 82 + 22)) def _fetch_value(self, model, iter_): return model.get_value(iter_).get("~#length", 0) def _apply_value(self, model, iter_, cell, value): text = util.format_time_display(value) cell.set_property('text', text) self._recalc_width(model.get_path(iter_), text) class FilesizeColumn(NumericColumn): def __init__(self): super(FilesizeColumn, self).__init__("~#filesize") def _get_min_width(self): # e.g "2.22 MB" return self._cell_width(util.format_size(2.22 * (1024 ** 2))) def _fetch_value(self, model, iter_): return model.get_value(iter_).get("~#filesize", 0) def _apply_value(self, model, iter_, cell, value): text = util.format_size(value) cell.set_property('text', text) self._recalc_width(model.get_path(iter_), text) ����������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/models.py������������������������������������������������������������0000644�0001750�0001750�00000020127�13112005742�020537� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013, 2014 Christoph Reiter # 2015, 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GObject from quodlibet.compat import integer_types, string_types, cmp _auto_types = [float, bool, GObject.Object] _auto_types.extend(integer_types) _auto_types.extend(string_types) def _gets_marshaled_to_pyobject(obj, _types=tuple(_auto_types)): """Python objects get automarshalled to GValues which is faster than doing it in python but also has its own mapping, because it doesn't know the column type of the model. This returns if the python objects get marshalled to PYOBJECT by the C code. The GType logic can be found in 'pyg_type_from_object_strict' in PyGObject. """ if obj is None: return False return not isinstance(obj, _types) class _ModelMixin(object): ATOMIC = True """Guard against unintentional non-atomic row inserts. Set to False if you know what you're doing. """ def get_value(self, iter_, column=0, _base=Gtk.TreeModel.get_value): return _base(self, iter_, column) def get_n_columns(self): return 1 def iter_changed(self, iter_): """Like row_changed(), but only needs a Gtk.TreeIter""" self.row_changed(self.get_path(iter_), iter_) def path_changed(self, path): """Like row_changed(), but only needs a Gtk.TreePath""" self.row_changed(path, self.get_iter(path)) def itervalues(self, iter_=None): """Yields all values""" iter_ = self.iter_children(iter_) getv = self.get_value inext = self.iter_next while iter_: yield getv(iter_) iter_ = inext(iter_) def values(self): """Largely for PY2 -> PY3 compatibility""" return list(self.itervalues()) def iterrows(self, iter_=None): """Yields (iter, value) tuples""" iter_ = self.iter_children(iter_) getv = self.get_value inext = self.iter_next while iter_: yield iter_, getv(iter_) iter_ = inext(iter_) def is_empty(self): return not self.get_iter_first() _value = GObject.Value() _value.init(GObject.TYPE_PYOBJECT) def _get_marshalable(self, obj, _value=_value): if _gets_marshaled_to_pyobject(obj): return obj _value.set_boxed(obj) return _value del _value class ObjectModelFilter(_ModelMixin, Gtk.TreeModelFilter): pass class ObjectModelSort(_ModelMixin, Gtk.TreeModelSort): pass class ObjectTreeStore(_ModelMixin, Gtk.TreeStore): def __init__(self, *args): if len(args) > 1: raise ValueError if args and object not in args and GObject.TYPE_PYOBJECT not in args: raise ValueError if not args: args = [object] super(ObjectTreeStore, self).__init__(*args) def append(self, parent, row=None): if row is not None: value = self._get_marshalable(row[0]) return self.insert_with_values(parent, -1, [0], [value]) else: assert not self.ATOMIC return super(ObjectTreeStore, self).append(parent) def insert(self, parent, position, row=None): if row is not None: value = self._get_marshalable(row[0]) return self.insert_with_values(parent, position, [0], [value]) else: assert not self.ATOMIC return super(ObjectTreeStore, self).insert(parent, position) def prepend(self, parent, row=None): return self.insert(parent, 0, row) def insert_before(self, parent, sibling, row=None): if row is not None: value = self._get_marshalable(row[0]) if sibling is None: position = -1 else: position = self.get_path(sibling)[-1] return self.insert_with_values(parent, position, [0], [value]) assert not self.ATOMIC return super(ObjectTreeStore, self).insert_before(parent, sibling) def insert_after(self, parent, sibling, row=None): if row is not None: value = self._get_marshalable(row[0]) if sibling is None: position = 0 else: position = self.get_path(sibling)[-1] + 1 return self.insert_with_values(parent, position, [0], [value]) assert not self.ATOMIC return super(ObjectTreeStore, self).insert_after(parent, sibling) class ObjectStore(_ModelMixin, Gtk.ListStore): """Like a ListStore but only supports single column object lists Performance related API additions: - append_many(), insert_many() - itervalues() """ @staticmethod def _sort_on_value(m, a, b, data): """Sorts two items in an ObjectStore, suitable for passing to `set_default_sort_func`""" return cmp(m[a][0], m[b][0]) def __init__(self, *args): if len(args) > 1: raise ValueError if args and object not in args and GObject.TYPE_PYOBJECT not in args: raise ValueError if not args: args = [object] super(ObjectStore, self).__init__(*args) def append(self, row=None): if row: value = self._get_marshalable(row[0]) return self.insert_with_valuesv(-1, [0], [value]) else: assert not self.ATOMIC return super(ObjectStore, self).append(row) def insert(self, position, row=None): if row: value = self._get_marshalable(row[0]) return self.insert_with_valuesv(position, [0], [value]) else: assert not self.ATOMIC return super(ObjectStore, self).insert(position) def iter_append_many(self, objects): """Append a list of python objects, yield iters""" insert_with_valuesv = self.insert_with_valuesv get_marshalable = self._get_marshalable columns = [0] try: first = next(objects) except TypeError: first = next(iter(objects)) else: value = get_marshalable(first) yield insert_with_valuesv(-1, columns, [value]) # fast path for auto-marshalling if _gets_marshaled_to_pyobject(first): for obj in objects: yield insert_with_valuesv(-1, columns, [obj]) else: for obj in objects: value = get_marshalable(obj) yield insert_with_valuesv(-1, columns, [value]) def append_many(self, objects): """Append a list of python objects""" for i in self.iter_append_many(objects): pass def insert_many(self, position, objects): if position == -1 or position > len(self): self.append_many(objects) return insert_with_valuesv = self.insert_with_valuesv get_marshalable = self._get_marshalable columns = [0] for i, obj in enumerate(objects): value = get_marshalable(obj) insert_with_valuesv(position + i, columns, [value]) def insert_before(self, sibling, row=None): if row is not None: value = self._get_marshalable(row[0]) if sibling is None: position = -1 else: position = self.get_path(sibling)[0] return self.insert_with_valuesv(position, [0], [value]) assert not self.ATOMIC return super(ObjectStore, self).insert_before(sibling) def insert_after(self, sibling, row=None): if row is not None: value = self._get_marshalable(row[0]) if sibling is None: position = 0 else: position = self.get_path(sibling)[0] + 1 return self.insert_with_valuesv(position, [0], [value]) assert not self.ATOMIC return super(ObjectStore, self).insert_after(sibling, row) def prepend(self, row=None): return self.insert(0, row) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/msg.py���������������������������������������������������������������0000644�0001750�0001750�00000006567�13112005742�020056� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from senf import fsn2text, path2fsn from quodlibet import _ from quodlibet import util from quodlibet.qltk.icons import Icons from quodlibet.qltk import get_top_parent from quodlibet.qltk.window import Dialog class Message(Gtk.MessageDialog, Dialog): """A message dialog that destroys itself after it is run, uses markup, and defaults to an 'OK' button.""" def __init__( self, kind, parent, title, description, buttons=Gtk.ButtonsType.OK): parent = get_top_parent(parent) text = ("<span weight='bold' size='larger'>%s</span>\n\n%s" % (title, description)) super(Message, self).__init__( transient_for=parent, modal=True, destroy_with_parent=True, message_type=kind, buttons=buttons) self.set_markup(text) def run(self, destroy=True): resp = super(Message, self).run() if destroy: self.destroy() return resp class CancelRevertSave(Gtk.MessageDialog, Dialog): def __init__(self, parent): title = _("Discard tag changes?") description = _("Tags have been changed but not saved. Save these " "files, or revert and discard changes?") text = ("<span weight='bold' size='larger'>%s</span>\n\n%s" % (title, description)) parent = get_top_parent(parent) super(CancelRevertSave, self).__init__( transient_for=parent, flags=0, message_type=Gtk.MessageType.WARNING, buttons=Gtk.ButtonsType.NONE) self.add_icon_button(_("_Save"), Icons.DOCUMENT_SAVE, Gtk.ResponseType.YES) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Revert"), Icons.DOCUMENT_REVERT, Gtk.ResponseType.NO) self.set_default_response(Gtk.ResponseType.NO) self.set_markup(text) def run(self): resp = super(CancelRevertSave, self).run() self.destroy() return resp class ErrorMessage(Message): """Like Message, but uses an error-indicating picture.""" def __init__(self, *args, **kwargs): super(ErrorMessage, self).__init__( Gtk.MessageType.ERROR, *args, **kwargs) class WarningMessage(Message): """Like Message, but uses an warning-indicating picture.""" def __init__(self, *args, **kwargs): super(WarningMessage, self).__init__( Gtk.MessageType.WARNING, *args, **kwargs) class ConfirmFileReplace(WarningMessage): RESPONSE_REPLACE = 1 def __init__(self, parent, path): title = _("File exists") fn_format = "<b>%s</b>" % util.escape(fsn2text(path2fsn(path))) description = _("Replace %(file-name)s?") % {"file-name": fn_format} super(ConfirmFileReplace, self).__init__( parent, title, description, buttons=Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(_("_Replace File"), Icons.DOCUMENT_SAVE, self.RESPONSE_REPLACE) self.set_default_response(Gtk.ResponseType.CANCEL) �����������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/queue.py�������������������������������������������������������������0000644�0001750�0001750�00000027355�13115325606�020421� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2016-2017 Nick Boultbee # 2017 Fredrik Strupe # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk, Gdk, Pango import quodlibet from quodlibet import ngettext, _ from quodlibet import config from quodlibet import util from quodlibet import qltk from quodlibet import app from quodlibet.util import connect_destroy, format_time_preferred from quodlibet.qltk import Icons, gtk_version, add_css from quodlibet.qltk.ccb import ConfigCheckMenuItem from quodlibet.qltk.songlist import SongList, DND_QL, DND_URI_LIST from quodlibet.qltk.songsmenu import SongsMenu from quodlibet.qltk.menubutton import SmallMenuButton from quodlibet.qltk.songmodel import PlaylistModel from quodlibet.qltk.playorder import OrderInOrder, OrderShuffle from quodlibet.qltk.x import ScrolledWindow, SymbolicIconImage, \ SmallImageButton, MenuItem QUEUE = os.path.join(quodlibet.get_user_dir(), "queue") class PlaybackStatusIcon(Gtk.Box): """A widget showing a play/pause/stop symbolic icon""" def __init__(self): super(PlaybackStatusIcon, self).__init__() self._icons = {} def _set(self, name): if name not in self._icons: image = SymbolicIconImage(name, Gtk.IconSize.MENU) self._icons[name] = image image.show() else: image = self._icons[name] children = self.get_children() if children: self.remove(children[0]) self.add(image) def play(self): self._set("media-playback-start") def stop(self): self._set("media-playback-stop") def pause(self): self._set("media-playback-pause") class ExpandBoxHack(Gtk.HBox): def do_get_preferred_width(self): # Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=765602 # set_label_fill() no longer works since 3.20. Fake a natural size # which is larger than the expander can be to force the parent to # allocate to us the whole space. min_, nat = Gtk.HBox.do_get_preferred_width(self) if gtk_version > (3, 19): # if we get too large gtk calcs will overflow.. nat = max(nat, 2 ** 16) return (min_, nat) class QueueExpander(Gtk.Expander): def __init__(self, library, player): super(QueueExpander, self).__init__(spacing=3) sw = ScrolledWindow() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) self.queue = PlayQueue(library, player) self.queue.props.expand = True sw.add(self.queue) add_css(self, ".ql-expanded title { margin-bottom: 5px; }") outer = ExpandBoxHack() left = Gtk.HBox(spacing=12) hb2 = Gtk.HBox(spacing=3) state_icon = PlaybackStatusIcon() state_icon.stop() state_icon.show() hb2.pack_start(state_icon, True, True, 0) name_label = Gtk.Label(label=_("_Queue"), use_underline=True) name_label.set_size_request(-1, 24) hb2.pack_start(name_label, True, True, 0) left.pack_start(hb2, False, True, 0) menu = Gtk.Menu() self.count_label = count_label = Gtk.Label() self.count_label.set_property("ellipsize", Pango.EllipsizeMode.END) self.count_label.set_width_chars(10) self.count_label.get_style_context().add_class("dim-label") left.pack_start(count_label, False, True, 0) outer.pack_start(left, True, True, 0) self.set_label_fill(True) rand_checkbox = ConfigCheckMenuItem( _("_Random"), "memory", "shufflequeue", populate=True) rand_checkbox.connect('toggled', self.__queue_shuffle) self.set_shuffled(rand_checkbox.get_active()) menu.append(rand_checkbox) stop_checkbox = ConfigCheckMenuItem( _("Stop Once Empty"), "memory", "queue_stop_once_empty", populate=True) menu.append(stop_checkbox) clear_item = MenuItem(_("_Clear Queue"), Icons.EDIT_CLEAR) menu.append(clear_item) clear_item.connect("activate", self.__clear_queue) button = SmallMenuButton( SymbolicIconImage(Icons.EMBLEM_SYSTEM, Gtk.IconSize.MENU), arrow=True) button.set_relief(Gtk.ReliefStyle.NONE) button.show_all() button.hide() button.set_no_show_all(True) menu.show_all() button.set_menu(menu) outer.pack_start(button, False, False, 0) close_button = SmallImageButton( image=SymbolicIconImage("window-close", Gtk.IconSize.MENU), relief=Gtk.ReliefStyle.NONE) close_button.connect("clicked", lambda *x: self.hide()) outer.pack_start(close_button, False, False, 6) self.set_label_widget(outer) self.add(sw) self.connect('notify::expanded', self.__expand, button) self.connect('notify::expanded', self.__expand, button) targets = [ ("text/x-quodlibet-songs", Gtk.TargetFlags.SAME_APP, DND_QL), ("text/uri-list", 0, DND_URI_LIST) ] targets = [Gtk.TargetEntry.new(*t) for t in targets] self.drag_dest_set(Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY) self.connect('drag-motion', self.__motion) self.connect('drag-data-received', self.__drag_data_received) self.queue.model.connect_after('row-inserted', util.DeferredSignal(self.__check_expand), count_label) self.queue.model.connect_after('row-deleted', util.DeferredSignal(self.__update_count), count_label) self.__update_count(self.model, None, count_label) connect_destroy( player, 'song-started', self.__update_state_icon, state_icon) connect_destroy( player, 'paused', self.__update_state_icon_pause, state_icon, True) connect_destroy( player, 'unpaused', self.__update_state_icon_pause, state_icon, False) connect_destroy( player, 'song-started', self.__update_queue_stop, self.queue.model) # to make the children clickable if mapped # ....no idea why, but works def hack(expander): label = expander.get_label_widget() if label: label.unmap() label.map() self.connect("map", hack) self.set_expanded(config.getboolean("memory", "queue_expanded")) self.notify("expanded") for child in self.get_children(): child.show_all() @property def model(self): return self.queue.model def refresh(self): self.__update_count(self.model, None, self.count_label) def __update_state_icon(self, player, song, state_icon): if self.model.sourced: state_icon.play() else: state_icon.stop() def __update_state_icon_pause(self, player, state_icon, paused): if self.model.sourced: if paused: state_icon.pause() else: state_icon.play() else: state_icon.stop() def __clear_queue(self, activator): self.model.clear() stop_queue = config.getboolean("memory", "queue_stop_once_empty", False) if stop_queue: app.player_options.stop_after = True def __motion(self, wid, context, x, y, time): Gdk.drag_status(context, Gdk.DragAction.COPY, time) return True def __update_count(self, model, path, lab): if len(model) == 0: text = "" else: time = sum([row[0].get("~#length", 0) for row in model]) text = ngettext("%(count)d song (%(time)s)", "%(count)d songs (%(time)s)", len(model)) % { "count": len(model), "time": format_time_preferred(time)} lab.set_text(text) def __check_expand(self, model, path, iter, lab): self.__update_count(model, path, lab) self.show() def __drag_data_received(self, expander, *args): self.queue.emit('drag-data-received', *args) def __queue_shuffle(self, button): self.set_shuffled(button.get_active()) def set_shuffled(self, is_shuffled): self.queue.model.order = (OrderShuffle() if is_shuffled else OrderInOrder()) def __update_queue_stop(self, player, song, model): enabled = config.getboolean("memory", "queue_stop_once_empty", False) songs_left = len(model.get()) if enabled and songs_left == 1: # Enable stop_after if this is the last song app.player_options.stop_after = True def __expand(self, widget, prop, menu_button): expanded = self.get_expanded() style_context = self.get_style_context() if expanded: style_context.add_class("ql-expanded") else: style_context.remove_class("ql-expanded") menu_button.set_property('visible', expanded) config.set("memory", "queue_expanded", str(expanded)) class QueueModel(PlaylistModel): """Own class for debugging""" class PlayQueue(SongList): sortable = False class CurrentColumn(Gtk.TreeViewColumn): # Match MainSongList column sizes by default. header_name = "~current" def __init__(self): super(PlayQueue.CurrentColumn, self).__init__() self.set_sizing(Gtk.TreeViewColumnSizing.FIXED) self.set_fixed_width(24) def __init__(self, library, player): super(PlayQueue, self).__init__(library, player, model_cls=QueueModel) self.set_size_request(-1, 120) self.connect('row-activated', self.__go_to, player) self.connect('popup-menu', self.__popup, library) self.enable_drop() self.connect('destroy', self.__write, self.model) self.__fill(library) self.connect('key-press-event', self.__delete_key_pressed) def __delete_key_pressed(self, widget, event): if qltk.is_accel(event, "Delete"): self.__remove() return True return False def __go_to(self, view, path, column, player): if player.go_to(self.model.get_iter(path), explicit=True, source=self.model): player.paused = False def __fill(self, library): try: with open(QUEUE, "rU") as f: filenames = f.readlines() except EnvironmentError: pass else: filenames = map(str.strip, filenames) if library.librarian: library = library.librarian songs = filter(None, map(library.get, filenames)) for song in songs: self.model.append([song]) def __write(self, widget, model): filenames = "\n".join([row[0]["~filename"] for row in model]) with open(QUEUE, "w") as f: f.write(filenames) def __popup(self, widget, library): songs = self.get_selected_songs() if not songs: return menu = SongsMenu( library, songs, queue=False, remove=False, delete=False, ratings=False) menu.preseparate() remove = MenuItem(_("_Remove"), Icons.LIST_REMOVE) qltk.add_fake_accel(remove, "Delete") remove.connect('activate', self.__remove) menu.prepend(remove) menu.show_all() return self.popup_menu(menu, 0, Gtk.get_current_event_time()) def __remove(self, *args): self.remove_selection() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/shortcuts.py���������������������������������������������������������0000755�0001750�0001750�00000006350�13112005742�021317� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import const from quodlibet import util from quodlibet import _ SHORTCUTS = [ (_("Main Window"), [ ("<Alt>Left", _("Seek backwards by 10 seconds")), ("<Alt>Right", _("Seek forward by 10 seconds")), ("<Primary>L", _("Focus the search entry")), ]), (_("Browsers"), [ ("<Primary><Shift>J", _("Reset filters and jump to the playing song")), ]), (_("Song List"), [ ("<Primary>I", _("Open the information window for the selected songs")), ("<Alt>Return", _("Open the tag editor for the selected songs")), ("<Primary>Return", _("Queue the selected songs")), ("<Primary>Delete", _("Delete the selected songs")), ("<Primary>F", _("Show the inline search entry")), ("<Ctrl>", "+ " + _("Left click on a column header") + ":\n" + _("Add the column to the list of columns to sort by")), ]), (_("Tree View"), [ ("Left <Primary>Left", _("Collapses the element or select the parent element")), ("Right <Primary>Right", _("Expands the element")), ]), (_("Text Entries"), [ ("<Primary>Z", _("Collapses the element or select the parent element")), ("<Primary><Shift>Z", _("Redo the last undone change")), ]), (_("Paned Browser"), [ ("<Primary>Home", _("Select all songs in all panes")), ]), ] def build_shortcut_window(data): """Returns a filled Gtk.ShortcutsWindow""" assert has_shortcut_window() # Note: gtk+ is picky about the order of adding/showing things because # this is usually done through XML. e.g. adding shortcuts after a section # wont make them show up in the search etc.. w = Gtk.ShortcutsWindow() section = Gtk.ShortcutsSection() section.show() for group_title, shortcuts in data: group = Gtk.ShortcutsGroup(title=group_title) group.show() for accel, shortcut_title in shortcuts: short = Gtk.ShortcutsShortcut( title=shortcut_title, accelerator=accel) short.show() group.add(short) section.add(group) w.add(section) return w def has_shortcut_window(): """Returns if the current Gtk+ supports ShortcutsWindow. Gtk+ >= 3.20""" return hasattr(Gtk, "ShortcutsWindow") def show_shortcuts(parent): """Either opens a window showing keyboard shortcuts or a website in the default browser, depending on the Gtk+ version """ if has_shortcut_window(): window = build_shortcut_window(SHORTCUTS) window.set_transient_for(parent) window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) window.set_modal(True) window.show() # XXX: The windows does some weird size changes on start which confuses # window placement. This fixes the jumping around and wrong position # with some WMs and under Windows. window.hide() window.show() else: util.website(const.SHORTCUTS_HELP) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/edittags.py����������������������������������������������������������0000644�0001750�0001750�00000106505�13112005742�021065� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2012 Joe Wreschnig, Michael Urman, Iñigo Serna # 2011-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys from gi.repository import Gtk, Pango, Gdk from quodlibet import C_, _ from quodlibet import qltk from quodlibet import config from quodlibet import util from quodlibet.util import massagers from quodlibet.formats import AudioFileError from quodlibet.qltk.completion import LibraryValueCompletion from quodlibet.qltk.tagscombobox import TagsComboBox, TagsComboBoxEntry from quodlibet.qltk.views import RCMHintedTreeView, TreeViewColumn from quodlibet.qltk.wlw import WritingWindow from quodlibet.qltk.window import Dialog from quodlibet.qltk.models import ObjectStore from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.qltk.x import SeparatorMenuItem, Button, MenuItem from quodlibet.qltk._editutils import EditingPluginHandler, OverwriteWarning from quodlibet.qltk._editutils import WriteFailedError from quodlibet.qltk import Icons from quodlibet.plugins import PluginManager from quodlibet.util import connect_obj, gdecode from quodlibet.util.i18n import numeric_phrase from quodlibet.util.tags import USER_TAGS, MACHINE_TAGS, sortkey as tagsortkey from quodlibet.util.string.splitters import (split_value, split_title, split_people, split_album) from quodlibet.compat import iteritems, string_types, text_type, listkeys, \ listmap, itervalues class Comment(object): """A summary of a collection of values for one tag""" def __init__(self, text, have=1, total=1, shared=True): """ Args: text: the first or only text value have: amount of songs that have a value total: total amount of songs shared: if all songs that have a value, have the same one """ self.complete = have == total self.shared = shared self.total = total self.missing = total - have self.have = have self.text = text def _paren(self): if self.shared: return numeric_phrase('missing from %d song', 'missing from %d songs', self.missing) elif self.complete: return numeric_phrase('different across %d song', 'different across %d songs', self.total) else: d = numeric_phrase('different across %d song', 'different across %d songs', self.have) m = numeric_phrase('missing from %d song', 'missing from %d songs', self.missing) return ", ".join([d, m]) def is_special(self): return not self.shared or not self.complete def is_missing(self): return not self.complete def get_markup(self): """Returns pango markup for displaying""" if self.shared and self.complete: return util.escape(self.text) elif self.shared: return "\n".join( ['%s<i> (%s)</i>' % (util.escape(s), util.escape(self._paren())) for s in self.text.split("\n")]) else: return '<i>(%s)</i>' % util.escape(self._paren()) def get_default_tags(): """Returns a list of tags that should be displayed even if not present in the file. """ text = config.get("editing", "default_tags").strip() if not text: return [] return text.split(",") class AudioFileGroup(dict): """Values are a list of Comment instances""" def __init__(self, songs, real_keys_only=True): keys = {} first = {} all = {} total = len(songs) self.songs = songs self.is_file = True can_multi = True can_change = True for song in songs: self.is_file &= song.is_file if real_keys_only: iter_func = song.iterrealitems else: iter_func = song.items for comment, val in iter_func(): keys[comment] = keys.get(comment, 0) + 1 first.setdefault(comment, val) all[comment] = all.get(comment, True) and first[comment] == val song_can_multi = song.can_multiple_values() if song_can_multi is not True: if can_multi is True: can_multi = set(song_can_multi) else: can_multi.intersection_update(song_can_multi) song_can_change = song.can_change() if song_can_change is not True: if can_change is True: can_change = set(song_can_change) else: can_change.intersection_update(song_can_change) self._can_multi = can_multi self._can_change = can_change # collect comment representations for tag, count in iteritems(keys): first_value = first[tag] if not isinstance(first_value, string_types): first_value = text_type(first_value) shared = all[tag] complete = count == total if shared and complete: values = first_value.split("\n") else: values = [first_value] for v in values: self.setdefault(tag, []).append( Comment(v, count, total, shared)) def can_multiple_values(self, key=None): """If no arguments passed returns a set of tags that have multi value support for all contained songs. If key is given returns if all songs support multi value tags for that key. """ if key is None: return self._can_multi return all(song.can_multiple_values(key) for song in self.songs) def can_change(self, key=None): """See can_multiple_values()""" if key is None: return self._can_change return all(song.can_change(key) for song in self.songs) class SplitValues(Gtk.ImageMenuItem): tags = False needs = [] _order = 0.0 def __init__(self, tag, value): super(SplitValues, self).__init__( label=_("Split into _Multiple Values"), use_underline=True) self.set_image(Gtk.Image.new_from_icon_name( Icons.EDIT_FIND_REPLACE, Gtk.IconSize.MENU)) spls = config.gettext("editing", "split_on").split() self.set_sensitive(len(split_value(value, spls)) > 1) def activated(self, tag, value): spls = config.gettext("editing", "split_on").split() return [(tag, v) for v in split_value(value, spls)] class SplitDisc(Gtk.ImageMenuItem): tags = ["album"] needs = ["discnumber"] _order = 0.5 def __init__(self, tag, value): super(SplitDisc, self).__init__( label=_("Split Disc out of _Album"), use_underline=True) self.set_image(Gtk.Image.new_from_icon_name( Icons.EDIT_FIND_REPLACE, Gtk.IconSize.MENU)) self.set_sensitive(split_album(value)[1] is not None) def activated(self, tag, value): album, disc = split_album(value) return [(tag, album), ("discnumber", disc)] class SplitTitle(Gtk.ImageMenuItem): tags = ["title"] needs = ["version"] _order = 0.5 def __init__(self, tag, value): super(SplitTitle, self).__init__( label=_("Split _Version out of Title"), use_underline=True) self.set_image(Gtk.Image.new_from_icon_name( Icons.EDIT_FIND_REPLACE, Gtk.IconSize.MENU)) spls = config.gettext("editing", "split_on").split() self.set_sensitive(bool(split_title(value, spls)[1])) def activated(self, tag, value): spls = config.gettext("editing", "split_on").split() title, versions = split_title(value, spls) return [(tag, title)] + [("version", v) for v in versions] class SplitPerson(Gtk.ImageMenuItem): tags = ["artist"] _order = 0.5 def __init__(self, tag, value): super(SplitPerson, self).__init__(label=self.title, use_underline=True) self.set_image(Gtk.Image.new_from_icon_name( Icons.EDIT_FIND_REPLACE, Gtk.IconSize.MENU)) spls = config.gettext("editing", "split_on").split() self.set_sensitive(bool(split_people(value, spls)[1])) def activated(self, tag, value): spls = config.gettext("editing", "split_on").split() artist, others = split_people(value, spls) return [(tag, artist)] + [(self.needs[0], o) for o in others] class SplitArranger(SplitPerson): needs = ["arranger"] title = _("Split Arranger out of Ar_tist") class SplitPerformer(SplitPerson): needs = ["performer"] title = _("Split _Performer out of Artist") class SplitPerformerFromTitle(SplitPerson): tags = ["title"] needs = ["performer"] title = _("Split _Performer out of Title") class SplitOriginalArtistFromTitle(SplitPerson): tags = ["title"] needs = ["originalartist"] title = _("Split _Originalartist out of Title") class AddTagDialog(Dialog): def __init__(self, parent, can_change, library): super(AddTagDialog, self).__init__( title=_("Add a Tag"), transient_for=qltk.get_top_parent(parent), use_header_bar=True) self.set_border_width(6) self.set_resizable(False) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) add = self.add_icon_button(_("_Add"), Icons.LIST_ADD, Gtk.ResponseType.OK) self.vbox.set_spacing(6) self.set_default_response(Gtk.ResponseType.OK) table = Gtk.Table(n_rows=2, n_columns=2) table.set_row_spacings(12) table.set_col_spacings(6) table.set_border_width(6) self.__tag = (TagsComboBoxEntry() if can_change is True else TagsComboBox(can_change)) label = Gtk.Label() label.set_alignment(0.0, 0.5) label.set_text(_("_Tag:")) label.set_use_underline(True) label.set_mnemonic_widget(self.__tag) table.attach(label, 0, 1, 0, 1) table.attach(self.__tag, 1, 2, 0, 1) self.__val = Gtk.Entry() self.__val.set_completion(LibraryValueCompletion("", library)) label = Gtk.Label() label.set_text(_("_Value:")) label.set_alignment(0.0, 0.5) label.set_use_underline(True) label.set_mnemonic_widget(self.__val) valuebox = Gtk.EventBox() table.attach(label, 0, 1, 1, 2) table.attach(valuebox, 1, 2, 1, 2) hbox = Gtk.HBox() valuebox.add(hbox) hbox.pack_start(self.__val, True, True, 0) hbox.set_spacing(6) invalid = Gtk.Image.new_from_icon_name( Icons.DIALOG_WARNING, Gtk.IconSize.SMALL_TOOLBAR) hbox.pack_start(invalid, True, True, 0) self.vbox.pack_start(table, True, True, 0) self.get_child().show_all() invalid.hide() for entry in [self.__tag, self.__val]: entry.connect( 'changed', self.__validate, add, invalid, valuebox) self.__tag.connect('changed', self.__set_value_completion, library) self.__set_value_completion(self.__tag, library) if can_change is True: connect_obj(self.__tag.get_child(), 'activate', Gtk.Entry.grab_focus, self.__val) def __set_value_completion(self, tag, library): completion = self.__val.get_completion() if completion: completion.set_tag(self.__tag.tag, library) def get_tag(self): try: return self.__tag.tag except AttributeError: return self.__tag.tag def get_value(self): return gdecode(self.__val.get_text()) def __validate(self, editable, add, invalid, box): tag = self.get_tag() value = self.get_value() valid = massagers.is_valid(tag, value) add.set_sensitive(valid) if valid: invalid.hide() box.set_tooltip_text("") else: invalid.show() box.set_tooltip_text(massagers.error_message(tag, value)) def run(self): self.show() self.__val.set_activates_default(True) self.__tag.grab_focus() return super(AddTagDialog, self).run() class EditTagsPluginHandler(EditingPluginHandler): from quodlibet.plugins.editing import EditTagsPlugin Kind = EditTagsPlugin class ListEntry(object): """Holds a Comment and some state for the editing process""" tag = None value = None edited = False canedit = True deleted = False origvalue = None renamed = False origtag = None def __init__(self, tag, value): self.tag = tag self.value = value class EditTags(Gtk.VBox): handler = EditTagsPluginHandler() @classmethod def init_plugins(cls): PluginManager.instance.register_handler(cls.handler) def __init__(self, parent, library): super(EditTags, self).__init__(spacing=12) self.title = _("Edit Tags") self.set_border_width(12) model = ObjectStore() view = RCMHintedTreeView(model=model) self._view = view selection = view.get_selection() render = Gtk.CellRendererPixbuf() column = TreeViewColumn() column.pack_start(render, True) column.set_fixed_width(24) column.set_expand(False) def cdf_write(col, rend, model, iter_, *args): entry = model.get_value(iter_) rend.set_property('sensitive', entry.edited or entry.deleted) if entry.canedit or entry.deleted: if entry.deleted: rend.set_property('icon-name', Icons.EDIT_DELETE) else: rend.set_property('icon-name', Icons.EDIT) else: rend.set_property('icon-name', Icons.CHANGES_PREVENT) column.set_cell_data_func(render, cdf_write) view.append_column(column) render = Gtk.CellRendererText() column = TreeViewColumn(title=_('Tag')) column.pack_start(render, True) def cell_data_tag(column, cell, model, iter_, data): entry = model.get_value(iter_) cell.set_property("text", entry.tag) cell.set_property("strikethrough", entry.deleted) column.set_cell_data_func(render, cell_data_tag) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) render.set_property('editable', True) render.connect('edited', self.__edit_tag_name, model) render.connect( 'editing-started', self.__tag_editing_started, model, library) view.append_column(column) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) render.set_property('editable', True) render.connect('edited', self.__edit_tag, model) render.connect( 'editing-started', self.__value_editing_started, model, library) column = TreeViewColumn(title=_('Value')) column.pack_start(render, True) def cell_data_value(column, cell, model, iter_, data): entry = model.get_value(iter_) markup = entry.value.get_markup() cell.markup = markup cell.set_property("markup", markup) cell.set_property("editable", entry.canedit) cell.set_property("strikethrough", entry.deleted) column.set_cell_data_func(render, cell_data_value) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) view.append_column(column) sw = Gtk.ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.add(view) self.pack_start(sw, True, True, 0) cb = ConfigCheckButton( _("Show _programmatic tags"), 'editing', 'alltags', populate=True, tooltip=_("Access all tags, including machine-generated " "ones e.g. MusicBrainz or Replay Gain tags")) cb.connect('toggled', self.__all_tags_toggled) self.pack_start(cb, False, True, 0) # Add and Remove [tags] buttons buttonbox = Gtk.HBox(spacing=18) bbox1 = Gtk.HButtonBox() bbox1.set_spacing(6) bbox1.set_layout(Gtk.ButtonBoxStyle.START) add = qltk.Button(_("_Add"), Icons.LIST_ADD) add.set_focus_on_click(False) self._add = add add.connect('clicked', self.__add_tag, model, library) bbox1.pack_start(add, True, True, 0) # Remove button remove = qltk.Button(_("_Remove"), Icons.LIST_REMOVE) remove.set_focus_on_click(False) remove.connect('clicked', self.__remove_tag, view) remove.set_sensitive(False) self._remove = remove bbox1.pack_start(remove, True, True, 0) # Revert and save buttons # Both can have customised translated text (and thus accels) bbox2 = Gtk.HButtonBox() bbox2.set_spacing(6) bbox2.set_layout(Gtk.ButtonBoxStyle.END) # Translators: Revert button in the tag editor revert = Button(C_("edittags", "_Revert"), Icons.DOCUMENT_REVERT) self._revert = revert revert.set_sensitive(False) # Translators: Save button in the tag editor save = Button(C_("edittags", "_Save"), Icons.DOCUMENT_SAVE) save.set_sensitive(False) self._save = save bbox2.pack_start(revert, True, True, 0) bbox2.pack_start(save, True, True, 0) buttonbox.pack_start(bbox1, True, True, 0) buttonbox.pack_start(bbox2, True, True, 0) self.pack_start(buttonbox, False, True, 0) self._buttonbox = buttonbox parent.connect('changed', self.__parent_changed) revert.connect('clicked', lambda *x: self._update()) connect_obj(revert, 'clicked', parent.set_pending, None) save.connect('clicked', self.__save_files, revert, model, library) connect_obj(save, 'clicked', parent.set_pending, None) for sig in ['row-inserted', 'row-deleted', 'row-changed']: model.connect(sig, self.__enable_save, [save, revert]) connect_obj(model, sig, parent.set_pending, save) view.connect('popup-menu', self.__popup_menu, parent) view.connect('button-press-event', self.__button_press) view.connect('key-press-event', self.__view_key_press_event) selection.connect('changed', self.__tag_select, remove) selection.set_mode(Gtk.SelectionMode.MULTIPLE) self._parent = parent for child in self.get_children(): child.show_all() def __all_tags_toggled(self, *args): self._update() def __view_key_press_event(self, view, event): if qltk.is_accel(event, "Delete"): self.__remove_tag(view, view) return Gdk.EVENT_STOP elif qltk.is_accel(event, "<Primary>s"): # Issue 697: allow Ctrl-s to save. self._save.emit('clicked') return Gdk.EVENT_STOP return Gdk.EVENT_PROPAGATE def __enable_save(self, *args): buttons = args[-1] for b in buttons: b.set_sensitive(True) def __paste(self, clip, text, args): rend, path = args if text: rend.emit('edited', path, text.strip()) def __menu_activate(self, activator, view): model, (path,) = view.get_selection().get_selected_rows() entry = model[path][0] tag = entry.tag comment = entry.value value = comment.text vals = activator.activated(tag, value) replaced = False if vals and (len(vals) != 1 or vals[0][1] != value): for atag, aval in vals: if atag == tag and not replaced: replaced = True entry.value = Comment(aval) entry.edited = True model.path_changed(path) else: self.__add_new_tag(model, atag, aval) elif vals: replaced = True if not replaced: entry.edited = entry.deleted = True model.path_changed(path) def __popup_menu(self, view, parent): menu = Gtk.Menu() view.ensure_popup_selection() model, rows = view.get_selection().get_selected_rows() can_change = min([model[path][0].canedit for path in rows]) items = [SplitDisc, SplitTitle, SplitPerformer, SplitArranger, SplitValues, SplitPerformerFromTitle, SplitOriginalArtistFromTitle] items.extend(self.handler.plugins) items.sort(key=lambda item: (item._order, item.__name__)) if len(rows) == 1: row = model[rows[0]] entry = row[0] comment = entry.value text = comment.text for Item in items: if Item.tags and entry.tag not in Item.tags: continue try: b = Item(entry.tag, text) except: util.print_exc() else: b.connect('activate', self.__menu_activate, view) if (not min(listmap(self.__songinfo.can_change, b.needs) + [1]) or comment.is_special()): b.set_sensitive(False) menu.append(b) if menu.get_children(): menu.append(SeparatorMenuItem()) b = MenuItem(_("_Remove"), Icons.LIST_REMOVE) b.connect('activate', self.__remove_tag, view) qltk.add_fake_accel(b, "Delete") menu.append(b) menu.show_all() # Setting the menu itself to be insensitive causes it to not # be dismissed; see #473. for c in menu.get_children(): c.set_sensitive(can_change and c.get_property('sensitive')) b.set_sensitive(True) menu.connect('selection-done', lambda m: m.destroy()) # XXX: Keep reference self.__menu = menu return view.popup_menu(menu, 3, Gtk.get_current_event_time()) def __tag_select(self, selection, remove): model, rows = selection.get_selected_rows() remove.set_sensitive(bool(rows)) def __add_new_tag(self, model, tag, value): assert isinstance(value, text_type) iters = [i for (i, v) in model.iterrows() if v.tag == tag] if iters and not self.__songinfo.can_multiple_values(tag): title = _("Unable to add tag") msg = _("Unable to add <b>%s</b>") % util.escape(tag) msg += "\n\n" msg += _("The files currently" " selected do not support multiple values for <b>%s</b>." ) % util.escape(tag) qltk.ErrorMessage(self, title, msg).run() return entry = ListEntry(tag, Comment(value)) entry.edited = True if len(iters): model.insert_after(iters[-1], row=[entry]) else: model.append(row=[entry]) def __add_tag(self, activator, model, library): add = AddTagDialog(self, self.__songinfo.can_change(), library) while True: resp = add.run() if resp != Gtk.ResponseType.OK: break tag = add.get_tag() value = add.get_value() assert isinstance(value, text_type) value = massagers.validate(tag, value) assert isinstance(value, text_type) if not self.__songinfo.can_change(tag): title = _("Invalid tag") msg = _("Invalid tag <b>%s</b>\n\nThe files currently" " selected do not support editing this tag." ) % util.escape(tag) qltk.ErrorMessage(self, title, msg).run() else: self.__add_new_tag(model, tag, value) break add.destroy() def __remove_tag(self, activator, view): model, paths = view.get_selection().get_selected_rows() # Since the iteration can modify path numbers, we need accurate # rows (= iters) before we start. rows = [model[path] for path in paths] for row in rows: entry = row[0] if entry.origvalue is not None: entry.edited = entry.deleted = True model.row_changed(row.path, row.iter) else: model.remove(row.iter) def __save_files(self, save, revert, model, library): updated = {} deleted = {} added = {} renamed = {} for entry in itervalues(model): if entry.edited and not (entry.deleted or entry.renamed): if entry.origvalue is not None: l = updated.setdefault(entry.tag, []) l.append((entry.value, entry.origvalue)) else: l = added.setdefault(entry.tag, []) l.append(entry.value) if entry.edited and entry.deleted: if entry.origvalue is not None: l = deleted.setdefault(entry.tag, []) l.append(entry.origvalue) if entry.edited and entry.renamed and not entry.deleted: l = renamed.setdefault(entry.tag, []) l.append((entry.origtag, entry.value, entry.origvalue)) was_changed = set() songs = self.__songinfo.songs win = WritingWindow(self, len(songs)) win.show() all_done = False for song in songs: if not song.valid(): win.hide() dialog = OverwriteWarning(self, song) resp = dialog.run() win.show() if resp != OverwriteWarning.RESPONSE_SAVE: break changed = False for key, values in iteritems(updated): for (new_value, old_value) in values: if song.can_change(key): if old_value is None: song.add(key, new_value.text) else: song.change(key, old_value.text, new_value.text) changed = True for key, values in iteritems(added): for value in values: if song.can_change(key): song.add(key, value.text) changed = True for key, values in iteritems(deleted): for value in values: if not value.shared: # In case it isn't shared we don't know the actual # values to remove. But we know that in that case # we merge all values into one Comment so just removing # everything for that key is OK. song.remove(key, None) changed = True elif key in song: song.remove(key, value.text) changed = True save_rename = [] for new_tag, values in iteritems(renamed): for old_tag, new_value, old_value in values: if (song.can_change(new_tag) and old_tag in song): if not new_value.is_special(): song.remove(old_tag, old_value.text) save_rename.append((new_tag, new_value)) elif new_value.is_missing(): song.remove(old_tag, old_value) save_rename.append((new_tag, new_value)) else: save_rename.append( (new_tag, Comment(song[old_tag]))) song.remove(old_tag, None) changed = True for tag, value in save_rename: song.add(tag, value.text) if changed: try: song.write() except AudioFileError: util.print_exc() WriteFailedError(self, song).run() library.reload(song, changed=was_changed) break was_changed.add(song) if win.step(): break else: all_done = True win.destroy() library.changed(was_changed) for b in [save, revert]: b.set_sensitive(not all_done) def __edit_tag(self, renderer, path, new_value, model): new_value = gdecode(new_value) new_value = ', '.join(new_value.splitlines()) path = Gtk.TreePath.new_from_string(path) entry = model[path][0] error_dialog = None if not massagers.is_valid(entry.tag, new_value): error_dialog = qltk.WarningMessage( self, _("Invalid value"), _("Invalid value: <b>%(value)s</b>\n\n%(error)s") % { "value": new_value, "error": massagers.error_message(entry.tag, new_value)}) else: new_value = massagers.validate(entry.tag, new_value) comment = entry.value changed = comment.text != new_value if (changed and ((comment.shared and comment.complete) or new_value)) \ or (new_value and comment.shared and not comment.complete): # only give an error if we would have applied the value if error_dialog is not None: error_dialog.run() return entry.value = Comment(new_value) entry.edited = True entry.deleted = False model.path_changed(path) def __edit_tag_name(self, renderer, path, new_tag, model): new_tag = ' '.join(new_tag.splitlines()).lower() path = Gtk.TreePath.new_from_string(path) entry = model[path][0] if new_tag == entry.tag: return elif not self.__songinfo.can_change(new_tag): # Can't add the new tag. title = _("Invalid tag") msg = _("Invalid tag <b>%s</b>\n\nThe files currently" " selected do not support editing this tag." ) % util.escape(new_tag) qltk.ErrorMessage(self, title, msg).run() else: # FIXME: In case this is a special one we only # validate one value and never write it back.. text = entry.value.text if not massagers.is_valid(new_tag, text): qltk.WarningMessage( self, _("Invalid value"), _("Invalid value: <b>%(value)s</b>\n\n%(error)s") % { "value": text, "error": massagers.error_message(new_tag, text)}).run() return text = massagers.validate(new_tag, text) if entry.origvalue is None: # The tag hasn't been saved yet, so we can just update # the name in the model, and the value, since it # may have been re-validated. entry.tag = new_tag entry.value = Comment(text) else: # The tag has been saved, so delete the old tag and # add a new one with the old (or sanitized) value. entry.renamed = entry.edited = True entry.origtag = entry.tag entry.tag = new_tag if not entry.value.is_special(): entry.value = Comment(text) entry.canedit = True model.row_changed(path, model.get_iter(path)) def __button_press(self, view, event): if event.button not in [Gdk.BUTTON_PRIMARY, Gdk.BUTTON_MIDDLE]: return Gdk.EVENT_PROPAGATE x, y = map(int, [event.x, event.y]) try: path, col, cellx, celly = view.get_path_at_pos(x, y) except TypeError: return Gdk.EVENT_PROPAGATE if event.button == Gdk.BUTTON_MIDDLE and \ col == view.get_columns()[2]: display = Gdk.DisplayManager.get().get_default_display() selection = Gdk.SELECTION_PRIMARY if sys.platform == "win32": selection = Gdk.SELECTION_CLIPBOARD clipboard = Gtk.Clipboard.get_for_display(display, selection) for rend in col.get_cells(): if rend.get_property('editable'): clipboard.request_text(self.__paste, (rend, path.get_indices()[0])) return Gdk.EVENT_STOP else: return Gdk.EVENT_PROPAGATE else: return Gdk.EVENT_PROPAGATE def _update(self, songs=None): if songs is None: songs = self.__songinfo.songs else: self.__songinfo = AudioFileGroup(songs) songinfo = self.__songinfo keys = listkeys(songinfo) default_tags = get_default_tags() keys = set(keys + default_tags) def custom_sort(key): try: prio = default_tags.index(key) except ValueError: prio = len(default_tags) return (prio, tagsortkey(key)) if not config.getboolean("editing", "alltags"): keys = filter(lambda k: k not in MACHINE_TAGS, keys) if not songs: keys = [] with self._view.without_model() as model: model.clear() for tag in sorted(keys, key=custom_sort): canedit = songinfo.can_change(tag) # default tags if tag not in songinfo: entry = ListEntry(tag, Comment(u"")) entry.canedit = canedit model.append(row=[entry]) continue for value in songinfo[tag]: entry = ListEntry(tag, value) entry.origvalue = value entry.edited = False entry.canedit = canedit entry.deleted = False entry.renamed = False entry.origtag = "" model.append(row=[entry]) self._buttonbox.set_sensitive(bool(songinfo.can_change())) self._revert.set_sensitive(False) self._remove.set_sensitive(False) self._save.set_sensitive(False) self._add.set_sensitive(bool(songs)) self._parent.set_pending(None) def __parent_changed(self, parent, songs): self._update(songs) def __value_editing_started(self, render, editable, path, model, library): if not editable.get_completion(): tag = model[path][0].tag completion = LibraryValueCompletion(tag, library) editable.set_completion(completion) if isinstance(editable, Gtk.Entry): comment = model[path][0].value if comment.shared: editable.set_text(comment.text) else: editable.set_text(u"") def __tag_editing_started(self, render, editable, path, model, library): if not editable.get_completion(): tags = self.__songinfo.can_change() if tags is True: tags = USER_TAGS completion = qltk.EntryCompletion(tags) editable.set_completion(completion) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/window.py������������������������������������������������������������0000644�0001750�0001750�00000034773�13112005742�020577� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2014 Christoph Reiter # 2014,2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys import os from gi.repository import Gtk, Gdk from quodlibet import config from quodlibet.qltk import get_top_parent, is_wayland, gtk_version, is_accel from quodlibet.qltk.x import Button from quodlibet.util import DeferredSignal, print_d, print_w from quodlibet.util import connect_obj, connect_destroy def on_first_map(window, callback, *args, **kwargs): """Calls callback when the passed Gtk.Window is first visible on screen or it already is. """ assert isinstance(window, Gtk.Window) if window.get_mapped(): callback(*args, **kwargs) return False id_ = [0] def on_map(*otherargs): window.disconnect(id_[0]) callback(*args, **kwargs) id_[0] = window.connect("map", on_map) return False def should_use_header_bar(): settings = Gtk.Settings.get_default() if not settings: return False if not hasattr(settings.props, "gtk_dialogs_use_header"): return False return settings.get_property("gtk-dialogs-use-header") def fix_default_size(width, height): # https://bugzilla.gnome.org/show_bug.cgi?id=740922 if gtk_version < (3, 19): # fixed with 3.20: # https://bugzilla.gnome.org/show_bug.cgi?id=756618 if width != -1: width += min((width - 174), 56) if height != -1: height += 84 return (width, height) class Dialog(Gtk.Dialog): """A Gtk.Dialog subclass which supports the use_header_bar property for all Gtk versions and will ignore it if header bars shouldn't be used according to GtkSettings. """ def __init__(self, *args, **kwargs): if not should_use_header_bar(): kwargs.pop("use_header_bar", None) super(Dialog, self).__init__(*args, **kwargs) def get_titlebar(self): try: # gtk+ >=3.16 return super(Dialog, self).get_titlebar() except AttributeError: return None def set_default_size(self, width, height): if self.get_titlebar(): width, height = fix_default_size(width, height) else: # In case we don't use a headerbar we have to add an additional # row of buttons in the content box. To get roughly the same # content height make the window a bit taller. if height != -1: height += 20 super(Dialog, self).set_default_size(width, height) def add_icon_button(self, label, icon_name, response_id): """Like add_button() but allows to pass an icon name""" button = Button(label, icon_name) # file chooser uses grab_default() on this button.set_can_default(True) button.show() self.add_action_widget(button, response_id) return button class Window(Gtk.Window): """Base window class the keeps track of all window instances. All active instances can be accessed through Window.windows. By defining dialog=True as a kwarg binds Escape to close, otherwise ^W will close the window. """ windows = [] _preven_inital_show = False def __init__(self, *args, **kwargs): self._header_bar = None dialog = kwargs.pop("dialog", True) super(Window, self).__init__(*args, **kwargs) type(self).windows.append(self) if dialog: self.set_type_hint(Gdk.WindowTypeHint.DIALOG) self.set_destroy_with_parent(True) self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) connect_obj(self, 'destroy', type(self).windows.remove, self) self.connect('key-press-event', self._on_key_press) def _on_key_press(self, widget, event): is_dialog = (self.get_type_hint() == Gdk.WindowTypeHint.DIALOG) if (is_dialog and is_accel(event, "Escape")) or ( not is_dialog and is_accel(event, "<Primary>w")): # Do not close the window if we edit a Gtk.CellRendererText. # Focus the treeview instead. if isinstance(self.get_focus(), Gtk.Entry) and \ isinstance(self.get_focus().get_parent(), Gtk.TreeView): self.get_focus().get_parent().grab_focus() return Gdk.EVENT_PROPAGATE self.close() return Gdk.EVENT_STOP if not is_dialog and is_accel(event, "F11"): self.toggle_fullscreen() return Gdk.EVENT_STOP return Gdk.EVENT_PROPAGATE def toggle_fullscreen(self): """Toggle the fullscreen mode of the window depending on its current state. If the windows isn't realized it will switch to fullscreen when it does. """ window = self.get_window() if not window: is_fullscreen = False else: is_fullscreen = window.get_state() & Gdk.WindowState.FULLSCREEN if is_fullscreen: self.unfullscreen() else: self.fullscreen() def set_default_size(self, width, height): if self._header_bar: width, height = fix_default_size(width, height) super(Window, self).set_default_size(width, height) def use_header_bar(self): """Try to use a headerbar, returns the widget or None in case GTK+ is too old or headerbars are disabled (under xfce for example) """ assert not self._header_bar if not should_use_header_bar(): return False header_bar = Gtk.HeaderBar() header_bar.set_show_close_button(True) header_bar.show() old_title = self.get_title() self.set_titlebar(header_bar) if old_title is not None: self.set_title(old_title) self._header_bar = header_bar self.set_default_size(*self.get_default_size()) return header_bar def has_close_button(self): """Returns True in case we are sure that the window decorations include a close button. """ if self.get_type_hint() == Gdk.WindowTypeHint.NORMAL: return True if os.name == "nt": return True if sys.platform == "darwin": return True if self._header_bar is not None: return self._header_bar.get_show_close_button() screen = Gdk.Screen.get_default() if hasattr(screen, "get_window_manager_name"): # X11 only wm_name = screen.get_window_manager_name() # Older Gnome Shell didn't show close buttons. # We can't get the version but the GTK+ version is a good guess, # I guess.. if wm_name == "GNOME Shell" and gtk_version < (3, 18): return False return True def present(self): """A version of present that also works if not called from an event handler (there is no active input event). See https://bugzilla.gnome.org/show_bug.cgi?id=688830 """ try: from gi.repository import GdkX11 except ImportError: super(Window, self).present() else: window = self.get_window() if window and isinstance(window, GdkX11.X11Window): timestamp = GdkX11.x11_get_server_time(window) self.present_with_time(timestamp) else: super(Window, self).present() def set_transient_for(self, parent): """Set a parent for the window. In case parent=None, fall back to the main window. """ is_toplevel = parent and parent.props.type == Gtk.WindowType.TOPLEVEL if parent is None or not is_toplevel: if parent: print_w("Not a toplevel window set for: %r" % self) from quodlibet import app parent = app.window super(Window, self).set_transient_for(parent) @classmethod def prevent_inital_show(cls, value): cls._preven_inital_show = bool(value) def show_maybe(self): """Show the window, except if prevent_inital_show() was called and this is the first time. Returns whether the window was shown. """ if not self._preven_inital_show: self.show() return not self._preven_inital_show class PersistentWindowMixin(object): """A mixin for saving/restoring window size/position/maximized state""" def enable_window_tracking(self, config_prefix, size_suffix=""): """Enable tracking/saving of changes and restore size/pos/maximized. Make sure to call set_transient_for() before since position is restored relative to the parent in this case. config_prefix -- prefix for the config key (prefix_size, prefix_position, prefix_maximized) size_suffix -- optional suffix for saving the size. For cases where the window has multiple states with different content sizes. (example: edit tags with one song or multiple) """ self.__state = 0 self.__name = config_prefix self.__size_suffix = size_suffix self.__save_size_pos_deferred = DeferredSignal( self.__do_save_size_pos, timeout=50, owner=self) self.connect('configure-event', self.__configure_event) self.connect('window-state-event', self.__window_state_changed) self.connect('notify::visible', self.__visible_changed) parent = self.get_transient_for() if parent: connect_destroy( parent, 'configure-event', self.__parent_configure_event) self.__restore_window_state() def __visible_changed(self, *args): if not self.get_visible(): # https://bugzilla.gnome.org/show_bug.cgi?id=731287 # if we restore after hide, mutter will remember for the next show # hurray! self.__restore_window_state() def __restore_window_state(self): if not is_wayland(): self.__restore_state() self.__restore_position() self.__restore_size() def __conf(self, name): if name == "size": name += "_" + self.__size_suffix return "%s_%s" % (self.__name, name) def __restore_state(self): print_d("Restore state") if config.getint("memory", self.__conf("maximized"), 0): self.maximize() else: self.unmaximize() def __restore_position(self): print_d("Restore position") pos = config.get('memory', self.__conf("position"), "") if not pos: return try: x, y = map(int, pos.split()) except ValueError: return parent = self.get_transient_for() if parent: px, py = parent.get_position() x += px y += py self.move(x, y) def __restore_size(self): print_d("Restore size") value = config.get('memory', self.__conf("size"), "") if not value: return try: x, y = map(int, value.split()) except ValueError: return screen = self.get_screen() x = min(x, screen.get_width()) y = min(y, screen.get_height()) if x >= 1 and y >= 1: self.resize(x, y) def __parent_configure_event(self, window, event): # since our position is relative to the parent if we have one, # we also need to save our position if the parent position changes self.__do_save_pos() return False def __configure_event(self, window, event): # xfwm4 resized the window before it maximizes it, which leads # to QL remembering the wrong size. Work around that by waiting # until configure-event settles down, at which point the maximized # state should be set self.__save_size_pos_deferred() return False def _should_ignore_state(self): if self.__state & Gdk.WindowState.MAXIMIZED: return True elif self.__state & Gdk.WindowState.FULLSCREEN: return True elif not self.get_visible(): return True return False def __do_save_size_pos(self): if self._should_ignore_state(): return width, height = self.get_size() value = "%d %d" % (width, height) config.set("memory", self.__conf("size"), value) self.__do_save_pos() def __do_save_pos(self): if self._should_ignore_state(): return x, y = self.get_position() parent = self.get_transient_for() if parent: px, py = parent.get_position() x -= px y -= py pos_value = '%s %s' % (x, y) config.set('memory', self.__conf("position"), pos_value) def __window_state_changed(self, window, event): self.__state = event.new_window_state if self.__state & Gdk.WindowState.WITHDRAWN: return maximized = int(self.__state & Gdk.WindowState.MAXIMIZED) config.set("memory", self.__conf("maximized"), maximized) class _Unique(object): """A mixin for window-like classes to ensure one instance per class. """ __window = None def __new__(klass, *args, **kwargs): window = klass.__window if window is None: return super(_Unique, klass).__new__(klass, *args, **kwargs) # Look for widgets in the args, if there is one and it has # a new top level window, re-parent and reposition the window. widgets = [w for w in args if isinstance(w, Gtk.Widget)] if widgets: parent = window.get_transient_for() new_parent = get_top_parent(widgets[0]) if parent and new_parent and parent is not new_parent: window.set_transient_for(new_parent) window.hide() window.show() window.present() return window @classmethod def is_not_unique(klass): """Returns True if a window instance already exists.""" return bool(klass.__window) def __init__(self, *args, **kwargs): if type(self).__window: return else: type(self).__window = self super(_Unique, self).__init__(*args, **kwargs) connect_obj(self, 'destroy', self.__destroy, self) def __destroy(self, *args): type(self).__window = None class UniqueWindow(_Unique, Window): pass �����quodlibet-3.9.1/quodlibet/qltk/scanbox.py�����������������������������������������������������������0000644�0001750�0001750�00000007043�13112005742�020713� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2013 Joe Wreschnig, Michael Urman, Iñigo Serna, # Steven Robertson, Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from gi.repository import Pango from senf import fsn2text from quodlibet import _ from quodlibet.qltk.chooser import choose_folders from quodlibet.qltk.views import RCMHintedTreeView from quodlibet.qltk.models import ObjectStore from quodlibet.qltk.x import MenuItem, Button from quodlibet.qltk import Icons from quodlibet.util.path import unexpand from quodlibet.util.library import get_scan_dirs, set_scan_dirs from quodlibet.util import connect_obj class ScanBox(Gtk.HBox): """A box for editing the Library's scan directories""" def __init__(self): super(ScanBox, self).__init__(spacing=6) self.model = model = ObjectStore() view = RCMHintedTreeView(model=model) view.set_fixed_height_mode(True) view.set_headers_visible(False) menu = Gtk.Menu() remove_item = MenuItem(_("_Remove"), Icons.LIST_REMOVE) menu.append(remove_item) menu.show_all() view.connect('popup-menu', self.__popup, menu) connect_obj(remove_item, 'activate', self.__remove, view) sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(view) sw.set_size_request(-1, max(sw.size_request().height, 80)) sw.set_tooltip_text(_("Songs in the listed folders will be added " "to the library during a library refresh")) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) def cdf(column, cell, model, iter_, data): path = model.get_value(iter_) cell.set_property('text', fsn2text(unexpand(path))) column = Gtk.TreeViewColumn(None, render) column.set_cell_data_func(render, cdf) column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) view.append_column(column) add = Button(_("_Add"), Icons.LIST_ADD) add.connect("clicked", self.__add) remove = Button(_("_Remove"), Icons.LIST_REMOVE) selection = view.get_selection() selection.set_mode(Gtk.SelectionMode.MULTIPLE) selection.connect("changed", self.__select_changed, remove) selection.emit("changed") connect_obj(remove, "clicked", self.__remove, view) vbox = Gtk.VBox(spacing=6) vbox.pack_start(add, False, True, 0) vbox.pack_start(remove, False, True, 0) self.pack_start(sw, True, True, 0) self.pack_start(vbox, False, True, 0) for path in get_scan_dirs(): model.append(row=[path]) for child in self.get_children(): child.show_all() def __popup(self, view, menu): return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __select_changed(self, selection, remove_button): remove_button.set_sensitive(selection.count_selected_rows()) def __save(self): set_scan_dirs(list(self.model.itervalues())) def __remove(self, view): view.remove_selection() self.__save() def __add(self, *args): fns = choose_folders(self, _("Select Directories"), _("_Add Folders")) for fn in fns: self.model.append(row=[fn]) self.__save() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/appwindow.py���������������������������������������������������������0000644�0001750�0001750�00000001740�13112005742�021264� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation class AppWindow(object): """The shared interface provided by both QL and EF""" def open_file(self, filename): """Open the specified file and play it. The file can be missing or a directory.. Args: filename (fsnative) Returns: bool: If opening worked """ return False def get_is_persistent(self): """If closing this window should shut down the application Returns: bool """ return True def set_as_osx_window(self, osx_app): """Set up the passed in osx app instance FIXME: split this into getters.. Args: osx_app (GtkosxApplication.Application) """ pass ��������������������������������quodlibet-3.9.1/quodlibet/qltk/cover.py�������������������������������������������������������������0000644�0001750�0001750�00000022374�13112005742�020400� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2017 Joe Wreschnig, Michael Urman, Iñigo Serna, # Christoph Reiter, Nick Boultbee, Simonas Kazlauskas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GLib, Gdk, GdkPixbuf, Gio, GObject from senf import fsnative from quodlibet import qltk from quodlibet import app from quodlibet.util import thumbnails, print_w from quodlibet.qltk.image import pixbuf_from_file, \ calc_scale_size, scale, add_border_widget, get_surface_for_pixbuf # TODO: neater way of managing dependency on this particular plugin ALBUM_ART_PLUGIN_ID = "Download Album Art" class BigCenteredImage(qltk.Window): """Load an image and display it, scaling down to 1/2 the screen's dimensions if necessary. This might leak memory, but it could just be Python's GC being dumb.""" def __init__(self, title, fileobj, parent): super(BigCenteredImage, self).__init__(type=Gtk.WindowType.POPUP) self.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) assert parent parent = qltk.get_top_parent(parent) self.set_transient_for(parent) if qltk.is_wayland(): # no screen size with wayland, the parent window is # the next best thing.. width, height = parent.get_size() width = int(width / 1.1) height = int(height / 1.1) else: width = int(Gdk.Screen.width() / 1.75) height = int(Gdk.Screen.height() / 1.75) self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) scale_factor = self.get_scale_factor() pixbuf = None try: pixbuf = pixbuf_from_file(fileobj, (width, height), scale_factor) except GLib.GError: pass # failed to load, abort if not pixbuf: self.destroy() return image = Gtk.Image() image.set_from_surface(get_surface_for_pixbuf(self, pixbuf)) event_box = Gtk.EventBox() event_box.add(image) frame = Gtk.Frame() frame.set_shadow_type(Gtk.ShadowType.OUT) frame.add(event_box) self.add(frame) event_box.connect('button-press-event', self.__destroy) event_box.connect('key-press-event', self.__destroy) self.get_child().show_all() def __destroy(self, *args): self.destroy() def get_no_cover_pixbuf(width, height, scale_factor=1): """A no-cover pixbuf at maximum width x height""" # win32 workaround: https://bugzilla.gnome.org/show_bug.cgi?id=721062 width *= scale_factor height *= scale_factor size = max(width, height) theme = Gtk.IconTheme.get_default() icon_info = theme.lookup_icon("quodlibet-missing-cover", size, 0) if icon_info is None: return filename = icon_info.get_filename() try: return GdkPixbuf.Pixbuf.new_from_file_at_size(filename, width, height) except GLib.GError: return class ResizeImage(Gtk.Bin): def __init__(self, resize=False, size=1): Gtk.Bin.__init__(self) self._dirty = True self._path = None self._file = None self._pixbuf = None self._no_cover = None self._size = size self._resize = resize def set_file(self, fileobj): if fileobj is None: path = None else: path = fileobj.name assert isinstance(path, fsnative) # XXX: Don't reload if the file path is the same. # Could prevent updates if fileobj.name isn't defined if self._path == path: return self._file = fileobj self._path = path self._dirty = True self.queue_resize() def _get_pixbuf(self): if not self._dirty: return self._pixbuf self._dirty = False max_size = 256 * self.get_scale_factor() self._pixbuf = None if self._file: self._pixbuf = thumbnails.get_thumbnail_from_file( self._file, (max_size, max_size)) if not self._pixbuf: self._pixbuf = get_no_cover_pixbuf(max_size, max_size) return self._pixbuf def _get_size(self, max_width, max_height): pixbuf = self._get_pixbuf() if not pixbuf: return 0, 0 width, height = pixbuf.get_width(), pixbuf.get_height() return calc_scale_size((max_width, max_height), (width, height)) def do_get_request_mode(self): if self._resize: return Gtk.SizeRequestMode.HEIGHT_FOR_WIDTH return Gtk.SizeRequestMode.CONSTANT_SIZE def do_get_preferred_width(self): if self._resize: return (0, 0) else: width, height = self._get_size(self._size, self._size) return (width, width) def do_get_preferred_height(self): if self._resize: return (0, 0) else: width, height = self._get_size(self._size, self._size) return (height, height) def do_get_preferred_width_for_height(self, req_height): width, height = self._get_size(300, req_height) if width > 256: width = width return (width, width) def do_draw(self, cairo_context): pixbuf = self._get_pixbuf() if not pixbuf: return alloc = self.get_allocation() width, height = alloc.width, alloc.height scale_factor = self.get_scale_factor() width *= scale_factor height *= scale_factor if self._path: if width < (2 * scale_factor) or height < (2 * scale_factor): return pixbuf = scale( pixbuf, (width - 2 * scale_factor, height - 2 * scale_factor)) pixbuf = add_border_widget(pixbuf, self) else: pixbuf = scale(pixbuf, (width, height)) style_context = self.get_style_context() surface = get_surface_for_pixbuf(self, pixbuf) Gtk.render_icon_surface(style_context, cairo_context, surface, 0, 0) class CoverImage(Gtk.EventBox): __gsignals__ = { # We do not necessarily display cover at the same instant this widget # is created or set_song is called. This signal allows callers know # when the cover is visible for sure. The signal argument tells whether # cover shown is not the fallback image. 'cover-visible': (GObject.SignalFlags.RUN_LAST, None, (bool,)) } def __init__(self, resize=False, size=70, song=None): super(CoverImage, self).__init__() self.set_visible_window(False) self.__song = None self.__file = None self.__current_bci = None self.__cancellable = None self.add(ResizeImage(resize, size)) self.connect('button-press-event', self.__show_cover) self.set_song(song) self.get_child().show_all() def set_image(self, _file): if _file is not None and not _file.name: print_w('Got file which is not in the filesystem!') self.__file = _file self.get_child().set_file(_file) def set_song(self, song): self.__song = song self.set_image(None) if self.__cancellable: self.__cancellable.cancel() cancellable = self.__cancellable = Gio.Cancellable.new() if song: def cb(success, result): if success: try: self.set_image(result) self.emit('cover-visible', success) # If this widget is already 'destroyed', we will get # following error. except AttributeError: pass app.cover_manager.acquire_cover(cb, cancellable, song) def refresh(self): self.set_song(self.__song) def __nonzero__(self): return bool(self.__file) def __reset_bci(self, bci): self.__current_bci = None def __show_cover(self, box, event): """Show the cover as a detached BigCenteredImage. If one is already showing, destroy it instead If there is no image, run the AlbumArt plugin """ song = self.__song if not song: return if event.button != Gdk.BUTTON_PRIMARY or \ event.type != Gdk.EventType.BUTTON_PRESS: return if not self.__file and song.is_file: from quodlibet.qltk.songsmenu import SongsMenu from quodlibet import app SongsMenu.plugins.handle(ALBUM_ART_PLUGIN_ID, app.library, qltk.get_top_parent(self), [song]) return True if self.__current_bci is not None: # We're displaying it; destroy it. self.__current_bci.destroy() return True if not self.__file: return False try: self.__current_bci = BigCenteredImage( song.comma("album"), self.__file, parent=self) except GLib.GError: # reload in case the image file is gone self.refresh() else: self.__current_bci.show() self.__current_bci.connect('destroy', self.__reset_bci) return True ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/tracker.py�����������������������������������������������������������0000644�0001750�0001750�00000014071�13112005742�020710� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import time from gi.repository import GObject, GLib from quodlibet import config class TimeTracker(GObject.GObject): """Emits tick every second (with up to one second jitter) as long as the player is activly playing. Uses timeout_add_seconds, so multiple instances of this should sync and not produce more wakeups. """ __gsignals__ = { 'tick': (GObject.SignalFlags.RUN_LAST, None, ()), } def __init__(self, player): super(TimeTracker, self).__init__() self.__interval = 1000 self.__player = player self.__id = None self.__stop = False self.__reset = False self.__sigs = [ player.connect("paused", self.__paused, True), player.connect("unpaused", self.__paused, False), ] self.__paused(player, player.paused) def set_interval(self, interval): """Update the resolution in milliseconds""" self.__interval = interval self.__reset = True def tick(self): """Emit a tick event""" self.emit("tick") def destroy(self): for signal_id in self.__sigs: self.__player.disconnect(signal_id) self.__source_remove() def __source_remove(self): if self.__id is not None: GLib.source_remove(self.__id) self.__id = None def __update(self): if self.__stop: self.__source_remove() return False if self.__reset: self.__reset = False self.__source_remove() self.__paused(self.__player, self.__player.paused) self.tick() return True def __paused(self, player, paused): if paused: # By removing the timeout only in the callback we are safe from # huge deviation caused by lots of pause/unpause actions. self.__stop = True else: self.__stop = False if self.__id is None: # The application is already woke up every seconds # so synchronize to it by calling timeout_add_seconds(...) # if the requested tracker interval is exactly 1 second. self.__id = GLib.timeout_add_seconds(1, self.__update) \ if self.__interval == 1000 \ else GLib.timeout_add(self.__interval, self.__update) class SongTracker(object): def __init__(self, librarian, player, pl): self.__player_ids = [ player.connect('song-ended', self.__end, librarian, pl), player.connect('song-started', self.__start, librarian), ] self.__player = player timer = TimeTracker(player) timer.connect("tick", self.__timer) self.elapsed = 0 self.__to_change = set() self.__change_id = None def destroy(self): for id_ in self.__player_ids: self.__player.disconnect(id_) self.__player = None if self.__change_id: GLib.source_remove(self.__change_id) self.__change_id = None def __changed(self, librarian, song): # try to combine changed events and process them if QL is idle self.__to_change.add(song) if self.__change_id is not None: GLib.source_remove(self.__change_id) self.__change_id = None def idle_change(): librarian.changed(list(self.__to_change)) self.__to_change.clear() self.__change_id = None self.__change_id = GLib.idle_add(idle_change, priority=GLib.PRIORITY_LOW) def __start(self, player, song, librarian): self.elapsed = 0 if song is not None: if song.multisong: song["~#lastplayed"] = int(time.time()) song["~#playcount"] = song.get("~#playcount", 0) + 1 else: config.set("memory", "song", song["~filename"]) song["~#laststarted"] = int(time.time()) self.__changed(librarian, song) else: config.set("memory", "song", "") def __end(self, player, song, ended, librarian, pl): if song is not None and not song.multisong: if ended: config.set("memory", "seek", player.get_position()) else: config.set("memory", "seek", 0) if self.elapsed > 0.5 * song.get("~#length", 1): song["~#lastplayed"] = int(time.time()) song["~#playcount"] = song.get("~#playcount", 0) + 1 self.__changed(librarian, song) elif pl.current is not song: if not player.error: song["~#skipcount"] = song.get("~#skipcount", 0) + 1 self.__changed(librarian, song) else: config.set("memory", "seek", 0) def __timer(self, timer): self.elapsed += 1 class FSInterface(object): """Provides a file in ~/.quodlibet to indicate what song is playing.""" def __init__(self, path, player): self.path = path self._player = player self._ids = [ player.connect('song-started', self.__started), player.connect('song-ended', self.__ended), ] def destroy(self): for id_ in self._ids: self._player.disconnect(id_) try: os.unlink(self.path) except EnvironmentError: pass def __started(self, player, song): if song: try: with open(self.path, "wb") as f: f.write(song.to_dump()) except EnvironmentError: pass def __ended(self, player, song, stopped): try: os.unlink(self.path) except EnvironmentError: pass �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/pluginwin.py���������������������������������������������������������0000644�0001750�0001750�00000045310�13115325606�021300� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2016-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Pango, GObject from quodlibet import config from quodlibet import const from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.plugins import PluginManager, plugin_enabled from quodlibet.plugins.cover import CoverSourcePlugin from quodlibet.plugins.editing import EditTagsPlugin from quodlibet.plugins.events import EventPlugin from quodlibet.plugins.gstelement import GStreamerPlugin from quodlibet.plugins.playlist import PlaylistPlugin from quodlibet.plugins.playorder import PlayOrderPlugin from quodlibet.plugins.songsmenu import SongsMenuPlugin from quodlibet.qltk.views import HintedTreeView from quodlibet.qltk.window import UniqueWindow, PersistentWindowMixin from quodlibet.qltk.x import Align, Paned, Button, ScrolledWindow from quodlibet.qltk.models import ObjectStore, ObjectModelFilter from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk import Icons, is_accel, show_uri from quodlibet.util import connect_obj class UndoSearchEntry(Gtk.SearchEntry, UndoEntry): pass class PluginErrorWindow(UniqueWindow): def __init__(self, parent, failures): if self.is_not_unique(): return super(PluginErrorWindow, self).__init__() self.set_title(_("Plugin Errors")) self.set_border_width(12) self.set_transient_for(parent) self.set_default_size(520, 300) scrolledwin = Gtk.ScrolledWindow() vbox = Gtk.VBox(spacing=6) vbox.set_border_width(6) scrolledwin.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scrolledwin.add_with_viewport(vbox) keys = failures.keys() show_expanded = len(keys) <= 3 for key in sorted(keys): expander = Gtk.Expander(label="<b>%s</b>" % util.escape(key)) expander.set_use_markup(True) if show_expanded: expander.set_expanded(True) # second line is always the __rescan line; don't show it message = failures[key][0:1] + failures[key][3:] failure = Gtk.Label(label=''.join(message).strip()) failure.set_alignment(0, 0) failure.set_padding(12, 6) failure.set_selectable(True) failure.set_line_wrap(True) vbox.pack_start(expander, False, True, 0) expander.add(failure) self.use_header_bar() if not self.has_close_button(): vbox2 = Gtk.VBox(spacing=12) close = Button(_("_Close"), Icons.WINDOW_CLOSE) close.connect('clicked', lambda *x: self.destroy()) b = Gtk.HButtonBox() b.set_layout(Gtk.ButtonBoxStyle.END) b.pack_start(close, True, True, 0) vbox2.pack_start(scrolledwin, True, True, 0) vbox2.pack_start(b, False, True, 0) self.add(vbox2) close.grab_focus() else: self.add(scrolledwin) self.get_child().show_all() class EnabledType(object): TAG, ALL, NO, DIS, EN, SEP = range(6) class PluginEnabledFilterCombo(Gtk.ComboBox): def __init__(self): combo_store = Gtk.ListStore(str, int) super(PluginEnabledFilterCombo, self).__init__(model=combo_store) cell = Gtk.CellRendererText() cell.props.ellipsize = Pango.EllipsizeMode.END self.pack_start(cell, True) self.add_attribute(cell, "text", 0) def combo_sep(model, iter_, data): return model[iter_][1] == EnabledType.SEP self.set_row_separator_func(combo_sep, None) def refill(self, tags, no_tags): """Fill with a sequence of tags. If no_tags is true display display the extra category for it. """ active = max(self.get_active(), 0) combo_store = self.get_model() combo_store.clear() combo_store.append([_("All"), EnabledType.ALL]) combo_store.append(["", EnabledType.SEP]) combo_store.append([_("Enabled"), EnabledType.EN]) combo_store.append([_("Disabled"), EnabledType.DIS]) if tags: combo_store.append(["", EnabledType.SEP]) for tag in sorted(tags): combo_store.append([tag, EnabledType.TAG]) if no_tags: combo_store.append([_("No category"), EnabledType.NO]) self.set_active(active) def get_active_row(self): iter_ = self.get_active_iter() if iter_: model = self.get_model() return list(model[iter_]) class PluginTypeFilterCombo(Gtk.ComboBox): def __init__(self): combo_store = Gtk.ListStore(str, object) super(PluginTypeFilterCombo, self).__init__(model=combo_store) cell = Gtk.CellRendererText() cell.props.ellipsize = Pango.EllipsizeMode.END self.pack_start(cell, True) self.add_attribute(cell, "text", 0) def combo_sep(model, iter_, data): return model[iter_][1] is None self.set_row_separator_func(combo_sep, None) self.__refill() def __refill(self): """Fill with plugin types""" active = max(self.get_active(), 0) combo_store = self.get_model() combo_store.clear() combo_store.append([_("All"), object]) combo_store.append(["", None]) for name, cls in sorted([ [_("Songs"), SongsMenuPlugin], [_("Playlists"), PlaylistPlugin], [_("Events"), EventPlugin], [_("Play Order"), PlayOrderPlugin], [_("Editing"), EditTagsPlugin], [_("Effects"), GStreamerPlugin], [_("Covers"), CoverSourcePlugin]]): combo_store.append([name, cls]) self.set_active(active) def get_active_type(self): iter_ = self.get_active_iter() if iter_: model = self.get_model() return model[iter_][1] class PluginListView(HintedTreeView): __gsignals__ = { # model, iter, enabled "plugin-toggled": (GObject.SignalFlags.RUN_LAST, None, (object, object, bool)) } def __init__(self): super(PluginListView, self).__init__() self.set_headers_visible(False) render = Gtk.CellRendererToggle() render.set_padding(1, 1) def cell_data(col, render, model, iter_, data): plugin = model.get_value(iter_) pm = PluginManager.instance render.set_activatable(plugin.can_enable) # If it can't be enabled because it's an always-on kinda thing, # show it as enabled so it doesn't look broken. render.set_active(pm.enabled(plugin) or not plugin.can_enable) render.connect('toggled', self.__toggled) column = Gtk.TreeViewColumn("enabled", render) column.set_cell_data_func(render, cell_data) self.append_column(column) render = Gtk.CellRendererPixbuf() render.set_padding(1, 1) def cell_data2(col, render, model, iter_, data): plugin = model.get_value(iter_) icon = plugin.icon or Icons.SYSTEM_RUN render.set_property('icon-name', icon) render.set_property('stock-size', Gtk.IconSize.LARGE_TOOLBAR) column = Gtk.TreeViewColumn("image", render) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) column.set_cell_data_func(render, cell_data2) self.append_column(column) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) render.set_property('xalign', 0.0) render.set_padding(2, 2) column = Gtk.TreeViewColumn("name", render) def cell_data3(col, render, model, iter_, data): plugin = model.get_value(iter_) render.set_property('text', plugin.name) column.set_cell_data_func(render, cell_data3) column.set_expand(True) self.append_column(column) def do_key_press_event(self, event): if is_accel(event, "space", "KP_Space"): selection = self.get_selection() fmodel, fiter = selection.get_selected() plugin = fmodel.get_value(fiter) if plugin.can_enable: self._emit_toggled(fmodel.get_path(fiter), not plugin_enabled(plugin)) self.get_model().iter_changed(fiter) else: Gtk.TreeView.do_key_press_event(self, event) def __toggled(self, render, path): render.set_active(not render.get_active()) self._emit_toggled(path, render.get_active()) def _emit_toggled(self, path, value): model = self.get_model() iter_ = model.get_iter(path) self.emit("plugin-toggled", model, iter_, value) def select_by_plugin_id(self, plugin_id): def restore_sel(row): return row[0].id == plugin_id if not self.select_by_func(restore_sel, one=True): self.set_cursor((0,)) def refill(self, plugins): selection = self.get_selection() fmodel, fiter = selection.get_selected() model = fmodel.get_model() # get the ID of the selected plugin selected = None if fiter: plugin = fmodel.get_value(fiter) selected = plugin.id model.clear() for plugin in sorted(plugins, key=lambda x: x.name): it = model.append(row=[plugin]) if plugin.id == selected: ok, fit = fmodel.convert_child_iter_to_iter(it) selection.select_iter(fit) class PluginPreferencesContainer(Gtk.VBox): def __init__(self): super(PluginPreferencesContainer, self).__init__(spacing=12) self.desc = desc = Gtk.Label() desc.set_line_wrap(True) desc.set_alignment(0, 0.5) desc.set_selectable(True) desc.show() self.pack_start(desc, False, True, 0) self.prefs = prefs = Gtk.Frame() prefs.set_shadow_type(Gtk.ShadowType.NONE) prefs.show() self.pack_start(prefs, False, True, 0) def set_no_plugins(self): self.set_plugin(None) self.desc.set_text(_("No plugins found.")) def set_plugin(self, plugin): label = self.desc if plugin is None: label.set_markup("") else: name = util.escape(plugin.name) text = "<big><b>%s</b></big>" % name if plugin.description: text += "<span font='4'>\n\n</span>" text += plugin.description label.set_markup(text) label.connect("activate-link", show_uri) frame = self.prefs if frame.get_child(): frame.get_child().destroy() if plugin is not None: instance_or_cls = plugin.get_instance() or plugin.cls if plugin and hasattr(instance_or_cls, 'PluginPreferences'): try: prefs = instance_or_cls.PluginPreferences(self) except: util.print_exc() frame.hide() else: if isinstance(prefs, Gtk.Window): b = Button(_("_Preferences"), Icons.PREFERENCES_SYSTEM) connect_obj(b, 'clicked', Gtk.Window.show, prefs) connect_obj(b, 'destroy', Gtk.Window.destroy, prefs) frame.add(b) frame.get_child().set_border_width(6) else: frame.add(prefs) frame.show_all() else: frame.hide() class PluginWindow(UniqueWindow, PersistentWindowMixin): def __init__(self, parent=None): if self.is_not_unique(): return super(PluginWindow, self).__init__() self.set_title(_("Plugins")) self.set_default_size(700, 500) self.set_transient_for(parent) self.enable_window_tracking("plugin_prefs") paned = Paned() vbox = Gtk.VBox() sw = ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.ALWAYS) model = ObjectStore() filter_model = ObjectModelFilter(child_model=model) self._list_view = tv = PluginListView() tv.set_model(filter_model) tv.set_rules_hint(True) tv.connect("plugin-toggled", self.__plugin_toggled) fb = Gtk.HBox(spacing=6) enabled_combo = PluginEnabledFilterCombo() enabled_combo.connect("changed", lambda s: filter_model.refilter()) enabled_combo.set_tooltip_text(_("Filter by plugin state / tag")) fb.pack_start(enabled_combo, True, True, 0) self._enabled_combo = enabled_combo type_combo = PluginTypeFilterCombo() type_combo.connect("changed", lambda s: filter_model.refilter()) type_combo.set_tooltip_text(_("Filter by plugin type")) fb.pack_start(type_combo, True, True, 0) self._type_combo = type_combo filter_entry = UndoSearchEntry() filter_entry.set_tooltip_text( _("Filter by plugin name or description")) filter_entry.connect("changed", lambda s: filter_model.refilter()) self._filter_entry = filter_entry sw.add(tv) sw.set_shadow_type(Gtk.ShadowType.IN) bbox = Gtk.VBox() errors = qltk.Button(_("Show _Errors"), Icons.DIALOG_WARNING) errors.set_focus_on_click(False) errors.connect('clicked', self.__show_errors) errors.show() errors = Align(errors, top=6, bottom=6) errors.set_no_show_all(True) bbox.pack_start(errors, True, True, 0) pref_box = PluginPreferencesContainer() if const.DEBUG: refresh = qltk.Button(_("_Refresh"), Icons.VIEW_REFRESH) refresh.set_focus_on_click(False) refresh.connect('clicked', self.__refresh, tv, pref_box, errors, enabled_combo) bbox.pack_start(refresh, True, True, 0) filter_box = Gtk.VBox(spacing=6) filter_box.pack_start(fb, False, True, 0) filter_box.pack_start(filter_entry, False, True, 0) vbox.pack_start(Align(filter_box, border=6, right=-6), False, False, 0) vbox.pack_start(sw, True, True, 0) vbox.pack_start(Align(bbox, left=6), False, True, 0) paned.pack1(vbox, False, False) close = qltk.Button(_("_Close"), Icons.WINDOW_CLOSE) close.connect('clicked', lambda *x: self.destroy()) bb_align = Align(halign=Gtk.Align.END, valign=Gtk.Align.END) bb = Gtk.HButtonBox() bb.set_layout(Gtk.ButtonBoxStyle.END) bb.pack_start(close, True, True, 0) bb_align.add(bb) selection = tv.get_selection() selection.connect('changed', self.__selection_changed, pref_box) selection.emit('changed') right_box = Gtk.VBox(spacing=12) right_box.pack_start(pref_box, True, True, 0) self.use_header_bar() if not self.has_close_button(): right_box.pack_start(bb_align, True, True, 0) paned.pack2(Align(right_box, border=12), True, False) paned.set_position(275) self.add(paned) self.__refill(tv, pref_box, errors, enabled_combo) self.connect('destroy', self.__destroy) filter_model.set_visible_func( self.__filter, (filter_entry, enabled_combo, type_combo)) self.get_child().show_all() filter_entry.grab_focus() restore_id = config.get("memory", "plugin_selection") tv.select_by_plugin_id(restore_id) def __filter(self, model, iter_, data): """Filter a single row""" plugin = model.get_value(iter_) if not plugin: return False entry, state_combo, type_combo = data plugin_type = type_combo.get_active_type() if not issubclass(plugin.cls, plugin_type): return False tag_row = state_combo.get_active_row() if tag_row: plugin_tags = plugin.tags tag, flag = tag_row enabled = plugin_enabled(plugin) if (flag == EnabledType.NO and plugin_tags or flag == EnabledType.TAG and tag not in plugin_tags or flag == EnabledType.EN and not enabled or flag == EnabledType.DIS and enabled): return False filter_ = entry.get_text().lower() return (not filter_ or filter_ in plugin.name.lower() or filter_ in (plugin.description or "").lower()) def __destroy(self, *args): config.save() def __selection_changed(self, selection, container): model, iter_ = selection.get_selected() if not iter_: container.set_plugin(None) return plugin = model.get_value(iter_) config.set("memory", "plugin_selection", plugin.id) container.set_plugin(plugin) def unfilter(self): """Clears all filters applied to the list""" self._enabled_combo.set_active(0) self._type_combo.set_active(0) self._filter_entry.set_text(u"") def move_to(self, plugin_id): def selector(r): return r[0].id == plugin_id if self._list_view.select_by_func(selector): return True else: self.unfilter() return self._list_view.select_by_func(selector) def __plugin_toggled(self, tv, model, iter_, enabled): plugin = model.get_value(iter_) pm = PluginManager.instance pm.enable(plugin, enabled) pm.save() rmodel = model.get_model() riter = model.convert_iter_to_child_iter(iter_) rmodel.row_changed(rmodel.get_path(riter), riter) def __refill(self, view, prefs, errors, state_combo): pm = PluginManager.instance # refill plugin list view.refill(pm.plugins) # get all tags and refill tag-based (state) combobox tags = set() no_tags = False for plugin in pm.plugins: if not plugin.tags: no_tags = True tags.update(plugin.tags) state_combo.refill(tags, no_tags) if not len(pm.plugins): prefs.set_no_plugins() errors.set_visible(bool(pm.failures)) def __refresh(self, activator, view, prefs, errors, state_combo): pm = PluginManager.instance pm.rescan() self.__refill(view, prefs, errors, state_combo) def __show_errors(self, activator): pm = PluginManager.instance window = PluginErrorWindow(self, pm.failures) window.show() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/x.py�����������������������������������������������������������������0000644�0001750�0001750�00000034236�13112005742�017531� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """ Things that are more or less direct wrappers around GTK widgets to ease constructors. """ from gi.repository import Gtk, GObject, GLib, Gio, GdkPixbuf from quodlibet.util.dprint import print_d from quodlibet import util from quodlibet.compat import urlopen, xrange from quodlibet.util import print_w from quodlibet.util.thread import call_async, Cancellable from quodlibet.qltk import add_css, is_accel, gtk_version from .paned import Paned, RPaned, RHPaned, RVPaned, ConfigRPaned, \ ConfigRHPaned, ConfigRVPaned Paned, RPaned, RHPaned, RVPaned, ConfigRPaned, ConfigRHPaned, ConfigRVPaned class ScrolledWindow(Gtk.ScrolledWindow): """Draws a border around all edges that don't touch the parent window""" def do_size_allocate(self, alloc): if self.get_shadow_type() == Gtk.ShadowType.NONE: return Gtk.ScrolledWindow.do_size_allocate(self, alloc) toplevel = self.get_toplevel() # try to get the child so we ignore the CSD toplevel = toplevel.get_child() or toplevel try: dx, dy = self.translate_coordinates(toplevel, 0, 0) except TypeError: GLib.idle_add(self.queue_resize) return Gtk.ScrolledWindow.do_size_allocate(self, alloc) ctx = self.get_style_context() border = ctx.get_border(ctx.get_state()) # https://bugzilla.gnome.org/show_bug.cgi?id=694844 border.left = border.top = border.right = border.bottom = 1 # XXX: ugly, ugly hack # Pretend the main window toolbar is the top of the window. # This removes the top border in case the ScrolledWindow # is drawn right below the toolbar. try: top_bar = toplevel.top_bar if not isinstance(top_bar, Gtk.Widget): raise TypeError except (AttributeError, TypeError): pass else: top_ctx = top_bar.get_style_context() b = top_ctx.get_border(top_ctx.get_state()) if b.bottom: dy_bar = self.translate_coordinates(top_bar, 0, 0)[1] dy_bar -= top_bar.get_allocation().height dy = min(dy, dy_bar) # since 3.15 the gdkwindow moves to dx==-1 with the allocation # so ignore anything < 0 (I guess something passes the adjusted alloc # to us a second time) # https://git.gnome.org/browse/gtk+/commit/?id=fdf367e8689cb dx = max(0, dx) dy = max(0, dy) # Don't remove the border if the border is drawn inside # and the scrollbar on that edge is visible bottom = left = right = top = False if gtk_version < (3, 19): value = GObject.Value() value.init(GObject.TYPE_BOOLEAN) # default to True: # https://bugzilla.gnome.org/show_bug.cgi?id=701058 value.set_boolean(True) ctx.get_style_property("scrollbars-within-bevel", value) scroll_within = value.get_boolean() value.unset() else: # was deprecated in gtk 3.20 # https://git.gnome.org/browse/gtk+/commit/?id= # 7c0f0e882ae60911e39aaf7b42fb2d94108f3474 scroll_within = True if not scroll_within: h, v = self.get_hscrollbar(), self.get_vscrollbar() hscroll = vscroll = False if h.get_visible(): req = h.size_request() hscroll = bool(req.width + req.height) if v.get_visible(): req = v.size_request() vscroll = bool(req.width + req.height) placement = self.get_placement() if placement == Gtk.CornerType.TOP_LEFT: bottom = hscroll right = vscroll elif placement == Gtk.CornerType.BOTTOM_LEFT: right = vscroll top = hscroll elif placement == Gtk.CornerType.TOP_RIGHT: bottom = hscroll left = vscroll elif placement == Gtk.CornerType.BOTTOM_RIGHT: left = vscroll top = hscroll top_alloc = toplevel.get_allocation() width, height = top_alloc.width, top_alloc.height if alloc.height + dy == height and not bottom: alloc.height += border.bottom if alloc.width + dx == width and not right: alloc.width += border.right if dy == 0 and not top: alloc.y -= border.top alloc.height += border.top if dx == 0 and not left: alloc.x -= border.left alloc.width += border.left return Gtk.ScrolledWindow.do_size_allocate(self, alloc) class Notebook(Gtk.Notebook): """A regular gtk.Notebook, except when appending a page, if no label is given, the page's 'title' attribute (either a string or a widget) is used.""" def __init__(self, *args, **kwargs): super(Notebook, self).__init__(*args, **kwargs) self.connect("key-press-event", self.__key_pressed) def __key_pressed(self, widget, event): # alt+X switches to page X for i in xrange(self.get_n_pages()): if is_accel(event, "<alt>%d" % (i + 1)): self.set_current_page(i) return True return False def do_size_allocate(self, alloc): ctx = self.get_style_context() border = ctx.get_border(ctx.get_state()) toplevel = self.get_toplevel() # try to get the child so we ignore the CSD toplevel = toplevel.get_child() or toplevel try: dx, dy = self.translate_coordinates(toplevel, 0, 0) except TypeError: GLib.idle_add(self.queue_resize) return Gtk.Notebook.do_size_allocate(self, alloc) dx = max(0, dx) dy = max(0, dy) # all 0 since gtk+ 3.12.. border.left = border.top = border.right = border.bottom = 1 top_alloc = toplevel.get_allocation() width, height = top_alloc.width, top_alloc.height if alloc.height + dy == height: alloc.height += border.bottom if alloc.width + dx == width: alloc.width += border.right if dy == 0: alloc.y -= border.top alloc.height += border.top if dx == 0: alloc.x -= border.left alloc.width += border.left return Gtk.Notebook.do_size_allocate(self, alloc) def append_page(self, page, label=None): if label is None: try: label = page.title except AttributeError: raise TypeError("no page.title and no label given") if not isinstance(label, Gtk.Widget): label = Gtk.Label(label=label) super(Notebook, self).append_page(page, label) def Frame(label, child=None): """A Gtk.Frame with no shadow, 12px left padding, and 6px top padding.""" frame = Gtk.Frame() label_w = Gtk.Label() label_w.set_markup("<b>%s</b>" % util.escape(label)) align = Align(left=12, top=6) frame.add(align) frame.set_shadow_type(Gtk.ShadowType.NONE) frame.set_label_widget(label_w) if child: align.add(child) label_w.set_mnemonic_widget(child) label_w.set_use_underline(True) return frame class Align(Gtk.Alignment): """Note: With gtk3.12+ we could replace this with a Gtk.Bin + margin properties. """ def __init__(self, child=None, top=0, right=0, bottom=0, left=0, border=0, halign=Gtk.Align.FILL, valign=Gtk.Align.FILL): def align_to_xy(a): """(xyalign, xyscale)""" if a == Gtk.Align.FILL: return 0.0, 1.0 elif a == Gtk.Align.START: return 0.0, 0.0 elif a == Gtk.Align.END: return 1.0, 0.0 elif a == Gtk.Align.CENTER: return 0.5, 0.0 else: return 0.5, 1.0 xalign, xscale = align_to_xy(halign) yalign, yscale = align_to_xy(valign) bottom_padding = border + bottom top_padding = border + top left_padding = border + left right_padding = border + right super(Align, self).__init__(xalign=xalign, xscale=xscale, yalign=yalign, yscale=yscale, bottom_padding=bottom_padding, top_padding=top_padding, left_padding=left_padding, right_padding=right_padding) if child is not None: self.add(child) def get_margin_top(self): return self.props.top_padding def get_margin_bottom(self): return self.props.bottom_padding def get_margin_left(self): return self.props.left_padding def get_margin_right(self): return self.props.right_padding def MenuItem(label, icon_name=None): """An ImageMenuItem with a custom label and stock image.""" if icon_name is None: return Gtk.MenuItem.new_with_mnemonic(label) item = Gtk.ImageMenuItem.new_with_mnemonic(label) item.set_always_show_image(True) image = Gtk.Image.new_from_icon_name(icon_name, Gtk.IconSize.MENU) image.show() item.set_image(image) return item def _Button(type_, label, icon_name, size): if icon_name is None: return Gtk.Button.new_with_mnemonic(label) align = Align(halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER) hbox = Gtk.HBox(spacing=2) image = Gtk.Image.new_from_icon_name(icon_name, size) hbox.pack_start(image, True, True, 0) label = Gtk.Label(label=label) label.set_use_underline(True) hbox.pack_start(label, True, True, 0) align.add(hbox) align.show_all() button = type_() button.add(align) return button def Button(label, icon_name=None, size=Gtk.IconSize.BUTTON): """A Button with a custom label and stock image. It should pack exactly like a stock button. """ return _Button(Gtk.Button, label, icon_name, size) def ToggleButton(label, icon_name=None, size=Gtk.IconSize.BUTTON): """A ToggleButton with a custom label and stock image. It should pack exactly like a stock button. """ return _Button(Gtk.ToggleButton, label, icon_name, size) class _SmallImageButton(object): """A button for images with less padding""" def __init__(self, **kwargs): super(_SmallImageButton, self).__init__(**kwargs) self.set_size_request(26, 26) add_css(self, """ * { padding: 0px; } """) class SmallImageButton(_SmallImageButton, Gtk.Button): pass class SmallImageToggleButton(_SmallImageButton, Gtk.ToggleButton): pass def EntryCompletion(words): """Simple string completion.""" model = Gtk.ListStore(str) for word in sorted(words): model.append(row=[word]) comp = Gtk.EntryCompletion() comp.set_model(model) comp.set_text_column(0) return comp def RadioMenuItem(*args, **kwargs): """RadioMenuItem that allows None for group""" if kwargs.get("group", None) is None: kwargs.pop("group", None) return Gtk.RadioMenuItem(*args, **kwargs) def SeparatorMenuItem(*args, **kwargs): # https://bugzilla.gnome.org/show_bug.cgi?id=670575 # PyGObject 3.2 always sets a label in __init__ if not args and not kwargs: return Gtk.SeparatorMenuItem.new() return Gtk.SeparatorMenuItem(*args, **kwargs) def SymbolicIconImage(name, size, fallbacks=None): """Gtk.Image that displays a symbolic version of 'name' and falls back to the non-symbolic one. """ symbolic_name = name + "-symbolic" gicon = Gio.ThemedIcon.new_from_names([symbolic_name, name]) return Gtk.Image.new_from_gicon(gicon, size) class CellRendererPixbuf(Gtk.CellRendererPixbuf): def __init__(self, *args, **kwargs): super(CellRendererPixbuf, self).__init__(*args, **kwargs) if gtk_version < (3, 16): # was deprecated in 3.16 and defaults to True now. Since it was # False before force it here so we have the same behavior in all # cases self.set_property("follow-state", True) class Action(Gtk.Action): def __init__(self, *args, **kargs): # Older pygobject didn't pass through kwargs to GObject.Object # so skip the override __init__ GObject.Object.__init__(self, *args, **kargs) class ToggleAction(Gtk.ToggleAction): def __init__(self, *args, **kargs): GObject.Object.__init__(self, *args, **kargs) class RadioAction(Gtk.RadioAction): def __init__(self, *args, **kargs): GObject.Object.__init__(self, *args, **kargs) class WebImage(Gtk.Image): """A Gtk.Image which loads the image over HTTP in the background and displays it when available. """ def __init__(self, url, width=-1, height=-1): """ Args: url (str): an HTTP URL width (int): a width to reserve for the image or -1 height (int): a height to reserve for the image or -1 """ super(WebImage, self).__init__() self._cancel = Cancellable() call_async(self._fetch_image, self._cancel, self._finished, (url,)) self.connect("destroy", self._on_destroy) self.set_size_request(width, height) self.set_from_icon_name("image-loading", Gtk.IconSize.BUTTON) def _on_destroy(self, *args): self._cancel.cancel() def _fetch_image(self, url): try: data = urlopen(url).read() except Exception as e: print_w("Couldn't read web image from %s (%s)" % (url, e)) return None try: loader = GdkPixbuf.PixbufLoader() except GLib.GError as e: print_w("Couldn't create GdkPixbuf (%s)" % e) else: loader.write(data) loader.close() print_d("Got web image from %s" % url) return loader.get_pixbuf() def _finished(self, pixbuf): if pixbuf is None: self.set_from_icon_name("image-missing", Gtk.IconSize.BUTTON) else: self.set_from_pixbuf(pixbuf) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/paned.py�������������������������������������������������������������0000644�0001750�0001750�00000021737�13112005742�020353� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 2017 Fredrik Strupe # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import config from . import add_css, gtk_version class Paned(Gtk.Paned): def __init__(self, *args, **kwargs): super(Paned, self).__init__(*args, **kwargs) self.ensure_wide_handle() def ensure_wide_handle(self): if gtk_version >= (3, 19): self.props.wide_handle = True add_css(self, """ paned separator { border-width: 0; min-height: 5px; min-width: 5px; background-image: none; } """) return if hasattr(self.props, "wide_handle"): # gtk 3.16 self.props.wide_handle = True add_css(self, """ GtkPaned { border-width: 0; background: none; } """) return # gtk 3.14 add_css(self, """ GtkPaned { -GtkPaned-handle-size: 6; background-image: none; margin: 0; border-width: 0; } """) class RPaned(Paned): """A Paned that supports relative (percentage) width/height setting.""" ORIENTATION = None def __init__(self, *args, **kwargs): if self.ORIENTATION is not None: kwargs["orientation"] = self.ORIENTATION super(RPaned, self).__init__(*args, **kwargs) # before first alloc: save value in relative and set on the first alloc # after the first alloc: use the normal properties self.__alloced = False self.__relative = None def _get_max(self): alloc = self.get_allocation() if self.get_orientation() == Gtk.Orientation.HORIZONTAL: return alloc.width else: return alloc.height def set_relative(self, v): """Set the relative position of the separator, [0..1].""" if v < 0 or v > 1: raise ValueError("v must be in [0..1]") if self.__alloced: max_pos = self._get_max() self.set_position(int(round(v * max_pos))) else: self.__relative = v def get_relative(self): """Return the relative position of the separator, [0..1].""" if self.__alloced: rel = float(self.get_position()) / self._get_max() if 0 <= rel <= 1: return rel if self.__relative is not None: return self.__relative # before first alloc and set_relative not called return 0.5 def do_size_allocate(self, *args): ret = Gtk.HPaned.do_size_allocate(self, *args) if not self.__alloced and self.__relative is not None: self.__alloced = True self.set_relative(self.__relative) # call again so the children get alloced ret = Gtk.HPaned.do_size_allocate(self, *args) self.__alloced = True return ret class RHPaned(RPaned): ORIENTATION = Gtk.Orientation.HORIZONTAL class RVPaned(RPaned): ORIENTATION = Gtk.Orientation.VERTICAL class ConfigRPaned(RPaned): def __init__(self, section, option, default, *args, **kwargs): super(ConfigRPaned, self).__init__(*args, **kwargs) self.set_relative(config.getfloat(section, option, default)) self.connect('notify::position', self.__changed, section, option) def __changed(self, widget, event, section, option): if self.get_property('position-set'): config.set(section, option, str(self.get_relative())) class ConfigRHPaned(ConfigRPaned): ORIENTATION = Gtk.Orientation.HORIZONTAL class ConfigRVPaned(ConfigRPaned): ORIENTATION = Gtk.Orientation.VERTICAL class MultiRPaned(object): """A Paned that supports an unlimited number of panes.""" # The Paned type (horizontal or vertical) PANED = None def __init__(self): self._root_paned = None if self.PANED is None: explanation = ("PANED is None. Do not directly" "instantiate MultiRPaned, use" "one of its subclasses.") raise AttributeError(explanation) def set_widgets(self, widgets): """Put a list of widgets in separate panes.""" # root_paned will be the root of a nested paned structure. # if we have three panes - p1, p2 and p3 - root_paned will # eventually look like this: Paned(p1, Paned(p2, p3)) self._root_paned = self.PANED() curr_paned = self._root_paned for widget in widgets: # the last widget completes the last paned if widget is widgets[-1]: curr_paned.pack2(widget, True, False) break curr_paned.pack1(widget, True, False) # the second last widget ends the nesting if widget is widgets[-2]: continue tmp_paned = self.PANED() curr_paned.pack2(tmp_paned, True, False) curr_paned = tmp_paned def get_paned(self): """Get the GTK Paned used for displaying.""" return self._root_paned def make_pane_widths_equal(self): paneds = self._get_paneds() # the relative paned widths must be equal to the reciprocal (1/i) of # their respective indices (i) in reverse order (from right to left) # to make the pane widths equal. (i + 2) because +1 from changing # from zero- to one-indexed, and +1 for compensating that the last # paned contains two panes for i, paned in enumerate(reversed(paneds)): width = min(1.0 / (i + 2), 0.5) paned.set_relative(width) def change_orientation(self, horizontal): """Change the orientation of the paned.""" hor = Gtk.Orientation.HORIZONTAL ver = Gtk.Orientation.VERTICAL for paned in self._get_paneds(): paned.props.orientation = hor if horizontal else ver def destroy(self): if self._root_paned: self._root_paned.destroy() def show_all(self): self._root_paned.show_all() def _get_paneds(self): """Get all internal paneds in a flat, ordered list.""" paneds = [self._root_paned] # gather all the paneds in the nested structure curr_paned = self._root_paned while True: child = curr_paned.get_child2() if type(child) is self.PANED: paneds.append(child) curr_paned = child else: break return paneds class MultiRHPaned(MultiRPaned): PANED = RHPaned class MultiRVPaned(MultiRPaned): PANED = RVPaned class ConfigMultiRPaned(MultiRPaned): def __init__(self, section, option): super(ConfigMultiRPaned, self).__init__() self.section = section self.option = option def set_widgets(self, widgets): super(ConfigMultiRPaned, self).set_widgets(widgets) paneds = self._get_paneds() # Connect all paneds for paned in paneds: paned.connect('notify::position', self.__changed) self._restore_widths() def save_widths(self): """Save all current paned widths.""" paneds = self._get_paneds() if len(paneds) == 1 and not paneds[0].get_child1(): # If there's only one pane (i.e. the only paned has just one # child), do not save the paned width, as this will cause # a later added second pane to get the width of the previous # second pane widths = [] else: widths = [str(p.get_relative()) for p in paneds] config.setstringlist(self.section, self.option, widths) def _restore_widths(self): """Restore pane widths from the config.""" widths = config.getstringlist(self.section, self.option, []) paneds = self._get_paneds() if not widths: # If no widths are saved, save the current widths self.__changed() else: # Restore as many widths as we have saved # (and convert them from str to float) for i, width in enumerate(map(float, widths)): if i >= len(paneds): break paneds[i].set_relative(width) self.__changed() def __changed(self, widget=None, event=None): """Callback function for individual paneds. Saves all current paned widths. Widget and event default to None, as they aren't really used. They are just required for GTK. """ self.save_widths() class ConfigMultiRHPaned(ConfigMultiRPaned): PANED = RHPaned class ConfigMultiRVPaned(ConfigMultiRPaned): PANED = RVPaned ���������������������������������quodlibet-3.9.1/quodlibet/qltk/unity.py�������������������������������������������������������������0000644�0001750�0001750�00000004360�13112005742�020425� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Everything related to Ubuntu Unity integration (quicklist..) See the MPRIS plugin for sound menu integration. """ import gi from quodlibet import _ from quodlibet.util import gi_require_versions is_unity = True try: gi.require_version("Dbusmenu", "0.4") from gi.repository import Dbusmenu except (ValueError, ImportError): is_unity = False try: gi_require_versions("Unity", ["7.0", "6.0", "5.0"]) from gi.repository import Unity except (ValueError, ImportError): is_unity = False def init(desktop_id, player): """Set up unity integration. * desktop_id: e.g. 'quodlibet.desktop' * player: BasePlayer() http://developer.ubuntu.com/api/devel/ubuntu-12.04/c/Unity-5.0.html http://developer.ubuntu.com/api/devel/ubuntu-13.10/c/Unity-7.0.html """ if not is_unity: return launcher = Unity.LauncherEntry.get_for_desktop_id(desktop_id) main = Dbusmenu.Menuitem.new() play_pause = Dbusmenu.Menuitem.new() play_pause.property_set(Dbusmenu.MENUITEM_PROP_LABEL, _("Play/Pause")) play_pause.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True) main.child_append(play_pause) def play_pause_cb(item, timestamp): if player.song is None: player.reset() else: player.paused ^= True play_pause.connect("item-activated", play_pause_cb) next_ = Dbusmenu.Menuitem.new() next_.property_set(Dbusmenu.MENUITEM_PROP_LABEL, _("Next")) next_.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True) main.child_append(next_) def next_cb(item, timestamp): player.next() next_.connect("item-activated", next_cb) prev = Dbusmenu.Menuitem.new() prev.property_set(Dbusmenu.MENUITEM_PROP_LABEL, _("Previous")) prev.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True) main.child_append(prev) def prev_cb(item, timestamp): player.previous() prev.connect("item-activated", prev_cb) launcher.set_property("quicklist", main) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/tagscombobox.py������������������������������������������������������0000644�0001750�0001750�00000004764�13112005742�021754� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2015 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet.util import tag from quodlibet.util.tags import USER_TAGS class _TagsCombo(object): __tags = sorted(USER_TAGS) def _fill_model(self, can_change): self.clear() render = Gtk.CellRendererText() self.pack_start(render, True) self.add_attribute(render, 'text', 1) if can_change is None: can_change = self.__tags can_change = sorted(can_change) model = self.get_model() for t in can_change: model.append(row=[t, "%s (%s)" % (tag(t), t)]) self.set_model(model) if len(model) == 0: raise ValueError("TagsCombo boxes require at least one tag name") @property def tag(self): return self._tag() class TagsComboBox(Gtk.ComboBox, _TagsCombo): """A ComboBox containing a list of tags for the user to choose from. The tag names are presented both translated and untranslated. The 'tag' attribute is the currently chosen tag.""" def __init__(self, can_change=None): super(TagsComboBox, self).__init__(model=Gtk.ListStore(str, str)) self._fill_model(can_change) self.set_active(0) def _tag(self): iter = self.get_active_iter() return self.get_model()[iter][0] class TagsComboBoxEntry(Gtk.ComboBox, _TagsCombo): """A ComboBoxEntry containing a list of tags for the user to choose from. The tag names are presented both translated and untranslated in the menu, but always untranslated when editing. The 'tag' attribute is the currently chosen tag.""" def __init__(self, can_change=None, tooltip_markup=None): super(TagsComboBoxEntry, self).__init__( model=Gtk.ListStore(str, str), entry_text_column=0, has_entry=True) self._fill_model(can_change) if tooltip_markup: self.get_child().set_tooltip_markup(tooltip_markup) def _fill_model(self, can_change): super(TagsComboBoxEntry, self)._fill_model(can_change) comp = Gtk.EntryCompletion() comp.set_model(self.get_model()) comp.set_text_column(0) self.get_child().set_completion(comp) def _tag(self): return self.get_child().get_text() ������������quodlibet-3.9.1/quodlibet/qltk/chooser.py�����������������������������������������������������������0000644�0001750�0001750�00000015527�13114566311�020734� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. import os import contextlib from gi.repository import Gtk from senf import fsnative, path2fsn, fsn2bytes, bytes2fsn from quodlibet import _ from quodlibet import config from quodlibet.qltk import get_top_parent, gtk_version from quodlibet.util.path import fsn2glib, glib2fsn, get_home_dir from quodlibet.util import is_windows def _get_chooser(accept_label, cancel_label): """ Args: accept_label (text_type) cancel_label (text_type) Returns: Gtk.FileChooser """ if hasattr(Gtk, "FileChooserNative"): FileChooser = Gtk.FileChooserNative else: FileChooser = Gtk.FileChooserDialog # https://github.com/quodlibet/quodlibet/issues/2406 if is_windows() and gtk_version < (3, 22, 16): FileChooser = Gtk.FileChooserDialog chooser = FileChooser() if hasattr(chooser, "set_accept_label"): chooser.set_accept_label(accept_label) else: chooser.add_button(accept_label, Gtk.ResponseType.ACCEPT) chooser.set_default_response(Gtk.ResponseType.ACCEPT) if hasattr(chooser, "set_cancel_label"): chooser.set_cancel_label(cancel_label) else: chooser.add_button(cancel_label, Gtk.ResponseType.CANCEL) return chooser _response = None @contextlib.contextmanager def with_response(resp): # for testing global _response _response = resp yield _response = None def _run_chooser(parent, chooser): """Run the chooser ("blocking") and return a list of paths. Args: parent (Gtk.Widget) chooser (Gtk.FileChooser) Returns: List[fsnative] """ chooser.set_current_folder(fsn2glib(get_current_dir())) chooser.set_transient_for(get_top_parent(parent)) if _response is not None: response = _response while Gtk.events_pending(): Gtk.main_iteration() else: response = chooser.run() if response == Gtk.ResponseType.ACCEPT: result = [glib2fsn(fn) for fn in chooser.get_filenames()] current_dir = chooser.get_current_folder() if current_dir: set_current_dir(glib2fsn(current_dir)) else: result = [] chooser.destroy() return result def find_nearest_dir(path): """Given a path return the closes existing directory. Either itself or a parent. In case it can't find one it returns None. Returns: fsnative or None """ path = os.path.abspath(path) def is_ok(p): return os.path.exists(p) and os.path.isdir(p) while not is_ok(path): dirname = os.path.dirname(path) if dirname == path: return None path = dirname return path def get_current_dir(): """Returns the currently active chooser directory path. The path might not actually exist. Returns: fsnative """ data = config.getbytes("memory", "chooser_dir", b"") try: path = bytes2fsn(data, "utf-8") or None except ValueError: path = None # the last user dir might not be there any more, try showing a parent # instead if path is not None: path = find_nearest_dir(path) if path is None: path = get_home_dir() return path def set_current_dir(path): """Set the current chooser directory. Args: path (fsnative) """ assert isinstance(path, fsnative) data = fsn2bytes(path, "utf-8") config.setbytes("memory", "chooser_dir", data) def create_chooser_filter(name, patterns): """Create a Gtk.FileFilter that also works on Windows Args: name (text_type): The name of the filter patterns (List[pathlike]): A list of glob patterns Returns: Gtk.FileFilter """ # The Windows FileChooserNative implementation only supports patterns filter_ = Gtk.FileFilter() filter_.set_name(name) for pattern in sorted(set(patterns)): filter_.add_pattern(fsn2glib(path2fsn(pattern))) return filter_ def choose_folders(parent, title, action_title): """Opens a folder chooser widget and returns a list of folders selected. Args: parent (Gtk.Widget) title (text_type): The window title action_title (text_type): The button title Returns: List[fsnative] """ chooser = _get_chooser(action_title, _("_Cancel")) chooser.set_title(title) chooser.set_action(Gtk.FileChooserAction.SELECT_FOLDER) chooser.set_local_only(True) chooser.set_select_multiple(True) return _run_chooser(parent, chooser) def choose_files(parent, title, action_title, filter_=None): """Opens a folder chooser widget and returns a list of folders selected. Args: parent (Gtk.Widget) title (text_type): The window title action_title (text_type): The button title filter_ (Gtk.FileFilter or None) Returns: List[fsnative] """ chooser = _get_chooser(action_title, _("_Cancel")) chooser.set_title(title) chooser.set_action(Gtk.FileChooserAction.OPEN) chooser.set_local_only(True) chooser.set_select_multiple(True) if filter_ is not None: chooser.add_filter(filter_) return _run_chooser(parent, chooser) def choose_target_file(parent, title, action_title, name_suggestion=None): """Opens a file chooser for saving a file. Args: parent (Gtk.Widget) title (text_type): The window title action_title (text_type): The button title name_suggestion (text_type): The suggested file name (not fsnative) Returns: fsnative or None """ chooser = _get_chooser(action_title, _("_Cancel")) chooser.set_title(title) chooser.set_action(Gtk.FileChooserAction.SAVE) chooser.set_local_only(True) if name_suggestion is not None: chooser.set_current_name(name_suggestion) result = _run_chooser(parent, chooser) if result: return result[0] def choose_target_folder(parent, title, action_title, name_suggestion=None): """Opens a file chooser for saving a file. Args: parent (Gtk.Widget) title (text_type): The window title action_title (text_type): The button title name_suggestion (text_type): The suggested folder name (not fsnative) Returns: fsnative or None """ chooser = _get_chooser(action_title, _("_Cancel")) chooser.set_title(title) chooser.set_action(Gtk.FileChooserAction.CREATE_FOLDER) chooser.set_local_only(True) if name_suggestion is not None: chooser.set_current_name(name_suggestion) result = _run_chooser(parent, chooser) if result: return result[0] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/about.py�������������������������������������������������������������0000644�0001750�0001750�00000003777�13112005742�020402� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import platform from gi.repository import Gtk import mutagen import quodlibet from quodlibet import _ from quodlibet.qltk import gtk_version, pygobject_version, get_backend_name from quodlibet import const from quodlibet import formats from quodlibet.util import fver class AboutDialog(Gtk.AboutDialog): def __init__(self, parent, app): super(AboutDialog, self).__init__() self.set_transient_for(parent) self.set_program_name(app.name) self.set_version(quodlibet.get_build_description()) self.set_authors(const.AUTHORS) self.set_artists(const.ARTISTS) self.set_logo_icon_name(app.icon_name) def chunks(l, n): return [l[i:i + n] for i in range(0, len(l), n)] is_real_player = app.player.name != "Null" format_names = sorted([t.format for t in formats.types]) fmts = ",\n".join(", ".join(c) for c in chunks(format_names, 4)) text = [] text.append(_("Supported formats: %s") % fmts) text.append("") if is_real_player: text.append(_("Audio device: %s") % app.player.name) text.append("Python: %s" % platform.python_version()) text.append("Mutagen: %s" % fver(mutagen.version)) text.append("GTK+: %s (%s)" % (fver(gtk_version), get_backend_name())) text.append("PyGObject: %s" % fver(pygobject_version)) if is_real_player: text.append(app.player.version_info) self.set_comments("\n".join(text)) self.set_license_type(Gtk.License.GPL_2_0) self.set_translator_credits("\n".join(const.TRANSLATORS)) self.set_website(const.WEBSITE) self.set_copyright(const.COPYRIGHT + "\n" + "<%s>" % const.SUPPORT_EMAIL) �quodlibet-3.9.1/quodlibet/qltk/notif.py�������������������������������������������������������������0000644�0001750�0001750�00000024725�13112005742�020403� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010 Steven Robertson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. """ This module will provide a unified notification area for informational messages and active tasks. This will eventually handle interactions with active tasks (e.g. pausing a copooled task), and provide shortcuts for copooling or threading a task with a status notification. It will also provide the UI for the planned global undo feature. Of course, right now it does none of these things. """ # This module is still experimental and may change or be removed. # TODO: Make copooling things with notifications easier (optional) # TODO: Make Ex Falso use this # TODO: Port WaitLoadWindow to use this (and not block) # TODO: Port Media browser to use this # TODO: Port Download Manager to use this # TODO: Add basic notification support # TODO: Add notification history # TODO: Add notification button/callback support (prereq for global undo) # TODO: Optimize performance (deferred signals, etc) from gi.repository import Gtk, GLib, Pango from quodlibet import _ from quodlibet.util import copool from quodlibet.qltk.x import SmallImageToggleButton, SmallImageButton, Align from quodlibet.qltk import Icons class ParentProperty(object): """ A property which provides a thin layer of protection against accidental reparenting: you must first 'unparent' an instance by setting this property to 'None' before you can set a new parent. """ def __get__(self, inst, owner): return getattr(inst, '_parent', None) def __set__(self, inst, value): if getattr(inst, '_parent', None) is not None and value is not None: raise ValueError("Cannot set parent property without first " "setting it to 'None'.") inst._parent = value class Task(object): def __init__(self, source, desc, known_length=True, controller=None, pause=None, stop=None): self.source = source self.desc = desc if known_length: self.frac = 0. else: self.frac = None if controller: self.controller = controller else: self.controller = TaskController.default_instance self._pause = pause self._stop = stop self.pausable = bool(pause) self.stoppable = bool(stop) self._paused = False self.controller.add_task(self) def update(self, frac): """ Update a task's progress. """ self.frac = frac self.controller.update() def pulse(self): """ Indicate progress on a task of unknown length. """ self.update(None) def finish(self): """ Mark a task as finished, and remove it from the list of active tasks. """ self.frac = 1.0 self.controller.finish(self) @property def paused(self): return self._paused @paused.setter def paused(self, value): if self.pausable: self._pause(value) self._paused = value def stop(self): if self._stop: self._stop() self.finish() def gen(self, gen): """ Act as a generator pass-through, updating and finishing the task's progress automatically. If 'gen' has a __len__ property, it will be used to set the fraction accordingly. """ try: if hasattr(gen, '__len__'): for i, x in enumerate(gen): self.update(float(i) / len(gen)) yield x else: for x in gen: yield x finally: self.finish() def list(self, l): """ Evaluates the iterable argument before passing to 'gen'. """ return self.gen(list(l)) def copool(self, funcid, pause=True, stop=True): """ Convenience function: set the Task's 'pause' and 'stop' callbacks to act upon the copool with the given funcid. """ if pause: def pause_func(state): if state != self._paused: if state: copool.pause(funcid) else: copool.resume(funcid) self._pause = pause_func self.pausable = True if stop: self._stop = lambda: copool.remove(funcid) self.stoppable = True # Support context managers: # >>> with Task(...) as t: def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.finish() return False class TaskController(object): """ Controller logic for displaying and managing a list of Tasks. Also implements the full Task interface to act as a pass-through or summary of all tasks in flight on this controller. """ parent = ParentProperty() default_instance = None def __init__(self): self.active_tasks = [] self._parent = None self.update() def add_task(self, task): self.active_tasks.append(task) self.update() @property def source(self): if len(self.active_tasks) == 1: return self.active_tasks[0].source return _("Active tasks") @property def desc(self): if len(self.active_tasks) == 1: return self.active_tasks[0].desc return _("%d tasks running") % len(self.active_tasks) @property def frac(self): fracs = [t.frac for t in self.active_tasks if t.frac is not None] if fracs: return sum(fracs) / len(self.active_tasks) return None @property def paused(self): pausable = [t for t in self.active_tasks if t.pausable] if not pausable: return False return not [t for t in pausable if not t.paused] @paused.setter def paused(self, val): for t in self.active_tasks: if t.pausable: t.paused = val def stop(self): [t.stop() for t in self.active_tasks if t.stoppable] @property def pausable(self): return [t for t in self.active_tasks if t.pausable] @property def stoppable(self): return [t for t in self.active_tasks if t.stoppable] def update(self): if self._parent is not None: self._parent.update() def finish(self, finished_task): self.active_tasks = list(filter(lambda t: t is not finished_task, self.active_tasks)) self.update() # Oh so deliciously hacky. TaskController.default_instance = TaskController() class TaskWidget(Gtk.HBox): """ Displays a task. """ def __init__(self, task): super(TaskWidget, self).__init__(spacing=2) self.task = task self.label = Gtk.Label() self.label.set_alignment(1.0, 0.5) self.label.set_ellipsize(Pango.EllipsizeMode.END) self.pack_start(self.label, True, True, 12) self.progress = Gtk.ProgressBar() self.progress.set_size_request(100, -1) self.pack_start(self.progress, True, True, 0) self.pause = SmallImageToggleButton() self.pause.add( Gtk.Image.new_from_icon_name(Icons.MEDIA_PLAYBACK_PAUSE, Gtk.IconSize.MENU)) self.pause.connect('toggled', self.__pause_toggled) self.pack_start(self.pause, False, True, 0) self.stop = SmallImageButton() self.stop.add( Gtk.Image.new_from_icon_name(Icons.MEDIA_PLAYBACK_STOP, Gtk.IconSize.MENU)) self.stop.connect('clicked', self.__stop_clicked) self.pack_start(self.stop, False, True, 0) def __pause_toggled(self, btn): if self.task.pausable: self.task.paused = btn.props.active def __stop_clicked(self, btn): if self.task.stoppable: self.task.stop() def update(self): formatted_label = "<small><b>%s</b>\n%s</small>" % (self.task.source, self.task.desc) self.label.set_markup(formatted_label) if self.task.frac is not None: self.progress.set_fraction(self.task.frac) else: self.progress.pulse() if self.pause.props.sensitive != self.task.pausable: self.pause.props.sensitive = self.task.pausable show_as_active = (self.task.pausable and self.task.paused) if self.pause.props.active != show_as_active: self.pause.props.active = show_as_active if self.stop.props.sensitive != self.task.stoppable: self.stop.props.sensitive = self.task.stoppable class StatusBar(Gtk.HBox): def __init__(self, task_controller): super(StatusBar, self).__init__() self.__dirty = False self.set_spacing(12) self.task_controller = task_controller self.task_controller.parent = self self.default_label = Gtk.Label(selectable=True) self.default_label.set_ellipsize(Pango.EllipsizeMode.END) self.pack_start( Align(self.default_label, halign=Gtk.Align.END), True, True, 0) self.task_widget = TaskWidget(task_controller) self.pack_start(self.task_widget, True, True, 0) # The history button will eventually hold the full list of running # tasks, as well as the list of previous notifications. #self.history_btn = Gtk.Button() #self.pack_start(self.history_btn, False, True, 0) self.show_all() self.set_no_show_all(True) self.__set_shown('default') self.connect("destroy", self.__destroy) def __destroy(self, *args): self.task_controller.parent = None def __set_shown(self, type): if type == 'default': self.default_label.show() else: self.default_label.hide() if type == 'task': self.task_widget.show() else: self.task_widget.hide() def set_default_text(self, text): self.default_label.set_text(text) def __update(self): self.__dirty = False if self.task_controller.active_tasks: self.__set_shown('task') self.task_widget.update() else: self.__set_shown('default') def update(self): if not self.__dirty: self.__dirty = True GLib.idle_add(self.__update) �������������������������������������������quodlibet-3.9.1/quodlibet/qltk/seekbutton.py��������������������������������������������������������0000644�0001750�0001750�00000030776�13112005742�021452� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Gdk, GLib from quodlibet import _ from quodlibet import config from quodlibet import qltk from quodlibet import util from quodlibet.qltk import get_top_parent from quodlibet.qltk.tracker import TimeTracker from quodlibet.qltk import bookmarks from quodlibet.qltk.x import Align from quodlibet.qltk import Icons from quodlibet.qltk.ccb import ConfigCheckMenuItem from quodlibet.qltk.util import window_grab_and_map, window_ungrab_and_unmap, \ position_window_beside_widget from quodlibet.qltk.x import SeparatorMenuItem from quodlibet.util import connect_obj, connect_destroy, gdecode class TimeLabel(Gtk.Label): """A label for displaying the running time It tries to minimize size changes due to unequal character widths with the same number of characters. e.g. a time display -> 04:20 """ def __init__(self, time_=0): Gtk.Label.__init__(self) self.__widths = {} # num-chars -> (max-min-width, max-natural-width) self._disabled = False self.set_time(time_) def do_get_preferred_width(self): widths = Gtk.Label.do_get_preferred_width(self) # If for same number of characters, the needed width was larger, # use that instead of the current one num_chars = len(gdecode(self.get_text())) max_widths = self.__widths.get(num_chars, widths) widths = max(widths[0], max_widths[0]), max(widths[1], max_widths[1]) self.__widths[num_chars] = widths return widths def set_time(self, time_): """Set the time in seconds""" self._last_time = time_ if self._disabled: return self.set_text(util.format_time_display(time_)) def set_disabled(self, disabled): """Disable the time display temporarily, means there is no meaningful time to show. Re-enabling will show the previous time value """ self._disabled = disabled if disabled: self.set_text(u"‒\u2236‒‒") else: self.set_time(self._last_time) class HSlider(Gtk.Button): def __init__(self, child=None): super(HSlider, self).__init__() if child: self.add(child) self.connect('clicked', self.__clicked) self._disable_slider = False self.__grabbed = [] window = self.__window = Gtk.Window(type=Gtk.WindowType.POPUP) self.__adj = Gtk.Adjustment.new(0, 0, 0, 3, 15, 0) frame = Gtk.Frame() frame.set_border_width(0) frame.set_shadow_type(Gtk.ShadowType.OUT) self.add_events(Gdk.EventMask.SCROLL_MASK) hscale = Gtk.Scale(adjustment=self.__adj) hscale.set_orientation(Gtk.Orientation.HORIZONTAL) window.connect('button-press-event', self.__button) window.connect('key-press-event', self.__key) hscale.set_draw_value(False) self.scale = hscale window.add(frame) self._box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) self._box.add(hscale) frame.add(self._box) self.connect('scroll-event', self.__scroll, hscale) self.connect("destroy", self.__destroy) # forward scroll event to the button def foward_scroll(scale, event): self.emit('scroll-event', event.copy()) window.connect('scroll-event', foward_scroll) # ignore scroll events on the scale, the window handles it instead self.scale.connect('scroll-event', lambda *x: True) # handle all unhandled button events on the scale # so only events not on the scale hide the window def handle_all(scale, event): return True self.scale.connect_after('button-press-event', handle_all) self.scale.connect_after('button-release-event', handle_all) # forward release event to the scale def foward_release(scale, event): self.scale.emit('button-release-event', event.copy()) window.connect('button-release-event', foward_release) self.set_slider_length(200) if child: self.get_child().show_all() def __destroy(self, *args): self.__window.destroy() self.__window = None def set_slider_disabled(self, disable): """Hide the slider and don't allow showing it again until it is enabled again """ self._disable_slider = disable if disable: self.__popup_hide() def set_slider_length(self, length): self.scale.set_size_request(length, -1) # force a window resize.. self.__window.resize(1, 1) def set_slider_widget(self, widget): self._box.pack_start( Align(widget, border=6, left=-3), False, True, 0) def __clicked(self, button): if self.__window.get_property('visible'): return if self._disable_slider: return if self.__grabbed: self.__popup_hide() window = self.__window frame = window.get_child() frame.show_all() window.set_transient_for(get_top_parent(self)) # this type hint tells the wayland backend to create a popup window.set_type_hint(Gdk.WindowTypeHint.DROPDOWN_MENU) position_window_beside_widget(window, self) self.__grabbed = window_grab_and_map( window, Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON_MOTION_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.SCROLL_MASK) def __scroll(self, widget, event, hscale): adj = self.__adj v = hscale.get_value() direction = event.direction if direction in [Gdk.ScrollDirection.DOWN, Gdk.ScrollDirection.RIGHT]: v += adj.props.step_increment elif direction in [Gdk.ScrollDirection.UP, Gdk.ScrollDirection.LEFT]: v -= adj.props.step_increment else: # newer Gdk.ScrollDirection.SMOOTH return v = min(adj.props.upper, max(adj.props.lower, v)) hscale.set_value(v) def __button(self, widget, ev): self.__popup_hide() def __key(self, hscale, ev): if ev.string in ["\n", "\r", " ", "\x1b"]: # enter, space, escape self.__popup_hide() def __popup_hide(self): window_ungrab_and_unmap(self.__window, self.__grabbed) del self.__grabbed[:] class SeekButton(HSlider): __lock = False __sig = None __seekable = True def __init__(self, player, library): hbox = Gtk.HBox(spacing=3) l = TimeLabel() self._time_label = l hbox.pack_start(l, True, True, 0) arrow = Gtk.Arrow.new(Gtk.ArrowType.RIGHT, Gtk.ShadowType.NONE) hbox.pack_start(arrow, False, True, 0) super(SeekButton, self).__init__(hbox) self._slider_label = TimeLabel() self.set_slider_widget(self._slider_label) self._on_seekable_changed(player) connect_destroy(player, "notify::seekable", self._on_seekable_changed) self.scale.connect('button-press-event', self.__seek_lock) self.scale.connect('button-release-event', self.__seek_unlock, player) self.scale.connect('key-press-event', self.__seek_lock) self.scale.connect('key-release-event', self.__seek_unlock, player) self.connect('scroll-event', self.__scroll, player) self.scale.connect('value-changed', self.__update_time, l) m = Gtk.Menu() c = ConfigCheckMenuItem( _("Display remaining time"), "player", "time_remaining") c.set_active(config.getboolean("player", "time_remaining")) connect_obj(c, 'toggled', self.scale.emit, 'value-changed') self.__remaining = c m.append(c) m.append(SeparatorMenuItem()) i = qltk.MenuItem(_(u"_Edit Bookmarks…"), Icons.EDIT) def edit_bookmarks_cb(menu_item): window = bookmarks.EditBookmarks(self, library, player) window.show() i.connect('activate', edit_bookmarks_cb) m.append(i) m.show_all() connect_obj(self, 'button-press-event', self.__check_menu, m, player, c) connect_obj(self, 'popup-menu', self.__popup_menu, m, player) timer = TimeTracker(player) connect_obj(timer, 'tick', self.__check_time, player) connect_destroy( library, "changed", self.__songs_changed, player, m) connect_destroy(player, 'song-started', self.__song_started, m) connect_destroy(player, 'seek', self.__seeked) def _on_seekable_changed(self, player, *args): self._time_label.set_disabled(not player.seekable) self.set_slider_disabled(not player.seekable) def __check_menu(self, menu, event, player, remaining_item): if event.type != Gdk.EventType.BUTTON_PRESS: return if event.button == Gdk.BUTTON_SECONDARY: return self.__popup_menu(menu, player, event) elif event.button == Gdk.BUTTON_MIDDLE: remaining_item.set_active(not remaining_item.get_active()) return True def __popup_menu(self, menu, player, event=None): for child in menu.get_children()[2:-1]: menu.remove(child) child.destroy() try: marks = player.song.bookmarks except AttributeError: # song is None pass else: items = qltk.bookmarks.MenuItems(marks, player, self.__seekable) items.reverse() for i in items: menu.insert(i, 2) if event: qltk.popup_menu_at_widget(menu, self, 3, event.time) else: time = Gtk.get_current_event_time() qltk.popup_menu_under_widget(menu, self, 3, time) return True def __seeked(self, player, song, ms): # If it's not paused, we'll grab it in our next update. if player.paused: self.scale.set_value(ms // 1000) def __scroll(self, widget, event, player): self.__lock = True if self.__sig is not None: GLib.source_remove(self.__sig) self.__sig = GLib.timeout_add(100, self.__scroll_timeout, player) def __scroll_timeout(self, player): self.__lock = False if self.__seekable: player.seek(self.scale.get_value() * 1000) self.__sig = None def __seek_lock(self, scale, event): self.__lock = True def __seek_unlock(self, scale, event, player): self.__lock = False if self.__seekable: player.seek(self.scale.get_value() * 1000) def __check_time(self, player): # When the song is paused GStreamer returns < 1 for position # queries, so if it's paused just ignore it. if not (player.paused or self.__lock): position = player.get_position() // 1000 if (not self.__seekable and position > self.scale.get_adjustment().get_upper()): self.scale.set_range(0, position) self.scale.set_value(position) return True def __update_time(self, scale, timer): value = scale.get_value() max_ = scale.get_adjustment().get_upper() remaining = value - max_ if self.__remaining.get_active(): remaining, value = value, remaining timer.set_time(value) self._slider_label.set_time(remaining) def __songs_changed(self, library, songs, player, menu): song = player.song if song in songs: self.__update_slider(song, menu) def __song_started(self, player, song, menu): self.scale.set_value(0) self.__update_slider(song, menu) def __update_slider(self, song, menu): if song and song("~#length") > 0: self.scale.set_range(0, song("~#length")) slider_width = int(song("~#length") / 1.5) + 80 self.__seekable = True else: self.scale.set_range(0, 1) slider_width = 0 self.__seekable = False slider_width = min(max(slider_width, 170), 400) self.set_slider_length(slider_width) for child in menu.get_children()[2:-1]: menu.remove(child) child.destroy() menu.get_children()[-1].set_sensitive(self.__seekable) self.scale.emit('value-changed') ��quodlibet-3.9.1/quodlibet/qltk/filesel.py�����������������������������������������������������������0000644�0001750�0001750�00000052446�13112005742�020710� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from quodlibet.compat import urlsplit import errno from gi.repository import Gtk, GObject, Gdk, Gio, Pango from senf import uri2fsn, fsnative, fsn2text, bytes2fsn from quodlibet import formats from quodlibet import qltk from quodlibet import _ from quodlibet.util import windows from quodlibet.qltk.getstring import GetStringDialog from quodlibet.qltk.views import AllTreeView, RCMHintedTreeView, \ MultiDragTreeView from quodlibet.qltk.views import TreeViewColumn from quodlibet.qltk.x import ScrolledWindow, Paned from quodlibet.qltk.models import ObjectStore, ObjectTreeStore from quodlibet.qltk import Icons from quodlibet.compat import xrange from quodlibet.util.path import listdir, \ glib2fsn, xdg_get_user_dirs, get_home_dir from quodlibet.util import connect_obj def search_func(model, column, key, iter_, handledirs): check = model.get_value(iter_, 0) if check is None: return True elif not handledirs or os.sep not in key: check = os.path.basename(check) or os.sep return key not in check.lower() and key not in check def is_image(filename): IMAGES = [".jpg", ".png", ".jpeg"] for ext in IMAGES: if filename.lower().endswith(ext): return True return False def filesel_filter(filename): if formats.filter(filename): return True else: return is_image(filename) def _get_win_favorites(): """Returns a list of paths for commonly used directories. e.g. My Music, Desktop etc. """ assert os.name == "nt" folders = [] funcs = [windows.get_desktop_dir, windows.get_personal_dir, windows.get_music_dir] for func in funcs: path = func() if path is not None: folders.append(path) # try to extract the favorites listed in explorer and add them # if not already present links = windows.get_links_dir() if links is not None: try: link_entries = os.listdir(links) except OSError: link_entries = [] for entry in link_entries: if entry.endswith(".lnk"): try: target = windows.get_link_target( os.path.join(links, entry)) except WindowsError: pass else: if target: # RecentPlaces.lnk resolves # to an empty string for example folders.append(target) # remove duplicated entries filtered = [] for path in folders: if path not in filtered: filtered.append(path) return filtered def get_favorites(): """A list of paths of commonly used folders (Desktop,..) Paths don't have to exist. """ if os.name == "nt": return _get_win_favorites() else: paths = [get_home_dir()] xfg_user_dirs = xdg_get_user_dirs() for key in ["XDG_DESKTOP_DIR", "XDG_DOWNLOAD_DIR", "XDG_MUSIC_DIR"]: if key in xfg_user_dirs: path = xfg_user_dirs[key] if path not in paths: paths.append(path) return paths def _get_win_drives(): """Returns a list of paths for all available drives e.g. ['C:\\']""" assert os.name == "nt" drives = [letter + u":\\" for letter in u"CDEFGHIJKLMNOPQRSTUVWXYZ"] return [d for d in drives if os.path.isdir(d)] def get_drives(): """A list of accessible drives""" if os.name == "nt": return _get_win_drives() else: paths = [] for mount in Gio.VolumeMonitor.get().get_mounts(): path = mount.get_root().get_path() if path is not None: paths.append(glib2fsn(path)) paths.append("/") return paths def parse_gtk_bookmarks(data): """ Args: data (bytes) Retruns: List[fsnative] Raises: ValueError """ assert isinstance(data, bytes) paths = [] for line in data.splitlines(): parts = line.split() if not parts: continue folder_url = parts[0] paths.append(bytes2fsn(urlsplit(folder_url)[2], "utf-8")) return paths def get_gtk_bookmarks(): """A list of paths from the GTK+ bookmarks. The paths don't have to exist. Returns: List[fsnative] """ if os.name == "nt": return [] path = os.path.join(get_home_dir(), ".gtk-bookmarks") folders = [] try: with open(path, "rb") as f: folders = parse_gtk_bookmarks(f.read()) except (EnvironmentError, ValueError): pass return folders class DirectoryTree(RCMHintedTreeView, MultiDragTreeView): """A tree view showing multiple folder hierarchies""" def __init__(self, initial=None, folders=None): """ initial -- the path to select/scroll to folders -- a list of paths to show in the tree view, None will result in a separator. """ model = ObjectTreeStore() super(DirectoryTree, self).__init__(model=model) if initial is not None: assert isinstance(initial, fsnative) column = TreeViewColumn(title=_("Folders")) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) render = Gtk.CellRendererPixbuf() render.set_property('icon-name', Icons.FOLDER) render.props.xpad = 3 column.pack_start(render, False) render = Gtk.CellRendererText() if self.supports_hints(): render.set_property('ellipsize', Pango.EllipsizeMode.END) column.pack_start(render, True) def cell_data(column, cell, model, iter_, userdata): value = model.get_value(iter_) if value is not None: text = fsn2text(os.path.basename(value) or value) cell.set_property('text', text) column.set_cell_data_func(render, cell_data) self.append_column(column) self.set_search_equal_func(search_func, True) self.set_search_column(0) if folders is None: folders = [] for path in folders: niter = model.append(None, [path]) if path is not None: assert isinstance(path, fsnative) model.append(niter, ["dummy"]) self.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) self.connect( 'test-expand-row', DirectoryTree.__expanded, model) self.set_row_separator_func( lambda model, iter_, data: model.get_value(iter_) is None, None) if initial: self.go_to(initial) menu = Gtk.Menu() m = qltk.MenuItem(_(u"_New Folder…"), Icons.DOCUMENT_NEW) m.connect('activate', self.__mkdir) menu.append(m) m = qltk.MenuItem(_("_Delete"), Icons.EDIT_DELETE) m.connect('activate', self.__rmdir) menu.append(m) m = qltk.MenuItem(_("_Refresh"), Icons.VIEW_REFRESH) m.connect('activate', self.__refresh) menu.append(m) m = qltk.MenuItem(_("_Select all Sub-Folders"), Icons.FOLDER) m.connect('activate', self.__expand) menu.append(m) menu.show_all() connect_obj(self, 'popup-menu', self.__popup_menu, menu) # Allow to drag and drop files from outside targets = [ ("text/uri-list", 0, 42) ] targets = [Gtk.TargetEntry.new(*t) for t in targets] self.drag_dest_set(Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY) self.connect('drag-data-received', self.__drag_data_received) def get_selected_paths(self): """A list of fs paths""" selection = self.get_selection() model, paths = selection.get_selected_rows() return [model[p][0] for p in paths] def go_to(self, path_to_go): assert isinstance(path_to_go, fsnative) # FIXME: what about non-normalized paths? model = self.get_model() # Find the top level row which has the largest common # path with the path we want to go to roots = dict([(p, i) for (i, p) in model.iterrows(None)]) head, tail = path_to_go, fsnative(u"") to_find = [] while head and head not in roots: new_head, tail = os.path.split(head) # this can happen for invalid paths on Windows if head == new_head: break head = new_head to_find.append(tail) if head not in roots: return start_iter = roots[head] # expand until we find the right directory or the last valid one # and select/scroll to it def search(view, model, iter_, to_find): tree_path = model.get_path(iter_) # we are where we want, select and scroll if not to_find: view.set_cursor(tree_path) view.scroll_to_cell(tree_path) return # expand the row view.expand_row(tree_path, False) next_ = to_find.pop(-1) for sub_iter, path in model.iterrows(iter_): if os.path.basename(path) == next_: search(view, model, sub_iter, to_find) break else: # we haven't found the right sub folder, select the parent # and stop search(view, model, iter_, []) search(self, model, start_iter, to_find) def __drag_data_received(self, widget, drag_ctx, x, y, data, info, time): if info == 42: uris = data.get_uris() if uris: try: filename = uri2fsn(uris[0]) except ValueError: pass else: self.go_to(filename) Gtk.drag_finish(drag_ctx, True, False, time) return Gtk.drag_finish(drag_ctx, False, False, time) def __popup_menu(self, menu): model, paths = self.get_selection().get_selected_rows() if len(paths) != 1: return True path = paths[0] directory = model[path][0] delete = menu.get_children()[1] try: delete.set_sensitive(len(os.listdir(directory)) == 0) except OSError as err: if err.errno == errno.ENOENT: model.remove(model.get_iter(path)) return False selection = self.get_selection() selection.unselect_all() selection.select_path(path) return self.popup_menu(menu, 0, Gtk.get_current_event_time()) def __mkdir(self, button): model, paths = self.get_selection().get_selected_rows() if len(paths) != 1: return path = paths[0] directory = model[path][0] dir_ = GetStringDialog( None, _("New Folder"), _("Enter a name for the new folder:")).run() if not dir_: return dir_ = glib2fsn(dir_) fullpath = os.path.realpath(os.path.join(directory, dir_)) try: os.makedirs(fullpath) except EnvironmentError as err: error = "<b>%s</b>: %s" % (err.filename, err.strerror) qltk.ErrorMessage( None, _("Unable to create folder"), error).run() return self.emit('test-expand-row', model.get_iter(path), path) self.expand_row(path, False) def __rmdir(self, button): model, paths = self.get_selection().get_selected_rows() if len(paths) != 1: return directory = model[paths[0]][0] try: os.rmdir(directory) except EnvironmentError as err: error = "<b>%s</b>: %s" % (err.filename, err.strerror) qltk.ErrorMessage( None, _("Unable to delete folder"), error).run() return ppath = Gtk.TreePath(paths[0][:-1]) expanded = self.row_expanded(ppath) self.emit('test-expand-row', model.get_iter(ppath), ppath) if expanded: self.expand_row(ppath, False) def __expand(self, button): selection = self.get_selection() model, paths = selection.get_selected_rows() for path in paths: iter_ = model.get_iter(path) self.expand_row(path, False) last = self.__select_children(iter_, model, selection) selection.select_range(path, last) def __select_children(self, iter_, model, selection): nchildren = model.iter_n_children(iter_) last = model.get_path(iter_) for i in xrange(nchildren): child = model.iter_nth_child(iter_, i) self.expand_row(model.get_path(child), False) last = self.__select_children(child, model, selection) return last def __refresh(self, button): model, rows = self.get_selection().get_selected_rows() expanded = set() self.map_expanded_rows( lambda s, iter, data: expanded.add(model[iter][0]), None) needs_expanding = [] for row in rows: if self.row_expanded(row): self.emit('test-expand-row', model.get_iter(row), row) self.expand_row(row, False) needs_expanding.append(row) while len(needs_expanding) > 0: child = model.iter_children(model.get_iter(needs_expanding.pop())) while child is not None: if model[child][0] in expanded: path = model.get_path(child) self.emit('test-expand-row', child, path) self.expand_row(path, False) needs_expanding.append(path) child = model.iter_next(child) def __expanded(self, iter, path, model): window = self.get_window() if window: window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) Gtk.main_iteration_do(False) try: try: if model is None: return while model.iter_has_child(iter): model.remove(model.iter_children(iter)) folder = model[iter][0] for path in listdir(folder): try: if not os.path.isdir(path): continue for filename in listdir(path): if os.path.isdir(filename): niter = model.append(iter, [path]) model.append(niter, ["dummy"]) break else: model.append(iter, [path]) except OSError: pass if not model.iter_has_child(iter): return True except OSError: pass finally: if window: window.set_cursor(None) class FileSelector(Paned): """A file selector widget consisting of a folder tree and a file list below. """ __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, (Gtk.TreeSelection,)) } def __init__(self, initial=None, filter=filesel_filter, folders=None): """ initial -- a path to a file which should be shown initially filter -- a function which filters paths shown in the file list folders -- list of shown folders in the directory tree """ super(FileSelector, self).__init__( orientation=Gtk.Orientation.VERTICAL) self.__filter = filter if initial is not None: assert isinstance(initial, fsnative) if initial and os.path.isfile(initial): initial = os.path.dirname(initial) dirlist = DirectoryTree(initial, folders=folders) model = ObjectStore() filelist = AllTreeView(model=model) column = TreeViewColumn(title=_("Songs")) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) render = Gtk.CellRendererPixbuf() render.props.xpad = 3 def cell_icon(column, cell, model, iter_, userdata): value = model.get_value(iter_) if is_image(value): cell.set_property('icon-name', Icons.IMAGE_X_GENERIC) else: cell.set_property('icon-name', Icons.AUDIO_X_GENERIC) column.set_cell_data_func(render, cell_icon) column.pack_start(render, False) render = Gtk.CellRendererText() if filelist.supports_hints(): render.set_property('ellipsize', Pango.EllipsizeMode.END) column.pack_start(render, True) def cell_data(column, cell, model, iter_, userdata): value = model.get_value(iter_) cell.set_property('text', fsn2text(os.path.basename(value))) column.set_cell_data_func(render, cell_data) filelist.append_column(column) filelist.set_rules_hint(True) filelist.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) filelist.set_search_equal_func(search_func, False) filelist.set_search_column(0) self.__sig = filelist.get_selection().connect( 'changed', self.__changed) dirlist.get_selection().connect( 'changed', self.__dir_selection_changed, filelist) dirlist.get_selection().emit('changed') def select_all_files(view, path, col, fileselection): view.expand_row(path, False) fileselection.select_all() dirlist.connect('row-activated', select_all_files, filelist.get_selection()) sw = ScrolledWindow() sw.add(dirlist) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) self.pack1(sw, resize=True) sw = ScrolledWindow() sw.add(filelist) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) self.pack2(sw, resize=True) def go_to(self, *args, **kwargs): dirlist = self.get_child1().get_child() dirlist.go_to(*args, **kwargs) def get_selected_paths(self): """A list of fs paths""" filelist = self.get_child2().get_child() selection = filelist.get_selection() model, paths = selection.get_selected_rows() return [model[p][0] for p in paths] def rescan(self): """Refill the file list for the current directory selection""" dirlist = self.get_child1().get_child() filelist = self.get_child2().get_child() dir_selection = dirlist.get_selection() self.__dir_selection_changed(dir_selection, filelist) def __changed(self, selection): # forward file list selection changed signals self.emit('changed', selection) def __dir_selection_changed(self, selection, filelist): # dir selection changed, refill the file list fselect = filelist.get_selection() fselect.handler_block(self.__sig) fmodel, frows = fselect.get_selected_rows() selected = [fmodel[row][0] for row in frows] fmodel = filelist.get_model() fmodel.clear() dmodel, rows = selection.get_selected_rows() dirs = [dmodel[row][0] for row in rows] for dir_ in dirs: try: files = filter(self.__filter, listdir(dir_)) for file_ in sorted(files): filename = os.path.join(dir_, file_) if (os.access(filename, os.R_OK) and not os.path.isdir(filename)): fmodel.append([filename]) except OSError: pass for iter_, filename in fmodel.iterrows(): if filename in selected: fselect.select_iter(iter_) fselect.handler_unblock(self.__sig) fselect.emit('changed') def _get_main_folders(): def filter_exists(paths): return [p for p in paths if os.path.isdir(p)] folders = [] favs = filter_exists(get_favorites()) if favs: folders += favs drives = filter_exists(get_drives()) if folders and drives: folders += [None] if drives: folders += drives bookmarks = filter_exists(get_gtk_bookmarks()) if folders and bookmarks: folders += [None] if bookmarks: folders += bookmarks return folders class MainFileSelector(FileSelector): """The main file selector used in EF. Shows a useful list of directories in the directory tree. """ def __init__(self, initial=None): folders = _get_main_folders() super(MainFileSelector, self).__init__( initial, filesel_filter, folders=folders) class MainDirectoryTree(DirectoryTree): """The main directory tree used in QL. Shows a useful list of directories. """ def __init__(self, initial=None, folders=None): if folders is None: folders = [] main = _get_main_folders() if folders and main: folders += [None] if main: folders += main super(MainDirectoryTree, self).__init__( initial=initial, folders=folders) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/icons.py�������������������������������������������������������������0000644�0001750�0001750�00000010502�13112005742�020363� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """A list of icon names. Mainly to see which ones we define and for looking up the standardized ones. Also reduces the chance of making a typo. http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html https://docs.google.com/spreadsheet/pub? key=0AsPAM3pPwxagdGF4THNMMUpjUW5xMXZfdUNzMXhEa2c """ from quodlibet.util import enum @enum class Icons(str): NONE = "" # these we have in our fallback icon theme QUODLIBET = "quodlibet" EXFALSO = "exfalso" QUODLIBET_MISSING_COVER = "quodlibet-missing-cover" # stock icon I couldn't think of a replacement for now EDIT = "gtk-edit" # these only come from an icon theme APPLICATION_EXIT = "application-exit" # "_Quit" APPLICATION_INTERNET = "applications-internet" APPLICATION_UTILITIES = "applications-utilities" APPOINTMENT_NEW = "appointment-new" AUDIO_CARD = "audio-card" AUDIO_INPUT_MICROPHONE = "audio-input-microphone" AUDIO_VOLUME_MUTED = "audio-volume-muted" AUDIO_X_GENERIC = "audio-x-generic" CHANGES_PREVENT = "changes-prevent" DIALOG_ERROR = "dialog-error" # "Error" DIALOG_INFORMATION = "dialog-information" # "Information" DIALOG_PASSWORD = "dialog-password" DIALOG_QUESTION = "dialog-question" # "Question" DIALOG_WARNING = "dialog-warning" # "Warning" DOCUMENT_NEW = "document-new" # "_New" DOCUMENT_OPEN = "document-open" # "_Open" DOCUMENT_PROPERTIES = "document-properties" # "_Properties" DOCUMENT_REVERT = "document-revert" # "_Revert" DOCUMENT_SAVE = "document-save" # "_Save" DOCUMENT_SAVE_AS = "document-save-as" # "_Save" DOCUMENT_SEND = "document-send" DRIVE_REMOVABLE_MEDIA = "drive-removable-media" EDIT_CLEAR = "edit-clear" # "_Clear" EDIT_COPY = "edit-copy" # "_Copy" EDIT_PASTE = "edit-paste" # "_Paste" EDIT_DELETE = "edit-delete" # "_Delete" EDIT_FIND = "edit-find" # "_Find" EDIT_FIND_REPLACE = "edit-find-replace" # "Find and _Replace" EDIT_REDO = "edit-redo" # "_Redo" EDIT_SELECT_ALL = "edit-select-all" EDIT_UNDO = "edit-undo" # "_Undo" EMBLEM_DOWNLOADS = "emblem-downloads" EMBLEM_SHARED = "emblem-shared" EMBLEM_SYSTEM = "emblem-system" FACE_SMILE = "face-smile" FAVORITE = "emblem-favorite" FOLDER = "folder" FOLDER_DRAG_ACCEPT = "folder-drag-accept" FOLDER_OPEN = "folder-open" FORMAT_JUSTIFY_FILL = "format-justify-fill" GO_JUMP = "go-jump" # "_Jump to" HELP_ABOUT = "help-about" # "_About" HELP_BROWSER = "help-browser" # "_Help" IMAGE_X_GENERIC = "image-x-generic" INSERT_IMAGE = "insert-image" INSERT_TEXT = "insert-text" LIST_ADD = "list-add" # "_Add" LIST_REMOVE = "list-remove" # "_Remove" MEDIA_EJECT = "media-eject" MEDIA_OPTICAL = "media-optical" # "_CD-ROM" MEDIA_PLAYBACK_PAUSE = "media-playback-pause" # "P_ause" MEDIA_PLAYBACK_START = "media-playback-start" # "_Play" MEDIA_PLAYBACK_STOP = "media-playback-stop" # "_Stop" MEDIA_PLAYLIST_REPEAT = "media-playlist-repeat" MEDIA_PLAYLIST_SHUFFLE = "media-playlist-shuffle" MEDIA_SKIP_BACKWARD = "media-skip-backward" # "Pre_vious" MEDIA_SKIP_FORWARD = "media-skip-forward" # "_Next" MULTIMEDIA_PLAYER = "multimedia-player" MULTIMEDIA_VOLUME_CONTROL = "multimedia-volume-control" NETWORK_WORKGROUP = "network-workgroup" # "_Network" NETWORK_SERVER = "network-server" PREFERENCES_SYSTEM = "preferences-system" # "_Preferences" PREFERENCES_DESKTOP_SCREENSAVER = "preferences-desktop-screensaver" PREFERENCES_DESKTOP_THEME = "preferences-desktop-theme" PROCESS_STOP = "process-stop" # "_Stop" SYSTEM_RUN = "system-run" # "_Execute" SYSTEM_SEARCH = "system-search" TEXT_HTML = "text-html" TOOLS_CHECK_SPELLING = "tools-check-spelling" # "_Spell Check" USER_BOOKMARKS = "user-bookmarks" # Looks like a rating USER_DESKTOP = "user-desktop" USER_TRASH = "user-trash" # "Trash" UTILITIES_TERMINAL = "utilities-terminal" VIEW_REFRESH = "view-refresh" # "_Refresh" WINDOW_CLOSE = "window-close" # "_Close" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/exfalsowindow.py�����������������������������������������������������0000644�0001750�0001750�00000024624�13112005742�022153� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk, GObject, Pango from senf import fsnative from quodlibet import ngettext, _ from quodlibet import config from quodlibet import formats from quodlibet import qltk from quodlibet import app from quodlibet.qltk.appwindow import AppWindow from quodlibet.formats import AudioFileError from quodlibet.plugins import PluginManager from quodlibet.qltk.delete import trash_files, TrashMenuItem from quodlibet.qltk.edittags import EditTags from quodlibet.qltk.filesel import MainFileSelector from quodlibet.qltk.pluginwin import PluginWindow from quodlibet.qltk.renamefiles import RenameFiles from quodlibet.qltk.tagsfrompath import TagsFromPath from quodlibet.qltk.tracknumbers import TrackNumbers from quodlibet.qltk.menubutton import MenuButton from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk.about import AboutDialog from quodlibet.qltk.songsmenu import SongsMenuPluginHandler from quodlibet.qltk.x import Align, SeparatorMenuItem, ConfigRHPaned, \ Button, SymbolicIconImage, MenuItem from quodlibet.qltk.window import PersistentWindowMixin, Window, UniqueWindow from quodlibet.qltk.msg import CancelRevertSave from quodlibet.qltk import Icons from quodlibet.util.i18n import numeric_phrase from quodlibet.util.path import mtime, normalize_path from quodlibet.util import connect_obj, connect_destroy, format_int_locale from quodlibet.update import UpdateDialog from quodlibet.compat import listfilter class ExFalsoWindow(Window, PersistentWindowMixin, AppWindow): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, (object,)), } pm = SongsMenuPluginHandler() @classmethod def init_plugins(cls): PluginManager.instance.register_handler(cls.pm) def __init__(self, library, dir=None): super(ExFalsoWindow, self).__init__(dialog=False) self.set_title("Ex Falso") self.set_default_size(750, 475) self.enable_window_tracking("exfalso") self.__library = library hp = ConfigRHPaned("memory", "exfalso_paned_position", 1.0) hp.set_border_width(0) hp.set_position(250) hp.show() self.add(hp) vb = Gtk.VBox() bbox = Gtk.HBox(spacing=6) def prefs_cb(*args): window = PreferencesWindow(self) window.show() def plugin_window_cb(*args): window = PluginWindow(self) window.show() def about_cb(*args): about = AboutDialog(self, app) about.run() about.destroy() def update_cb(*args): d = UpdateDialog(self) d.run() d.destroy() menu = Gtk.Menu() about_item = MenuItem(_("_About"), Icons.HELP_ABOUT) about_item.connect("activate", about_cb) menu.append(about_item) check_item = MenuItem(_("_Check for Updates…"), Icons.NETWORK_SERVER) check_item.connect("activate", update_cb) menu.append(check_item) menu.append(SeparatorMenuItem()) plugin_item = MenuItem(_("_Plugins"), Icons.SYSTEM_RUN) plugin_item.connect("activate", plugin_window_cb) menu.append(plugin_item) pref_item = MenuItem(_("_Preferences"), Icons.PREFERENCES_SYSTEM) pref_item.connect("activate", prefs_cb) menu.append(pref_item) menu.show_all() menu_button = MenuButton( SymbolicIconImage(Icons.EMBLEM_SYSTEM, Gtk.IconSize.BUTTON), arrow=True, down=False) menu_button.set_menu(menu) bbox.pack_start(menu_button, False, True, 0) l = Gtk.Label() l.set_alignment(1.0, 0.5) l.set_ellipsize(Pango.EllipsizeMode.END) bbox.pack_start(l, True, True, 0) self._fs = fs = MainFileSelector() vb.pack_start(fs, True, True, 0) vb.pack_start(Align(bbox, border=6), False, True, 0) vb.show_all() hp.pack1(vb, resize=True, shrink=False) nb = qltk.Notebook() nb.props.scrollable = True nb.show() for Page in [EditTags, TagsFromPath, RenameFiles, TrackNumbers]: page = Page(self, self.__library) page.show() nb.append_page(page) hp.pack2(nb, resize=True, shrink=False) fs.connect('changed', self.__changed, l) if dir: fs.go_to(dir) connect_destroy(self.__library, 'changed', self.__library_changed, fs) self.__save = None connect_obj(self, 'changed', self.set_pending, None) for c in fs.get_children(): c.get_child().connect('button-press-event', self.__pre_selection_changed, fs, nb) c.get_child().connect('focus', self.__pre_selection_changed, fs, nb) fs.get_children()[1].get_child().connect('popup-menu', self.__popup_menu, fs) self.emit('changed', []) self.get_child().show() self.__ag = Gtk.AccelGroup() key, mod = Gtk.accelerator_parse("<Primary>Q") self.__ag.connect(key, mod, 0, lambda *x: self.destroy()) self.add_accel_group(self.__ag) # GtkosxApplication assumes the menu bar is mapped, so add # it but don't show it. self._dummy_osx_menu_bar = Gtk.MenuBar() vb.pack_start(self._dummy_osx_menu_bar, False, False, 0) def __library_changed(self, library, songs, fs): fs.rescan() def set_as_osx_window(self, osx_app): osx_app.set_menu_bar(self._dummy_osx_menu_bar) def get_is_persistent(self): return False def open_file(self, filename): assert isinstance(filename, fsnative) if not os.path.isdir(filename): return False self._fs.go_to(filename) def set_pending(self, button, *excess): self.__save = button def __pre_selection_changed(self, view, event, fs, nb): if self.__save: resp = CancelRevertSave(self).run() if resp == Gtk.ResponseType.YES: self.__save.clicked() elif resp == Gtk.ResponseType.NO: fs.rescan() else: nb.grab_focus() return True # cancel or closed def __popup_menu(self, view, fs): # get all songs for the selection filenames = [normalize_path(f, canonicalise=True) for f in fs.get_selected_paths()] maybe_songs = [self.__library.get(f) for f in filenames] songs = [s for s in maybe_songs if s] if songs: menu = self.pm.Menu(self.__library, songs) if menu is None: menu = Gtk.Menu() else: menu.prepend(SeparatorMenuItem()) else: menu = Gtk.Menu() b = TrashMenuItem() b.connect('activate', self.__delete, filenames, fs) menu.prepend(b) def selection_done_cb(menu): menu.destroy() menu.connect('selection-done', selection_done_cb) menu.show_all() return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __delete(self, item, paths, fs): trash_files(self, paths) fs.rescan() def __changed(self, selector, selection, label): model, rows = selection.get_selected_rows() files = [] if len(rows) < 2: count = len(model or []) else: count = len(rows) label.set_text(numeric_phrase("%d song", "%d songs", count)) for row in rows: filename = model[row][0] if not os.path.exists(filename): pass elif filename in self.__library: song = self.__library[filename] if song("~#mtime") + 1. < mtime(filename): try: song.reload() except AudioFileError: pass files.append(song) else: files.append(formats.MusicFile(filename)) files = listfilter(None, files) if len(files) == 0: self.set_title("Ex Falso") elif len(files) == 1: self.set_title("%s - Ex Falso" % files[0].comma("title")) else: params = ({'title': files[0].comma("title"), 'count': format_int_locale(len(files) - 1)}) self.set_title( "%s - Ex Falso" % (ngettext("%(title)s and %(count)s more", "%(title)s and %(count)s more", len(files) - 1) % params)) self.__library.add(files) self.emit('changed', files) class PreferencesWindow(UniqueWindow): def __init__(self, parent): if self.is_not_unique(): return super(PreferencesWindow, self).__init__() self.set_title(_("Ex Falso Preferences")) self.set_border_width(12) self.set_resizable(False) self.set_transient_for(parent) vbox = Gtk.VBox(spacing=6) hb = Gtk.HBox(spacing=6) e = UndoEntry() e.set_text(config.get("editing", "split_on")) e.connect('changed', self.__changed, 'editing', 'split_on') l = Gtk.Label(label=_("Split _on:")) l.set_use_underline(True) l.set_mnemonic_widget(e) hb.pack_start(l, False, True, 0) hb.pack_start(e, True, True, 0) vbox.pack_start(hb, False, True, 0) f = qltk.Frame(_("Tag Editing"), child=vbox) close = Button(_("_Close"), Icons.WINDOW_CLOSE) connect_obj(close, 'clicked', lambda x: x.destroy(), self) button_box = Gtk.HButtonBox() button_box.set_layout(Gtk.ButtonBoxStyle.END) button_box.pack_start(close, True, True, 0) main_vbox = Gtk.VBox(spacing=12) main_vbox.pack_start(f, True, True, 0) self.use_header_bar() if not self.has_close_button(): main_vbox.pack_start(button_box, False, True, 0) self.add(main_vbox) connect_obj(self, 'destroy', PreferencesWindow.__destroy, self) self.get_child().show_all() def __changed(self, entry, section, name): config.set(section, name, entry.get_text()) def __destroy(self): config.save() ������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/songmodel.py���������������������������������������������������������0000644�0001750�0001750�00000021417�13112005742�021246� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet.qltk.playorder import OrderInOrder from quodlibet.qltk.models import ObjectStore from quodlibet.util import print_d from quodlibet.compat import izip class PlaylistMux(object): """Provides the PlaylistModel interface combining the song list model and the queue one. If no longer needed, call destroy(). """ def __init__(self, player, q, pl): self.q = q self.pl = pl self._id = player.connect('song-started', self.__song_started) self._player = player def destroy(self): self._player.disconnect(self._id) def __song_started(self, player, song): if song is not None and self.q.sourced: iter = self.q.find(song) if iter: self.q.remove(iter) # we don't call _check_sourced here since we want the queue # to stay sourced even if no current song is left @property def current(self): """The current song or None""" if self.q.current is not None: return self.q.current else: return self.pl.current def _check_sourced(self): if self.q.current is not None: self.q.sourced = True self.pl.sourced = False else: self.q.sourced = False self.pl.sourced = True def next(self): """Switch to the next song""" if self.q.is_empty(): self.pl.next() else: self.q.next() self._check_sourced() def next_ended(self): """Switch to the next song (action comes from the user)""" if self.q.is_empty(): self.pl.next_ended() else: self.q.next_ended() self._check_sourced() def previous(self): """Go to the previous song""" self.pl.previous() self._check_sourced() def go_to(self, song, explicit=False, source=None): """Switch the current active song to song. song can be an Gtk.TreeIter or AudioFile. explicit should be True of the action comes from the user. source should be the right PlaylistModel in case song is an iter. """ print_d("Told to go to %r" % getattr(song, "key", song)) main, other = self.pl, self.q if source is not None: assert source in (self.pl, self.q) if source is self.q: main, other = other, main other.go_to(None) res = main.go_to(song, explicit) self._check_sourced() return res def reset(self): """Switch to the first song""" self.q.go_to(None) self.pl.reset() self._check_sourced() def enqueue(self, songs): """Append the songs to the queue model""" self.q.append_many(songs) def unqueue(self, songs): """Remove all occurrences of all passed songs in the queue""" q = self.q for iter_ in q.find_all(songs): q.remove(iter_) class TrackCurrentModel(ObjectStore): def __init__(self, *args, **kwargs): super(TrackCurrentModel, self).__init__(*args, **kwargs) self.__iter = None last_current = None """The last valid current song""" def set(self, songs): """Clear the model and add the passed songs""" print_d("Filling view model with %d songs." % len(songs)) self.clear() self.__iter = None oldsong = self.last_current for iter_, song in izip(self.iter_append_many(songs), songs): if song is oldsong: self.__iter = iter_ def get(self): """A list of all contained songs""" return list(self.itervalues()) @property def current(self): """The current song or None""" return self.__iter and self.get_value(self.__iter, 0) @property def current_path(self): """The Gtk.TreePath of the current song or None""" return self.__iter and self.get_path(self.__iter) @property def current_iter(self): """The Gtk.TreeIter of the current song or None""" return self.__iter @current_iter.setter def current_iter(self, iter_): if iter_ == self.__iter: return # emit a row-changed for the previous and the new iter after it is set # so that the currentcolumn icon gets updated on song changes for it in filter(None, (self.__iter, iter_)): self.row_changed(self.get_path(it), it) self.__iter = iter_ self.last_current = self.current def find(self, song): """Returns the iter to the first occurrence of song in the model or None if it wasn't found. """ # fast path if self.current == song: return self.current_iter # search the rest for iter_, value in self.iterrows(): if value == song: return iter_ return def find_all(self, songs): """Returns a list of iters for all occurrences of all songs. (since a song can be in the model multiple times) """ songs = set(songs) found = [] append = found.append for iter_, value in self.iterrows(): if value in songs: append(iter_) return found def remove(self, iter_): if self.__iter and self[iter_].path == self[self.__iter].path: self.__iter = None super(TrackCurrentModel, self).remove(iter_) def clear(self): self.__iter = None super(TrackCurrentModel, self).clear() def __contains__(self, song): return bool(self.find(song)) class PlaylistModel(TrackCurrentModel): """A play list model for song lists""" order = None """The active `PlayOrder`""" sourced = False """True in case this model is the source of the currently playing song""" def __init__(self, order_cls=OrderInOrder): super(PlaylistModel, self).__init__(object) self.order = order_cls() # The playorder plugins use paths atm to remember songs so # we need to reset them if the paths change somehow. self.__sigs = [] for sig in ['row-deleted', 'row-inserted', 'rows-reordered']: s = self.connect(sig, lambda pl, *x: self.order.reset(pl)) self.__sigs.append(s) def next(self): """Switch to the next song""" iter_ = self.current_iter print_d("Using %s.next_explicit() to get next song" % self.order) self.current_iter = self.order.next_explicit(self, iter_) def next_ended(self): """Switch to the next song (action comes from the user)""" iter_ = self.current_iter print_d("Using %s.next_implicit() to get next song" % self.order) self.current_iter = self.order.next_implicit(self, iter_) def previous(self): """Go to the previous song""" iter_ = self.current_iter self.current_iter = self.order.previous_explicit(self, iter_) def go_to(self, song_or_iter, explicit=False, source=None): """Switch the current active song to song. song can be an Gtk.TreeIter or AudioFile. explicit should be True of the action comes from the user. source should be this model or None. """ assert source is None or source is self print_d("Told to go to %r" % getattr(song_or_iter, "key", song_or_iter)) iter_ = None if isinstance(song_or_iter, Gtk.TreeIter): iter_ = song_or_iter elif song_or_iter is not None: # We were told to go to a song that was valid but couldn't find it. # Set it as last current so it gets set current when we find it in # the future. self.last_current = song_or_iter iter_ = self.find(song_or_iter) if explicit: self.current_iter = self.order.set_explicit(self, iter_) else: self.current_iter = self.order.set_implicit(self, iter_) return self.current_iter def set(self, songs): """Clear the model and add the passed songs""" self.order.reset(self) for signal_id in self.__sigs: self.handler_block(signal_id) super(PlaylistModel, self).set(songs) for signal_id in self.__sigs: self.handler_unblock(signal_id) def reset(self): """Switch to the first song""" self.go_to(None) self.order.reset(self) if not self.is_empty(): self.next() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/properties.py��������������������������������������������������������0000644�0001750�0001750�00000015442�13112005742�021454� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012 Nick Boultbee # 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GObject, Pango from senf import fsn2text from quodlibet import ngettext, _ from quodlibet import qltk from quodlibet import config from quodlibet.qltk.edittags import EditTags from quodlibet.qltk.renamefiles import RenameFiles from quodlibet.qltk.tagsfrompath import TagsFromPath from quodlibet.qltk.tracknumbers import TrackNumbers from quodlibet.qltk.views import HintedTreeView from quodlibet.qltk.window import PersistentWindowMixin from quodlibet.qltk.x import ScrolledWindow, ConfigRPaned from quodlibet.qltk.models import ObjectStore, ObjectModelSort from quodlibet.qltk.msg import CancelRevertSave from quodlibet.util import connect_destroy from quodlibet.compat import cmp class _ListEntry(object): def __init__(self, song): self.song = song @property def name(self): return fsn2text(self.song("~basename")) class SongProperties(qltk.Window, PersistentWindowMixin): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, (object,)) } def __init__(self, library, songs, parent=None): super(SongProperties, self).__init__(dialog=False) self.set_transient_for(qltk.get_top_parent(parent)) default_width = 600 config_suffix = "" if len(songs) <= 1: default_width -= 200 config_suffix += "single" self.set_default_size(default_width, 400) self.enable_window_tracking("quodlibet_properties", size_suffix=config_suffix) self.auto_save_on_change = config.getboolean( 'editing', 'auto_save_changes', False) paned = ConfigRPaned("memory", "quodlibet_properties_pos", 0.4) notebook = qltk.Notebook() notebook.props.scrollable = True pages = [] pages.extend([Ctr(self, library) for Ctr in [EditTags, TagsFromPath, RenameFiles]]) if len(songs) > 1: pages.append(TrackNumbers(self, library)) for page in pages: page.show() notebook.append_page(page) fbasemodel = ObjectStore() fmodel = ObjectModelSort(model=fbasemodel) fview = HintedTreeView(model=fmodel) fview.connect('button-press-event', self.__pre_selection_changed) fview.set_rules_hint(True) selection = fview.get_selection() selection.set_mode(Gtk.SelectionMode.MULTIPLE) self.__save = None render = Gtk.CellRendererText() c1 = Gtk.TreeViewColumn(_('File'), render) if fview.supports_hints(): render.set_property('ellipsize', Pango.EllipsizeMode.END) render.set_property('xpad', 3) def cell_data(column, cell, model, iter_, data): entry = model.get_value(iter_) cell.set_property('text', entry.name) c1.set_cell_data_func(render, cell_data) def sort_func(model, a, b, data): a = model.get_value(a) b = model.get_value(b) return cmp(a.name, b.name) fmodel.set_sort_func(100, sort_func) c1.set_sort_column_id(100) fview.append_column(c1) sw = ScrolledWindow() sw.add(fview) sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) # only show the list if there are is more than one song if len(songs) > 1: sw.show_all() paned.pack1(sw, shrink=False, resize=True) for song in songs: fbasemodel.append(row=[_ListEntry(song)]) self.connect("changed", self.__on_changed) selection.select_all() paned.pack2(notebook, shrink=False, resize=True) csig = selection.connect('changed', self.__selection_changed) connect_destroy(library, 'changed', self.__on_library_changed, fbasemodel, fview) connect_destroy(library, 'removed', self.__on_library_removed, fbasemodel, selection, csig) self.emit('changed', songs) self.add(paned) paned.set_position(175) notebook.show() paned.show() def __on_library_removed(self, library, songs, model, selection, sig): selection.handler_block(sig) rows = selection.get_selected_rows()[1] to_remove = [] changed = False for row in model: if row[0].song in songs: to_remove.append(row.iter) changed = changed or (row.path in rows) for iter_ in to_remove: model.remove(iter_) selection.handler_unblock(sig) if changed: selection.emit('changed') def __on_changed(self, widget, songs): if songs: if len(songs) == 1: title = songs[0].comma("title") else: title = ngettext( "%(title)s and %(count)d more", "%(title)s and %(count)d more", len(songs) - 1) % {'title': songs[0].comma("title"), 'count': len(songs) - 1} self.set_title("%s - %s" % (title, _("Properties"))) else: self.set_title(_("Properties")) self.set_pending(None) def __on_library_changed(self, library, songs, model, view): # in case the library changes, sync the model and emit # selection changed if one of the selected was changed paths = view.get_selection().get_selected_rows()[1] changed = False for row in model: song = row[0].song if song in songs: model.row_changed(row.path, row.iter) changed = changed or (row.path in paths) if changed: view.get_selection().emit('changed') def set_pending(self, button, *excess): self.__save = button def __pre_selection_changed(self, view, event): if self.__save: if self.auto_save_on_change: self.__save.clicked() return resp = CancelRevertSave(self).run() if resp == Gtk.ResponseType.YES: self.__save.clicked() elif resp == Gtk.ResponseType.NO: return False else: return True # cancel or closed def __selection_changed(self, selection): model = selection.get_tree_view().get_model() model, paths = selection.get_selected_rows() songs = [model[path][0].song for path in paths] self.emit('changed', songs) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/playorder.py���������������������������������������������������������0000644�0001750�0001750�00000027226�13112005742�021264� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GObject from quodlibet import _ from quodlibet import config from quodlibet import qltk from quodlibet.order import Order, OrderInOrder from quodlibet.order.reorder import OrderShuffle, OrderWeighted, Reorder from quodlibet.order.repeat import RepeatListForever, RepeatSongForever, \ Repeat, OneSong from quodlibet.qltk import Icons from quodlibet.qltk.x import SymbolicIconImage, RadioMenuItem, \ SeparatorMenuItem from quodlibet.plugins import PluginManager from quodlibet.util.dprint import print_w, print_d class Orders(GObject.Object): """ A minimal list-like container for Order objects that signals on changes """ __gsignals__ = { 'updated': (GObject.SignalFlags.RUN_LAST, None, ()), } def __init__(self, initial=None): super(Orders, self).__init__() self.items = initial or [] def by_name(self, name): if not name: return None for cls in self.items: if cls.name == name: return cls return None def __getitem__(self, y): return self.items.__getitem__(y) def __len__(self): return self.items.__len__() def append(self, x): self.items.append(x) self.emit('updated') def remove(self, x): self.items.remove(x) self.emit('updated') def __contains__(self, y): return self.items.__contains__(y) def __str__(self): return "<%s of %s>" % (type(self).__name__, self.items) class PluggableOrders(Orders, PluginManager): """Registers as a Plugin Handler for various types of `Order` plugins""" def __init__(self, orders, base_cls): assert issubclass(base_cls, Order) super(PluggableOrders, self).__init__(orders) self.base_cls = base_cls if PluginManager.instance: PluginManager.instance.register_handler(self) else: print_w("No plugin manager found") def plugin_handle(self, plugin): return issubclass(plugin.cls, self.base_cls) def plugin_enable(self, plugin): plugin_cls = plugin.cls if plugin_cls.name is None: plugin_cls.name = plugin.name if plugin_cls.display_name is None: plugin_cls.display_name = str(plugin.name).capitalize() if plugin_cls.accelerated_name is None: plugin_cls.accelerated_name = plugin_cls.display_name self.append(plugin_cls) def plugin_disable(self, plugin): self.remove(plugin.cls) DEFAULT_SHUFFLE_ORDERS = [OrderShuffle, OrderWeighted] DEFAULT_REPEAT_ORDERS = [RepeatSongForever, RepeatListForever, OneSong] class ToggledPlayOrderMenu(Gtk.Box): """A toggle button with a menu button. Items displayed are all `PlayOrder` When the button is toggled, a `toggled` signal gets emitted. """ __gsignals__ = { 'toggled': (GObject.SignalFlags.RUN_LAST, None, ()), 'changed': (GObject.SignalFlags.RUN_LAST, None, (object,)), } def __init__(self, icon_name, orders, current_order, enabled=False, tooltip=None, arrow_down=False): """arrow_down -- the direction of the menu and arrow icon""" assert issubclass(current_order, Order) if current_order not in orders: raise ValueError("%s is not supported by %s" % (current_order.__name__, orders)) super(ToggledPlayOrderMenu, self).__init__() self.__inhibit = True context = self.get_style_context() context.add_class(Gtk.STYLE_CLASS_LINKED) self._toggle_button = toggle = Gtk.ToggleButton( image=SymbolicIconImage(icon_name, Gtk.IconSize.SMALL_TOOLBAR)) if tooltip: toggle.set_tooltip_text(tooltip) toggle.set_active(enabled) toggle.show_all() qltk.remove_padding(toggle) toggle.set_size_request(26, 26) self.pack_start(toggle, True, True, 0) def forward_signal(*args): if not self.__inhibit: self.emit("toggled") toggle.connect("toggled", forward_signal) self._toggle_button = toggle from quodlibet.qltk.menubutton import MenuButton arrow = MenuButton(arrow=True, down=arrow_down) arrow.show_all() arrow.set_size_request(20, 26) qltk.remove_padding(arrow) self.pack_start(arrow, True, True, 0) self._menu_button = arrow self.__current = current_order self.__orders = orders self.__rebuild_menu() self.__inhibit = False @property def enabled(self): """Returns True if toggle button is active""" return self._toggle_button.get_active() @enabled.setter def enabled(self, value): """Set button to be active or inactive""" self.__inhibit = True self._toggle_button.set_active(bool(value)) self.emit("toggled") self.__inhibit = False @property def orders(self): return self.__orders @orders.setter def orders(self, values): self.__orders = values if self.__current not in self.orders: self.__current = None self.__rebuild_menu() @property def current(self): return self.__current @current.setter def current(self, value): if value not in self.orders: raise ValueError( "Unknown order %s. Try: %s" % (value, ", ".join([o.__name__ for o in self.__orders]))) self.__current = value if not self.__inhibit: self.emit('changed', self.__current) def set_active_by_name(self, name): for cls in self.__orders: if cls.name == name: self.current = cls return raise ValueError("Unknown order named \"%s\". Try: %s" % (name, [o.name for o in self.__orders])) def set_orders(self, orders): self.orders = orders def __rebuild_menu(self): def toggled_cb(item, order): if item.get_active(): self.current = order menu = Gtk.Menu() group = None prev_priority = None def ui_sorted(items): return sorted(items, key=lambda k: (k.priority, k.display_name)) for order in ui_sorted(self.__orders): if prev_priority and order.priority > prev_priority: menu.append(SeparatorMenuItem()) prev_priority = order.priority group = RadioMenuItem( label=order.accelerated_name, use_underline=True, group=group) group.set_active(order == self.__current) group.connect("toggled", toggled_cb, order) menu.append(group) menu.show_all() self._menu_button.set_menu(menu) class PlayOrderWidget(Gtk.HBox): """A combined play order selection widget. Whenever something changes the 'changed' signal gets emitted. """ __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, ()), } def __init__(self, model, player): super(PlayOrderWidget, self).__init__(spacing=6) self.order = None self.__inhibit = True self.__playlist = model self.__player = player def create_shuffle(orders): shuffle = ToggledPlayOrderMenu( Icons.MEDIA_PLAYLIST_SHUFFLE, orders=orders, current_order=self.__get_shuffle_class(), enabled=(config.getboolean("memory", "shuffle", False)), tooltip=_("Toggle shuffle mode")) shuffle.connect('changed', self.__shuffle_updated) shuffle.connect('toggled', self.__shuffle_toggled) return shuffle self._shuffle_orders = PluggableOrders(DEFAULT_SHUFFLE_ORDERS, Reorder) self.__shuffle_widget = create_shuffle(self._shuffle_orders) self._shuffle_orders.connect('updated', self.__shuffle_widget.set_orders) def create_repeat(orders): repeat = ToggledPlayOrderMenu( Icons.MEDIA_PLAYLIST_REPEAT, orders=orders, current_order=self.__get_repeat_class(), enabled=config.getboolean("memory", "repeat", False), tooltip=_("Toggle repeat mode")) repeat.connect('changed', self.__repeat_updated) repeat.connect('toggled', self.__repeat_toggled) return repeat self._repeat_orders = PluggableOrders(DEFAULT_REPEAT_ORDERS, Repeat) self.__repeat_widget = create_repeat(self._repeat_orders) self._repeat_orders.connect('updated', self.__repeat_widget.set_orders) self.__compose_order() self.pack_start(self.__shuffle_widget, False, True, 0) self.pack_start(self.__repeat_widget, False, True, 0) self.__inhibit = False @property def shuffler(self): return self.__shuffle_widget.current @shuffler.setter def shuffler(self, cls): assert issubclass(cls, Reorder) self.__shuffle_widget.current = cls @property def repeater(self): return self.__repeat_widget.current @repeater.setter def repeater(self, cls): assert issubclass(cls, Repeat) self.__repeat_widget.current = cls @property def shuffled(self): return self.__shuffle_widget.enabled @shuffled.setter def shuffled(self, enabled): self.__shuffle_widget.enabled = bool(enabled) @property def repeated(self): return self.__repeat_widget.enabled @repeated.setter def repeated(self, enabled): self.__repeat_widget.enabled = bool(enabled) def __repeat_updated(self, widget, repeat_cls): if self.__inhibit: return print_d("New repeat mode: %s" % repeat_cls.name) config.set("memory", "repeat_mode", repeat_cls.name) self.__compose_order() def __shuffle_updated(self, widget, shuffle_cls): if self.__inhibit: return print_d("New shuffle mode: %s" % shuffle_cls.name) config.set("memory", "shuffle_mode", shuffle_cls.name) self.__compose_order() def __shuffle_toggled(self, widget): if self.__inhibit: return config.set("memory", "shuffle", widget.enabled) self.__compose_order() def __repeat_toggled(self, widget): if self.__inhibit: return config.set("memory", "repeat", widget.enabled) self.__compose_order() def __compose_order(self): old_order = self.order repeat_cls = self.__get_repeat_class() shuffle_cls = self.__get_shuffle_class() shuffler = (shuffle_cls() if self.shuffled else OrderInOrder()) self.order = repeat_cls(shuffler) if self.repeated else shuffler print_d("Updating %s order to %s" % (type(self.__playlist).__name__, self.order)) self.__playlist.order = self.order self.__player.replaygain_profiles[2] = shuffler.replaygain_profiles self.__player.reset_replaygain() if self.order != old_order: self.emit('changed') def __get_shuffle_class(self): name = config.get("memory", "shuffle_mode", None) return self._shuffle_orders.by_name(name) or OrderShuffle def __get_repeat_class(self): name = config.get("memory", "repeat_mode", None) return self._repeat_orders.by_name(name) or RepeatSongForever ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/entry.py�������������������������������������������������������������0000644�0001750�0001750�00000020346�13112005742�020420� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 2011, 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import math from gi.repository import Gtk, GObject, Gdk, Gio, Pango from quodlibet import _ from quodlibet.qltk import is_accel, add_fake_accel from quodlibet.qltk.x import SeparatorMenuItem, MenuItem from quodlibet.qltk import Icons from quodlibet.util import gdecode from quodlibet.compat import string_types class EditableUndo(object): """A simple undo/redo implementation for gtk widgets that support the gtk.Editable interface""" def set_undo(self, val): if val: self.__enable_undo() else: self.__disable_undo() def reset_undo(self): self.__history = [] self.__re_history = [] self.__in_pos = -1 self.__del_pos = -1 self.__last_space = False def undo(self): self.__do(self.__history, self.__re_history) def redo(self): self.__do(self.__re_history, self.__history) def can_undo(self): return self.__can_do(self.__history) def can_redo(self): return self.__can_do(self.__re_history) def __enable_undo(self): self.reset_undo() self.__handlers = [ self.connect("insert-text", self.__insert_before), self.connect("delete-text", self.__delete_before), self.connect('populate-popup', self.__popup), self.connect('key-press-event', self.__key_press), ] def __key_press(self, entry, event): if is_accel(event, "<Primary>z"): self.undo() return True elif is_accel(event, "<Primary><shift>z"): self.redo() return True return False def __disable_undo(self): for handler in self.__handlers: self.disconnect(handler) del self.__history del self.__re_history del self.__last_space del self.__in_pos del self.__del_pos def __popup(self, entry, menu): undo = MenuItem(_("_Undo"), Icons.EDIT_UNDO) add_fake_accel(undo, "<Primary>z") redo = MenuItem(_("_Redo"), Icons.EDIT_REDO) add_fake_accel(redo, "<Primary><shift>z") sep = SeparatorMenuItem() for widget in [sep, redo, undo]: widget.show() undo.connect('activate', lambda *x: self.undo()) redo.connect('activate', lambda *x: self.redo()) undo.set_sensitive(self.can_undo()) redo.set_sensitive(self.can_redo()) for item in [sep, redo, undo]: menu.prepend(item) def __all(self): text = gdecode(self.get_chars(0, -1)) pos = self.get_position() return [text, pos] def __add(self): self.__history.append(self.__all()) self.__re_history = [] def __insert_before(self, entry, text, length, position): self.__del_pos = -1 pos = self.get_position() if pos != self.__in_pos or (self.__last_space and text != " ") \ or length > 1: self.__add() self.__last_space = (text == " ") self.__in_pos = pos + 1 def __delete_before(self, entry, start, end): self.__in_pos = -1 text = self.get_chars(start, end) length = end - start pos = self.get_position() if pos != self.__del_pos or (self.__last_space and text != " ") \ or length > 1: self.__add() self.__last_space = (text == " ") self.__del_pos = end - 1 def __inhibit(self): for handler in self.__handlers: self.handler_block(handler) def __uninhibit(self): for handler in self.__handlers: self.handler_unblock(handler) def __can_do(self, source): return bool(source) def __do(self, source, target): if not self.__can_do(source): return self.__del_pos = self.__in_pos = -1 self.__inhibit() now = self.__all() last = source.pop(-1) if now != last: target.append(now) text, pos = last self.delete_text(0, -1) self.insert_text(text, 0) self.set_position(pos) self.__uninhibit() class Entry(Gtk.Entry): def __init__(self, *args, **kwargs): super(Entry, self).__init__(*args, **kwargs) self._max_width_chars = -1 # the default is way too much self.set_width_chars(5) def set_max_width_chars(self, value): """Works with GTK+ <3.12""" self._max_width_chars = value self.queue_resize() def do_get_preferred_width(self): minimum, natural = Gtk.Entry.do_get_preferred_width(self) if self._max_width_chars >= 0: # based on gtkentry.c style_context = self.get_style_context() style_context.save() style_context.set_state(Gtk.StateFlags.NORMAL) border = style_context.get_border(style_context.get_state()) padding = style_context.get_padding(style_context.get_state()) style_context.restore() pango_context = self.get_pango_context() metrics = pango_context.get_metrics( pango_context.get_font_description(), pango_context.get_language()) char_width = metrics.get_approximate_char_width() digit_width = metrics.get_approximate_digit_width() char_pixels = int(math.ceil( float(max(char_width, digit_width)) / Pango.SCALE)) space = border.left + border.right + padding.left + padding.right nat_width = self._max_width_chars * char_pixels + space natural = max(nat_width, minimum) return (minimum, natural) class UndoEntry(Entry, EditableUndo): def __init__(self, *args): super(UndoEntry, self).__init__(*args) self.set_undo(True) def set_text(self, *args): super(UndoEntry, self).set_text(*args) self.reset_undo() class ClearEntryMixin(object): """A clear icon mixin supporting newer Gtk.Entry or a separate clear button as a fallback. """ __gsignals__ = { 'clear': (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, ()) } def enable_clear_button(self): """Enables the clear icon in the entry""" gicon = Gio.ThemedIcon.new_from_names( ["edit-clear-symbolic", "edit-clear"]) self.set_icon_from_gicon(Gtk.EntryIconPosition.SECONDARY, gicon) self.connect("icon-release", self.__clear) def clear(self): self.__do_clear() def __clear(self, button, *args): self.__do_clear() def __do_clear(self): # TODO: don't change the order.. we connect to clear and remove all # timeouts added for text change in the searchbar self.delete_text(0, -1) self.emit('clear') class ClearEntry(UndoEntry, ClearEntryMixin): __gsignals__ = ClearEntryMixin.__gsignals__ class ValidatingEntryMixin(object): """An entry with visual feedback as to whether it is valid or not. The given validator function gets a string and returns True (green), False (red), or None (black). """ INVALID = Gdk.RGBA(0.8, 0, 0) VALID = Gdk.RGBA(0.3, 0.6, 0.023) def set_validate(self, validator=None): if validator: self.connect('changed', self.__color, validator) def __color(self, widget, validator): value = validator(gdecode(self.get_text())) if value is True: color = self.VALID elif value is False: color = self.INVALID elif value and isinstance(value, string_types): color = Gdk.RGBA() color.parse(value) else: color = None if color and self.get_property('sensitive'): self.override_color(Gtk.StateType.NORMAL, color) else: self.override_color(Gtk.StateType.NORMAL, None) class ValidatingEntry(ClearEntry, ValidatingEntryMixin): def __init__(self, validator=None, *args): super(ValidatingEntry, self).__init__(*args) self.set_validate(validator) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/getstring.py���������������������������������������������������������0000644�0001750�0001750�00000005321�13112005742�021261� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 2013, 2015 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, Gdk from quodlibet import _ from quodlibet.qltk.window import Dialog from quodlibet.qltk import Icons from quodlibet.qltk.entry import UndoEntry class GetStringDialog(Dialog): """Simple dialog to return a string from the user""" def __init__(self, parent, title, text, button_label=_("_OK"), button_icon=Icons.DOCUMENT_OPEN, tooltip=None): super(GetStringDialog, self).__init__( title=title, transient_for=parent, use_header_bar=True) self.set_border_width(6) self.set_resizable(True) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button(button_label, button_icon, Gtk.ResponseType.OK) self.vbox.set_spacing(6) self.set_default_response(Gtk.ResponseType.OK) box = Gtk.VBox(spacing=6) lab = Gtk.Label(label=text) box.set_border_width(6) lab.set_line_wrap(True) lab.set_justify(Gtk.Justification.CENTER) box.pack_start(lab, True, True, 0) self._val = UndoEntry() if tooltip: self._val.set_tooltip_text(tooltip) self._val.set_max_width_chars(50) box.pack_start(self._val, True, True, 0) self.vbox.pack_start(box, True, True, 0) self.get_child().show_all() def _verify_clipboard(self, text): """Return an altered text or None if the content was invalid.""" return def run(self, text="", clipboard=False, test=False): """Shows the dialog and returns the entered value. If clipboard is set, the initial value will be pulled from the clipboard and can be verified/altered by _verify_clipboard. In case the verification fails text will be used as fallback""" self.show() if clipboard: clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) clip = clipboard.wait_for_text() if clip is not None: clip = self._verify_clipboard(clip) if clip is not None: text = clip self._val.set_text(text) self._val.set_activates_default(True) self._val.grab_focus() resp = Gtk.ResponseType.OK if not test: resp = super(GetStringDialog, self).run() if resp == Gtk.ResponseType.OK: value = self._val.get_text() else: value = None self.destroy() return value ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/songlist.py����������������������������������������������������������0000644�0001750�0001750�00000117444�13112005742�021127� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # 2012 Christoph Reiter # 2014 Jan Path # 2011-2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk, GLib, Gdk, GObject from senf import uri2fsn from quodlibet import app from quodlibet import config from quodlibet import const from quodlibet import qltk from quodlibet import util from quodlibet import _ from quodlibet.query import Query from quodlibet.pattern import Pattern from quodlibet.qltk.information import Information from quodlibet.qltk.properties import SongProperties from quodlibet.qltk.views import AllTreeView, DragScroll from quodlibet.qltk.ratingsmenu import ConfirmRateMultipleDialog from quodlibet.qltk.songmodel import PlaylistModel from quodlibet.qltk import Icons from quodlibet.qltk.delete import trash_songs from quodlibet.formats._audio import TAG_TO_SORT, AudioFile from quodlibet.qltk.x import SeparatorMenuItem from quodlibet.qltk.songlistcolumns import create_songlist_column from quodlibet.util import connect_destroy from quodlibet.compat import xrange, string_types, iteritems, listfilter DND_QL, DND_URI_LIST = range(2) class SongSelectionInfo(GObject.Object): """ Songs which get included in the status bar summary. The `changed` signal gets fired after any of the songs in the selection or the selection it self has changed. The signal is async. Two selection states: - 0 or 1 selected row: all rows - 2 or more: only the selected rows The signals fires if the state changes. FIXME: `row-changed` for song lists isn't implemented (performance). Since a library change could change the selection it should also trigger this. Since this would happen quite often (song stat changes) and would lead to a complete re-calc in the common case, ignore it for now. """ __gsignals__ = { # changed(songs:list) 'changed': (GObject.SignalFlags.RUN_LAST, None, (object,)) } def __init__(self, songlist): super(SongSelectionInfo, self).__init__() self.__idle = None self.__songlist = songlist self.__selection = sel = songlist.get_selection() self.__count = sel.count_selected_rows() self.__sel_id = songlist.connect( 'selection-changed', self.__selection_changed_cb) def destroy(self): self.__songlist.disconnect(self.__sel_id) if self.__idle: GLib.source_remove(self.__idle) def refresh(self): songlist = self.__songlist songs = songlist.get_selected_songs() or songlist.get_songs() self.emit('changed', songs) def _update_songs(self, songs): """After making changes (filling the list) call this to skip any queued changes and emit the passed songs instead""" self.__emit_info_selection(songs) self.__count = len(songs) def __idle_emit(self, songs): if songs is None: if self.__count <= 1: songs = self.__songlist.get_songs() else: songs = self.__songlist.get_selected_songs() self.emit('changed', songs) self.__idle = None def __emit_info_selection(self, songs=None): if self.__idle: GLib.source_remove(self.__idle) self.__idle = GLib.idle_add( self.__idle_emit, songs, priority=GLib.PRIORITY_LOW) def __selection_changed_cb(self, songlist, selection): count = selection.count_selected_rows() if self.__count == count == 0: return if count <= 1: if self.__count > 1: self.__emit_info_selection() else: self.__emit_info_selection() self.__count = count def get_columns(): """Gets the list of songlist column headings""" if config.has_option("settings", "columns"): columns = config.getstringlist( "settings", "columns", const.DEFAULT_COLUMNS) else: # migrate old settings try: columns = config.get("settings", "headers").split() except config.Error: columns = const.DEFAULT_COLUMNS else: config.remove_option("settings", "headers") set_columns(columns) config.setstringlist("settings", "columns", columns) if "~current" in columns: columns.remove("~current") return columns def set_columns(vals): """Persists the settings for songlist headings held in `vals`""" config.setstringlist("settings", "columns", vals) def get_sort_tag(tag): """Returns a tag that can be used for sorting for the given column tag. Returns '' if the default sort key should be used. """ replace_order = { "~#track": "", "~#disc": "", "~length": "~#length" } if tag == "~title~version": tag = "title" elif tag == "~album~discsubtitle": tag = "album" if "<" in tag: for key, value in iteritems(replace_order): tag = tag.replace("<%s>" % key, "<%s>" % value) for key, value in iteritems(TAG_TO_SORT): tag = tag.replace("<%s>" % key, "<{1}|<{1}>|<{0}>>".format(key, value)) tag = Pattern(tag).format else: tags = util.tagsplit(tag) sort_tags = [] for tag in tags: tag = replace_order.get(tag, tag) tag = TAG_TO_SORT.get(tag, tag) if tag not in sort_tags: sort_tags.append(tag) if len(sort_tags) > 1: tag = "~" + "~".join(sort_tags) return tag def header_tag_split(header): """Split a pattern or a tied tag into separate tags""" if "<" in header: try: return list(Pattern(header).tags) except ValueError: return [] else: return util.tagsplit(header) class SongListDnDMixin(object): """DnD support for the SongList class""" def setup_drop(self, library): self.connect('drag-begin', self.__drag_begin) self.connect('drag-motion', self.__drag_motion) self.connect('drag-leave', self.__drag_leave) self.connect('drag-data-get', self.__drag_data_get) self.connect('drag-data-received', self.__drag_data_received, library) def __drag_begin(self, *args): ok, state = Gtk.get_current_event_state() if ok and state & qltk.get_primary_accel_mod(): self.__force_copy = True else: self.__force_copy = False def enable_drop(self, by_row=True): targets = [ ("text/x-quodlibet-songs", Gtk.TargetFlags.SAME_APP, DND_QL), ("text/uri-list", 0, DND_URI_LIST) ] targets = [Gtk.TargetEntry.new(*t) for t in targets] self.drag_source_set( Gdk.ModifierType.BUTTON1_MASK, targets, Gdk.DragAction.COPY | Gdk.DragAction.MOVE) self.drag_dest_set(Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY | Gdk.DragAction.MOVE) self.__drop_by_row = by_row self.__force_copy = False def disable_drop(self): targets = [ ("text/x-quodlibet-songs", Gtk.TargetFlags.SAME_APP, DND_QL), ("text/uri-list", 0, DND_URI_LIST) ] targets = [Gtk.TargetEntry.new(*t) for t in targets] self.drag_source_set( Gdk.ModifierType.BUTTON1_MASK, targets, Gdk.DragAction.COPY) self.drag_dest_unset() def __drag_motion(self, view, ctx, x, y, time): if self.__drop_by_row: self.set_drag_dest(x, y) self.scroll_motion(x, y) if Gtk.drag_get_source_widget(ctx) == self and \ not self.__force_copy: kind = Gdk.DragAction.MOVE else: kind = Gdk.DragAction.COPY Gdk.drag_status(ctx, kind, time) return True else: self.get_parent().drag_highlight() Gdk.drag_status(ctx, Gdk.DragAction.COPY, time) return True def __drag_leave(self, widget, ctx, time): widget.get_parent().drag_unhighlight() self.scroll_disable() def __drag_data_get(self, view, ctx, sel, tid, etime): model, paths = self.get_selection().get_selected_rows() if tid == DND_QL: songs = [model[path][0] for path in paths if model[path][0].can_add] if len(songs) != len(paths): qltk.ErrorMessage( qltk.get_top_parent(self), _("Unable to copy songs"), _("The files selected cannot be copied to other " "song lists or the queue.")).run() Gdk.drag_abort(ctx, etime) return qltk.selection_set_songs(sel, songs) if ctx.get_actions() & Gdk.DragAction.MOVE: self.__drag_iters = list(map(model.get_iter, paths)) else: self.__drag_iters = [] else: uris = [model[path][0]("~uri") for path in paths] sel.set_uris(uris) self.__drag_iters = [] def __drag_data_received(self, view, ctx, x, y, sel, info, etime, library): model = view.get_model() if info == DND_QL: filenames = qltk.selection_get_filenames(sel) move = bool(ctx.get_selected_action() & Gdk.DragAction.MOVE) elif info == DND_URI_LIST: def to_filename(s): try: return uri2fsn(s) except ValueError: return None filenames = listfilter(None, map(to_filename, sel.get_uris())) move = False else: Gtk.drag_finish(ctx, False, False, etime) return to_add = [] for filename in filenames: if filename not in library.librarian: library.add_filename(filename) elif filename not in library: to_add.append(library.librarian[filename]) library.add(to_add) songs = listfilter(None, map(library.get, filenames)) if not songs: Gtk.drag_finish(ctx, bool(not filenames), False, etime) return if not self.__drop_by_row: success = self.__drag_data_browser_dropped(songs) Gtk.drag_finish(ctx, success, False, etime) return try: path, position = view.get_dest_row_at_pos(x, y) except TypeError: path = max(0, len(model) - 1) position = Gtk.TreeViewDropPosition.AFTER if move and Gtk.drag_get_source_widget(ctx) == view: iter = model.get_iter(path) # model can't be empty, we're moving if position in (Gtk.TreeViewDropPosition.BEFORE, Gtk.TreeViewDropPosition.INTO_OR_BEFORE): while self.__drag_iters: model.move_before(self.__drag_iters.pop(0), iter) else: while self.__drag_iters: model.move_after(self.__drag_iters.pop(), iter) Gtk.drag_finish(ctx, True, False, etime) else: song = songs.pop(0) try: iter = model.get_iter(path) except ValueError: iter = model.append(row=[song]) # empty model else: if position in (Gtk.TreeViewDropPosition.BEFORE, Gtk.TreeViewDropPosition.INTO_OR_BEFORE): iter = model.insert_before(iter, [song]) else: iter = model.insert_after(iter, [song]) for song in songs: iter = model.insert_after(iter, [song]) Gtk.drag_finish(ctx, True, move, etime) def __drag_data_browser_dropped(self, songs): window = qltk.get_top_parent(self) return window.browser.dropped(songs) class SongList(AllTreeView, SongListDnDMixin, DragScroll, util.InstanceTracker): # A TreeView containing a list of songs. __gsignals__ = { # changed(songs:list) 'orders-changed': (GObject.SignalFlags.RUN_LAST, None, []) } headers = [] # The list of current headers. star = list(Query.STAR) sortable = True def Menu(self, header, browser, library): songs = self.get_selected_songs() if not songs: return def Filter(t): # Translators: The substituted string is the name of the # selected column (a translated tag name). b = qltk.MenuItem( _("_Filter on %s") % util.tag(t, True), Icons.EDIT_FIND) b.connect('activate', self.__filter_on, t, songs, browser) return b header = header_tag_split(header)[0] can_filter = browser.can_filter menu_items = [] if (header not in ["artist", "album"] and can_filter(header)): menu_items.append(Filter(header)) if can_filter("artist"): menu_items.append(Filter("artist")) if can_filter("album"): menu_items.append(Filter("album")) menu = browser.Menu(songs, library, items=[menu_items]) menu.show_all() return menu def __init__(self, library, player=None, update=False, model_cls=PlaylistModel): super(SongList, self).__init__() self._register_instance(SongList) self.set_model(model_cls()) self.info = SongSelectionInfo(self) self.set_size_request(200, 150) self.set_rules_hint(True) self.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) self.set_fixed_height_mode(True) self.__csig = self.connect('columns-changed', self.__columns_changed) self._first_column = None # A priority list of how to apply the sort keys. # might contain column header names not present... self._sort_sequence = [] self.set_column_headers(self.headers) librarian = library.librarian or library connect_destroy(librarian, 'changed', self.__song_updated) connect_destroy(librarian, 'removed', self.__song_removed, player) if update: connect_destroy(librarian, 'added', self.__song_added) if player: connect_destroy( player, 'paused', lambda *x: self.__redraw_current()) connect_destroy( player, 'unpaused', lambda *x: self.__redraw_current()) connect_destroy( player, 'error', lambda *x: self.__redraw_current()) self.connect('button-press-event', self.__button_press, librarian) self.connect('key-press-event', self.__key_press, librarian, player) self.setup_drop(library) self.disable_drop() self.set_search_equal_func(self.__search_func, None) self.connect('destroy', self.__destroy) @property def model(self): return self.get_model() @property def sourced(self): return self.model.sourced def toggle_column_sort(self, column, replace=True, refresh=True): """Toggles the sort order of a column. If not sorted, defaults to Gtk.SortType.ASCENDING If replace is False, the column will be appended to existing sorted columns. If it replaces a sort sequence where it was part of before it will not toggle itself, only remove the other ones. If refresh is True, the song list will be resorted. """ if not self.sortable: return # update the sort priority list if replace: del self._sort_sequence[:] else: try: self._sort_sequence.remove(column.header_name) except ValueError: pass self._sort_sequence.append(column.header_name) # in case we replace a multi sort with one sort that was part before # don't toggle, because it usually means we want to get rid of # the other one dont_reverse = False if replace and column.get_sort_indicator(): for c in self.get_columns(): if c is not column and c.get_sort_indicator(): dont_reverse = True break # set the inidicators default_order = Gtk.SortType.ASCENDING reversed_ = False for c in self.get_columns(): if c is column: if c.get_sort_indicator(): if dont_reverse: order = c.get_sort_order() else: order = not c.get_sort_order() reversed_ = True else: order = default_order c.set_sort_order(order) c.set_sort_indicator(True) if not replace: break elif replace: c.set_sort_indicator(False) if refresh: songs = self.get_songs() if reversed_: # python sort is faster if presorted songs.reverse() self.set_songs(songs, scroll_select=True) self.emit("orders-changed") def find_default_sort_column(self): """Returns a column that will sort using only the default sort key or None if none can't be found """ for c in self.get_columns(): # get_sort_tag == "" if the default sort key should be used if not get_sort_tag(c.header_name): return c def is_sorted(self): """If any of the columns has a sort indicator. This does not mean that the list content is sorted. """ for c in self.get_columns(): if c.get_sort_indicator(): return True return False def clear_sort(self): """Remove all column sort indicators""" for h in self.get_columns(): h.set_sort_indicator(False) del self._sort_sequence[:] self.emit("orders-changed") def get_sort_orders(self): """Returns a list of tuples (header_name, descending)""" sorted_ = [c for c in self.get_columns() if c.get_sort_indicator()] # if someone adds columns and sorts them using the TV API directly.. # better not crash I guess for c in sorted_: if c.header_name not in self._sort_sequence: self._sort_sequence.append(c.header_name) sorted_.sort(key=lambda c: self._sort_sequence.index(c.header_name)) return [(c.header_name, bool(c.get_sort_order())) for c in sorted_] def set_sort_orders(self, orders): """Pass a value returned by get_sort_orders() to restore the state""" if not self.sortable: return self._sort_sequence = [tag for tag, o in orders] orders = dict(orders) for c in self.get_columns(): if c.header_name in orders: c.set_sort_indicator(True) c.set_sort_order(orders[c.header_name]) else: c.set_sort_indicator(False) self.emit("orders-changed") def __destroy(self, *args): self.info.destroy() self.info = None self.handler_block(self.__csig) for column in self.get_columns(): self.remove_column(column) self.handler_unblock(self.__csig) def __search_func(self, model, column, key, iter, *args): for column in self.get_columns(): value = model.get_value(iter)(column.header_name) if not isinstance(value, string_types): continue elif key in value.lower() or key in value: return False else: return True def __filter_on(self, widget, header, songs, browser): if not browser: return # Fall back to the playing song if songs is None: if app.player.song: songs = [app.player.song] else: return browser.filter_on(songs, header) def __button_press(self, view, event, librarian): if event.button != Gdk.BUTTON_PRIMARY: return x, y = map(int, [event.x, event.y]) try: path, col, cellx, celly = view.get_path_at_pos(x, y) except TypeError: return True if event.window != self.get_bin_window(): return False if col.header_name == "~rating": if not config.getboolean("browsers", "rating_click"): return song = view.get_model()[path][0] l = Gtk.Label() l.show() l.set_text(config.RATINGS.full_symbol) width = l.get_preferred_size()[1].width l.destroy() if not width: return False precision = config.RATINGS.precision count = int(float(cellx - 5) / width) + 1 rating = max(0.0, min(1.0, count * precision)) if (rating <= precision and song("~#rating") == precision): rating = 0.0 self.__set_rating(rating, [song], librarian) def __set_rating(self, value, songs, librarian): count = len(songs) if (count > 1 and config.getboolean("browsers", "rating_confirm_multiple")): dialog = ConfirmRateMultipleDialog(self, count, value) if dialog.run() != Gtk.ResponseType.YES: return for song in songs: song["~#rating"] = value librarian.changed(songs) def __key_press(self, songlist, event, librarian, player): if qltk.is_accel(event, "<Primary>Return", "<Primary>KP_Enter"): self.__enqueue(self.get_selected_songs()) return True elif qltk.is_accel(event, "<Primary>F"): self.emit('start-interactive-search') return True elif qltk.is_accel(event, "<Primary>Delete"): songs = self.get_selected_songs() if songs: trash_songs(self, songs, librarian) return True elif qltk.is_accel(event, "<alt>Return"): songs = self.get_selected_songs() if songs: window = SongProperties(librarian, songs, parent=self) window.show() return True elif qltk.is_accel(event, "<Primary>I"): songs = self.get_selected_songs() if songs: window = Information(librarian, songs, self) window.show() return True elif qltk.is_accel(event, "space", "KP_Space") and player is not None: player.paused = not player.paused return True return False def __enqueue(self, songs): songs = [s for s in songs if s.can_add] if songs: from quodlibet import app app.window.playlist.enqueue(songs) def __redraw_current(self): model = self.get_model() iter_ = model.current_iter if iter_: path = model.get_path(iter_) model.row_changed(path, iter_) def __columns_changed(self, *args): headers = map(lambda h: h.header_name, self.get_columns()) SongList.set_all_column_headers(headers) SongList.headers = headers def __column_width_changed(self, *args): # make sure non resizable columns stay non expanding. # gtk likes to change them sometimes for c in self.get_columns(): if not c.get_resizable() and c.get_expand(): c.set_expand(False) widths = [] expands = [] for c in self.get_columns(): if not c.get_resizable(): continue widths.extend((c.header_name, str(c.get_fixed_width()))) expands.extend((c.header_name, str(int(c.get_expand())))) config.setstringlist("memory", "column_widths", widths) config.setstringlist("memory", "column_expands", expands) @classmethod def set_all_column_headers(cls, headers): set_columns(headers) try: headers.remove("~current") except ValueError: pass cls.headers = headers for listview in cls.instances(): listview.set_column_headers(headers) star = list(Query.STAR) for header in headers: for tag in header_tag_split(header): if not tag.startswith("~#") and tag not in star: star.append(tag) for tag in config.getlist("settings", "search_tags"): if tag and tag not in star: star.append(tag) SongList.star = star def set_model(self, model): super(SongList, self).set_model(model) self.set_search_column(0) def clear(self): """Remove all songs""" model = self.get_model() if model: model.clear() def get_songs(self): """Get all songs currently in the song list""" model = self.get_model() if not model: return [] return model.get() def _sort_songs(self, songs): """Sort passed songs in place based on the column sort orders""" last_tag = None last_order = None first = True for tag, reverse in self.get_sort_orders(): tag = get_sort_tag(tag) # always sort using the default sort key first if first: first = False songs.sort(key=lambda s: s.sort_key, reverse=reverse) last_order = reverse last_tag = "" # no need to sort twice in a row with the same key/order if tag == last_tag and last_order == reverse: continue last_order = reverse last_tag = tag if tag == "": songs.sort(key=lambda s: s.sort_key, reverse=reverse) else: sort_func = AudioFile.sort_by_func(tag) songs.sort(key=sort_func, reverse=reverse) def add_songs(self, songs): """Add songs to the list in the right order and position""" if not songs: return model = self.get_model() if not len(model): self.set_songs(songs, scroll=False) return if not self.is_sorted(): model.append_many(songs) return # FIXME: Replace with something fast old_songs = self.get_songs() old_songs.extend(songs) self._sort_songs(old_songs) for index, song in sorted(zip(map(old_songs.index, songs), songs)): model.insert(index, row=[song]) def set_songs(self, songs, sorted=False, scroll=True, scroll_select=False): """Fill the song list. If sorted is True, the passed songs will not be sorted and all sort indicators will be removed. If scroll is True the list will scroll to the current song. If scroll_select is True restore the selection of the first selected song and scroll to. Falls back to the current song. """ model = self.get_model() assert model is not None if not sorted: # make sure some sorting is set and visible if not self.is_sorted(): default = self.find_default_sort_column() if default: self.toggle_column_sort(default, refresh=False) self._sort_songs(songs) else: self.clear_sort() restore_song = None if scroll_select: restore_song = self.get_first_selected_song() with self.without_model() as model: model.set(songs) # scroll to the first selected or current song and restore # selection for the first selected item if there was one if scroll or scroll_select: if restore_song is not None and restore_song is not model.current: try: index = songs.index(restore_song) except ValueError: path = model.current_path else: path = Gtk.TreePath.new() path.append_index(index) else: path = model.current_path if path is not None: if restore_song is not None: self.set_cursor(path) self.scroll_to_cell(path, use_align=True, row_align=0.5) # the song selection has queued a change now, cancel that and # pass the songs manually self.info._update_songs(songs) def jump_to_song(self, song, select=False): """Scrolls to and selects the given song if in the list. Returns True if the song was found. """ model = self.get_model() if not model: return False # fast path if song == model.current: path = model.current_path else: iter_ = model.find(song) if iter_ is None: return False path = model.get_path(iter_) if select: self.set_cursor(path) self.scroll_to_cell(path, use_align=True, row_align=0.5) return True def get_first_selected_song(self): """The first selected song in the list or None""" selection = self.get_selection() model, paths = selection.get_selected_rows() if paths: return model.get_value(model.get_iter(paths[0])) def get_selected_songs(self): """Returns a list of selected songs""" songs = [] def func(model, path, iter_, user_data): songs.append(model.get_value(iter_)) selection = self.get_selection() selection.selected_foreach(func, None) return songs def __song_updated(self, librarian, songs): """Only update rows that are currently displayed. Warning: This makes the row-changed signal useless. """ vrange = self.get_visible_range() if vrange is None: return (start,), (end,) = vrange model = self.get_model() for path in xrange(start, end + 1): row = model[path] if row[0] in songs: model.row_changed(row.path, row.iter) def __song_added(self, librarian, songs): window = qltk.get_top_parent(self) filter_ = window.browser.active_filter if callable(filter_): self.add_songs(listfilter(filter_, songs)) def __song_removed(self, librarian, songs, player): # The player needs to be called first so it can ge the next song # in case the current one gets deleted and the order gets reset. if player: for song in songs: player.remove(song) # The selected songs are removed from the library and should # be removed from the view. if not len(self.get_model()): return songs = set(songs) # search in the selection first # speeds up common case: select songs and remove them model, rows = self.get_selection().get_selected_rows() rows = rows or [] iters = [model[r].iter for r in rows if model[r][0] in songs] # if not all songs were in the selection, search the whole view if len(iters) != len(songs): iters = model.find_all(songs) self.remove_iters(iters) def __song_properties(self, librarian): model, rows = self.get_selection().get_selected_rows() if rows: songs = [model[row][0] for row in rows] else: from quodlibet import app if app.player.song: songs = [app.player.song] else: return window = SongProperties(librarian, songs, parent=self) window.show() def __information(self, librarian): model, rows = self.get_selection().get_selected_rows() if rows: songs = [model[row][0] for row in rows] else: from quodlibet import app if app.player.song: songs = [app.player.song] else: return window = Information(librarian, songs, self) window.show() def set_first_column_type(self, column_type): """Set a column that will be included at the beginning""" self._first_column = column_type # refresh self.set_column_headers(self.headers) # Build a new filter around our list model, set the headers to their # new values. def set_column_headers(self, headers): if len(headers) == 0: return self.handler_block(self.__csig) old_sort = self.get_sort_orders() for column in self.get_columns(): self.remove_column(column) if self._first_column: column = self._first_column() self.append_column(column) cws = config.getstringlist("memory", "column_widths") column_widths = {} for i in range(0, len(cws), 2): column_widths[cws[i]] = int(cws[i + 1]) ce = config.getstringlist("memory", "column_expands") column_expands = {} for i in range(0, len(ce), 2): column_expands[ce[i]] = int(ce[i + 1]) for t in headers: column = create_songlist_column(t) if column.get_resizable(): if t in column_widths: column.set_fixed_width(column_widths[t]) if t in column_expands: column.set_expand(column_expands[t]) else: column.set_expand(True) def column_clicked(column, *args): # if ctrl is held during the sort click, append a sort key # or change order if already sorted ctrl_held = False event = Gtk.get_current_event() if event: ok, state = event.get_state() if ok and state & qltk.get_primary_accel_mod(): ctrl_held = True self.toggle_column_sort(column, replace=not ctrl_held) column.connect('clicked', column_clicked) column.connect('button-press-event', self.__showmenu) column.connect('popup-menu', self.__showmenu) column.connect('notify::width', self.__column_width_changed) column.set_reorderable(True) self.append_column(column) self.set_sort_orders(old_sort) self.columns_autosize() self.handler_unblock(self.__csig) def __getmenu(self, column): menu = Gtk.Menu() def selection_done_cb(menu): menu.destroy() menu.connect('selection-done', selection_done_cb) current = SongList.headers[:] current_set = set(current) def tag_title(tag): if "<" in tag: return util.pattern(tag) return util.tag(tag) current = zip(map(tag_title, current), current) def add_header_toggle(menu, pair, active, column=column): header, tag = pair item = Gtk.CheckMenuItem(label=header) item.tag = tag item.set_active(active) item.connect('activate', self.__toggle_header_item, column) item.show() item.set_tooltip_text(tag) menu.append(item) for header in current: add_header_toggle(menu, header, True) sep = SeparatorMenuItem() sep.show() menu.append(sep) trackinfo = """title genre ~title~version ~#track ~#playcount ~#skipcount ~rating ~#length ~playlists""".split() peopleinfo = """artist ~people performer arranger author composer conductor lyricist originalartist""".split() albuminfo = """album ~album~discsubtitle labelid ~#disc ~#discs ~#tracks albumartist""".split() dateinfo = """date originaldate recordingdate ~year ~originalyear ~#laststarted ~#lastplayed ~#added ~#mtime""".split() fileinfo = """~format ~#bitrate ~#filesize ~filename ~basename ~dirname ~uri ~codec ~encoding ~#channels""".split() copyinfo = """copyright organization location isrc contact website""".split() all_headers = sum( [trackinfo, peopleinfo, albuminfo, dateinfo, fileinfo, copyinfo], []) for name, group in [ (_("All _Headers"), all_headers), (_("_Track Headers"), trackinfo), (_("_Album Headers"), albuminfo), (_("_People Headers"), peopleinfo), (_("_Date Headers"), dateinfo), (_("_File Headers"), fileinfo), (_("_Production Headers"), copyinfo), ]: item = Gtk.MenuItem(label=name, use_underline=True) item.show() menu.append(item) submenu = Gtk.Menu() item.set_submenu(submenu) for header in sorted(zip(map(util.tag, group), group)): add_header_toggle(submenu, header, header[1] in current_set) sep = SeparatorMenuItem() sep.show() menu.append(sep) custom = Gtk.MenuItem( label=_(u"_Customize Headers…"), use_underline=True) custom.show() custom.connect('activate', self.__add_custom_column) menu.append(custom) item = Gtk.CheckMenuItem(label=_("_Expand Column"), use_underline=True) item.set_active(column.get_expand()) item.set_sensitive(column.get_resizable()) def set_expand_cb(item, column): do_expand = item.get_active() if not do_expand: # in case we unexpand, get the current width and set it # so the column doesn't give up all its space # to the left over expanded columns column.set_fixed_width(column.get_width()) else: # in case we expand this seems to trigger a re-distribution # between all expanded columns column.set_fixed_width(-1) column.set_expand(do_expand) self.columns_autosize() sep = SeparatorMenuItem() sep.show() menu.append(sep) item.connect('activate', set_expand_cb, column) item.show() menu.append(item) return menu def __toggle_header_item(self, item, column): headers = SongList.headers[:] if item.get_active(): try: headers.insert(self.get_columns().index(column), item.tag) except ValueError: headers.append(item.tag) else: try: headers.remove(item.tag) except ValueError: pass SongList.set_all_column_headers(headers) SongList.headers = headers def __add_custom_column(self, item): # Prefs has to import SongList, so do this here to avoid # a circular import. from quodlibet.qltk.prefs import PreferencesWindow window = PreferencesWindow(self) window.show() window.set_page("songlist") def __showmenu(self, column, event=None): time = event.time if event else Gtk.get_current_event_time() if event is not None and event.button != Gdk.BUTTON_SECONDARY: return False menu = self.__getmenu(column) menu.attach_to_widget(self, None) if event: menu.popup(None, None, None, None, event.button, time) return True widget = column.get_widget() qltk.popup_menu_under_widget(menu, widget, 3, time) return True @config.register_upgrade_function def _migrate_rating_column(config, old, new): if old < 0: # https://github.com/quodlibet/quodlibet/issues/1381 columns = get_columns()[:] for i, c in enumerate(columns): if c == "~#rating": columns[i] = "~rating" set_columns(columns) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/ccb.py���������������������������������������������������������������0000644�0001750�0001750�00000003743�13112005742�020010� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig, Michael Urman # 2012 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import config class ConfigCheckButton(Gtk.CheckButton): """A CheckButton that connects to QL's config module, and toggles a boolean configuration value when it is toggled. It is initialised to the current config value if `populate` is set True.""" def __init__(self, label, section, option, populate=False, tooltip=None, default=None): super(ConfigCheckButton, self).__init__(label=label, use_underline=True) if default is None: default = config._config.defaults.getboolean(section, option, True) if populate: self.set_active(config.getboolean(section, option, default)) if tooltip: self.set_tooltip_text(tooltip) self.connect('toggled', ConfigCheckButton.__toggled, section, option) def __toggled(self, section, option): config.set(section, option, str(bool(self.get_active())).lower()) class ConfigCheckMenuItem(Gtk.CheckMenuItem): """A CheckMenuItem that connects to QL's config module, and toggles a boolean configuration value when it is toggled. It is initialised to the current config value if `populate` is set True.""" def __init__(self, label, section, option, populate=False, default=False): super(ConfigCheckMenuItem, self).__init__( label=label, use_underline=True) if populate: self.set_active(config.getboolean(section, option, default)) self.connect('toggled', ConfigCheckMenuItem.__toggled, section, option) def __toggled(self, section, option): config.set(section, option, str(bool(self.get_active())).lower()) �����������������������������quodlibet-3.9.1/quodlibet/qltk/lyrics.py������������������������������������������������������������0000644�0001750�0001750�00000012466�13112005742�020570� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Eduardo Gonzalez, Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation # FIXME: # - Too many buttons -- saving should be automatic? # - Make purpose of 'Add' button clearer. # - Indicate when the match was fuzzy in the buffer text. import os import threading from gi.repository import Gtk, GLib from quodlibet import _ from quodlibet.formats import AudioFileError from quodlibet import qltk from quodlibet.qltk import Icons from quodlibet import util from quodlibet.util import connect_obj from quodlibet.compat import quote, text_type from quodlibet.util.urllib import urlopen class LyricsPane(Gtk.VBox): def __init__(self, song): # Commented code in this method is due to Lyric Wiki's disappearance. # See issue 273. super(LyricsPane, self).__init__(spacing=12) self.set_border_width(12) view = Gtk.TextView() sw = Gtk.ScrolledWindow() sw.add(view) refresh = qltk.Button(_("_Download")) save = qltk.Button(_("_Save"), Icons.DOCUMENT_SAVE) delete = qltk.Button(_("_Delete"), Icons.EDIT_DELETE) add = qltk.Button(_("_Edit"), Icons.EDIT) view.set_wrap_mode(Gtk.WrapMode.WORD) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) buffer = view.get_buffer() refresh.connect('clicked', self.__refresh, add, buffer, song) save.connect('clicked', self.__save, song, buffer, delete) delete.connect('clicked', self.__delete, song, save) add.connect('clicked', self.__add, song) sw.set_shadow_type(Gtk.ShadowType.IN) self.pack_start(sw, True, True, 0) bbox = Gtk.HButtonBox() bbox.pack_start(save, True, True, 0) bbox.pack_start(delete, True, True, 0) #bbox.pack_start(refresh, True, True, 0) bbox.pack_start(add, True, True, 0) self.pack_start(bbox, False, True, 0) save.set_sensitive(False) add.set_sensitive(True) lyrics = song("~lyrics") if lyrics: buffer.set_text(lyrics) else: #buffer.set_text(_("No lyrics found.\n\nYou can click the " # "Download button to have Quod Libet search " # "for lyrics online. You can also enter them " # "yourself and click save.")) buffer.set_text(_("No lyrics found for this song.")) connect_obj(buffer, 'changed', save.set_sensitive, True) def __add(self, add, song): artist = song.comma('artist').encode('utf-8') util.website("http://lyricwiki.org/%s" % (quote(artist))) def __refresh(self, refresh, add, buffer, song): buffer.set_text(_(u"Searching for lyrics…")) refresh.set_sensitive(False) thread = threading.Thread( target=self.__search, args=(song, buffer, refresh, add)) thread.setDaemon(True) thread.start() def __search(self, song, buffer, refresh, add): artist = song.comma("artist") title = song.comma("title") try: sock = urlopen( "http://lyricwiki.org/api.php?" "client=QuodLibet&func=getSong&artist=%s&song=%s&fmt=text" % ( quote(artist.encode('utf-8')), quote(title.encode('utf-8')))) text = sock.read() except Exception as err: util.print_exc() GLib.idle_add(buffer.set_text, text_type(err)) return sock.close() if text == 'Not found': GLib.idle_add( buffer.set_text, _("No lyrics found for this song.")) return else: GLib.idle_add(buffer.set_text, text) GLib.idle_add(refresh.set_sensitive, True) def __save(self, save, song, buffer, delete): start, end = buffer.get_bounds() text = buffer.get_text(start, end, True) # First, write back to the tags. song["lyrics"] = text.decode("utf-8") try: song.write() except AudioFileError: util.print_exc() # Then, write to file. # TODO: write to file only if could not write to tags, otherwise delete # the file. lyricname = song.lyric_filename try: os.makedirs(os.path.dirname(lyricname)) except EnvironmentError: util.print_exc() pass try: with open(lyricname, "w") as f: f.write(text) except EnvironmentError: util.print_exc() delete.set_sensitive(True) save.set_sensitive(False) def __delete(self, delete, song, save): # First, delete from the tags. song.remove("lyrics") try: song.write() except AudioFileError: util.print_exc() # Then, delete the file. lyricname = song.lyric_filename try: os.unlink(lyricname) except EnvironmentError: pass lyricname = os.path.dirname(lyricname) try: os.rmdir(lyricname) except EnvironmentError: pass delete.set_sensitive(False) save.set_sensitive(True) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/searchbar.py���������������������������������������������������������0000644�0001750�0001750�00000017306�13112005742�021213� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2010-2011 Christoph Reiter, Steven Robertson # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from gi.repository import Gtk, GObject, GLib import quodlibet from quodlibet import config from quodlibet import _ from quodlibet.query import Query from quodlibet.qltk.cbes import ComboBoxEntrySave from quodlibet.qltk.ccb import ConfigCheckMenuItem from quodlibet.qltk.x import SeparatorMenuItem from quodlibet.util import limit_songs, DeferredSignal, gdecode class SearchBarBox(Gtk.HBox): """ A search bar widget for inputting queries. signals: query-changed - a parsable query string focus-out - If the widget gets focused while being focused (usually for focusing the songlist) """ __gsignals__ = { 'query-changed': ( GObject.SignalFlags.RUN_LAST, None, (object,)), 'focus-out': (GObject.SignalFlags.RUN_LAST, None, ()), } DEFAULT_TIMEOUT = 400 def __init__(self, filename=None, completion=None, accel_group=None, timeout=DEFAULT_TIMEOUT, validator=Query.validator): super(SearchBarBox, self).__init__(spacing=6) if filename is None: filename = os.path.join( quodlibet.get_user_dir(), "lists", "queries") combo = ComboBoxEntrySave(filename, count=8, validator=validator, title=_("Saved Searches"), edit_title=_(u"Edit saved searches…")) self.__deferred_changed = DeferredSignal( self.__filter_changed, timeout=timeout, owner=self) self.__combo = combo entry = combo.get_child() self.__entry = entry if completion: entry.set_completion(completion) self.__sig = combo.connect('text-changed', self.__text_changed) entry.connect('clear', self.__filter_changed) entry.connect('backspace', self.__text_changed) entry.connect('populate-popup', self.__menu) entry.connect('activate', self.__filter_changed) entry.connect('activate', self.__save_search) entry.connect('focus-out-event', self.__save_search) entry.set_placeholder_text(_("Search")) entry.set_tooltip_text(_("Search your library, " "using free text or QL queries")) combo.enable_clear_button() self.pack_start(combo, True, True, 0) if accel_group: key, mod = Gtk.accelerator_parse("<Primary>L") accel_group.connect(key, mod, 0, lambda *x: entry.mnemonic_activate(True)) for child in self.get_children(): child.show_all() def set_enabled(self, enabled=True): self.__entry.set_sensitive(enabled) if enabled: self.__uninhibit() else: self.__inhibit() def set_text(self, text): """Set the text without firing any signals""" self.__deferred_changed.abort() # deactivate all signals and change the entry text self.__inhibit() self.__entry.set_text(text) self.__uninhibit() def get_text(self): """Get the active text as unicode""" return gdecode(self.__entry.get_text()) def changed(self): """Triggers a filter-changed signal if the current text is a parsable query """ self.__filter_changed() def __inhibit(self): self.__combo.handler_block(self.__sig) def __uninhibit(self): self.__combo.handler_unblock(self.__sig) def __menu(self, entry, menu): sep = SeparatorMenuItem() sep.show() menu.prepend(sep) cb = ConfigCheckMenuItem( _("Search after _typing"), 'settings', 'eager_search', populate=True) cb.set_tooltip_text( _("Show search results after the user stops typing.")) cb.show() menu.prepend(cb) def __mnemonic_activate(self, label, group_cycling): widget = label.get_mnemonic_widget() if widget.is_focus(): self.emit('focus-out') return True def __save_search(self, entry, *args): # only save the query on focus-out if eager_search is turned on if args and not config.getboolean('settings', 'eager_search'): return text = self.get_text().strip() if text and Query.is_parsable(text): # Adding the active text to the model triggers a changed signal # (get_active is no longer -1), so inhibit self.__inhibit() self.__combo.prepend_text(text) self.__combo.write() self.__uninhibit() def __filter_changed(self, *args): self.__deferred_changed.abort() text = self.get_text() if Query.is_parsable(text): GLib.idle_add(self.emit, 'query-changed', text) def __text_changed(self, *args): # the combobox has an active entry selected -> no timeout # todo: we need a timeout when the selection changed because # of keyboard input (up/down arrows) if self.__combo.get_active() != -1: self.__filter_changed() return if not config.getboolean('settings', 'eager_search'): return self.__deferred_changed() class LimitSearchBarBox(SearchBarBox): """A version of `SearchBarBox` that allows specifying the limiting and weighting of a search.""" class Limit(Gtk.HBox): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, ()), } def __init__(self): super(LimitSearchBarBox.Limit, self).__init__(spacing=3) label = Gtk.Label(label=_("_Limit:")) self.pack_start(label, True, True, 0) self.__limit = limit = Gtk.SpinButton() self.__limit.connect("value-changed", self.__changed) limit.set_numeric(True) limit.set_range(0, 9999) limit.set_increments(5, 100) label.set_mnemonic_widget(limit) label.set_use_underline(True) self.pack_start(limit, True, True, 0) self.__weight = Gtk.CheckButton( label=_("_Weight"), use_underline=True) self.__weight.connect("toggled", self.__changed) self.pack_start(self.__weight, True, True, 0) for child in self.get_children(): child.show() def __changed(self, *args): self.emit("changed") @property def value(self): return self.__limit.get_value_as_int() @property def weighted(self): return self.__weight.get_active() def __init__(self, show_limit=False, *args, **kwargs): super(LimitSearchBarBox, self).__init__(*args, **kwargs) self.__limit = self.Limit() self.pack_start(self.__limit, False, True, 0) self.__limit.set_no_show_all(not show_limit) self.__limit.connect("changed", self.__limit_changed) def __limit_changed(self, *args): self.changed() def limit(self, songs): if self.__limit.get_visible(): return limit_songs(songs, self.__limit.value, self.__limit.weighted) else: return songs def toggle_limit_widgets(self, button): """Toggles the visibility of the limit widget according to `button`""" if button.get_active(): self.__limit.show() else: self.__limit.hide() self.changed() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/tagsfrompath.py������������������������������������������������������0000644�0001750�0001750�00000026247�13112005742�021764� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import re import os from gi.repository import Gtk from senf import fsn2text import quodlibet from quodlibet import _ from quodlibet import config from quodlibet import qltk from quodlibet import util from quodlibet.formats import AudioFileError from quodlibet.plugins import PluginManager from quodlibet.qltk._editutils import FilterPluginBox, FilterCheckButton from quodlibet.qltk._editutils import EditingPluginHandler, OverwriteWarning from quodlibet.qltk._editutils import WriteFailedError from quodlibet.qltk.wlw import WritingWindow from quodlibet.qltk.views import TreeViewColumn from quodlibet.qltk.cbes import ComboBoxEntrySave from quodlibet.qltk.models import ObjectStore from quodlibet.qltk import Icons from quodlibet.util.tagsfrompath import TagsFromPattern from quodlibet.util.string.splitters import split_value from quodlibet.util import connect_obj, gdecode from quodlibet.compat import itervalues TBP = os.path.join(quodlibet.get_user_dir(), "lists", "tagpatterns") TBP_EXAMPLES = """\ <tracknumber>. <title> <tracknumber> - <title> <tracknumber> - <artist> - <title> <artist> - <album>/<tracknumber>. <title> <artist>/<album>/<tracknumber> - <title>""" class UnderscoresToSpaces(FilterCheckButton): _label = _("Replace _underscores with spaces") _section = "tagsfrompath" _key = "underscores" _order = 1.0 def filter(self, tag, value): return value.replace("_", " ") class TitleCase(FilterCheckButton): _label = _("_Title-case tags") _section = "tagsfrompath" _key = "titlecase" _order = 1.1 def filter(self, tag, value): return util.title(value) class SplitTag(FilterCheckButton): _label = _("Split into multiple _values") _section = "tagsfrompath" _key = "split" _order = 1.2 def filter(self, tag, value): spls = config.gettext("editing", "split_on") spls = spls.split() return "\n".join(split_value(value, spls)) class TagsFromPathPluginHandler(EditingPluginHandler): from quodlibet.plugins.editing import TagsFromPathPlugin Kind = TagsFromPathPlugin class ListEntry(object): def __init__(self, song): self.song = song self.matches = {} def get_match(self, key): return self.matches.get(key, u"") def replace_match(self, key, value): self.matches[key] = value @property def name(self): return fsn2text(self.song("~basename")) class TagsFromPath(Gtk.VBox): title = _("Tags From Path") FILTERS = [UnderscoresToSpaces, TitleCase, SplitTag] handler = TagsFromPathPluginHandler() @classmethod def init_plugins(cls): PluginManager.instance.register_handler(cls.handler) def __init__(self, parent, library): super(TagsFromPath, self).__init__(spacing=6) self.set_border_width(12) hbox = Gtk.HBox(spacing=6) cbes_defaults = TBP_EXAMPLES.split("\n") self.combo = ComboBoxEntrySave(TBP, cbes_defaults, title=_("Path Patterns"), edit_title=_(u"Edit saved patterns…")) self.combo.show_all() hbox.pack_start(self.combo, True, True, 0) self.preview = qltk.Button(_("_Preview"), Icons.VIEW_REFRESH) self.preview.show() hbox.pack_start(self.preview, False, True, 0) self.pack_start(hbox, False, True, 0) self.combo.get_child().connect('changed', self._changed) model = ObjectStore() self.view = Gtk.TreeView(model=model) self.view.show() sw = Gtk.ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.add(self.view) self.pack_start(sw, True, True, 0) vbox = Gtk.VBox() addreplace = Gtk.ComboBoxText() addreplace.append_text(_("Tags replace existing ones")) addreplace.append_text(_("Tags are added to existing ones")) addreplace.set_active(config.getboolean("tagsfrompath", "add")) addreplace.connect('changed', self.__add_changed) vbox.pack_start(addreplace, True, True, 0) addreplace.show() self.pack_start(vbox, False, True, 0) filter_box = FilterPluginBox(self.handler, self.FILTERS) filter_box.connect("preview", self.__filter_preview) filter_box.connect("changed", self.__filter_changed) self.filter_box = filter_box self.pack_start(filter_box, False, True, 0) # Save button self.save = qltk.Button(_("Save"), Icons.DOCUMENT_SAVE) self.save.show() bbox = Gtk.HButtonBox() bbox.set_layout(Gtk.ButtonBoxStyle.END) bbox.pack_start(self.save, True, True, 0) self.pack_start(bbox, False, True, 0) connect_obj(self.preview, 'clicked', self.__preview, None) connect_obj(parent, 'changed', self.__class__.__preview, self) # Save changes connect_obj(self.save, 'clicked', self.__save, addreplace, library) for child in self.get_children(): child.show() def __filter_preview(self, *args): Gtk.Button.clicked(self.preview) def __filter_changed(self, *args): self._changed(self.combo.get_child()) def _changed(self, entry): self.save.set_sensitive(False) self.preview.set_sensitive(bool(entry.get_text())) def __add_changed(self, combo): config.set("tagsfrompath", "add", str(bool(combo.get_active()))) def __preview(self, songs): if songs is None: songs = [row[0].song for row in (self.view.get_model() or [])] if songs: pattern_text = gdecode(self.combo.get_child().get_text()) else: pattern_text = "" try: pattern = TagsFromPattern(pattern_text) except re.error: qltk.ErrorMessage( self, _("Invalid pattern"), _("The pattern\n\t<b>%s</b>\nis invalid. " "Possibly it contains the same tag twice or " "it has unbalanced brackets (< / >).") % ( util.escape(pattern_text))).run() return else: if pattern_text: self.combo.prepend_text(pattern_text) self.combo.write(TBP) invalid = [] for header in pattern.headers: if not min([song.can_change(header) for song in songs]): invalid.append(header) if len(invalid) and songs: if len(invalid) == 1: title = _("Invalid tag") msg = _("Invalid tag <b>%s</b>\n\nThe files currently" " selected do not support editing this tag.") else: title = _("Invalid tags") msg = _("Invalid tags <b>%s</b>\n\nThe files currently" " selected do not support editing these tags.") qltk.ErrorMessage( self, title, msg % ", ".join(invalid)).run() pattern = TagsFromPattern("") self.view.set_model(None) model = ObjectStore() for col in self.view.get_columns(): self.view.remove_column(col) render = Gtk.CellRendererText() col = TreeViewColumn(title=_('File')) col.pack_start(render, True) col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) def cell_data_file(column, cell, model, iter_, data): entry = model.get_value(iter_) cell.set_property("text", entry.name) col.set_cell_data_func(render, cell_data_file) def cell_data_header(column, cell, model, iter_, header): entry = model.get_value(iter_) cell.set_property("text", entry.get_match(header)) self.view.append_column(col) for i, header in enumerate(pattern.headers): render = Gtk.CellRendererText() render.set_property('editable', True) render.connect('edited', self.__row_edited, model, header) escaped_title = header.replace("_", "__") col = Gtk.TreeViewColumn(escaped_title, render) col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) col.set_cell_data_func(render, cell_data_header, header) self.view.append_column(col) for song in songs: entry = ListEntry(song) match = pattern.match(song) for h in pattern.headers: text = match.get(h, '') for f in self.filter_box.filters: if f.active: text = f.filter(h, text) if not song.can_multiple_values(h): text = u", ".join(text.split("\n")) entry.matches[h] = text model.append([entry]) # save for last to potentially save time if songs: self.view.set_model(model) self.preview.set_sensitive(False) self.save.set_sensitive(len(pattern.headers) > 0) def __save(self, addreplace, library): pattern_text = gdecode(self.combo.get_child().get_text()) pattern = TagsFromPattern(pattern_text) model = self.view.get_model() add = bool(addreplace.get_active()) win = WritingWindow(self, len(model)) win.show() was_changed = set() all_done = False for entry in ((model and itervalues(model)) or []): song = entry.song changed = False if not song.valid(): win.hide() dialog = OverwriteWarning(self, song) resp = dialog.run() win.show() if resp != OverwriteWarning.RESPONSE_SAVE: break for i, h in enumerate(pattern.headers): text = entry.get_match(h) if text: can_multiple = song.can_multiple_values(h) if not add or h not in song or not can_multiple: song[h] = text changed = True else: for val in text.split("\n"): if val not in song.list(h): song.add(h, val) changed = True if changed: try: song.write() except AudioFileError: util.print_exc() WriteFailedError(self, song).run() library.reload(song, changed=was_changed) break was_changed.add(song) if win.step(): break else: all_done = True win.destroy() library.changed(was_changed) self.save.set_sensitive(not all_done) def __row_edited(self, renderer, path, new, model, header): entry = model[path][0] new = gdecode(new) if entry.get_match(header) != new: entry.replace_match(header, new) self.preview.set_sensitive(True) self.save.set_sensitive(True) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/qltk/data_editors.py������������������������������������������������������0000644�0001750�0001750�00000033422�13112005742�021720� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012-2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from gi.repository import Pango import re from quodlibet import _ from quodlibet import qltk, util from quodlibet.qltk.entry import UndoEntry, ValidatingEntry from quodlibet.qltk.views import RCMHintedTreeView, HintedTreeView from quodlibet.qltk.x import MenuItem, Button, Align from quodlibet.qltk import Icons from quodlibet.query import Query from quodlibet.util.json_data import JSONObjectDict from quodlibet.util import connect_obj from quodlibet.qltk.getstring import GetStringDialog from quodlibet.util.tags import _TAGS from quodlibet.compat import string_types class JSONBasedEditor(qltk.UniqueWindow): """ Flexible editor for objects extending `JSONObject` (held in a `JSONObjectDict`) TODO: validation, especially for name. """ _WIDTH = 800 _HEIGHT = 400 def __init__(self, Prototype, values, filename, title): if self.is_not_unique(): return super(JSONBasedEditor, self).__init__() self.Prototype = Prototype self.current = None self.filename = filename self.name = Prototype.NAME or Prototype.__name__ self.input_entries = {} self.set_border_width(12) self.set_title(title) self.set_default_size(self._WIDTH, self._HEIGHT) self.add(Gtk.HBox(spacing=6)) self.get_child().set_homogeneous(True) self.accels = Gtk.AccelGroup() # Set up the model for this widget self.model = Gtk.ListStore(object) self._fill_values(values) # The browser for existing data self.view = view = RCMHintedTreeView(model=self.model) view.set_headers_visible(False) view.set_reorderable(True) view.set_rules_hint(True) render = Gtk.CellRendererText() render.set_padding(3, 6) render.props.ellipsize = Pango.EllipsizeMode.END column = Gtk.TreeViewColumn("", render) column.set_cell_data_func(render, self.__cdf) view.append_column(column) sw = Gtk.ScrolledWindow() sw.set_shadow_type(Gtk.ShadowType.IN) sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.add(view) self.get_child().pack_start(sw, True, True, 0) vbox = Gtk.VBox(spacing=6) # Input for new ones. frame = self.__build_input_frame() vbox.pack_start(frame, False, True, 0) # Add context menu menu = Gtk.Menu() rem = MenuItem(_("_Remove"), Icons.LIST_REMOVE) keyval, mod = Gtk.accelerator_parse("Delete") rem.add_accelerator( 'activate', self.accels, keyval, mod, Gtk.AccelFlags.VISIBLE) connect_obj(rem, 'activate', self.__remove, view) menu.append(rem) menu.show_all() view.connect('popup-menu', self.__popup, menu) view.connect('key-press-event', self.__view_key_press) connect_obj(self, 'destroy', Gtk.Menu.destroy, menu) # New and Close buttons bbox = Gtk.HButtonBox() self.remove_but = Button(_("_Remove"), Icons.LIST_REMOVE) self.remove_but.set_sensitive(False) self.new_but = Button(_("_New"), Icons.DOCUMENT_NEW) self.new_but.connect('clicked', self._new_item) bbox.pack_start(self.new_but, True, True, 0) close = Button(_("_Close"), Icons.WINDOW_CLOSE) connect_obj(close, 'clicked', qltk.Window.destroy, self) bbox.pack_start(close, True, True, 0) vbox.pack_end(bbox, False, True, 0) self.get_child().pack_start(vbox, True, True, 0) # Initialise self.selection = view.get_selection() self.selection.connect('changed', self.__select) self.connect('destroy', self.__finish) self.get_child().show_all() def _find(self, name): for row in self.model: if row[0].name == name: return row[0] def _new_item(self, button): # Translators: New Command/Entry/Item/... current_name = name = _("New %s") % self.name n = 2 while True: if self._find(current_name): current_name = "%s (%d)" % (name, n) n += 1 continue break self.model.append(row=(self.Prototype(name=current_name),)) def _new_widget(self, key, val): """ Creates a Gtk.Entry subclass appropriate for a field named `key` with value `val` """ callback = signal = None if isinstance(val, bool): entry = Gtk.CheckButton() callback = self.__toggled_widget signal = "toggled" elif isinstance(val, int): adj = Gtk.Adjustment.new(0, 0, 9999, 1, 10, 0) entry = Gtk.SpinButton(adjustment=adj) entry.set_numeric(True) callback = self.__changed_numeric_widget elif "pattern" in key: entry = ValidatingEntry(validator=Query.validator) else: entry = UndoEntry() entry.connect(signal or "changed", callback or self.__changed_widget, key) return entry def __refresh_view(self): model, iter = self.selection.get_selected() self.model.emit("row-changed", model[iter].path, iter) def __changed_widget(self, entry, key): if self.current: setattr(self.current, key, str(entry.get_text())) self.__refresh_view() def __changed_numeric_widget(self, entry, key): if self.current: setattr(self.current, key, int(entry.get_text() or 0)) self.__refresh_view() def __toggled_widget(self, entry, key): if self.current: setattr(self.current, key, bool(entry.get_active())) self.__refresh_view() def _populate_fields(self, obj): """Populates the input fields based on the `JSONData` object `obj`""" for fn, val in obj.data: widget = self.input_entries[fn] widget.set_sensitive(True) # TODO: link this logic better with the creational stuff if isinstance(val, bool): widget.set_active(val) elif isinstance(val, int): widget.set_value(int(val)) elif isinstance(val, string_types): widget.set_text(val or "") def __build_input_frame(self): t = Gtk.Table(n_rows=2, n_columns=3) t.set_row_spacings(6) t.set_col_spacing(0, 3) t.set_col_spacing(1, 12) empty = self.Prototype("empty") for i, (key, val) in enumerate(empty.data): field = empty.field(key) field_name = self.get_field_name(field, key) l = Gtk.Label(label=field_name + ":") entry = self._new_widget(key, val) entry.set_sensitive(False) if field.doc: entry.set_tooltip_text(field.doc) # Store these away in a map for later access self.input_entries[key] = entry l.set_mnemonic_widget(entry) l.set_use_underline(True) l.set_alignment(0.0, 0.5) if isinstance(val, int) or isinstance(val, bool): align = Align(entry, halign=Gtk.Align.START) t.attach(align, 1, 2, i, i + 1) else: t.attach(entry, 1, 2, i, i + 1) t.attach(l, 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL) frame = qltk.Frame(label=self.name, child=t) self.input_entries["name"].grab_focus() return frame @staticmethod def get_field_name(field, key): field_name = (field.human_name or (key and key.replace("_", " "))) return field_name and field_name.title() or _("(unknown)") def _fill_values(self, data): if not data: return for (name, obj) in data.items(): self.model.prepend(row=[obj]) def _update_current(self, new_selection=None): if new_selection: self.selection = new_selection model, iter = self.selection.get_selected() if iter: self.current = model[iter][0] def __select(self, selection): self._update_current(selection) self.remove_but.set_sensitive(bool(iter)) if iter is not None: self._populate_fields(self.current) def __remove(self, view): view.remove_selection() def __popup(self, view, menu): return view.popup_menu(menu, 0, Gtk.get_current_event_time()) def __view_key_press(self, view, event): if event.keyval == Gtk.accelerator_parse("Delete")[0]: self.__remove(view) def __cdf(self, column, cell, model, iter, data): row = model[iter] obj = row[0] obj_name = util.escape(obj.name) obj_description = util.escape(str(obj)) markup = '<b>%s</b>\n%s' % (obj_name, obj_description) cell.markup = markup cell.set_property('markup', markup) def __finish(self, widget): # TODO: Warn about impending deletion of nameless items, or something all = JSONObjectDict.from_list( [row[0] for row in self.model if row[0].name]) all.save(filename=self.filename) class TagListEditor(qltk.Window): """Dialog to edit a list of tag names.""" _WIDTH = 600 _HEIGHT = 300 def __init__(self, title, values=None): super(TagListEditor, self).__init__() self.use_header_bar() self.data = values or [] self.set_border_width(12) self.set_title(title) self.set_default_size(self._WIDTH, self._HEIGHT) vbox = Gtk.VBox(spacing=12) hbox = Gtk.HBox(spacing=12) # Set up the model for this widget self.model = Gtk.ListStore(str) self.__fill_values() # Main view view = self.view = HintedTreeView(model=self.model) view.set_fixed_height_mode(True) view.set_headers_visible(False) sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(view) sw.set_size_request(-1, max(sw.size_request().height, 100)) hbox.pack_start(sw, True, True, 0) self.__setup_column(view) # Context menu menu = Gtk.Menu() remove_item = MenuItem(_("_Remove"), Icons.LIST_REMOVE) menu.append(remove_item) menu.show_all() view.connect('popup-menu', self.__popup, menu) connect_obj(remove_item, 'activate', self.__remove, view) # Add and Remove buttons vbbox = Gtk.VButtonBox() vbbox.set_layout(Gtk.ButtonBoxStyle.START) vbbox.set_spacing(6) add = Button(_("_Add"), Icons.LIST_ADD) add.connect("clicked", self.__add) vbbox.pack_start(add, False, True, 0) remove = Button(_("_Remove"), Icons.LIST_REMOVE) remove.connect("clicked", self.__remove) vbbox.pack_start(remove, False, True, 0) hbox.pack_start(vbbox, False, True, 0) vbox.pack_start(hbox, True, True, 0) # Close buttons bbox = Gtk.HButtonBox() self.remove_but = Button(_("_Remove"), Icons.LIST_REMOVE) self.remove_but.set_sensitive(False) close = Button(_("_Close"), Icons.WINDOW_CLOSE) connect_obj(close, 'clicked', qltk.Window.destroy, self) bbox.set_layout(Gtk.ButtonBoxStyle.END) if not self.has_close_button(): bbox.pack_start(close, True, True, 0) vbox.pack_start(bbox, False, True, 0) # Finish up self.add(vbox) self.get_child().show_all() def __setup_column(self, view): def tag_cdf(column, cell, model, iter, data): row = model[iter] if row: cell.set_property('text', row[0]) def desc_cdf(column, cell, model, iter, data): row = model[iter] if row: name = re.sub(':[a-z]+$', '', row[0].strip('~#')) try: t = _TAGS[name] valid = (not t.hidden and t.numeric == row[0].startswith('~#')) val = t.desc if valid else name except KeyError: val = name cell.set_property('text', util.title(val.replace('~', ' / '))) render = Gtk.CellRendererText() column = Gtk.TreeViewColumn(_("Tag expression"), render) column.set_cell_data_func(render, tag_cdf) column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) column.set_expand(True) view.append_column(column) render = Gtk.CellRendererText() render.set_property('ellipsize', Pango.EllipsizeMode.END) column = Gtk.TreeViewColumn(_("Description"), render) column.set_cell_data_func(render, desc_cdf) column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) column.set_expand(True) view.append_column(column) view.set_headers_visible(True) def __fill_values(self): for s in self.data: self.model.append(row=[s]) def get_strings(self): strings = [row[0] for row in self.model if row] return strings def __remove(self, *args): self.view.remove_selection() def __add(self, *args): tooltip = _('Tag expression e.g. people:real or ~album~year.') dialog = GetStringDialog(self, _("Enter new tag"), "", button_icon=None, tooltip=tooltip) new = dialog.run() if new: self.model.append(row=[new]) def __popup(self, view, menu): return view.popup_menu(menu, 0, Gtk.get_current_event_time()).show() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/__init__.py���������������������������������������������������������������0000644�0001750�0001750�00000002555�13112005742�020045� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys import codecs from .compat import PY2 if PY2: # some code depends on utf-8 default encoding (pygtk used to set it) reload(sys) sys.setdefaultencoding("utf-8") # py2 doesn't know about cp65001, but tries to use it if it is the active # code page codecs.register( lambda name: codecs.lookup("utf-8") if name == "cp65001" else None) from ._import import install_redirect_import_hook install_redirect_import_hook() from .util.i18n import _, C_, N_, ngettext, npgettext from .util.dprint import print_d, print_e, print_w from ._init import init_cli, init from ._main import get_base_dir, is_release, get_user_dir, app, \ set_application_info, init_plugins, enable_periodic_save, run, \ finish_first_session, get_image_dir, is_first_session, \ get_build_description, get_build_version _, C_, N_, ngettext, npgettext, is_release, init, init_cli, print_e, \ get_base_dir, print_w, print_d, get_user_dir, app, set_application_info, \ init_plugins, enable_periodic_save, run, finish_first_session, \ get_image_dir, is_first_session, get_build_description, \ get_build_version ���������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017376� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/monkeysaudio.py���������������������������������������������������0000644�0001750�0001750�00000001447�13112005742�022467� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from mutagen.monkeysaudio import MonkeysAudio from ._audio import translate_errors from ._apev2 import APEv2File class MonkeysAudioFile(APEv2File): format = "Monkey's Audio" def __init__(self, filename): with translate_errors(): audio = MonkeysAudio(filename) super(MonkeysAudioFile, self).__init__(filename, audio) self["~#length"] = int(audio.info.length) self["~#channels"] = audio.info.channels self.sanitize(filename) loader = MonkeysAudioFile types = [MonkeysAudioFile] extensions = [".ape"] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/_id3.py�����������������������������������������������������������0000644�0001750�0001750�00000044107�13113466601�020604� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2013 Joe Wreschnig, Michael Urman, Niklas Janlert, # Steven Robertson, Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import mutagen.id3 from quodlibet import config, const, print_d from quodlibet import util from quodlibet.compat import iteritems, text_type, listvalues, PY2 from quodlibet.util.iso639 import ISO_639_2 from quodlibet.util.path import get_temp_cover_file from quodlibet.util.string import isascii from ._audio import AudioFile, translate_errors, AudioFileError from ._image import EmbeddedImage, APICType def encoding_for(s): """Returns ID3 encoding ID best for string `s`""" return 3 if isascii(s) else 1 RG_KEYS = [ "replaygain_track_peak", "replaygain_track_gain", "replaygain_album_peak", "replaygain_album_gain", ] # ID3 is absolutely the worst thing ever. class ID3File(AudioFile): # http://www.unixgods.org/~tilo/ID3/docs/ID3_comparison.html # http://www.id3.org/id3v2.4.0-frames.txt IDS = {"TIT1": "grouping", "TIT2": "title", "TIT3": "version", "TPE1": "artist", "TPE2": "performer", "TPE3": "conductor", "TPE4": "arranger", "TEXT": "lyricist", "TCOM": "composer", "TENC": "encodedby", "TALB": "album", "TRCK": "tracknumber", "TPOS": "discnumber", "TSRC": "isrc", "TCOP": "copyright", "TPUB": "organization", "TSST": "discsubtitle", "TOLY": "author", "TMOO": "mood", "TBPM": "bpm", "TDRC": "date", "TDOR": "originaldate", "TOAL": "originalalbum", "TOPE": "originalartist", "WOAR": "website", "TSOP": "artistsort", "TSOA": "albumsort", "TSOT": "titlesort", "TSO2": "albumartistsort", "TSOC": "composersort", "TMED": "media", "TCMP": "compilation", # TLAN requires an ISO 639-2 language code, check manually #"TLAN": "language" } SDI = dict([(v, k) for k, v in iteritems(IDS)]) # At various times, information for this came from # http://musicbrainz.org/docs/specs/metadata_tags.html # http://bugs.musicbrainz.org/ticket/1383 # http://musicbrainz.org/doc/MusicBrainzTag TXXX_MAP = { u"MusicBrainz Release Group Id": "musicbrainz_releasegroupid", u"MusicBrainz Release Track Id": "musicbrainz_releasetrackid", u"MusicBrainz Artist Id": "musicbrainz_artistid", u"MusicBrainz Album Id": "musicbrainz_albumid", u"MusicBrainz Album Artist Id": "musicbrainz_albumartistid", u"MusicBrainz TRM Id": "musicbrainz_trmid", u"MusicIP PUID": "musicip_puid", u"MusicMagic Fingerprint": "musicip_fingerprint", u"MusicBrainz Album Status": "musicbrainz_albumstatus", u"MusicBrainz Album Type": "musicbrainz_albumtype", u"MusicBrainz Album Release Country": "releasecountry", u"MusicBrainz Disc Id": "musicbrainz_discid", u"ASIN": "asin", u"ALBUMARTISTSORT": "albumartistsort", u"BARCODE": "barcode", } PAM_XXXT = dict([(v, k) for k, v in iteritems(TXXX_MAP)]) Kind = None def __init__(self, filename): with translate_errors(): audio = self.Kind(filename) if audio.tags is None: audio.add_tags() tag = audio.tags self._parse_info(audio.info) for frame in tag.values(): if frame.FrameID == "APIC" and len(frame.data): self.has_images = True continue elif frame.FrameID == "TCON": self["genre"] = "\n".join(frame.genres) continue elif frame.FrameID == "TLEN": try: length = +frame / 1000.0 except ValueError: continue # ignore TLEN <= 0 [issue 222] if length > 0: self["~#length"] = length continue elif (frame.FrameID == "UFID" and frame.owner == "http://musicbrainz.org"): self["musicbrainz_trackid"] = frame.data.decode("utf-8", "replace") continue elif frame.FrameID == "POPM": rating = frame.rating / 255.0 if frame.email == const.EMAIL: try: self.setdefault("~#playcount", frame.count) except AttributeError: pass self.setdefault("~#rating", rating) elif frame.email == config.get("editing", "save_email"): try: self["~#playcount"] = frame.count except AttributeError: pass self["~#rating"] = rating continue elif frame.FrameID == "COMM" and frame.desc == "": name = "comment" elif frame.FrameID in ["COMM", "TXXX"]: if frame.desc.startswith("QuodLibet::"): name = frame.desc[11:] elif frame.desc in self.TXXX_MAP: name = self.TXXX_MAP[frame.desc] else: continue elif frame.FrameID == "RVA2": self.__process_rg(frame) continue elif frame.FrameID == "TMCL": for role, name in frame.people: key = self.__validate_name("performer:" + role) if key: self.add(key, name) continue elif frame.FrameID == "TLAN": self["language"] = "\n".join(frame.text) continue elif (frame.FrameID == "USLT" and frame.desc == "" and frame.lang == "\x00\x00\x00"): name = "lyrics" else: name = self.IDS.get(frame.FrameID, "").lower() name = self.__validate_name(name) if not name: continue name = name.lower() id3id = frame.FrameID if id3id.startswith("T"): text = "\n".join(map(text_type, frame.text)) elif id3id == "COMM": text = "\n".join(frame.text) elif id3id == "USLT": # lyrics are single string, not list text = frame.text elif id3id.startswith("W"): text = frame.url frame.encoding = 0 else: continue if not text: continue text = self.__distrust_latin1(text, frame.encoding) if text is None: continue if name in self: self[name] += "\n" + text else: self[name] = text self[name] = self[name].strip() # to catch a missing continue above del name # foobar2000 writes long dates in a TXXX DATE tag, leaving the TDRC # tag out. Read the TXXX DATE, but only if the TDRC tag doesn't exist # to avoid reverting or duplicating tags in existing libraries. if audio.tags and "date" not in self: for frame in tag.getall('TXXX:DATE'): self["date"] = "\n".join(map(text_type, frame.text)) # Read TXXX replaygain and replace previously read values from RVA2 for frame in tag.getall("TXXX"): k = frame.desc.lower() if k in RG_KEYS: self[str(k)] = u"\n".join(map(text_type, frame.text)) self.sanitize(filename) def _parse_info(self, info): """Optionally implement in subclasses""" pass def __validate_name(self, k): """Returns a ascii string or None if the key isn't supported""" if not k or "=" in k or "~" in k: return if not (k and "=" not in k and "~" not in k and k.encode("ascii", "replace").decode("ascii") == k): return if PY2: return k.encode("ascii") else: return k def __process_rg(self, frame): if frame.channel == 1: if frame.desc == "album": k = "album" elif frame.desc == "track": k = "track" elif "replaygain_track_gain" not in self: k = "track" # fallback else: return self["replaygain_%s_gain" % k] = "%+f dB" % frame.gain self["replaygain_%s_peak" % k] = str(frame.peak) @util.cached_property def CODECS(self): codecs = ["utf-8"] codecs_conf = config.get("editing", "id3encoding") codecs.extend(codecs_conf.strip().split()) codecs.append("iso-8859-1") return codecs def __distrust_latin1(self, text, encoding): assert isinstance(text, text_type) if encoding == 0: try: text = text.encode('iso-8859-1') except UnicodeEncodeError: # mutagen might give us text not matching the encoding # https://github.com/quodlibet/mutagen/issues/307 return text for codec in self.CODECS: try: text = text.decode(codec) except (UnicodeError, LookupError): pass else: break else: return None return text def write(self): with translate_errors(): audio = self.Kind(self['~filename']) if audio.tags is None: audio.add_tags() tag = audio.tags # prefill TMCL with the ones we can't read mcl = tag.get("TMCL", mutagen.id3.TMCL(encoding=3, people=[])) mcl.people = [(r, n) for (r, n) in mcl.people if not self.__validate_name(r)] # delete all TXXX/COMM we can read except empty COMM for frame in ["COMM:", "TXXX:"]: for t in tag.getall(frame + "QuodLibet:"): if t.desc and self.__validate_name(t.desc): del tag[t.HashKey] for key in ["UFID:http://musicbrainz.org", "TMCL", "POPM:%s" % const.EMAIL, "POPM:%s" % config.get("editing", "save_email")]: if key in tag: del(tag[key]) for key, id3name in self.SDI.items(): tag.delall(id3name) if key not in self: continue enc = encoding_for(self[key]) Kind = mutagen.id3.Frames[id3name] text = self[key].split("\n") if id3name == "WOAR": for t in text: tag.add(Kind(url=t)) else: tag.add(Kind(encoding=enc, text=text)) dontwrite = ["genre", "comment", "musicbrainz_trackid", "lyrics"] \ + RG_KEYS + listvalues(self.TXXX_MAP) if "musicbrainz_trackid" in self.realkeys(): f = mutagen.id3.UFID( owner="http://musicbrainz.org", data=self["musicbrainz_trackid"].encode("utf-8")) tag.add(f) # Issue 439 - Only write valid ISO 639-2 codes to TLAN (else TXXX) tag.delall("TLAN") if "language" in self: langs = self["language"].split("\n") if all([lang in ISO_639_2 for lang in langs]): # Save value(s) to TLAN tag. Guaranteed to be ASCII here tag.add(mutagen.id3.TLAN(encoding=3, text=langs)) dontwrite.append("language") else: print_d("Not using invalid language code '%s' in TLAN" % self["language"]) # Filter out known keys, and ones set not to write [generically]. keys_to_write = filter(lambda k: not (k in self.SDI or k in dontwrite), self.realkeys()) for key in keys_to_write: enc = encoding_for(self[key]) if key.startswith("performer:"): mcl.people.append([key.split(":", 1)[1], self[key]]) continue f = mutagen.id3.TXXX( encoding=enc, text=self[key].split("\n"), desc=u"QuodLibet::%s" % key) tag.add(f) if mcl.people: tag.add(mcl) if "genre" in self: enc = encoding_for(self["genre"]) t = self["genre"].split("\n") tag.add(mutagen.id3.TCON(encoding=enc, text=t)) else: try: del(tag["TCON"]) except KeyError: pass tag.delall("COMM:") if "comment" in self: enc = encoding_for(self["comment"]) t = self["comment"].split("\n") tag.add(mutagen.id3.COMM(encoding=enc, text=t, desc=u"", lang="\x00\x00\x00")) tag.delall("USLT::\x00\x00\x00") if "lyrics" in self: enc = encoding_for(self["lyrics"]) # lyrics are single string, not array tag.add(mutagen.id3.USLT(encoding=enc, text=self["lyrics"], desc=u"", lang="\x00\x00\x00")) # Delete old foobar replaygain .. for frame in tag.getall("TXXX"): if frame.desc.lower() in RG_KEYS: del tag[frame.HashKey] # .. write new one for k in RG_KEYS: # Add new ones if k in self: value = self[k] tag.add(mutagen.id3.TXXX(encoding=encoding_for(value), text=value.split("\n"), desc=k)) # we shouldn't delete all, but we use unknown ones as fallback, so make # sure they don't come back after reloading for t in tag.getall("RVA2"): if t.channel == 1: del tag[t.HashKey] for k in ["track", "album"]: if ('replaygain_%s_gain' % k) in self: try: gain = float(self["replaygain_%s_gain" % k].split()[0]) except ValueError: gain = 0 try: peak = float(self["replaygain_%s_peak" % k]) except (ValueError, KeyError): peak = 0 # https://github.com/quodlibet/quodlibet/issues/1027 peak = max(min(1.9, peak), 0) gain = max(min(63.9, gain), -64) f = mutagen.id3.RVA2(desc=k, channel=1, gain=gain, peak=peak) tag.add(f) for key in self.TXXX_MAP: try: del(tag["TXXX:" + key]) except KeyError: pass for key in self.PAM_XXXT: if key in self.SDI: # we already write it back using non-TXXX frames continue if key in self: value = self[key] f = mutagen.id3.TXXX(encoding=encoding_for(value), text=value.split("\n"), desc=self.PAM_XXXT[key]) tag.add(f) if (config.getboolean("editing", "save_to_songs") and (self.has_rating or self.get("~#playcount", 0) != 0)): email = config.get("editing", "save_email").strip() email = email or const.EMAIL t = mutagen.id3.POPM(email=email, rating=int(255 * self("~#rating")), count=self.get("~#playcount", 0)) tag.add(t) with translate_errors(): audio.save() self.sanitize() can_change_images = True def clear_images(self): """Delete all embedded images""" with translate_errors(): audio = self.Kind(self["~filename"]) if audio.tags is not None: audio.tags.delall("APIC") audio.save() self.has_images = False def get_images(self): """Returns a list of embedded images""" images = [] try: with translate_errors(): audio = self.Kind(self["~filename"]) except AudioFileError: return images tag = audio.tags if tag is None: return images for frame in tag.getall("APIC"): f = get_temp_cover_file(frame.data) images.append(EmbeddedImage(f, frame.mime, type_=frame.type)) images.sort(key=lambda c: c.sort_key) return images def get_primary_image(self): """Returns the primary embedded image""" try: with translate_errors(): audio = self.Kind(self["~filename"]) except AudioFileError: return tag = audio.tags if tag is None: return # get the APIC frame with type == 3 (cover) or the first one cover = None for frame in tag.getall("APIC"): cover = cover or frame if frame.type == APICType.COVER_FRONT: cover = frame break if cover: f = get_temp_cover_file(cover.data) return EmbeddedImage(f, cover.mime, type_=cover.type) def set_image(self, image): """Replaces all embedded images by the passed image""" with translate_errors(): audio = self.Kind(self["~filename"]) if audio.tags is None: audio.add_tags() tag = audio.tags try: data = image.read() except EnvironmentError as e: raise AudioFileError(e) tag.delall("APIC") frame = mutagen.id3.APIC( encoding=3, mime=image.mime_type, type=APICType.COVER_FRONT, desc=u"", data=data) tag.add(frame) with translate_errors(): audio.save() self.has_images = True ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/trueaudio.py������������������������������������������������������0000644�0001750�0001750�00000001122�13112005742�021747� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2006 Joe Wreschnig, Michael Urman, Niklas Janlert # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from mutagen.trueaudio import TrueAudio from ._id3 import ID3File class TrueAudioFile(ID3File): format = "True Audio" mimes = ["audio/x-tta"] Kind = TrueAudio def _parse_info(self, info): self["~#length"] = info.length loader = TrueAudioFile types = [TrueAudioFile] extensions = [".tta"] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/_image.py���������������������������������������������������������0000644�0001750�0001750�00000014662�13112005742�021204� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from ._misc import AudioFileError class ImageContainer(object): """Mixin/Interface for AudioFile to support basic embedded image editing""" def get_primary_image(self): """Returns the primary embedded image or None. In case of an error returns None. """ return def get_images(self): """Returns a list of embedded images, primary first. In case of an error returns an empty list. """ # fall back to the single implementation image = self.get_primary_image() if image: return [image] return [] @property def has_images(self): """Fast way to check for images, might be False if the file was modified externally. """ return "~picture" in self @has_images.setter def has_images(self, value): if value: self["~picture"] = "y" else: self.pop("~picture", None) @property def can_change_images(self): """Return True IFF `clear_images()` and `set_images()` are implemented""" return False def clear_images(self): """Delete all embedded images. Raises: AudioFileError """ raise AudioFileError("Not supported for this format") def set_image(self, image): """Replaces all embedded images by the passed image. The image type recorded in the file will be APICType.COVER_FRONT, disregarding image.type. Raises: AudioFileError """ raise AudioFileError("Not supported for this format") class APICType(object): """Enumeration of image types defined by the ID3 standard but also reused in WMA/FLAC/VorbisComment """ # Other OTHER = 0 # 32x32 pixels 'file icon' (PNG only) FILE_ICON = 1 # Other file icon OTHER_FILE_ICON = 2 # Cover (front) COVER_FRONT = 3 # Cover (back) COVER_BACK = 4 # Leaflet page LEAFLET_PAGE = 5 # Media (e.g. label side of CD) MEDIA = 6 # Lead artist/lead performer/soloist LEAD_ARTIST = 7 # Artist/performer ARTIST = 8 # Conductor CONDUCTOR = 9 # Band/Orchestra BAND = 10 # Composer COMPOSER = 11 # Lyricist/text writer LYRISCIST = 12 # Recording Location RECORDING_LOCATION = 13 # During recording DURING_RECORDING = 14 # During performance DURING_PERFORMANCE = 15 # Movie/video screen capture SCREEN_CAPTURE = 16 # A bright coloured fish FISH = 17 # Illustration ILLUSTRATION = 18 # Band/artist logotype BAND_LOGOTYPE = 19 # Publisher/Studio logotype PUBLISHER_LOGOTYPE = 20 @classmethod def to_string(cls, value): for k, v in cls.__dict__.items(): if v == value: return k return "" @classmethod def is_valid(cls, value): return cls.OTHER <= value <= cls.PUBLISHER_LOGOTYPE @classmethod def sort_key(cls, value): """Sorts picture types, most important picture is the lowest. Important is defined as most representative of an album release, ymmv. """ # index value -> important important = [ cls.LEAFLET_PAGE, cls.MEDIA, cls.COVER_BACK, cls.COVER_FRONT ] try: return -important.index(value) except ValueError: if value < cls.COVER_FRONT: return 100 - value else: return value class EmbeddedImage(object): """Embedded image, contains most of the properties needed for FLAC and ID3 images. """ def __init__(self, fileobj, mime_type, width=-1, height=-1, color_depth=-1, type_=APICType.OTHER): self.mime_type = mime_type self.width = width self.height = height self.color_depth = color_depth self.file = fileobj self.type = type_ def __repr__(self): return "<%s mime_type=%r width=%d height=%d type=%s file=%r>" % ( type(self).__name__, self.mime_type, self.width, self.height, APICType.to_string(self.type), self.file) def read(self): """Read the raw image data Returns: bytes Raises: IOError """ self.file.seek(0) data = self.file.read() self.file.seek(0) return data @property def sort_key(self): return APICType.sort_key(self.type) @property def extensions(self): """A possibly empty list of extensions e.g. ["jpeg", jpg"]""" from gi.repository import GdkPixbuf for format_ in GdkPixbuf.Pixbuf.get_formats(): if self.mime_type in format_.get_mime_types(): return format_.get_extensions() return [] @classmethod def from_path(cls, path): """Reads the header of `path` and creates a new image instance or None. """ from gi.repository import GdkPixbuf, GLib pb = [] # Feed data to PixbufLoader until it emits area-prepared, # get the partially filled pixbuf and extract the needed # information. def area_prepared(loader): pb.append(loader.get_pixbuf()) loader = GdkPixbuf.PixbufLoader() loader.connect("area-prepared", area_prepared) try: with open(path, "rb") as h: while not pb: data = h.read(1024) if data: loader.write(data) else: break except (EnvironmentError, GLib.GError): return finally: try: loader.close() except GLib.GError: pass if not pb: return pb = pb[0] width = pb.get_width() height = pb.get_height() color_depth = pb.get_bits_per_sample() format_ = loader.get_format() mime_types = format_.get_mime_types() mime_type = mime_types and mime_types[0] or "" try: return cls(open(path, "rb"), mime_type, width, height, color_depth) except EnvironmentError: return ������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/mp4.py������������������������������������������������������������0000644�0001750�0001750�00000017425�13112005742�020463� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Alexey Bobyakov <claymore.ws@gmail.com>, Joe Wreschnig # Copyright 2006 Lukas Lalinsky # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from mutagen.mp4 import MP4, MP4Cover from quodlibet.util.path import get_temp_cover_file from quodlibet.util.string import decode from quodlibet.compat import iteritems, listkeys, text_type from ._audio import AudioFile from ._misc import AudioFileError, translate_errors from ._image import EmbeddedImage class MP4File(AudioFile): format = "MPEG-4" mimes = ["audio/mp4", "audio/x-m4a", "audio/mpeg4", "audio/aac"] __translate = { "\xa9nam": "title", "\xa9alb": "album", "\xa9ART": "artist", "aART": "albumartist", "\xa9wrt": "composer", "\xa9day": "date", "\xa9cmt": "comment", "\xa9grp": "grouping", "\xa9gen": "genre", "tmpo": "bpm", "\xa9too": "encodedby", # FIXME: \xa9enc should be encodedby "cprt": "copyright", "soal": "albumsort", "soaa": "albumartistsort", "soar": "artistsort", "sonm": "titlesort", "soco": "composersort", "----:com.apple.iTunes:CONDUCTOR": "conductor", "----:com.apple.iTunes:DISCSUBTITLE": "discsubtitle", "----:com.apple.iTunes:LANGUAGE": "language", "----:com.apple.iTunes:MOOD": "mood", "----:com.apple.iTunes:MusicBrainz Artist Id": "musicbrainz_artistid", "----:com.apple.iTunes:MusicBrainz Track Id": "musicbrainz_trackid", "----:com.apple.iTunes:MusicBrainz Release Track Id": "musicbrainz_releasetrackid", "----:com.apple.iTunes:MusicBrainz Album Id": "musicbrainz_albumid", "----:com.apple.iTunes:MusicBrainz Album Artist Id": "musicbrainz_albumartistid", "----:com.apple.iTunes:MusicIP PUID": "musicip_puid", "----:com.apple.iTunes:MusicBrainz Album Status": "musicbrainz_albumstatus", "----:com.apple.iTunes:MusicBrainz Album Type": "musicbrainz_albumtype", "----:com.apple.iTunes:MusicBrainz Album Release Country": "releasecountry", '----:com.apple.iTunes:MusicBrainz Release Group Id': 'musicbrainz_releasegroupid', '----:com.apple.iTunes:replaygain_album_gain': 'replaygain_album_gain', '----:com.apple.iTunes:replaygain_album_peak': 'replaygain_album_peak', '----:com.apple.iTunes:replaygain_track_gain': 'replaygain_track_gain', '----:com.apple.iTunes:replaygain_track_peak': 'replaygain_track_peak', '----:com.apple.iTunes:replaygain_reference_loudness': 'replaygain_reference_loudness', } __rtranslate = dict([(v, k) for k, v in iteritems(__translate)]) __tupletranslate = { "disk": "discnumber", "trkn": "tracknumber", } __rtupletranslate = dict([(v, k) for k, v in iteritems(__tupletranslate)]) def __init__(self, filename): with translate_errors(): audio = MP4(filename) self["~codec"] = getattr(audio.info, "codec_description", u"AAC") self["~#length"] = audio.info.length self["~#bitrate"] = int(audio.info.bitrate / 1000) if audio.info.channels: self["~#channels"] = audio.info.channels for key, values in audio.items(): if key in self.__tupletranslate: if values: name = self.__tupletranslate[key] cur, total = values[0] if total: self[name] = u"%d/%d" % (cur, total) else: self[name] = text_type(cur) elif key in self.__translate: name = self.__translate[key] if key == "tmpo": self[name] = u"\n".join(map(text_type, values)) elif key.startswith("----"): self[name] = "\n".join( map(lambda v: decode(v).strip("\x00"), values)) else: self[name] = "\n".join(values) elif key == "covr": self.has_images = True self.sanitize(filename) def write(self): with translate_errors(): audio = MP4(self["~filename"]) for key in (listkeys(self.__translate) + listkeys(self.__tupletranslate)): try: del(audio[key]) except KeyError: pass for key in self.realkeys(): try: name = self.__rtranslate[key] except KeyError: continue values = self.list(key) if name == "tmpo": values = list(map(lambda v: int(round(float(v))), values)) elif name.startswith("----"): values = list(map(lambda v: v.encode("utf-8"), values)) audio[name] = values track, tracks = self("~#track"), self("~#tracks", 0) if track: audio["trkn"] = [(track, tracks)] disc, discs = self("~#disc"), self("~#discs", 0) if disc: audio["disk"] = [(disc, discs)] with translate_errors(): audio.save() self.sanitize() def can_multiple_values(self, key=None): if key is None: return [] return False def can_change(self, key=None): OK = listkeys(self.__rtranslate) + listkeys(self.__rtupletranslate) if key is None: return OK else: return super(MP4File, self).can_change(key) and (key in OK) def get_images(self): images = [] try: tag = MP4(self["~filename"]) except Exception: return [] for cover in tag.get("covr", []): if cover.imageformat == MP4Cover.FORMAT_JPEG: mime = "image/jpeg" elif cover.imageformat == MP4Cover.FORMAT_PNG: mime = "image/png" else: mime = "image/" f = get_temp_cover_file(cover) images.append(EmbeddedImage(f, mime)) return images def get_primary_image(self): try: tag = MP4(self["~filename"]) except Exception: return for cover in tag.get("covr", []): if cover.imageformat == MP4Cover.FORMAT_JPEG: mime = "image/jpeg" elif cover.imageformat == MP4Cover.FORMAT_PNG: mime = "image/png" else: mime = "image/" f = get_temp_cover_file(cover) return EmbeddedImage(f, mime) can_change_images = True def clear_images(self): """Delete all embedded images""" with translate_errors(): tag = MP4(self["~filename"]) tag.pop("covr", None) tag.save() self.has_images = False def set_image(self, image): """Replaces all embedded images by the passed image""" if image.mime_type == "image/jpeg": image_format = MP4Cover.FORMAT_JPEG elif image.mime_type == "image/png": image_format = MP4Cover.FORMAT_PNG else: raise AudioFileError( "mp4: Unsupported image format %r" % image.mime_type) with translate_errors(): tag = MP4(self["~filename"]) try: data = image.read() except EnvironmentError: return cover = MP4Cover(data, image_format) tag["covr"] = [cover] with translate_errors(): tag.save() self.has_images = True loader = MP4File types = [MP4File] extensions = ['.mp4', '.m4a', '.m4v', '.3gp', '.3g2', '.3gp2'] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/_serialize.py�����������������������������������������������������0000644�0001750�0001750�00000014212�13112005742�022100� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Code for serializing AudioFile instances""" import pickle from senf import bytes2fsn, fsn2bytes, fsnative from quodlibet.util.picklehelper import pickle_loads, pickle_dumps from quodlibet.util import is_windows from quodlibet.compat import PY3, text_type from ._audio import AudioFile class SerializationError(Exception): pass def _py2_to_py3(items): assert PY3 for i in items: try: l = list(i.items()) except AttributeError: raise SerializationError i.clear() for k, v in l: if isinstance(k, bytes): k = k.decode("utf-8", "replace") else: # strip surrogates try: k.encode("utf-8") except UnicodeEncodeError: k = k.encode("utf-8", "replace").decode("utf-8") if k == "~filename" or k == "~mountpoint": if isinstance(v, bytes): try: v = bytes2fsn(v, "utf-8") except ValueError: # just in case, only on Windows assert is_windows() v = v.decode("utf-8", "replace") elif isinstance(v, bytes): v = v.decode("utf-8", "replace") elif isinstance(v, text_type): # strip surrogates try: v.encode("utf-8") except UnicodeEncodeError: v = v.encode("utf-8", "replace").decode("utf-8") i[k] = v return items def _py3_to_py2(items): assert PY3 is_win = is_windows() new_list = [] for i in items: inst = dict.__new__(i.__class__) for key, value in i.items(): if key in ("~filename", "~mountpoint") and not is_win: value = fsn2bytes(value, None) try: key = key.encode("ascii") except UnicodeEncodeError: pass dict.__setitem__(inst, key, value) new_list.append(inst) return new_list def _py2_to_py2(items): # for weren't always so strict about the types in AudioFile.__setitem__ # This tries to fix things. assert not PY3 fsn_type = type(fsnative()) fixups = [] for i in items: try: it = i.iteritems() except AttributeError: raise SerializationError for k, v in it: if k in ("~filename", "~mountpoint"): if not isinstance(v, fsn_type): # use utf-8 here since we can't be sure that the environ # is the same as before if isinstance(v, text_type): v = v.encode("utf-8", "replace") else: v = v.decode("utf-8", "replace") fixups.append((i, k, v)) elif k[:2] == "~#": try: v + 0 except: try: fixups.append((i, k, int(v))) except: try: fixups.append((i, k, float(v))) except: fixups.append((i, k, 0)) elif not isinstance(v, text_type): if isinstance(v, bytes): fixups.append((i, k, v.decode("utf-8", "replace"))) else: fixups.append((i, k, text_type(v))) for item, key, value in fixups: item[key] = value return items def load_audio_files(data, process=True): """unpickles the item list and if some class isn't found unpickle as a dict and filter them out afterwards. In case everything gets filtered out will raise SerializationError (because then likely something larger went wrong) Args: data (bytes) process (bool): if the dict key/value types should be converted, either to be usable from py3 or to convert to newer types Returns: List[AudioFile] Raises: SerializationError """ dummy = type("dummy", (dict,), {}) error_occured = [] temp_type_cache = {} def lookup_func(base, module, name): try: real_type = base(module, name) except (ImportError, AttributeError): error_occured.append(True) return dummy if module.split(".")[0] not in ("quodlibet", "tests"): return real_type # return a straight dict subclass so that unpickle doesn't call # our __setitem__. Further down we simply change the __class__ # to our real type. if not real_type in temp_type_cache: new_type = type(name, (dict,), {"real_type": real_type}) temp_type_cache[real_type] = new_type return temp_type_cache[real_type] try: items = pickle_loads(data, lookup_func) except pickle.UnpicklingError as e: raise SerializationError(e) if error_occured: items = [i for i in items if not isinstance(i, dummy)] if not items: raise SerializationError( "all class lookups failed. something is wrong") if process: if PY3: items = _py2_to_py3(items) else: items = _py2_to_py2(items) try: for i in items: i.__class__ = i.real_type except AttributeError as e: raise SerializationError(e) return items def dump_audio_files(item_list, process=True): """Pickles a list of AudioFiles Returns: bytes Raises: SerializationError """ assert isinstance(item_list, list) assert not item_list or isinstance(item_list[0], AudioFile) if PY3 and process: item_list = _py3_to_py2(item_list) try: return pickle_dumps(item_list, 2) except pickle.PicklingError as e: raise SerializationError(e) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/_apev2.py���������������������������������������������������������0000644�0001750�0001750�00000014535�13112005742�021136� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import mutagen.apev2 from quodlibet.util.path import get_temp_cover_file from quodlibet.compat import iteritems, iterkeys from ._audio import AudioFile from ._image import APICType, EmbeddedImage from ._misc import AudioFileError, translate_errors def get_cover_type(key, value): """Returns an APICType or None if the tag isn't an image""" if value.kind != mutagen.apev2.BINARY: return type_map = { "cover art (front)": APICType.COVER_FRONT, "cover art (back)": APICType.COVER_BACK, } return type_map.get(key.lower()) def parse_cover(key, value): """Returns a EmbeddedImage or None""" # http://www.hydrogenaud.io/forums/index.php?showtopic=40603 cover_type = get_cover_type(key, value) if cover_type is None: return parts = value.value.split(b"\x00", 1) if len(parts) != 2: return f = get_temp_cover_file(parts[-1]) if not f: return return EmbeddedImage(f, "image/", type_=cover_type) def write_cover(image): """Takes EmbeddedImage and returns a (key, value) tuple Raises: AudioFileError """ if image.type == APICType.COVER_FRONT: key = "Cover Art (Front)" else: key = "Cover Art (Back)" try: data = image.read() except EnvironmentError as e: raise AudioFileError(e) ext = (image.extensions and image.extensions[0]) or "jpg" data = ("hello.%s\x00" % (ext)).encode("ascii") + data value = mutagen.apev2.APEValue(data, mutagen.apev2.BINARY) return (key, value) class APEv2File(AudioFile): # Map APE names to QL names. APE tags are also usually capitalized. # Also blacklist a number of tags. IGNORE = ["file", "index", "introplay", "dummy"] TRANS = {"subtitle": "version", "track": "tracknumber", "disc": "discnumber", "catalog": "labelid", "year": "date", "record location": "location", "album artist": "albumartist", "debut album": "originalalbum", "record date": "recordingdate", "original artist": "originalartist", "mixartist": "remixer", } SNART = dict([(v, k) for k, v in iteritems(TRANS)]) can_change_images = True def __init__(self, filename, audio=None): if audio: tag = audio.tags or {} else: with translate_errors(): try: tag = mutagen.apev2.APEv2(filename) except mutagen.apev2.APENoHeaderError: tag = {} for key, value in tag.items(): if get_cover_type(key, value) is not None: self.has_images = True key = self.TRANS.get(key.lower(), key.lower()) if (value.kind == mutagen.apev2.TEXT and key not in self.IGNORE): self[key] = "\n".join(list(value)) self.sanitize(filename) @staticmethod def __titlecase(key): if key.lower() in ["isrc", "isbn", "ean/upc"]: return key.upper() else: return key.title() def can_change(self, key=None): if key is None: return True else: return (super(APEv2File, self).can_change(key) and key.lower() not in self.IGNORE and key.lower() not in self.TRANS and mutagen.apev2.is_valid_apev2_key(self.__titlecase(key))) def write(self): with translate_errors(): try: tag = mutagen.apev2.APEv2(self['~filename']) except mutagen.apev2.APENoHeaderError: tag = mutagen.apev2.APEv2() # Remove any text keys we read in for key in iterkeys(tag): value = tag[key] if (value.kind == mutagen.apev2.TEXT and key.lower() not in self.IGNORE): del(tag[key]) # Write all tags we have lower = self.as_lowercased() for key in lower.realkeys(): new_key = self.SNART.get(key, key) if new_key in self.IGNORE: continue new_key = self.__titlecase(new_key) tag[new_key] = lower.list(key) with translate_errors(): tag.save(self["~filename"]) self.sanitize() def get_primary_image(self): try: tag = mutagen.apev2.APEv2(self['~filename']) except Exception: return primary = None for key, value in iteritems(tag): primary = (key, value) cover_type = get_cover_type(key, value) if cover_type == APICType.COVER_FRONT: break if primary is not None: return parse_cover(*primary) def get_images(self): try: tag = mutagen.apev2.APEv2(self['~filename']) except Exception: return [] images = [] for key, value in iteritems(tag): image = parse_cover(key, value) if image is not None: images.append(image) images.sort(key=lambda c: c.sort_key) return images def clear_images(self): with translate_errors(): try: tag = mutagen.apev2.APEv2(self['~filename']) except mutagen.apev2.APENoHeaderError: return for key, value in tag.items(): cover_type = get_cover_type(key, value) if cover_type is not None: del tag[key] tag.save() self.has_images = False def set_image(self, image): with translate_errors(): try: tag = mutagen.apev2.APEv2(self['~filename']) except mutagen.apev2.APENoHeaderError: tag = mutagen.apev2.APEv2() for key, value in tag.items(): cover_type = get_cover_type(key, value) if cover_type is not None: del tag[key] key, value = write_cover(image) tag[key] = value with translate_errors(): tag.save(self['~filename']) self.has_images = True �������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/wma.py������������������������������������������������������������0000644�0001750�0001750�00000020706�13112005742�020543� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Lukas Lalinsky # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import struct import mutagen.asf from quodlibet.util.path import get_temp_cover_file from quodlibet.compat import iteritems, text_type from ._audio import AudioFile from ._image import EmbeddedImage, APICType from ._misc import AudioFileError, translate_errors class WMAFile(AudioFile): mimes = ["audio/x-ms-wma", "audio/x-ms-wmv", "video/x-ms-asf", "audio/x-wma", "video/x-wmv"] format = "ASF" #http://msdn.microsoft.com/en-us/library/dd743066%28VS.85%29.aspx #http://msdn.microsoft.com/en-us/library/dd743063%28VS.85%29.aspx #http://msdn.microsoft.com/en-us/library/dd743220%28VS.85%29.aspx __translate = { "WM/AlbumTitle": "album", "Title": "title", "Author": "artist", "WM/AlbumArtist": "albumartist", "WM/Composer": "composer", "WM/Writer": "lyricist", "WM/Conductor": "conductor", "WM/ModifiedBy": "remixer", "WM/Producer": "producer", "WM/ContentGroupDescription": "grouping", "WM/SubTitle": "discsubtitle", "WM/TrackNumber": "tracknumber", "WM/PartOfSet": "discnumber", "WM/BeatsPerMinute": "bpm", "Copyright": "copyright", "WM/ISRC": "isrc", "WM/Mood": "mood", "WM/EncodedBy": "encodedby", "MusicBrainz/Track Id": "musicbrainz_trackid", "MusicBrainz/Release Track Id": "musicbrainz_releasetrackid", "MusicBrainz/Album Id": "musicbrainz_albumid", "MusicBrainz/Artist Id": "musicbrainz_artistid", "MusicBrainz/Album Artist Id": "musicbrainz_albumartistid", "MusicBrainz/TRM Id": "musicbrainz_trmid", "MusicIP/PUID": "musicip_puid", "MusicBrainz/Release Group Id": "musicbrainz_releasegroupid", "WM/Year": "date", "WM/OriginalArtist": "originalartist", "WM/OriginalAlbumTitle": "originalalbum", "WM/AlbumSortOrder": "albumsort", "WM/ArtistSortOrder": "artistsort", "WM/AlbumArtistSortOrder": "albumartistsort", "WM/Genre": "genre", "WM/Publisher": "publisher", "WM/AuthorURL": "website", "Description": "comment" } __rtranslate = dict([(v, k) for k, v in iteritems(__translate)]) # http://msdn.microsoft.com/en-us/library/dd743065.aspx # note: not all names here are used by QL __multi_value_attr = { "Author", "WM/AlbumArtist", "WM/AlbumCoverURL", "WM/Category", "WM/Composer", "WM/Conductor", "WM/Director", "WM/Genre", "WM/GenreID", "WM/Language", "WM/Lyrics_Synchronised", "WM/Mood", "WM/Picture", "WM/Producer", "WM/PromotionURL", "WM/UserWebURL", "WM/Writer", } __multi_value_keys = set() for k, v in iteritems(__translate): if k in __multi_value_attr: __multi_value_keys.add(v) def __init__(self, filename, audio=None): if audio is None: with translate_errors(): audio = mutagen.asf.ASF(filename) info = audio.info self["~#length"] = info.length self["~#bitrate"] = int(info.bitrate / 1000) if info.channels: self["~#channels"] = info.channels type_, name, desc = info.codec_type, info.codec_name, \ info.codec_description if type_: self["~codec"] = type_ encoding = u"\n".join(filter(None, [name, desc])) if encoding: self["~encoding"] = encoding for name, values in audio.tags.items(): if name == "WM/Picture": self.has_images = True try: name = self.__translate[name] except KeyError: continue self[name] = u"\n".join(map(text_type, values)) self.sanitize(filename) def write(self): with translate_errors(): audio = mutagen.asf.ASF(self["~filename"]) for key in self.__translate.keys(): try: del(audio[key]) except KeyError: pass for key in self.realkeys(): try: name = self.__rtranslate[key] except KeyError: continue audio.tags[name] = self.list(key) with translate_errors(): audio.save() self.sanitize() def can_multiple_values(self, key=None): if key is None: return self.__multi_value_keys return key in self.__multi_value_keys def can_change(self, key=None): OK = self.__rtranslate.keys() if key is None: return OK else: return super(WMAFile, self).can_change(key) and (key in OK) def get_images(self): images = [] try: tag = mutagen.asf.ASF(self["~filename"]) except Exception: return images for image in tag.get("WM/Picture", []): try: (mime, desc, data, type_) = unpack_image(image.value) except ValueError: continue f = get_temp_cover_file(data) images.append(EmbeddedImage(f, mime, type_=type_)) images.sort(key=lambda c: c.sort_key) return images def get_primary_image(self): """Returns the primary embedded image or None""" try: tag = mutagen.asf.ASF(self["~filename"]) except Exception: return for image in tag.get("WM/Picture", []): try: (mime, desc, data, type_) = unpack_image(image.value) except ValueError: continue if type_ == APICType.COVER_FRONT: # Only cover images f = get_temp_cover_file(data) return EmbeddedImage(f, mime, type_=type_) can_change_images = True def clear_images(self): """Delete all embedded images""" with translate_errors(): tag = mutagen.asf.ASF(self["~filename"]) tag.pop("WM/Picture", None) tag.save() self.has_images = False def set_image(self, image): """Replaces all embedded images by the passed image""" with translate_errors(): tag = mutagen.asf.ASF(self["~filename"]) try: imagedata = image.read() except EnvironmentError as e: raise AudioFileError(e) # thumbnail gets used in WMP.. data = pack_image(image.mime_type, u"thumbnail", imagedata, APICType.COVER_FRONT) value = mutagen.asf.ASFValue(data, mutagen.asf.BYTEARRAY) tag["WM/Picture"] = [value] with translate_errors(): tag.save() self.has_images = True def unpack_image(data): """ Helper function to unpack image data from a WM/Picture tag. The data has the following format: 1 byte: Picture type (0-20), see ID3 APIC frame specification at http://www.id3.org/id3v2.4.0-frames 4 bytes: Picture data length in LE format MIME type, null terminated UTF-16-LE string Description, null terminated UTF-16-LE string The image data in the given length """ try: (type_, size) = struct.unpack_from("<bi", data) except struct.error as e: raise ValueError(e) data = data[5:] mime = b"" while data: char, data = data[:2], data[2:] if char == b"\x00\x00": break mime += char else: raise ValueError("mime: missing data") mime = mime.decode("utf-16-le") description = b"" while data: char, data = data[:2], data[2:] if char == b"\x00\x00": break description += char else: raise ValueError("desc: missing data") description = description.decode("utf-16-le") if size != len(data): raise ValueError("image data size mismatch") return (mime, description, data, type_) def pack_image(mime, description, imagedata, type_): assert APICType.is_valid(type_) size = len(imagedata) data = struct.pack("<bi", type_, size) data += mime.encode("utf-16-le") + b"\x00\x00" data += description.encode("utf-16-le") + b"\x00\x00" data += imagedata return data loader = WMAFile types = [WMAFile] extensions = [".wma", ".asf", ".wmv"] ����������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/mod.py������������������������������������������������������������0000644�0001750�0001750�00000004244�13112005742�020535� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import ctypes from quodlibet.util import load_library from ._audio import AudioFile, translate_errors extensions = [ '.669', '.amf', '.ams', '.dsm', '.far', '.it', '.med', '.mod', '.mt2', '.mtm', '.okt', '.s3m', '.stm', '.ult', '.gdm', '.xm'] try: _modplug = load_library( ["libmodplug.so.1", "libmodplug.so.0", "libmodplug-1.dll"])[0] except OSError: extensions = [] else: _modplug.ModPlug_GetName.argtypes = [ctypes.c_void_p] _modplug.ModPlug_GetName.restype = ctypes.c_char_p _modplug.ModPlug_Load.argtypes = [ctypes.c_void_p, ctypes.c_int] _modplug.ModPlug_Load.restype = ctypes.c_void_p _modplug.ModPlug_GetLength.argtypes = [ctypes.c_void_p] _modplug.ModPlug_GetLength.restype = ctypes.c_int _modplug.ModPlug_Unload.argtypes = [ctypes.c_void_p] _modplug.ModPlug_Unload.restype = None class ModFile(AudioFile): format = "MOD/XM/IT" def __init__(self, filename): with translate_errors(): data = open(filename, "rb").read() f = _modplug.ModPlug_Load(data, len(data)) if not f: raise IOError("%r not a valid MOD file" % filename) self["~#length"] = _modplug.ModPlug_GetLength(f) // 1000 title = _modplug.ModPlug_GetName(f) or os.path.basename(filename) try: self["title"] = title.decode('utf-8') except UnicodeError: self["title"] = title.decode("iso-8859-1") _modplug.ModPlug_Unload(f) self.sanitize(filename) def write(self): pass def reload(self, *args): artist = self.get("artist") super(ModFile, self).reload(*args) if artist is not None: self.setdefault("artist", artist) def can_change(self, k=None): if k is None: return ["artist"] else: return k == "artist" loader = ModFile types = [ModFile] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/__init__.py�������������������������������������������������������0000644�0001750�0001750�00000001466�13112005742�021520� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from ._audio import PEOPLE, AudioFile, DUMMY_SONG, decode_value, \ FILESYSTEM_TAGS, TIME_TAGS from ._image import EmbeddedImage, APICType from ._misc import AudioFileError, init, MusicFile, types, loaders, filter, \ mimes from ._serialize import load_audio_files, dump_audio_files, SerializationError AudioFile, AudioFileError, EmbeddedImage, DUMMY_SONG, PEOPLE, decode_value, APICType, FILESYSTEM_TAGS, TIME_TAGS, init, MusicFile, types, loaders, filter, mimes, load_audio_files, dump_audio_files, SerializationError ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/xiph.py�����������������������������������������������������������0000644�0001750�0001750�00000034234�13112005742�020730� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # 2009-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys import base64 import mutagen from mutagen.flac import Picture, error as FLACError from mutagen.id3 import ID3 from quodlibet import config from quodlibet import const from quodlibet.util.path import get_temp_cover_file from ._audio import AudioFile, translate_errors, AudioFileError from ._image import EmbeddedImage, APICType # Migrate old layout sys.modules["formats.flac"] = sys.modules[__name__] sys.modules["formats.oggvorbis"] = sys.modules[__name__] class MutagenVCFile(AudioFile): format = "Unknown Mutagen + vorbiscomment" MutagenType = None can_change_images = True def __init__(self, filename, audio=None): # If we're done a type probe, use the results of that to avoid # reopening the file. if audio is None: with translate_errors(): audio = self.MutagenType(filename) self["~#length"] = audio.info.length try: self["~#bitrate"] = int(audio.info.bitrate / 1000) except AttributeError: pass try: self["~#channels"] = audio.info.channels except AttributeError: pass if audio.tags and audio.tags.vendor: self["~encoding"] = audio.tags.vendor # mutagen keys are lower cased for key, value in (audio.tags or {}).items(): self[key] = "\n".join(value) self.__post_read() self.sanitize(filename) def __post_read_total(self, main, fallback, single): one = None total = None if single in self: parts = self[single].split("/", 1) if parts[0]: one = parts[0] if len(parts) > 1: total = parts[1] del self[single] if main in self: total = self[main] del self[main] else: if fallback in self: total = self[fallback] del self[fallback] final = None if one is not None: final = one if total is not None: if final is None: final = "/" + total else: final += "/" + total if final is not None: self[single] = final def __post_read(self): email = config.get("editing", "save_email").strip() maps = {"rating": float, "playcount": int} for keyed_key, func in maps.items(): for subkey in ["", ":" + const.EMAIL, ":" + email]: key = keyed_key + subkey if key in self: try: self["~#" + keyed_key] = func(self[key]) except ValueError: pass del(self[key]) if "metadata_block_picture" in self: self.has_images = True del(self["metadata_block_picture"]) if "coverart" in self: self.has_images = True del(self["coverart"]) if "coverartmime" in self: del(self["coverartmime"]) self.__post_read_total("tracktotal", "totaltracks", "tracknumber") self.__post_read_total("disctotal", "totaldiscs", "discnumber") def get_images(self): try: audio = self.MutagenType(self["~filename"]) except Exception: return [] # metadata_block_picture images = [] for data in audio.get("metadata_block_picture", []): try: cover = Picture(base64.b64decode(data)) except (TypeError, FLACError): continue f = get_temp_cover_file(cover.data) images.append(EmbeddedImage( f, cover.mime, cover.width, cover.height, cover.depth, cover.type)) # coverart + coverartmime cover = audio.get("coverart") try: cover = cover and base64.b64decode(cover[0]) except TypeError: cover = None if cover: mime = audio.get("coverartmime") mime = (mime and mime[0]) or "image/" f = get_temp_cover_file(cover) images.append(EmbeddedImage(f, mime)) images.sort(key=lambda c: c.sort_key) return images def get_primary_image(self): """Returns the primary embedded image""" try: audio = self.MutagenType(self["~filename"]) except Exception: return None pictures = [] for data in audio.get("metadata_block_picture", []): try: pictures.append(Picture(base64.b64decode(data))) except (TypeError, FLACError, ValueError): pass cover = None for pic in pictures: if pic.type == APICType.COVER_FRONT: cover = pic break cover = cover or pic if cover: f = get_temp_cover_file(cover.data) return EmbeddedImage( f, cover.mime, cover.width, cover.height, cover.depth, cover.type) cover = audio.get("coverart") try: cover = cover and base64.b64decode(cover[0]) except (TypeError, ValueError): cover = None if not cover: self.has_images = False return mime = audio.get("coverartmime") mime = (mime and mime[0]) or "image/" f = get_temp_cover_file(cover) return EmbeddedImage(f, mime) def clear_images(self): """Delete all embedded images""" with translate_errors(): audio = self.MutagenType(self["~filename"]) audio.pop("metadata_block_picture", None) audio.pop("coverart", None) audio.pop("coverartmime", None) audio.save() self.has_images = False def set_image(self, image): """Replaces all embedded images by the passed image""" with translate_errors(): audio = self.MutagenType(self["~filename"]) try: data = image.read() except EnvironmentError as e: raise AudioFileError(e) pic = Picture() pic.data = data pic.type = APICType.COVER_FRONT pic.mime = image.mime_type pic.width = image.width pic.height = image.height pic.depth = image.color_depth audio.pop("coverart", None) audio.pop("coverartmime", None) audio["metadata_block_picture"] = base64.b64encode( pic.write()).decode("ascii") with translate_errors(): audio.save() self.has_images = True def can_change(self, k=None): if k is None: return super(MutagenVCFile, self).can_change(None) else: l = k.lower() return (super(MutagenVCFile, self).can_change(k) and l not in ["rating", "playcount", "metadata_block_picture", "coverart", "coverartmime"] and not l.startswith("rating:") and not l.startswith("playcount:")) def __prep_write(self, comments): email = config.get("editing", "save_email").strip() for key in comments.keys(): if key.startswith("rating:") or key.startswith("playcount:"): if key.split(":", 1)[1] in [const.EMAIL, email]: del(comments[key]) elif key not in ["metadata_block_picture", "coverart", "coverartmime"]: del(comments[key]) if config.getboolean("editing", "save_to_songs"): email = email or const.EMAIL if self.has_rating: comments["rating:" + email] = str(self("~#rating")) playcount = self.get("~#playcount", 0) if playcount != 0: comments["playcount:" + email] = str(playcount) def __prep_write_total(self, comments, main, fallback, single): lower = self.as_lowercased() for k in [main, fallback, single]: if k in comments: del comments[k] if single in lower: parts = lower[single].split("/", 1) if parts[0]: comments[single] = [parts[0]] if len(parts) > 1: comments[main] = [parts[1]] if main in lower: comments[main] = lower.list(main) if fallback in lower: if main in comments: comments[fallback] = lower.list(fallback) else: comments[main] = lower.list(fallback) def write(self): with translate_errors(): audio = self.MutagenType(self["~filename"]) if audio.tags is None: audio.add_tags() self.__prep_write(audio.tags) lower = self.as_lowercased() for key in lower.realkeys(): audio.tags[key] = lower.list(key) self.__prep_write_total(audio.tags, "tracktotal", "totaltracks", "tracknumber") self.__prep_write_total(audio.tags, "disctotal", "totaldiscs", "discnumber") with translate_errors(): audio.save() self.sanitize() extensions = [] ogg_formats = [] from mutagen.oggvorbis import OggVorbis extensions.append(".ogg") extensions.append(".oga") ogg_formats.append(OggVorbis) from mutagen.flac import FLAC, FLACNoHeaderError extensions.append(".flac") ogg_formats.append(FLAC) from mutagen.oggflac import OggFLAC extensions.append(".oggflac") ogg_formats.append(OggFLAC) from mutagen.oggspeex import OggSpeex extensions.append(".spx") ogg_formats.append(OggSpeex) from mutagen.oggtheora import OggTheora extensions.append(".ogv") ogg_formats.append(OggTheora) from mutagen.oggopus import OggOpus extensions.append(".opus") ogg_formats.append(OggOpus) class OggFile(MutagenVCFile): format = "Ogg Vorbis" mimes = ["audio/vorbis", "audio/ogg; codecs=vorbis"] MutagenType = OggVorbis class OggFLACFile(MutagenVCFile): format = "Ogg FLAC" mimes = ["audio/x-oggflac", "audio/ogg; codecs=flac"] MutagenType = OggFLAC class OggSpeexFile(MutagenVCFile): format = "Ogg Speex" mimes = ["audio/x-speex", "audio/ogg; codecs=speex"] MutagenType = OggSpeex class OggTheoraFile(MutagenVCFile): format = "Ogg Theora" mimes = ["video/x-theora", "video/ogg; codecs=theora"] MutagenType = OggTheora class OggOpusFile(MutagenVCFile): format = "Ogg Opus" mimes = ["audio/ogg; codecs=opus"] MutagenType = OggOpus class FLACFile(MutagenVCFile): format = "FLAC" mimes = ["audio/x-flac", "application/x-flac"] MutagenType = FLAC def __init__(self, filename, audio=None): if audio is None: with translate_errors(): audio = FLAC(filename) super(FLACFile, self).__init__(filename, audio) if audio.pictures: self.has_images = True def get_images(self): images = super(FLACFile, self).get_images() try: tag = FLAC(self["~filename"]) except Exception: return images for cover in tag.pictures: fileobj = get_temp_cover_file(cover.data) images.append(EmbeddedImage( fileobj, cover.mime, cover.width, cover.height, cover.depth, cover.type)) images.sort(key=lambda c: c.sort_key) return images def get_primary_image(self): """Returns the primary embedded image""" try: tag = FLAC(self["~filename"]) except Exception: return None covers = tag.pictures if not covers: return super(FLACFile, self).get_primary_image() covers.sort(key=lambda c: APICType.sort_key(c.type)) cover = covers[0] fileobj = get_temp_cover_file(cover.data) return EmbeddedImage( fileobj, cover.mime, cover.width, cover.height, cover.depth, cover.type) def clear_images(self): """Delete all embedded images""" with translate_errors(): tag = FLAC(self["~filename"]) tag.clear_pictures() tag.save() # clear vcomment tags super(FLACFile, self).clear_images() self.has_images = False def set_image(self, image): """Replaces all embedded images by the passed image""" with translate_errors(): tag = FLAC(self["~filename"]) try: data = image.read() except EnvironmentError as e: raise AudioFileError(e) pic = Picture() pic.data = data pic.type = APICType.COVER_FRONT pic.mime = image.mime_type pic.width = image.width pic.height = image.height pic.depth = image.color_depth tag.add_picture(pic) with translate_errors(): tag.save() # clear vcomment tags super(FLACFile, self).clear_images() self.has_images = True def write(self): if ID3 is not None: with translate_errors(): ID3().delete(filename=self["~filename"]) super(FLACFile, self).write() types = [] for var in list(globals().values()): if getattr(var, 'MutagenType', None): types.append(var) def loader(filename): """ Returns: AudioFile Raises: AudioFileError """ with translate_errors(): audio = mutagen.File(filename, options=ogg_formats) if audio is None and FLAC is not None: # FLAC with ID3 try: audio = FLAC(filename) except FLACNoHeaderError: pass if audio is None: raise AudioFileError("file type could not be determined") Kind = type(audio) for klass in globals().values(): if Kind is getattr(klass, 'MutagenType', None): return klass(filename, audio) raise AudioFileError("file type could not be determined") ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/_audio.py���������������������������������������������������������0000644�0001750�0001750�00000105046�13112005742�021220� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # 2012-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation # Much of this code is highly optimized, because many of the functions # are called in tight loops. Don't change things just to make them # more readable, unless they're also faster. import os import shutil import time from senf import fsn2uri, fsnative, fsn2text, devnull, bytes2fsn, path2fsn from quodlibet import _ from quodlibet import util from quodlibet import config from quodlibet.util.path import mkdir, mtime, expanduser, \ normalize_path, escape_filename, ismount from quodlibet.util.string import encode, decode, isascii from quodlibet.util import iso639 from quodlibet.util import human_sort_key as human, capitalize from quodlibet.util.tags import TAG_ROLES, TAG_TO_SORT from quodlibet.compat import iteritems, string_types, text_type, \ number_types, listitems, izip_longest, integer_types, PY3, listfilter from ._image import ImageContainer from ._misc import AudioFileError, translate_errors translate_errors MIGRATE = {"~#playcount", "~#laststarted", "~#lastplayed", "~#added", "~#skipcount", "~#rating", "~bookmark"} """These get migrated if a song gets reloaded""" PEOPLE = ["artist", "albumartist", "author", "composer", "~performers", "originalartist", "lyricist", "arranger", "conductor"] """Sources of the ~people tag, most important first""" TIME_TAGS = {"~#lastplayed", "~#laststarted", "~#added", "~#mtime"} """Time in seconds since epoch, defaults to 0""" SIZE_TAGS = {"~#filesize"} """Size in bytes, defaults to 0""" NUMERIC_ZERO_DEFAULT = {"~#skipcount", "~#playcount", "~#length", "~#bitrate"} """Defaults to 0""" NUMERIC_ZERO_DEFAULT.update(TIME_TAGS) NUMERIC_ZERO_DEFAULT.update(SIZE_TAGS) FILESYSTEM_TAGS = {"~filename", "~basename", "~dirname", "~mountpoint"} """Values are bytes in Linux instead of unicode""" SORT_TO_TAG = dict([(v, k) for (k, v) in iteritems(TAG_TO_SORT)]) """Reverse map, so sort tags can fall back to the normal ones""" PEOPLE_SORT = [TAG_TO_SORT.get(k, k) for k in PEOPLE] """Sources for ~peoplesort, most important first""" VARIOUS_ARTISTS_VALUES = 'V.A.', 'various artists', 'Various Artists' """Values for ~people representing lots of people, most important last""" def decode_value(tag, value): """Returns a unicode representation of the passed value, based on the type and the tag it originated from. Not reversible. """ if tag in FILESYSTEM_TAGS: return fsn2text(value) elif tag[:2] == "~#": if isinstance(value, float): return u"%.2f" % value else: return text_type(value) return text_type(value) class AudioFile(dict, ImageContainer): """An audio file. It looks like a dict, but implements synthetic and tied tags via __call__ rather than __getitem__. This means __getitem__, get, and so on can be used for efficiency. If you need to sort many AudioFiles, you can use their sort_key attribute as a decoration. Keys are either ASCII str or unicode. Values are always unicode except if the tag is part of FILESYSTEM_TAGS, then the value is of the path type (str on UNIX, unicode on Windows) Some methods will make sure the returned values are always unicode, see their description. """ fill_metadata = False """New tags received from the backend will update the song""" fill_length = False """New song duration from the backend will update the song""" multisong = False """Is a container for multiple songs i.e. while played new songs can start / end""" streamsong = False """Is part of a multisong""" can_add = True """Can be added to the queue, playlists""" is_file = True """Is a real (local) file""" format = "Unknown Audio File" """The underlying file format""" mimes = [] """MIME types this class can represent""" def __init__(self, default=tuple(), **kwargs): for key, value in dict(default).items(): self[key] = value for key, value in kwargs.items(): self[key] = value def __song_key(self): return (self("~#disc", 1), self("~#track", 1), human(self("artistsort")), self.get("musicbrainz_artistid", ""), human(self.get("title", "")), self.get("~filename")) @util.cached_property def album_key(self): return (human(self("albumsort", "")), human(self("albumartistsort", "")), self.get("album_grouping_key") or self.get("labelid") or self.get("musicbrainz_albumid") or "") @util.cached_property def sort_key(self): return [self.album_key, self.__song_key()] @staticmethod def sort_by_func(tag): """Returns a fast sort function for a specific tag (or pattern). Some keys are already in the sort cache, so we can use them.""" def artist_sort(song): return song.sort_key[1][2] if callable(tag): return lambda song: human(tag(song)) elif tag == "artistsort": return artist_sort elif tag in FILESYSTEM_TAGS: return lambda song: fsn2text(song(tag)) elif tag.startswith("~#") and "~" not in tag[2:]: return lambda song: song(tag) return lambda song: human(song(tag)) def __getstate__(self): """Don't pickle anything from __dict__""" pass def __setstate__(self, state): """Needed because we have defined getstate""" pass def __setitem__(self, key, value): # validate key if PY3: if not isinstance(key, text_type): raise TypeError("key has to be str") else: if isinstance(key, text_type): # we try to save keys as encoded ASCII to save memory # under PY2. Everything else besides ASCII combined with # unicode breaks hashing even if the default encoding # it utf-8. try: key = key.encode("ascii") except UnicodeEncodeError: pass elif isinstance(key, bytes): # make sure we set ascii keys only key.decode("ascii") else: raise TypeError("key needs to be unicode or ASCII str") # validate value if key.startswith("~#"): if not isinstance(value, number_types): raise TypeError elif key in FILESYSTEM_TAGS: if not isinstance(value, fsnative): value = path2fsn(value) else: value = text_type(value) dict.__setitem__(self, key, value) pop = self.__dict__.pop pop("album_key", None) pop("sort_key", None) def __delitem__(self, key): dict.__delitem__(self, key) pop = self.__dict__.pop pop("album_key", None) pop("sort_key", None) @property def key(self): return self["~filename"] @property def mountpoint(self): return self["~mountpoint"] def __hash__(self): # Dicts aren't hashable by default, so we need a hash # function. Previously this used ~filename. That created a # situation when an object could end up in two buckets by # renaming files. So now it uses identity. return hash(id(self)) def __eq__(self, other): # And to preserve Python hash rules, we need a strict __eq__. return self is other def __lt__(self, other): return self.sort_key < other.sort_key def __ne__(self, other): return self is not other def reload(self): """Reload an audio file from disk. If reloading fails nothing will change. Raises: AudioFileError: if the file fails to load """ backup = dict(self) fn = self["~filename"] saved = {} for key in self: if key in MIGRATE: saved[key] = self[key] self.clear() self["~filename"] = fn try: self.__init__(fn) except AudioFileError: self.update(backup) raise else: self.update(saved) def realkeys(self): """Returns a list of keys that are not internal, i.e. they don't have '~' in them.""" return listfilter(lambda s: s[:1] != "~", self.keys()) def prefixkeys(self, prefix): """Returns a list of dict keys that either match prefix or start with prefix + ':'. """ l = [] for k in self: if k.startswith(prefix): if k == prefix or k.startswith(prefix + ":"): l.append(k) return l def _prefixvalue(self, tag): return "\n".join(self.list_unique(sorted(self.prefixkeys(tag)))) def iterrealitems(self): return ((k, v) for (k, v) in iteritems(self) if k[:1] != "~") def __call__(self, key, default=u"", connector=" - ", joiner=', '): """Return the value(s) for a key, synthesizing if necessary. Multiple values for a key are delimited by newlines. A default value may be given (like `dict.get`); the default default is an empty unicode string (even if the tag is numeric). If a tied tag ('a~b') is requested, the `connector` keyword argument may be used to specify what it is tied with. In case the tied tag contains numeric and file path tags, the result will still be a unicode string. The `joiner` keyword specifies how multiple *values* will be joined within that tied tag output, e.g. ~people~title = "Kanye West, Jay Z - New Day" For details on tied tags, see the documentation for `util.tagsplit`. """ if key[:1] == "~": key = key[1:] if "~" in key: real_key = "~" + key values = [] sub_tags = util.tagsplit(real_key) # If it's genuinely a tied tag (not ~~people etc), we want # to delimit the multi-values separately from the tying j = joiner if len(sub_tags) > 1 else "\n" for t in sub_tags: vs = [decode_value(real_key, v) for v in (self.list(t))] v = j.join(vs) if v: values.append(v) return connector.join(values) or default elif key == "#track": try: return int(self["tracknumber"].split("/")[0]) except (ValueError, TypeError, KeyError): return default elif key == "#disc": try: return int(self["discnumber"].split("/")[0]) except (ValueError, TypeError, KeyError): return default elif key == "length": length = self.get("~#length") if length is None: return default else: return util.format_time_display(length) elif key == "#rating": return dict.get(self, "~" + key, config.RATINGS.default) elif key == "rating": return util.format_rating(self("~#rating")) elif key == "people": return "\n".join(self.list_unique(PEOPLE)) or default elif key == "people:real": # Issue 1034: Allow removal of V.A. if others exist. unique = self.list_unique(PEOPLE) # Order is important, for (unlikely case): multiple removals for val in VARIOUS_ARTISTS_VALUES: if len(unique) > 1 and val in unique: unique.remove(val) return "\n".join(unique) or default elif key == "people:roles": return (self._role_call("performer", PEOPLE) or default) elif key == "peoplesort": return ("\n".join(self.list_unique(PEOPLE_SORT)) or self("~people", default, connector)) elif key == "peoplesort:roles": # Ignores non-sort tags if there are any sort tags (e.g. just # returns "B" for {artist=A, performersort=B}). # TODO: figure out the "correct" behavior for mixed sort tags return (self._role_call("performersort", PEOPLE_SORT) or self("~peoplesort", default, connector)) elif key in ("performers", "performer"): return self._prefixvalue("performer") or default elif key in ("performerssort", "performersort"): return (self._prefixvalue("performersort") or self("~" + key[-4:], default, connector)) elif key in ("performers:roles", "performer:roles"): return (self._role_call("performer") or default) elif key in ("performerssort:roles", "performersort:roles"): return (self._role_call("performersort") or self("~" + key.replace("sort", ""), default, connector)) elif key == "basename": return os.path.basename(self["~filename"]) or self["~filename"] elif key == "dirname": return os.path.dirname(self["~filename"]) or self["~filename"] elif key == "uri": try: return self["~uri"] except KeyError: return fsn2uri(self["~filename"]) elif key == "format": return self.get("~format", text_type(self.format)) elif key == "codec": codec = self.get("~codec") if codec is None: return self("~format") return codec elif key == "encoding": parts = filter(None, [self.get("~encoding"), self.get("encodedby")]) encoding = u"\n".join(parts) return encoding or default elif key == "language": codes = self.list("language") if not codes: return default return u"\n".join(iso639.translate(c) or c for c in codes) elif key == "bitrate": return util.format_bitrate(self("~#bitrate")) elif key == "#date": date = self.get("date") if date is None: return default return util.date_key(date) elif key == "year": return self.get("date", default)[:4] elif key == "#year": try: return int(self.get("date", default)[:4]) except (ValueError, TypeError, KeyError): return default elif key == "originalyear": return self.get("originaldate", default)[:4] elif key == "#originalyear": try: return int(self.get("originaldate", default)[:4]) except (ValueError, TypeError, KeyError): return default elif key == "#tracks": try: return int(self["tracknumber"].split("/")[1]) except (ValueError, IndexError, TypeError, KeyError): return default elif key == "#discs": try: return int(self["discnumber"].split("/")[1]) except (ValueError, IndexError, TypeError, KeyError): return default elif key == "lyrics": # First, try the embedded lyrics. try: return self[key] except KeyError: pass # If there are no embedded lyrics, try to read them from # the external file. try: fileobj = open(self.lyric_filename, "rU") except EnvironmentError: return default else: return fileobj.read().decode("utf-8", "replace") elif key == "filesize": return util.format_size(self("~#filesize", 0)) elif key == "playlists": # See Issue 876 # Avoid circular references from formats/__init__.py from quodlibet.util.collection import Playlist playlists = Playlist.playlists_featuring(self) return "\n".join([s.name for s in playlists]) or default elif key.startswith("#replaygain_"): try: val = self.get(key[1:], default) return round(float(val.split(" ")[0]), 2) except (ValueError, TypeError, AttributeError): return default elif key[:1] == "#": key = "~" + key if key in self: return self[key] elif key in NUMERIC_ZERO_DEFAULT: return 0 else: try: val = self[key[2:]] except KeyError: return default try: return int(val) except ValueError: try: return float(val) except ValueError: return default else: return dict.get(self, "~" + key, default) elif key == "title": title = dict.get(self, "title") if title is None: basename = self("~basename") return "%s [%s]" % ( decode_value("~basename", basename), _("Unknown")) else: return title elif key in SORT_TO_TAG: try: return self[key] except KeyError: key = SORT_TO_TAG[key] return dict.get(self, key, default) def _role_call(self, role_tag, sub_keys=None): role_tag_keys = self.prefixkeys(role_tag) role_map = {} for key in role_tag_keys: if key != role_tag: role = key.rsplit(":", 1)[-1] for name in self.list(key): role_map.setdefault(name, []).append(role) if sub_keys is None: names = self.list_unique(role_tag_keys) else: names = self.list_unique(sub_keys) for tag in sub_keys: if tag in TAG_ROLES: for name in self.list(tag): role_map.setdefault(name, []).append(TAG_ROLES[tag]) descs = [] for name in names: roles = role_map.get(name, []) if not roles: descs.append(name) else: roles = sorted(map(capitalize, roles)) descs.append("%s (%s)" % (name, ", ".join(roles))) return "\n".join(descs) @property def lyric_filename(self): """Returns the (potential) lyrics filename for this file""" filename = self.comma("title").replace(u'/', u'')[:128] + u'.lyric' sub_dir = ((self.comma("lyricist") or self.comma("artist")) .replace(u'/', u'')[:128]) if os.name == "nt": # this was added at a later point. only use escape_filename here # to keep the linux case the same as before filename = escape_filename(filename) sub_dir = escape_filename(sub_dir) else: filename = fsnative(filename) sub_dir = fsnative(sub_dir) path = os.path.join( expanduser(fsnative(u"~/.lyrics")), sub_dir, filename) return path @property def has_rating(self): """True if the song has a rating set. In case this is False song('~#rating') would return the default value """ return self.get("~#rating") is not None def remove_rating(self): """Removes the set rating so the default will be returned""" self.pop("~#rating", None) def comma(self, key): """Get all values of a tag, separated by commas. Synthetic tags are supported, but will be slower. All list items will be unicode. If the value is numeric, that is returned rather than a list. """ if "~" in key or key == "title": if key in FILESYSTEM_TAGS: v = fsn2text(self(key, fsnative())) else: v = self(key, u"") else: v = self.get(key, u"") if isinstance(v, number_types): return v else: return v.replace("\n", ", ") def list(self, key): """Get all values of a tag, as a list. Synthetic tags are supported, but will be slower. Numeric tags will give their one value. For file path keys the returned list might contain path items (non-unicode). An empty synthetic tag cannot be distinguished from a non-existent synthetic tag; both result in []. """ if "~" in key or key == "title": v = self(key) if v == "": return [] else: return v.split("\n") if isinstance(v, text_type) else [v] else: v = self.get(key) return [] if v is None else v.split("\n") def list_sort(self, key): """Like list but return display,sort pairs when appropriate and work on all tags. In case no sort value exists the display one is returned. The sort value is only an empty string if the display one is empty as well. """ display = decode_value(key, self(key)) display = display.split("\n") if display else [] sort = [] if key in TAG_TO_SORT: sort = decode_value(TAG_TO_SORT[key], self(TAG_TO_SORT[key])) # it would be better to use something that doesn't fall back # to the key itself, but what? sort = sort.split("\n") if sort else [] result = [] for d, s in izip_longest(display, sort): if d is not None: result.append((d, (s if s is not None and s != "" else d))) return result def list_separate(self, key): """For tied tags return the list union of the display,sort values otherwise just do list_sort """ if key[:1] == "~" and "~" in key[1:]: # tied tag vals = [self.list_sort(tag) for tag in util.tagsplit(key)] r = [j for i in vals for j in i] return r else: return self.list_sort(key) def list_unique(self, keys): """Returns a combined value of all values in keys; duplicate values will be ignored. Returns the same as list(). """ l = [] seen = set() for k in keys: for v in self.list(k): if v not in seen: l.append(v) seen.add(v) return l def as_lowercased(self): """Returns a new AudioFile with all keys lowercased / values merged. Useful for tag writing for case insensitive tagging formats like APEv2 or VorbisComment. """ merged = AudioFile() text = {} for key, value in iteritems(self): lower = key.lower() if key.startswith("~#"): merged[lower] = value else: text.setdefault(lower, []).extend(value.split("\n")) for key, values in text.items(): merged[key] = "\n".join(values) return merged def exists(self): """Return true if the file still exists (or we can't tell).""" return os.path.exists(self["~filename"]) def valid(self): """Return true if the file cache is up-to-date (checked via mtime), or we can't tell.""" return (bool(self.get("~#mtime", 0)) and self["~#mtime"] == mtime(self["~filename"])) def mounted(self): """Return true if the disk the file is on is mounted, or the file is not on a disk.""" return ismount(self.get("~mountpoint", "/")) def can_multiple_values(self, key=None): """If no arguments are given, return a list of tags that can have multiple values, or True if 'any' tags can. """ return True def can_change(self, k=None): """See if this file supports changing the given tag. This may be a limitation of the file type or QL's design. The writing code should handle all kinds of keys, so this is just a suggestion. If no arguments are given, return a list of tags that can be changed, or True if 'any' tags can be changed (specific tags should be checked before adding).""" if k is None: return True if not isascii(k): return False if not k or "=" in k or "~" in k: return False return True def is_writable(self): return os.access(self["~filename"], os.W_OK) def rename(self, newname): """Rename a file. Errors are not handled. This shouldn't be used directly; use library.rename instead.""" if os.path.isabs(newname): mkdir(os.path.dirname(newname)) else: newname = os.path.join(self('~dirname'), newname) if not os.path.exists(newname): shutil.move(self['~filename'], newname) elif normalize_path(newname, canonicalise=True) != self['~filename']: raise ValueError self.sanitize(newname) def sanitize(self, filename=None): """Fill in metadata defaults. Find ~mountpoint, ~#mtime, ~#filesize and ~#added. Check for null bytes in tags. Does not raise. """ # Replace nulls with newlines, trimming zero-length segments for key, val in listitems(self): self[key] = val if isinstance(val, string_types) and '\0' in val: self[key] = '\n'.join(filter(lambda s: s, val.split('\0'))) # Remove unnecessary defaults if key in NUMERIC_ZERO_DEFAULT and val == 0: del self[key] if filename: self["~filename"] = filename elif "~filename" not in self: raise ValueError("Unknown filename!") assert isinstance(self["~filename"], fsnative) if self.is_file: self["~filename"] = normalize_path( self["~filename"], canonicalise=True) # Find mount point (terminating at "/" if necessary) head = self["~filename"] while "~mountpoint" not in self: head, tail = os.path.split(head) # Prevent infinite loop without a fully-qualified filename # (the unit tests use these). head = head or fsnative(u"/") if ismount(head): self["~mountpoint"] = head else: self["~mountpoint"] = fsnative(u"/") # Fill in necessary values. self.setdefault("~#added", int(time.time())) # For efficiency, do a single stat here. See Issue 504 try: stat = os.stat(self['~filename']) self["~#mtime"] = stat.st_mtime self["~#filesize"] = stat.st_size # Issue 342. This is a horrible approximation (due to headers) but # on FLACs, the most common case, this should be close enough if "~#bitrate" not in self: try: # kbps = bytes * 8 / seconds / 1000 self["~#bitrate"] = int(stat.st_size / (self["~#length"] * (1000 / 8))) except (KeyError, ZeroDivisionError): pass except OSError: self["~#mtime"] = 0 def to_dump(self): """A string of 'key=value' lines, similar to vorbiscomment output. Returns: bytes """ def encode_key(k): return encode(k) if isinstance(k, text_type) else k s = [] for k in self.keys(): enc_key = encode_key(k) assert isinstance(enc_key, bytes) if isinstance(self[k], integer_types): l = enc_key + encode("=%d" % self[k]) s.append(l) elif isinstance(self[k], float): l = enc_key + encode("=%f" % self[k]) s.append(l) else: for v2 in self.list(k): if not isinstance(v2, bytes): v2 = encode(v2) s.append(enc_key + b"=" + v2) for k in (NUMERIC_ZERO_DEFAULT - set(self.keys())): enc_key = encode_key(k) l = enc_key + encode("=%d" % self.get(k, 0)) s.append(l) if "~#rating" not in self: s.append(encode("~#rating=%f" % self("~#rating"))) s.append(encode("~format=%s" % self.format)) s.append(b"") return b"\n".join(s) def from_dump(self, text): """Parses the text created with to_dump and adds the found tags. Args: text (bytes) """ def decode_key(key): """str if ascii, otherwise decode using utf-8""" if PY3: return decode(key) try: key.decode("ascii") except ValueError: return decode(key) return key for line in text.split(b"\n"): if not line: continue parts = line.split(b"=") key = decode_key(parts[0]) val = b"=".join(parts[1:]) if key == "~format": pass elif key in FILESYSTEM_TAGS: self.add(key, bytes2fsn(val, "utf-8")) elif key.startswith("~#"): try: self.add(key, int(val)) except ValueError: try: self.add(key, float(val)) except ValueError: pass else: self.add(key, decode(val)) def change(self, key, old_value, new_value): """Change 'old_value' to 'new_value' for the given metadata key. If the old value is not found, set the key to the new value.""" try: parts = self.list(key) try: parts[parts.index(old_value)] = new_value except ValueError: self[key] = new_value else: self[key] = "\n".join(parts) except KeyError: self[key] = new_value def add(self, key, value): """Add a value for the given metadata key.""" if key not in self: self[key] = value else: self[key] += "\n" + value def remove(self, key, value=None): """Remove a value from the given key. If value is None remove all values for that key, if it exists. If the key or value is not found do nothing. """ if key not in self: return elif value is None or self[key] == value: del self[key] else: try: parts = self.list(key) parts.remove(value) self[key] = u"\n".join(parts) except ValueError: pass def replay_gain(self, profiles, pre_amp_gain=0, fallback_gain=0): """Return the computed Replay Gain scale factor. profiles is a list of Replay Gain profile names ('album', 'track') to try before giving up. The special profile name 'none' will cause no scaling to occur. pre_amp_gain will be applied before checking for clipping. fallback_gain will be used when the song does not have replaygain information. """ for profile in profiles: if profile is "none": return 1.0 try: db = float(self["replaygain_%s_gain" % profile].split()[0]) peak = float(self.get("replaygain_%s_peak" % profile, 1)) except (KeyError, ValueError, IndexError): continue else: db += pre_amp_gain scale = 10. ** (db / 20) if scale * peak > 1: scale = 1.0 / peak # don't clip return min(15, scale) else: scale = 10. ** ((fallback_gain + pre_amp_gain) / 20) if scale > 1: scale = 1.0 # don't clip return min(15, scale) def write(self): """Write metadata back to the file. Raises: AudioFileError: in case writing fails """ raise NotImplementedError @property def bookmarks(self): """Parse and return song position bookmarks, or set them. Accessing this returns a copy, so song.bookmarks.append(...) will not work; you need to do marks = song.bookmarks marks.append(...) song.bookmarks = marks """ marks = [] invalid = [] for line in self.list("~bookmark"): try: time, mark = line.split(" ", 1) except: invalid.append((-1, line)) else: try: time = util.parse_time(time, None) except: invalid.append((-1, line)) else: if time >= 0: marks.append((time, mark)) else: invalid.append((-1, line)) marks.sort() marks.extend(invalid) return marks @bookmarks.setter def bookmarks(self, marks): result = [] for time_, mark in marks: if time_ < 0: raise ValueError("mark times must be positive") result.append(u"%s %s" % (util.format_time(time_), mark)) result = u"\n".join(result) if result: self["~bookmark"] = result elif "~bookmark" in self: del(self["~bookmark"]) # Looks like the real thing. DUMMY_SONG = AudioFile({ '~#length': 234, '~filename': devnull, 'artist': 'The Artist', 'album': 'An Example Album', 'title': 'First Track', 'tracknumber': 1, 'date': '2010-12-31', }) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/aiff.py�����������������������������������������������������������0000644�0001750�0001750�00000001221�13112005742�020653� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from mutagen.aiff import AIFF from ._id3 import ID3File extensions = [".aif", ".aiff", ".aifc"] class AIFFFile(ID3File): format = "AIFF" mimes = ["audio/x-aiff", "audio/aiff"] Kind = AIFF def _parse_info(self, info): self["~#length"] = info.length self["~#bitrate"] = int(info.bitrate / 1000) self["~#channels"] = info.channels loader = AIFFFile types = [AIFFFile] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/wav.py������������������������������������������������������������0000644�0001750�0001750�00000002221�13112005742�020544� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import wave from senf import fsn2text from ._audio import AudioFile, translate_errors extensions = [".wav"] class WAVEFile(AudioFile): format = "WAVE" mimes = ["audio/wav", "audio/x-wav", "audio/wave"] def __init__(self, filename): with translate_errors(): with open(filename, "rb") as h: f = wave.open(h) self["~#length"] = float(f.getnframes()) / f.getframerate() self["~#channels"] = f.getnchannels() self.sanitize(filename) def sanitize(self, filename): super(WAVEFile, self).sanitize(filename) self["title"] = fsn2text(os.path.splitext( os.path.basename(self["~filename"]))[0]) def write(self): pass def can_change(self, k=None): if k is None: return ["artist"] else: return k == "artist" loader = WAVEFile types = [WAVEFile] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/mpc.py������������������������������������������������������������0000644�0001750�0001750�00000003326�13112005742�020535� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from mutagen.musepack import Musepack from quodlibet.compat import text_type from ._audio import translate_errors from ._apev2 import APEv2File class MPCFile(APEv2File): format = "Musepack" mimes = ["audio/x-musepack", "audio/x-mpc"] def __init__(self, filename): with translate_errors(): audio = Musepack(filename) super(MPCFile, self).__init__(filename, audio) self["~#length"] = audio.info.length self["~#bitrate"] = int(audio.info.bitrate / 1000) self["~#channels"] = audio.info.channels version = audio.info.version self["~codec"] = u"%s SV%d" % (self.format, version) try: if audio.info.title_gain: track_g = u"%+0.2f dB" % audio.info.title_gain self.setdefault("replaygain_track_gain", track_g) if audio.info.album_gain: album_g = u"%+0.2f dB" % audio.info.album_gain self.setdefault("replaygain_album_gain", album_g) if audio.info.title_peak: track_p = text_type(audio.info.title_peak * 2) self.setdefault("replaygain_track_peak", track_p) if audio.info.album_peak: album_p = text_type(audio.info.album_peak * 2) self.setdefault("replaygain_album_peak", album_p) except AttributeError: pass self.sanitize(filename) loader = MPCFile types = [MPCFile] extensions = [".mpc", ".mp+"] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/mp3.py������������������������������������������������������������0000644�0001750�0001750�00000002200�13112005742�020443� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2006 Joe Wreschnig, Michael Urman, Niklas Janlert # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from mutagen.mp3 import MP3 from ._id3 import ID3File extensions = [".mp3", ".mp2", ".mp1", ".mpg", ".mpeg"] class MP3File(ID3File): format = "MPEG-1/2" mimes = ["audio/mp3", "audio/x-mp3", "audio/mpeg", "audio/mpg", "audio/x-mpeg"] Kind = MP3 def _parse_info(self, info): self["~#length"] = info.length self["~#bitrate"] = int(info.bitrate / 1000) self["~format"] = u"MP%d" % info.layer self["~#channels"] = info.channels encoder, brm = info.encoder_info, info.bitrate_mode brm = {1: u"CBR", 2: u"VBR", 3: u"ABR"}.get(brm, u"") # encoder_settings is 1.37+ settings = getattr(info, "encoder_settings", u"") encoding = u"\n".join(filter(None, [encoder, brm, settings])) if encoding: self["~encoding"] = encoding loader = MP3File types = [MP3File] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/remote.py���������������������������������������������������������0000644�0001750�0001750�00000002534�13112005742�021251� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from senf import fsnative, path2fsn from quodlibet.compat import text_type from ._audio import AudioFile extensions = [] class RemoteFile(AudioFile): is_file = False fill_metadata = True format = "Remote File" def __init__(self, uri): self["~uri"] = text_type(uri) self.sanitize(fsnative(self["~uri"])) def __getitem__(self, key): # we used to save them with the wrong type value = super(RemoteFile, self).__getitem__(key) if key in ("~filename", "~mountpoint") and \ not isinstance(value, fsnative): value = path2fsn(value) return value def rename(self, newname): pass def reload(self): pass def exists(self): return True def valid(self): return True def mounted(self): return True def write(self): pass def can_change(self, k=None): if k is None: return [] else: return False @property def key(self): return self["~uri"] loader = RemoteFile types = [RemoteFile] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/_misc.py����������������������������������������������������������0000644�0001750�0001750�00000006564�13112005742�021057� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import contextlib import mutagen from quodlibet import util from quodlibet.util import print_w, print_d, reraise from quodlibet.util.importhelper import load_dir_modules from quodlibet.const import MinVersions mimes = set() """A set of supported mime types""" loaders = {} """A dict mapping file extensions to loaders (func returning an AudioFile)""" types = set() """A set of AudioFile subclasses/implementations""" class AudioFileError(Exception): """Base error for AudioFile, mostly IO/parsing related operations""" class MutagenBug(AudioFileError): """Raised in is caused by a mutagen bug, so we can highlight it""" @contextlib.contextmanager def translate_errors(): """Context manager for mutagen calls to load/save. Translates exceptions to local ones. """ try: yield except AudioFileError: raise except (mutagen.MutagenError, IOError) as e: # old mutagen raised IOError reraise(AudioFileError, e) except Exception as e: reraise(MutagenBug, e) def init(): """Load/Import all formats. Before this is called loading a file and unpickling will not work. """ global mimes, loaders, types MinVersions.MUTAGEN.check(mutagen.version) base = util.get_module_dir() load_pyc = util.is_windows() or util.is_osx() formats = load_dir_modules(base, package=__package__, load_compiled=load_pyc) module_names = [] for format in formats: name = format.__name__ for ext in format.extensions: loaders[ext] = format.loader types.update(format.types) if format.extensions: for type_ in format.types: mimes.update(type_.mimes) module_names.append(name.split(".")[-1]) # Migrate pre-0.16 library, which was using an undocumented "feature". sys.modules[name.replace(".", "/")] = format # Migrate old layout if name.startswith("quodlibet."): sys.modules[name.split(".", 1)[1]] = format # This can be used for the quodlibet.desktop file desktop_mime_types = "MimeType=" + \ ";".join(sorted({m.split(";")[0] for m in mimes})) + ";" print_d(desktop_mime_types) s = ", ".join(sorted(module_names)) print_d("Supported formats: %s" % s) if not loaders: raise SystemExit("No formats found!") def get_loader(filename): """Returns a callable which takes a filename and returns AudioFile or raises AudioFileError, or returns None. """ ext = os.path.splitext(filename)[-1] return loaders.get(ext.lower()) def MusicFile(filename): """Returns a AudioFile instance or None""" loader = get_loader(filename) if loader is not None: try: return loader(filename) except AudioFileError: print_w("Error loading %r" % filename) util.print_exc() except: print_w("Error loading %r" % filename) raise def filter(filename): """Returns True if the file extension is supported""" return get_loader(filename) is not None ��������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/wavpack.py��������������������������������������������������������0000644�0001750�0001750�00000001450�13112005742�021406� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from mutagen.wavpack import WavPack from ._audio import translate_errors from ._apev2 import APEv2File class WavpackFile(APEv2File): format = "WavPack" mimes = ["audio/x-wavpack"] def __init__(self, filename): with translate_errors(): audio = WavPack(filename) super(WavpackFile, self).__init__(filename, audio) self["~#length"] = audio.info.length self["~#channels"] = audio.info.channels self.sanitize(filename) loader = WavpackFile types = [WavpackFile] extensions = [".wv"] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/midi.py�����������������������������������������������������������0000644�0001750�0001750�00000002020�13112005742�020666� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from mutagen.smf import SMF from ._audio import AudioFile, translate_errors class MidiError(Exception): pass class MidiFile(AudioFile): format = "MIDI" mimes = ["audio/midi", "audio/x-midi"] def __init__(self, filename): with translate_errors(): audio = SMF(filename) self["~#length"] = audio.info.length self.sanitize(filename) def write(self): pass def reload(self, *args): title = self.get("title") super(MidiFile, self).reload(*args) if title is not None: self.setdefault("title", title) def can_change(self, k=None): if k is None: return ["title"] else: return k == "title" loader = MidiFile types = [MidiFile] extensions = [".mid"] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/aac.py������������������������������������������������������������0000644�0001750�0001750�00000002253�13112005742�020500� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from mutagen.aac import AAC from ._audio import AudioFile, translate_errors extensions = [".aac", ".adif", ".adts"] class AACFile(AudioFile): """ADTS/ADIF files""" format = "AAC" mimes = ["audio/x-aac"] fill_length = True def __init__(self, filename): with translate_errors(): audio = AAC(filename) self["~#length"] = audio.info.length self["~#bitrate"] = int(audio.info.bitrate / 1000) if audio.info.channels: self["~#channels"] = audio.info.channels self.sanitize(filename) def write(self): pass def reload(self, *args): title = self.get("title") super(AACFile, self).reload(*args) if title is not None: self.setdefault("title", title) def can_change(self, k=None): if k is None: return ["title"] else: return k == "title" loader = AACFile types = [AACFile] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/vgm.py������������������������������������������������������������0000644�0001750�0001750�00000003272�13112005742�020547� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """http://www.smspower.org/uploads/Music/vgmspec161.txt""" import struct from ._audio import AudioFile, translate_errors class VgmFile(AudioFile): format = "VGM" mimes = [] def __init__(self, filename): with translate_errors(): with open(filename, "rb") as h: header = h.read(64) if len(header) != 64 or header[:4] != b"Vgm ": raise Exception("Not a VGM file") samples_to_sec = lambda s: s / 44100. samples = struct.unpack('<i', header[24:28])[0] loop_offset = struct.unpack('<i', header[28:32])[0] loop_samples = struct.unpack('<i', header[32:36])[0] # this should match libgme length = samples_to_sec(samples) if length <= 0: length = 150 elif loop_offset: # intro + 2 loops length += samples_to_sec(loop_samples) self["~#length"] = length self.sanitize(filename) def write(self): pass def reload(self, *args): title = self.get("title") super(VgmFile, self).reload(*args) if title is not None: self.setdefault("title", title) def can_change(self, k=None): if k is None: return ["title"] else: return k == "title" loader = VgmFile types = [VgmFile] extensions = [".vgm"] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/formats/spc.py������������������������������������������������������������0000644�0001750�0001750�00000004363�13112005742�020545� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from senf import path2fsn, fsn2text from quodlibet.compat import getbyte, listkeys from ._audio import AudioFile, translate_errors extensions = [".spc"] class SPCFile(AudioFile): format = "SPC700" def __init__(self, filename): with translate_errors(): with open(filename, "rb") as h: head = h.read(46) if len(head) != 46 or \ head[:27] != b'SNES-SPC700 Sound File Data': raise IOError("Not a valid SNES-SPC700 file") if getbyte(head, 35) == b'\x1a': data = h.read(210) if len(data) == 210: self.update(parse_id666(data)) self.setdefault( "title", fsn2text(path2fsn(os.path.basename(filename)[:-4]))) self.sanitize(filename) def write(self): pass def can_change(self, k=None): TAGS = ["artist", "album", "title", "comments"] if k is None: return TAGS else: return k in TAGS def parse_id666(data): #http://snesmusic.org/files/spc_file_format.txt tags = {} tags["title"] = data[:32] tags["album"] = data[32:64] tags["dumper"] = data[64:80] tags["comments"] = data[80:112] # Artist differs based on binary or text mode, which is implicit. # Instead of detecting "perfectly", we'll just detect enough for # the "artist" field. This fails for artist names that begin with # numbers or symbols less than ascii value A. if getbyte(data, 130) < b'A': try: tags["~#length"] = int(data[123:126].strip(b"\x00")) except ValueError: pass tags["artist"] = data[131:163] else: tags["artist"] = data[130:162] for k in listkeys(tags): if k[:2] == "~#": continue tags[k] = tags[k].replace(b"\x00", b"").decode("ascii", "ignore") if not tags[k]: del tags[k] return tags loader = SPCFile types = [SPCFile] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/���������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�016700� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/i18n.py��������������������������������������������������������������0000644�0001750�0001750�00000027045�13113502537�020050� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import gettext import locale from senf import environ, path2fsn, fsn2text, text2fsn from quodlibet.util.path import unexpand from quodlibet.util.dprint import print_d from quodlibet.compat import text_type, PY2, listfilter from .misc import get_locale_encoding def locale_format(format, val, *args, **kwargs): """Like locale.format but returns text""" result = locale.format(format, val, *args, **kwargs) if isinstance(result, bytes): result = result.decode(get_locale_encoding(), "replace") return result def bcp47_to_language(code): """Takes a BCP 47 language identifier and returns a value suitable for the LANGUAGE env var. Only supports a small set of inputs and might return garbage.. """ if code == "zh-Hans": return "zh_CN" elif code == "zh-Hant": return "zh_TW" parts = code.split("-") is_iso = lambda s: len(s) == 2 and s.isalpha() # we only support ISO 639-1 if not is_iso(parts[0]): return parts[0].replace(":", "") lang_subtag = parts[0] region = "" if len(parts) >= 2 and is_iso(parts[1]): region = parts[1] elif len(parts) >= 3 and is_iso(parts[2]): region = parts[2] if region: return "%s_%s" % (lang_subtag, region) return lang_subtag def osx_locale_id_to_lang(id_): """Converts a NSLocale identifier to something suitable for LANG""" if not "_" in id_: return id_ # id_ can be "zh-Hans_TW" parts = id_.rsplit("_", 1) ll = parts[0] ll = bcp47_to_language(ll).split("_")[0] return "%s_%s" % (ll, parts[1]) def set_i18n_envvars(): """Set the LANG/LANGUAGE environment variables if not set in case the current platform doesn't use them by default (OS X, Window) """ if os.name == "nt": from quodlibet.util.winapi import GetUserDefaultUILanguage, \ GetSystemDefaultUILanguage langs = listfilter(None, map(locale.windows_locale.get, [GetUserDefaultUILanguage(), GetSystemDefaultUILanguage()])) if langs: environ.setdefault('LANG', langs[0]) environ.setdefault('LANGUAGE', ":".join(langs)) elif sys.platform == "darwin": from AppKit import NSLocale locale_id = NSLocale.currentLocale().localeIdentifier() lang = osx_locale_id_to_lang(locale_id) environ.setdefault('LANG', lang) preferred_langs = NSLocale.preferredLanguages() if preferred_langs: languages = map(bcp47_to_language, preferred_langs) environ.setdefault('LANGUAGE', ":".join(languages)) else: return def fixup_i18n_envvars(): """Sanitizes env vars before gettext can use them. LANGUAGE should support a priority list of languages with fallbacks, but doesn't work due to "en" no being known to gettext (This could be solved by providing a en.po in QL but all other libraries don't define it either) This tries to fix that. """ try: langs = environ["LANGUAGE"].split(":") except KeyError: return # So, this seems to be an undocumented feature where C selects # "no translation". Append it to any en/en_XX so that when not found # it falls back to "en"/no translation. sanitized = [] for lang in langs: sanitized.append(lang) if lang.startswith("en") and len(langs) > 1: sanitized.append("C") environ["LANGUAGE"] = ":".join(sanitized) class GlibTranslations(gettext.GNUTranslations): """Provide a glib-like translation API for Python. This class adds support for pgettext (and upgettext) mirroring glib's C_ macro, which allows for disambiguation of identical source strings. It also installs N_, C_, and ngettext into the __builtin__ namespace. It can also be instantiated and used with any valid MO files (though it won't be able to translate anything, of course). """ def __init__(self, fp=None): self.path = (fp and fp.name) or "" self._catalog = {} self.plural = lambda n: n != 1 gettext.GNUTranslations.__init__(self, fp) self._debug_text = None def ugettext(self, message): # force unicode here since __contains__ (used in gettext) ignores # our changed defaultencoding for coercion, so utf-8 encoded strings # fail at lookup. message = text_type(message) if PY2: return text_type(gettext.GNUTranslations.ugettext(self, message)) else: return text_type(gettext.GNUTranslations.gettext(self, message)) def ungettext(self, msgid1, msgid2, n): # see ugettext msgid1 = text_type(msgid1) msgid2 = text_type(msgid2) if PY2: return text_type( gettext.GNUTranslations.ungettext(self, msgid1, msgid2, n)) else: return text_type( gettext.GNUTranslations.ngettext(self, msgid1, msgid2, n)) def unpgettext(self, context, msgid, msgidplural, n): context = text_type(context) msgid = text_type(msgid) msgidplural = text_type(msgidplural) real_msgid = u"%s\x04%s" % (context, msgid) real_msgidplural = u"%s\x04%s" % (context, msgidplural) result = self.ngettext(real_msgid, real_msgidplural, n) if result == real_msgid: return msgid elif result == real_msgidplural: return msgidplural return result def upgettext(self, context, msgid): context = text_type(context) msgid = text_type(msgid) real_msgid = u"%s\x04%s" % (context, msgid) result = self.ugettext(real_msgid) if result == real_msgid: return msgid return result def set_debug_text(self, debug_text): self._debug_text = debug_text def wrap_text(self, value): if self._debug_text is None: return value else: return self._debug_text + value + self._debug_text def install(self, *args, **kwargs): raise NotImplementedError("We no longer do builtins") _initialized = False _debug_text = None _translations = { "quodlibet": GlibTranslations(), } def set_debug_text(debug_text=None): """ Args: debug_text (text_type or None): text to add to all translations """ global _debug_text, _translations _debug_text = debug_text for trans in _translations.values(): trans.set_debug_text(debug_text) def register_translation(domain, localedir=None): """Register a translation domain Args: domain (str): the gettext domain localedir (pathlike): A directory used for translations, if it doesn't exist the system one will be used. Returns: GlibTranslations """ global _debug_text, _translations, _initialized assert _initialized if localedir is not None and os.path.isdir(localedir): print_d("Using local localedir: %r" % unexpand(localedir)) gettext.bindtextdomain(domain, localedir) localedir = gettext.bindtextdomain(domain) try: t = gettext.translation(domain, localedir, class_=GlibTranslations) except IOError: print_d("No translation found in %r" % unexpand(localedir)) t = GlibTranslations() else: print_d("Translations loaded: %r" % unexpand(t.path)) t.set_debug_text(_debug_text) _translations[domain] = t return t def init(language=None): """Call this sometime at start before any register_translation() and before any gettext using libraries are loaded. Args: language (text_type or None): Either a language to use or None for the system derived default. """ global _initialized set_i18n_envvars() fixup_i18n_envvars() print_d("LANGUAGE: %r" % environ.get("LANGUAGE")) print_d("LANG: %r" % environ.get("LANG")) try: locale.setlocale(locale.LC_ALL, '') except locale.Error: pass # XXX: these are our most user facing APIs, make sre they are not loaded # before we set the language. For GLib this is too late.. assert "gi.repository.Gtk" not in sys.modules assert "gi.repository.Gst" not in sys.modules if language is not None: environ["LANGUAGE"] = text2fsn(language) print_d("LANGUAGE: %r" % environ.get("LANGUAGE")) _initialized = True def get_available_languages(domain): """Returns a list of available translations for a given gettext domain. Args: domain (str) Returns: List[text_type] """ locale_dir = gettext.bindtextdomain(domain) if locale_dir is None: return [] try: entries = os.listdir(locale_dir) except OSError: return [] langs = [u"C"] for lang in entries: mo_path = os.path.join( locale_dir, lang, "LC_MESSAGES", "%s.mo" % domain) if os.path.exists(mo_path): langs.append(fsn2text(path2fsn(lang))) return langs def _(message): """ Args: message (text_type) Returns: text_type Lookup the translation for message """ t = _translations["quodlibet"] return t.wrap_text(t.ugettext(message)) def N_(message): """ Args: message (text_type) Returns: text_type Only marks a string for translation """ return text_type(message) def C_(context, message): """ Args: context (text_type) message (text_type) Returns: text_type Lookup the translation for message for a context """ t = _translations["quodlibet"] return t.wrap_text(t.upgettext(context, message)) def ngettext(singular, plural, n): """ Args: singular (text_type) plural (text_type) n (int) Returns: text_type Returns the translation for a singular or plural form depending on the value of n. """ t = _translations["quodlibet"] return t.wrap_text(t.ungettext(singular, plural, n)) def numeric_phrase(singular, plural, n, template_var=None): """Returns a final locale-specific phrase with pluralisation if necessary and grouping of the number. This is added to custom gettext keywords to allow us to use as-is. Args: singular (text_type) plural (text_type) n (int) template_var (text_type) Returns: text_type For example, ``numeric_phrase('Add %d song', 'Add %d songs', 12345)`` returns `"Add 12,345 songs"` (in `en_US` locale at least) """ num_text = locale_format('%d', n, grouping=True) if not template_var: template_var = '%d' replacement = '%s' params = num_text else: template_var = '%(' + template_var + ')d' replacement = '%(' + template_var + ')s' params = dict() params[template_var] = num_text return (ngettext(singular.replace(template_var, replacement), plural.replace(template_var, replacement), n) % params) def npgettext(context, singular, plural, n): """ Args: context (text_type) singular (text_type) plural (text_type) n (int) Returns: text_type Like ngettext, but with also depends on the context. """ t = _translations["quodlibet"] return t.wrap_text(t.unpgettext(context, singular, plural, n)) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/config.py������������������������������������������������������������0000644�0001750�0001750�00000036502�13112005742�020527� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2008 Joe Wreschnig # 2009-2013 Nick Boultbee # 2011-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Simple proxy to a Python ConfigParser ConfigParser uses "str" on both Python 2/3, on Python 2 we simply encode text/windows paths using utf-8 and save bytes as is. On Python 3 we save text as is, convert paths to bytes/utf-8 and convert bytes to unicode with utf-8/surrogateescape. The final representation on disk should then in both cases be the same. """ from __future__ import absolute_import import os import csv import collections try: # Python 2 from ConfigParser import RawConfigParser as ConfigParser, Error, \ NoSectionError except ImportError: # Python 3 from configparser import RawConfigParser as ConfigParser, Error, \ NoSectionError from senf import fsnative from quodlibet.compat import cBytesIO, PY2, PY3, text_type, StringIO from quodlibet.util import list_unique, print_d from quodlibet.util.atomic import atomic_save from quodlibet.util.string import join_escape, split_escape from quodlibet.util.path import mkdir # In newer RawConfigParser it is possible to replace the internal dict. The # implementation only uses items() for writing, so replace with a dict that # returns them sorted. This makes it easier to look up entries in the file. class _sorted_dict(collections.OrderedDict): def items(self): return sorted(super(_sorted_dict, self).items()) _DEFAULT = object() class Config(object): """A wrapper around RawConfigParser. Provides a ``defaults`` attribute of the same type which can be used to set default values. """ def __init__(self, version=None, _defaults=True): """Use read() to read in an existing config file. version should be an int starting with 0 that gets incremented if you want to register a new upgrade function. If None, upgrade is disabled. """ self._config = ConfigParser(dict_type=_sorted_dict) self.defaults = None if _defaults: self.defaults = Config(_defaults=False) self._version = version self._loaded_version = None self._upgrade_funcs = [] def _do_upgrade(self, func): assert self._loaded_version is not None assert self._version is not None old_version = self._loaded_version new_version = self._version if old_version != new_version: print_d("Config upgrade: %d->%d (%r)" % ( old_version, new_version, func)) func(self, old_version, new_version) def get_version(self): """Get the version of the loaded config file (for testing only) Raises Error if no file was loaded or versioning is disabled. """ if self._version is None: raise Error("Versioning disabled") if self._loaded_version is None: raise Error("No file loaded") return self._loaded_version def register_upgrade_function(self, function): """Register an upgrade function that gets called at each read() if the current config version and the loaded version don't match. Can also be registered after read was called. function(config, old_version: int, new_version: int) -> None """ if self._version is None: raise Error("Versioning disabled") self._upgrade_funcs.append(function) # after read(), so upgrade now if self._loaded_version is not None: self._do_upgrade(function) return function def reset(self, section, option): """Reset the value to the default state""" assert self.defaults is not None self._config.remove_option(section, option) def options(self, section): """Returns a list of options available in the specified section.""" try: options = self._config.options(section) except NoSectionError: if self.defaults: return self.defaults.options(section) raise else: if self.defaults: try: options.extend(self.defaults.options(section)) options = list_unique(options) except NoSectionError: pass return options def get(self, section, option, default=_DEFAULT): """get(section, option[, default]) -> str If default is not given or set, raises Error in case of an error """ try: return self._config.get(section, option) except Error: if default is _DEFAULT: if self.defaults is not None: try: return self.defaults.get(section, option) except Error: pass raise return default def gettext(self, *args, **kwargs): value = self.get(*args, **kwargs) if PY2: value = value.decode("utf-8") else: # make sure there are no surrogates value.encode("utf-8") return value def getbytes(self, section, option, default=_DEFAULT): try: value = self._config.get(section, option) if PY3: value = value.encode("utf-8", "surrogateescape") return value except (Error, ValueError) as e: if default is _DEFAULT: if self.defaults is not None: try: return self.defaults.getbytes(section, option) except Error: pass raise Error(e) return default def getboolean(self, section, option, default=_DEFAULT): """getboolean(section, option[, default]) -> bool If default is not given or set, raises Error in case of an error """ try: return self._config.getboolean(section, option) except (Error, ValueError) as e: if default is _DEFAULT: if self.defaults is not None: try: return self.defaults.getboolean(section, option) except Error: pass raise Error(e) return default def getint(self, section, option, default=_DEFAULT): """getint(section, option[, default]) -> int If default is not give or set, raises Error in case of an error """ try: return int(self._config.getfloat(section, option)) except (Error, ValueError) as e: if default is _DEFAULT: if self.defaults is not None: try: return self.defaults.getint(section, option) except Error: pass raise Error(e) return default def getfloat(self, section, option, default=_DEFAULT): """getfloat(section, option[, default]) -> float If default is not give or set, raises Error in case of an error """ try: return self._config.getfloat(section, option) except (Error, ValueError) as e: if default is _DEFAULT: if self.defaults is not None: try: return self.defaults.getfloat(section, option) except Error: pass raise Error(e) return default def getstringlist(self, section, option, default=_DEFAULT): """getstringlist(section, option[, default]) -> list If default is not given or set, raises Error in case of an error. Gets a list of strings, using CSV to parse and delimit. """ try: value = self._config.get(section, option) parser = csv.reader( [value], lineterminator='\n', quoting=csv.QUOTE_MINIMAL) try: if PY2: vals = [v.decode('utf-8') for v in next(parser)] else: vals = next(parser) except (csv.Error, ValueError) as e: raise Error(e) return vals except Error as e: if default is _DEFAULT: if self.defaults is not None: try: return self.defaults.getstringlist(section, option) except Error: pass raise Error(e) return default def setstringlist(self, section, option, values): """Saves a list of unicode strings using the csv module""" if PY2: sw = cBytesIO() values = [text_type(v).encode('utf-8') for v in values] else: sw = StringIO() values = [text_type(v) for v in values] writer = csv.writer(sw, lineterminator='\n', quoting=csv.QUOTE_MINIMAL) writer.writerow(values) self.set(section, option, sw.getvalue()) def setlist(self, section, option, values, sep=","): """Saves a list of str using ',' as a separator and \\ for escaping""" values = [str(v) for v in values] joined = join_escape(values, sep) self.set(section, option, joined) def getlist(self, section, option, default=_DEFAULT, sep=","): """Returns a str list saved with setlist()""" try: value = self._config.get(section, option) return split_escape(value, sep) except (Error, ValueError) as e: if default is _DEFAULT: if self.defaults is not None: try: return self.defaults.getlist(section, option, sep=sep) except Error: pass raise Error(e) return default def set(self, section, option, value): """Saves the string representation for the passed value Don't pass unicode, encode first. """ if PY3 and isinstance(value, bytes): raise TypeError("use setbytes") # RawConfigParser only allows string values but doesn't # scream if they are not (and it only fails before the # first config save..) if not isinstance(value, str): value = str(value) try: self._config.set(section, option, value) except NoSectionError: if self.defaults and self.defaults.has_section(section): self._config.add_section(section) self._config.set(section, option, value) else: raise def settext(self, section, option, value): value = text_type(value) if PY2: value = value.encode("utf-8") else: # make sure there are no surrogates value.encode("utf-8") self.set(section, option, value) def setbytes(self, section, option, value): assert isinstance(value, bytes) if PY3: value = value.decode("utf-8", "surrogateescape") self.set(section, option, value) def write(self, filename): """Write config to filename. Can raise EnvironmentError """ assert isinstance(filename, fsnative) mkdir(os.path.dirname(filename)) # temporary set the new version for saving if self._version is not None: self.add_section("__config__") self.set("__config__", "version", self._version) try: with atomic_save(filename, "wb") as fileobj: if PY2: self._config.write(fileobj) else: temp = StringIO() self._config.write(temp) data = temp.getvalue().encode("utf-8", "surrogateescape") fileobj.write(data) finally: if self._loaded_version is not None: self.set("__config__", "version", self._loaded_version) def clear(self): """Remove all sections.""" for section in self._config.sections(): self._config.remove_section(section) def is_empty(self): """Whether the config has any sections""" return not self._config.sections() def read(self, filename): """Reads the config from `filename` if the file exists, otherwise does nothing Can raise EnvironmentError, Error. """ try: with open(filename, "rb") as fileobj: if PY3: fileobj = StringIO( fileobj.read().decode("utf-8", "surrogateescape")) self._config.readfp(fileobj, filename) except (IOError, OSError): return # don't upgrade if we just created a new config if self._version is not None: self._loaded_version = self.getint("__config__", "version", -1) for func in self._upgrade_funcs: self._do_upgrade(func) def has_option(self, section, option): """If the given section exists, and contains the given option""" return self._config.has_option(section, option) or ( self.defaults and self.defaults.has_option(section, option)) def has_section(self, section): """If the given section exists""" return self._config.has_section(section) or ( self.defaults and self.defaults.has_section(section)) def remove_option(self, section, option): """Remove the specified option from the specified section Can raise Error. """ return self._config.remove_option(section, option) def add_section(self, section): """Add a section named section to the instance if it not already exists.""" if not self._config.has_section(section): self._config.add_section(section) class ConfigProxy(object): """Provides a Config object with a fixed section and a possibility to prefix option names in that section. e.g. it can create a view of the "plugin" section and prefix all options with a plugin name. """ def __init__(self, real_config, section_name, _defaults=True): self._real_config = real_config self._section_name = section_name self.defaults = None if _defaults: self.defaults = self._new_defaults(real_config.defaults) def _new_defaults(self, real_default_config): return ConfigProxy(real_default_config, self._section_name, False) def _option(self, name): """Override if you want to change option names. e.g. prefix them""" return name @classmethod def _init_wrappers(cls): def get_func(name): def method(self, option, *args, **kwargs): config_getter = getattr(self._real_config, name) return config_getter( self._section_name, self._option(option), *args, **kwargs) return method # methods starting with a section arg for name in ["get", "set", "getboolean", "getint", "getfloat", "reset", "settext", "gettext", "getbytes", "setbytes"]: setattr(cls, name, get_func(name)) ConfigProxy._init_wrappers() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/logging.py�����������������������������������������������������������0000644�0001750�0001750�00000004066�13112005742�020710� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import import collections import threading from quodlibet.compat import xrange class Logs(object): """Thread safe log store""" MAX_LOG_SIZE_DEFAULT = 500 def __init__(self, max_log_size=MAX_LOG_SIZE_DEFAULT): self._iter_lock = threading.Lock() self._log = collections.deque(maxlen=max_log_size) def _save_iter(self): # only pop/append/len are threadsafe, implement iter with them with self._iter_lock: temp = collections.deque() for i in xrange(len(self._log)): item = self._log.popleft() yield item temp.append(item) while temp: self._log.appendleft(temp.pop()) def log(self, string, category=None): """Log str/unicode. Thread safe. """ self._log.append((category, string)) def clear(self): """Remove all entries. Thread safe. """ with self._iter_lock: for i in xrange(len(self._log)): self._log.popleft() def get_content(self, category=None, limit=None): """Get a list of unicode strings for the specified category. Oldest entry first. Passing no category will return all content. If `limit` is specified, the last `limit` items will be returned. Thread safe. """ content = [] for cat, string in self._save_iter(): if category is None or category == cat: if isinstance(string, bytes): string = string.decode("utf-8", "replace") content.append(string) if limit is not None: assert limit > 0 return content[-limit:] return content _logs = Logs() log = _logs.log get_content = _logs.get_content ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/library.py�����������������������������������������������������������0000644�0001750�0001750�00000007040�13112005742�020721� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2013 Joe Wreschnig, Michael Urman, Iñigo Serna, # Christoph Reiter, Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import re from senf import fsn2bytes, bytes2fsn, fsnative, expanduser from quodlibet import _ from quodlibet import app from quodlibet import config from quodlibet.qltk.notif import Task from quodlibet.util.dprint import print_d from quodlibet.util import copool, is_windows from quodlibet.query import Query from quodlibet.qltk.songlist import SongList from quodlibet.util.string import split_escape, join_escape def background_filter(): """Returns a filter function for AudioFile or None if nothing should be filtered. The filter is meant to be used globally to hide songs from the main library. Returns: function or None """ bg = config.gettext("browsers", "background") if not bg: return try: return Query(bg, SongList.star).search except Query.error: pass def split_scan_dirs(joined_paths): """Returns a list of paths Args: joined_paths (fsnative) Return: list """ assert isinstance(joined_paths, fsnative) if is_windows(): # we used to separate this config with ":", so this is tricky return list( filter(None, re.findall(r"[a-zA-Z]:[\\/][^:]*", joined_paths))) else: return list(filter(None, split_escape(joined_paths, ":"))) def get_scan_dirs(): """Returns a list of paths which should be scanned Returns: list """ joined_paths = bytes2fsn(config.getbytes("settings", "scan"), "utf-8") return [expanduser(p) for p in split_scan_dirs(joined_paths)] def set_scan_dirs(dirs): """Saves a list of fs paths which should be scanned Args: list """ assert all(isinstance(d, fsnative) for d in dirs) if is_windows(): joined = fsnative(u":").join(dirs) else: joined = join_escape(dirs, fsnative(u":")) config.setbytes("settings", "scan", fsn2bytes(joined, "utf-8")) def get_exclude_dirs(): """Returns a list of paths which should be ignored during scanning Returns: list """ paths = split_scan_dirs( bytes2fsn(config.getbytes("library", "exclude"), "utf-8")) return [expanduser(p) for p in paths] def scan_library(library, force): """Start the global library re-scan Args: library (Library) force (bool): if True, reload all existing valid items """ paths = get_scan_dirs() exclude = get_exclude_dirs() copool.add(library.rebuild, paths, force, exclude, cofuncid="library", funcid="library") def emit_signal(songs, signal="changed", block_size=50, name=None, cofuncid=None): """ A generator that signals `signal` on the library in blocks of `block_size`. Useful for copools. """ i = 0 with Task(_("Library"), name or signal) as task: if cofuncid: task.copool(cofuncid) total = len(songs) while i < total: more = songs[i:i + block_size] if not more: return if 0 == ((i / block_size) % 10): print_d("Signalling '%s' (%d/%d songs)" % (signal, i, total)) task.update(float(i) / total) app.library.emit(signal, more) i += block_size yield ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/collections.py�������������������������������������������������������0000644�0001750�0001750�00000012221�13112005742�021570� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import from collections import MutableSequence, defaultdict from quodlibet.compat import listkeys from .misc import total_ordering @total_ordering class DictMixin(object): """Implement the dict API using keys() and __*item__ methods. Similar to UserDict.DictMixin, this takes a class that defines __getitem__, __setitem__, __delitem__, and keys(), and turns it into a full dict-like object. UserDict.DictMixin is not suitable for this purpose because it's an old-style class. This class is not optimized for very large dictionaries; many functions have linear memory requirements. I recommend you override some of these functions if speed is required. """ def __iter__(self): return iter(self.keys()) def has_key(self, key): try: self[key] except KeyError: return False else: return True __contains__ = has_key def iterkeys(self): return iter(self.keys()) def values(self): return [self[k] for k in self.keys()] def itervalues(self): return iter(self.values()) def items(self): return list(zip(self.keys(), self.values())) def iteritems(self): return iter(self.items()) def clear(self): for key in listkeys(self): del self[key] def pop(self, key, *args): if len(args) > 1: raise TypeError("pop takes at most two arguments") try: value = self[key] except KeyError: if args: return args[0] else: raise del(self[key]) return value def popitem(self): try: key = listkeys(self)[0] return key, self.pop(key) except IndexError: raise KeyError("dictionary is empty") def update(self, other=None, **kwargs): if other is None: self.update(kwargs) other = {} try: for key, value in other.items(): self[key] = value except AttributeError: for key, value in other: self[key] = value def setdefault(self, key, default=None): try: return self[key] except KeyError: self[key] = default return default def get(self, key, default=None): try: return self[key] except KeyError: return default def __repr__(self): return repr(dict(self.items())) def __eq__(self, other): return dict(self.items()) == other def __lt__(self, other): return dict(self.items()) < other __hash__ = object.__hash__ def __len__(self): return len(self.keys()) class DictProxy(DictMixin): def __init__(self, *args, **kwargs): self.__dict = {} super(DictProxy, self).__init__(*args, **kwargs) def __getitem__(self, key): return self.__dict[key] def __setitem__(self, key, value): self.__dict[key] = value def __delitem__(self, key): del(self.__dict[key]) def keys(self): return self.__dict.keys() class HashedList(MutableSequence): """A list-like collection that can only take hashable items and provides fast membership tests. Can handle duplicate entries. """ def __init__(self, arg=None): self._map = defaultdict(int) if arg is None: self._data = [] return self._data = list(arg) for item in arg: self._map[item] += 1 def __setitem__(self, index, item): old_items = self._data[index] if not isinstance(index, slice): old_items = [old_items] for old in old_items: self._map[old] -= 1 if not self._map[old]: del self._map[old] self._data[index] = item items = item if not isinstance(index, slice): items = [items] for item in items: self._map[item] += 1 def __getitem__(self, index): return self._data[index] def __delitem__(self, index): items = self._data[index] if not isinstance(index, slice): items = [items] for item in items: self._map[item] -= 1 if not self._map[item]: del self._map[item] del self._data[index] def __len__(self): return len(self._data) def insert(self, index, item): self._data.insert(index, item) self._map[item] += 1 def __contains__(self, item): return item in self._map def __iter__(self): for item in self._data: yield item def has_duplicates(self): """Returns True if any item is contained more than once""" return len(self._map) != len(self) def __repr__(self): return repr(self._data) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/path.py��������������������������������������������������������������0000644�0001750�0001750�00000025617�13115477405�020237� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2009 Joe Wreschnig, Michael Urman, Steven Robertson # 2011-2013 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import re import sys import errno import tempfile import codecs import shlex from senf import fsnative, bytes2fsn, fsn2bytes, expanduser, sep, expandvars, \ fsn2text from quodlibet.compat import PY2, urlparse, text_type, quote, unquote, PY3 from . import windows from .environment import is_windows from .misc import environ if sys.platform == "darwin": from Foundation import NSString def mkdir(dir_, *args): """Make a directory, including all its parent directories. This does not raise an exception if the directory already exists (and is a directory).""" try: os.makedirs(dir_, *args) except OSError as e: if e.errno != errno.EEXIST or not os.path.isdir(dir_): raise def glib2fsn(path): """Takes a glib filename and returns a fsnative path""" if PY2: return bytes2fsn(path, "utf-8") else: return path def fsn2glib(path): """Takes a fsnative path and returns a glib filename""" if PY2: return fsn2bytes(path, "utf-8") else: return path def iscommand(s): """True if an executable file `s` exists in the user's path, or is a fully qualified and existing executable file.""" if s == "" or os.path.sep in s: return os.path.isfile(s) and os.access(s, os.X_OK) else: s = s.split()[0] path = environ.get('PATH', '') or os.defpath for p in path.split(os.path.pathsep): p2 = os.path.join(p, s) if os.path.isfile(p2) and os.access(p2, os.X_OK): return True else: return False def listdir(path, hidden=False): """List files in a directory, sorted, fully-qualified. If hidden is false, Unix-style hidden files are not returned. """ assert isinstance(path, fsnative) if hidden: filt = None else: filt = lambda base: not base.startswith(".") if path.endswith(os.sep): join = "".join else: join = os.sep.join return [join([path, basename]) for basename in sorted(os.listdir(path)) if filt(basename)] def mtime(filename): """Return the mtime of a file, or 0 if an error occurs.""" try: return os.path.getmtime(filename) except OSError: return 0 def filesize(filename): """Return the size of a file, or 0 if an error occurs.""" try: return os.path.getsize(filename) except OSError: return 0 def escape_filename(s): """Escape a string in a manner suitable for a filename. Args: s (text_type) Returns: fsnative """ s = text_type(s) s = quote(s.encode("utf-8"), safe=b"") if isinstance(s, text_type): s = s.encode("ascii") return bytes2fsn(s, "utf-8") def unescape_filename(s): """Unescape a string in a manner suitable for a filename. Args: filename (fsnative) Returns: text_type """ assert isinstance(s, fsnative) return fsn2text(unquote(s)) def unexpand(filename): """Replace the user's home directory with ~/, if it appears at the start of the path name. """ sub = (os.name == "nt" and "%USERPROFILE%") or "~" home = expanduser("~") if filename == home: return sub elif filename.startswith(home + os.path.sep): filename = filename.replace(home, sub, 1) return filename if PY3 and is_windows(): def ismount(path): # this can raise on py3+win, but we don't care try: return os.path.ismount(path) except OSError: return False else: ismount = os.path.ismount def find_mount_point(path): while not ismount(path): path = os.path.dirname(path) return path def xdg_get_system_data_dirs(): """http://standards.freedesktop.org/basedir-spec/latest/""" if os.name == "nt": from gi.repository import GLib dirs = [] for dir_ in GLib.get_system_data_dirs(): dirs.append(glib2fsn(dir_)) return dirs data_dirs = os.getenv("XDG_DATA_DIRS") if data_dirs: return list(map(os.path.abspath, data_dirs.split(":"))) else: return ("/usr/local/share/", "/usr/share/") def xdg_get_cache_home(): if os.name == "nt": from gi.repository import GLib return glib2fsn(GLib.get_user_cache_dir()) data_home = os.getenv("XDG_CACHE_HOME") if data_home: return os.path.abspath(data_home) else: return os.path.join(os.path.expanduser("~"), ".cache") def xdg_get_data_home(): if os.name == "nt": from gi.repository import GLib return glib2fsn(GLib.get_user_data_dir()) data_home = os.getenv("XDG_DATA_HOME") if data_home: return os.path.abspath(data_home) else: return os.path.join(os.path.expanduser("~"), ".local", "share") def xdg_get_config_home(): if os.name == "nt": from gi.repository import GLib return glib2fsn(GLib.get_user_config_dir()) data_home = os.getenv("XDG_CONFIG_HOME") if data_home: return os.path.abspath(data_home) else: return os.path.join(os.path.expanduser("~"), ".config") def parse_xdg_user_dirs(data): """Parses xdg-user-dirs and returns a dict of keys and paths. The paths depend on the content of environ while calling this function. See http://www.freedesktop.org/wiki/Software/xdg-user-dirs/ Args: data (bytes) Can't fail (but might return garbage). """ assert isinstance(data, bytes) paths = {} for line in data.splitlines(): if line.startswith(b"#"): continue parts = line.split(b"=", 1) if len(parts) <= 1: continue key = parts[0] try: values = shlex.split(bytes2fsn(parts[1], "utf-8")) except ValueError: continue if len(values) != 1: continue paths[key] = os.path.normpath(expandvars(values[0])) return paths def xdg_get_user_dirs(): """Returns a dict of xdg keys to paths. The paths don't have to exist.""" config_home = xdg_get_config_home() try: with open(os.path.join(config_home, "user-dirs.dirs"), "rb") as h: return parse_xdg_user_dirs(h.read()) except EnvironmentError: return {} def get_temp_cover_file(data): """Returns a file object or None""" try: # pass fsnative so that mkstemp() uses unicode on Windows fn = tempfile.NamedTemporaryFile(prefix=fsnative(u"tmp")) fn.write(data) fn.flush() fn.seek(0, 0) except EnvironmentError: return else: return fn def _strip_win32_incompat(string, BAD='\:*?;"<>|'): """Strip Win32-incompatible characters from a Windows or Unix path.""" if os.name == "nt": BAD += "/" if not string: return string new = "".join(map(lambda s: (s in BAD and "_") or s, string)) parts = new.split(os.sep) def fix_end(string): return re.sub(r'[\. ]$', "_", string) return os.sep.join(map(fix_end, parts)) def strip_win32_incompat_from_path(string): """Strip Win32-incompatible chars from a path, ignoring os.sep and the drive part""" drive, tail = os.path.splitdrive(string) tail = os.sep.join(map(_strip_win32_incompat, tail.split(os.sep))) return drive + tail def _normalize_darwin_path(filename, canonicalise=False): if canonicalise: filename = os.path.realpath(filename) filename = os.path.normpath(filename) decoded = filename.decode("utf-8", "quodlibet-osx-path-decode") try: return NSString.fileSystemRepresentation(decoded) except ValueError: return filename def _normalize_path(filename, canonicalise=False): """Normalize a path on Windows / Linux If `canonicalise` is True, dereference symlinks etc by calling `os.path.realpath` """ if canonicalise: filename = os.path.realpath(filename) filename = os.path.normpath(filename) return os.path.normcase(filename) if sys.platform == "darwin": def _osx_path_decode_error_handler(error): bytes_ = bytearray(error.object[error.start:error.end]) return (u"".join(map("%%%X".__mod__, bytes_)), error.end) codecs.register_error( "quodlibet-osx-path-decode", _osx_path_decode_error_handler) normalize_path = _normalize_darwin_path else: normalize_path = _normalize_path def path_equal(p1, p2, canonicalise=False): return normalize_path(p1, canonicalise) == normalize_path(p2, canonicalise) def limit_path(path, ellipsis=True): """Reduces the filename length of all filenames in the given path to the common maximum length for current platform. While the limits are depended on the file system and more restrictions may apply, this covers the common case. """ assert isinstance(path, fsnative) main, ext = os.path.splitext(path) parts = main.split(sep) for i, p in enumerate(parts): # Limit each path section to 255 (bytes on linux, chars on win). # http://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits limit = 255 if i == len(parts) - 1: limit -= len(ext) if len(p) > limit: if ellipsis: p = p[:limit - 2] + fsnative(u"..") else: p = p[:limit] parts[i] = p return sep.join(parts) + ext def get_home_dir(): """Returns the root directory of the user, /home/user or C:\\Users\\user""" if os.name == "nt": return windows.get_profile_dir() else: return expanduser("~") def ishidden(path): """Returns if a directory/ file is considered hidden by the platform. Hidden meaning the user should normally not be exposed to those files when opening the parent directory in the default file manager using the default settings. Does not check if any of the parents are hidden. In case the file/dir does not exist the result is implementation defined. Args: path (fsnative) Returns: bool """ # TODO: win/osx return os.path.basename(path).startswith(".") def uri_is_valid(uri): """Returns True if the passed in text is a valid URI (file, http, etc.) Args: uri(text or bytes) Returns: bool """ try: if isinstance(uri, bytes): uri.decode("ascii") elif not isinstance(uri, bytes): uri = uri.encode("ascii") except ValueError: return False parsed = urlparse(uri) if not parsed.scheme or not len(parsed.scheme) > 1: return False elif not (parsed.netloc or parsed.path): return False else: return True �����������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/picklehelper.py������������������������������������������������������0000644�0001750�0001750�00000007024�13112005742�021726� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """One interface for pickle/cPickle for both Python 2/3""" from io import BytesIO, BufferedReader from quodlibet.compat import cBytesIO, PY2 if PY2: import cPickle import pickle from pickle import PicklingError, UnpicklingError, PickleError PickleError def pickle_dumps(obj, protocol=0): """Like pickle.dumps Raises: pickle.PicklingError """ if not 0 <= protocol <= 2: raise ValueError("Only protocol 0, 1, 2 allowed") try: # pickle.PicklingError is not cPickle.PicklingError # so this makes sure we only raise pickle.PicklingError even if # we use cPickle if PY2: return cPickle.dumps(obj, protocol) else: return pickle.dumps(obj, protocol) except PicklingError: raise except Exception as e: raise PicklingError(e) def pickle_dump(obj, file, protocol=0): """Like pickle.dump Raises: pickle.PicklingError """ if not 0 <= protocol <= 2: raise ValueError("Only protocol 0, 1, 2 allowed") try: if PY2: return cPickle.dump(obj, file, protocol) else: return pickle.dump(obj, file, protocol) except PicklingError: raise except Exception as e: raise PicklingError(e) def pickle_load(file, lookup_func=None): """Allows unpickling with manual control over class lookup on both Python 2 and Python 3. Will unpickle from the current position to the final stop marker. lookup_func gets passed a function for global lookup, the mod name to import and the attribute name to return from the module The lookup function passed to the callback can raise ImportError or AttributeError. Args: file (fileobj) lookup_func (callable or None) Returns: The unpickled objects Raises: pickle.UnpicklingError """ if PY2: inst = cPickle.Unpickler(file) if lookup_func is not None: # this is just a dummy unpickler we use for fallback class lookup unpickler = pickle.Unpickler(cBytesIO()) def find_global(mod, name): return lookup_func(unpickler.find_class, mod, name) inst.find_global = find_global else: if lookup_func is not None: class CustomUnpickler(pickle.Unpickler): def find_class(self, module, name): func = super(CustomUnpickler, self).find_class return lookup_func(func, module, name) unpickler_type = CustomUnpickler else: unpickler_type = pickle.Unpickler # helps a lot, but only on py3 if isinstance(file, BytesIO): file = BufferedReader(file) inst = unpickler_type(file, encoding="bytes") try: return inst.load() except UnpicklingError: raise except Exception as e: # unpickle can fail in many ways raise UnpicklingError(e) def pickle_loads(data, lookup_func=None): """Like pickle_load() but takes bytes instead of a file-like Args: data (bytes) lookup_func (callable or None) Returns: The unpickled objects Raises: pickle.UnpicklingError """ return pickle_load(cBytesIO(data), lookup_func=lookup_func) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/fifo.py��������������������������������������������������������������0000644�0001750�0001750�00000016242�13112005742�020204� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import errno import signal import stat from quodlibet import print_e try: import fcntl fcntl except ImportError: fcntl = None from gi.repository import GLib from senf import mkstemp, fsn2bytes from quodlibet.util.path import mkdir from quodlibet.util import print_d FIFO_TIMEOUT = 10 """time in seconds until we give up writing/reading""" def _write_fifo(fifo_path, data): """Writes the data to the FIFO or raises `EnvironmentError`""" assert isinstance(data, bytes) # This will raise if the FIFO doesn't exist or there is no reader try: fifo = os.open(fifo_path, os.O_WRONLY | os.O_NONBLOCK) except OSError: try: os.unlink(fifo_path) except OSError: pass raise else: try: os.close(fifo) except OSError: pass try: # This is a total abuse of Python! Hooray! signal.signal(signal.SIGALRM, lambda: "" + 2) signal.alarm(FIFO_TIMEOUT) with open(fifo_path, "wb") as f: signal.signal(signal.SIGALRM, signal.SIG_IGN) f.write(data) except (OSError, IOError, TypeError): # Unable to write to the fifo. Removing it. try: os.unlink(fifo_path) except OSError: pass raise EnvironmentError("Couldn't write to fifo %r" % fifo_path) def split_message(data): """Split incoming data in pairs of (command, FIFO path or `None`) This supports two data formats: Newline-separated commands without a return FIFO path. and "NULL<command>NULL<fifo-path>NULL" Args: data (bytes) Returns: Tuple[bytes, bytes] Raises: ValueError """ assert isinstance(data, bytes) arg = 0 args = [] while data: if arg == 0: index = data.find(b"\x00") if index == 0: arg = 1 data = data[1:] continue if index == -1: elm = data data = b"" else: elm, data = data[:index], data[index:] for l in elm.splitlines(): yield (l, None) elif arg == 1: elm, data = data.split(b"\x00", 1) args.append(elm) arg = 2 elif arg == 2: elm, data = data.split(b"\x00", 1) args.append(elm) yield tuple(args) del args[:] arg = 0 def write_fifo(fifo_path, data): """Writes the data to the FIFO and returns a response. Args: fifo_path (pathlike) data (bytes) Returns: bytes Raises: EnvironmentError: In case of timeout and other errors """ assert isinstance(data, bytes) fd, filename = mkstemp() try: os.close(fd) os.unlink(filename) # mkfifo fails if the file exists, so this is safe. os.mkfifo(filename, 0o600) _write_fifo( fifo_path, b"\x00" + data + b"\x00" + fsn2bytes(filename, None) + b"\x00") try: signal.signal(signal.SIGALRM, lambda: "" + 2) signal.alarm(FIFO_TIMEOUT) with open(filename, "rb") as h: signal.signal(signal.SIGALRM, signal.SIG_IGN) return h.read() except TypeError: raise EnvironmentError("timeout") finally: try: os.unlink(filename) except EnvironmentError: pass def fifo_exists(fifo_path): """Returns whether a FIFO exists (and is writeable). Args: fifo_path (pathlike) Returns: bool """ # https://github.com/quodlibet/quodlibet/issues/1131 # FIXME: There is a race where control() creates a new file # instead of writing to the FIFO, confusing the next QL instance. # Remove non-FIFOs here for now. try: if not stat.S_ISFIFO(os.stat(fifo_path).st_mode): print_d("%r not a FIFO. Removing it." % fifo_path) os.remove(fifo_path) except OSError: pass return os.path.exists(fifo_path) class FIFOError(Exception): pass class FIFO(object): """Creates and reads from a FIFO""" def __init__(self, path, callback): """ Args: path (pathlike) callback (Callable[[bytes], None]) """ self._callback = callback self._path = path def open(self): """Create the FIFO and listen to it. Raises: FIFOError in case another process is already using it. """ self._open(False, None) def destroy(self): """After destroy() the callback will no longer be called and the FIFO can no longer be used. Can be called multiple times. """ if self._id is not None: GLib.source_remove(self._id) self._id = None try: os.unlink(self._path) except EnvironmentError: pass def _open(self, ignore_lock, *args): from quodlibet import qltk self._id = None mkdir(os.path.dirname(self._path)) try: os.mkfifo(self._path, 0o600) except OSError: # maybe exists, we'll fail below otherwise pass try: fifo = os.open(self._path, os.O_NONBLOCK) except OSError: return while True: try: fcntl.flock(fifo, fcntl.LOCK_EX | fcntl.LOCK_NB) except IOError as e: # EINTR on linux if e.errno == errno.EINTR: continue if ignore_lock: break # OSX doesn't support FIFO locking, so check errno if e.errno == errno.EWOULDBLOCK: raise FIFOError("fifo already locked") else: print_d("fifo locking failed: %r" % e) break try: f = os.fdopen(fifo, "rb", 4096) except OSError as e: print_e("Couldn't open FIFO (%s)" % e) else: self._id = qltk.io_add_watch( f, GLib.PRIORITY_DEFAULT, GLib.IO_IN | GLib.IO_ERR | GLib.IO_HUP, self._process, *args) def _process(self, source, condition, *args): if condition in (GLib.IO_ERR, GLib.IO_HUP): self._open(True, *args) return False while True: try: data = source.read() except (IOError, OSError) as e: if e.errno in (errno.EWOULDBLOCK, errno.EAGAIN): return True elif e.errno == errno.EINTR: continue else: self.__open(*args) return False break if not data: self._open(*args) return False self._callback(data) return True ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/misc.py��������������������������������������������������������������0000644�0001750�0001750�00000005170�13112005742�020212� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import locale from functools import wraps from senf import environ, argv, path2fsn from .environment import is_linux environ, argv def cached_func(f): """Decorator which caches the return value of a function which doesn't take any input. """ res = [] @wraps(f) def wrapper(): if not res: res.append(f()) return res[0] return wrapper def _verify_encoding(encoding): try: u"".encode(encoding) except LookupError: encoding = "utf-8" return encoding @cached_func def get_locale_encoding(): """Returns the encoding defined by the locale""" try: encoding = locale.getpreferredencoding(False) except locale.Error: encoding = "utf-8" else: # python on macports can return a bugs result (empty string) encoding = _verify_encoding(encoding) return encoding def total_ordering(cls): """Adds all possible ordering methods to a class. Needs a working __eq__ and __lt__ and will supply the rest. """ assert "__eq__" in cls.__dict__ assert "__lt__" in cls.__dict__ cls.__le__ = lambda self, other: self == other or self < other cls.__gt__ = lambda self, other: not (self == other or self < other) cls.__ge__ = lambda self, other: not self < other cls.__ne__ = lambda self, other: not self.__eq__(other) return cls def hashable(cls): """Makes sure the class is hashable. Needs a working __eq__ and __hash__ and will add a __ne__. """ # py2 assert "__hash__" in cls.__dict__ # py3 assert cls.__dict__["__hash__"] is not None assert "__eq__" in cls.__dict__ cls.__ne__ = lambda self, other: not self.__eq__(other) return cls def get_module_dir(module=None): """Returns the absolute path of a module. If no module is given the one this is called from is used. """ if module is None: file_path = sys._getframe(1).f_globals["__file__"] else: file_path = getattr(module, "__file__") file_path = path2fsn(file_path) return os.path.dirname(os.path.realpath(file_path)) def get_ca_file(): """A path to a CA file or None. Depends whether we use certifi or the system trust store on the current platform. """ if is_linux(): return None import certifi return os.path.join(get_module_dir(certifi), "cacert.pem") ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/songwrapper.py�������������������������������������������������������0000644�0001750�0001750�00000007550�13112005742�021632� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Michael Urman # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.util.dprint import print_d from quodlibet.formats import AudioFileError from quodlibet import util from quodlibet import qltk from quodlibet.qltk.wlw import WritingWindow from quodlibet.util.misc import total_ordering, hashable @hashable @total_ordering class SongWrapper(object): __slots__ = ['_song', '_updated', '_needs_write'] def __init__(self, song): self._song = song self._updated = False self._needs_write = False def _was_updated(self): return self._updated def __setitem__(self, key, value): if key in self and self[key] == value: return self._updated = True self._needs_write = (self._needs_write or not key.startswith("~")) return self._song.__setitem__(key, value) def __delitem__(self, key): retval = self._song.__delitem__(key) self._updated = True self._needs_write = (self._needs_write or not key.startswith("~")) return retval def __getattr__(self, attr): return getattr(self._song, attr) def __setattr__(self, attr, value): # Don't set our attributes on the song. However, we only want to # set attributes the song already has. So, if the attribute # isn't one of ours, and isn't one of the song's, hand it off # to our parent's attribute handler for error handling. if attr in self.__slots__: return super(SongWrapper, self).__setattr__(attr, value) elif hasattr(self._song, attr): return setattr(self._song, attr, value) else: return super(SongWrapper, self).__setattr__(attr, value) def __hash__(self): return hash(self._song) def __eq__(self, other): return self._song == other._song def __lt__(self, other): return self._song < other._song def __getitem__(self, *args): return self._song.__getitem__(*args) def __contains__(self, key): return key in self._song def __call__(self, *args): return self._song(*args) def pop(self, *args): self._updated = True self._needs_write = True return self._song.pop(*args) def update(self, other): self._updated = True self._needs_write = True return self._song.update(other) def rename(self, newname): self._updated = True return self._song.rename(newname) def ListWrapper(songs): def wrap(song): if song is None: return None else: return SongWrapper(song) return [wrap(s) for s in songs] def check_wrapper_changed(library, parent, songs): need_write = [s for s in songs if s._needs_write] if need_write: win = WritingWindow(parent, len(need_write)) win.show() for song in need_write: try: song._song.write() except AudioFileError as e: qltk.ErrorMessage( None, _("Unable to edit song"), _("Saving <b>%s</b> failed. The file " "may be read-only, corrupted, or you " "do not have permission to edit it.") % util.escape(song('~basename'))).run() print_d("Couldn't save song %s (%s)" % (song("~filename"), e)) if win.step(): break win.destroy() changed = [] for song in songs: if song._was_updated(): changed.append(song._song) elif not song.valid() and song.exists(): library.reload(song._song) library.changed(changed) ��������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/importhelper.py������������������������������������������������������0000644�0001750�0001750�00000006346�13112005742�021777� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import imp from os.path import join, splitext, basename from quodlibet import util def load_dir_modules(path, package, load_compiled=False): """Load all modules and packages in path (recursive). Load pyc files if load_compiled is True. In case the module is already loaded, doesn't reload it. """ # needed for pickle etc. assert package in sys.modules try: modules = [e[0] for e in get_importables(path, load_compiled)] except OSError: util.print_w("%r not found" % path) return [] # get_importables can yield py and pyc for the same module # and we want to load it only once modules = set(modules) loaded = [] for name in modules: try: mod = load_module(name, package, path) except Exception: util.print_exc() continue if mod: loaded.append(mod) return loaded def get_importables(folder, include_compiled=False): """Searches a folder and its subfolders for modules and packages to import. No subfolders in packages, .so supported. The root folder will not be considered a package. returns a tuple of the name, import path, list of possible dependencies """ def is_ok(f): if f.startswith("_"): return False if f.endswith(".py"): return True elif include_compiled and f.endswith(".pyc"): return True return False def is_init(f): if f == "__init__.py": return True elif include_compiled and f == "__init__.pyc": return True return False first = True for root, dirs, names in os.walk(folder): # Ignore packages like "_shared" if basename(root).startswith("_"): continue if not first and any((is_init(n) for n in names)): yield (basename(root), root, list(filter(is_ok, [join(root, name) for name in names]))) else: for name in filter(is_ok, names): yield (splitext(name)[0], join(root, name), [join(root, name)]) first = False def load_module(name, package, path, reload=False): """Load a module/package. Returns the module or None. Doesn't catch any exceptions during the actual import. If reload is True and the module is already loaded, reload it. """ fullname = package + "." + name try: return sys.modules[fullname] except KeyError: pass try: # this also handles packages fp, path, desc = imp.find_module(name, [path]) except ImportError: return # modules need a parent package if package not in sys.modules: sys.modules[package] = imp.new_module(package) try: mod = imp.load_module(fullname, fp, path, desc) finally: if fp: fp.close() # make it accessible from the parent, like __import__ does vars(sys.modules[package])[name] = mod return mod ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/trash.py�������������������������������������������������������������0000644�0001750�0001750�00000011321�13112005742�020373� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011 Christoph Reiter # 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import stat import sys import errno import time import shutil from os.path import join, islink, abspath, dirname from os.path import isdir, basename, exists, splitext from quodlibet import config from quodlibet.util.path import find_mount_point, xdg_get_data_home from quodlibet.compat import pathname2url _TRASH_TMPL = """[Trash Info] Path={path} DeletionDate={date}""" class TrashError(EnvironmentError): pass def is_sticky(path): return bool(os.stat(path).st_mode & stat.S_ISVTX) def _get_fd_trash_dirs(path): """Returns verified trash folders for the given path. Returns (rootdir, filesdir, infodir), or raises a TrashError if a valid trash folder structure could not be found. The returned trash folders are not guaranteed to be on the same volume as the original path: a fallback may be returned instead. Returned paths are absolute. This method may create partial or complete trash directory structures as part of its search. """ path = abspath(path) mount = find_mount_point(path) xdg_data_home = xdg_get_data_home() xdg_home_mount = find_mount_point(xdg_data_home) trash_home = join(xdg_data_home, "Trash") # Build a list of trash roots to try. trash_roots = [] if mount != xdg_home_mount: root = join(mount, ".Trash") uid = str(os.getuid()) if isdir(root) and not islink(root) and is_sticky(root): trash_roots.append(join(root, uid)) else: trash_roots.append(join(mount, ".Trash-" + uid)) trash_roots.append(trash_home) trash_roots = [abspath(r) for r in trash_roots] # Try and verify each potential trash path, and create its # required structure if needed. for trash_root in trash_roots: if path.startswith(join(trash_root, "")) or path == trash_root: # Can't move files to the trash from within the trash root. # But a fallback root may be OK. continue # makes things easier subdirs = [join(trash_root, s) for s in ("files", "info")] subdirs_valid = True for subdir in subdirs: if not isdir(subdir): try: os.makedirs(subdir, 0o700) except OSError: subdirs_valid = False if not os.access(subdir, os.W_OK): subdirs_valid = False if subdirs_valid: return tuple([trash_root] + subdirs) raise TrashError("No valid trash folder exists for %r" % (path,)) def trash_free_desktop(path): """Partial implementation of http://www.freedesktop.org/wiki/Specifications/trash-spec This doesn't work for files in the trash directory. """ path = abspath(path) if not exists(path): raise TrashError("Path %s does not exist." % path) trash_dir, files, info = _get_fd_trash_dirs(path) info_ext = ".trashinfo" name = basename(path) flags = os.O_EXCL | os.O_CREAT | os.O_WRONLY mode = 0o644 try: info_path = join(info, name + info_ext) info_fd = os.open(info_path, flags, mode) except OSError as e: if e.errno != errno.EEXIST: raise i = 2 while 1: head, tail = splitext(name) temp_name = "%s.%d%s" % (head, i, tail) info_path = join(info, temp_name + info_ext) try: info_fd = os.open(info_path, flags, mode) except OSError as e: if e.errno != errno.EEXIST: raise i += 1 continue name = temp_name break parent = dirname(trash_dir) if path.startswith(join(parent, "")): norm_path = path[len(join(parent, "")):] else: norm_path = path del_date = time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime()) data = _TRASH_TMPL.format(path=pathname2url(norm_path), date=del_date) os.write(info_fd, data.encode()) os.close(info_fd) target_path = join(files, name) try: shutil.move(path, target_path) except OSError: os.unlink(info_path) raise def use_trash(): """If the current platform supports moving files into a trash can.""" return ( os.name == "posix" and sys.platform != "darwin" and not config.getboolean("settings", "bypass_trash")) def trash(path): if os.name == "posix" and sys.platform != "darwin": trash_free_desktop(path) else: raise NotImplementedError ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/massagers.py���������������������������������������������������������0000644�0001750�0001750�00000013626�13112005742�021251� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2011 Joe Wreschnig, Michael Urman, Iñigo Serna, Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import locale import re from quodlibet import _ from quodlibet.compat import text_type from .iso639 import ISO_639_2 class ValidationError(Exception): pass class Massager(object): """Massage a tag value from various 'okay' formats to the 'correct' format.""" tags = [] error = "Metaerror. This should be overridden in subclasses." options = [] _massagers = {} def validate(self, value): """Returns a validated value. Raises ValidationError if invalid. """ raise NotImplementedError def is_valid(self, value): """Returns True if a field is valid, False if not""" try: self.validate(value) except ValidationError: return False return True @classmethod def _register(cls, other): """Register a new massager implementation""" assert issubclass(other, Massager) assert other.tags for tag in other.tags: cls._massagers[tag] = other return other @classmethod def get_massagers(cls): """Returns all massager subclasses""" return set(cls._massagers.values()) @classmethod def for_tag(cls, tag): """Returns a massager instance for the tag or raises KeyError""" return cls._massagers[tag]() def validate(tag, value): """Validate a value based on the tag. Raises ValidationError if invalid """ try: return Massager.for_tag(tag).validate(value) except KeyError: return value def is_valid(tag, value): """Returns True if the fields is valid""" try: return Massager.for_tag(tag).is_valid(value) except KeyError: return True def error_message(tag, value): """Returns an error message for invalid tag values""" try: return Massager.for_tag(tag).error except KeyError: return u"" def get_options(tag): """Returns a list of suggested values for the tag. If the list is empty this either means that the tag is unknown or the set of valid values would be too large""" try: return list(Massager.for_tag(tag).options) except KeyError: return [] @Massager._register class DateMassager(Massager): tags = ["date"] error = _("The date must be entered in 'YYYY', 'YYYY-MM-DD' or " "'YYYY-MM-DD HH:MM:SS' format.") __match = re.compile(r"^\d{4}([-.]\d{2}([-.]\d{2}([T ]\d{2}" "([:.]\d{2}([:.]\d{2})?)?)?)?)?$").match def validate(self, value): value = value.strip().replace(".", "-").replace("/", "-") if not self.__match(value): raise ValidationError return value @Massager._register class GainMassager(Massager): tags = ["replaygain_album_gain", "replaygain_track_gain"] error = _("Replay Gain gains must be entered in 'x.yy dB' format.") __match = re.compile(r"^[+-]\d+\.?\d+?\s+dB$").match def validate(self, value): if self.__match(value): return value else: try: f = float(value.split()[0]) except (IndexError, TypeError, ValueError): try: f = locale.atof(value.split()[0]) except (IndexError, TypeError, ValueError): raise ValidationError else: return (u"%+f" % f).rstrip("0") + " dB" @Massager._register class PeakMassager(Massager): tags = ["replaygain_album_peak", "replaygain_track_peak"] error = _("Replay Gain peaks must be entered in 'x.yy' format.") def validate(self, value): value = value.strip() try: f = float(value) except (TypeError, ValueError): try: f = locale.atof(value) except (TypeError, ValueError): raise ValidationError else: if f < 0 or f >= 2: raise ValidationError return text_type(f) @Massager._register class MBIDMassager(Massager): tags = ["musicbrainz_trackid", "musicbrainz_albumid", "musicbrainz_artistid", "musicbrainz_albumartistid", "musicbrainz_trmid", "musicip_puid"] error = _("MusicBrainz IDs must be in UUID format.") def validate(self, value): value = value.encode('ascii', 'replace').decode("ascii") value = u"".join(filter(text_type.isalnum, value.strip().lower())) try: int(value, 16) except ValueError: raise ValidationError else: if len(value) != 32: raise ValidationError else: return u"-".join([value[:8], value[8:12], value[12:16], value[16:20], value[20:]]) @Massager._register class MBAlbumStatus(Massager): tags = ["musicbrainz_albumstatus"] # Translators: Leave "official", "promotional", and "bootleg" # untranslated. They are the three possible literal values. error = _("MusicBrainz release status must be 'official', " "'promotional', or 'bootleg'.") options = ["official", "promotional", "bootleg"] def validate(self, value): if value not in self.options: raise ValidationError return value @Massager._register class LanguageMassager(Massager): tags = ["language"] error = _("Language must be an ISO 639-2 three-letter code") options = ISO_639_2 tags = ["language"] def validate(self, value): # Issue 439: Actually, allow free-text through return value def is_valid(self, value): # Override, to allow empty string to be a valid language (freetext) return True ����������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/compat.py������������������������������������������������������������0000644�0001750�0001750�00000000557�13112005742�020546� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright (C) 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys PY2 = sys.version_info[0] == 2 PY3 = not PY2 if PY2: text_type = unicode else: text_type = str �������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/thread.py������������������������������������������������������������0000644�0001750�0001750�00000007700�13112005742�020527� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Utils for executing things in a thread controlled from the main loop""" from multiprocessing import cpu_count try: from concurrent.futures import ThreadPoolExecutor except ImportError as e: raise ImportError("python-futures is missing: %r" % e) from gi.repository import GLib from quodlibet import util @util.enum class Priority(int): HIGH = 0 BACKGROUND = 1 class Cancellable(object): """Subset of Gio.Cancellable so it can be used as well""" def __init__(self): self._cancelled = False def is_cancelled(self): return self._cancelled def reset(self): self._cancelled = False def cancel(self): self._cancelled = True _pools = {} _prio_mapping = { Priority.HIGH: GLib.PRIORITY_DEFAULT, Priority.BACKGROUND: GLib.PRIORITY_LOW, } def _get_pool(priority): """Return a (shared) pool for a given priority""" global _pools if not priority in _pools: try: cpus = cpu_count() except NotImplementedError: cpus = 2 max_workers = int(cpus * 1.5) _pools[priority] = ThreadPoolExecutor(max_workers) return _pools[priority] def _wrap_function(function, cancellable, args, kwargs): def wrap(): # check once we are scheduled if not cancellable.is_cancelled(): try: return function(*args, **kwargs) except: # ThreadPool catches the exception for the async result # which we don't use. Print instead as if it was not catched. util.print_exc() raise return wrap def _wrap_callback(priority, cancellable, callback): def callback_main(cancellable, callback, result): if not cancellable.is_cancelled(): callback(result) return False def callback_thread(future): global _prio_mapping result = future.result() if not cancellable.is_cancelled(): glib_priority = _prio_mapping[priority] GLib.idle_add(callback_main, cancellable, callback, result, priority=glib_priority) return callback_thread def _call_async(priority, function, cancellable, callback, args, kwargs): assert cancellable is not None assert function is not None assert callback is not None if args is None: args = tuple() if kwargs is None: kwargs = {} pool = _get_pool(priority) wrapped_func = _wrap_function(function, cancellable, args, kwargs) wrapped_callback = _wrap_callback(priority, cancellable, callback) future = pool.submit(wrapped_func) future.add_done_callback(wrapped_callback) def terminate_all(): """Terminate all pools, doesn't wait for task completion. Can be called multiple times and call_async() etc. can still be used. """ global _pools for key, pool in list(_pools.items()): del _pools[key] pool.shutdown(wait=False) def call_async(function, cancellable, callback, args=None, kwargs=None): """Call `function` in a thread that gets passed the `cancellable` and the passed args/kwargs. The return value will get passed to `callback` which will be called in the main thread. It will not be called if the `cancellable` gets cancelled and is not guaranteed to be called at all (on event loop shutdown for example) """ _call_async(Priority.HIGH, function, cancellable, callback, args, kwargs) def call_async_background(function, cancellable, callback, args=None, kwargs=None): """Same as call_async but for background tasks (network etc.)""" _call_async(Priority.BACKGROUND, function, cancellable, callback, args, kwargs) ����������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/winapi.py������������������������������������������������������������0000644�0001750�0001750�00000034067�13112005742�020555� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """ Error handling: every function which has ctypes.HRESULT as restype will automatically raise WindowsError if a bad result is returned. For all other functions check the return status and raise ctypes.WinError() """ import os if os.name != "nt": raise ImportError import ctypes from ctypes import wintypes, cdll, windll, oledll from quodlibet.compat import long, add_metaclass from .enum import enum class GUID(ctypes.Structure): # https://msdn.microsoft.com/en-us/library/windows/desktop/ # aa373931%28v=vs.85%29.aspx _fields_ = [ ("Data1", wintypes.DWORD), ("Data2", wintypes.WORD), ("Data3", wintypes.WORD), ("Data4", wintypes.BYTE * 8), ] def __init__(self, name=None): if name is not None: IIDFromString(str(name), ctypes.byref(self)) def __str__(self): ptr = wintypes.LPOLESTR() StringFromIID(ctypes.byref(self), ctypes.byref(ptr)) string = str(ptr.value) CoTaskMemFree(ptr) return string LPGUID = ctypes.POINTER(GUID) IID = GUID LPIID = ctypes.POINTER(IID) REFIID = ctypes.POINTER(IID) CLSID = GUID REFCLSID = ctypes.POINTER(CLSID) WORD = wintypes.WORD DWORD = wintypes.DWORD ULONG = wintypes.ULONG SHORT = wintypes.SHORT ULONG_PTR = wintypes.WPARAM LONG_PTR = wintypes.LPARAM LRESULT = LONG_PTR HHOOK = wintypes.HANDLE HRESULT = ctypes.HRESULT HC_ACTION = 0 HC_NOREMOVE = 3 VK_MEDIA_NEXT_TRACK = 0xB0 VK_MEDIA_PREV_TRACK = 0xB1 VK_MEDIA_STOP = 0xB2 VK_MEDIA_PLAY_PAUSE = 0xB3 WM_KEYDOWN = 0x0100 WM_KEYUP = 0x0101 WM_SYSKEYDOWN = 0x0104 WM_SYSKEYUP = 0x0105 CallNextHookEx = windll.user32.CallNextHookEx CallNextHookEx.argtypes = [ HHOOK, ctypes.c_int, wintypes.WPARAM, wintypes.LPARAM] CallNextHookEx.restype = LRESULT class KBDLLHOOKSTRUCT(ctypes.Structure): _fields_ = [ ("vkCode", DWORD), ("scanCode", DWORD), ("flags", DWORD), ("time", DWORD), ("dwExtraInfo", ULONG_PTR), ] LPKBDLLHOOKSTRUCT = PKBDLLHOOKSTRUCT = ctypes.POINTER(KBDLLHOOKSTRUCT) LowLevelKeyboardProc = ctypes.WINFUNCTYPE( LRESULT, ctypes.c_int, wintypes.WPARAM, wintypes.LPARAM) _SetWindowsHookExW = windll.user32.SetWindowsHookExW _SetWindowsHookExW.argtypes = [ ctypes.c_int, ctypes.c_void_p, ctypes.c_void_p, wintypes.DWORD] _SetWindowsHookExW.restype = HHOOK def SetWindowsHookExW(idHook, lpfn, hMod, dwThreadId): assert idHook == WH_KEYBOARD_LL assert isinstance(lpfn, LowLevelKeyboardProc) return _SetWindowsHookExW(idHook, lpfn, hMod, dwThreadId) UnhookWindowsHookEx = windll.user32.UnhookWindowsHookEx UnhookWindowsHookEx.argtypes = [HHOOK] UnhookWindowsHookEx.restype = wintypes.BOOL WH_KEYBOARD_LL = 13 LPWIN32_FIND_DATAW = ctypes.POINTER(wintypes.WIN32_FIND_DATAW) IIDFromString = windll.ole32.IIDFromString IIDFromString.argtypes = [wintypes.LPCOLESTR, LPIID] IIDFromString.restype = HRESULT StringFromIID = windll.ole32.StringFromIID StringFromIID.argtypes = [REFIID, ctypes.POINTER(wintypes.LPOLESTR)] StringFromIID.restype = HRESULT CoInitialize = windll.ole32.CoInitialize CoInitialize.argtypes = [wintypes.LPVOID] CoInitialize.restype = HRESULT LPDWORD = ctypes.POINTER(wintypes.DWORD) REFKNOWNFOLDERID = ctypes.POINTER(GUID) CLSCTX_INPROC_SERVER = 1 SetEnvironmentVariableW = ctypes.windll.kernel32.SetEnvironmentVariableW SetEnvironmentVariableW.argtypes = [ctypes.c_wchar_p, ctypes.c_wchar_p] SetEnvironmentVariableW.restype = ctypes.c_bool GetEnvironmentStringsW = ctypes.windll.kernel32.GetEnvironmentStringsW GetEnvironmentStringsW.argtypes = [] GetEnvironmentStringsW.restype = ctypes.c_void_p FreeEnvironmentStringsW = ctypes.windll.kernel32.FreeEnvironmentStringsW FreeEnvironmentStringsW.argtypes = [ctypes.c_void_p] FreeEnvironmentStringsW.restype = ctypes.c_bool SHGetFolderPathW = ctypes.windll.shell32.SHGetFolderPathW SHGetFolderPathW.argtypes = [ wintypes.HWND, ctypes.c_int, wintypes.HANDLE, wintypes.DWORD, wintypes.LPWSTR] SHGetFolderPathW.restype = HRESULT SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath SHGetKnownFolderPath.argtypes = [ REFKNOWNFOLDERID, wintypes.DWORD, wintypes.HANDLE, ctypes.POINTER(ctypes.c_wchar_p)] SHGetKnownFolderPath.restype = HRESULT CoTaskMemFree = windll.ole32.CoTaskMemFree CoTaskMemFree.argtypes = [ctypes.c_void_p] CoTaskMemFree.restype = None GetCommandLineW = cdll.kernel32.GetCommandLineW GetCommandLineW.argtypes = [] GetCommandLineW.restype = wintypes.LPCWSTR CommandLineToArgvW = windll.shell32.CommandLineToArgvW CommandLineToArgvW.argtypes = [ wintypes.LPCWSTR, ctypes.POINTER(ctypes.c_int)] CommandLineToArgvW.restype = ctypes.POINTER(wintypes.LPWSTR) LocalFree = windll.kernel32.LocalFree LocalFree.argtypes = [wintypes.HLOCAL] LocalFree.restype = wintypes.HLOCAL WaitNamedPipeW = windll.kernel32.WaitNamedPipeW WaitNamedPipeW.argtypes = [wintypes.LPCWSTR, wintypes.DWORD] WaitNamedPipeW.restype = wintypes.BOOL LANGID = wintypes.WORD GetUserDefaultUILanguage = ctypes.windll.kernel32.GetUserDefaultUILanguage GetUserDefaultUILanguage.argtypes = [] GetUserDefaultUILanguage.restype = LANGID GetSystemDefaultUILanguage = ctypes.windll.kernel32.GetSystemDefaultUILanguage GetSystemDefaultUILanguage.argtypes = [] GetSystemDefaultUILanguage.restype = LANGID class SECURITY_ATTRIBUTES(ctypes.Structure): _fields_ = [ ("nLength", wintypes.DWORD), ("lpSecurityDescriptor", wintypes.LPVOID), ("bInheritHandle", wintypes.BOOL), ] LPSECURITY_ATTRIBUTES = ctypes.POINTER(SECURITY_ATTRIBUTES) PSECURITY_ATTRIBUTES = LPSECURITY_ATTRIBUTES CreateNamedPipeW = windll.kernel32.CreateNamedPipeW CreateNamedPipeW.argtypes = [ wintypes.LPCWSTR, wintypes.DWORD, wintypes.DWORD, wintypes.DWORD, wintypes.DWORD, wintypes.DWORD, wintypes.DWORD, LPSECURITY_ATTRIBUTES] CreateNamedPipeW.restype = wintypes.HANDLE LPOVERLAPPED = ctypes.c_void_p PIPE_ACCEPT_REMOTE_CLIENTS = 0x00000000 PIPE_REJECT_REMOTE_CLIENTS = 0x00000008 PIPE_ACCESS_DUPLEX = 0x00000003 PIPE_ACCESS_INBOUND = 0x00000001 PIPE_ACCESS_OUTBOUND = 0x00000002 PIPE_TYPE_BYTE = 0x00000000 PIPE_TYPE_MESSAGE = 0x00000004 PIPE_READMODE_BYTE = 0x00000000 PIPE_READMODE_MESSAGE = 0x00000002 PIPE_WAIT = 0x00000000 PIPE_NOWAIT = 0x00000001 FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000 FILE_FLAG_WRITE_THROUGH = 0x80000000 FILE_FLAG_OVERLAPPED = 0x40000000 PIPE_UNLIMITED_INSTANCES = 255 NMPWAIT_USE_DEFAULT_WAIT = 0x00000000 NMPWAIT_WAIT_FOREVER = 0xffffffff ConnectNamedPipe = windll.kernel32.ConnectNamedPipe ConnectNamedPipe.argtypes = [wintypes.HANDLE, LPOVERLAPPED] ConnectNamedPipe.restype = wintypes.BOOL DisconnectNamedPipe = windll.kernel32.DisconnectNamedPipe DisconnectNamedPipe.argtypes = [wintypes.HANDLE] DisconnectNamedPipe.restype = wintypes.BOOL ReadFile = windll.kernel32.ReadFile ReadFile.argtypes = [wintypes.HANDLE, wintypes.LPVOID, wintypes.DWORD, LPDWORD, LPOVERLAPPED] ReadFile.restype = wintypes.BOOL CloseHandle = windll.kernel32.CloseHandle CloseHandle.argtypes = [wintypes.HANDLE] CloseHandle.restype = wintypes.BOOL MOVEFILE_WRITE_THROUGH = 0x8 MOVEFILE_REPLACE_EXISTING = 0x1 MoveFileExW = windll.kernel32.MoveFileExW MoveFileExW.argtypes = [wintypes.LPWSTR, wintypes.LPWSTR, wintypes.DWORD] MoveFileExW.restype = wintypes.BOOL GetStdHandle = windll.kernel32.GetStdHandle GetStdHandle.argtypes = [DWORD] GetStdHandle.restype = wintypes.HANDLE SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute SetConsoleTextAttribute.argtypes = [wintypes.HANDLE, WORD] SetConsoleTextAttribute.restype = wintypes.BOOL GetConsoleOutputCP = windll.kernel32.GetConsoleOutputCP GetConsoleOutputCP.argtypes = [] GetConsoleOutputCP.restype = wintypes.UINT SetConsoleOutputCP = windll.kernel32.SetConsoleOutputCP SetConsoleOutputCP.argtypes = [wintypes.UINT] SetConsoleOutputCP.restype = wintypes.BOOL WinError = ctypes.WinError S_OK = HRESULT(0).value MAX_PATH = wintypes.MAX_PATH INVALID_HANDLE_VALUE = wintypes.HANDLE(-1).value STD_INPUT_HANDLE = DWORD(-10) STD_OUTPUT_HANDLE = DWORD(-11) STD_ERROR_HANDLE = DWORD(-12) class COORD(ctypes.Structure): _fields_ = [ ("X", SHORT), ("Y", SHORT), ] class SMALL_RECT(ctypes.Structure): _fields_ = [ ("Left", SHORT), ("Top", SHORT), ("Right", SHORT), ("Bottom", SHORT), ] class PCONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure): _fields_ = [ ("dwSize", COORD), ("dwCursorPosition", COORD), ("wAttributes", WORD), ("srWindow", SMALL_RECT), ("dwMaximumWindowSize", COORD), ] GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo GetConsoleScreenBufferInfo.argtypes = [ wintypes.HANDLE, ctypes.POINTER(PCONSOLE_SCREEN_BUFFER_INFO)] GetConsoleScreenBufferInfo.restype = wintypes.BOOL FOREGROUND_BLUE = 0x0001 FOREGROUND_GREEN = 0x0002 FOREGROUND_RED = 0x0004 FOREGROUND_INTENSITY = 0x0008 BACKGROUND_BLUE = 0x0010 BACKGROUND_GREEN = 0x0020 BACKGROUND_RED = 0x0040 BACKGROUND_RED = 0x0040 class COMMethod(object): def __init__(self, name, offset, restype, argtypes): self._name = name self._restype = restype self._offset = offset self._argtypes = argtypes def __get__(self, instance, owner): func = ctypes.WINFUNCTYPE( self._restype, *self._argtypes)(self._offset, self._name) def wrapper(self, *args, **kwargs): return func(self, *args, **kwargs) setattr(owner, self._name, wrapper) return getattr(instance or owner, self._name) class COMInterface(type(ctypes.c_void_p)): def __new__(mcls, cls_name, bases, d): offset = 0 for base in bases: for realbase in base.__mro__: offset += len(realbase.__dict__.get("_methods_", [])) for i, args in enumerate(d.get("_methods_", [])): name = args[0] restype = args[1] if restype is None: continue argtypes = args[2:] m = COMMethod(name, offset + i, restype, argtypes) d[name] = m return type(ctypes.c_void_p).__new__(mcls, cls_name, bases, dict(d)) @add_metaclass(COMInterface) class IUnknown(ctypes.c_void_p): IID = GUID("{00000001-0000-0000-c000-000000000046}") _methods_ = [ ("QueryInterface", HRESULT, LPGUID, wintypes.LPVOID), ("AddRef", wintypes.DWORD), ("Release", wintypes.DWORD), ] LPUNKNOWN = ctypes.POINTER(IUnknown) CoCreateInstance = windll.ole32.CoCreateInstance CoCreateInstance.argtypes = [REFCLSID, LPUNKNOWN, wintypes.DWORD, REFIID, wintypes.LPVOID] CoCreateInstance.restype = HRESULT class IShellLinkW(IUnknown): IID = GUID("{000214F9-0000-0000-C000-000000000046}") _methods_ = [ ("GetPath", HRESULT, wintypes.LPWSTR, wintypes.INT, LPWIN32_FIND_DATAW, wintypes.DWORD), ] class IPersist(IUnknown): IID = GUID("{0000010c-0000-0000-C000-000000000046}") _methods_ = [ ("GetClassID", HRESULT, LPGUID), ] class IPersistFile(IPersist): IID = GUID("{0000010b-0000-0000-c000-000000000046}") _methods_ = [ ("IsDirty", HRESULT), ("Load", HRESULT, wintypes.LPOLESTR, wintypes.DWORD), ] class ITEMIDLIST(ctypes.Structure): pass IBindCtx = ctypes.c_void_p ITEMIDLIST_ABSOLUTE = ITEMIDLIST ITEMIDLIST_RELATIVE = ITEMIDLIST PIDLIST_ABSOLUTE = ctypes.POINTER(ITEMIDLIST_ABSOLUTE) PCUIDLIST_RELATIVE = ctypes.POINTER(ITEMIDLIST_RELATIVE) PIDLIST_RELATIVE = ctypes.POINTER(ITEMIDLIST_RELATIVE) PCIDLIST_ABSOLUTE = ctypes.POINTER(ITEMIDLIST_ABSOLUTE) ITEMID_CHILD = ITEMIDLIST PCUITEMID_CHILD = ctypes.POINTER(ITEMID_CHILD) PCUITEMID_CHILD_ARRAY = ctypes.POINTER(PCUITEMID_CHILD) class IShellFolder(IUnknown): IID = GUID("{000214E6-0000-0000-C000-000000000046}") _methods_ = [ ("ParseDisplayName", HRESULT, wintypes.HWND, ctypes.POINTER(IBindCtx), wintypes.LPWSTR, ctypes.POINTER(wintypes.ULONG), ctypes.POINTER(PIDLIST_RELATIVE), ctypes.POINTER(wintypes.ULONG)), ("EnumObjects", None), ("BindToObject", HRESULT, PCUIDLIST_RELATIVE, ctypes.POINTER(IBindCtx), REFIID, ctypes.c_void_p), ] CLSID_ShellLink = GUID("{00021401-0000-0000-C000-000000000046}") SHGetDesktopFolder = oledll.shell32.SHGetDesktopFolder SHGetDesktopFolder.argtypes = [ctypes.POINTER(IShellFolder)] SHGetDesktopFolder.restype = HRESULT ILCombine = windll.shell32.ILCombine ILCombine.argtypes = [ctypes.c_void_p, ctypes.c_void_p] ILCombine.restype = ctypes.c_void_p ILCreateFromPathW = windll.shell32.ILCreateFromPathW ILCreateFromPathW.argtypes = [wintypes.LPCWSTR] ILCreateFromPathW.restype = PIDLIST_ABSOLUTE ILFree = windll.shell32.ILFree ILFree.argtypes = [PIDLIST_RELATIVE] ILFree.restype = None SHOpenFolderAndSelectItems = windll.shell32.SHOpenFolderAndSelectItems SHOpenFolderAndSelectItems.argtypes = [ PCIDLIST_ABSOLUTE, wintypes.UINT, PCUITEMID_CHILD_ARRAY, DWORD] SHOpenFolderAndSelectItems.restype = HRESULT SFGAOF = wintypes.ULONG SHParseDisplayName = windll.shell32.SHParseDisplayName SHParseDisplayName.argtypes = [ wintypes.LPCWSTR, ctypes.POINTER(IBindCtx), ctypes.POINTER(PIDLIST_ABSOLUTE), SFGAOF, ctypes.POINTER(SFGAOF)] SHParseDisplayName.restype = HRESULT @enum class FOLDERID(str): LINKS = "{bfb9d5e0-c6a9-404c-b2b2-ae6db6af4968}" @enum class SHGFPType(int): CURRENT = 0 DEFAULT = 1 @enum class CSIDL(int): DESKTOP = 0x0000 PERSONAL = 0x0005 APPDATA = 0x001A MYMUSIC = 0x000d PROFILE = 0x0028 @enum class CSIDLFlag(int): PER_USER_INIT = 0x0800 NO_ALIAS = 0x1000 DONT_UNEXPAND = 0x2000 DONT_VERIFY = 0x4000 CREATE = 0x8000 MASK = 0xFF00 @enum class KnownFolderFlag(long): SIMPLE_IDLIST = 0x00000100 NOT_PARENT_RELATIVE = 0x00000200 DEFAULT_PATH = 0x00000400 INIT = 0x00000800 NO_ALIAS = 0x00001000 DONT_UNEXPAND = 0x00002000 DONT_VERIFY = 0x00004000 CREATE = 0x00008000 NO_APPCONTAINER_REDIRECTION = 0x00010000 ALIAS_ONLY = 0x80000000 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/string/��������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020206� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/string/splitters.py��������������������������������������������������0000644�0001750�0001750�00000006673�13115500547�022635� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2009 Joe Wreschnig, Michael Urman, Steven Robertson # 2011-2013 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import re from quodlibet.util import re_escape def split_value(s, splitters=[u"/", u"&", u","]): """Splits a string. The first match in 'splitters' is used as the separator; subsequent matches are intentionally ignored. """ if not splitters: return [s.strip()] values = s.split("\n") for spl in splitters: spl = re.compile(r"\b\s*%s\s*\b" % re_escape(spl), re.UNICODE) if not list(filter(spl.search, values)): continue new_values = [] for v in values: new_values.extend([st.strip() for st in spl.split(v)]) return new_values return values def find_subtitle(title): if isinstance(title, bytes): title = title.decode('utf-8', 'replace') for pair in [u"[]", u"()", u"~~", u"--", u"\u301c\u301c", u'\uff08\uff09']: if pair[0] in title[:-1] and title.endswith(pair[1]): r = len(pair[1]) l = title[0:-r].rindex(pair[0]) if l != 0: subtitle = title[l + len(pair[0]):-r] title = title[:l] return title.rstrip(), subtitle else: return title, None def split_title(s, splitters=["/", "&", ","]): title, subtitle = find_subtitle(s) return ((title.strip(), split_value(subtitle, splitters)) if subtitle else (s, [])) __FEATURING = ["feat.", "featuring", "feat", "ft", "ft.", "with", "w/"] __ORIGINALLY = ["originally by ", " cover"] # Cache case-insensitive regex searches of the above __FEAT_REGEX = [re.compile(re_escape(s + " "), re.I) for s in __FEATURING] __ORIG_REGEX = [re.compile(re_escape(s), re.I) for s in __ORIGINALLY] def split_people(s, splitters=["/", "&", ","]): title, subtitle = find_subtitle(s) if not subtitle: parts = s.split(" ") if len(parts) > 2: for feat in __FEATURING: try: i = [p.lower() for p in parts].index(feat) orig = " ".join(parts[:i]) others = " ".join(parts[i + 1:]) return (orig, split_value(others, splitters)) except (ValueError, IndexError): pass return (s, []) else: old = subtitle # TODO: allow multiple substitutions across types, maybe for regex in (__FEAT_REGEX + __ORIG_REGEX): subtitle = re.sub(regex, "", subtitle, 1) if old != subtitle: # Only change once break values = split_value(subtitle, splitters) return (title.strip(), values) def split_album(s): name, disc = find_subtitle(s) if not disc: parts = s.split(" ") if len(parts) > 2: lower = parts[-2].lower() if "disc" in lower or "disk" in lower: return (" ".join(parts[:-2]), parts[-1]) return (s, None) else: parts = disc.split() if (len(parts) == 2 and parts[0].lower() in ["disc", "disk", "cd", "vol", "vol."]): try: return (name, parts[1]) except: return (s, None) else: return (s, None) ���������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/string/titlecase.py��������������������������������������������������0000644�0001750�0001750�00000006707�13112005742�022551� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 Javier Kohen # 2010,2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import unicodedata from quodlibet.compat import text_type, xrange # Cheat list for human title-casing in English. See Issue 424. ENGLISH_INCORRECTLY_CAPITALISED_WORDS = \ [u"The", u"An", u"A", u"'N'", u"'N", u"N'", u"Tha", u"De", u"Da", u"In", u"To", u"For", u"Up", u"With", u"As", u"At", u"From", u"Into", u"On", u"Out", #, u"Over", u"Of", u"By", u"'Til", u"Til", u"And", u"Or", u"Nor", # u"Is", u"Are", u"Am" ] # Allow basic sentence-like concepts eg "Artist: The Greatest Hits" ENGLISH_SENTENCE_ENDS = [".", ":", "-"] def iswbound(char): """Returns whether the given character is a word boundary.""" category = unicodedata.category(char) # If it's a space separator or punctuation return 'Zs' == category or 'Sk' == category or 'P' == category[0] def utitle(string): """Title-case a string using a less destructive method than str.title.""" new_string = string[0].capitalize() # It's possible we need to capitalise the second character... cap = iswbound(string[0]) for i in xrange(1, len(string)): s = string[i] prev = string[i - 1] # Special case apostrophe in the middle of a word. # Also, extra case to deal with Irish-style names (eg O'Conner) if u"'" == s \ and string[i - 1].isalpha() \ and not (i > 1 and string[i - 2].isspace() and prev.lower() == u"o"): cap = False elif iswbound(s): cap = True elif cap and s.isalpha(): cap = False s = s.capitalize() else: cap = False new_string += s return new_string def title(string, locale="utf-8"): """Title-case a string using a less destructive method than str.title.""" if not string: return u"" # if the string is all uppercase, lowercase it - Erich/Javier # Lots of Japanese songs use entirely upper-case English titles, # so I don't like this change... - JoeW #if string == string.upper(): string = string.lower() if not isinstance(string, text_type): string = string.decode(locale) return utitle(string) def _humanise(text): """Reverts a title-cased string to a more natural (English) title-casing. Intended for use after util.title() only""" def previous_real_word(ws, idx): """Returns the first non-null word from words before position `idx`""" while idx > 0: idx -= 1 if ws[idx] != "": break return ws[idx] words = text.split(" ") # Yes: to preserve double spacing (!) for i in xrange(1, len(words) - 1): word = words[i] if word in ENGLISH_INCORRECTLY_CAPITALISED_WORDS: prev = previous_real_word(words, i) # Add an exception for would-be ellipses... if (prev and (not prev[-1] in ENGLISH_SENTENCE_ENDS or prev[-3:] == '...')): words[i] = word.lower() return u" ".join(words) def human_title(text): """Returns a human title-cased string, using a more natural (English) title-casing e.g. Dark night OF the Soul -> Dark Night of the Soul.""" return _humanise(title(text)) ���������������������������������������������������������quodlibet-3.9.1/quodlibet/util/string/__init__.py���������������������������������������������������0000644�0001750�0001750�00000006331�13112005742�022324� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2009 Joe Wreschnig, Michael Urman, Steven Robertson # 2011,2013 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.compat import text_type, iterbytes def isascii(string): """Returns if the passed str/unicode is an ascii encoded string or unicode string containing only ascii code points. """ try: if isinstance(string, bytes): string.decode("ascii") else: string.encode("ascii") except UnicodeError: return False return True def decode(s, charset="utf-8"): """Decode a string; if an error occurs, replace characters and append a note to the string.""" try: return s.decode(charset) except UnicodeError: from quodlibet import _ return s.decode(charset, "replace") + " " + _("[Invalid Encoding]") def encode(s, charset="utf-8"): """Encode a string; if an error occurs, replace characters and append a note to the string.""" try: return s.encode(charset) except UnicodeError: from quodlibet import _ return (s + " " + _("[Invalid Encoding]")).encode(charset, "replace") def split_escape(string, sep, maxsplit=None, escape_char="\\"): """Like unicode/str/bytes.split but allows for the separator to be escaped If passed unicode/str/bytes will only return list of unicode/str/bytes. """ assert len(sep) == 1 assert len(escape_char) == 1 if isinstance(string, bytes): if isinstance(escape_char, text_type): escape_char = escape_char.encode("ascii") iter_ = iterbytes else: iter_ = iter if maxsplit is None: maxsplit = len(string) empty = string[:0] result = [] current = empty escaped = False for char in iter_(string): if escaped: if char != escape_char and char != sep: current += escape_char current += char escaped = False else: if char == escape_char: escaped = True elif char == sep and len(result) < maxsplit: result.append(current) current = empty else: current += char result.append(current) return result def join_escape(values, sep, escape_char="\\"): """Join bytes/unicode so that it can be split with split_escape. In case values is empty, the result has the type of `sep`. otherwise it has the type of values. Be aware that split_escape(join_escape([])) will result in ['']. """ assert len(sep) == 1 assert len(escape_char) == 1 # don't allow auto decoding of 'values' if values and isinstance(values[0], bytes): if isinstance(escape_char, text_type): escape_char = escape_char.encode("ascii") assert not isinstance(sep, text_type) escaped = [] for value in values: value = value.replace(escape_char, escape_char + escape_char) value = value.replace(sep, escape_char + sep) escaped.append(value) return sep.join(escaped) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/thumbnails.py��������������������������������������������������������0000644�0001750�0001750�00000012032�13112005742�021420� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2009-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import tempfile import hashlib from gi.repository import GdkPixbuf, GLib from senf import fsn2uri, fsnative import quodlibet from quodlibet.util.path import mtime, mkdir, xdg_get_cache_home from quodlibet.util import enum from quodlibet.qltk.image import scale def get_thumbnail_folder(): """Returns a path to the thumbnail folder. The returned path might not exist. """ if os.name == "nt": thumb_folder = os.path.join(quodlibet.get_user_dir(), "thumbnails") else: cache_folder = os.path.join(xdg_get_cache_home(), "thumbnails") thumb_folder = os.path.expanduser('~/.thumbnails') if os.path.exists(cache_folder) or not os.path.exists(thumb_folder): thumb_folder = cache_folder return thumb_folder @enum class ThumbSize(int): NORMAL = 128 LARGE = 256 LARGEST = LARGE def get_cache_info(path, boundary): """For an image at `path` return (cache_path, thumb_size) cache_path points to a potential cache file thumb size is either 128 or 256 """ assert isinstance(path, fsnative) width, height = boundary if width <= ThumbSize.NORMAL and height <= ThumbSize.NORMAL: size_name = "normal" thumb_size = ThumbSize.NORMAL else: size_name = "large" thumb_size = ThumbSize.LARGE thumb_folder = get_thumbnail_folder() cache_dir = os.path.join(thumb_folder, size_name) uri = fsn2uri(path) thumb_name = hashlib.md5(uri.encode("ascii")).hexdigest() + ".png" thumb_path = os.path.join(cache_dir, thumb_name) return (thumb_path, thumb_size) def get_thumbnail_from_file(fileobj, boundary): """Like get_thumbnail() but works with files that can't be reopened. This is needed on Windows where NamedTemporaryFile can't be reopened. Returns Pixbuf or None. Thread-safe. """ assert fileobj try: path = fileobj.name assert isinstance(path, fsnative), path return get_thumbnail(path, boundary) except GLib.GError: try: loader = GdkPixbuf.PixbufLoader() loader.set_size(*boundary) loader.write(fileobj.read()) loader.close() fileobj.seek(0, 0) # can return None in case of partial data return loader.get_pixbuf() except (GLib.GError, EnvironmentError): pass def get_thumbnail(path, boundary): """Get a thumbnail pixbuf of an image at `path`. Will create/use a thumbnail in the user's thumbnail directory if possible. Follows the Free Desktop specification: http://specifications.freedesktop.org/thumbnail-spec/ Can raise GLib.GError. Thread-safe. """ assert isinstance(path, fsnative) width, height = boundary new_from_file_at_size = GdkPixbuf.Pixbuf.new_from_file_at_size # larger than thumbnails, load directly if width > ThumbSize.LARGEST or height > ThumbSize.LARGEST: return new_from_file_at_size(path, width, height) path_mtime = mtime(path) if path_mtime == 0: return new_from_file_at_size(path, width, height) # embedded thumbnails come from /tmp/ # FIXME: move this to another layer if path.startswith(tempfile.gettempdir()): return new_from_file_at_size(path, width, height) thumb_path, thumb_size = get_cache_info(path, boundary) cache_dir = os.path.dirname(thumb_path) try: mkdir(cache_dir, 0o700) except OSError: return new_from_file_at_size(path, width, height) try: pb = new_from_file_at_size(thumb_path, width, height) except GLib.GError: # in case it fails to load, we recreate it pass else: meta_mtime = pb.get_option("tEXt::Thumb::MTime") if meta_mtime is not None: try: meta_mtime = int(meta_mtime) except ValueError: pass else: if meta_mtime == int(path_mtime): return pb info, pw, ph = GdkPixbuf.Pixbuf.get_file_info(path) # Too small picture, no thumbnail needed if pw < thumb_size and ph < thumb_size: return new_from_file_at_size(path, width, height) thumb_pb = new_from_file_at_size(path, thumb_size, thumb_size) uri = fsn2uri(path) mime = info.get_mime_types()[0] options = { "tEXt::Thumb::Image::Width": str(pw), "tEXt::Thumb::Image::Height": str(ph), "tEXt::Thumb::URI": uri, "tEXt::Thumb::MTime": str(int(path_mtime)), "tEXt::Thumb::Size": str(os.path.getsize(path)), "tEXt::Thumb::Mimetype": mime, "tEXt::Software": "QuodLibet" } thumb_pb.savev( thumb_path, "png", list(options.keys()), list(options.values())) try: os.chmod(thumb_path, 0o600) except OSError: pass return scale(thumb_pb, boundary) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/enum.py��������������������������������������������������������������0000644�0001750�0001750�00000003012�13112005742�020214� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.compat import iteritems def enum(cls): """Class decorator for enum types:: @enum class SomeEnum(int): FOO = 0 BAR = 1 Result is an int subclass and all attributes are instances of it. Each subclass has a property `values` referring to *all* known instances. """ type_ = cls.__bases__[0] d = dict(cls.__dict__) new_type = type(cls.__name__, (type_,), d) new_type.__module__ = cls.__module__ map_ = {} for key, value in iteritems(d): if key.upper() == key: value_instance = new_type(value) setattr(new_type, key, value_instance) map_[value] = key new_type.values = set(map_.keys()) def value_of(cls, s, default=None): for v in cls.values: if v == s: return v if default is not None: return default raise ValueError("Can't find %s (try %s)" % (s, cls.values)) new_type.value_of = classmethod(value_of) def repr_(self): name = type(self).__name__ try: return "%s.%s" % (name, map_[self]) except KeyError: return "%s(%s)" % (name, self) setattr(new_type, "__repr__", repr_) return new_type ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/iso639.py������������������������������������������������������������0000644�0001750�0001750�00000051406�13112005742�020316� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from .i18n import register_translation # Based on https://pkg-isocodes.alioth.debian.org/ # which is licensed under LGPL-2.1+ # Generated using _print_iso_639() (see below) _ISO_639 = [ ('Afar', 'aa', 'aar', ''), ('Abkhazian', 'ab', 'abk', ''), ('Achinese', '', 'ace', ''), ('Acoli', '', 'ach', ''), ('Adangme', '', 'ada', ''), ('Adyghe; Adygei', '', 'ady', ''), ('Afro-Asiatic languages', '', 'afa', ''), ('Afrihili', '', 'afh', ''), ('Afrikaans', 'af', 'afr', ''), ('Ainu', '', 'ain', ''), ('Akan', 'ak', 'aka', ''), ('Akkadian', '', 'akk', ''), ('Albanian', 'sq', 'alb', 'sqi'), ('Aleut', '', 'ale', ''), ('Algonquian languages', '', 'alg', ''), ('Southern Altai', '', 'alt', ''), ('Amharic', 'am', 'amh', ''), ('English, Old (ca. 450-1100)', '', 'ang', ''), ('Angika', '', 'anp', ''), ('Apache languages', '', 'apa', ''), ('Arabic', 'ar', 'ara', ''), ('Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)', '', 'arc', ''), ('Aragonese', 'an', 'arg', ''), ('Armenian', 'hy', 'arm', 'hye'), ('Mapudungun; Mapuche', '', 'arn', ''), ('Arapaho', '', 'arp', ''), ('Artificial languages', '', 'art', ''), ('Arawak', '', 'arw', ''), ('Assamese', 'as', 'asm', ''), ('Asturian; Bable; Leonese; Asturleonese', '', 'ast', ''), ('Athapascan languages', '', 'ath', ''), ('Australian languages', '', 'aus', ''), ('Avaric', 'av', 'ava', ''), ('Avestan', 'ae', 'ave', ''), ('Awadhi', '', 'awa', ''), ('Aymara', 'ay', 'aym', ''), ('Azerbaijani', 'az', 'aze', ''), ('Banda languages', '', 'bad', ''), ('Bamileke languages', '', 'bai', ''), ('Bashkir', 'ba', 'bak', ''), ('Baluchi', '', 'bal', ''), ('Bambara', 'bm', 'bam', ''), ('Balinese', '', 'ban', ''), ('Basque', 'eu', 'baq', 'eus'), ('Basa', '', 'bas', ''), ('Baltic languages', '', 'bat', ''), ('Beja; Bedawiyet', '', 'bej', ''), ('Belarusian', 'be', 'bel', ''), ('Bemba', '', 'bem', ''), ('Bengali', 'bn', 'ben', ''), ('Berber languages', '', 'ber', ''), ('Bhojpuri', '', 'bho', ''), ('Bihari languages', 'bh', 'bih', ''), ('Bikol', '', 'bik', ''), ('Bini; Edo', '', 'bin', ''), ('Bislama', 'bi', 'bis', ''), ('Siksika', '', 'bla', ''), ('Bantu languages', '', 'bnt', ''), ('Bosnian', 'bs', 'bos', ''), ('Braj', '', 'bra', ''), ('Breton', 'br', 'bre', ''), ('Batak languages', '', 'btk', ''), ('Buriat', '', 'bua', ''), ('Buginese', '', 'bug', ''), ('Bulgarian', 'bg', 'bul', ''), ('Burmese', 'my', 'bur', 'mya'), ('Blin; Bilin', '', 'byn', ''), ('Caddo', '', 'cad', ''), ('Central American Indian languages', '', 'cai', ''), ('Galibi Carib', '', 'car', ''), ('Catalan; Valencian', 'ca', 'cat', ''), ('Caucasian languages', '', 'cau', ''), ('Cebuano', '', 'ceb', ''), ('Celtic languages', '', 'cel', ''), ('Chamorro', 'ch', 'cha', ''), ('Chibcha', '', 'chb', ''), ('Chechen', 'ce', 'che', ''), ('Chagatai', '', 'chg', ''), ('Chinese', 'zh', 'chi', 'zho'), ('Chuukese', '', 'chk', ''), ('Mari', '', 'chm', ''), ('Chinook jargon', '', 'chn', ''), ('Choctaw', '', 'cho', ''), ('Chipewyan; Dene Suline', '', 'chp', ''), ('Cherokee', '', 'chr', ''), ('Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; ' 'Old Church Slavonic', 'cu', 'chu', ''), ('Chuvash', 'cv', 'chv', ''), ('Cheyenne', '', 'chy', ''), ('Chamic languages', '', 'cmc', ''), ('Coptic', '', 'cop', ''), ('Cornish', 'kw', 'cor', ''), ('Corsican', 'co', 'cos', ''), ('Creoles and pidgins, English based', '', 'cpe', ''), ('Creoles and pidgins, French-based', '', 'cpf', ''), ('Creoles and pidgins, Portuguese-based', '', 'cpp', ''), ('Cree', 'cr', 'cre', ''), ('Crimean Tatar; Crimean Turkish', '', 'crh', ''), ('Creoles and pidgins', '', 'crp', ''), ('Kashubian', '', 'csb', ''), ('Cushitic languages', '', 'cus', ''), ('Czech', 'cs', 'cze', 'ces'), ('Dakota', '', 'dak', ''), ('Danish', 'da', 'dan', ''), ('Dargwa', '', 'dar', ''), ('Land Dayak languages', '', 'day', ''), ('Delaware', '', 'del', ''), ('Slave (Athapascan)', '', 'den', ''), ('Dogrib', '', 'dgr', ''), ('Dinka', '', 'din', ''), ('Divehi; Dhivehi; Maldivian', 'dv', 'div', ''), ('Dogri', '', 'doi', ''), ('Dravidian languages', '', 'dra', ''), ('Lower Sorbian', '', 'dsb', ''), ('Duala', '', 'dua', ''), ('Dutch, Middle (ca. 1050-1350)', '', 'dum', ''), ('Dutch; Flemish', 'nl', 'dut', 'nld'), ('Dyula', '', 'dyu', ''), ('Dzongkha', 'dz', 'dzo', ''), ('Efik', '', 'efi', ''), ('Egyptian (Ancient)', '', 'egy', ''), ('Ekajuk', '', 'eka', ''), ('Elamite', '', 'elx', ''), ('English', 'en', 'eng', ''), ('English, Middle (1100-1500)', '', 'enm', ''), ('Esperanto', 'eo', 'epo', ''), ('Estonian', 'et', 'est', ''), ('Ewe', 'ee', 'ewe', ''), ('Ewondo', '', 'ewo', ''), ('Fang', '', 'fan', ''), ('Faroese', 'fo', 'fao', ''), ('Fanti', '', 'fat', ''), ('Fijian', 'fj', 'fij', ''), ('Filipino; Pilipino', '', 'fil', ''), ('Finnish', 'fi', 'fin', ''), ('Finno-Ugrian languages', '', 'fiu', ''), ('Fon', '', 'fon', ''), ('French', 'fr', 'fre', 'fra'), ('French, Middle (ca. 1400-1600)', '', 'frm', ''), ('French, Old (842-ca. 1400)', '', 'fro', ''), ('Northern Frisian', '', 'frr', ''), ('Eastern Frisian', '', 'frs', ''), ('Western Frisian', 'fy', 'fry', ''), ('Fulah', 'ff', 'ful', ''), ('Friulian', '', 'fur', ''), ('Ga', '', 'gaa', ''), ('Gayo', '', 'gay', ''), ('Gbaya', '', 'gba', ''), ('Germanic languages', '', 'gem', ''), ('Georgian', 'ka', 'geo', 'kat'), ('German', 'de', 'ger', 'deu'), ('Geez', '', 'gez', ''), ('Gilbertese', '', 'gil', ''), ('Gaelic; Scottish Gaelic', 'gd', 'gla', ''), ('Irish', 'ga', 'gle', ''), ('Galician', 'gl', 'glg', ''), ('Manx', 'gv', 'glv', ''), ('German, Middle High (ca. 1050-1500)', '', 'gmh', ''), ('German, Old High (ca. 750-1050)', '', 'goh', ''), ('Gondi', '', 'gon', ''), ('Gorontalo', '', 'gor', ''), ('Gothic', '', 'got', ''), ('Grebo', '', 'grb', ''), ('Greek, Ancient (to 1453)', '', 'grc', ''), ('Greek, Modern (1453-)', 'el', 'gre', 'ell'), ('Guarani', 'gn', 'grn', ''), ('Swiss German; Alemannic; Alsatian', '', 'gsw', ''), ('Gujarati', 'gu', 'guj', ''), ("Gwich'in", '', 'gwi', ''), ('Haida', '', 'hai', ''), ('Haitian; Haitian Creole', 'ht', 'hat', ''), ('Hausa', 'ha', 'hau', ''), ('Hawaiian', '', 'haw', ''), ('Hebrew', 'he', 'heb', ''), ('Herero', 'hz', 'her', ''), ('Hiligaynon', '', 'hil', ''), ('Himachali languages; Western Pahari languages', '', 'him', ''), ('Hindi', 'hi', 'hin', ''), ('Hittite', '', 'hit', ''), ('Hmong; Mong', '', 'hmn', ''), ('Hiri Motu', 'ho', 'hmo', ''), ('Croatian', 'hr', 'hrv', ''), ('Upper Sorbian', '', 'hsb', ''), ('Hungarian', 'hu', 'hun', ''), ('Hupa', '', 'hup', ''), ('Iban', '', 'iba', ''), ('Igbo', 'ig', 'ibo', ''), ('Icelandic', 'is', 'ice', 'isl'), ('Ido', 'io', 'ido', ''), ('Sichuan Yi; Nuosu', 'ii', 'iii', ''), ('Ijo languages', '', 'ijo', ''), ('Inuktitut', 'iu', 'iku', ''), ('Interlingue; Occidental', 'ie', 'ile', ''), ('Iloko', '', 'ilo', ''), ('Interlingua (International Auxiliary Language Association)', 'ia', 'ina', ''), ('Indic languages', '', 'inc', ''), ('Indonesian', 'id', 'ind', ''), ('Indo-European languages', '', 'ine', ''), ('Ingush', '', 'inh', ''), ('Inupiaq', 'ik', 'ipk', ''), ('Iranian languages', '', 'ira', ''), ('Iroquoian languages', '', 'iro', ''), ('Italian', 'it', 'ita', ''), ('Javanese', 'jv', 'jav', ''), ('Lojban', '', 'jbo', ''), ('Japanese', 'ja', 'jpn', ''), ('Judeo-Persian', '', 'jpr', ''), ('Judeo-Arabic', '', 'jrb', ''), ('Kara-Kalpak', '', 'kaa', ''), ('Kabyle', '', 'kab', ''), ('Kachin; Jingpho', '', 'kac', ''), ('Kalaallisut; Greenlandic', 'kl', 'kal', ''), ('Kamba', '', 'kam', ''), ('Kannada', 'kn', 'kan', ''), ('Karen languages', '', 'kar', ''), ('Kashmiri', 'ks', 'kas', ''), ('Kanuri', 'kr', 'kau', ''), ('Kawi', '', 'kaw', ''), ('Kazakh', 'kk', 'kaz', ''), ('Kabardian', '', 'kbd', ''), ('Khasi', '', 'kha', ''), ('Khoisan languages', '', 'khi', ''), ('Central Khmer', 'km', 'khm', ''), ('Khotanese;Sakan', '', 'kho', ''), ('Kikuyu; Gikuyu', 'ki', 'kik', ''), ('Kinyarwanda', 'rw', 'kin', ''), ('Kirghiz; Kyrgyz', 'ky', 'kir', ''), ('Kimbundu', '', 'kmb', ''), ('Konkani', '', 'kok', ''), ('Komi', 'kv', 'kom', ''), ('Kongo', 'kg', 'kon', ''), ('Korean', 'ko', 'kor', ''), ('Kosraean', '', 'kos', ''), ('Kpelle', '', 'kpe', ''), ('Karachay-Balkar', '', 'krc', ''), ('Karelian', '', 'krl', ''), ('Kru languages', '', 'kro', ''), ('Kurukh', '', 'kru', ''), ('Kuanyama; Kwanyama', 'kj', 'kua', ''), ('Kumyk', '', 'kum', ''), ('Kurdish', 'ku', 'kur', ''), ('Kutenai', '', 'kut', ''), ('Ladino', '', 'lad', ''), ('Lahnda', '', 'lah', ''), ('Lamba', '', 'lam', ''), ('Lao', 'lo', 'lao', ''), ('Latin', 'la', 'lat', ''), ('Latvian', 'lv', 'lav', ''), ('Lezghian', '', 'lez', ''), ('Limburgan; Limburger; Limburgish', 'li', 'lim', ''), ('Lingala', 'ln', 'lin', ''), ('Lithuanian', 'lt', 'lit', ''), ('Mongo', '', 'lol', ''), ('Lozi', '', 'loz', ''), ('Luxembourgish; Letzeburgesch', 'lb', 'ltz', ''), ('Luba-Lulua', '', 'lua', ''), ('Luba-Katanga', 'lu', 'lub', ''), ('Ganda', 'lg', 'lug', ''), ('Luiseno', '', 'lui', ''), ('Lunda', '', 'lun', ''), ('Luo (Kenya and Tanzania)', '', 'luo', ''), ('Lushai', '', 'lus', ''), ('Macedonian', 'mk', 'mac', 'mkd'), ('Madurese', '', 'mad', ''), ('Magahi', '', 'mag', ''), ('Marshallese', 'mh', 'mah', ''), ('Maithili', '', 'mai', ''), ('Makasar', '', 'mak', ''), ('Malayalam', 'ml', 'mal', ''), ('Mandingo', '', 'man', ''), ('Maori', 'mi', 'mao', 'mri'), ('Austronesian languages', '', 'map', ''), ('Marathi', 'mr', 'mar', ''), ('Masai', '', 'mas', ''), ('Malay', 'ms', 'may', 'msa'), ('Moksha', '', 'mdf', ''), ('Mandar', '', 'mdr', ''), ('Mende', '', 'men', ''), ('Irish, Middle (900-1200)', '', 'mga', ''), ("Mi'kmaq; Micmac", '', 'mic', ''), ('Minangkabau', '', 'min', ''), ('Uncoded languages', '', 'mis', ''), ('Mon-Khmer languages', '', 'mkh', ''), ('Malagasy', 'mg', 'mlg', ''), ('Maltese', 'mt', 'mlt', ''), ('Manchu', '', 'mnc', ''), ('Manipuri', '', 'mni', ''), ('Manobo languages', '', 'mno', ''), ('Mohawk', '', 'moh', ''), ('Moldavian; Moldovan', 'mo', 'mol', ''), ('Mongolian', 'mn', 'mon', ''), ('Mossi', '', 'mos', ''), ('Multiple languages', '', 'mul', ''), ('Munda languages', '', 'mun', ''), ('Creek', '', 'mus', ''), ('Mirandese', '', 'mwl', ''), ('Marwari', '', 'mwr', ''), ('Mayan languages', '', 'myn', ''), ('Erzya', '', 'myv', ''), ('Nahuatl languages', '', 'nah', ''), ('North American Indian languages', '', 'nai', ''), ('Neapolitan', '', 'nap', ''), ('Nauru', 'na', 'nau', ''), ('Navajo; Navaho', 'nv', 'nav', ''), ('Ndebele, South; South Ndebele', 'nr', 'nbl', ''), ('Ndebele, North; North Ndebele', 'nd', 'nde', ''), ('Ndonga', 'ng', 'ndo', ''), ('Low German; Low Saxon; German, Low; Saxon, Low', '', 'nds', ''), ('Nepali', 'ne', 'nep', ''), ('Nepal Bhasa; Newari', '', 'new', ''), ('Nias', '', 'nia', ''), ('Niger-Kordofanian languages', '', 'nic', ''), ('Niuean', '', 'niu', ''), ('Norwegian Nynorsk; Nynorsk, Norwegian', 'nn', 'nno', ''), (u'Bokm\xe5l, Norwegian; Norwegian Bokm\xe5l', 'nb', 'nob', ''), ('Nogai', '', 'nog', ''), ('Norse, Old', '', 'non', ''), ('Norwegian', 'no', 'nor', ''), ("N'Ko", '', 'nqo', ''), ('Pedi; Sepedi; Northern Sotho', '', 'nso', ''), ('Nubian languages', '', 'nub', ''), ('Classical Newari; Old Newari; Classical Nepal Bhasa', '', 'nwc', ''), ('Chichewa; Chewa; Nyanja', 'ny', 'nya', ''), ('Nyamwezi', '', 'nym', ''), ('Nyankole', '', 'nyn', ''), ('Nyoro', '', 'nyo', ''), ('Nzima', '', 'nzi', ''), ('Occitan (post 1500)', 'oc', 'oci', ''), ('Ojibwa', 'oj', 'oji', ''), ('Oriya', 'or', 'ori', ''), ('Oromo', 'om', 'orm', ''), ('Osage', '', 'osa', ''), ('Ossetian; Ossetic', 'os', 'oss', ''), ('Turkish, Ottoman (1500-1928)', '', 'ota', ''), ('Otomian languages', '', 'oto', ''), ('Papuan languages', '', 'paa', ''), ('Pangasinan', '', 'pag', ''), ('Pahlavi', '', 'pal', ''), ('Pampanga; Kapampangan', '', 'pam', ''), ('Panjabi; Punjabi', 'pa', 'pan', ''), ('Papiamento', '', 'pap', ''), ('Palauan', '', 'pau', ''), ('Persian, Old (ca. 600-400 B.C.)', '', 'peo', ''), ('Persian', 'fa', 'per', 'fas'), ('Philippine languages', '', 'phi', ''), ('Phoenician', '', 'phn', ''), ('Pali', 'pi', 'pli', ''), ('Polish', 'pl', 'pol', ''), ('Pohnpeian', '', 'pon', ''), ('Portuguese', 'pt', 'por', ''), ('Prakrit languages', '', 'pra', ''), (u'Proven\xe7al, Old (to 1500); Occitan, Old (to 1500)', '', 'pro', ''), ('Pushto; Pashto', 'ps', 'pus', ''), ('Reserved for local use', '', 'qaa-qtz', ''), ('Quechua', 'qu', 'que', ''), ('Rajasthani', '', 'raj', ''), ('Rapanui', '', 'rap', ''), ('Rarotongan; Cook Islands Maori', '', 'rar', ''), ('Romance languages', '', 'roa', ''), ('Romansh', 'rm', 'roh', ''), ('Romany', '', 'rom', ''), ('Romanian', 'ro', 'rum', 'ron'), ('Rundi', 'rn', 'run', ''), ('Aromanian; Arumanian; Macedo-Romanian', '', 'rup', ''), ('Russian', 'ru', 'rus', ''), ('Sandawe', '', 'sad', ''), ('Sango', 'sg', 'sag', ''), ('Yakut', '', 'sah', ''), ('South American Indian languages', '', 'sai', ''), ('Salishan languages', '', 'sal', ''), ('Samaritan Aramaic', '', 'sam', ''), ('Sanskrit', 'sa', 'san', ''), ('Sasak', '', 'sas', ''), ('Santali', '', 'sat', ''), ('Sicilian', '', 'scn', ''), ('Scots', '', 'sco', ''), ('Selkup', '', 'sel', ''), ('Semitic languages', '', 'sem', ''), ('Irish, Old (to 900)', '', 'sga', ''), ('Sign Languages', '', 'sgn', ''), ('Shan', '', 'shn', ''), ('Sidamo', '', 'sid', ''), ('Sinhala; Sinhalese', 'si', 'sin', ''), ('Siouan languages', '', 'sio', ''), ('Sino-Tibetan languages', '', 'sit', ''), ('Slavic languages', '', 'sla', ''), ('Slovak', 'sk', 'slo', 'slk'), ('Slovenian', 'sl', 'slv', ''), ('Southern Sami', '', 'sma', ''), ('Northern Sami', 'se', 'sme', ''), ('Sami languages', '', 'smi', ''), ('Lule Sami', '', 'smj', ''), ('Inari Sami', '', 'smn', ''), ('Samoan', 'sm', 'smo', ''), ('Skolt Sami', '', 'sms', ''), ('Shona', 'sn', 'sna', ''), ('Sindhi', 'sd', 'snd', ''), ('Soninke', '', 'snk', ''), ('Sogdian', '', 'sog', ''), ('Somali', 'so', 'som', ''), ('Songhai languages', '', 'son', ''), ('Sotho, Southern', 'st', 'sot', ''), ('Spanish; Castilian', 'es', 'spa', ''), ('Sardinian', 'sc', 'srd', ''), ('Sranan Tongo', '', 'srn', ''), ('Serbian', 'sr', 'srp', ''), ('Serer', '', 'srr', ''), ('Nilo-Saharan languages', '', 'ssa', ''), ('Swati', 'ss', 'ssw', ''), ('Sukuma', '', 'suk', ''), ('Sundanese', 'su', 'sun', ''), ('Susu', '', 'sus', ''), ('Sumerian', '', 'sux', ''), ('Swahili', 'sw', 'swa', ''), ('Swedish', 'sv', 'swe', ''), ('Classical Syriac', '', 'syc', ''), ('Syriac', '', 'syr', ''), ('Tahitian', 'ty', 'tah', ''), ('Tai languages', '', 'tai', ''), ('Tamil', 'ta', 'tam', ''), ('Tatar', 'tt', 'tat', ''), ('Telugu', 'te', 'tel', ''), ('Timne', '', 'tem', ''), ('Tereno', '', 'ter', ''), ('Tetum', '', 'tet', ''), ('Tajik', 'tg', 'tgk', ''), ('Tagalog', 'tl', 'tgl', ''), ('Thai', 'th', 'tha', ''), ('Tibetan', 'bo', 'tib', 'bod'), ('Tigre', '', 'tig', ''), ('Tigrinya', 'ti', 'tir', ''), ('Tiv', '', 'tiv', ''), ('Tokelau', '', 'tkl', ''), ('Klingon; tlhIngan-Hol', '', 'tlh', ''), ('Tlingit', '', 'tli', ''), ('Tamashek', '', 'tmh', ''), ('Tonga (Nyasa)', '', 'tog', ''), ('Tonga (Tonga Islands)', 'to', 'ton', ''), ('Tok Pisin', '', 'tpi', ''), ('Tsimshian', '', 'tsi', ''), ('Tswana', 'tn', 'tsn', ''), ('Tsonga', 'ts', 'tso', ''), ('Turkmen', 'tk', 'tuk', ''), ('Tumbuka', '', 'tum', ''), ('Tupi languages', '', 'tup', ''), ('Turkish', 'tr', 'tur', ''), ('Altaic languages', '', 'tut', ''), ('Tuvalu', '', 'tvl', ''), ('Twi', 'tw', 'twi', ''), ('Tuvinian', '', 'tyv', ''), ('Udmurt', '', 'udm', ''), ('Ugaritic', '', 'uga', ''), ('Uighur; Uyghur', 'ug', 'uig', ''), ('Ukrainian', 'uk', 'ukr', ''), ('Umbundu', '', 'umb', ''), ('Undetermined', '', 'und', ''), ('Urdu', 'ur', 'urd', ''), ('Uzbek', 'uz', 'uzb', ''), ('Vai', '', 'vai', ''), ('Venda', 've', 'ven', ''), ('Vietnamese', 'vi', 'vie', ''), (u'Volap\xfck', 'vo', 'vol', ''), ('Votic', '', 'vot', ''), ('Wakashan languages', '', 'wak', ''), ('Wolaitta; Wolaytta', '', 'wal', ''), ('Waray', '', 'war', ''), ('Washo', '', 'was', ''), ('Welsh', 'cy', 'wel', 'cym'), ('Sorbian languages', '', 'wen', ''), ('Walloon', 'wa', 'wln', ''), ('Wolof', 'wo', 'wol', ''), ('Kalmyk; Oirat', '', 'xal', ''), ('Xhosa', 'xh', 'xho', ''), ('Yao', '', 'yao', ''), ('Yapese', '', 'yap', ''), ('Yiddish', 'yi', 'yid', ''), ('Yoruba', 'yo', 'yor', ''), ('Yupik languages', '', 'ypk', ''), ('Zapotec', '', 'zap', ''), ('Blissymbols; Blissymbolics; Bliss', '', 'zbl', ''), ('Zenaga', '', 'zen', ''), ('Standard Moroccan Tamazight', '', 'zgh', ''), ('Zhuang; Chuang', 'za', 'zha', ''), ('Zande languages', '', 'znd', ''), ('Zulu', 'zu', 'zul', ''), ('Zuni', '', 'zun', ''), ('No linguistic content; Not applicable', '', 'zxx', ''), ('Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki', '', 'zza', ''), ] _ISO_639_1 = {} _ISO_639_2 = {} _LOWER = {} def _fill_mappings(): for entry in _ISO_639: name, _1, _2B, _2T = entry _LOWER[name.lower()] = name if _1: _ISO_639_1[_1] = entry _ISO_639_2[_2B] = entry if _2T: _ISO_639_2[_2T] = entry _fill_mappings() ISO_639_2 = _ISO_639_2.keys() def _gettext(name, cache=[]): if not cache: t = register_translation("iso_639") cache.append(lambda s: t.wrap_text(t.gettext(s))) return cache[0](name) def get_name(iso_code): """Returns the English name for the iso_639_1/2 code or an empty string if the code is not known. """ if iso_code in _ISO_639_1: return _ISO_639_1[iso_code][0] elif iso_code in _ISO_639_2: return _ISO_639_2[iso_code][0] return u"" def translate(text): """Given an iso code or a name tries to return a translated version for the current locale. If no translation is found returns an empty string. """ # try to convert iso codes to English names and then translate name = get_name(text) if name: return _gettext(name) else: # not an iso code, try to match with the English name. # If all fails just return the original input lower = text.lower() if lower in _LOWER: return _gettext(_LOWER[lower]) return u"" def _print_iso_639(): """Prints the _ISO_639 list from above based on iso_639.xml. Maybe depend on the xml at runtime? """ import os import pprint from xml.etree import cElementTree as ET from .path import xdg_get_system_data_dirs entries = [] for data_dir in xdg_get_system_data_dirs(): iso_path = os.path.join(data_dir, "xml", "iso-codes", "iso_639.xml") if os.path.exists(iso_path): tree = ET.ElementTree(file=iso_path) for elm in tree.iterfind("iso_639_entry"): iso_639_1_code = elm.attrib.get("iso_639_1_code", "") iso_639_2B_code = elm.attrib["iso_639_2B_code"] iso_639_2T_code = elm.attrib["iso_639_2T_code"] if iso_639_2B_code == iso_639_2T_code: iso_639_2T_code = "" name = elm.attrib["name"] entries.append( (name, iso_639_1_code, iso_639_2B_code, iso_639_2T_code)) break else: raise Exception("iso_639.xml not found") pprint.pprint(entries) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/json_data.py���������������������������������������������������������0000644�0001750�0001750�00000011374�13112005742�021224� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012-2013 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import import json from collections import namedtuple from quodlibet.util.dprint import print_d, print_w from quodlibet.util.misc import total_ordering from quodlibet.compat import PY3 @total_ordering class JSONObject(object): """ Base class for simple, named data objects that can be edited and persisted as JSON. """ NAME = "" # The format for JSONObject. Field = namedtuple('Field', ['human_name', 'doc']) EMPTY_FIELD = Field(None, None) # Override this to specify a set of field names, # or a dict of field: FieldData # Must include "name" if dict is specified. FIELDS = {} @classmethod def _should_store(cls, field_name): """Decides if a field should be stored""" return not field_name.startswith("_") def __init__(self, name): if not name: raise ValueError("%s objects must be named" % type(self).__name__) self.name = str(name) @property def data(self): """A list of tuples of the persisted key:values in this class""" if self.FIELDS: return [(k, self.__getattribute__(k) if hasattr(self, k) else None) for k in self.FIELDS] else: print_d("No order specified for class %s" % type(self).__name__) return dict([(k, v) for k, v in self.__dict__.items() if self._should_store(k)]) def field(self, name): """Returns the Field metadata of field `name` if available, or an null / empty one""" if isinstance(self.FIELDS, dict): return self.FIELDS.get(name, self.EMPTY_FIELD) @property def json(self): return json.dumps(dict(self.data)) def __eq__(self, other): return self.data == other.data def __lt__(self, other): return self.data < other.data def __str__(self): return "<%s '%s' with %s>" % (self.__class__.__name__, self.name, self.json) class JSONObjectDict(dict): """A dict wrapper to persist named `JSONObject`-style objects""" def __init__(self, Item=JSONObject): self.Item = Item dict.__init__(self) @classmethod def from_json(cls, ItemKind, json_str): """ Factory method for building from an input string, a JSON map of {item_name1: {key:value, key2:value2...}, item_name2:...} """ new = cls(ItemKind) try: data = json.loads(json_str) except ValueError: print_w("Broken JSON: %s" % json_str) else: for name, blob in data.items(): try: new[name] = ItemKind(**blob) except TypeError as e: raise IOError("Couldn't instantiate %s from JSON (%s)" % (ItemKind.__name__, e)) return new @classmethod def from_list(cls, json_objects, raise_errors=True): new = cls() for j in json_objects: if not isinstance(j, JSONObject): msg = ("Incorrect type (%s) found in list of objects" % j.__class__.__name__) if raise_errors: raise TypeError(msg) else: print_d(msg) else: if not j.name and raise_errors: raise ValueError("Null key for %s object %s" % (cls.__name__, j)) if j.name in new: print_w("Duplicate %s found named '%s'. Removing..." % (cls.__name__, j.name)) new[j.name] = j return new def save(self, filename=None): """ Takes a list of `JSONObject` objects and returns the data serialised as a JSON string, also writing (prettily) to file `filename` if specified. """ print_d("Saving %d %s(s) to JSON.." % (len(self), self.Item.__name__)) try: obj_dict = dict([(o.name, dict(o.data)) for o in self.values()]) except AttributeError: raise json_str = json.dumps(obj_dict, indent=4) if PY3: json_str = json_str.encode("utf-8") if filename: try: with open(filename, "wb") as f: f.write(json_str) except IOError as e: print_w("Couldn't write JSON for %s object(s) (%s)" % (type(self).__name__, e)) return json_str ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/tags.py��������������������������������������������������������������0000644�0001750�0001750�00000023074�13112005742�020220� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007-2008 Joe Wreschnig # 2014 Christoph Reiter # 2014-2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet.compat import iteritems """Database of all known tags, their translations and how they are used""" class TagName(object): """ Text: desc -- translated description plural -- translated plural description or None role -- translated role description (for people tags) Types: user -- user editable tag e.g. "foo" hidden -- if user tag should only be shown in the tag editor (e.g. tracknumber is hidden, since ~#track/~#tracks are more useful for displaying) has_sort -- has a sort user variant e.g. "foosort" machine -- user tag is not human readable. Something people might want to hide in the tag editor. internal -- generated by QL e.g. "~foo" hidden -- if it is replaced by another tag (for backwards compat) has_sort -- has a sort user variant e.g. "~foosort" has_roles -- has a roles variant e.g. "~foo:roles" numeric -- e.g. "~#foo" """ def __init__(self, name, options, desc, plural=None, role=None): # I don't think this categorization is any good.. but at least # there is any.. self.name = name self.desc = desc self.plural = plural self.user = "u" in options self.internal = "i" in options self.numeric = "n" in options self.machine = "m" in options self.has_sort = "s" in options self.has_roles = "r" in options self.hidden = "h" in options self.role = role # some sanity checks assert self.user or self.internal or self.numeric assert not (set(options) - set("uinmshr")) if self.has_roles: assert self.internal if self.has_sort: assert self.user or self.internal if self.machine: assert self.user if self.hidden: assert self.user + self.internal == 1 def __repr__(self): return "%s(%r)" % (type(self).__name__, vars(self)) T = TagName _TAGS = dict((t.name, t) for t in [ T("album", "us", _("album"), _("albums")), T("arranger", "u", _("arranger"), _("arrangers"), _("arrangement")), T("artist", "us", _("artist"), _("artists")), T("author", "u", _("author"), _("authors")), T("composer", "us", _("composer"), _("composers"), _("composition")), # Translators: conducting as in conducting a musical performance T("conductor", "u", _("conductor"), _("conductors"), _("conducting")), T("contact", "u", _("contact")), T("copyright", "u", _("copyright")), T("date", "u", _("date")), T("description", "u", _("description")), T("genre", "u", _("genre"), _("genres")), T("performer", "uisr", _("performer"), _("performers")), T("grouping", "u", _("grouping")), T("language", "ui", _("language")), T("license", "u", _("license")), T("location", "u", _("location")), T("lyricist", "u", _("lyricist"), _("lyricists"), _("lyrics")), # Translators: Also e.g. "record label", "publisher" T("organization", "u", _("organization")), T("title", "u", _("title")), T("version", "u", _("version")), T("website", "u", _("website")), T("albumartist", "us", _("album artist")), T("bpm", "u", _("BPM")), T("isrc", "u", "ISRC"), # Translators: This used to be called "part". T("discsubtitle", "u", _("disc subtitle")), T("part", "u", _("disc subtitle")), T("discnumber", "uh", _("disc")), T("tracknumber", "uh", _("track")), T("labelid", "u", _("label ID")), T("originaldate", "u", _("original release date")), T("originalalbum", "u", _("original album")), T("originalartist", "u", _("original artist")), T("recordingdate", "u", _("recording date")), T("releasecountry", "u", _("release country")), # for backwards compat T("performers", "ishr", _("performers")), # http://musicbrainz.org/doc/MusicBrainzTag # Note: picard has changed musicbrainz_trackid to mean release track. # We can't do that because of existing libraries, so use a new # musicbrainz_releastrackid instead. T("musicbrainz_trackid", "um", _("MusicBrainz recording ID")), T("musicbrainz_releasetrackid", "um", _("MusicBrainz release track ID")), T("musicbrainz_albumid", "um", _("MusicBrainz release ID")), T("musicbrainz_artistid", "um", _("MusicBrainz artist ID")), T("musicbrainz_albumartistid", "um", _("MusicBrainz release artist ID")), T("musicbrainz_trmid", "um", _("MusicBrainz TRM ID")), T("musicip_puid", "um", _("MusicIP PUID")), T("musicbrainz_albumstatus", "um", _("MusicBrainz album status")), T("musicbrainz_albumtype", "um", _("MusicBrainz album type")), T("musicbrainz_releasegroupid", "um", _("MusicBrainz release group ID")), # Translators: "gain" means a volume adjustment, not "to acquire". T("replaygain_track_gain", "umn", _("track gain")), T("replaygain_track_peak", "umn", _("track peak")), # Translators: "gain" means a volume adjustment, not "to acquire". T("replaygain_album_gain", "umn", _("album gain")), T("replaygain_album_peak", "umn", _("album peak")), T("replaygain_reference_loudness", "umn", _("reference loudness")), T("added", "n", _("added")), T("lastplayed", "n", _("last played")), T("disc", "n", _("disc")), T("discs", "n", _("discs")), T("track", "n", _("track")), T("tracks", "n", _("tracks")), T("laststarted", "n", _("last started")), T("filename", "i", _("full name")), T("basename", "i", _("filename")), T("dirname", "i", _("directory")), T("mtime", "n", _("modified")), T("playcount", "n", _("plays")), T("skipcount", "n", _("skips")), T("uri", "i", "URI"), T("mountpoint", "i", _("mount point")), T("length", "n", _("length")), T("people", "isr", _("people")), T("rating", "in", _("rating")), T("year", "in", _("year")), T("originalyear", "in", _("original release year")), T("bookmark", "i", _("bookmark")), T("bitrate", "in", _("bitrate")), T("filesize", "n", _("file size")), T("format", "i", _("file format")), T("codec", "i", _("codec")), T("encoding", "i", _("encoding")), T("playlists", "i", _("playlists")), T("channels", "n", _("channel count")), ]) def _get_sort_map(tags): """See TAG_TO_SORT""" tts = {} for name, tag in iteritems(tags): if tag.has_sort: if tag.user: tts[name] = "%ssort" % name if tag.internal: tts["~%s" % name] = "~%ssort" % name return tts def _get_standard_tags(tags, machine=False): stags = [] for name, tag in iteritems(tags): if tag.user and tag.machine == machine: stags.append(name) if tag.has_sort: stags.append("%ssort" % name) return stags TAG_TO_SORT = _get_sort_map(_TAGS) """A mapping of tag -> sorttag. e.g. artist -> artistsort""" MACHINE_TAGS = _get_standard_tags(_TAGS, machine=True) """A sequence of editable tags that are not human-readable. e.g. musicbrainz_albumid """ USER_TAGS = _get_standard_tags(_TAGS, machine=False) """A sequence of tags that are human-readable and can be edited. e.g. album """ TAG_ROLES = dict([(n, t.role) for (n, t) in iteritems(_TAGS) if t.role]) """A mapping from tags to their translated role description. e.g. conductor -> conducting """ def readable(tag, plural=False): """Gives a translated description for a tag. Also supports internal, numeric tags. If plural is True, will return a plural description if possible. album -> album albumsort -> album (sort) ~foo -> foo ~people:roles -> people (roles) """ try: if tag[0] == "~": if tag[1] == "#": tag = tag[2:] else: tag = tag[1:] except IndexError: return _("Invalid tag") def desc(tag): if plural: plural_desc = _TAGS[tag].plural if plural_desc: return plural_desc return _TAGS[tag].desc if tag in _TAGS: return desc(tag) elif tag == 'people:real': return desc('people') else: roles = False if tag.endswith(":roles"): roles = True tag = tag[:-6] parts = [] if tag.endswith("sort"): v = _TAGS.get(tag[:-4]) if v is not None and v.has_sort: tag = tag[:-4] # Translators: e.g. "artist (sort)" parts.append(_("sort")) else: v = _TAGS.get(tag[:-4]) if roles: v = _TAGS.get(tag) if v is not None and v.has_roles: # Translators: e.g. "performer (roles)" parts.append(_("roles")) if tag in _TAGS: desc = desc(tag) if parts: desc += " (%s)" % ", ".join(parts) return desc return tag def sortkey(tag): """Sort key for sorting tag names by importance. tags.sort(key=sortkey) """ # last one -> most important order = [ "album", "artist", "title", ] try: return (-order.index(tag), tag) except ValueError: if tag in MACHINE_TAGS: return (2, tag) else: return (1, tag) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/__init__.py����������������������������������������������������������0000644�0001750�0001750�00000105253�13112005742�021021� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2009 Joe Wreschnig, Michael Urman, Steven Robertson # 2011-2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import random import re import ctypes import ctypes.util import sys import unicodedata import threading import subprocess import webbrowser # Windows doesn't have fcntl, just don't lock for now try: import fcntl fcntl except ImportError: fcntl = None from senf import fsnative, environ, argv from quodlibet.compat import reraise as py_reraise, PY2, text_type, \ iteritems, reduce, number_types, long, cmp from quodlibet.util.path import iscommand from quodlibet.util.string.titlecase import title from quodlibet.const import SUPPORT_EMAIL, COPYRIGHT from quodlibet.util.dprint import print_d, print_, print_e, print_w, print_exc from .misc import cached_func, get_module_dir, get_ca_file, get_locale_encoding from .environment import is_plasma, is_unity, is_enlightenment, \ is_linux, is_windows, is_wine, is_osx, is_py2exe, is_py2exe_console, \ is_py2exe_window from .enum import enum from .i18n import _, C_, locale_format # pyflakes cached_func, enum, print_w, print_exc, is_plasma, is_unity, is_enlightenment, is_linux, is_windows, is_wine, is_osx, is_py2exe, is_py2exe_console, is_py2exe_window, get_module_dir, get_ca_file, get_locale_encoding if PY2: def gdecode(s): """Returns unicode for the glib text type""" assert isinstance(s, bytes) return s.decode("utf-8") else: def gdecode(s): """Returns unicode for the glib text type""" assert isinstance(s, text_type) return s class InstanceTracker(object): """A mixin for GObjects to return a list of all alive objects of a given type. Note that it must be used with a GObject or something with a connect method and destroy signal.""" __kinds = {} def _register_instance(self, klass=None): """Register this object to be returned in the active instance list.""" if klass is None: klass = type(self) self.__kinds.setdefault(klass, []).append(self) self.connect('destroy', self.__kinds[klass].remove) @classmethod def instances(klass): return klass.__kinds.get(klass, []) class OptionParser(object): def __init__(self, name, version, description=None, usage=None): self.__name = name self.__version = version self.__args = {} self.__translate_short = {} self.__translate_long = {} self.__help = {} self.__usage = usage self.__description = description self.add( "help", shorts="h", help=_("Display brief usage information")) self.add( "version", shorts="v", help=_("Display version and copyright")) self.add("debug", shorts="d") def add(self, canon, help=None, arg="", shorts="", longs=[]): self.__args[canon] = arg for s in shorts: self.__translate_short[s] = canon for l in longs: self.__translate_long[l] = canon if help: self.__help[canon] = help def __shorts(self): shorts = "" for short, canon in self.__translate_short.items(): shorts += short + (self.__args[canon] and "=" or "") return shorts def __longs(self): longs = [] for long_, arg in self.__args.items(): longs.append(long_ + (arg and "=" or "")) for long_, canon in self.__translate_long.items(): longs.append(long_ + (self.__args[canon] and "=" or "")) return longs def __format_help(self, opt, space): if opt in self.__help: help = self.__help[opt] if self.__args[opt]: opt = "%s=%s" % (opt, self.__args[opt]) return " --%s %s\n" % (opt.ljust(space), help) else: return "" def help(self): l = 0 for k in self.__help.keys(): l = max(l, len(k) + len(self.__args.get(k, "")) + 4) s = _("Usage: %(program)s %(usage)s") % { "program": argv[0], "usage": self.__usage if self.__usage else _("[options]"), } s += "\n" if self.__description: s += "%s - %s\n" % (self.__name, self.__description) s += "\n" keys = sorted(self.__help.keys()) try: keys.remove("help") except ValueError: pass try: keys.remove("version") except ValueError: pass for h in keys: s += self.__format_help(h, l) if keys: s += "\n" s += self.__format_help("help", l) s += self.__format_help("version", l) return s def set_help(self, newhelp): self.__help = newhelp def version(self): return ("""\ {title} {version} <{email}> {copyright}\ """).format(title=self.__name, version=self.__version, dates="2004-2012", email=SUPPORT_EMAIL, copyright=COPYRIGHT) def parse(self, args=None): if args is None: args = argv[1:] from getopt import getopt, GetoptError try: opts, args = getopt(args, self.__shorts(), self.__longs()) except GetoptError as s: s = str(s) text = [] if "not recognized" in s: text.append( _("Option %r not recognized.") % s.split()[1]) elif "requires argument" in s: text.append( _("Option %r requires an argument.") % s.split()[1]) elif "unique prefix" in s: text.append( _("%r is not a unique prefix.") % s.split()[1]) if "help" in self.__args: text.append(_("Try %s --help.") % argv[0]) print_e("\n".join(text)) raise SystemExit(True) else: transopts = {} for o, a in opts: if o.startswith("--"): o = self.__translate_long.get(o[2:], o[2:]) elif o.startswith("-"): o = self.__translate_short.get(o[1:], o[1:]) if o == "help": print_(self.help()) raise SystemExit elif o == "version": print_(self.version()) raise SystemExit elif o == "debug": from quodlibet import const const.DEBUG = True if self.__args[o]: transopts[o] = a else: transopts[o] = True return transopts, args def escape(str): """Escape a string in a manner suitable for XML/Pango.""" return str.replace("&", "&").replace("<", "<").replace(">", ">") def unescape(str): """Unescape a string in a manner suitable for XML/Pango.""" return str.replace("<", "<").replace(">", ">").replace("&", "&") def bold(string): return "<b>%s</b>" % string def monospace(string): return "<tt>%s</tt>" % string def italic(string): return "<i>%s</i>" % string def parse_time(timestr, err=object()): """Parse a time string in hh:mm:ss, mm:ss, or ss format.""" if timestr[0:1] == "-": m = -1 timestr = timestr[1:] else: m = 1 try: return m * reduce(lambda s, a: s * 60 + int(a), re.split(r":|\.", timestr), 0) except (ValueError, re.error): if err is None: raise return 0 def validate_query_date(datestr): """Validates a user provided date that can be compared using date_key(). Returns True id the date is valid. """ parts = datestr.split("-") if len(parts) > 3: return False if len(parts) > 2: try: v = int(parts[2]) except ValueError: return False else: if not 1 <= v <= 31: return False if len(parts) > 1: try: v = int(parts[1]) except ValueError: return False else: if not 1 <= v <= 12: return False try: int(parts[0]) except ValueError: return False return True def date_key(datestr): """Parse a date format y-m-d and returns an undefined integer that can only be used to compare dates. In case the date string is invalid the returned value is undefined. """ # this basically does "2001-02-03" -> 20010203 default = [0, 1, 1] parts = datestr.split("-") parts += default[len(parts):] value = 0 for d, p, m in zip(default, parts, (10000, 100, 1)): try: value += int(p) * m except ValueError: # so that "2003-01-" is equal to "2003-01" .. value += d * m return value def parse_date(datestr): """Parses yyyy-mm-dd date format and returns unix time. Raises ValueError in case the input couldn't be parsed. """ import time try: frmt = ["%Y", "%Y-%m", "%Y-%m-%d"][datestr.count("-")] except IndexError: raise ValueError try: return time.mktime(time.strptime(datestr, frmt)) except OverflowError as e: raise ValueError(e) def format_int_locale(value): """Turn an integer into a grouped, locale-dependent string e.g. 12345 -> "12,345" or "12.345" etc """ return locale_format("%d", value, grouping=True) def format_float_locale(value, format="%.2f"): """Turn a float into a grouped, locale-dependent string e.g. 12345.67 -> "12,345.67" or "12.345,67" etc """ return locale_format(format, value, grouping=True) def format_rating(value, blank=True): """Turn a number into a sequence of rating symbols.""" from quodlibet import config prefs = config.RATINGS steps = prefs.number value = max(min(value, 1.0), 0) ons = int(round(steps * value)) offs = (steps - ons) if blank else 0 return prefs.full_symbol * ons + prefs.blank_symbol * offs def format_bitrate(value): return _("%d kbps") % int(value) def format_size(size): """Turn an integer size value into something human-readable. Args: size (int): size in bytes Returns: text_type """ # TODO: Better i18n of this (eg use O/KO/MO/GO in French) if size >= 1024 ** 3: return u"%.1f GB" % (float(size) / (1024 ** 3)) elif size >= 1024 ** 2 * 100: return u"%.0f MB" % (float(size) / (1024 ** 2)) elif size >= 1024 ** 2 * 10: return u"%.1f MB" % (float(size) / (1024 ** 2)) elif size >= 1024 ** 2: return u"%.2f MB" % (float(size) / (1024 ** 2)) elif size >= 1024 * 10: return u"%d KB" % int(size / 1024) elif size >= 1024: return u"%.2f KB" % (float(size) / 1024) else: return u"%d B" % size def format_time(time): """Turn a time value in seconds into hh:mm:ss or mm:ss.""" if time < 0: time = abs(time) prefix = "-" else: prefix = "" if time >= 3600: # 1 hour # time, in hours:minutes:seconds return "%s%d:%02d:%02d" % (prefix, time // 3600, (time % 3600) // 60, time % 60) else: # time, in minutes:seconds return "%s%d:%02d" % (prefix, time // 60, time % 60) def format_time_display(time): """Like format_time, but will use RATIO instead of a colon to separate""" return format_time(time).replace(":", u"\u2236") def format_time_seconds(time): from quodlibet import ngettext time_str = format_int_locale(time) return ngettext("%s second", "%s seconds", time) % time_str def format_time_long(time, limit=2): """Turn a time value in seconds into x hours, x minutes, etc. `limit` limits the count of units used, so the result will be <= time. 0 means no limit. """ from quodlibet import ngettext if time < 1: return _("No time information") cutoffs = [ (60, lambda n: ngettext("%d second", "%d seconds", n)), (60, lambda n: ngettext("%d minute", "%d minutes", n)), (24, lambda n: ngettext("%d hour", "%d hours", n)), (365, lambda n: ngettext("%d day", "%d days", n)), (None, lambda n: ngettext("%d year", "%d years", n)), ] time_str = [] for divisor, gettext_partial in cutoffs: if time < 1: break if divisor is None: time, unit = 0, time else: time, unit = divmod(time, divisor) if unit: time_str.append(gettext_partial(unit) % unit) time_str.reverse() if limit: time_str = time_str[:limit] return ", ".join(time_str) def format_time_preferred(t, fmt=None): """Returns duration formatted to user's preference""" from quodlibet.config import DurationFormat, DURATION fmt = fmt or DURATION.format if fmt == DurationFormat.STANDARD: return format_time_long(t, 2) elif fmt == DurationFormat.NUMERIC: return format_time_display(t) elif fmt == DurationFormat.FULL: return format_time_long(t, 5) else: return format_time_seconds(t) def capitalize(str): """Capitalize a string, not affecting any character after the first.""" return str[:1].upper() + str[1:] def _split_numeric_sortkey(s, limit=10, reg=re.compile(r"[0-9][0-9]*\.?[0-9]*").search, join=u" ".join): """Separate numeric values from the string and convert to float, so it can be used for human sorting. Also removes all extra whitespace.""" result = reg(s) if not result or not limit: text = join(s.split()) return (text,) if text else tuple() else: start, end = result.span() return ( join(s[:start].split()), float(result.group()), _split_numeric_sortkey(s[end:], limit - 1)) def human_sort_key(s, normalize=unicodedata.normalize): if not s: return () if not isinstance(s, text_type): s = s.decode("utf-8") s = normalize("NFD", s.lower()) return _split_numeric_sortkey(s) def website(site): """Open the given URL in the user's default browser""" if os.name == "nt" or sys.platform == "darwin": return webbrowser.open(site) # all commands here return immediately for prog in ["xdg-open", "gnome-open"]: if not iscommand(prog): continue status = subprocess.check_call([prog, site]) if status == 0: return True # sensible-browser is a debian thing blocking_progs = ["sensible-browser"] blocking_progs.extend(environ.get("BROWSER", "").split(":")) for prog in blocking_progs: if not iscommand(prog): continue # replace %s with the url args = prog.split() for i, arg in enumerate(args): if arg == "%s": args[i] = site break else: args.append(site) # calling e.g. firefox blocks, so call async and hope for the best try: spawn(args) except RuntimeError: continue else: return True return False def tag(name, cap=True): # Return a 'natural' version of the tag for human-readable bits. # Strips ~ and ~# from the start and runs it through a map (which # the user can configure). if not name: return _("Invalid tag") else: from quodlibet.util.tags import readable parts = map(readable, tagsplit(name)) if cap: # Translators: If tag names, when capitalized, should not # be title-cased ("Looks Like This"), but rather only have # the first letter capitalized, translate this string as # something non-empty other than "titlecase?". if C_("check", "titlecase?") == "titlecase?": parts = map(title, parts) else: parts = map(capitalize, parts) return " / ".join(parts) def tagsplit(tag): """Split a (potentially) tied tag into a list of atomic tags. Two ~~s make the next tag prefixed with a ~, so ~foo~~bar => [foo, ~bar].""" if "~" in tag[1:]: if tag.startswith("~") and not tag.startswith("~#"): tag = tag[1:] tags = [] front = "" for part in tag.split("~"): if part: tags.append(front + part) front = "" else: front = "~" return tags else: return [tag] def pattern(pat, cap=True, esc=False, markup=False): """Return a 'natural' version of the pattern string for human-readable bits. Assumes all tags in the pattern are present. """ from quodlibet.pattern import Pattern, XMLFromPattern, XMLFromMarkupPattern from quodlibet.formats import FILESYSTEM_TAGS class Fakesong(dict): cap = False def comma(self, key): return " - ".join(self.list(key)) def list(self, key): return [tag(k, self.cap) for k in tagsplit(key)] list_separate = list def __call__(self, tag, *args): if tag in FILESYSTEM_TAGS: return fsnative(text_type(tag)) return 0 if '~#' in tag[:2] else self.comma(tag) fakesong = Fakesong({'filename': tag('filename', cap)}) fakesong.cap = cap try: if markup: p = XMLFromMarkupPattern(pat) elif esc: p = XMLFromPattern(pat) else: p = Pattern(pat) except ValueError: return _("Invalid pattern") return p.format(fakesong) def spawn(argv, stdout=False): """Asynchronously run a program. argv[0] is the executable name, which must be fully qualified or in the path. If stdout is True, return a file object corresponding to the child's standard output; otherwise, return the child's process ID. argv must be strictly str objects to avoid encoding confusion. """ from gi.repository import GLib print_d("Running %r" % argv) args = GLib.spawn_async(argv=argv, flags=GLib.SpawnFlags.SEARCH_PATH, standard_output=stdout) if stdout: return os.fdopen(args[2]) else: return args[0] def fver(tup): return ".".join(map(str, tup)) def make_case_insensitive(filename): return "".join(["[%s%s]" % (c.lower(), c.upper()) for c in filename]) class DeferredSignal(object): """A wrapper for connecting functions to signals. Some signals may fire hundreds of times, but only require processing once per group. This class pushes the call to the mainloop at idle priority and prevents multiple calls from being inserted in the mainloop at a time, greatly improving responsiveness in some places. When the target function is finally called, the arguments passed are the last arguments passed to DeferredSignal. `priority` defaults to GLib.PRIORITY_DEFAULT If `owner` is given, it will not call the target after the owner is destroyed. Example usage: def func(widget, user_arg): pass widget.connect('signal', DeferredSignal(func, owner=widget), user_arg) """ def __init__(self, func, timeout=None, owner=None, priority=None): """timeout in milliseconds""" self.func = func self.dirty = False self.args = None if owner: def destroy_cb(owner): self.abort() owner.connect("destroy", destroy_cb) from gi.repository import GLib if priority is None: priority = GLib.PRIORITY_DEFAULT if timeout is None: self.do_idle_add = lambda f: GLib.idle_add(f, priority=priority) else: self.do_idle_add = lambda f: GLib.timeout_add( timeout, f, priority=priority) @property def __self__(self): return self.func.__self__ @property def __code__(self): return self.func.__code__ @property def __closure__(self): return self.func.__closure__ def call(self, *args): """Force a call""" self.abort() self.args = args self._wrap() def abort(self): """Abort any queued up calls. Can still be reused afterwards. """ if self.dirty: from gi.repository import GLib GLib.source_remove(self._id) self.dirty = False self.args = None def __call__(self, *args): self.args = args if not self.dirty: self.dirty = True self._id = self.do_idle_add(self._wrap) def _wrap(self): self.func(*self.args) self.dirty = False self.args = None return False def connect_obj(this, detailed_signal, handler, that, *args, **kwargs): """A wrapper for connect() that has the same interface as connect_object(). Used as a temp solution to get rid of connect_object() calls which may be changed to match the C version more closely in the future. https://git.gnome.org/browse/pygobject/commit/?id=86fb12b3e9b75 While it's not clear if switching to weak references will break anything, we mainly used this for adjusting the callback signature. So using connect() behind the scenes will keep things working as they are now. """ def wrap(this, *args): return handler(that, *args) return this.connect(detailed_signal, wrap, *args, **kwargs) def _connect_destroy(sender, func, detailed_signal, handler, *args, **kwargs): """Connect a bound method to a foreign object signal and disconnect if the object the method is bound to emits destroy (Gtk.Widget subclass). Also works if the handler is a nested function in a method and references the method's bound object. This solves the problem that the sender holds a strong reference to the bound method and the bound to object doesn't get GCed. """ if hasattr(handler, "__self__"): obj = handler.__self__ else: # XXX: get the "self" var of the enclosing scope. # Used for nested functions which ref the object but aren't methods. # In case they don't ref "self" normal connect() should be used anyway. index = handler.__code__.co_freevars.index("self") obj = handler.__closure__[index].cell_contents assert obj is not sender handler_id = func(detailed_signal, handler, *args, **kwargs) def disconnect_cb(*args): sender.disconnect(handler_id) obj.connect('destroy', disconnect_cb) return handler_id def connect_destroy(sender, *args, **kwargs): return _connect_destroy(sender, sender.connect, *args, **kwargs) def connect_after_destroy(sender, *args, **kwargs): return _connect_destroy(sender, sender.connect_after, *args, **kwargs) class cached_property(object): """A read-only @property that is only evaluated once.""" def __init__(self, fget, doc=None): self.fget = fget self.__doc__ = doc or fget.__doc__ self.__name__ = name = fget.__name__ # these get name mangled, so caching wont work unless # we mangle too assert not (name.startswith("__") and not name.endswith("__")), \ "can't cache a dunder method" def __get__(self, obj, cls): if obj is None: return self obj.__dict__[self.__name__] = result = self.fget(obj) return result def sanitize_tags(tags, stream=False): """Returns a new sanitized tag dict. stream defines if the tags of a main/base song should be changed or of a stream song. e.g. title will be removed for the base song but not for the stream one. """ san = {} for key, value in iteritems(tags): key = key.lower() key = {"location": "website"}.get(key, key) if isinstance(value, text_type): lower = value.lower().strip() if key == "channel-mode": if "stereo" in lower or "dual" in lower: value = u"stereo" elif key == "audio-codec": if "mp3" in lower: value = u"MP3" elif "aac" in lower or "advanced" in lower: value = u"MPEG-4 AAC" elif "vorbis" in lower: value = u"Ogg Vorbis" if lower in ("http://www.shoutcast.com", "http://localhost/", "default genre", "none", "http://", "unnamed server", "unspecified", "n/a"): continue if key == "duration": try: value = int(long(value) / 1000) except ValueError: pass else: if not stream: continue key = "~#length" elif key == "bitrate": try: value = int(value) / 1000 except ValueError: pass else: if not stream: continue key = "~#bitrate" elif key == "nominal-bitrate": try: value = int(value) / 1000 except ValueError: pass else: if stream: continue key = "~#bitrate" if key in ("emphasis", "mode", "layer", "maximum-bitrate", "minimum-bitrate", "has-crc", "homepage"): continue if not stream and key in ("title", "album", "artist", "date"): continue if isinstance(value, number_types): if not key.startswith("~#"): key = "~#" + key san[key] = value else: if key.startswith("~#"): key = key[2:] if not isinstance(value, text_type): continue value = value.strip() if key in san: if value not in san[key].split("\n"): san[key] += "\n" + value else: san[key] = value return san def build_filter_query(key, values): """Create a text query that matches a union of all values for a key build_filter_query("foo", ["x", "y"]) => foo = |("x"c, "y"c) build_filter_query("~#foo", ["1"]) => #(foo = 1) """ if not values: return u"" if key.startswith("~#"): nheader = key[2:] queries = ["#(%s = %s)" % (nheader, i) for i in values] if len(queries) > 1: return u"|(%s)" % ", ".join(queries) else: return queries[0] else: text = ", ".join( ["'%s'c" % v.replace("\\", "\\\\").replace("'", "\\'") for v in values]) if len(values) == 1: return u"%s = %s" % (key, text) else: return u"%s = |(%s)" % (key, text) def limit_songs(songs, max, weight_by_ratings=False): """Choose at most `max` songs from `songs`, optionally giving weighting to ~#rating""" if not max or len(songs) < max: return songs else: if weight_by_ratings: def choose(r1, r2): if r1 or r2: return cmp(random.random(), r1 / (r1 + r2)) else: return random.randint(-1, 1) def rating(song): return song("~#rating") songs.sort(cmp=choose, key=rating) else: random.shuffle(songs) return songs[:max] def gi_require_versions(name, versions): """Like gi.require_version, but will take a list of versions. Returns the required version or raises ValueError. """ assert versions import gi error = None for version in versions: try: gi.require_version(name, version) except ValueError as e: error = e else: return version else: raise error def load_library(names, shared=True): """Load a ctypes library with a range of names to try. Handles direct .so names and library names ["libgpod.so", "gpod"]. If shared is True can return a shared instance. Raises OSError if not found. Returns (library, name) """ if not names: raise ValueError if shared: load_func = lambda n: getattr(ctypes.cdll, n) else: load_func = ctypes.cdll.LoadLibrary if is_osx(): # make sure it's either empty or contains /usr/lib. # (jhbuild sets it for example). Otherwise ctypes can't # find libc (bug?) if "DYLD_FALLBACK_LIBRARY_PATH" in environ: paths = environ["DYLD_FALLBACK_LIBRARY_PATH"] paths = paths.split(os.pathsep) if "/usr/lib" not in paths: paths.append("/usr/lib") environ["DYLD_FALLBACK_LIBRARY_PATH"] = os.pathsep.join(paths) errors = [] for name in names: dlopen_name = name if ".so" not in name and ".dll" not in name and \ ".dylib" not in name: dlopen_name = ctypes.util.find_library(name) or name try: return load_func(dlopen_name), name except OSError as e: errors.append(str(e)) raise OSError("\n".join(errors)) def is_main_thread(): """If the calling thread is the main one""" return threading.current_thread().name == "MainThread" class MainRunnerError(Exception): pass class MainRunnerAbortedError(MainRunnerError): pass class MainRunnerTimeoutError(MainRunnerError): pass class MainRunner(object): """Schedule a function call in the main loop from a worker thread and wait for the result. Make sure to call abort() before the main loop gets destroyed, otherwise the worker thread may block forever in call(). """ def __init__(self): self._source_id = None self._call_id = None self._lock = threading.Lock() self._cond = threading.Condition(self._lock) self._return = None self._error = None self._aborted = False def _run(self, func, *args, **kwargs): try: self._return = func(*args, **kwargs) except Exception as e: self._error = MainRunnerError(e) def _idle_run(self, call_id, call_event, func, *args, **kwargs): call_event.set() with self._lock: # In case a timeout happened but this got still # scheduled, this could be called after call() returns; # Compare to the current call id and do nothing if it isn't ours if call_id is not self._call_id: return False try: self._run(func, *args, **kwargs) finally: self._source_id = None self._cond.notify() return False def abort(self): """After this call returns no function will be executed anymore and a currently blocking call will fail with MainRunnerAbortedError. Can be called multiple times and can not fail. call() will always fail after this was called. """ from gi.repository import GLib with self._lock: if self._aborted: return if self._source_id is not None: GLib.source_remove(self._source_id) self._source_id = None self._aborted = True self._call_id = None self._error = MainRunnerAbortedError("aborted") self._cond.notify() def call(self, func, *args, **kwargs): """Runs the function in the main loop and blocks until it is finshed or abort() was called. In case this is called from the main loop the function gets executed immediately. The priority kwargs defines the event source priority and will not be passed to func. In case a timeout kwarg is given the call will raise MainRunnerTimeoutError in case the function hasn't been scheduled (doesn't mean returned) until that time. timeout is a float in seconds. Can raise MainRunnerError in case the function raises an exception. Raises MainRunnerAbortedError in case the runner was aborted. Raises MainRunnerTimeoutError in case the timeout was reached. """ from gi.repository import GLib with self._lock: if self._aborted: raise self._error self._error = None # XXX: ideally this should be GLib.MainContext.default().is_owner() # but that's not available in older pygobject if is_main_thread(): kwargs.pop("priority", None) self._run(func, *args, **kwargs) else: assert self._source_id is None assert self._call_id is None timeout = kwargs.pop("timeout", None) call_event = threading.Event() self._call_id = object() self._source_id = GLib.idle_add( self._idle_run, self._call_id, call_event, func, *args, **kwargs) # only wait for the result if we are sure it got scheduled if call_event.wait(timeout): self._cond.wait() self._call_id = None if self._source_id is not None: GLib.source_remove(self._source_id) self._source_id = None raise MainRunnerTimeoutError("timeout: %r" % timeout) if self._error is not None: raise self._error return self._return def re_escape(string, BAD="/.^$*+-?{,\\[]|()<>#=!:"): """A re.escape which also works with unicode""" needs_escape = lambda c: (c in BAD and "\\" + c) or c return type(string)().join(map(needs_escape, string)) def set_process_title(title): """Sets process name as visible in ps or top. Requires ctypes libc and is almost certainly *nix-only. See issue 736 """ if os.name == "nt": return try: libc = load_library(["libc.so.6", "c"])[0] # 15 = PR_SET_NAME, apparently libc.prctl(15, title, 0, 0, 0) except (OSError, AttributeError): print_d("Couldn't find module libc.so.6 (ctypes). " "Not setting process title.") def list_unique(sequence): """Takes any sequence and returns a list with all duplicate entries removed while preserving the order. """ l = [] seen = set() append = l.append add = seen.add for v in sequence: if v not in seen: append(v) add(v) return l def reraise(tp, value, tb=None): """Reraise an exception with a new exception type and the original stack trace """ if tb is None: tb = sys.exc_info()[2] py_reraise(tp, value, tb) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/cover/���������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020016� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/cover/__init__.py����������������������������������������������������0000644�0001750�0001750�00000000400�13112005742�022123� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from .manager import CoverManager CoverManager ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/cover/built_in.py����������������������������������������������������0000644�0001750�0001750�00000011745�13112005742�022207� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Simonas Kazlauskas # 2015-2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os.path import re from senf import fsn2text from quodlibet import _ from quodlibet.plugins.cover import CoverSourcePlugin from quodlibet.util.dprint import print_w from quodlibet import config def get_ext(s): return os.path.splitext(s)[1].lstrip('.') class EmbeddedCover(CoverSourcePlugin): PLUGIN_ID = "embed-cover" PLUGIN_NAME = _("Embedded album covers") PLUGIN_DESC = _("Uses covers embedded into audio files.") embedded = True @classmethod def group_by(cls, song): # one group per song return song.key @staticmethod def priority(): return 0.7001 @property def cover(self): if self.song.has_images: image = self.song.get_primary_image() return image.file if image else None class FilesystemCover(CoverSourcePlugin): PLUGIN_ID = "filesystem-cover" PLUGIN_NAME = _("Filesystem cover") PLUGIN_DESC = _("Uses commonly named images found in common directories " + "alongside the song.") cover_subdirs = frozenset( ["scan", "scans", "images", "covers", "artwork"]) cover_exts = frozenset(["jpg", "jpeg", "png", "gif"]) cover_positive_words = ["front", "cover", "frontcover", "jacket", "folder", "albumart", "edited"] cover_negative_words = ["back", "inlay", "inset", "inside"] cover_positive_regexes = frozenset( [re.compile(r'(\b|_)' + s + r'(\b|_)') for s in cover_positive_words]) cover_negative_regexes = frozenset( [re.compile(r'(\b|_|)' + s + r'(\b|_)') for s in cover_negative_words]) @classmethod def group_by(cls, song): # in the common case this means we only search once per album return song('~dirname'), song.album_key @staticmethod def priority(): return 0.80 @property def cover(self): # TODO: Deserves some refactoring if not self.song.is_file: return None base = self.song('~dirname') images = [] # Issue 374: Specify artwork filename if config.getboolean("albumart", "force_filename"): path = os.path.join(base, config.get("albumart", "filename")) if os.path.isfile(path): images = [(100, path)] else: entries = [] try: entries = os.listdir(base) except EnvironmentError: print_w("Can't list album art directory %s" % base) fns = [] for entry in entries: lentry = entry.lower() if get_ext(lentry) in self.cover_exts: fns.append((None, entry)) if lentry in self.cover_subdirs: subdir = os.path.join(base, entry) sub_entries = [] try: sub_entries = os.listdir(subdir) except EnvironmentError: pass for sub_entry in sub_entries: lsub_entry = sub_entry.lower() if get_ext(lsub_entry) in self.cover_exts: fns.append((entry, sub_entry)) for sub, fn in fns: dec_lfn = fsn2text(fn).lower() score = 0 # check for the album label number labelid = self.song.get("labelid", "").lower() if labelid and labelid in dec_lfn: score += 20 # Track-related keywords values = self.song.list("~people") + [self.song("album")] lowers = [value.lower().strip() for value in values if len(value) > 1] score += 2 * sum([value in dec_lfn for value in lowers]) # Generic keywords score += 3 * sum(r.search(dec_lfn) is not None for r in self.cover_positive_regexes) score -= 2 * sum(r.search(dec_lfn) is not None for r in self.cover_negative_regexes) # print("[%s - %s]: Album art \"%s\" scores %d." % # (self.song("artist"), self.song("title"), fn, score)) if score > 0: if sub is not None: fn = os.path.join(sub, fn) images.append((score, os.path.join(base, fn))) images.sort(reverse=True) for score, path in images: # could be a directory if not os.path.isfile(path): continue try: return open(path, "rb") except IOError: print_w("Failed reading album art \"%s\"" % path) return None ���������������������������quodlibet-3.9.1/quodlibet/util/cover/manager.py�����������������������������������������������������0000644�0001750�0001750�00000016751�13112005742�022016� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Simonas Kazlauskas # 2014,2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from itertools import chain from gi.repository import GObject from quodlibet import config from quodlibet.plugins import PluginManager, PluginHandler from quodlibet.util.cover import built_in from quodlibet.util import print_d from quodlibet.util.thread import call_async from quodlibet.util.thumbnails import get_thumbnail_from_file from quodlibet.plugins.cover import CoverSourcePlugin class CoverPluginHandler(PluginHandler): """A plugin handler for CoverSourcePlugin implementation""" def __init__(self, use_built_in=True): self.providers = set() if use_built_in: self.built_in = {built_in.EmbeddedCover, built_in.FilesystemCover} else: self.built_in = set() def plugin_handle(self, plugin): return issubclass(plugin.cls, CoverSourcePlugin) def plugin_enable(self, plugin): self.providers.add(plugin) print_d("Registered {0} cover source".format(plugin.cls.__name__)) def plugin_disable(self, plugin): self.providers.remove(plugin) print_d("Unregistered {0} cover source".format(plugin.cls.__name__)) @property def sources(self): """Yields all active CoverSourcePlugin sorted by priority""" sources = chain((p.cls for p in self.providers), self.built_in) for p in sorted(sources, reverse=True, key=lambda x: x.priority()): yield p class CoverManager(GObject.Object): __gsignals__ = { # artwork_changed([AudioFile]), emitted if the cover art for one # or more songs might have changed 'cover-changed': (GObject.SignalFlags.RUN_LAST, None, (object,)), } plugin_handler = None def __init__(self, use_built_in=True): super(CoverManager, self).__init__() self.plugin_handler = CoverPluginHandler(use_built_in) def init_plugins(self): """Register the cover sources plugin handler with the global plugin manager. """ PluginManager.instance.register_handler(self.plugin_handler) @property def sources(self): return self.plugin_handler.sources def cover_changed(self, songs): """Notify the world that the artwork for some songs or collections containing that songs might have changed (For example a new image was added to the folder or a new embedded image was added) This will invalidate all caches and will notify others that they have to re-fetch the cover and do a display update. """ self.emit("cover-changed", songs) def acquire_cover(self, callback, cancellable, song): """ Try to get covers from all cover sources until a cover is found. * callback(found, result) is the function which will be called when this method completes its job. * cancellable – Gio.Cancellable which will interrupt the search. The callback won't be called when the operation is cancelled. """ sources = self.sources def success(source, result): name = source.__class__.__name__ print_d('Successfully got cover from {0}'.format(name)) source.disconnect_by_func(success) source.disconnect_by_func(failure) if not cancellable or not cancellable.is_cancelled(): callback(True, result) def failure(source, msg): name = source.__class__.__name__ print_d("Didn't get cover from {0}: {1}".format(name, msg)) source.disconnect_by_func(success) source.disconnect_by_func(failure) if not cancellable or not cancellable.is_cancelled(): run() def run(): try: provider = next(sources)(song, cancellable) except StopIteration: return callback(False, None) # No cover found cover = provider.cover if cover: name = provider.__class__.__name__ print_d('Found local cover from {0}: {1}'.format(name, cover)) callback(True, cover) else: provider.connect('fetch-success', success) provider.connect('fetch-failure', failure) provider.fetch_cover() if not cancellable or not cancellable.is_cancelled(): run() def acquire_cover_sync(self, song, embedded=True, external=True): """Gets *cached* cover synchronously. As CoverSource fetching functionality is asynchronous it is only possible to check for already fetched cover. """ return self.acquire_cover_sync_many([song], embedded, external) def acquire_cover_sync_many(self, songs, embedded=True, external=True): """Same as acquire_cover_sync but returns a cover for multiple images""" for plugin in self.sources: if not embedded and plugin.embedded: continue if not external and not plugin.embedded: continue groups = {} for song in songs: groups.setdefault(plugin.group_by(song), []).append(song) # sort both groups and songs by key, so we always get # the same result for the same set of songs for key, group in sorted(groups.items()): song = sorted(group, key=lambda s: s.key)[0] cover = plugin(song).cover if cover: return cover def get_cover(self, song): """Returns a cover file object for one song or None. Compared to acquire_cover_sync() this respects the prefer_embedded setting. """ return self.get_cover_many([song]) def get_cover_many(self, songs): """Returns a cover file object for many songs or None. Returns the first found image for a group of songs and respects the prefer_embedded setting. It tries to return the same cover for the same set of songs. """ prefer_embedded = config.getboolean( "albumart", "prefer_embedded", False) get = self.acquire_cover_sync_many if prefer_embedded: return get(songs, True, False) or get(songs, False, True) else: return get(songs, False, True) or get(songs, True, False) def get_pixbuf_many(self, songs, width, height): """Returns a Pixbuf which fits into the boundary defined by width and height or None. Uses the thumbnail cache if possible. """ fileobj = self.get_cover_many(songs) if fileobj is None: return return get_thumbnail_from_file(fileobj, (width, height)) def get_pixbuf(self, song, width, height): """see get_pixbuf_many()""" return self.get_pixbuf_many([song], width, height) def get_pixbuf_many_async(self, songs, width, height, cancel, callback): """Async variant; callback gets called with a pixbuf or not called in case of an error. cancel is a Gio.Cancellable. The callback will be called in the main loop. """ fileobj = self.get_cover_many(songs) if fileobj is None: return call_async(get_thumbnail_from_file, cancel, callback, args=(fileobj, (width, height))) �����������������������quodlibet-3.9.1/quodlibet/util/cover/http.py��������������������������������������������������������0000644�0001750�0001750�00000004430�13112005742�021352� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Simonas Kazlauskas # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gio, GLib from quodlibet.util.http import HTTPRequest from quodlibet.util import print_w class HTTPDownloadMixin(object): def download(self, message): request = HTTPRequest(message, self.cancellable) request.connect('sent', self._download_sent) request.connect('received', self._download_received) request.connect('failure', self._download_failure) request.send() def _download_sent(self, request, message): status = message.get_property('status-code') if not 200 <= status < 300: request.cancel() return self.fail('Bad HTTP code {0}'.format(status)) target = Gio.file_new_for_path(self.cover_path) flags = Gio.FileCreateFlags.NONE def replaced(cover_file, task, data): try: ostr = cover_file.replace_finish(task) request.provide_target(ostr) request.connect('receive-failure', self._receive_fail, target) request.receive() except GLib.GError: request.cancel() return self.fail('Cannot open cover file') target.replace_async(None, True, flags, GLib.PRIORITY_DEFAULT, self.cancellable, replaced, None) def _download_received(self, request, ostream): ostream.close(None) self.emit('fetch-success', self.cover) def _receive_fail(self, request, exception, gfile): def deleted(gfile, task, data): try: gfile.delete_finish(task) except GLib.GError: print_w('Could not clean up cover which failed to download') ostream = request.ostream ostream.close(None) gfile.delete_async(GLib.PRIORITY_DEFAULT, None, deleted, None) def _download_failure(self, request, exception): try: self.fail(exception.message or ' '.join(exception.args)) except AttributeError: self.fail("Download error (%s)" % exception) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/environment.py�������������������������������������������������������0000644�0001750�0001750�00000003750�13112005742�021625� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Varisour function for figuring out which platform wa are running on and under which environment. """ import os import sys import ctypes def _dbus_name_owned(name): """Returns True if the dbus name has an owner""" if not is_linux(): return False try: import dbus except ImportError: return False try: bus = dbus.Bus(dbus.Bus.TYPE_SESSION) return bus.name_has_owner(name) except dbus.DBusException: return False def is_plasma(): """If we are running under plasma""" return _dbus_name_owned("org.kde.plasmashell") def is_unity(): """If we are running under Ubuntu/Unity""" return _dbus_name_owned("com.canonical.Unity.Launcher") def is_enlightenment(): """If we are running under Enlightenment""" return _dbus_name_owned("org.enlightenment.wm.service") def is_linux(): """If we are on Linux (or similar)""" return not is_windows() and not is_osx() def is_windows(): """If we are running under Windows or Wine""" return os.name == "nt" def is_wine(): """If we are running under Wine""" if not is_windows(): return False try: ctypes.cdll.ntdll.wine_get_version except AttributeError: return False else: return True def is_osx(): """If we are running under OS X""" return sys.platform == "darwin" def is_py2exe(): """If we are running under py2exe""" return is_windows() and hasattr(sys, "frozen") def is_py2exe_console(): """If we are running under py2exe in console mode""" return is_py2exe() and sys.frozen == "console_exe" def is_py2exe_window(): """If we are running under py2exe in window mode""" return is_py2exe() and not is_py2exe_console() ������������������������quodlibet-3.9.1/quodlibet/util/atomic.py������������������������������������������������������������0000644�0001750�0001750�00000005255�13112005742�020537� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013,2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Helpers for atomic file operations on Linux/OSX/Windows""" import os import contextlib import tempfile from senf import fsnative if os.name == "nt": from . import winapi else: import fcntl def _windows_rename(source, dest): """Replaces dest with source. Raises OSError in case of an error. """ assert os.name == "nt" # not atomic, but better than removing the original first.. status = winapi.MoveFileExW( source, dest, winapi.MOVEFILE_WRITE_THROUGH | winapi.MOVEFILE_REPLACE_EXISTING) if status == 0: raise winapi.WinError() @contextlib.contextmanager def atomic_save(filename, mode): """Try to replace the content of a file in the safest way possible. A temporary file will be created in the same directory where the replacement data can be written into. After writing is done the data will be flushed to disk and the original file replaced atomically. In case of an error this raises IOError and OSError and the original file will be untouched. In case the computer crashes or any other non-recoverable error happens the temporary file will be left behind and has to be deleted manually. with atomic_save("config.cfg", "wb") as f: f.write(data) """ assert isinstance(filename, fsnative) dir_ = os.path.dirname(filename) basename = os.path.basename(filename) fileobj = tempfile.NamedTemporaryFile( mode=mode, dir=dir_, prefix=basename + fsnative(u"_"), suffix=fsnative(u".tmp"), delete=False) try: yield fileobj fileobj.flush() fileno = fileobj.fileno() if os.name != "nt" and hasattr(fcntl, "F_FULLFSYNC"): # on OSX fsync doesn't sync all the way.. # https://lists.apple.com/archives/darwin-dev/2005/Feb/msg00072.html # https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/fsync.2.html fcntl.fcntl(fileno, fcntl.F_FULLFSYNC) else: # on linux fsync goes all the way by default # http://linux.die.net/man/2/fsync os.fsync(fileno) fileobj.close() if os.name == "nt": _windows_rename(fileobj.name, filename) else: os.rename(fileobj.name, filename) except: try: os.unlink(fileobj.name) except OSError: pass raise finally: fileobj.close() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/copool.py������������������������������������������������������������0000644�0001750�0001750�00000010277�13112005742�020556� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig, Alexandre Passos # 2014 Christoph Reiter # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Manage a pool of routines using Python iterators.""" from gi.repository import GLib from quodlibet.compat import PY2, listkeys class _Routine(object): def __init__(self, pool, func, funcid, priority, timeout, args, kwargs): self.priority = priority self.timeout = timeout self._source_id = None def wrap(func, funcid, args, kwargs): for value in func(*args, **kwargs): yield True pool.remove(funcid) yield False f = wrap(func, funcid, args, kwargs) self.source_func = f.next if PY2 else f.__next__ @property def paused(self): """If the routine is currently running""" return self._source_id is None def step(self): """Raises StopIteration if the routine has nothing more to do""" return self.source_func() def resume(self): """Resume, if already running do nothing""" if not self.paused: return if self.timeout: self._source_id = GLib.timeout_add( self.timeout, self.source_func, priority=self.priority) else: self._source_id = GLib.idle_add( self.source_func, priority=self.priority) def pause(self): """Pause, if already paused, do nothing""" if self.paused: return GLib.source_remove(self._source_id) self._source_id = None class CoPool(object): def __init__(self): self.__routines = {} def add(self, func, *args, **kwargs): """Register a routine to run in GLib main loop. func should be a function that returns a Python iterator (e.g. generator) that provides values until it should stop being called. Optional Keyword Arguments: priority -- priority to run at (default GLib.PRIORITY_LOW) funcid -- mutex/removal identifier for this function timeout -- use timeout_add (with given timeout) instead of idle_add (in milliseconds) Only one function with the same funcid can be running at once. Starting a new function with the same ID will stop the old one. If no funcid is given, the function itself is used. The funcid must be usable as a hash key. """ funcid = kwargs.pop("funcid", func) if funcid in self.__routines: remove(funcid) priority = kwargs.pop("priority", GLib.PRIORITY_LOW) timeout = kwargs.pop("timeout", None) routine = _Routine(self, func, funcid, priority, timeout, args, kwargs) self.__routines[funcid] = routine routine.resume() def _get(self, funcid): if funcid in self.__routines: return self.__routines[funcid] raise ValueError("no pooled routine %r" % funcid) def remove(self, funcid): """Stop a registered routine.""" routine = self._get(funcid) routine.pause() del self.__routines[funcid] def remove_all(self): """Stop all running routines.""" for funcid in listkeys(self.__routines): self.remove(funcid) def pause(self, funcid): """Temporarily pause a registered routine.""" routine = self._get(funcid) routine.pause() def pause_all(self): """Temporarily pause all registered routines.""" for funcid in self.__routines.keys(): self.pause(funcid) def resume(self, funcid): """Resume a paused routine.""" routine = self._get(funcid) routine.resume() def step(self, funcid): """Force this function to iterate once.""" routine = self._get(funcid) return routine.step() # global instance _copool = CoPool() add = _copool.add pause = _copool.pause pause_all = _copool.pause_all remove = _copool.remove remove_all = _copool.remove_all resume = _copool.resume step = _copool.step ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/winpipe.py�����������������������������������������������������������0000644�0001750�0001750�00000011563�13112005742�020735� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014,2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import threading import ctypes if os.name == "nt": from . import winapi from gi.repository import GLib def write_pipe(pipe_name, data): """Writes the data to the pipe or raises EnvironmentError""" assert isinstance(data, bytes) # XXX: otherwise many consecutive open fail, no idea.. pipe_exists(pipe_name) filename = NamedPipeServer._get_filename(pipe_name) with open(filename, "wb") as h: h.write(data) def pipe_exists(pipe_name): """Returns True if the named pipe named 'pipe_name' currently exists""" timeout_ms = 1 filename = NamedPipeServer._get_filename(pipe_name) try: if winapi.WaitNamedPipeW(filename, timeout_ms) == 0: raise ctypes.WinError() except WindowsError: return False return True class NamedPipeServerError(Exception): pass class NamedPipeServer(threading.Thread): """A named pipe for Windows. * server: server = NamedPipeServer("foo", lambda data: ...) server.start() glib_loop() server.stop() * client: with open(NamedPipeServer.get_filename("foo"), "wb") as h: h.write("Hello World") """ def __init__(self, name, callback): """name is the name of the pipe file (should be unique I guess) callback will be called with new data until close() is called. """ super(NamedPipeServer, self).__init__() self._event = threading.Event() self._filename = self._get_filename(name) self._callback = callback self._stopped = False @classmethod def _get_filename(cls, name): return u"\\\\.\\pipe\\%s" % name def _process(self, data): def idle_process(data): if not self._stopped: self._callback(data) return False GLib.idle_add(idle_process, data) def start(self): super(NamedPipeServer, self).start() # make sure we can use write_pipe() immediately after this returns self._event.wait() if self._stopped: # something went wrong (maybe another instance is running) raise NamedPipeServerError("Setting up named pipe failed") def run(self): buffer_size = 4096 try: handle = winapi.CreateNamedPipeW( self._filename, (winapi.PIPE_ACCESS_INBOUND | winapi.FILE_FLAG_FIRST_PIPE_INSTANCE), (winapi.PIPE_TYPE_BYTE | winapi.PIPE_READMODE_BYTE | winapi.PIPE_WAIT | winapi.PIPE_REJECT_REMOTE_CLIENTS), winapi.PIPE_UNLIMITED_INSTANCES, buffer_size, buffer_size, winapi.NMPWAIT_USE_DEFAULT_WAIT, None) if handle == winapi.INVALID_HANDLE_VALUE: raise ctypes.WinError() except WindowsError: # due to FILE_FLAG_FIRST_PIPE_INSTANCE and not the first instance self._stopped = True self._event.set() return self._event.set() while 1: data = bytearray() try: if winapi.ConnectNamedPipe(handle, None) == 0: raise ctypes.WinError() while 1: readbuf = ctypes.create_string_buffer(buffer_size) bytesread = winapi.DWORD() try: if winapi.ReadFile( handle, readbuf, buffer_size, ctypes.byref(bytesread), None) == 0: raise ctypes.WinError() except WindowsError: break else: message = readbuf[:bytesread.value] data += message if winapi.DisconnectNamedPipe(handle) == 0: raise ctypes.WinError() except WindowsError: # better not loop forever.. break finally: if self._stopped: break if data: self._process(bytes(data)) # ignore errors here.. winapi.CloseHandle(handle) def stop(self): """After this returns the callback will no longer be called. Can be called multiple times. """ self._event.wait() if self._stopped: return self._stopped = True try: with open(self._filename, "wb") as h: h.write(b"stop!") except EnvironmentError: pass self._callback = None self.join() ���������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/windows.py�����������������������������������������������������������0000644�0001750�0001750�00000012427�13112005742�020754� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013,2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import import os import ctypes from quodlibet.compat import text_type if os.name == "nt": from . import winapi from .winapi import SHGFPType, CSIDLFlag, CSIDL, GUID, \ SHGetFolderPathW, S_OK, MAX_PATH, \ KnownFolderFlag, FOLDERID, SHGetKnownFolderPath, CoTaskMemFree, \ CoInitialize, IShellLinkW, CoCreateInstance, CLSID_ShellLink, \ CLSCTX_INPROC_SERVER, IPersistFile def open_folder_and_select_items(folder, items=None): """Shows a directory and optional files or subdirectories in the file manager (explorer.exe). If both folder and items is given the file manager will display the content of `folder` and highlight all `items`. If only a directory is given then the content of the parent directory is shown and the `folder` highlighted. Might raise WindowsError in case something fails (any of the files not existing etc.) """ if items is None: items = [] assert isinstance(folder, text_type) for item in items: assert isinstance(item, text_type) assert not os.path.split(item)[0] desktop = winapi.IShellFolder() parent = winapi.IShellFolder() parent_id = winapi.PIDLIST_ABSOLUTE() child_ids = (winapi.PIDLIST_RELATIVE * len(items))() try: winapi.CoInitialize(None) winapi.SHParseDisplayName( folder, None, ctypes.byref(parent_id), 0, None) winapi.SHGetDesktopFolder(ctypes.byref(desktop)) desktop.BindToObject( parent_id, None, winapi.IShellFolder.IID, ctypes.byref(parent)) for i, item in enumerate(items): attrs = winapi.ULONG(0) parent.ParseDisplayName( None, None, item, None, ctypes.byref(child_ids[i]), ctypes.byref(attrs)) winapi.SHOpenFolderAndSelectItems( parent_id, len(child_ids), winapi.PCUITEMID_CHILD_ARRAY(child_ids), 0) finally: for child_id in child_ids: if child_id: winapi.CoTaskMemFree(child_id) if parent_id: winapi.ILFree(parent_id) if parent: parent.Release() if desktop: desktop.Release() def _get_path(folder, default=False, create=False): """A path to an directory or None. Takes a CSIDL instance as folder. """ if default: flags = SHGFPType.DEFAULT else: flags = SHGFPType.CURRENT if create: folder |= CSIDLFlag.CREATE # we don't want env vars folder |= CSIDLFlag.DONT_UNEXPAND buffer_ = ctypes.create_unicode_buffer(MAX_PATH) try: result = SHGetFolderPathW(0, folder, 0, flags, buffer_) except WindowsError: return None if result != S_OK: return None return buffer_.value def _get_known_path(folder, default=False, create=False): """A path to an directory or None Takes a FOLDERID instances as folder. """ if default: flags = KnownFolderFlag.DEFAULT_PATH else: flags = 0 if create: flags |= KnownFolderFlag.CREATE flags |= KnownFolderFlag.DONT_VERIFY ptr = ctypes.c_wchar_p() guid = GUID(folder) try: result = SHGetKnownFolderPath( ctypes.byref(guid), flags, None, ctypes.byref(ptr)) except WindowsError: return None if result != S_OK: return None path = ptr.value CoTaskMemFree(ptr) return path def get_personal_dir(**kwargs): r"""e.g. 'C:\Users\<user>\Documents'""" return _get_path(CSIDL.PERSONAL, **kwargs) def get_appdate_dir(**kwargs): r"""e.g. 'C:\Users\<user>\AppDate\Roaming'""" return _get_path(CSIDL.APPDATA, **kwargs) def get_desktop_dir(**kwargs): r"""e.g. 'C:\Users\<user>\Desktop'""" return _get_path(CSIDL.DESKTOP, **kwargs) def get_music_dir(**kwargs): r"""e.g. 'C:\Users\<user>\Music'""" return _get_path(CSIDL.MYMUSIC, **kwargs) def get_profile_dir(**kwargs): r"""e.g. 'C:\Users\<user>'""" return _get_path(CSIDL.PROFILE, **kwargs) def get_links_dir(**kwargs): r"""e.g. 'C:\Users\<user>\Links'""" return _get_known_path(FOLDERID.LINKS, **kwargs) def get_link_target(path): """Takes a path to a .lnk file and returns a path the .lnk file is targeting. Might raise WindowsError in case something fails. """ assert isinstance(path, text_type) CoInitialize(None) pShellLinkW = IShellLinkW() CoCreateInstance( ctypes.byref(CLSID_ShellLink), None, CLSCTX_INPROC_SERVER, ctypes.byref(IShellLinkW.IID), ctypes.byref(pShellLinkW)) try: pPersistFile = IPersistFile() pShellLinkW.QueryInterface(ctypes.byref(IPersistFile.IID), ctypes.byref(pPersistFile)) try: buffer_ = ctypes.create_unicode_buffer(path, MAX_PATH) pPersistFile.Load(buffer_, 0) finally: pPersistFile.Release() pShellLinkW.GetPath(buffer_, MAX_PATH, None, 0) finally: pShellLinkW.Release() return ctypes.wstring_at(buffer_) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/urllib.py������������������������������������������������������������0000644�0001750�0001750�00000002322�13114570754�020560� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import from quodlibet.compat import PY2 from .misc import get_ca_file if PY2: import urllib2 as request_module else: from urllib import request as request_module Request = request_module.Request urlopen = request_module.urlopen # For general error handling use EnvironmentError def install_urllib2_ca_file(): """Makes urllib2.urlopen and urllib2.build_opener use the ca file returned by get_ca_file() """ try: import ssl except ImportError: return base = request_module.HTTPSHandler class MyHandler(base): def __init__(self, debuglevel=0, context=None): ca_file = get_ca_file() if context is None and ca_file is not None: context = ssl.create_default_context( purpose=ssl.Purpose.SERVER_AUTH, cafile=ca_file) base.__init__(self, debuglevel, context) request_module.HTTPSHandler = MyHandler ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/dbusutils.py���������������������������������������������������������0000644�0001750�0001750�00000026014�13112005742�021275� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012, 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import xml.etree.ElementTree as ET import dbus import dbus.service from quodlibet.compat import unichr, text_type, PY3, iteritems def dbus_unicode_validate(text): """Takes a unicode string and replaces all invalid codepoints that would lead to errors if passed to dbus""" if isinstance(text, bytes): text = text.decode("utf-8") # https://bugs.freedesktop.org/show_bug.cgi?id=40817 def valid(c): return (c < 0x110000 and (c & 0xFFFFF800) != 0xD800 and (c < 0xFDD0 or c > 0xFDEF) and (c & 0xFFFE) != 0xFFFE) cps = [] for c in map(ord, text): if valid(c): cps.append(c) else: cps.append(0xFFFD) return u"".join(map(unichr, cps)) def list_spec_properties(spec): """Parse a property spec and return a dict: {'Metadata': {'access': 'read', 'type': 'a{sv}', 'emit': 'true'} 'access' can be: read/write/readwrite 'type' is the dbus data type (dbus.Signature instance) 'emit' can be true/false/invalidates (see dbus spec) """ if not isinstance(spec, bytes): spec = spec.encode("utf-8") assert isinstance(spec, bytes) ANNOTATION_EMITS = "org.freedesktop.DBus.Property.EmitsChangedSignal" def get_emit(element, fallback): for anno in element.findall("annotation"): if anno.attrib["name"] == ANNOTATION_EMITS: emit = anno.attrib["value"] break else: emit = fallback return emit root = ET.fromstring(b'<?xml version="1.0"?><props>' + spec + b'</props>') props = {} root_emit = get_emit(root, "true") for element in root: if element.tag != "property": continue attrs = element.attrib attrs["emit"] = get_emit(element, root_emit) attrs["type"] = dbus.Signature(attrs["type"]) props[attrs.pop("name")] = attrs return props def filter_property_spec(spec, wl=None, bl=None): """Remove properties based on a white list or black list.""" if not isinstance(spec, bytes): spec = spec.encode("utf-8") assert isinstance(spec, bytes) if wl and bl: raise ValueError if not wl and not bl: return spec root = ET.fromstring(b'<?xml version="1.0"?><props>' + spec + b'</props>') if wl: to_rm = lambda e: e.attrib["name"] not in wl elif bl: to_rm = lambda e: e.attrib["name"] in bl strs = [] for element in root: if element.tag != "property" or not to_rm(element): strs.append(ET.tostring(element).strip()) return b"\n".join(strs) TYPE_MAP = { "b": dbus.Boolean, "n": dbus.Int16, "i": dbus.Int32, "x": dbus.Int64, "q": dbus.UInt16, "u": dbus.UInt32, "t": dbus.UInt64, "d": dbus.Double, "o": dbus.ObjectPath, "g": dbus.Signature, "v": lambda x: x, } def apply_signature(value, sig, utf8_strings=False): """Casts basic types to the right dbus types and packs them into containers with the right signature, so they get validated on sending.""" # dbus properties are variant, but have a signature defined, so # we have to convert manually here. if sig in TYPE_MAP: return TYPE_MAP[sig](value) elif sig.startswith("a{"): return dbus.Dictionary(value, signature=sig[2:-1]) elif sig.startswith("a("): return dbus.Struct(value, signature=sig[2:-1]) elif sig.startswith("a"): return dbus.Array(value, signature=sig[1:]) elif sig == "s": if utf8_strings and not PY3: if isinstance(value, text_type): value = value.encode("utf-8") return dbus.UTF8String(value) else: if isinstance(value, bytes): value = value.decode("utf-8") return dbus.String(value) else: return TYPE_MAP[sig](value) # Unknown type, just return as is return value class DBusIntrospectable(object): """Simply collects all introspection data from other mixins and provides the Introspect DBus method returning all combined. All classes need to call set_introspection with their interface and provided signals, properties, methods in the introspection xml format. The dbus bindings allready provide a Introspect method, but it doesn't understand properties, also having them in text format in the class is a nice documentation. """ IFACE = "org.freedesktop.DBus.Introspectable" ISPEC = """ <method name="Introspect"> <arg type="s" name="xml_data" direction="out"/> </method> """ def __init__(self): self.__ispec = {} self.set_introspection(DBusIntrospectable.IFACE, DBusIntrospectable.ISPEC) def set_introspection(self, interface, introspection): self.__ispec.setdefault(interface, []).append(introspection) @dbus.service.method(IFACE) def Introspect(self): parts = [] parts.append("<node>") for iface, intros in iteritems(self.__ispec): parts.append("<interface name=\"%s\">" % iface) parts.extend(intros) parts.append("</interface>") parts.append("</node>") return ("\n".join(parts)).encode("utf-8") class DBusProperty(object): """A mixin for dbus.Object classes to support dbus properties. Register properties by passing the XML introspection to 'set_properties'. The class needs to provide 'get/set_property'. In case the base Object is a FallbackObject, 'get/set_property' also need to handle an additional realtive path parameter. Whenever a property changes, 'emit_properties_changed' needs to be called (except if the annotations disable it). In case of FallbackObject, with a relative path to the real object (defaults to the main one). """ IFACE = "org.freedesktop.DBus.Properties" ISPEC = """ <method name="Get"> <arg type="s" name="interface_name" direction="in"/> <arg type="s" name="property_name" direction="in"/> <arg type="v" name="value" direction="out"/> </method> <method name="GetAll"> <arg type="s" name="interface_name" direction="in"/> <arg type="a{sv}" name="properties" direction="out"/> </method> <method name="Set"> <arg type="s" name="interface_name" direction="in"/> <arg type="s" name="property_name" direction="in"/> <arg type="v" name="value" direction="in"/> </method> <signal name="PropertiesChanged"> <arg type="s" name="interface_name"/> <arg type="a{sv}" name="changed_properties"/> <arg type="as" name="invalidated_properties"/> </signal>""" def __init__(self): self.__props = {} self.__impl = {} self.set_introspection(DBusProperty.IFACE, DBusProperty.ISPEC) def set_properties(self, interface, ispec, bl=None, wl=None): """Register properties and set instrospection for the given property spec. Provide a black list or white list, for optional, not implemented properties.""" ispec = filter_property_spec(ispec, wl=wl, bl=bl) self.__props[interface] = list_spec_properties(ispec) self.__impl.setdefault(interface, []) self.set_introspection(interface, ispec) def get_properties(self, interface): """Returns a list of (interface, property) for all properties of the specified interface and subinterfaces""" result = [(interface, p) for p in self.__props[interface].keys()] for sub in self.__impl[interface]: result.extend(self.get_properties(sub)) return result def get_value(self, interface, prop, path="/"): """Returns the value of a property""" interface = self.get_interface(interface, prop) if self.SUPPORTS_MULTIPLE_OBJECT_PATHS: value = self.get_property(interface, prop, path) else: value = self.get_property(interface, prop) prop_sig = self.__props[interface][prop]["type"] return apply_signature(value, prop_sig) def get_interface(self, interface, prop): """Returns the real interface that implements the property""" if prop in self.__props[interface]: return interface for sub in self.__impl[interface]: if self.get_interface(sub, prop): return sub def implement_interface(self, iface, sub_iface): """Set a sub interface. All actions on that interface will check the sub interface in case the property is not found.""" self.__props.setdefault(iface, {}) self.__props.setdefault(sub_iface, {}) self.__impl.setdefault(iface, []).append(sub_iface) def emit_properties_changed(self, interface, properties, path="/"): """Emits PropertiesChanged for the specified properties""" combos = {} for prop in properties: iface = self.get_interface(interface, prop) if iface is None: raise ValueError("Property %s not registered" % prop) combos.setdefault(iface, []).append(prop) for iface, props in iteritems(combos): values = {} inval = [] for prop in props: emit = self.__props[iface][prop]["emit"] if emit == "false": raise ValueError("Can't emit changed signal for %s" % prop) elif emit == "true": values[prop] = self.get_value(iface, prop, path) elif emit == "invalidates": inval.append(prop) if self.SUPPORTS_MULTIPLE_OBJECT_PATHS: self.PropertiesChanged(iface, values, inval, rel=path) else: self.PropertiesChanged(iface, values, inval) @dbus.service.method(dbus_interface=IFACE, in_signature="ss", out_signature="v", rel_path_keyword="path") def Get(self, interface, prop, path): return self.get_value(interface, prop, path) @dbus.service.method(dbus_interface=IFACE, in_signature="ssv", out_signature="", rel_path_keyword="path") def Set(self, interface, prop, value, path): interface = self.get_interface(interface, prop) if self.SUPPORTS_MULTIPLE_OBJECT_PATHS: self.set_property(interface, prop, value, path) else: self.set_property(interface, prop, value) @dbus.service.method(dbus_interface=IFACE, in_signature="s", out_signature="a{sv}", rel_path_keyword="path") def GetAll(self, interface, path): values = {} for iface, prop in self.get_properties(interface): values[prop] = self.get_value(iface, prop, path) return values @dbus.service.signal(IFACE, signature="sa{sv}as", rel_path_keyword="rel") def PropertiesChanged(self, interface, changed, invalidated, rel=""): pass ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/modulescanner.py�����������������������������������������������������0000644�0001750�0001750�00000011053�13112005742�022113� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys import imp from os.path import dirname from traceback import format_exception from quodlibet.util.path import mtime from quodlibet.util.importhelper import get_importables, load_module from quodlibet.util import print_d from quodlibet.compat import iteritems, listitems class Module(object): def __init__(self, name, module, deps, path): self.name = name self.module = module self.path = path self.deps = {} for dep in deps: self.deps[dep] = mtime(dep) def has_changed(self, dep_paths): if set(self.deps.keys()) != set(dep_paths): return True for path, old_mtime in iteritems(self.deps): if mtime(path) != old_mtime: return True return False def __repr__(self): return "<%s name=%r>" % (type(self).__name__, self.name) class ModuleImportError(object): def __init__(self, name, exception, traceback): self.name = name self.exception = exception self.traceback = traceback class ModuleScanner(object): """ Handles plugin modules. Takes a list of directories and searches for loadable python modules/packages in all of them. There is only one global namespace for modules using the module name as key. rescan() - Update the module list. Returns added/removed module names failures - A dict of Name: (Exception, Text) for all modules that failed modules - A dict of Name: Module for all successfully loaded modules """ def __init__(self, folders): self.__folders = folders self.__modules = {} # name: module self.__failures = {} # name: exception @property def failures(self): """A name: exception dict for all modules that failed to load""" return self.__failures @property def modules(self): """A name: module dict of all loaded modules""" return self.__modules def rescan(self): """Rescan all folders for changed/new/removed modules. The caller should release all references to removed modules. Returns a tuple: (removed, added) """ print_d("Rescanning..") info = {} # get what is there atm for folder in self.__folders: for name, path, deps in get_importables(folder, True): # take the basename as module key, later modules win info[name] = (path, deps) # python can not unload a module, so we can only add new ones # or reload if the path is the same and mtime changed, # but we can still pretend we removed something removed = [] added = [] # remove those that are gone and changed ones for name, mod in listitems(self.__modules): # not here anymore, remove if name not in info: del self.__modules[name] removed.append(name) continue # check if any dependency has changed path, new_deps = info[name] if mod.has_changed(new_deps): del self.__modules[name] removed.append(name) self.__failures.clear() # add new ones for (name, (path, deps)) in iteritems(info): if name in self.__modules: continue try: # add a real module, so that pickle works # https://github.com/quodlibet/quodlibet/issues/1093 parent = "quodlibet.fake" if parent not in sys.modules: sys.modules[parent] = imp.new_module(parent) vars(sys.modules["quodlibet"])["fake"] = sys.modules[parent] mod = load_module(name, parent + ".plugins", dirname(path), reload=True) if mod is None: continue except Exception as err: text = format_exception(*sys.exc_info()) self.__failures[name] = ModuleImportError(name, err, text) else: added.append(name) self.__modules[name] = Module(name, mod, deps, path) print_d("Rescanning done: %d added, %d removed, %d error(s)" % (len(added), len(removed), len(self.__failures))) return removed, added �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/http.py��������������������������������������������������������������0000644�0001750�0001750�00000024674�13112005742�020250� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Simonas Kazlauskas # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import json from gi.repository import Soup, Gio, GLib, GObject from gi.repository.GObject import ParamFlags, SignalFlags if not hasattr(Gio.MemoryOutputStream, 'new_resizable'): raise ImportError( 'GLib and gobject-introspection libraries are too old. GLib since ' + '2.36 and gobject-introspection since 1.36 are known to work fine.') from quodlibet.const import VERSION, WEBSITE from quodlibet.util import print_d, print_w PARAM_READWRITECONSTRUCT = \ ParamFlags.CONSTRUCT_ONLY | ParamFlags.READABLE | ParamFlags.WRITABLE SoupStatus = Soup.Status if hasattr(Soup, 'Status') else Soup.KnownStatusCode class DefaultHTTPRequest(GObject.Object): """ Class encapsulating a single HTTP request. These are meant to be sent and received only once. Behaviour is undefined otherwise. """ __gsignals__ = { # Successes 'sent': (SignalFlags.RUN_LAST, None, (Soup.Message,)), 'received': (SignalFlags.RUN_LAST, None, (Gio.OutputStream,)), # Failures 'send-failure': (SignalFlags.RUN_LAST, None, (object,)), 'receive-failure': (SignalFlags.RUN_LAST, None, (object,)), # Common failure signal which will be emitted when either of above # failure signals are. 'failure': (SignalFlags.RUN_LAST, None, (object,)), } message = GObject.Property(type=Soup.Message, flags=PARAM_READWRITECONSTRUCT) cancellable = GObject.Property(type=Gio.Cancellable, flags=PARAM_READWRITECONSTRUCT) istream = GObject.Property(type=Gio.InputStream, default=None) ostream = GObject.Property(type=Gio.OutputStream, default=None) def __init__(self, message, cancellable): if message is None: raise ValueError('Message may not be None') inner_cancellable = Gio.Cancellable.new() super(DefaultHTTPRequest, self).__init__(message=message, cancellable=inner_cancellable) if cancellable is not None: cancellable.connect(lambda *x: self.cancel(), None) self.connect('send-failure', lambda r, e: r.emit('failure', e)) self.connect('receive-failure', lambda r, e: r.emit('failure', e)) # For simple access self._receive_started = False self._uri = self.message.get_uri().to_string(False) def send(self): """ Send the request and receive HTTP headers. Some of the body might get downloaded too. """ print_d('Sending {1} request to {0}'.format(self._uri, self.message.method)) session.send_async(self.message, self.cancellable, self._sent, None) def _sent(self, session, task, data): try: status = int(self.message.get_property('status-code')) if status >= 400: msg = 'HTTP {0} error in {1} request to {2}'.format( status, self.message.method, self._uri) print_w(msg) return self.emit('send-failure', Exception(msg)) self.istream = session.send_finish(task) print_d('Sent {1} request to {0}'.format(self._uri, self.message.method)) self.emit('sent', self.message) except GLib.GError as e: print_w('Failed sending request to {0} ({1})'.format(self._uri, e)) self.emit('send-failure', e) def provide_target(self, stream): if not stream: raise ValueError('Provided stream may not be None') if not self.ostream: self.ostream = stream else: raise RuntimeError('Only one output stream may be provided') def cancel(self): """ Cancels the future and currently running HTTPRequest actions. It is safe to run this function before, during and after any action made with HTTPRequest. After HTTPRequest is cancelled, one usually would not do any more actions with it. However, it is safe to do something after cancellation, but those actions usually will fail. """ if self.cancellable.is_cancelled(): return False self.cancellable.cancel() # If we already have input stream, we can just close it, message # will come out as cancelled just fine. if self.istream and not self._receive_started: # Read contents from input stream (because otherwise in Soup # <2.44.1, unread data will leak into the next request and it will # become unparsable. if not self.istream.is_closed(): while self.istream.read_bytes(512, None).get_size(): pass self.istream.close(None) else: session.cancel_message(self.message, SoupStatus.CANCELLED) def receive(self): """ Receive data from the request into provided output stream. The request must be already sent, therefore this function will be usually called from the 'sent' signal handler. On completion of data receipt, HTTPRequest lifetime is ended and inner resources are cleaned up (except persistent connections that are part of session, not request). .. note:: Be sure to clean up resources you've allocated yourself (e.g. close GOutputStreams, delete files on failure et cetera). """ if not self.istream: raise RuntimeError('Cannot receive unsent request') if not self.ostream: raise RuntimeError('Cannot receive request without output stream') if self._receive_started: raise RuntimeError('Can receive only once') self._receive_started = True def spliced(ostream, task, data): try: ostream.splice_finish(task) self.istream.close(None) self.emit('received', ostream) except GLib.GError as e: while self.istream.read_bytes(512, None).get_size(): pass self.istream.close(None) self.emit('receive-failure', e) # Do not ask splice to close the stream as Soup gets confused and # doesn't close connections # https://bugzilla.gnome.org/show_bug.cgi?id=711260 flags = Gio.OutputStreamSpliceFlags.NONE self.ostream.splice_async(self.istream, flags, GLib.PRIORITY_DEFAULT, self.cancellable, spliced, None) class FallbackHTTPRequest(DefaultHTTPRequest): """ Fallback code which does not use Gio.InputStream based APIs which are not available before libsoup 2.44 introspection. To be used with Soup.SessionAsync instead of regular Soup.Session. Unlike DefaultHTTPRequest, keeps downloaded content in memory until the request is completed. Also it keeps downloading the content even if receive function is not called (it does, however, stop if the request is cancelled). """ _is_done = False def send(self): print_d('Sending request to {0}'.format(self._uri)) self.message.get_property('response-body').set_accumulate(False) session.queue_message(self.message, lambda *x: None, None) self.message.connect('got-headers', self._sent) self.message.connect('finished', self._finished) def _sent(self, message): if self.cancellable.is_cancelled(): return self.emit('send-failure', Exception('Cancelled')) if 300 <= message.get_property('status-code') < 400: return # redirection, wait for another emission of got-headers self.istream = Gio.MemoryInputStream.new() self.message.connect('got-chunk', self._chunk) print_d('Sent request to {0}'.format(self._uri)) self.emit('sent', self.message) def _chunk(self, message, buffer): self.istream.add_bytes(buffer.get_as_bytes()) def _finished(self, *args): self._is_done = True self.notify('istream') def receive(self): def do_receive(*args): self.disconnect(istr_id) super(FallbackHTTPRequest, self).receive() istr_id = 0 if not self._is_done and self.istream: istr_id = self.connect('notify::istream', do_receive) else: do_receive() def cancel(self): if self.cancellable.is_cancelled(): return False session.cancel_message(self.message, SoupStatus.CANCELLED) super(FallbackHTTPRequest, self).cancel() def download(message, cancellable, callback, data, try_decode=False): def received(request, ostream): ostream.close(None) bs = ostream.steal_as_bytes().get_data() if not try_decode: callback(message, bs, data) return # Otherwise try to decode data code = int(message.get_property('status-code')) if code >= 400: print_w("HTTP %d error received on %s" % (code, request._uri)) return ctype = message.get_property('response-headers').get_content_type() encoding = ctype[1].get('charset', 'utf-8') try: callback(message, bs.decode(encoding), data) except UnicodeDecodeError: callback(message, bs, data) request = HTTPRequest(message, cancellable) request.provide_target(Gio.MemoryOutputStream.new_resizable()) request.connect('received', received) request.connect('sent', lambda r, m: r.receive()) request.send() def download_json(message, cancellable, callback, data): def cb(message, result, d): try: callback(message, json.loads(result), data) except ValueError: callback(message, None, data) download(message, cancellable, cb, None, True) if hasattr(Soup.Session, 'send_finish'): # We're using Soup >= 2.44 session = Soup.Session.new() HTTPRequest = DefaultHTTPRequest else: print_d('Using fallback HTTPRequest implementation. libsoup is too old') session = Soup.SessionAsync.new() HTTPRequest = FallbackHTTPRequest ua_string = "Quodlibet/{0} (+{1})".format(VERSION, WEBSITE) session.set_properties(user_agent=ua_string, timeout=15) ��������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/tagsfrompath.py������������������������������������������������������0000644�0001750�0001750�00000005360�13112005742�021757� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import re from senf import fsnative, fsn2text from quodlibet.util import re_escape class TagsFromPattern(object): def __init__(self, pattern): self.headers = [] self.slashes = len(pattern) - len(pattern.replace(os.path.sep, '')) + 1 self.pattern = None # patterns look like <tagname> non regexy stuff <tagname> ... pieces = re.split(r'(<[A-Za-z0-9~_]+>)', pattern) override = {'<tracknumber>': r'\d\d?', '<discnumber>': r'\d\d??'} dummies_found = 0 for i, piece in enumerate(pieces): if not piece: continue if piece[0] + piece[-1] == '<>': piece = piece.lower() # canonicalize to lowercase tag names if "~" in piece: dummies_found += 1 piece = "<QUOD_LIBET_DUMMY_%d>" % dummies_found pieces[i] = '(?P%s%s)' % (piece, override.get(piece, '.+?')) if "QUOD_LIBET" not in piece: self.headers.append(piece[1:-1]) else: pieces[i] = re_escape(piece) # some slight magic to anchor searches "nicely" # nicely means if it starts with a <tag>, anchor with a / # if it ends with a <tag>, anchor with .xxx$ # but if it's a <tagnumber>, don't bother as \d+ is sufficient # and if it's not a tag, trust the user if pattern.startswith('<') and not pattern.startswith('<tracknumber>')\ and not pattern.startswith('<discnumber>'): pieces.insert(0, re_escape(os.path.sep)) if pattern.endswith('>') and not pattern.endswith('<tracknumber>')\ and not pattern.endswith('<discnumber>'): pieces.append(r'(?:\.[A-Za-z0-9_+]+)$') self.pattern = re.compile(''.join(pieces)) def match(self, song): return self.match_path(song["~filename"]) def match_path(self, path): assert isinstance(path, fsnative) tail = os.path.splitdrive(path)[-1] # only match on the last n pieces of a filename, dictated by pattern # this means no pattern may effectively cross a /, despite .* doing so sep = os.path.sep matchon = sep + sep.join(tail.split(sep)[-self.slashes:]) # work on unicode matchon = fsn2text(matchon) match = self.pattern.search(matchon) # dicts for all! if match is None: return {} else: return match.groupdict() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/dprint.py������������������������������������������������������������0000644�0001750�0001750�00000020556�13112005742�020564� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011,2013,2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import import sys import time import os import traceback import re import logging import errno from senf import print_, path2fsn, fsn2text, environ, fsnative from quodlibet import const from quodlibet.compat import PY2, text_type from .environment import is_py2exe_window, is_windows from .string import decode from . import logging as ql_logging class Color(object): NO_COLOR = '\033[0m' MAGENTA = '\033[95m' BLUE = '\033[94m' CYAN = '\033[96m' WHITE = '\033[97m' YELLOW = '\033[93m' GREEN = '\033[92m' RED = '\033[91m' BLACK = '\033[90m' GRAY = '\033[2m' class Colorise(object): @classmethod def __reset(cls, text): return text + Color.NO_COLOR @classmethod def magenta(cls, text): return cls.__reset(Color.MAGENTA + text) @classmethod def blue(cls, text): return cls.__reset(Color.BLUE + text) @classmethod def cyan(cls, text): return cls.__reset(Color.CYAN + text) @classmethod def white(cls, text): return cls.__reset(Color.WHITE + text) @classmethod def yellow(cls, text): return cls.__reset(Color.YELLOW + text) @classmethod def green(cls, text): return cls.__reset(Color.GREEN + text) @classmethod def red(cls, text): return cls.__reset(Color.RED + text) @classmethod def black(cls, text): return cls.__reset(Color.BLACK + text) @classmethod def bold(cls, text): return cls.__reset('\033[1m' + text) @classmethod def gray(cls, text): return cls.__reset(Color.GRAY + text) _ANSI_ESC_RE = re.compile(u"(\x1b\[\d\d?m)") _ANSI_ESC_RE_B = re.compile(b"(\x1b\[\d\d?m)") def strip_color(text): """Strip ansi escape codes from the passed text""" if isinstance(text, bytes): return _ANSI_ESC_RE_B.sub(b"", text) return _ANSI_ESC_RE.sub(u"", text) def frame_info(level=0): """Return a short string describing the current stack frame which can be used for debug messages. level defines which frame should be used. 0 means the caller, 1 the caller of the caller etc. """ info = "" # The frame of the calling function if hasattr(sys, "_getframe"): frame = sys._getframe() else: return "" for i in range(level + 1): try: frame = frame.f_back except AttributeError: break f_code = frame.f_code co_name = f_code.co_name co_varnames = f_code.co_varnames # the calling function got arguments if co_varnames and co_varnames[0] in frame.f_locals: # the first one could be the class cls = frame.f_locals[co_varnames[0]] # If it's an instance get the class if not hasattr(cls, '__name__'): cls = cls.__class__ # the arg has an attr that is named like the function if hasattr(cls, co_name): info = cls.__name__ # else, get the module name if not info: info = frame.f_globals.get("__name__", "") # append the function/method name if info: info += "." + co_name return info def _should_write_to_file(file_): """In Windows UI mode we don't have a working stdout/stderr. With Python 2 sys.stdout.fileno() returns a negative fd, with Python 3 sys.stdout is None. When using py2exe we get a fd for a log file and have to look at __stdout__ instead. """ if is_py2exe_window(): if file_ is sys.stdout: file_ = sys.__stdout__ elif file_ is sys.stderr: file_ = sys.__stderr__ if file_ is None: return False try: return file_.fileno() >= 0 except (IOError, AttributeError): return True def _supports_ansi_escapes(file): """If one should pass ansi escape sequences to the file""" if file.isatty(): return True if is_windows(): # mintty return environ.get("TERM", "") == "xterm" return False def _print_message(string, custom_context, debug_only, prefix, color, logging_category, start_time=time.time()): if not isinstance(string, (text_type, fsnative)): string = text_type(string) context = frame_info(2) # strip the package name if context.count(".") > 1: context = context.split(".", 1)[-1] if custom_context: context = "%s(%r)" % (context, custom_context) timestr = ("%2.3f" % (time.time() - start_time))[-6:] info = "%s: %s: %s:" % ( getattr(Colorise, color)(prefix), Colorise.magenta(timestr), Colorise.blue(context)) lines = string.splitlines() if len(lines) > 1: string = os.linesep.join([info] + [" " * 4 + l for l in lines]) else: string = info + " " + lines[0] if not debug_only or const.DEBUG: file_ = sys.stderr if _should_write_to_file(file_): if not _supports_ansi_escapes(file_): string = strip_color(string) try: print_(string, file=file_, flush=True) except (IOError, OSError) as e: if e.errno == errno.EIO: # When we are started in a terminal with --debug and the # terminal gets closed we lose stdio/err before we stop # printing debug message, resulting in EIO and aborting the # exit process -> Just ignore it. pass else: raise ql_logging.log(strip_color(string), logging_category) def format_exception(etype, value, tb, limit=None): """Returns a list of text_type""" result_lines = traceback.format_exception(etype, value, tb, limit) return [fsn2text(path2fsn(l)) for l in result_lines] def format_exc(limit=None): """Returns text_type""" etype, value, tb = sys.exc_info() return u''.join(format_exception(etype, value, tb, limit)) def extract_tb(*args, **kwargs): """Returns a list of tuples containing (fsnative, int, text_type, text_type) """ tp = traceback.extract_tb(*args, **kwargs) if not PY2: return tp result = [] for filename, line_number, function_name, text in tp: filename = path2fsn(filename) function_name = decode(function_name) text = decode(text or u"") result.append((filename, line_number, function_name, text)) return result def print_exc(exc_info=None, context=None): """Prints the stack trace of the current exception or the passed one. Depending on the configuration will either print a short summary or the whole stacktrace. """ if exc_info is None: exc_info = sys.exc_info() etype, value, tb = exc_info if const.DEBUG: string = u"".join(format_exception(etype, value, tb)) else: # try to get a short error message pointing at the cause of # the exception filename, lineno, name, line = extract_tb(tb)[-1] text = u"".join(format_exception(etype, value, tb, 0)[1:]) string = u"%s:%s:%s: %s" % ( fsn2text(path2fsn(os.path.basename(filename))), lineno, name, text) _print_message(string, context, False, "E", "red", "errors") def print_d(string, context=None): """Print debugging information.""" _print_message(string, context, True, "D", "green", "debug") def print_w(string, context=None): """Print warnings""" _print_message(string, context, True, "W", "yellow", "warnings") def print_e(string, context=None): """Print errors""" _print_message(string, context, False, "E", "red", "errors") class PrintHandler(logging.Handler): """Converts logging records to our logging format""" def emit(self, record): print_func = { 'DEBUG': print_d, 'INFO': print_d, 'WARNING': print_w, 'ERROR': print_e, 'CRITICAL': print_e, }.get(record.levelname, print_d) exc_info = record.exc_info context = "%s.%s" % (record.module, record.funcName) record.exc_info = None print_func(self.format(record), context=context) if exc_info is not None: print_exc(record.exc_info, context=context) ��������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/util/collection.py��������������������������������������������������������0000644�0001750�0001750�00000051141�13114753767�021434� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2013 Joe Wreschnig, Michael Urman, Iñigo Serna, # Christoph Reiter, Steven Robertson # 2011-2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from __future__ import absolute_import import os import random from senf import fsnative, fsn2bytes, bytes2fsn from quodlibet import ngettext, _ from quodlibet import util from quodlibet import config from quodlibet.formats._audio import TAG_TO_SORT, NUMERIC_ZERO_DEFAULT from quodlibet.formats._audio import PEOPLE as _PEOPLE from quodlibet.compat import xrange, text_type, number_types, string_types, \ swap_to_string, listmap from collections import Iterable from quodlibet.util.path import escape_filename, unescape_filename from quodlibet.util.dprint import print_d from quodlibet.util.misc import total_ordering, hashable from .collections import HashedList PEOPLE = list(_PEOPLE) # Collections value albumartist more than song artist (Issue 1034) PEOPLE.remove("albumartist") PEOPLE.insert(0, "albumartist") ELPOEP = list(reversed(PEOPLE)) PEOPLE_SCORE = [100 ** i for i in xrange(len(PEOPLE))] def avg(nums): """Returns the average (arithmetic mean) of a list of numbers""" return float(sum(nums)) / len(nums) def bayesian_average(nums, c=None, m=None): """Returns the Bayesian average of an iterable of numbers, with parameters defaulting to config specific to ~#rating.""" m = m or config.RATINGS.default c = c or config.getfloat("settings", "bayesian_rating_factor", 0.0) ret = float(m * c + sum(nums)) / (c + len(nums)) return ret NUM_DEFAULT_FUNCS = { "length": "sum", "playcount": "sum", "added": "max", "lastplayed": "max", "laststarted": "max", "mtime": "max", "rating": "bav", "skipcount": "sum", "year": "min", "originalyear": "min", "filesize": "sum" } NUM_FUNCS = { "max": max, "min": min, "sum": sum, "avg": avg, "bav": bayesian_average } class Collection(object): """A collection of songs which implements some methods similar to the AudioFile class. The content of the collection can be changed by changing the content of the songs attribute. """ _cache_size = 6 songs = () def __init__(self): """Cache in _cache, LRU key order in _used, keys that return default are in _default""" self.__cache = {} self.__default = set() self.__used = [] def finalize(self): """Finalize the collection. Call this after songs get added or removed""" self.__cache.clear() self.__default.clear() self.__used = [] def get(self, key, default=u"", connector=u" - "): if not self.songs: return default if key[:1] == "~" and "~" in key[1:]: if not isinstance(default, string_types): return default keys = util.tagsplit(key) v = map(self.__get_cached_value, keys) def default_funct(x): if x is None: return default return x v = map(default_funct, v) v = map(lambda x: (isinstance(x, float) and "%.2f" % x) or x, v) v = map( lambda x: isinstance(x, string_types) and x or text_type(x), v) return connector.join(filter(None, v)) or default else: value = self.__get_cached_value(key) if value is None: return default return value __call__ = get def comma(self, key): value = self.get(key) return (value if isinstance(value, number_types) else value.replace("\n", ", ")) def list(self, key): v = self.get(key, connector=u"\n") if "~" in key[1:] else self.get(key) return [] if v == "" else v.split("\n") def __get_cached_value(self, key): if key in self.__cache: self.__used.remove(key) self.__used.insert(0, key) return self.__cache[key] elif key in self.__default: return None else: val = self.__get_value(key) if val is None: self.__default.add(key) else: self.__used.insert(0, key) self.__cache[key] = val # Remove the oldest if the cache is full if len(self.__used) > self._cache_size: self.__cache.pop(self.__used.pop(-1)) return val def __get_value(self, key): """This is similar to __call__ in the AudioFile class. All internal tags are changed to represent a collection of songs. """ # Using key:<func> runs the resulting list of values # through the function before returning it. # Numeric keys without a func will default to a reasonable function if key.startswith("~#"): key = key[2:] if key[-4:-3] == ":": func = key[-3:] key = key[:-4] elif key == "tracks": return len(self.songs) elif key == "discs": return len({song("~#disc", 1) for song in self.songs}) elif key == "bitrate": length = self.__get_value("~#length") if not length: return 0 w = lambda s: s("~#bitrate", 0) * s("~#length", 0) return sum(w(song) for song in self.songs) / length else: # Standard or unknown numeric key. # AudioFile will try to cast the values to int, # default to avg func = NUM_DEFAULT_FUNCS.get(key, "avg") key = "~#" + key func = NUM_FUNCS.get(func) if func: # If none of the songs can return a numeric key, # the album returns default values = (song(key) for song in self.songs) values = [v for v in values if v != ""] return func(values) if values else None elif key in NUMERIC_ZERO_DEFAULT: return 0 return None elif key[:1] == "~": key = key[1:] numkey = key.split(":")[0] keys = {"people": {}, "peoplesort": {}} if key in keys: people = keys["people"] peoplesort = keys["peoplesort"] for song in self.songs: # Rank people by "relevance" -- artists before composers # before performers, then by number of appearances. for w, k in enumerate(ELPOEP): persons = song.list(k) for person in persons: people[person] = (people.get(person, 0) - PEOPLE_SCORE[w]) if k in TAG_TO_SORT: persons = song.list(TAG_TO_SORT[k]) or persons for person in persons: peoplesort[person] = (peoplesort.get(person, 0) - PEOPLE_SCORE[w]) # It's cheaper to get people and peoplesort in one go keys["people"] = sorted(people.keys(), key=people.__getitem__)[:100] keys["peoplesort"] = sorted(peoplesort.keys(), key=peoplesort.__getitem__)[:100] ret = keys.pop(key) ret = (ret and "\n".join(ret)) or None other, values = keys.popitem() other = "~" + other if not values: self.__default.add(other) else: if other in self.__used: self.__used.remove(other) self.__used.append(other) self.__cache[other] = "\n".join(values) return ret elif numkey == "length": length = self.__get_value("~#" + key) return None if length is None else util.format_time(length) elif numkey == "long-length": length = self.__get_value("~#" + key[5:]) return (None if length is None else util.format_time_long(length)) elif numkey == "tracks": tracks = self.__get_value("~#" + key) return (None if tracks is None else ngettext("%d track", "%d tracks", tracks) % tracks) elif numkey == "discs": discs = self.__get_value("~#" + key) if discs > 1: return ngettext("%d disc", "%d discs", discs) % discs else: # TODO: check this is correct for discs == 1 return None elif numkey == "rating": rating = self.__get_value("~#" + key) if rating is None: return None return util.format_rating(rating) elif numkey == "filesize": size = self.__get_value("~#" + key) return None if size is None else util.format_size(size) key = "~" + key # Nothing special was found, so just take all values of the songs # and sort them by their number of appearance result = {} for song in self.songs: for value in song.list(key): result[value] = result.get(value, 0) - 1 values = listmap(lambda x: x[0], sorted(result.items(), key=lambda x: (x[1], x[0]))) return "\n".join(values) if values else None class Album(Collection): """Like a `Collection` but adds cover scanning, some attributes for sorting and uses a set for the songs.""" @util.cached_property def peoplesort(self): return util.human_sort_key(self.get("~peoplesort").split("\n")[0]) @util.cached_property def genre(self): return util.human_sort_key(self.get("genre").split("\n")[0]) @property def date(self): return self.get("date") @property def title(self): return self.get("album") def __init__(self, song): super(Album, self).__init__() self.songs = set() # albumsort is part of the album_key, so every song has the same self.sort = util.human_sort_key(song("albumsort")) self.key = song.album_key @property def str_key(self): return str(self.key) def finalize(self): """Finalize this album. Call after songs get added or removed""" super(Album, self).finalize() self.__dict__.pop("peoplesort", None) self.__dict__.pop("genre", None) def __repr__(self): return "Album(%s)" % repr(self.key) @hashable @swap_to_string @total_ordering class Playlist(Collection, Iterable): """A Playlist is a `Collection` that has list-like features Songs can appear more than once. """ __instances = [] @classmethod def playlists_featuring(cls, song): """Returns the list of playlists in which this song appears""" playlists = [] for instance in cls.__instances: if song in instance._list: playlists.append(instance) return playlists def get(self, key, default=u"", connector=u" - "): if key == "~name": return self.name return super(Playlist, self).get(key, default, connector) __call__ = get # List-like methods, for compatibilty with original Playlist class. def extend(self, songs): self._list.extend(songs) self.finalize() self._emit_changed(songs, msg="extend") def append(self, song): ret = self._list.append(song) self._emit_changed([song], msg="append") self.finalize() return ret def clear(self): self._emit_changed(self._list, msg="clear") del self._list[:] self.finalize() def __iter__(self): return iter(self._list) def __len__(self): return len(self._list) def __getitem__(self, index): return self._list[index] def index(self, value): return self._list.index(value) def __setitem__(self, key, value): self._list[key] = value self.finalize() @property def songs(self): return [s for s in self._list if not isinstance(s, string_types)] def __init__(self, name, library=None): super(Playlist, self).__init__() self.__inhibit_library_signals = False self.__instances.append(self) name = text_type(name) if not name: raise ValueError("Playlists must have a name") # we require a file library here with masking assert library is None or hasattr(library, "masked") self.name = name self.library = library self._list = HashedList() @classmethod def suggested_name_for(cls, songs): if len(songs) == 1: title = songs[0].comma("title") else: title = ngettext( "%(title)s and %(count)d more", "%(title)s and %(count)d more", len(songs) - 1) % ( {'title': songs[0].comma("title"), 'count': len(songs) - 1}) return title def rename(self, new_name): """Changes this playlist's name and re-saves, or raises an `ValueError` if the name is not allowed""" if new_name == self.name: return self.name = self._validated_name(new_name) self.write() def _validated_name(self, new_name): """Returns a transformed (or not) name, or raises a `ValueError` if the name is not allowed """ new_name = text_type(new_name) if not new_name: raise ValueError(_("Playlists must have a name")) return new_name def add_songs(self, filenames, library): changed = [] for i in range(len(self)): if isinstance(self[i], string_types) \ and self._list[i] in filenames: song = library[self._list[i]] self._list[i] = song changed.append(song) if changed: self._emit_changed(changed, msg="add") return bool(changed) def remove_songs(self, songs, leave_dupes=False): """Removes `songs` from this playlist if they are there, removing only the first reference if `leave_dupes` is True """ print_d("Remove %d song(s) from %s?" % (len(songs), self.name)) changed = False for song in songs: # TODO: document the "library.masked" business if self.library is not None and self.library.masked(song): while True: try: self._list[self.index(song)] = song("~filename") except ValueError: break else: changed = True else: while song in self._list: self._list.remove(song) changed = True if leave_dupes: break def songs_gone(): return set(songs) - set(self._list) if changed: self.finalize() # Short-circuit logic will avoid the calculation if not leave_dupes or songs_gone(): self._emit_changed(songs, "remove_songs") return changed @property def inhibit(self): return self.__inhibit_library_signals @inhibit.setter def inhibit(self, value): self.__inhibit_library_signals = value def _emit_changed(self, songs, msg=""): if self.library and not self.inhibit and songs: print_d("Emitting changed (%s) for %d song(s) from playlist %s " % (msg, len(songs), self)) self.library.emit('changed', songs) def has_songs(self, songs): # TODO(rm): consider the "library.masked" business some, all = False, True for song in songs: found = song in self._list some = some or found all = all and found if some and not all: break return some, all def delete(self): self.clear() if self in self.__instances: self.__instances.remove(self) def write(self): pass @property def has_duplicates(self): """Returns True if there are any duplicated files in this playlist""" return self._list.has_duplicates() def shuffle(self): """Randomly shuffles this playlist, without weighting""" random.shuffle(self._list) self.write() def __eq__(self, other): try: return self.name == other.name except AttributeError: return False def __lt__(self, other): try: return self.name < other.name except AttributeError: return False def __hash__(self): return id(self) def __str__(self): songs_text = (ngettext("%d song", "%d songs", len(self.songs)) % len(self.songs)) return u"\"%s\" (%s)" % (self.name, songs_text) class FileBackedPlaylist(Playlist): """A `Playlist` that is stored as a file on disk""" quote = staticmethod(escape_filename) unquote = staticmethod(unescape_filename) def __init__(self, dir, name, library=None, validate=False): assert isinstance(dir, fsnative) super(FileBackedPlaylist, self).__init__(name, library) self.dir = dir if validate: self.name = self._validated_name(name) self._last_fn = self.filename self.__populate_from_file() def __populate_from_file(self): library = self.library try: with open(self.filename, "rb") as h: for line in h: assert library is not None try: line = bytes2fsn(line.rstrip(), "utf-8") except ValueError: # decoding failed continue if line in library: self._list.append(library[line]) elif library and library.masked(line): self._list.append(line) except IOError: if self.name: util.print_d( "Playlist '%s' not found, creating new." % self.name) self.write() @classmethod def new(cls, dir_, base=_("New Playlist"), library=None): assert isinstance(dir_, fsnative) if not (dir_ and os.path.realpath(dir_)): raise ValueError("Invalid playlist directory %r" % (dir_,)) for i in range(1000): try: name = "%s %d" % (base, i) if i else base return FileBackedPlaylist(dir_, name, library, validate=True) except ValueError: pass raise ValueError("Couldn't create playlist of name '%s'" % base) @classmethod def from_songs(cls, dir_, songs, library=None): assert isinstance(dir_, fsnative) title = cls.suggested_name_for(songs) playlist = cls.new(dir_, title, library) playlist.extend(songs) return playlist @property def filename(self): basename = self.quote(self.name) return os.path.join(self.dir, basename) def _validated_name(self, new_name): new_name = super(FileBackedPlaylist, self)._validated_name(new_name) basename = self.quote(new_name) path = os.path.join(self.dir, basename) if os.path.exists(path): raise ValueError( _("A playlist named %s already exists.") % new_name) return new_name def delete(self): super(FileBackedPlaylist, self).delete() self.__delete_file(self.filename) @classmethod def __delete_file(cls, fn): try: os.unlink(fn) except EnvironmentError: pass def write(self): fn = self.filename with open(fn, "wb") as f: for song in self._list: if isinstance(song, string_types): f.write(fsn2bytes(song, "utf-8") + b"\n") else: f.write(fsn2bytes(song("~filename"), "utf-8") + b"\n") if self._last_fn != fn: self.__delete_file(self._last_fn) self._last_fn = fn �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/_main.py������������������������������������������������������������������0000644�0001750�0001750�00000024764�13112005742�017377� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys from senf import environ, path2fsn from quodlibet import util from quodlibet import const from quodlibet import build from quodlibet.util import cached_func, windows, set_process_title from quodlibet.util.dprint import print_d from quodlibet.util.path import mkdir PLUGIN_DIRS = ["editing", "events", "playorder", "songsmenu", "playlist", "gstreamer", "covers", "query"] class Application(object): """A main application class for controlling the application as a whole and accessing sub-modules. window - The main window which is present as long as QL is running library - The main library (see library.SongFileLibrary) librarian - The main (and atm only) librarian (see library.SongLibrarian) player - see player._base quit() - Quit the application """ window = None library = None player = None player_options = None """A PlayerOptions instance or None in case there is no playback support""" cover_manager = None name = None """The application name e.g. 'Quod Libet'""" id = None """The application ID e.g. 'quodlibet'""" @property def icon_name(self): return self.id @property def symbolic_icon_name(self): return "%s-symbolic" % self.icon_name @property def librarian(self): return self.library.librarian @property def browser(self): return self.window.browser def quit(self): from gi.repository import GLib def idle_quit(): if self.window: self.window.destroy() # so this can be called from a signal handler and before # the main loop starts GLib.idle_add(idle_quit, priority=GLib.PRIORITY_HIGH) def show(self): from quodlibet.qltk import Window for window in Window.windows: window.show() def present(self): # deiconify is needed if the window is on another workspace from quodlibet.qltk import Window for window in Window.windows: window.deiconify() window.present() def hide(self): from quodlibet.qltk import Window for window in Window.windows: window.hide() app = Application() @cached_func def get_base_dir(): """The path to the quodlibet package""" return util.get_module_dir() @cached_func def get_image_dir(): """The path to the image directory in the quodlibet package""" return os.path.join(get_base_dir(), "images") @cached_func def get_user_dir(): """Place where QL saves its state, database, config etc.""" if os.name == "nt": USERDIR = os.path.join(windows.get_appdate_dir(), "Quod Libet") else: USERDIR = os.path.join(os.path.expanduser("~"), ".quodlibet") if 'QUODLIBET_USERDIR' in environ: USERDIR = environ['QUODLIBET_USERDIR'] if build.BUILD_TYPE == u"windows-portable": USERDIR = os.path.normpath(os.path.join( os.path.dirname(path2fsn(sys.executable)), "..", "..", "config")) # XXX: users shouldn't assume the dir is there, but we currently do in # some places mkdir(USERDIR, 0o750) return USERDIR def is_release(): """Returns whether the running version is a stable release or under development. """ return const.VERSION_TUPLE[-1] != -1 def get_build_version(): """Returns a build version tuple""" version = list(const.VERSION_TUPLE) if version[-1] != -1 and build.BUILD_VERSION > 0: version.append(build.BUILD_VERSION) return tuple(version) def get_build_description(): """Returns text describing the version of the build. Includes additional build info like git hash and build version. """ version = list(get_build_version()) notes = [] if version[-1] == -1: version = version[:-1] notes.append(u"development") if build.BUILD_INFO: notes.append(build.BUILD_INFO) version_string = u".".join(map(str, version)) note = u" (%s)" % u", ".join(notes) if notes else u"" return version_string + note def init_plugins(no_plugins=False): print_d("Starting plugin manager") from quodlibet import plugins folders = [os.path.join(get_base_dir(), "ext", kind) for kind in PLUGIN_DIRS] folders.append(os.path.join(get_user_dir(), "plugins")) print_d("Scanning folders: %s" % folders) pm = plugins.init(folders, no_plugins) pm.rescan() from quodlibet.qltk.edittags import EditTags from quodlibet.qltk.renamefiles import RenameFiles from quodlibet.qltk.tagsfrompath import TagsFromPath EditTags.init_plugins() RenameFiles.init_plugins() TagsFromPath.init_plugins() return pm def set_application_info(icon_name, process_title, app_name): """Call after init() and before creating any windows to apply default values for names and icons. """ from quodlibet._init import is_init assert is_init() from gi.repository import Gtk, GLib set_process_title(process_title) # Issue 736 - set after main loop has started (gtk seems to reset it) GLib.idle_add(set_process_title, process_title) GLib.set_prgname(process_title) GLib.set_application_name(app_name) theme = Gtk.IconTheme.get_default() assert theme.has_icon(icon_name) Gtk.Window.set_default_icon_name(icon_name) def _main_setup_osx(window): from AppKit import NSObject, NSApplication import objc try: import gi gi.require_version('GtkosxApplication', '1.0') from gi.repository import GtkosxApplication except (ValueError, ImportError): print_d("importing GtkosxApplication failed, no native menus") else: osx_app = GtkosxApplication.Application() window.set_as_osx_window(osx_app) osx_app.ready() shared_app = NSApplication.sharedApplication() gtk_delegate = shared_app.delegate() # Instead of quitting when the main window gets closed just hide it. # If the dock icon gets clicked we get # applicationShouldHandleReopen_hasVisibleWindows_ and show everything. class Delegate(NSObject): @objc.signature('B@:#B') def applicationShouldHandleReopen_hasVisibleWindows_( self, ns_app, flag): print_d("osx: handle reopen") app.present() return True def applicationShouldTerminate_(self, sender): print_d("osx: block termination") # FIXME: figure out why idle_add is needed here from gi.repository import GLib GLib.idle_add(app.quit) return False def applicationDockMenu_(self, sender): return gtk_delegate.applicationDockMenu_(sender) def application_openFile_(self, sender, filename): return app.window.open_file(filename.encode("utf-8")) delegate = Delegate.alloc().init() delegate.retain() shared_app.setDelegate_(delegate) # QL shouldn't exit on window close, EF should if window.get_is_persistent(): window.connect( "delete-event", lambda window, event: window.hide() or True) def run(window, before_quit=None): print_d("Entering quodlibet.main") from gi.repository import Gtk, Gdk, GLib from quodlibet._init import is_init assert is_init() def quit_gtk(window): if before_quit is not None: before_quit() # disable plugins import quodlibet.plugins quodlibet.plugins.quit() # for debug: this will list active copools from quodlibet.util import copool copool.pause_all() # See which browser windows are open and save their names # so we can restore them on start from quodlibet.qltk.browser import LibraryBrowser LibraryBrowser.save() # destroy all open windows so they hide immediately on close: # destroying all top level windows doesn't work (weird errors), # so we hide them all and only destroy our tracked instances # (browser windows, tag editors, pref window etc.) from quodlibet.qltk import Window for toplevel in Gtk.Window.list_toplevels(): toplevel.hide() for window in Window.windows: window.destroy() Gtk.main_quit() print_d("Quit GTK: done.") window.connect('destroy', quit_gtk) if sys.platform == "darwin": _main_setup_osx(window) if not window.show_maybe(): # if we don't show a window, startup isn't completed, so call manually Gdk.notify_startup_complete() from quodlibet.errorreport import faulthandling try: faulthandling.enable(os.path.join(get_user_dir(), "faultdump")) except IOError: util.print_exc() else: GLib.idle_add(faulthandling.raise_and_clear_error) # set QUODLIBET_START_PERF to measure startup time until the # windows is first shown. if "QUODLIBET_START_PERF" in environ: window.connect("draw", Gtk.main_quit) Gtk.main() sys.exit() else: Gtk.main() print_d("Gtk.main() done.") def enable_periodic_save(save_library): import quodlibet.library from quodlibet.util import copool from quodlibet import config timeout = 5 * 60 * 1000 # 5 minutes def periodic_config_save(): while 1: config.save() yield copool.add(periodic_config_save, timeout=timeout) if not save_library: return def periodic_library_save(): while 1: # max every 15 minutes quodlibet.library.save(save_period=15 * 60) yield copool.add(periodic_library_save, timeout=timeout) def is_first_session(app_name): """Returns True if the current session is the first one to e.g. show a wizard/setup dialog etc. Will return True after each upgrade as well. app_name: e.g. 'quodlibet' """ from quodlibet import config from quodlibet import const value = config.get("memory", "%s_last_active_version" % app_name, "") if value != const.VERSION: return True return False def finish_first_session(app_name): """Call on shutdown so that is_first_session() works""" from quodlibet import config from quodlibet import const config.set("memory", "%s_last_active_version" % app_name, const.VERSION) ������������quodlibet-3.9.1/quodlibet/commands.py���������������������������������������������������������������0000644�0001750�0001750�00000031167�13115324767�020126� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna, # 2011-2013,2016 Nick Boultbee # 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from senf import uri2fsn, fsnative, fsn2text, text2fsn from quodlibet.util.string import split_escape from quodlibet import browsers from quodlibet.compat import listfilter, text_type from quodlibet import util from quodlibet.util import print_d, print_e from quodlibet.qltk.browser import LibraryBrowser from quodlibet.qltk.properties import SongProperties from quodlibet.util.library import scan_library class CommandError(Exception): pass class CommandRegistry(object): """Knows about all commands and handles parsing/executing them""" def __init__(self): self._commands = {} def register(self, name, args=0, optional=0): """Register a new command function The functions gets zero or more arguments as `fsnative` and should return `None` or `fsnative`. In case an error occured the command should raise `CommandError`. Args: name (str): the command name args (int): amount of required arguments optional (int): amoutn of additional optional arguments Returns: Callable """ def wrap(func): self._commands[name] = (func, args, optional) return func return wrap def handle_line(self, app, line): """Parses a command line and executes the command. Can not fail. Args: app (Application) line (fsnative) Returns: fsnative or None """ assert isinstance(line, fsnative) # only one arg supported atm parts = line.split(" ", 1) command = parts[0] args = parts[1:] print_d("command: %r(*%r)" % (command, args)) try: return self.run(app, command, *args) except CommandError as e: print_e(e) except: util.print_exc() def run(self, app, name, *args): """Execute the command `name` passing args May raise CommandError """ if name not in self._commands: raise CommandError("Unknown command %r" % name) cmd, argcount, optcount = self._commands[name] if len(args) < argcount: raise CommandError("Not enough arguments for %r" % name) if len(args) > argcount + optcount: raise CommandError("Too many arguments for %r" % name) print_d("Running %r with params %s " % (cmd.__name__, args)) try: result = cmd(app, *args) except CommandError as e: raise CommandError("%s: %s" % (name, str(e))) else: if result is not None and not isinstance(result, fsnative): raise CommandError( "%s: returned %r which is not fsnative" % (name, result)) return result def arg2text(arg): """Like fsn2text but is strict by default and raises CommandError""" try: return fsn2text(arg, strict=True) except ValueError as e: raise CommandError(e) registry = CommandRegistry() @registry.register("previous") def _previous(app): app.player.previous() @registry.register("force-previous") def _force_previous(app): app.player.previous(True) @registry.register("next") def _next(app): app.player.next() @registry.register("pause") def _pause(app): app.player.paused = True @registry.register("play") def _play(app): player = app.player if player.song: player.paused = False @registry.register("play-pause") def _play_pause(app): player = app.player if player.song is None: player.reset() else: player.paused ^= True @registry.register("stop") def _stop(app): app.player.stop() @registry.register("focus") def _focus(app): app.present() @registry.register("volume", args=1) def _volume(app, value): if not value: raise CommandError("invalid arg") if value[0] in ('+', '-'): if len(value) > 1: try: change = (int(value[1:]) / 100.0) except ValueError: return else: change = 0.05 if value[0] == '-': change = -change volume = app.player.volume + change else: try: volume = (int(value) / 100.0) except ValueError: return app.player.volume = min(1.0, max(0.0, volume)) @registry.register("stop-after", args=1) def _stop_after(app, value): po = app.player_options if value == "0": po.stop_after = False elif value == "1": po.stop_after = True elif value == "t": po.stop_after = not po.stop_after else: raise CommandError("Invalid value %r" % value) @registry.register("shuffle", args=1) def _shuffle(app, value): po = app.player_options if value in ["0", "off"]: po.shuffle = False elif value in ["1", "on"]: po.shuffle = True elif value in ["t", "toggle"]: po.shuffle = not po.shuffle @registry.register("repeat", args=1) def _repeat(app, value): po = app.player_options if value in ["0", "off"]: po.repeat = False elif value in ["1", "on"]: print_d("Enabling repeat") po.repeat = True elif value in ["t", "toggle"]: po.repeat = not po.repeat @registry.register("seek", args=1) def _seek(app, time): player = app.player if not player.song: return seek_to = player.get_position() if time[0] == "+": seek_to += util.parse_time(time[1:]) * 1000 elif time[0] == "-": seek_to -= util.parse_time(time[1:]) * 1000 else: seek_to = util.parse_time(time) * 1000 seek_to = min(player.song.get("~#length", 0) * 1000 - 1, max(0, seek_to)) player.seek(seek_to) @registry.register("play-file", args=1) def _play_file(app, value): app.window.open_file(value) @registry.register("toggle-window") def _toggle_window(app): if app.window.get_property('visible'): app.hide() else: app.show() @registry.register("hide-window") def _hide_window(app): app.hide() @registry.register("show-window") def _show_window(app): app.show() @registry.register("set-rating", args=1) def _set_rating(app, value): song = app.player.song if not song: return value = arg2text(value) try: song["~#rating"] = max(0.0, min(1.0, float(value))) except (ValueError, TypeError): pass else: app.library.changed([song]) @registry.register("dump-browsers") def _dump_browsers(app): response = u"" for i, b in enumerate(browsers.browsers): response += u"%d. %s\n" % (i, browsers.name(b)) return text2fsn(response) @registry.register("set-browser", args=1) def _set_browser(app, value): if not app.window.select_browser(value, app.library, app.player): raise CommandError("Unknown browser %r" % value) @registry.register("open-browser", args=1) def _open_browser(app, value): value = arg2text(value) try: Kind = browsers.get(value) except ValueError: raise CommandError("Unknown browser %r" % value) LibraryBrowser.open(Kind, app.library, app.player) @registry.register("random", args=1) def _random(app, tag): tag = arg2text(tag) if app.browser.can_filter(tag): app.browser.filter_random(tag) @registry.register("filter", args=1) def _filter(app, value): value = arg2text(value) try: tag, value = value.split('=', 1) except ValueError: raise CommandError("invalid argument") if app.browser.can_filter(tag): app.browser.filter(tag, [value]) @registry.register("query", args=1) def _query(app, value): value = arg2text(value) if app.browser.can_filter_text(): app.browser.filter_text(value) @registry.register("unfilter") def _unfilter(app): app.browser.unfilter() @registry.register("properties", optional=1) def _properties(app, value=None): library = app.library player = app.player window = app.window if value is not None: value = arg2text(value) if value in library: songs = [library[value]] else: songs = library.query(value) else: songs = [player.song] songs = listfilter(None, songs) if songs: window = SongProperties(library, songs, parent=window) window.show() @registry.register("enqueue", args=1) def _enqueue(app, value): playlist = app.window.playlist library = app.library if value in library: songs = [library[value]] elif os.path.isfile(value): songs = [library.add_filename(os.path.realpath(value))] else: songs = library.query(arg2text(value)) songs.sort() playlist.enqueue(songs) @registry.register("enqueue-files", args=1) def _enqueue_files(app, value): """Enqueues comma-separated filenames or song names. Commas in filenames should be backslash-escaped""" library = app.library window = app.window songs = [] for param in split_escape(value, ","): try: song_path = uri2fsn(param) except ValueError: song_path = param if song_path in library: songs.append(library[song_path]) elif os.path.isfile(song_path): songs.append(library.add_filename(os.path.realpath(value))) if songs: window.playlist.enqueue(songs) @registry.register("unqueue", args=1) def _unqueue(app, value): window = app.window library = app.library playlist = window.playlist if value in library: songs = [library[value]] else: songs = library.query(arg2text(value)) playlist.unqueue(songs) @registry.register("quit") def _quit(app): app.quit() @registry.register("status") def _status(app): player = app.player if player.paused: strings = ["paused"] else: strings = ["playing"] strings.append(type(app.browser).__name__) po = app.player_options strings.append("%0.3f" % player.volume) strings.append("shuffle" if po.shuffle else "inorder") strings.append("on" if po.repeat else "off") progress = 0 if player.info: length = player.info.get("~#length", 0) if length: progress = player.get_position() / (length * 1000.0) strings.append("%0.3f" % progress) status = u" ".join(strings) + u"\n" return text2fsn(status) @registry.register("song-list", args=1) def _song_list(app, value): # deprecated return @registry.register("queue", args=1) def _queue(app, value): window = app.window value = arg2text(value) if value.startswith("t"): value = not window.qexpander.get_property('visible') else: value = value not in ['0', 'off', 'false'] window.qexpander.set_property('visible', value) @registry.register("dump-playlist") def _dump_playlist(app): window = app.window uris = [] for song in window.playlist.pl.get(): uris.append(song("~uri")) return text2fsn(u"\n".join(uris) + u"\n") @registry.register("dump-queue") def _dump_queue(app): window = app.window uris = [] for song in window.playlist.q.get(): uris.append(song("~uri")) return text2fsn(u"\n".join(uris) + u"\n") @registry.register("refresh") def _refresh(app): scan_library(app.library, False) @registry.register("print-query", args=1) def _print_query(app, query): """Queries library, dumping filenames of matches to stdout See Issue 716 """ query = arg2text(query) songs = app.library.query(query) return "\n".join([song("~filename") for song in songs]) + "\n" @registry.register("print-query-text") def _print_query_text(app): if app.browser.can_filter_text(): return text2fsn(text_type(app.browser.get_filter_text()) + u"\n") @registry.register("print-playing", optional=1) def _print_playing(app, fstring=None): from quodlibet.formats import AudioFile from quodlibet.pattern import Pattern if fstring is None: fstring = u"<artist~album~tracknumber~title>" else: fstring = arg2text(fstring) song = app.player.info if song is None: song = AudioFile({"~filename": fsnative(u"/")}) song.sanitize() return text2fsn(Pattern(fstring).format(song) + u"\n") @registry.register("uri-received", args=1) def _uri_received(app, uri): uri = arg2text(uri) app.browser.emit("uri-received", uri) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/exfalso.py����������������������������������������������������������������0000644�0001750�0001750�00000003733�13112005742�017746� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Niklas Janlert # 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. import os from senf import fsnative, argv as sys_argv from quodlibet import _ from quodlibet import app from quodlibet import util from quodlibet import const from quodlibet import config def main(argv=None): if argv is None: argv = sys_argv import quodlibet config_file = os.path.join(quodlibet.get_user_dir(), "config") quodlibet.init(config_file=config_file) from quodlibet.qltk import add_signal_watch, Icons add_signal_watch(app.quit) opts = util.OptionParser( "Ex Falso", const.VERSION, _("an audio tag editor"), "[%s]" % _("directory")) argv.append(os.path.abspath(fsnative(u"."))) opts, args = opts.parse(argv[1:]) args[0] = os.path.realpath(args[0]) app.name = "Ex Falso" app.id = "exfalso" quodlibet.set_application_info(Icons.EXFALSO, app.id, app.name) import quodlibet.library import quodlibet.player app.library = quodlibet.library.init() app.player = quodlibet.player.init_player("nullbe", app.librarian) from quodlibet.qltk.songlist import PlaylistModel app.player.setup(PlaylistModel(), None, 0) pm = quodlibet.init_plugins() pm.rescan() from quodlibet.qltk.exfalsowindow import ExFalsoWindow dir_ = args[0] app.window = ExFalsoWindow(app.library, dir_) app.window.init_plugins() from quodlibet.util.cover import CoverManager app.cover_manager = CoverManager() app.cover_manager.init_plugins() from quodlibet.qltk import session session.init("exfalso") quodlibet.enable_periodic_save(save_library=False) quodlibet.run(app.window) quodlibet.finish_first_session(app.id) config.save() util.print_d("Finished shutdown.") �������������������������������������quodlibet-3.9.1/quodlibet/main.py�������������������������������������������������������������������0000644�0001750�0001750�00000014120�13112005742�017221� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna # 2012,2013 Christoph Reiter # 2010-2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. import sys import os from senf import environ, argv as sys_argv from quodlibet.cli import process_arguments, exit_ from quodlibet.util.dprint import print_d, print_, print_exc def main(argv=None): if argv is None: argv = sys_argv import quodlibet config_file = os.path.join(quodlibet.get_user_dir(), "config") quodlibet.init_cli(config_file=config_file) try: # we want basic commands not to import gtk (doubles process time) assert "gi.repository.Gtk" not in sys.modules sys.modules["gi.repository.Gtk"] = None startup_actions, cmds_todo = process_arguments(argv) finally: sys.modules.pop("gi.repository.Gtk", None) quodlibet.init() from quodlibet import app from quodlibet.qltk import add_signal_watch, Icons add_signal_watch(app.quit) import quodlibet.player import quodlibet.library from quodlibet import config from quodlibet import browsers from quodlibet import util app.name = "Quod Libet" app.id = "quodlibet" quodlibet.set_application_info(Icons.QUODLIBET, app.id, app.name) library_path = os.path.join(quodlibet.get_user_dir(), "songs") print_d("Initializing main library (%s)" % ( quodlibet.util.path.unexpand(library_path))) library = quodlibet.library.init(library_path) app.library = library # this assumes that nullbe will always succeed from quodlibet.player import PlayerError wanted_backend = environ.get( "QUODLIBET_BACKEND", config.get("player", "backend")) try: player = quodlibet.player.init_player(wanted_backend, app.librarian) except PlayerError: print_exc() player = quodlibet.player.init_player("nullbe", app.librarian) app.player = player environ["PULSE_PROP_media.role"] = "music" environ["PULSE_PROP_application.icon_name"] = "quodlibet" browsers.init() from quodlibet.qltk.songlist import SongList, get_columns headers = get_columns() SongList.set_all_column_headers(headers) for opt in config.options("header_maps"): val = config.get("header_maps", opt) util.tags.add(opt, val) in_all = ("~filename ~uri ~#lastplayed ~#rating ~#playcount ~#skipcount " "~#added ~#bitrate ~current ~#laststarted ~basename " "~dirname").split() for Kind in browsers.browsers: if Kind.headers is not None: Kind.headers.extend(in_all) Kind.init(library) pm = quodlibet.init_plugins("no-plugins" in startup_actions) if hasattr(player, "init_plugins"): player.init_plugins() from quodlibet.qltk import unity unity.init("quodlibet.desktop", player) from quodlibet.qltk.songsmenu import SongsMenu SongsMenu.init_plugins() from quodlibet.util.cover import CoverManager app.cover_manager = CoverManager() app.cover_manager.init_plugins() from quodlibet.plugins.playlist import PLAYLIST_HANDLER PLAYLIST_HANDLER.init_plugins() from quodlibet.plugins.query import QUERY_HANDLER QUERY_HANDLER.init_plugins() from gi.repository import GLib def exec_commands(*args): for cmd in cmds_todo: try: resp = cmd_registry.run(app, *cmd) except CommandError: pass else: if resp is not None: print_(resp, end="", flush=True) from quodlibet.qltk.quodlibetwindow import QuodLibetWindow, PlayerOptions # Call exec_commands after the window is restored, but make sure # it's after the mainloop has started so everything is set up. app.window = window = QuodLibetWindow( library, player, restore_cb=lambda: GLib.idle_add(exec_commands, priority=GLib.PRIORITY_HIGH)) app.player_options = PlayerOptions(window) from quodlibet.qltk.window import Window from quodlibet.plugins.events import EventPluginHandler pm.register_handler(EventPluginHandler(library.librarian, player)) from quodlibet.mmkeys import MMKeysHandler from quodlibet.remote import Remote, RemoteError from quodlibet.commands import registry as cmd_registry, CommandError from quodlibet.qltk.tracker import SongTracker, FSInterface try: from quodlibet.qltk.dbus_ import DBusHandler except ImportError: DBusHandler = lambda player, library: None mmkeys_handler = MMKeysHandler(app) mmkeys_handler.start() current_path = os.path.join(quodlibet.get_user_dir(), "current") fsiface = FSInterface(current_path, player) remote = Remote(app, cmd_registry) try: remote.start() except RemoteError: exit_(1, True) DBusHandler(player, library) tracker = SongTracker(library.librarian, player, window.playlist) from quodlibet.qltk import session session.init("quodlibet") quodlibet.enable_periodic_save(save_library=True) if "start-playing" in startup_actions: player.paused = False if "start-hidden" in startup_actions: Window.prevent_inital_show(True) # restore browser windows from quodlibet.qltk.browser import LibraryBrowser GLib.idle_add(LibraryBrowser.restore, library, player, priority=GLib.PRIORITY_HIGH) def before_quit(): print_d("Saving active browser state") try: app.browser.save() except NotImplementedError: pass print_d("Shutting down player device %r." % player.version_info) player.destroy() quodlibet.run(window, before_quit=before_quit) app.player_options.destroy() quodlibet.finish_first_session(app.id) mmkeys_handler.quit() remote.stop() fsiface.destroy() tracker.destroy() quodlibet.library.save() config.save() print_d("Finished shutdown.") ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/cli.py��������������������������������������������������������������������0000644�0001750�0001750�00000022147�13115325557�017070� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014,2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from senf import fsn2text, uri2fsn from quodlibet import C_, _ from quodlibet.util.dprint import print_, print_e from quodlibet.remote import Remote, RemoteError def exit_(status=None, notify_startup=False): """Call this to abort the startup before any mainloop starts. notify_startup needs to be true if QL could potentially have been called from the desktop file. """ if notify_startup: import gi gi.require_version("Gdk", "3.0") from gi.repository import Gdk Gdk.notify_startup_complete() raise SystemExit(status) def is_running(): """If maybe is another instance running""" return Remote.remote_exists() def control(command, arg=None, ignore_error=False): """Sends command to the existing instance if possible and exits. Will print any response it gets to stdout. Does not return except if ignore_error is True and sending the command failed. """ if not is_running(): if ignore_error: return exit_(_("Quod Libet is not running (add '--run' to start it)"), notify_startup=True) return message = command if arg is not None: message += " " + arg try: response = Remote.send_message(message) except RemoteError as e: if ignore_error: return exit_(str(e), notify_startup=True) else: if response is not None: print_(response, end="", flush=True) exit_(notify_startup=True) def process_arguments(argv): from quodlibet.util.path import uri_is_valid from quodlibet import util from quodlibet import const actions = [] controls = ["next", "previous", "play", "pause", "play-pause", "stop", "hide-window", "show-window", "toggle-window", "focus", "quit", "unfilter", "refresh", "force-previous"] controls_opt = ["seek", "repeat", "query", "volume", "filter", "set-rating", "set-browser", "open-browser", "shuffle", "song-list", "queue", "stop-after", "random"] options = util.OptionParser( "Quod Libet", const.VERSION, _("a music library and player"), _("[option]")) options.add("print-playing", help=_("Print the playing song and exit")) options.add("start-playing", help=_("Begin playing immediately")) options.add("start-hidden", help=_("Don't show any windows on start")) for opt, help in [ ("next", _("Jump to next song")), ("previous", _("Jump to previous song or restart if near the beginning")), ("force-previous", _("Jump to previous song")), ("play", _("Start playback")), ("pause", _("Pause playback")), ("play-pause", _("Toggle play/pause mode")), ("stop", _("Stop playback")), ("volume-up", _("Turn up volume")), ("volume-down", _("Turn down volume")), ("status", _("Print player status")), ("hide-window", _("Hide main window")), ("show-window", _("Show main window")), ("toggle-window", _("Toggle main window visibility")), ("focus", _("Focus the running player")), ("unfilter", _("Remove active browser filters")), ("refresh", _("Refresh and rescan library")), ("list-browsers", _("List available browsers")), ("print-playlist", _("Print the current playlist")), ("print-queue", _("Print the contents of the queue")), ("print-query-text", _("Print the active text query")), ("no-plugins", _("Start without plugins")), ("run", _("Start Quod Libet if it isn't running")), ("quit", _("Exit Quod Libet")), ]: options.add(opt, help=help) for opt, help, arg in [ ("seek", _("Seek within the playing song"), _("[+|-][HH:]MM:SS")), ("shuffle", _("Set or toggle shuffle mode"), "[0|1|t"), ("repeat", _("Turn repeat off, on, or toggle it"), "0|1|t"), ("volume", _("Set the volume"), "(+|-|)0..100"), ("query", _("Search your audio library"), _("query")), ("play-file", _("Play a file"), C_("command", "filename")), ("set-rating", _("Rate the playing song"), "0.0..1.0"), ("set-browser", _("Set the current browser"), "BrowserName"), ("stop-after", _("Stop after the playing song"), "0|1|t"), ("open-browser", _("Open a new browser"), "BrowserName"), ("queue", _("Show or hide the queue"), "on|off|t"), ("song-list", _("Show or hide the main song list (deprecated)"), "on|off|t"), ("random", _("Filter on a random value"), C_("command", "tag")), ("filter", _("Filter on a tag value"), _("tag=value")), ("enqueue", _("Enqueue a file or query"), "%s|%s" % ( C_("command", "filename"), _("query"))), ("enqueue-files", _("Enqueue comma-separated files"), "%s[,%s..]" % ( _("filename"), _("filename"))), ("print-query", _("Print filenames of results of query to stdout"), _("query")), ("unqueue", _("Unqueue a file or query"), "%s|%s" % ( C_("command", "filename"), _("query"))), ]: options.add(opt, help=help, arg=arg) options.add("sm-config-prefix", arg="dummy") options.add("sm-client-id", arg="prefix") options.add("screen", arg="dummy") def is_vol(str): if str[0] in '+-': if len(str) == 1: return True str = str[1:] return str.isdigit() def is_time(str): if str[0] not in "+-0123456789": return False elif str[0] in "+-": str = str[1:] parts = str.split(":") if len(parts) > 3: return False else: return not (False in [p.isdigit() for p in parts]) def is_float(str): try: float(str) except ValueError: return False else: return True validators = { "shuffle": ["0", "1", "t", "on", "off", "toggle"].__contains__, "repeat": ["0", "1", "t", "on", "off", "toggle"].__contains__, "volume": is_vol, "seek": is_time, "set-rating": is_float, "stop-after": ["0", "1", "t"].__contains__, } cmds_todo = [] def queue(*args): cmds_todo.append(args) # XXX: to make startup work in case the desktop file isn't passed # a file path/uri if argv[-1] == "--play-file": argv = argv[:-1] opts, args = options.parse(argv[1:]) for command, arg in opts.items(): if command in controls: queue(command) elif command in controls_opt: if command in validators and not validators[command](arg): print_e(_("Invalid argument for '%s'.") % command) print_e(_("Try %s --help.") % fsn2text(argv[0])) exit_(True, notify_startup=True) else: queue(command, arg) elif command == "status": queue("status") elif command == "print-playlist": queue("dump-playlist") elif command == "print-queue": queue("dump-queue") elif command == "list-browsers": queue("dump-browsers") elif command == "volume-up": queue("volume +") elif command == "volume-down": queue("volume -") elif command == "enqueue" or command == "unqueue": try: filename = uri2fsn(arg) except ValueError: filename = arg queue(command, filename) elif command == "enqueue-files": queue(command, arg) elif command == "play-file": if uri_is_valid(arg) and arg.startswith("quodlibet://"): # TODO: allow handling of URIs without --play-file queue("uri-received", arg) else: try: filename = uri2fsn(arg) except ValueError: filename = arg filename = os.path.abspath(util.path.expanduser(arg)) queue("play-file", filename) elif command == "print-playing": try: queue("print-playing", args[0]) except IndexError: queue("print-playing") elif command == "print-query": queue(command, arg) elif command == "print-query-text": queue(command) elif command == "start-playing": actions.append(command) elif command == "start-hidden": actions.append(command) elif command == "no-plugins": actions.append(command) elif command == "run": actions.append(command) if cmds_todo: for cmd in cmds_todo: control(*cmd, **{"ignore_error": "run" in actions}) else: # this will exit if it succeeds control('focus', ignore_error=True) return actions, cmds_todo �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017170� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/�����������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020627� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/16x16/�����������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021414� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/16x16/status/����������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022737� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/16x16/status/quodlibet-missing-cover.png�������������������0000644�0001750�0001750�00000001636�13112005742�030230� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������a���sBIT|d��� pHYs����nr���tEXtSoftware�www.inkscape.org<���tEXtTitle�Missing Album Cover Art{��IDAT8}k\u?;;d&1IMIhҖ-.wYvQQ`V*(hE7XtZ)HLk3&Ltfܙ;?6C@gu|r1ƇW>f=w/w*Ji�qIm[14oܹy󚽲b7^}ⅸEP.WV;1K,DX__֯prpZ[[~gs'fg<XE:5SY|qAǍǃOL�%FZcdxDxo#Lvl ޹ΟGD�6h]jgSi<4MlFQ°M`5'}YDD]]o6xb6i/Y* QN.,Dh[%t"0ݲEBE.eL&lQ-x$h]fff�LOM- tLTC>L&ގFkiAݦӉPJb`<J߻ QL;.�Zk0T*Q* Qی LMG%Ih=,–ezǵ-u q,)WJ>7_s߽Wz0Ȇl{6 S[)ۣR߮^}yyY�C|+Ro\mwv:?}D$/yaA_}gHZ$3f?}Ad-XS,����IENDB`��������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/16x16/apps/������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022357� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/16x16/apps/quodlibet.png�����������������������������������0000644�0001750�0001750�00000000762�13112005742�025064� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������a���sBIT|d��� pHYs����I���tEXtSoftware�www.inkscape.org<��oIDAT8M(qǿ).IKPGZ99\\rrsvgMZcVy_'B<sD|+=an57AW^Rۉ e [|R_\\^yf\Ndjjbnᡵ亪8H$��y$+*Ֆc-~�Yq>Iۻi%n#) <[ G6wH~bVo3t;4� v*u9�5�,M`aR lwg c:g}uή;8308&e�Tr`0DrdANUU@ @k$'FoHczBtݭ6șaDF����IENDB`��������������quodlibet-3.9.1/quodlibet/images/hicolor/16x16/apps/exfalso.png�������������������������������������0000644�0001750�0001750�00000001540�13112005742�024530� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������a���sBIT|d��� pHYs����I���tEXtSoftware�www.inkscape.org<��IDAT8[HqƟossߦmt-͂Y:ZR*tQTU7]uȢ "D-L)ee9`n~;|.r�yx[VI4?tjk3VIʂu0|>מ\7`8�;|xn3iV xkcOG�nUL5;E)r捫>hQ�`(^uھcĺ8KElwnAR@GGGb c @<9)?5y)hѨCQ �TjUgC(tg sʲ5_�)us14OM' %5| �Bjۻ꼁+筆ʍH)knsmn^7c+?Ro8 :mCXo$^W[1Otm ށjK{E-9++޷?N1'Nln> 8F,MԮwGffn(}^%;&D$O&A?Z'(xIɖM<qAi1&p�� g>gG3-XU7|7944h 3Sں@ tj=)"*#Q,--55 U\l ""/c>3L����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/64x64/�����������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021422� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/64x64/status/����������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022745� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/64x64/status/quodlibet-missing-cover.png�������������������0000644�0001750�0001750�00000013676�13112005742�030245� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���@���@���iq���sBIT|d��� pHYs����c���tEXtSoftware�www.inkscape.org<���tEXtTitle�Missing Album Cover Art{��IDATxYeyUu33uȐA3Lt )6PNBd$DGņ'H,lZ,=$"(\tOO/~֪CsvOpZI{O}\!:fֵsq+d;VͿ|CK/\Ƀ~'W<C8[yK\|2ְm8W�ā*:1oS\_;Fq<|G X$b)tkklll B<%%R qc,NV,爢! r])E$`./qmܹ�g~=D < D4ˬFgeDa 3 f `Ja֚4Kv; CaQ&#9VV7Ѿ?w5o-eX[[gmmw8q$f4ɋQuRz!FǏz/Xfiicǎ133CV<t�[k`@fyyۛ ,\Nrlao � =wlg�Z4K!zcI$MH4M(z)$SwMsm)Zh֛DQ �5Qיof8K/=wKy7L٩,b@{lIZ;�$ZPR{>R},"KS,!KS4 h<h6cOV肍sJ*<'"jQ(ZZ" C^^]Ƌ/ȭw_=DžKW G<pC6hm@=u�xR1hHc5R{gɄX!)=jQ(|Eg8cZzf0tP# fzk]N0ϟ' C/.縼҉P=0_@ޏڪ6.fYJQc0�vJ"Rj g&Z,H�$i(&1!F4 :-(4-[3ZSH)Rrsi/j8of<F:!K~S�;w0x�ib&rJIhcK- Qʧ^!qDZt-S5BɈO&CLɐF9: !iZ^k255 3s|#G*ş~\[B\eB ]@y^@fXk)ȋ%JjA$ y5Z 2 @ޤtZB0 :q`4ĖNiԛHryZ<|1?>^[ @kc5[7 -c@9�4E BAHaHeE΄XP!Ğ՚fjjf|m0aэC�s hҩc,:z{8w<+WWCA B=pnǀ3)]2iV$Rp=�Ƙ'< F5f=t{ ,zŅc.<[̌ ?9˫G<Fk�4 I䲠(4z !V*syJI\Z[inI@QaH匒hD F!EF<M{ͥKWJEX!G1Y8',-H=E^H霕)܁R < C̨~w( !E^`-ԂFTy`m3f[5jMbڅb@eJfk-FkwNpkX땀]Ş&IB$` )օ`)QPoأcLAo.f򠓥r3 I %R* DR7Ԟ)$|м@\,'ϋ}>\iRE `e6-Xy k 灅f(g�ƈJZq hLJ&m*qիWvcY^[oرceۿRR _VDZKe/ΰMR2&$m-%ND~Onw5K4)^^6Hӌz:w~;gΜ;> Xpֹ4c4 hMM0F6X m$2RXm[Do �01/JfDa@5a).Ld%;*t�!X`D/QhDa),CQ�MކqM8J8tȊ }WV= хfasss"{,>5hL1*<T0!wP<"P.RA�ֺ`5!xE*]o-!0FS9rk^hC2|Ƹ8&k !eeoLur] ++af x嗇@^$A)I]}󻉎Q 4RP.I;2Z-B:TN5,쯬Ev�@ 5J!Av7j,.,03$r)Y#$͘ɓ8wC_YB#]`b4^�^ `B$K8 kmQ'Ap2vwyƥb4I\ $Xn=u[n,-iCc5zFDHG׌)ȋ4Mv,..)u'jL㒞8v[[[iV Z),+#V2cƖѲKcc HY a�7b*&BP(t:<>(rT,--qR D&ZEn Xi(ShmwNЅ7@ ں,C)JaW+ .tUi!F(|O.P.jɐ[F5FNw p'haIQA%/rVWW 'k]k] UTg!@y )c kf=*u֥ deA$Y{>5I&hǭPα*~ܵ4ƞ|99ғXCyE㶘nhXM|V!8[[YYjL]XUT$ohS0cØ'lj\n�aڀڌKb?PJѨ ac7|sFAu|c)%~NCC교F#(B::� ڕ@c�|j6Rt . 7`0a| D�(J)L<Bf6\p(Q~*S1X[[X@yN,-{p0׻v%=|}юcVZ$ wuF!\dp?v�vt]:-Ҭ`Qqwcġ!Ξ=Y@fc뚡 AP[/+իW 9 }1lnn:$iN= QRO+=<e RȮf IS1`A IxZ ͔kt{=`}}SN177)vaa<0-&IBe00d!i6"|C*2WimpJVx@b:8�4C(Y><圌t &$e8yE $&0??,z}Ofq)^G[[ . CZLH7k W"r(` gfE`Ty Oy֖]Zc Qy8Nttz}g~k)RDQDb$(24eT&Zy(y=DUj\ 2,0eǸ<πS@ $6l+ SKK5:!�k Z(j(zYȲ ajHA kQ$}U_c8i4Mu<VIp8Qq'!Nsyo^:>9 NNlc 9Hy-Χ/W`g~~T.EgyeRPcVc1F I<Rs +nBSM)RZ)PZaZIs+4=~%!D6x4N.>h�d%2g?W>{NMM &},ezzڟj BZ竢`FYkEFZ@ό*4VJiZ)F) VJj?k�`Wҵ>-/htQw'?fgyO٘"R#3W$BiZ+vJ(0BHyJWRYMk¦ {tc3g8ӰO<OO./| !B)33LOϢ m2/x_`~V�@J1Yi%(%RʤYry_K/&�Ȁ^o%y=4W~zmO{R.X ()mZ;̳</^H] 2@J)2ҽyB ʷUՕ>#˃G�+6 g>jZgqZ8I,š,+.i~ZyVJR 0aA)R1W^~hsc]?cG@g;ܷZۯ}~O"S'08 dۡVD9%bսn)ta,he+}Q~֥D+ et HEggQ<}?G{}[X0Ɉ>8O~;o{RIYfg96&I",$iy!<2jbBRͭ0ET $XIsʅu;;O<C?�! ?_ףO>/?;/!wO<h4tQ,Ivm?BV*eAk;.B+o<:A0 D(?~G}jj @F?~Fp8Zka5Sץ$H| c)i-Ʈ\y}䱟=n4*|j@[;_xW~鮻ϴ(ʝ6(3)"k-AߋQQ>ܸ֜ EfZ{ 2y~e1ߝdO;|T%`vzK'Ep8e}pYks^RJa}7R:ʥW>TcOu!ާ>~G+A!ZӜZ:h`<ƈ\y!.X!TZ!my:b})}( 2 Ɗr(^|.=瞓3wvŞloޠTkZNbZִ}+DB@e;{ �*5?s^;x[m(`~nAH!eVc%ȰCa~ P욃bLToɓ'~QI5/ ' p4YV%t۝O<s?,mQQPm% ?>s3 + sK $I2Xҕ+cOŸkf7mƕ9FW~'?}ͳrUVW/aVvۛq&W >6�Sٟ} ?AWwv+ӵ/|駟^/ׂ7;J߷�A+����IENDB`������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/64x64/apps/������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022365� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/64x64/apps/quodlibet.png�����������������������������������0000644�0001750�0001750�00000004136�13112005742�025071� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���@���@���iq���sBIT|d��� pHYs����+���tEXtSoftware�www.inkscape.org<��IDATxZ}pg~~ܒ IK‡Nc#"%300PHC:*iGF$VtPp@i)RB#$*dWmPZH) .>%\d晻}v~dwŸ0kEu9# b&vJp= NIh 0rbEl00šQ@=.9t6\OLL{m4兦Ƭ֖L �:'ܻuug% 3 Q�hS>7q{gasM-6T`{,& EoѣM~(�V$,\{)��0r惒-]>Ze #wO.<:K* #O"RDf^d7 2%; h AP9mo^$"]Q7=af@) Y3MzY.ÌO敝xD<] g@}HP $KHTXVAa&,\JKS #y*�XB^. --.}D_/yyv1/Qfв0a0Is= _ZpeŲ_!7=94|]/Fc*oL^g{e6ti0+(+��6i隠%@OpyCnx?!YR^�@kY PHTF Hw5A�@D�-ϠbNf`<;$<,I*Zd ',�"@` ۊ=X[Ou  VTVo.�@D Ĵ4i>mf�@`ߡWAegl.�H0@!a���\<yVP }A;^2iH2-)߼VoqqE�ѿ�jѷozͣ{+&/ZZv3I8 PHb@?O;Q%#XEYÍ@p=g?57l%v5*RAh:qxi<<w�2Z r,LKM*|'NE$Yw,LZ hiny$b(<Y �IެK5;B=UDն5hoo?j.�H]PEIK.co$Su;YY y>CK arG(%V*juC[{`�3nZ?:TDz0Zia&`*0*Yi�Q#ۻ�ɠ<øsKGwWP*)" *nN ~\ .n`}u2}&vCl*zÊwҠU [)HFfַT*?!RRPXZ.�+ox22gj/J_\<?ѣuZiաZ Slx~#<m}1(ӀCXrs&z^vѧzՀp1N%5L< dȳ\o$x\PVfe�68Aŭ`P|]`wR&~`~n-|NzwDđ~KA*:w@ի0gΜ#(fVCUUNj`Yj%oo02 P(D0YSS.hr^a[B+++N~?:+ P^^u[H+H0 fff!y!'ɥ% I#//U|Yހ[tBiiv9Wv]�00vM}�. כH_qN9c� H<J�*pFm�;]aBKCnjH$BZ!9��?ϋH[\я~|rG,4I����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/64x64/apps/exfalso.png�������������������������������������0000644�0001750�0001750�00000007702�13112005742�024544� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���@���@���iq���sBIT|d��� pHYs����+���tEXtSoftware�www.inkscape.org<��?IDATxyp\ՕnfeK`dYޅ70`LL<II"PL U3CX&El0^ ƞSƖ-ɲEn[[}G~Sۖ*nYw}=WUK4Ӵ5Wp L\\3u}˜Mz<l:�?dEߺØϋ օŻvUն.hR޺$c�07oؼ`(<44s#uAzJ_%3"cz_ιBO#C#ccŴY/cw+7ol솔d eu*Y@_{7c^)`K~FV],SF4`nuZZ殳lJfV`%k6re)*dOs.M/<*`smkD]xmfe*%9#m kժpm[[ ej4XFN<$.Jbo/{TUvs�4.\QB0mr%I9F|homMf\2;f mI:3<_3w|R[º~e 7zN$ VGc&6وrx\|g ,2lWlSYA9g" Tåyñ-uswkϿ96.2<+'-x'{\WIq͛m,":ҘK>E7PI&:<\]YZ^~z ꑌsIdig ^�-YtHp8}$Z'iUG*n_ ;y�֎8:O֓}vɧeS"+ޔ2M[a$+K*1Q`M"Uad=9.~({~*f/F&7]YwV˗M)SlacFEYG0ʺeD'j+t\KO.y9!Ο16wK�m_H:OlJ+D}�%m7 +Mj2pSXfQ[{,tnv^ս `Ɋi($[a.K[ܸ48kӉ @x!"`|G V08ܺaܦ$-D�<(^xAGW@hH ƏFҪKac{r"t,5:}m&E+t>-}+S+.M.'E�V #'t~[a1,hLx0`JuOkES~y�y?]|4R=b'[T?K# gjjE{6nB@w yO4H+Yg�JX *jE孰x4-9-Zgxru�,*Jd+ `ӷ/w5U};wk佾+N?i})TA~~ijG}@2ڶ 5[{ ڰ� |yY p=&}>֗ QUUɲ瞥ix� xx4�+W,٫oW?0Ht8J@?C <3&}CvVc  põp׭kC19#$Vomݹ7{? ;㎝ qu>xYq EE;qꨪqu4o|lP"c:N$Q��nnʀ\;d*s{|u{V<﹛0fDQ0@|1fDc8%MRmPi7_]s+9pQ>v,?\sNx$~vcwCѓhƘOZ[[ =f:d{Ƙ 0_zlYR`&X ]z%0nh=| g6^1&j0Ȫ4H:s.F#a,Ch'ٝ%Ł=w QP֖oE# 9B˛hdgEdR^t`iWWW'vIL{ys=b}c0'}_޹Hwm dub\ukgƻ?o;{)s҄T6Dǃ/-'>Biq#);pkY! c -\xi! �mZMHc*O=f_}W|Z'z#J"w8Xqif!M!qd]q,b.t>7q #U!1eE7^Ri%9p |n(D[zݷϣ{~;T_8x OO&,\s`zʧ+*coo{ R%EjloͦBPauF*: ɳCƘm�sVsWX; Tp8̫ x qPBɺW+}XjYwLeW�{y -t~GbdȺDUem$\${+۷o"zҌ B2t:JdeeQSUFeщ oSk(aW{{S"2Y3qy0Yx0]5%@e=`0RA|V@8ӭ�2rBt߬;5dB8f$Om;$sD9vp` >(N^� M/Ñ?_�sCAS�ٵ[xHI;&M ~Rt4F4V&a:P0k\c$~e^UX" }hk JV^F˘uVTWWqϝcNwON߬]zIaJLh4 0wTT &/> ٟ:::I[MnClaO� ].΢3LB+++hG ?G;;׏i5}z_YYi* sKÇYf5ą#HyS>b{`%6QXXȜY}mLk4"cLg&ߒ׮_O?S-h}>ۋun%Ƙ il?T:peˣ P0ĤյׯPir/wun $ ]ת^^ ۷o'>f``<+D7*++X Pq 6@",rshi1)[MjG}D!bCbV޾O~F6mDGgD"E%+ֿcLCP4P-6u5Ձ%q5]0ɓ}| %1&6}&&GQlaŊKOOV̢^/*ϙn97r1[L>I;$mkIH4I.HڜӺt njX~|\Lkl7}AK-i$5ؗ$I-[zꩧI*⊦M-w$d%H/mJg}`ii/_zeMEy%.YW_ڟITbŊU-3"#i;KZt]"9&iYuV["}8$E_2����IENDB`��������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/24x24/�����������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021412� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/24x24/status/����������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022735� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/24x24/status/quodlibet-missing-cover.png�������������������0000644�0001750�0001750�00000002747�13112005742�030232� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������w=���sBIT|d��� pHYs��b��b8z���tEXtSoftware�www.inkscape.org<���tEXtTitle�Missing Album Cover Art{��;IDATHKlW1oIZ5-qIJExТF]`5!JA X 6A2 . F "UQQVlBh3DZg{xBj�*s={\ӹs$�ffg39yK*PU66=@Vt0Q(\eyJZ)hYvK>ÿ{r&s&X6JR{1e~_mˀ2x?\�chLY{'&)KMnpEx*QFc8y$o ~+FXkmZ�@DF4i^Og|`1"VE2lD#$hvFRXg|sp:a166FQ!!IR'PJ!ds{u4gl/5,,Oav�( VVW: 81ARDAsde%XOTY][^rkc a $"(V;~?()Ks㉣Cpν=@CDŽa=R 6H)XZ^&i4x)C5a�9 B �MHYH!hZ8JKJI ;</i@Z1='z4 8FkKQ,,.z!y uY7=knoe)caHisX1w譯y,.z5wn/DJs Zkv:pΑ++$Dz1V+Yԑ#2Ɛe[im/N Im?_HiFGGޓ9[[[5@ !o.☼{ύ%vv[*% RJoq`5^◿V*ѳB;(Gߴ֪`677sNy‡A`kjEaǕ<xcn;,@sff湣L}3fWks9¬ZjRz)GHT9+毼xo]p?` :39߭6DʲEѭZV4\[sһ2z睫7?S/'j@ĉҷjiJ^r1<aEQ8%K|33 `hqܜ/$I5hV 6=}/u =هVE}ʋsl|OجRCES~(GdnnN}M;����IENDB`�������������������������quodlibet-3.9.1/quodlibet/images/hicolor/24x24/apps/������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022355� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/24x24/apps/quodlibet.png�����������������������������������0000644�0001750�0001750�00000001347�13112005742�025062� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������w=���sBIT|d��� pHYs����mh���tEXtSoftware�www.inkscape.org<��dIDATHKHTQƿsthtF3Gh3k>EI!ElSZKWV6E`0BLEXBDsC:e3޹ޯMe<suF$,ohI(-g? Z[-�Y/X$࣫� ֖4"_H>yjY;چR75%!A!đ5{*J=\ӁLrS39[sx1;=:/ *!<u݇}1EjR�@9I!YJ;!eHU W> &H6aB!ĉ쬬JCj�Q˙gI&H^Rs+eF^C/\q$C$foߌeb_'i3=%V�P&T95=@Z?%\uR� `r^QQP];2^ twIلQu߂?H9�x?s̵;uvu&"Ylb$QI,H8�x<g8&iө%Қx<n1!qIs.e:;;IKj#rw����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/24x24/apps/exfalso.png�������������������������������������0000644�0001750�0001750�00000002437�13112005742�024534� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������w=���sBIT|d��� pHYs����mh���tEXtSoftware�www.inkscape.org<��IDATH[legvfJ[ln˭r)0"B"5|'1 ECCK,n-E""ҽJ(~aw>x'dw9a7~w+u̬Y�iG/q_'5+3 :Rظkm{|"9|BO*Ag]j,kp "*_5{G:tm[:#, Rd=Eڽ�ɖE0Bx#KB2% UE*"RL٫V.K wxYzs�`B1?󿒢"TW�() 7;&.`�8 � du,,cef^DTr5X,EH-)u'%qFU\"255oR#NYJH B$\J >{AG]qiBc4D5DIa,^tq7d x,[z8tk232J-a /��3g8:TJu],8ߕDvf&܎϶]Eܜ1�c�:d�ӊ+3,r"x)ȴeb w xtGg_&ҘXDT5tplm6BLL96˴u6xkCC#zL�+ѓ,yD-%܎6&n8M?.oi9 Vm&3xJ bƎ-hXvruoۿ DtB=4%S5U q"Fk9?%%?scl,˽;MZU˔9!{KЖtNs]e%�X&9a?�TK2*w� 5Eyl_1K^ݽu?"gfjtp876kW8AD@hۿ|7 i~~zXGwww3kDd�`[R_�q}{ V,p4"?6�+] k׮ $� {?a沙bǘY<xر̜x-F8(5l1ʿ����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/scalable/��������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022375� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/scalable/status/�������������������������������������������0000755�0001750�0001750�00000000000�13115513301�023720� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/scalable/status/quodlibet-missing-cover.svg����������������0000644�0001750�0001750�00000104272�13112005742�031224� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="48.000000px" height="48.000000px" id="svg3077" sodipodi:version="0.32" inkscape:version="0.45+devel" sodipodi:docbase="/home/jimmac/src/cvs/gnome/rhythmbox/plugins/artdisplay" sodipodi:docname="rhythmbox-missing-artwork.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape"> <defs id="defs3"> <linearGradient inkscape:collect="always" id="linearGradient4623"> <stop style="stop-color:#888a85;stop-opacity:1;" offset="0" id="stop4625" /> <stop style="stop-color:#888a85;stop-opacity:0;" offset="1" id="stop4627" /> </linearGradient> <linearGradient inkscape:collect="always" id="linearGradient4452"> <stop style="stop-color:#888a85;stop-opacity:1;" offset="0" id="stop4454" /> <stop style="stop-color:#888a85;stop-opacity:0;" offset="1" id="stop4456" /> </linearGradient> <linearGradient inkscape:collect="always" id="linearGradient4428"> <stop style="stop-color:#eeeeec;stop-opacity:1" offset="0" id="stop4430" /> <stop style="stop-color:#ad7fa8;stop-opacity:0;" offset="1" id="stop4432" /> </linearGradient> <linearGradient inkscape:collect="always" id="linearGradient4420"> <stop style="stop-color:#729fcf;stop-opacity:1;" offset="0" id="stop4422" /> <stop style="stop-color:#729fcf;stop-opacity:0;" offset="1" id="stop4424" /> </linearGradient> <linearGradient inkscape:collect="always" id="linearGradient4401"> <stop style="stop-color:#eeeeec;stop-opacity:1;" offset="0" id="stop4403" /> <stop style="stop-color:#eeeeec;stop-opacity:0;" offset="1" id="stop4405" /> </linearGradient> <linearGradient inkscape:collect="always" id="linearGradient23419"> <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop23421" /> <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop23423" /> </linearGradient> <linearGradient id="linearGradient3435" gradientUnits="userSpaceOnUse" x1="12.2744" y1="32.4165" x2="35.3912" y2="14.2033"> <stop offset="0.0000000" style="stop-color:#ffffc8;stop-opacity:1.0000000;" id="stop3437" /> <stop offset="1.0000000" style="stop-color:#9a91ef;stop-opacity:0.0000000;" id="stop3439" /> </linearGradient> <linearGradient y2="14.2033" x2="35.3912" y1="32.4165" x1="12.2744" gradientUnits="userSpaceOnUse" id="linearGradient3421"> <stop id="stop3423" style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.0000000" /> <stop id="stop3427" style="stop-color:#b8c04c;stop-opacity:0.0000000;" offset="1.0000000" /> </linearGradient> <linearGradient id="linearGradient3406" gradientUnits="userSpaceOnUse" x1="12.2744" y1="32.4165" x2="35.3912" y2="14.2033"> <stop offset="0.0000000" style="stop-color:#b307ff;stop-opacity:0.82178217;" id="stop3408" /> <stop offset="1.0000000" style="stop-color:#f0ff8b;stop-opacity:0.64356434;" id="stop3410" /> <stop offset="1.0000000" style="stop-color:#ffffff;stop-opacity:0.0000000;" id="stop3412" /> </linearGradient> <linearGradient y2="14.2033" x2="35.3912" y1="32.4165" x1="12.2744" gradientUnits="userSpaceOnUse" id="linearGradient3394"> <stop id="stop3396" style="stop-color:#fff307;stop-opacity:1.0000000;" offset="0.0000000" /> <stop id="stop3398" style="stop-color:#166eff;stop-opacity:1.0000000;" offset="0.50000000" /> <stop id="stop3400" style="stop-color:#ffffff;stop-opacity:0.0000000;" offset="1.0000000" /> </linearGradient> <linearGradient inkscape:collect="always" id="linearGradient6036"> <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop6038" /> <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop6040" /> </linearGradient> <linearGradient inkscape:collect="always" id="linearGradient6028"> <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop6030" /> <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop6032" /> </linearGradient> <linearGradient id="linearGradient4236"> <stop style="stop-color:#ffffff;stop-opacity:0.32673267;" offset="0.0000000" id="stop4238" /> <stop style="stop-color:#ffffff;stop-opacity:0.60396039;" offset="1.0000000" id="stop4240" /> </linearGradient> <linearGradient id="aigrd2" gradientUnits="userSpaceOnUse" x1="12.2744" y1="32.4165" x2="35.3912" y2="14.2033"> <stop offset="0" style="stop-color:#FBFBFB" id="stop3043" /> <stop offset="0.5" style="stop-color:#B6B6B6" id="stop3045" /> <stop offset="1" style="stop-color:#E4E4E4" id="stop3047" /> </linearGradient> <linearGradient id="aigrd1" gradientUnits="userSpaceOnUse" x1="14.9966" y1="11.1885" x2="32.511" y2="34.3075"> <stop offset="0" style="stop-color:#EBEBEB" id="stop3034" /> <stop offset="0.5" style="stop-color:#FFFFFF" id="stop3036" /> <stop offset="1" style="stop-color:#EBEBEB" id="stop3038" /> </linearGradient> <radialGradient inkscape:collect="always" xlink:href="#linearGradient23419" id="radialGradient23425" cx="23.334524" cy="41.63604" fx="23.334524" fy="41.63604" r="22.627417" gradientTransform="matrix(1,0,0,0.25,0,31.22703)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient4452" id="linearGradient4458" x1="37.288559" y1="2.8677347" x2="37.280708" y2="2.0962129" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.672613,0,1.682891)" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient23419" id="radialGradient4605" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.25,0,31.22703)" cx="23.334524" cy="41.63604" fx="23.334524" fy="41.63604" r="22.627417" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient23419" id="radialGradient4689" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.25,0,31.22703)" cx="23.334524" cy="41.63604" fx="23.334524" fy="41.63604" r="22.627417" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient4452" id="linearGradient4691" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.860177,0,0,0.672613,45.32049,-18.210616)" x1="37.288559" y1="2.8677347" x2="37.315113" y2="2.0962098" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient4420" id="radialGradient4693" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.847481,-0.205074,0.48358,1.798528,-14.84867,-45.28409)" cx="36.003681" cy="42.525311" fx="36.003681" fy="42.525311" r="5.3406065" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient6036" id="radialGradient4695" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.482928,3.885323e-2,-0.143595,1.606302,9.779125,-38.08456)" cx="10.935528" cy="31.069784" fx="10.935528" fy="31.069784" r="7.4477844" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient4428" id="radialGradient4697" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.667014,0.505147,-33.1019)" cx="37.341717" cy="16.156126" fx="37.341717" fy="16.156126" r="5.9520255" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient4401" id="radialGradient4699" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.381742,1.422698,-1.000931,0.891366,3.744765,-33.94369)" cx="10.172584" cy="7.9383407" fx="10.172584" fy="7.9383407" r="5.2316146" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient4623" id="radialGradient4701" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.405467,0.575716,-0.698805,1.380855,-70.56949,-34.99677)" cx="92.223236" cy="-47.475407" fx="92.223236" fy="-47.475407" r="0.23405507" /> <linearGradient gradientTransform="translate(0.5,-0.353553)" gradientUnits="userSpaceOnUse" y2="11.669628" x2="15.889072" y1="24.919628" x1="25.985928" id="linearGradient4415" xlink:href="#linearGradient4409" inkscape:collect="always" /> <linearGradient y2="34.3075" x2="32.511" y1="11.1885" x1="14.9966" gradientTransform="matrix(1.190476,0,0,1.190476,-4.308944,-3.833323)" gradientUnits="userSpaceOnUse" id="linearGradient3526" xlink:href="#aigrd1" inkscape:collect="always" /> <linearGradient y2="14.2033" x2="35.3912" y1="32.4165" x1="12.2744" gradientTransform="matrix(1.190476,0,0,1.190476,-4.308944,-3.833324)" gradientUnits="userSpaceOnUse" id="linearGradient3523" xlink:href="#aigrd2" inkscape:collect="always" /> <linearGradient gradientTransform="translate(-8.452e-2,-1.333323)" y2="54.698483" x2="48.798885" y1="3.6100161" x1="10.501720" gradientUnits="userSpaceOnUse" id="linearGradient3519" xlink:href="#linearGradient6036" inkscape:collect="always" /> <linearGradient y2="18.366575" x2="17.742729" y1="31.494707" x1="28.702885" gradientUnits="userSpaceOnUse" id="linearGradient3515" xlink:href="#linearGradient6028" inkscape:collect="always" /> <radialGradient r="22.627417" fy="41.63604" fx="23.334524" cy="41.63604" cx="23.334524" gradientTransform="matrix(1,0,0,0.25,0,31.22703)" gradientUnits="userSpaceOnUse" id="radialGradient3507" xlink:href="#linearGradient23419" inkscape:collect="always" /> <linearGradient y2="34.3075" x2="32.511" y1="11.1885" x1="14.9966" gradientUnits="userSpaceOnUse" id="linearGradient4961"> <stop id="stop4963" style="stop-color:#EBEBEB" offset="0" /> <stop id="stop4965" style="stop-color:#FFFFFF" offset="0.5" /> <stop id="stop4967" style="stop-color:#EBEBEB" offset="1" /> </linearGradient> <linearGradient y2="14.2033" x2="35.3912" y1="32.4165" x1="12.2744" gradientUnits="userSpaceOnUse" id="linearGradient4953"> <stop id="stop4955" style="stop-color:#FBFBFB" offset="0" /> <stop id="stop4957" style="stop-color:#B6B6B6" offset="0.5" /> <stop id="stop4959" style="stop-color:#E4E4E4" offset="1" /> </linearGradient> <linearGradient id="linearGradient4409" inkscape:collect="always"> <stop id="stop4411" offset="0" style="stop-color:#ffffff;stop-opacity:1;" /> <stop id="stop4413" offset="1" style="stop-color:#ffffff;stop-opacity:0;" /> </linearGradient> </defs> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="0.25490196" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="8" inkscape:cx="18.98193" inkscape:cy="24.255085" inkscape:current-layer="layer1" showgrid="false" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:window-width="872" inkscape:window-height="945" inkscape:window-x="357" inkscape:window-y="89" inkscape:showpageshadow="false" inkscape:object-points="false" inkscape:object-nodes="true" /> <metadata id="metadata4"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title>Missing Album Cover Art</dc:title> <dc:creator> <cc:Agent> <dc:title></dc:title> </cc:Agent> </dc:creator> <dc:source></dc:source> <dc:subject> <rdf:Bag> <rdf:li>cdrom</rdf:li> <rdf:li>missing</rdf:li> <rdf:li>artwork</rdf:li> <rdf:li>inlay</rdf:li> </rdf:Bag> </dc:subject> <cc:license rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /> <dc:contributor> <cc:Agent> <dc:title>Jakub Steiner</dc:title> </cc:Agent> </dc:contributor> </cc:Work> <cc:License rdf:about="http://creativecommons.org/licenses/GPL/2.0/"> <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction" /> <cc:permits rdf:resource="http://web.resource.org/cc/Distribution" /> <cc:requires rdf:resource="http://web.resource.org/cc/Notice" /> <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> <cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike" /> <cc:requires rdf:resource="http://web.resource.org/cc/SourceCode" /> </cc:License> </rdf:RDF> </metadata> <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> <path transform="matrix(0.988381,2.280278e-2,0,0.675773,2.525222,2.657421)" inkscape:r_cy="true" inkscape:r_cx="true" d="M 45.961941 41.63604 A 22.627417 5.6568542 0 1 1 0.70710754,41.63604 A 22.627417 5.6568542 0 1 1 45.961941 41.63604 z" sodipodi:ry="5.6568542" sodipodi:rx="22.627417" sodipodi:cy="41.63604" sodipodi:cx="23.334524" id="path4603" style="opacity:1;color:black;fill:url(#radialGradient4605);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" sodipodi:type="arc" /> <path sodipodi:type="arc" style="opacity:0.33146069;color:black;fill:url(#radialGradient23425);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" id="path23417" sodipodi:cx="23.334524" sodipodi:cy="41.63604" sodipodi:rx="22.558737" sodipodi:ry="5.6568542" d="M 45.893261 41.63604 A 22.558737 5.6568542 0 1 1 0.77578735,41.63604 A 22.558737 5.6568542 0 1 1 45.893261 41.63604 z" inkscape:r_cx="true" inkscape:r_cy="true" transform="matrix(0.903955,0.343558,2.8045e-2,0.891465,-5.675046e-2,-7.309531)" /> <path id="path3311" d="M 6.5498913,30.647672 L 41.326175,30.647672 L 43.339294,2.5694122 L 4.358146,2.5694122 L 6.5498913,30.647672 z " style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" sodipodi:nodetypes="ccccc" /> <path style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 43.029653,2.7781408 L 30.036566,2.7781408 L 30.228815,3.6246195 C 30.228815,3.6246195 42.382213,6.7900143 41.896077,17.96323 C 41.409941,29.220297 30.798484,31.174451 30.798484,31.174451 L 41.702189,31.217838 L 41.807688,31.71488 L 43.84062,3.6246195 L 43.029653,2.7781408 z " id="path4332" sodipodi:nodetypes="ccczccccc" /> <path style="fill:url(#linearGradient4458);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 30.790233,3.0928289 L 42.711515,3.1224216 L 43.32768,3.7542939 C 43.32768,3.7542939 32.195041,3.7561996 32.140545,3.7317632 C 32.086049,3.7073267 31.002868,3.3275533 30.657727,3.2298075 C 30.312585,3.1320616 30.790233,3.1050471 30.790233,3.0928289 z " id="path4335" sodipodi:nodetypes="cccssc" /> <g inkscape:label="Layer 1" id="g4981" transform="matrix(0.7279725,0,0,0.6404786,7.6647474,2.3832427)"> <path transform="matrix(1,0,0,1.066291,0.91548,-4.218429)" inkscape:r_cy="true" inkscape:r_cx="true" d="M 45.961941,41.63604 A 22.627417,5.6568542 0 1 1 0.70710754,41.63604 A 22.627417,5.6568542 0 1 1 45.961941,41.63604 z" sodipodi:ry="5.6568542" sodipodi:rx="22.627417" sodipodi:cy="41.63604" sodipodi:cx="23.334524" id="path4983" style="opacity:0.55;color:#000000;fill:url(#radialGradient3507);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" sodipodi:type="arc" /> <path style="fill:url(#linearGradient3526);fill-rule:nonzero;stroke:none;stroke-miterlimit:4" d="M 24.262486,2.8333435 C 12.714866,2.8333435 3.4291519,12.119058 3.4291519,23.666677 C 3.4291519,35.214297 12.714866,44.500012 24.262486,44.500012 C 35.810106,44.500012 45.095821,35.214297 45.095821,23.666677 C 45.095821,12.119058 35.810106,2.8333435 24.262486,2.8333435 L 24.262486,2.8333435 z M 24.262486,28.666678 C 21.524391,28.666678 19.262486,26.404773 19.262486,23.666677 C 19.262486,20.928582 21.524391,18.666677 24.262486,18.666677 C 27.000581,18.666677 29.262486,20.928582 29.262486,23.666677 C 29.262486,26.404773 27.000581,28.666678 24.262486,28.666678 z" id="path3040" inkscape:r_cx="true" inkscape:r_cy="true" /> <path style="fill:url(#linearGradient3523);fill-rule:nonzero;stroke:#808080;stroke-width:1.46450281;stroke-miterlimit:4;stroke-opacity:1" d="M 24.262486,2.8333431 C 12.714866,2.8333431 3.429152,12.119058 3.429152,23.666677 C 3.429152,35.214297 12.714866,44.500012 24.262486,44.500012 C 35.810106,44.500012 45.095821,35.214297 45.095821,23.666677 C 45.095821,12.119058 35.810106,2.8333431 24.262486,2.8333431 L 24.262486,2.8333431 z M 24.262486,28.666678 C 21.524391,28.666678 19.262486,26.404773 19.262486,23.666677 C 19.262486,20.928582 21.524391,18.666677 24.262486,18.666677 C 27.000581,18.666677 29.262486,20.928582 29.262486,23.666677 C 29.262486,26.404773 27.000581,28.666678 24.262486,28.666678 z" id="path3049" inkscape:r_cx="true" inkscape:r_cy="true" /> <path sodipodi:nodetypes="csccssccsc" id="path3531" d="M 23.410538,3.4587825 C 12.648847,3.864693 4.1109275,12.676135 4.1109275,23.541217 C 4.1109275,28.466722 5.858051,32.943607 8.7777601,36.427697 L 19.895113,27.017403 C 19.173772,26.174062 18.845878,24.974235 18.845878,23.791217 C 18.845878,20.400827 21.150167,18.223842 24.413253,18.223842 C 25.897178,18.223842 27.38434,18.897269 28.271719,19.97014 L 39.639072,10.684846 C 35.963901,6.2606919 30.394797,3.4587825 24.163253,3.4587825 C 23.902492,3.4587825 23.668819,3.4490406 23.410538,3.4587825 z" style="fill:url(#linearGradient4415);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1" /> <path style="opacity:0.51098902;fill:#eeeeec;fill-rule:nonzero;stroke:none;stroke-miterlimit:4" d="M 24.262486,13.562512 C 18.6199,13.562512 14.15832,18.155315 14.15832,23.666677 C 14.15832,29.309265 18.751124,33.770843 24.262486,33.770843 C 29.905072,33.770843 34.366652,29.178041 34.366652,23.666677 C 34.366652,18.024091 29.773848,13.562512 24.262486,13.562512 L 24.262486,13.562512 z M 24.262486,29.178041 C 21.244359,29.178041 18.751124,26.684806 18.751124,23.666677 C 18.751124,20.64855 21.244359,18.155315 24.262486,18.155315 C 27.280613,18.155315 29.773848,20.64855 29.773848,23.666677 C 29.773848,26.684806 27.280613,29.178041 24.262486,29.178041 z" id="path3051" inkscape:r_cx="true" inkscape:r_cy="true" /> <path sodipodi:nodetypes="cccccc" id="path5264" d="M 24.262482,3.8690421 C 13.288938,3.8690421 4.4648511,12.693131 4.4648511,23.666674 C 4.4648511,34.640218 13.288938,43.464305 24.262482,43.464305 C 35.236026,43.464305 44.060113,34.640218 44.060113,23.666674 C 44.060113,12.693131 35.236026,3.8690421 24.262482,3.8690421 L 24.262482,3.8690421 z" style="opacity:0.54644811;fill:none;fill-rule:nonzero;stroke:url(#linearGradient3519);stroke-width:1.46450281;stroke-miterlimit:4;stroke-opacity:1" inkscape:r_cx="true" inkscape:r_cy="true" /> <path transform="translate(3.868e-3,-1.244934)" d="M 30.405591,24.930641 A 6.0987959,6.0987959 0 1 1 18.207999,24.930641 A 6.0987959,6.0987959 0 1 1 30.405591,24.930641 z" sodipodi:ry="6.0987959" sodipodi:rx="6.0987959" sodipodi:cy="24.930641" sodipodi:cx="24.306795" id="path6026" style="opacity:0.67213111;color:#000000;fill:none;fill-opacity:0.31638417;fill-rule:nonzero;stroke:url(#linearGradient3515);stroke-width:1.3627764;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" sodipodi:type="arc" inkscape:r_cx="true" inkscape:r_cy="true" /> </g> <g id="g4658" transform="translate(0,20)"> <path transform="matrix(0.129981,0.103616,-0.5612,0.268864,26.58925,-1.48946)" inkscape:r_cy="true" inkscape:r_cx="true" d="M 45.893261,41.63604 A 22.558737,5.6568542 0 1 1 0.77578735,41.63604 A 22.558737,5.6568542 0 1 1 45.893261,41.63604 z" sodipodi:ry="5.6568542" sodipodi:rx="22.558737" sodipodi:cy="41.63604" sodipodi:cx="23.334524" id="path1986" style="opacity:0.33146069;color:#000000;fill:url(#radialGradient4689);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" sodipodi:type="arc" /> <path sodipodi:nodetypes="ccccc" id="path4318" d="M 38.802485,24.124906 L 37.830213,25.718084 L 5.3232208,11.518327 L 6.301098,10.350715 L 38.802485,24.124906 z" style="fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:#babdb6;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path sodipodi:nodetypes="cccczccccc" id="path4460" d="M 6.0617664,11.73142 L 9.373287,11.678174 L 9.4294145,11.198955 L 19.644613,11.145708 C 19.644613,11.145708 9.4013505,8.336953 8.7558849,-1.952941 C 8.1104193,-12.296081 19.532359,-16.382753 19.532359,-16.382753 L 19.700741,-17.394437 L 4.6585798,-17.394437 L 3.8727952,-16.542492 L 6.0617664,11.73142 z" style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path sodipodi:nodetypes="cccssc" style="fill:url(#linearGradient4691);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 18.724475,-16.904252 L 8.2883053,-16.800678 L 8.0382993,-16.324167 C 8.0382993,-16.324167 17.887911,-16.218687 17.934787,-16.243124 C 17.981664,-16.26756 18.569815,-16.58075 18.866698,-16.678496 C 19.163581,-16.776242 18.798457,-16.847645 18.724475,-16.904252 z" id="path4464" /> <path sodipodi:nodetypes="ccccc" id="path4462" d="M 8.8681398,11.784686 L 9.5416694,11.09248 L 7.3526982,-17.500929 L 6.7352961,-17.394436 L 8.8681398,11.784686 z" style="fill:#2e3436;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> <g transform="matrix(1,0,0,0.948672,3.739989,-16.860039)" id="g4585"> <path sodipodi:type="arc" style="opacity:1;fill:#555753;fill-opacity:1;stroke:none;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path4489" sodipodi:cx="25.253489" sodipodi:cy="17.17557" sodipodi:rx="0.032515224" sodipodi:ry="2.9372084" d="M 25.286004,17.17557 A 0.032515224,2.9372084 0 1 1 25.220973,17.17557 A 0.032515224,2.9372084 0 1 1 25.286004,17.17557 z" transform="matrix(99.66666,0,0,0.992191,-2495.288,-1.842986)" /> <path style="fill:#2e3436;fill-opacity:0.75;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.41067854;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 22.02833,14.787463 L 23.033644,13.685554 M 20.273948,16.689852 L 21.258989,15.653691" id="path4474" sodipodi:nodetypes="cccc" /> <path sodipodi:nodetypes="cccc" id="path4485" d="M 22.191832,15.275256 L 23.681792,15.511897 M 19.669153,14.91233 L 21.024988,15.081918" style="fill:#2e3436;fill-opacity:0.75;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.41067854;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path style="fill:#2e3436;fill-opacity:0.75;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.41067854;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 21.86607,15.714554 L 22.285687,17.092161 M 20.978551,13.312538 L 21.436053,14.664751" id="path4487" sodipodi:nodetypes="cccc" /> <path style="fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 21.198562,13.955481 C 20.982043,14.015832 20.873411,13.877366 20.804693,13.780445 L 20.136399,12.665506 C 20.136399,12.665506 20.384913,12.537625 20.726323,12.446217 C 21.067733,12.354809 21.382815,12.348701 21.382815,12.348701 L 21.434849,13.690847 C 21.447845,13.774314 21.418364,13.894217 21.198562,13.955481 z" id="path4499" sodipodi:nodetypes="ccczccz" /> <use x="0" y="0" xlink:href="#path4499" id="use4523" transform="matrix(-1,0,0,-1,43.32922,30.3955)" width="48" height="48" /> <use x="0" y="0" xlink:href="#path4499" id="use4533" transform="matrix(0.882543,0.423639,-0.52195,0.882543,10.47522,-7.385998)" width="48" height="48" /> <use x="0" y="0" xlink:href="#use4523" id="use4535" transform="matrix(0.882543,0.423639,-0.52195,0.882543,10.47904,-7.399771)" width="48" height="48" /> <use height="48" width="48" transform="matrix(0.529188,0.76443,-0.941825,0.529188,24.50813,-9.400688)" id="use4537" xlink:href="#path4499" y="0" x="0" /> <use height="48" width="48" transform="matrix(0.529188,0.76443,-0.941825,0.529188,24.51908,-9.410888)" id="use4539" xlink:href="#use4523" y="0" x="0" /> <use x="0" y="0" xlink:href="#path4499" id="use4541" transform="matrix(3.403775e-2,0.900393,-1.109342,3.403775e-2,37.7791,-4.824278)" width="48" height="48" /> <use x="0" y="0" xlink:href="#use4523" id="use4543" transform="matrix(3.403775e-2,0.900393,-1.109342,3.403775e-2,37.79425,-4.828188)" width="48" height="48" /> <use height="48" width="48" transform="matrix(-0.470233,0.795096,-0.979609,-0.470233,46.73221,5.117049)" id="use4545" xlink:href="#path4499" y="0" x="0" /> <use height="48" width="48" transform="matrix(-0.470233,0.795096,-0.979609,-0.470233,46.7475,5.120499)" id="use4547" xlink:href="#use4523" y="0" x="0" /> <use x="0" y="0" xlink:href="#path4499" id="use4549" transform="matrix(-0.848505,0.476752,-0.587391,-0.848505,48.96846,17.75954)" width="48" height="48" /> <use x="0" y="0" xlink:href="#use4523" id="use4551" transform="matrix(-0.848505,0.476752,-0.587391,-0.848505,48.9798,17.7694)" width="48" height="48" /> </g> <path sodipodi:nodetypes="ccccc" id="path4316" d="M 6.5407377,-16.123826 L 8.4096557,12.430772 L 37.830213,25.718084 L 39.863145,-7.906376 L 6.5407377,-16.123826 z" style="fill:#eeeeec;fill-opacity:0.53072623;fill-rule:evenodd;stroke:#babdb6;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path4275" d="M 3.2620499,-16.964062 L 39.964687,-7.91652 L 41.157199,-8.984633 L 4.8520557,-17.718024 L 3.2620499,-16.964062 z" style="fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:#babdb6;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path sodipodi:nodetypes="ccccc" id="path4337" d="M 27.472505,20.684343 L 37.354444,25.227271 L 38.153718,10.635069 L 37.572427,10.547341 L 27.472505,20.684343 z" style="opacity:0.16853931;fill:url(#radialGradient4693);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> <path style="opacity:0.74157302;fill:url(#radialGradient4695);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 20.37171,17.272429 L 8.8487475,12.132083 L 8.0192873,-3.736998 L 8.8904575,-1.523718 L 20.37171,17.272429 z" id="path4355" sodipodi:nodetypes="ccccc" /> <path inkscape:transform-center-y="4.1404464" inkscape:transform-center-x="2.8597408" style="opacity:0.61797755;fill:url(#radialGradient4697);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 27.680483,-10.92165 L 39.584534,-7.804756 L 38.473694,8.922561 L 35.747222,7.435952 L 27.680483,-10.92165 z" id="path4367" sodipodi:nodetypes="ccccc" /> <path id="path4399" d="M 6.9789685,-15.595712 L 18.171855,-12.841799 L 8.0671658,-1.90058 L 6.9789685,-15.595712 z" style="fill:url(#radialGradient4699);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> <path transform="matrix(3.211811,0,-0.443887,1.817612,-312.5037,69.01838)" d="M 92.577782,-47.368439 A 0.23405507,0.19804659 0 1 1 92.109672,-47.368439 A 0.23405507,0.19804659 0 1 1 92.577782,-47.368439 z" sodipodi:ry="0.19804659" sodipodi:rx="0.23405507" sodipodi:cy="-47.368439" sodipodi:cx="92.343727" id="path3319" style="opacity:1;fill:url(#radialGradient4701);fill-opacity:1;stroke:none;stroke-width:0.03583033;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" sodipodi:type="arc" /> </g> </g> </svg> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/scalable/apps/���������������������������������������������0000755�0001750�0001750�00000000000�13115513301�023340� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/scalable/apps/exfalso.svg����������������������������������0000644�0001750�0001750�00000014325�13112005742�025531� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64px" height="64px" id="svg7149" sodipodi:version="0.32" inkscape:version="0.42" sodipodi:docbase="/home/bene/src/quodlibet" sodipodi:docname="exfalso.svg" inkscape:export-filename="/home/bene/Desktop/exfalso.png" inkscape:export-xdpi="90.000000" inkscape:export-ydpi="90.000000"> <defs id="defs7151"> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient3614" x1="7.9840488" y1="6.4300642" x2="16.909092" y2="53.272732" gradientUnits="userSpaceOnUse" gradientTransform="translate(90.44897,-28.04676)" /> <linearGradient id="linearGradient2854"> <stop style="stop-color:#0a0a0a;stop-opacity:1.0000000;" offset="0.0000000" id="stop2856" /> <stop style="stop-color:#224354;stop-opacity:1.0000000;" offset="1.0000000" id="stop2858" /> </linearGradient> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient5100" x1="7.9840488" y1="6.4300642" x2="16.909092" y2="53.272732" gradientUnits="userSpaceOnUse" gradientTransform="translate(90.44897,-28.04676)" /> <linearGradient id="linearGradient3616"> <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop3618" /> <stop style="stop-color:#ffffff;stop-opacity:0.99170125;" offset="1.0000000" id="stop3620" /> </linearGradient> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient3622" x1="39.500000" y1="73.000000" x2="-3.0000000" y2="12.849862" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient4356" x1="39.500000" y1="73.000000" x2="-3.0000000" y2="12.849862" gradientUnits="userSpaceOnUse" /> </defs> <sodipodi:namedview id="base" pagecolor="#120a14" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0000000" inkscape:pageshadow="2" inkscape:zoom="4.0000000" inkscape:cx="46.614169" inkscape:cy="26.385804" inkscape:current-layer="layer1" showgrid="true" inkscape:document-units="px" inkscape:grid-bbox="true" inkscape:window-width="836" inkscape:window-height="539" inkscape:window-x="15" inkscape:window-y="45" /> <metadata id="metadata7154"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> </cc:Work> </rdf:RDF> </metadata> <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> <path sodipodi:nodetypes="cscscscscscscscsc" id="path2106" d="M 5.2258620,5.2258619 C 12.293855,12.670378 9.2267731,17.432756 13.104821,26.200907 C 16.703646,34.337760 24.537595,28.247279 29.900824,34.000012 C 24.537619,39.752698 16.676989,33.635631 13.078188,41.772482 C 9.2001631,50.540657 12.293833,55.329622 5.2258620,62.774138 C 12.670379,55.706145 17.459344,58.799838 26.227519,54.921813 C 34.364394,51.322988 28.273891,43.489039 34.026646,38.125811 C 39.738415,43.489645 33.672151,51.353995 41.799117,54.948423 C 50.569221,58.827332 55.327994,55.704587 62.774138,62.774138 C 55.704611,55.327994 58.827308,50.569198 54.948424,41.799117 C 51.353996,33.672151 43.516256,39.711805 38.152422,34.000012 C 43.516256,28.288196 51.353996,34.327851 54.948424,26.200907 C 58.827332,17.430802 55.704587,12.672006 62.774138,5.2258619 C 55.327971,12.295390 50.569198,9.1726917 41.799117,13.051577 C 33.672151,16.646005 39.738415,24.510379 34.026646,29.874213 C 28.273914,24.510961 34.364394,16.677012 26.227519,13.078187 C 17.459344,9.2001627 12.670379,12.293855 5.2258620,5.2258619 z " style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.65200000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" /> <path style="fill:url(#linearGradient3622);fill-opacity:1.0;fill-rule:evenodd;stroke:url(#linearGradient4356);stroke-width:0.75200000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1" d="M 3.225862,3.2258619 C 10.293855,10.670378 7.2267731,15.432756 11.104821,24.200907 C 14.703646,32.33776 22.537595,26.247279 27.900824,32.000012 C 22.537619,37.752698 14.676989,31.635631 11.078188,39.772482 C 7.2001631,48.540657 10.293833,53.329622 3.225862,60.774138 C 10.670379,53.706145 15.459344,56.799838 24.227519,52.921813 C 32.364394,49.322988 26.273891,41.489039 32.026646,36.125811 C 37.738415,41.489645 31.672151,49.353995 39.799117,52.948423 C 48.569221,56.827332 53.327994,53.704587 60.774138,60.774138 C 53.704611,53.327994 56.827308,48.569198 52.948424,39.799117 C 49.353996,31.672151 41.516256,37.711805 36.152422,32.000012 C 41.516256,26.288196 49.353996,32.327851 52.948424,24.200907 C 56.827332,15.430802 53.704587,10.672006 60.774138,3.2258619 C 53.327971,10.29539 48.569198,7.1726917 39.799117,11.051577 C 31.672151,14.646005 37.738415,22.510379 32.026646,27.874213 C 26.273914,22.510961 32.364394,14.677012 24.227519,11.078187 C 15.459344,7.2001627 10.670379,10.293855 3.225862,3.2258619 z " id="path7057" sodipodi:nodetypes="cscscscscscscscsc" inkscape:export-filename="/home/bene/Desktop/path7057.png" inkscape:export-xdpi="90.000000" inkscape:export-ydpi="90.000000" /> </g> </svg> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/scalable/apps/quodlibet.svg��������������������������������0000644�0001750�0001750�00000022037�13112005742�026057� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64" height="64" id="svg7163" sodipodi:version="0.32" inkscape:version="0.48.1 r9760" sodipodi:docname="quodlibet.svg" inkscape:export-filename="/home/lazka/Desktop/afaf.png" inkscape:export-xdpi="90.000000" inkscape:export-ydpi="90.000000" version="1.1"> <defs id="defs7165"> <linearGradient id="linearGradient2854"> <stop style="stop-color:#0a0a0a;stop-opacity:1.0000000;" offset="0.0000000" id="stop2856" /> <stop style="stop-color:#224354;stop-opacity:1.0000000;" offset="1.0000000" id="stop2858" /> </linearGradient> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient2092" gradientUnits="userSpaceOnUse" gradientTransform="translate(-0.802232,-1.7937)" x1="22.892284" y1="53.865356" x2="6.6690922" y2="2.7937005" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient2094" gradientUnits="userSpaceOnUse" gradientTransform="translate(-0.802232,-1.7937)" x1="22.892284" y1="53.865356" x2="6.6690922" y2="2.7937005" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient2832" gradientUnits="userSpaceOnUse" gradientTransform="translate(-0.802232,-1.7937)" x1="22.892284" y1="53.865356" x2="6.6690922" y2="2.7937005" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient2834" gradientUnits="userSpaceOnUse" gradientTransform="translate(-0.802232,-1.7937)" x1="22.892284" y1="53.865356" x2="6.6690922" y2="2.7937005" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient2807" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.25988,0,0,0.25988,0.03158064,-0.587767)" x1="22.892284" y1="53.865356" x2="10.679447" y2="8.5585861" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient5092" x1="5.9066291" y1="13.653723" x2="2.6446903" y2="1.5526923" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.973,0,0,0.973,0.233667,0.125665)" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient5104" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.25988,0,0,0.25988,0.03158064,-0.587767)" x1="22.892284" y1="53.865356" x2="10.679447" y2="8.5585861" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient5106" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.973,0,0,0.973,0.233667,0.125665)" x1="5.9066291" y1="13.653723" x2="2.6446903" y2="1.5526923" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient5109" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.25988,0,0,0.25988,0.09824731,-0.587767)" x1="22.892284" y1="53.865356" x2="10.679447" y2="8.5585861" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient5111" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.973,0,0,0.973,0.300334,0.125665)" x1="5.9066291" y1="13.653723" x2="2.6446903" y2="1.5526923" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient5118" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.25988,0,0,0.25988,0.09824731,-0.587767)" x1="22.892284" y1="53.865356" x2="10.679447" y2="8.5585861" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient2854" id="linearGradient5120" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.973,0,0,0.973,0.300334,0.125665)" x1="5.9066291" y1="13.653723" x2="2.6446903" y2="1.5526923" /> </defs> <sodipodi:namedview id="base" pagecolor="#5d5d5d" bordercolor="#555555" borderopacity="1.0000000" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:zoom="3.609375" inkscape:cx="25.114542" inkscape:cy="27.205567" inkscape:current-layer="layer1" showgrid="true" inkscape:document-units="px" inkscape:grid-bbox="true" inkscape:window-width="836" inkscape:window-height="645" inkscape:window-x="420" inkscape:window-y="139" showborder="true" inkscape:showpageshadow="true" borderlayer="false" inkscape:window-maximized="0"> <inkscape:grid id="GridFromPre046Settings" type="xygrid" originx="0px" originy="0px" spacingx="1px" spacingy="1px" color="#3f3fff" empcolor="#3f3fff" opacity="1.0000000" empopacity="1.0000000" empspacing="5" visible="true" enabled="true" snapvisiblegridlinesonly="true" /> </sodipodi:namedview> <metadata id="metadata7168"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> </cc:Work> </rdf:RDF> </metadata> <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" transform="translate(0,48)"> <g id="g5114" transform="matrix(3.6029398,0,0,3.400543,0.36001876,-43.177329)"> <path style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.48575303;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" d="M 6.1798534,1.0573299 C 5.0141243,0.99673022 4.2895164,1.7840048 4.5668343,2.7286013 5.2308964,4.5646865 7.6934008,4.8480274 8.879635,3.9863485 c 0,3.9000804 -0.3928676,7.8451175 -0.3928676,11.7451985 0.9727608,0.02685 0.9829249,0.04966 1.1466624,-0.754613 C 9.8010183,12.729655 11.131473,12.715028 12.174375,11.503639 13.027983,10.51549 13.723642,8.6636809 12.85172,7.4969664 12.429953,6.9326025 11.290195,5.281491 11.393597,5.5231395 c 0.461358,0.9920821 1.520618,2.7726382 1.241082,3.8974712 -0.35437,1.3489113 -1.644544,2.2098273 -2.9673493,2.4194113 -0.3380747,0.05118 -0.1529459,-0.05205 -0.1865746,-0.613626 0,-2.7877165 0,-5.2983777 0,-8.0860965 C 9.037773,2.0020309 7.3838694,1.0202791 6.1798534,1.0573299 z m 0.4398794,0.060979 C 7.7397822,1.0637596 8.990187,2.2003597 8.849463,3.4249919 8.5590767,4.5084177 7.0138286,4.2199527 6.2621211,3.6887805 5.4266258,3.2837657 4.6752007,1.8548689 5.6866184,1.2917715 5.8802378,1.1849157 6.1333655,1.1317278 6.6197328,1.1183093 z" id="path5094" sodipodi:nodetypes="ccccccsccccccccccc" inkscape:connector-curvature="0" /> <path sodipodi:nodetypes="ccccccsccccccccccc" id="path7097" d="M 5.7731025,0.24514103 C 4.6073734,0.18454132 3.8676444,1.5940457 4.6049796,2.5134553 5.3363552,3.664692 7.0866499,4.3691719 8.2728841,3.507493 c 0,3.9000803 0.01599,8.288006 0.01599,12.188087 0.7062515,0.194054 0.3803181,-1.08504 0.5464968,-1.533432 0.3310208,-1.693166 1.9508431,-2.573594 2.9937451,-3.784983 0.853608,-0.988149 0.966553,-2.4982017 0.21844,-3.5923875 C 11.835657,6.4748534 11.150111,5.2026355 11.253513,5.444284 11.714871,6.4363661 12.307464,7.5502555 12.027928,8.6750885 11.673558,10.024 10.383384,10.884916 9.0605786,11.0945 8.7225041,11.14568 8.7442001,11.04245 8.7105714,10.480874 c 0,-2.7877167 0,-5.5754342 0,-8.363153 C 8.2675893,0.97945235 6.9771185,0.20809023 5.7731025,0.24514103 z M 5.9129819,0.60612042 C 7.0330313,0.55157074 8.3834361,1.4548375 8.2427121,2.6794697 7.9523258,3.7628955 6.4724508,3.6822227 5.7207433,3.1510505 4.885248,2.7460357 4.2684498,1.34268 5.2798675,0.77958257 5.4734869,0.67272679 5.6932813,0.61953887 5.9129819,0.60612042 z" style="fill:url(#linearGradient5118);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient5120);stroke-width:0.48575303;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0" /> </g> </g> </svg> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/scalable/apps/exfalso-symbolic.svg.in����������������������0000644�0001750�0001750�00000006053�13112005742�027754� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="128" height="128" id="svg7149" sodipodi:version="0.32" inkscape:version="0.92.1 r15371" sodipodi:docname="exfalso-symbolic-test.svg" inkscape:export-filename="/home/bene/Desktop/exfalso.png" inkscape:export-xdpi="90.000000" inkscape:export-ydpi="90.000000" version="1.1"> <defs id="defs7151" /> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:zoom="0.70710678" inkscape:cx="-399.01231" inkscape:cy="68.552509" inkscape:current-layer="layer1" showgrid="true" inkscape:document-units="px" inkscape:grid-bbox="true" inkscape:window-width="1366" inkscape:window-height="674" inkscape:window-x="0" inkscape:window-y="26" inkscape:window-maximized="1" /> <metadata id="metadata7154"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title></dc:title> </cc:Work> </rdf:RDF> </metadata> <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" transform="translate(0,64)"> <path sodipodi:nodetypes="cscscscscscscscsc" id="path2106" d="m 6.451724,-57.548276 c 14.135986,14.889032 8.001822,24.413788 15.757918,41.95009 C 29.407292,0.67551999 45.07519,-11.505442 55.801648,2.3986296e-5 45.075238,11.505396 29.353978,-0.72873801 22.156376,15.544964 14.400326,33.081314 20.587666,42.659244 6.451724,57.548276 21.340758,43.41229 30.918688,49.599676 48.455038,41.843626 64.728788,34.645976 52.547782,18.978078 64.053292,8.251622 75.47683,18.97929 63.344302,34.70799 79.598234,41.896846 97.138442,49.654664 106.65599,43.409174 121.54828,57.548276 107.40922,42.655988 113.65462,33.138396 105.89685,15.598234 98.707992,-0.65569801 83.032512,11.42361 72.304844,2.3986296e-5 83.032512,-11.423608 98.707992,0.65570199 105.89685,-15.598186 c 7.75781,-17.54021 1.51232,-27.057802 15.65143,-41.95009 -14.89234,14.139056 -24.409884,7.89366 -41.950046,15.65143 -16.253932,7.188856 -4.121404,22.917604 -15.544942,33.645272 -11.505464,-10.726504 0.675496,-26.394402 -15.598254,-33.592052 -17.53635,-7.756048 -27.11428,-1.568664 -42.003314,-15.70465 z" style="fill:none;fill-opacity:0;fill-rule:evenodd;stroke:#bebebe;stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" inkscape:connector-curvature="0" /> </g> </svg> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/scalable/apps/quodlibet-symbolic.svg.in��������������������0000644�0001750�0001750�00000011570�13112005742�030303� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="128" height="128" id="svg7163" sodipodi:version="0.32" inkscape:version="0.92.1 r15371" sodipodi:docname="quodlibet-symbolic.svg" inkscape:export-filename="/home/lazka/Desktop/afaf.png" inkscape:export-xdpi="90.000000" inkscape:export-ydpi="90.000000" version="1.1"> <defs id="defs7165" /> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#555555" borderopacity="1.0000000" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:zoom="1.2761068" inkscape:cx="-150.56778" inkscape:cy="-17.533706" inkscape:current-layer="g4136" showgrid="false" inkscape:document-units="px" inkscape:grid-bbox="true" inkscape:window-width="1366" inkscape:window-height="674" inkscape:window-x="0" inkscape:window-y="26" showborder="true" inkscape:showpageshadow="true" borderlayer="false" inkscape:window-maximized="1"> <inkscape:grid id="GridFromPre046Settings" type="xygrid" originx="0px" originy="0px" spacingx="1px" spacingy="1px" color="#3f3fff" empcolor="#3f3fff" opacity="1.0000000" empopacity="1.0000000" empspacing="5" visible="true" enabled="true" snapvisiblegridlinesonly="true" /> </sodipodi:namedview> <metadata id="metadata7168"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title></dc:title> </cc:Work> </rdf:RDF> </metadata> <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" transform="translate(0,112)"> <g id="g4136" transform="matrix(2,0,0,2,0.3918161,-16)"> <path sodipodi:nodetypes="ccccccsccccccccccc" id="path7097" d="m 22.232567,-42.287138 c -4.200052,-0.206072 -6.865251,4.587008 -4.208676,7.7135 2.635102,3.91483 8.941307,6.310444 13.215238,3.380268 0,13.262391 0.05761,28.1837215 0.05761,41.446114 2.544581,0.659889 1.370263,-3.6897246 1.968995,-5.2145009 1.192648,-5.75768364 7.02877,-8.751617 10.786283,-12.8709974 3.075498,-3.3602437 3.482433,-8.4952437 0.787026,-12.2160687 -0.763459,-1.053911 -3.23344,-5.380142 -2.860889,-4.558406 1.662245,3.373618 3.797322,7.161446 2.790171,10.986489 -1.276774,4.5870329 -5.925193,7.5146148 -10.691181,8.2273142 -1.218062,0.1740398 -1.139893,-0.1769982 -1.261055,-2.0866616 0,-9.4797516 0,-18.9595046 0,-28.4392626 -1.596038,-3.870731 -6.245527,-6.493781 -10.583523,-6.367788 z m 0.503977,1.227526 c 4.03547,-0.185499 8.900897,2.886098 8.393877,7.050513 -1.046244,3.684236 -6.378145,3.409905 -9.086501,1.603631 -3.010239,-1.377271 -5.232526,-6.149442 -1.588449,-8.064279 0.697599,-0.363368 1.489505,-0.544235 2.281073,-0.589865 z" style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bebebe;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" inkscape:connector-curvature="0" /> <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="rect4184" d="m 30.80347,-5.5089947 c 0.0043,3.0224201 -0.07786,7.222765 -0.06276,10.244913 2.194066,2.521438 8.08892,-10.161605 11.000385,-10.174313 5.129801,-5.2110753 -5.572111,0.262595 -10.937621,-0.0706 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> </g> </g> </svg> ����������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/scalable/apps/quodlibet-symbolic.svg�����������������������0000644�0001750�0001750�00000014505�13112005742�027677� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="128" height="128" id="svg7163" sodipodi:version="0.32" inkscape:version="0.92.1 r15371" sodipodi:docname="_temp.svg" inkscape:export-filename="/home/lazka/Desktop/afaf.png" inkscape:export-xdpi="90.000000" inkscape:export-ydpi="90.000000" version="1.1"> <defs id="defs7165" /> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#555555" borderopacity="1.0000000" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:zoom="1.2761068" inkscape:cx="-149.00051" inkscape:cy="-26.937308" inkscape:current-layer="g4136" showgrid="false" inkscape:document-units="px" inkscape:grid-bbox="true" inkscape:window-width="1366" inkscape:window-height="674" inkscape:window-x="0" inkscape:window-y="26" showborder="true" inkscape:showpageshadow="true" borderlayer="false" inkscape:window-maximized="1"> <inkscape:grid id="GridFromPre046Settings" type="xygrid" originx="0px" originy="0px" spacingx="1px" spacingy="1px" color="#3f3fff" empcolor="#3f3fff" opacity="1.0000000" empopacity="1.0000000" empspacing="5" visible="true" enabled="true" snapvisiblegridlinesonly="true" /> </sodipodi:namedview> <metadata id="metadata7168"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title /> </cc:Work> </rdf:RDF> </metadata> <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" transform="translate(0,112)"> <g id="g4136" transform="matrix(2,0,0,2,0.3918161,-16)"> <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M 43.935547 8.9316406 C 39.22569 9.0799734 35.314853 11.797896 33.314453 15.4375 C 31.188923 19.304766 31.228467 24.440222 34.462891 28.347656 C 37.487823 32.777396 42.330351 36.171917 47.716797 37.765625 C 51.800575 38.973909 56.274337 39.118304 60.373047 37.660156 C 60.383247 63.189272 60.486328 91.280996 60.486328 116.50391 A 2.50025 2.50025 0 0 0 62.357422 118.92578 C 64.230468 119.41152 66.50835 118.77314 67.572266 117.37109 C 68.63618 115.96905 68.789719 114.51569 68.904297 113.13672 C 69.018877 111.75775 68.991478 110.38676 69.017578 109.23438 C 69.043698 108.08199 69.201997 107.11939 69.251953 106.99219 A 2.50025 2.50025 0 0 0 69.373047 106.58203 C 70.418871 101.53317 73.513172 97.603356 77.513672 93.785156 C 81.514172 89.966957 86.353213 86.392236 90.341797 82.019531 C 97.273003 74.444284 98.197063 62.860008 92.095703 54.4375 C 91.534239 53.66243 89.833917 50.872248 88.501953 48.652344 C 87.835969 47.542392 87.241042 46.551293 86.833984 45.898438 C 86.630456 45.572007 86.576776 45.440134 86.271484 45.058594 C 86.195164 44.963214 86.369765 44.899054 85.529297 44.414062 C 85.424237 44.353442 85.100401 44.21903 85.099609 44.21875 C 85.098815 44.218474 84.303378 44.078125 84.302734 44.078125 C 84.30209 44.078119 83.096197 44.374736 83.095703 44.375 C 83.095211 44.375264 82.166358 45.237743 82.166016 45.238281 C 82.165674 45.238817 81.838081 46.010907 81.837891 46.011719 C 81.837701 46.012531 81.779631 46.374176 81.775391 46.5 C 81.766991 46.751646 81.788581 46.894498 81.806641 47.003906 C 81.951761 47.879168 82.00362 47.664982 82.072266 47.816406 A 2.50025 2.50025 0 0 0 82.107422 47.890625 C 85.477794 54.730981 89.194112 61.699611 87.509766 68.113281 C 85.332238 75.884489 77.234256 81.184772 68.642578 82.617188 C 68.605918 82.227157 68.605831 82.126991 68.525391 80.9375 L 68.525391 24.160156 A 2.50025 2.50025 0 0 0 68.337891 23.207031 C 64.658669 14.284133 54.590432 8.698318 44.888672 8.9375 C 44.567916 8.9240673 44.249537 8.9217518 43.935547 8.9316406 z M 45.990234 16.378906 C 49.345108 16.227866 53.332111 17.504784 56.150391 19.65625 C 58.903829 21.758216 60.411909 24.424692 60.130859 27.46875 C 59.345307 29.898752 57.45686 30.94998 54.583984 31.214844 C 51.623532 31.487782 47.996067 30.527877 45.869141 29.109375 A 2.50025 2.50025 0 0 0 45.521484 28.914062 C 43.292974 27.894457 41.020124 25.246088 40.298828 22.816406 C 39.93818 21.601566 39.935004 20.509297 40.240234 19.632812 C 40.544952 18.75782 41.116939 17.986196 42.462891 17.277344 C 42.465091 17.276136 42.464405 17.274838 42.466797 17.273438 C 43.469191 16.752908 44.701102 16.455686 45.990234 16.378906 z M 43.091797 33.269531 C 43.157137 33.313111 43.248235 33.324447 43.314453 33.367188 C 43.361853 33.389547 43.391793 33.439138 43.439453 33.460938 L 43.091797 33.269531 z " transform="matrix(0.5,0,0,0.5,-0.19590805,-48)" id="path7097" /> </g> </g> </svg> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/scalable/apps/exfalso-symbolic.svg�������������������������0000644�0001750�0001750�00000020313�13112005742�027342� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="128" height="128" id="svg7149" sodipodi:version="0.32" inkscape:version="0.92.1 r15371" sodipodi:docname="_temp.svg" inkscape:export-filename="/home/bene/Desktop/exfalso.png" inkscape:export-xdpi="90.000000" inkscape:export-ydpi="90.000000" version="1.1"> <defs id="defs7151" /> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:zoom="0.70710678" inkscape:cx="-396.18388" inkscape:cy="51.581946" inkscape:current-layer="layer1" showgrid="true" inkscape:document-units="px" inkscape:grid-bbox="true" inkscape:window-width="1366" inkscape:window-height="674" inkscape:window-x="0" inkscape:window-y="26" inkscape:window-maximized="1" /> <metadata id="metadata7154"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title /> </cc:Work> </rdf:RDF> </metadata> <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" transform="translate(0,64)"> <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M 121.66797 1.4648438 A 5.0005 5.0005 0 0 0 118.10547 2.8261719 C 111.31159 9.2763989 106.67817 10.65355 100.66797 11.751953 C 94.657767 12.850356 87.106134 13.31628 77.576172 17.53125 C 72.685418 19.694353 69.279158 22.98525 67.447266 26.648438 C 65.615374 30.311625 65.250422 33.99794 65.025391 37.253906 C 64.782169 40.773062 64.67956 43.64986 64.03125 46.197266 C 63.376794 43.658497 63.274847 40.794629 63.03125 37.283203 C 62.805987 34.03606 62.443967 30.355103 60.611328 26.695312 C 58.77869 23.035523 55.369719 19.748158 50.476562 17.583984 C 40.950616 13.37081 33.392724 12.89107 27.367188 11.779297 C 21.34165 10.667524 16.68664 9.2747539 9.8945312 2.8261719 A 5.0005 5.0005 0 0 0 2.8261719 9.8945312 C 9.2789573 16.691067 10.684677 21.341988 11.808594 27.353516 C 12.932511 33.365043 13.425984 40.903483 17.636719 50.423828 C 19.800894 55.316975 23.088258 58.724011 26.748047 60.556641 C 30.407836 62.389271 34.088799 62.751303 37.335938 62.976562 C 40.870775 63.221781 43.747884 63.329017 46.298828 63.996094 C 43.745254 64.658468 40.861514 64.7586 37.320312 64.996094 C 34.067065 65.214275 30.380626 65.566319 26.712891 67.392578 C 23.045155 69.218837 19.749478 72.627278 17.583984 77.523438 C 13.370811 87.04938 12.891076 94.607272 11.779297 100.63281 C 10.667518 106.65835 9.2747338 111.31336 2.8261719 118.10547 A 5.0005 5.0005 0 0 0 9.8945312 125.17383 C 16.68664 118.72525 21.34165 117.33248 27.367188 116.2207 C 33.392724 115.10893 40.950616 114.62919 50.476562 110.41602 C 55.36972 108.25184 58.778694 104.96448 60.611328 101.30469 C 62.443963 97.644897 62.804037 93.963936 63.029297 90.716797 C 63.27289 87.205376 63.376794 84.34149 64.03125 81.802734 C 64.67956 84.350135 64.782169 87.226944 65.025391 90.746094 C 65.250422 94.002055 65.615373 97.68838 67.447266 101.35156 C 69.279159 105.01475 72.685419 108.30565 77.576172 110.46875 C 87.106162 114.68375 94.657768 115.14965 100.66797 116.24805 C 106.67817 117.34644 111.31162 118.72359 118.10547 125.17383 A 5.0005 5.0005 0 0 0 125.17383 118.10547 C 118.7236 111.31162 117.34645 106.67817 116.24805 100.66797 C 115.14964 94.657763 114.68372 87.106136 110.46875 77.576172 C 108.30698 72.68843 105.02633 69.281611 101.37109 67.443359 C 97.71586 65.605108 94.033069 65.23212 90.783203 65 C 87.288061 64.750362 84.426135 64.643669 81.890625 64 C 84.426133 63.356326 87.288065 63.249638 90.783203 63 C 94.033066 62.76788 97.715861 62.394884 101.37109 60.556641 C 105.02633 58.718397 108.30698 55.311561 110.46875 50.423828 C 114.68374 40.893836 115.14966 33.342242 116.24805 27.332031 C 117.34644 21.32182 118.72358 16.688376 125.17383 9.8945312 A 5.0005 5.0005 0 0 0 121.66797 1.4648438 z M 107.63086 20.369141 C 107.11021 22.131312 106.71705 23.855898 106.41016 25.535156 C 105.15706 32.391866 104.86704 38.368689 101.32422 46.378906 C 99.891562 49.618117 98.517975 50.797766 96.876953 51.623047 C 95.235932 52.448328 92.980838 52.817648 90.072266 53.025391 C 84.255121 53.440877 75.457928 53.339344 68.660156 60.578125 A 5.0005 5.0005 0 0 0 68.660156 67.421875 C 75.457933 74.660633 84.255127 74.559124 90.072266 74.974609 C 92.980835 75.182352 95.235932 75.551669 96.876953 76.376953 C 98.517974 77.202237 99.89156 78.38187 101.32422 81.621094 C 104.86702 89.631292 105.15705 95.608141 106.41016 102.46484 C 106.71705 104.1441 107.11021 105.86869 107.63086 107.63086 C 105.86869 107.11021 104.1441 106.71705 102.46484 106.41016 C 95.608149 105.15706 89.631312 104.86704 81.621094 101.32422 C 78.38488 99.892893 77.212287 98.52196 76.390625 96.878906 C 75.568963 95.235853 75.203473 92.97242 75.001953 90.056641 C 74.598913 84.225082 74.721129 75.410682 67.476562 68.607422 A 5.0005 5.0005 0 0 0 60.644531 68.59375 C 53.359899 75.385129 53.45848 84.204693 53.054688 90.025391 C 52.85279 92.93574 52.489888 95.190644 51.669922 96.828125 C 50.849956 98.465606 49.675359 99.836834 46.431641 101.27148 C 38.421237 104.81436 32.422508 105.11918 25.552734 106.38672 C 23.872159 106.6968 22.147303 107.09243 20.384766 107.61523 C 20.90757 105.8527 21.303197 104.12784 21.613281 102.44727 C 22.88083 95.577495 23.185639 89.578766 26.728516 81.568359 C 28.161823 78.327667 29.530395 77.160112 31.169922 76.34375 C 32.809449 75.527388 35.072666 75.168325 37.990234 74.972656 C 43.82537 74.581318 52.662173 74.700559 59.458984 67.410156 A 5.0005 5.0005 0 0 0 59.458984 60.589844 C 52.667601 53.305236 43.849995 53.405745 38.029297 53.001953 C 35.118948 52.800057 32.862092 52.4352 31.224609 51.615234 C 29.587127 50.795269 28.217852 49.622612 26.783203 46.378906 C 23.237841 38.362949 22.920693 32.372809 21.638672 25.515625 C 21.32696 23.848361 20.927467 22.136264 20.40625 20.388672 C 22.161229 20.908235 23.879058 21.304471 25.552734 21.613281 C 32.422508 22.880825 38.421237 23.185642 46.431641 26.728516 C 49.675359 28.163167 50.849952 29.534391 51.669922 31.171875 C 52.489891 32.809359 52.852789 35.064259 53.054688 37.974609 C 53.458484 43.79531 53.359931 52.614843 60.644531 59.40625 A 5.0005 5.0005 0 0 0 67.476562 59.392578 C 74.721132 52.589315 74.598912 43.774931 75.001953 37.943359 C 75.203473 35.027574 75.568962 32.764152 76.390625 31.121094 C 77.212288 29.478036 78.384882 28.107106 81.621094 26.675781 C 89.631293 23.132981 95.608151 22.842949 102.46484 21.589844 C 104.1441 21.282949 105.86869 20.889789 107.63086 20.369141 z " transform="translate(0,-64)" id="path2106" /> </g> </svg> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/32x32/�����������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021410� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/32x32/status/����������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022733� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/32x32/status/quodlibet-missing-cover.png�������������������0000644�0001750�0001750�00000004277�13112005742�030230� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��� ��� ���szz���sBIT|d��� pHYs�� �� Ǡ���tEXtSoftware�www.inkscape.org<���tEXtTitle�Missing Album Cover Art{��IDATXŕ[]k}9{3D'3bcT$j4q)CPB k`Ňҧ B)bA*X}KM2d3/kgft {>c)^x!jW$)d\)Qdie/ Zۊs: � ztcp}V@ȳ&'ϱ0@f 1;/2sͳkUT.F}&<qS'O>㌎\GQfyNZM{OF<aDowi!�Z;v?:tUQ[HD)P[XpSZKWW(nV21tOnQjΝ;ᮻ˼{\GLl)'ȱeIDaֆw^MVh""eN+ka9GFEcusM7266?^;Za%ow@dYOYX& V)f=�qPvEQ'2n@wE; �9)mA}N$IBPei^0 "hZA`^PJaaeu ={'ۗE\Z)Ru Ekc&@(FkRzH !!(4Q%zǙSEvv�-j9<3+uiJ$x/Vo>:]ocee 4g^PA+�$*MRv(K|L:oARe9yu�޻A FS8cE 9i[hT*axIOOQ%Q཰ZhՍA/x Rp*qon,ͦZc!(Y߉ҴLVx<:li/E�"ϊT+h4XkxK&"޽0yZnft 8Ȩ7hWy +++j54 egFGFEse^:Ff%Jz-hEJ)8:/Sq,:{q9Keޯ` yٹ9$FD-_@fg(ӛ ,(#b^cumg'誦J]1`n1F$ a219Ϳs�=m,|rE�AM;A $IBwޡjqE%+z!y|OZqZ�7C8WH_cvnkGGRZKXe!C6Q/^ \{GN>scZQQS3&wRq+c ^[m0+fCyG:’_^Y>`X6�Rpn ø<fggg,e#8Mcˡs.QJ)Z;c ,Aq8s˶z�)�pٟ�GHu}o KOEaZE(PbZkoqA0 lVY]^}'*/>c=3]wiwպs1kgjEQh8.+JiΉFpC\+lE <`#IV@e'q*R84M A1Ա{- EQT{ﶽߏoH&heq(w0^TWaAs8|ȡ`+H o~z衧$v``Ф$Ջ|߫<:$JGQ9u>S]o=}7/Ye|4MZ gȧUM*Jџw^II_N.\zK@i+LчwyRޡhTګ?.O`4;G\zm.|'Эhۢއj����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/32x32/apps/������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022353� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/32x32/apps/quodlibet.png�����������������������������������0000644�0001750�0001750�00000001774�13112005742�025064� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��� ��� ���szz���sBIT|d��� pHYs��b��b8z���tEXtSoftware�www.inkscape.org<��yIDATX_L[U?rAf0ΨѠf%σRc2‹ò`|e/bKӘ(:861ʬW |}0RfA'GVp-q`!nO9lP`WvyБRBsT'hW綋ߎ ɩڟ^{q+Dy >&"n6=QˬqM`kmBWӳϛO<9ٰ(P=@R^z3sI3И>ov*I\=iM?r"P15u"$y}#HT�Z)*`qd] 'W^VƟ&'.u\pɫ7mz*KM(؄+@7DdOP9 n�$I Yk<xI]�lP9�p¹/⫯_sp<uXoOVxff(5l6� #dd~nvΦA�\hH�TN;@]7�p�ek|Z[Vpb<UaQؓH�w sY7њɉ 5T֘'Crf<r�L5 %X.lֵ4uu\׮ZkM,ZW@:,fVC~*pHji7V�`<@eq``$$O\jq�0 # i!H^|iD"r$处m[:::�7(@qEJ�hjji]m?0G3K$7S[C����IENDB`����quodlibet-3.9.1/quodlibet/images/hicolor/32x32/apps/exfalso.png�������������������������������������0000644�0001750�0001750�00000003353�13112005742�024530� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��� ��� ���szz���sBIT|d��� pHYs��b��b8z���tEXtSoftware�www.inkscape.org<��hIDATXVmpT~{wIdC,! j&h!DRNk3S~tG(δ| (J(VK*B n)6ɽݛܻvܙs*nl*o_egU��KiR 6xu)΂w|u rq7~) gE|'HOq-bs3ɻv=Ot;~x_?u$ WGeEt8Юsmf]4M] .uk{;EDX^c@! ѴF~CdKC{Tt+2*N{Z7m8 "3T> DTN&흃ZSɿ<ԡ=P]CG-IEVVMu\<UPH<rwϪ$�M:@5^A.B-Ҍ�Ó "nȊ#nZ H|OvV�EIFFF@-�(Aez60/�^yAWf86�q+|J{˲P�螓@',Ɍ)ƍHfK{hqN�87�'SSz5F˧VVo:%TN#2lhl1^0kZF#TOK@qoUgeS1f+L�dZ둈!ƕ^y@", X lobȳ�voJ`}�?pK^<_v_xvU)}h�5�fp[PZq_zCT|' <IsYצ*3Af 4De oߖb:ܰ�~|۶Y9n:եDwf؏g /H3gd9MP' |�P̀ض\cm $Dl!isܫ QTM͍aC'i[V_.my UjOWPF:DR0<Lh*޻<Xpf(LJ HOKmqI5\i8r7$W2C�p�SO*y (7 0I,#|�0�4~VfP1?�EW 5Iwc}[m�@Ftgepp�htv&09D-U{6^")vl/o8?CCC<J\L߉̾uIJYFnN6 rsņ:4N$$'E7H۶{豶7έ3 $6oD䰯Y+?>t>yQ':Ƀ$F1fZ$d3_<Dܷd],.YNVdg,-)z G�ɭ$qE$8QSS38S\VHV~RӧOdaŧH,/H,KX����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/48x48/�����������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�021426� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/48x48/status/����������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022751� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/48x48/status/quodlibet-missing-cover.png�������������������0000644�0001750�0001750�00000007703�13112005742�030243� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���0���0���W���sBIT|d��� pHYs����+���tEXtSoftware�www.inkscape.org<���tEXtTitle�Missing Album Cover Art{��IDAThݙ$Ys؝=bV`b 1Ȑ.!K "Y1I@Q~@D@ FsHAa8V+z\=3}TwCuϱ5"Nzzz<qZE _|_("E8{<^9_w_c%0nZw9v]/f.~w߾+$1HZE^ayynP) g^CH)RBk=\zkzh?1rS!!#Ͼp"d|]��oz=396{5[-E 4!{*'OSgY]Yf=<4Mj4Mzz=X\< F(ڨWܷ2|Otm)FcJZn,Q%%rPwBHj !Ħ51cZ9˜8qsqvVV�(T\N�’u>1D$A) YZ!3.^,r$"k,ctֆJZQoB{֚r6_z-..p`�|xX!b)�i's4uj(,^%+zxё)BDiRi4FijCq]w1|˳s7I�1DpcXrG<)k@"hԩUT5.p4#Q.YΑ& "X]deִFZؿGy$IOqi o?1zބ >~C�er1dYk ,':1&V8HN!F&rJ)|l](IJR!/2q9󵧿SgxÁH!>",D�}+A�ɲ =>D֤*F</@dbJLž={ڇ+d g-J$Mx"<'_~.#{m^�OVV:=c$r\a,ϑRPT>T~Xm�H)ZBJ[H֚}?}k,/Qd9Nx|piB 1 Ξ#@*SO=tm1ɋ^=zc!znc(H)�!LF<f 1*F#`n 3|SIS5h�OlVn#cjuw!Me#ĘaH,[DtQ-gh�އ</1b"FHtP.(Y6W^36СT*U<R7oT 2Gb%%>DbrS�X>΋ ^ZlSn7bC3gNs9:>J+.SOz+[lPù(pCPJJhzܵjw1YEV "ƈVJ%ݴpvp,/H Yqx(C(Ho=y\xPRRXbEVHܜeZ}x 1bT9j->Xk1FBDHQ:"!x)x1"9�!(J(6gal9eɈ�B&x,U@!>uЮ%B<YØ핦lrM.~w LT" {!C(읋�Z2v7->Z< ?Nbffi49|fIgs)=@a7}�h%ɳ^}f[9}z1֝bzz0X!1Be[WecG^EI >jbW Dڰ0??쵫( ,#فs% <?z=[D)\-Y3;7O^!(^76n R@9B Fu {]Z#ɽ54?} ϋLҭ"@h4NuRZ] pȑ )Z4MY_ŋeȰB\"`%s<ZCbS!p~OYZ^VMQJ�x /,gp@ŋOrZ^u&'Ze{�|L,Gi1NZˑ#GxJByyJ bhEp.|C�D^$(rt;vZnox7{^*ssט, G5@B8B 6$&!Hk5fX_'2q>T46[JIe,,^˼!�$�傿r,OPIC 1fN73/̳z?Z-`*Cჱ~Oݦ30:RZA˧ex `ح][k!@Jzӝp8T EXi^Ø$I0K)EQ9jZ3y!3^xq;@ n|?bvni1MS_}n]r#B"sΜ9Jk4J)-cpyC&M1x*DD #̕ř)] 0v� /?p߽uѻT'lZԪU)%o{UA !x&F^$& !2(hvh[$}Bctus-+\| q~GwTVkLLOF|vkk1n^=!DBD)e(+%R+ec}qo[]G^\_ P@TU}Ǐ31>6ƅ\e8}c B9PTR) BF)Kk7xM8u/}#�B }я{cf!Yo;?%/>Ii:cq).BDAι䥗}"єa|=ypRD.Ͳ섳c'q$Kt1O}?,$trr?w?RJk51g RXwrZc!"(K?l CjH?~G+$bj>c|g8ܾ(WUFPQ"}W.]d5~CZPJ{E1B?֞>V(DfwڋfFsb(s$a+O?}cpTXkL왘-+'#h6ڷ._~G0E!H$I<|ǝ}DJ5922OM_u^,V38l]=~�eS鷾Ir{%M:IY:B1/l_8PM^wsF�څF÷nXRF}`ɉ_xg^?rDʹ%s//~[F߸I"g"?QJglMZ! {Ň))ϋ?|ӟn1~~<o15����IENDB`�������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/48x48/apps/������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�022371� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/48x48/apps/quodlibet.png�����������������������������������0000644�0001750�0001750�00000003041�13112005742�025067� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���0���0���W���sBIT|d��� pHYs�� �� ����tEXtSoftware�www.inkscape.org<��IDAThilTUδ3 E-ZSl#RW0\bAA1jE  [.*k q[QH+m%B[:^ CFw:j“d2{spSŠ+o2-a7<|$ M]RN#pIbܐF{!�.z=bP<+� ]OL G0�WzPF�X|mCwκ,�?c뺏YJWV~~-9R1u^e}@e3Ztߜ%�i.9: [\H@ �"ID"櫯TY>-bpڒ^zIltnAw}*J"EH^`+:z" <9y" $5֓ =4w#3J"}Cϼړ Lr.˒E)c�ԋ\�DZs}g^TήD; G` fҔA5Ϙ^!\ "]E. ٵW!(�UU@HaQ'ՀF!m~KI4@G'c4ci%,>!˜B�%�.+0@с65YCNu"�a6^7/!YH}z<I5ɾ%,o'?-TP &;}kos{VDǹJ Q>|$oVƑ�{^&f|mmƖDm߹ 7m}de6ZΕ&KHf?i󇆆6q&@0f`�~ 0v nvv&g![Kb�p78'8CߴH9Z% TD<.�<�&QJ `ƅ �cK/6F ɳRb˓c@oچ\ j"< `XBPdLmYr%r?#/D"z$�̣"� � �v 4Op $OX7��EɬߍlPDI`R GH 7ܠkV p"'[H8`Q0 %P! Ü_WeɆ $p TH0D0@0ĆaH֏ῐ2ԔnܐO>�[ZZRc$HNm|L`+VHЩ7u9#e> qԩTԝ_KGvޝh~|>qQVWWCD� \xpD�z|BoD$ `Y, 3f̈PsCmmmMsswm?8E~ -S|����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/hicolor/48x48/apps/exfalso.png�������������������������������������0000644�0001750�0001750�00000005331�13112005742�024544� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���0���0���W���sBIT|d��� pHYs�� �� ����tEXtSoftware�www.inkscape.org<�� VIDAThyl\wf,,^xcYdk!P hE؊!em! "TҊR5-Adl, @H(Il'b{x<3o #Yޝsw}MlʙVH6aܚ%Ǟ?qe|[\q_ t =Ʒc/H J KᲶlm _ղC_t+_X/ >~�xXn|]=Kƍ9ceִe;%3U{|: Tʐ^l;[%Ƙ}P#!j)Ck]Ӵe[H%5cEȆ@%0~MϯW>:ncJ,�UK/y]vOAb,lb0OozbS^,ѭNhV Xy\�ۀEܼ*v)8% h Yݠ{Zq8'=?nUl>@R�6@ x* ҺPⱵF:p`X$Cvv1}Υ+_zi' Ir^DQ(E �Ϥt%5VӝKBr,{dAw<_8}N:y,݄lQI�vT4cF$�lKœpwݦote;o\waU(At"Y :aM�{ݹ㦖1mdgmJ_-& ˶zùSۃjI0guRM�}}YֆK-Jt#GgWW8 pv{ K+فk|9c)@;RBo1Ύ#+h?n:>S-Ll 9scLCs P]jU]]= X.6�4�qyث(} �?M0&[nYLe%/o]=LMNI-�T >i]ͩRN[8`7 �7Hڙ}M-lfW]hdjvIY CAx<Ƙ+�\n@k{؛X#-(/UVno(L ܟT\?>x->`1q�X;_ٴ}[vG^~y4& `srr䐛ϧ[iSkZc~;QH`ҥ@MOn~{u`oS30YJE Hey9˖,b)'S^:P`T'1UE TD,~sw<br㾦ČRQ#? %] Ƙ]zɌ1:/<:# 2X,3q<+ y<b.@F48 $iWsu\fǘh=Ҽ󸈌ē{w  Z\P*T�~Yubg"1qPǁ;cJK\7.jȔr<CiDFf9hc<%mY.&y(b( x{Y BA;>ʒh8 =p}j$|#HܟK 9N)h>x,և4c 7~Fsss (}213rzX(fUgWdR0x7l|E O>ƗcS�FM"tr==<̟J_;E5#8D?�-Ƙp :sdaOc#Xl$1ko&eGfDɭr90 +N4keuwVvDc"`H=~v"7KA(޳Kh\.gHwW׭.s9d47Yvd TGa$6mp/ÈXp]ejZ omk(qᄚNSژX\-? t=zےo.҅/ա:a"`ʨLUe ܣxzT ᚫ^7agvFSQ~D"455�X] X[ Q: 7Yˊ+/ʺRpmϩqkk7u3W\3sAg&B Q]Uɍ 'xoh4zk7.ٳֶ6"RZ"%Kkc@Qm}ƷI 1@OQ(DaA98eLZ|k%WH6I�b vUp6"]]n_iiֽl{MRqt}cዯqճj>pPk͒twCH%m[RxzwO .Tm4jr+!MRjzWq<>Vo$}WR>͍P$=!i]ssse ^׵'̬.vhBմ $.Wے4v&iV^Ieeݸqc/@OmREmY%ߊ$φ V<製fMJ"iWo&i�Π//4p����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/images/Makefile�����������������������������������������������������������0000644�0001750�0001750�00000010115�13112005742�020630� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������THEME=hicolor QL_SOURCE=$(THEME)/scalable/apps/quodlibet.svg QL_DEST=quodlibet.png EF_SOURCE=$(THEME)/scalable/apps/exfalso.svg EF_DEST=exfalso.png QL_MC_SOURCE=$(THEME)/scalable/status/quodlibet-missing-cover.svg QL_MC_DEST=quodlibet-missing-cover.png PNG16_APPS_DIR=$(THEME)/16x16/apps PNG16_STATUS_DIR=$(THEME)/16x16/status PNG16_QL_DEST=$(PNG16_APPS_DIR)/$(QL_DEST) PNG16_EF_DEST=$(PNG16_APPS_DIR)/$(EF_DEST) PNG16_MC_DEST=$(PNG16_STATUS_DIR)/$(QL_MC_DEST) PNG24_APPS_DIR=$(THEME)/24x24/apps PNG24_STATUS_DIR=$(THEME)/24x24/status PNG24_QL_DEST=$(PNG24_APPS_DIR)/$(QL_DEST) PNG24_EF_DEST=$(PNG24_APPS_DIR)/$(EF_DEST) PNG24_MC_DEST=$(PNG24_STATUS_DIR)/$(QL_MC_DEST) PNG32_APPS_DIR=$(THEME)/32x32/apps PNG32_STATUS_DIR=$(THEME)/32x32/status PNG32_QL_DEST=$(PNG32_APPS_DIR)/$(QL_DEST) PNG32_EF_DEST=$(PNG32_APPS_DIR)/$(EF_DEST) PNG32_MC_DEST=$(PNG32_STATUS_DIR)/$(QL_MC_DEST) PNG48_APPS_DIR=$(THEME)/48x48/apps PNG48_STATUS_DIR=$(THEME)/48x48/status PNG48_QL_DEST=$(PNG48_APPS_DIR)/$(QL_DEST) PNG48_EF_DEST=$(PNG48_APPS_DIR)/$(EF_DEST) PNG48_MC_DEST=$(PNG48_STATUS_DIR)/$(QL_MC_DEST) PNG64_APPS_DIR=$(THEME)/64x64/apps PNG64_STATUS_DIR=$(THEME)/64x64/status PNG64_QL_DEST=$(PNG64_APPS_DIR)/$(QL_DEST) PNG64_EF_DEST=$(PNG64_APPS_DIR)/$(EF_DEST) PNG64_MC_DEST=$(PNG64_STATUS_DIR)/$(QL_MC_DEST) SYMBOLIC_SRC=$(wildcard $(THEME)/scalable/apps/*.svg.in) SYMBOLIC_TARGET=$(SYMBOLIC_SRC:.svg.in=.svg) all: png16 png24 png32 png48 png64 $(SYMBOLIC_TARGET) png16: $(PNG16_QL_DEST) $(PNG16_EF_DEST) $(PNG16_MC_DEST) png24: $(PNG24_QL_DEST) $(PNG24_EF_DEST) $(PNG24_MC_DEST) png32: $(PNG32_QL_DEST) $(PNG32_EF_DEST) $(PNG32_MC_DEST) png48: $(PNG48_QL_DEST) $(PNG48_EF_DEST) $(PNG48_MC_DEST) png64: $(PNG64_QL_DEST) $(PNG64_EF_DEST) $(PNG64_MC_DEST) $(SYMBOLIC_TARGET): $(SYMBOLIC_SRC) cp $(@:.svg=.svg.in) "_temp.svg" inkscape -f "_temp.svg" --verb=EditSelectAll \ --verb=SelectionUnGroup --verb=StrokeToPath --verb=SelectionUnion \ --verb=FileVacuum \ --verb=FileSave --verb=FileClose --verb=FileQuit mv "_temp.svg" "$@" $(PNG16_QL_DEST): $(QL_SOURCE) mkdir -p $(PNG16_APPS_DIR) && \ inkscape $(QL_SOURCE) --export-png $(PNG16_QL_DEST) -w 16 -h 16 ; $(PNG16_EF_DEST): $(EF_SOURCE) mkdir -p $(PNG16_APPS_DIR) && \ inkscape $(EF_SOURCE) --export-png $(PNG16_EF_DEST) -w 16 -h 16 ; $(PNG16_MC_DEST): $(MC_SOURCE) mkdir -p $(PNG16_STATUS_DIR) && \ inkscape $(QL_MC_SOURCE) --export-png $(PNG16_MC_DEST) -w 16 -h 16 ; $(PNG24_QL_DEST): $(QL_SOURCE) mkdir -p $(PNG24_APPS_DIR) && \ inkscape $(QL_SOURCE) --export-png $(PNG24_QL_DEST) -w 24 -h 24 ; $(PNG24_EF_DEST): $(EF_SOURCE) mkdir -p $(PNG24_APPS_DIR) && \ inkscape $(EF_SOURCE) --export-png $(PNG24_EF_DEST) -w 24 -h 24 ; $(PNG24_MC_DEST): $(MC_SOURCE) mkdir -p $(PNG24_STATUS_DIR) && \ inkscape $(QL_MC_SOURCE) --export-png $(PNG24_MC_DEST) -w 24 -h 24 ; $(PNG32_QL_DEST): $(QL_SOURCE) mkdir -p $(PNG32_APPS_DIR) && \ inkscape $(QL_SOURCE) --export-png $(PNG32_QL_DEST) -w 32 -h 32 ; $(PNG32_EF_DEST): $(EF_SOURCE) mkdir -p $(PNG32_APPS_DIR) && \ inkscape $(EF_SOURCE) --export-png $(PNG32_EF_DEST) -w 32 -h 32 ; $(PNG32_MC_DEST): $(MC_SOURCE) mkdir -p $(PNG32_STATUS_DIR) && \ inkscape $(QL_MC_SOURCE) --export-png $(PNG32_MC_DEST) -w 32 -h 32 ; $(PNG48_QL_DEST): $(QL_SOURCE) mkdir -p $(PNG48_APPS_DIR) && \ inkscape $(QL_SOURCE) --export-png $(PNG48_QL_DEST) -w 48 -h 48 ; $(PNG48_EF_DEST): $(EF_SOURCE) mkdir -p $(PNG48_APPS_DIR) && \ inkscape $(EF_SOURCE) --export-png $(PNG48_EF_DEST) -w 48 -h 48 ; $(PNG48_MC_DEST): $(MC_SOURCE) mkdir -p $(PNG48_STATUS_DIR) && \ inkscape $(QL_MC_SOURCE) --export-png $(PNG48_MC_DEST) -w 48 -h 48 ; $(PNG64_QL_DEST): $(QL_SOURCE) mkdir -p $(PNG64_APPS_DIR) && \ inkscape $(QL_SOURCE) --export-png $(PNG64_QL_DEST) -w 64 -h 64 ; $(PNG64_EF_DEST): $(EF_SOURCE) mkdir -p $(PNG64_APPS_DIR) && \ inkscape $(EF_SOURCE) --export-png $(PNG64_EF_DEST) -w 64 -h 64 ; $(PNG64_MC_DEST): $(MC_SOURCE) mkdir -p $(PNG64_STATUS_DIR) && \ inkscape $(QL_MC_SOURCE) --export-png $(PNG64_MC_DEST) -w 64 -h 64 ; .PHONY: clean clean: rm -f -R $(THEME)/16x16 $(THEME)/24x24 $(THEME)/32x32 $(THEME)/48x48 \ $(THEME)/64x64 $(SYMBOLIC_TARGET) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/query/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017070� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/query/_match.py�����������������������������������������������������������0000644�0001750�0001750�00000035273�13112005742�020711� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # 2011 Christoph Reiter # 2016 Ryan Dellenbaugh # 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import time import operator from senf import fsn2text, fsnative from quodlibet.unisearch import compile from quodlibet.compat import floordiv, text_type from quodlibet.util import parse_date from quodlibet.formats import FILESYSTEM_TAGS, TIME_TAGS class error(ValueError): pass class ParseError(error): pass class Node(object): def search(self, data): raise NotImplementedError def filter(self, sequence): return [s for s in sequence if self.search(s)] def _unpack(self): return self def __or__(self, other): return NotImplemented def __and__(self, other): return NotImplemented def __neg__(self): return Neg(self._unpack()) class Regex(Node): def __init__(self, pattern, mod_string): self.pattern = text_type(pattern) self.mod_string = text_type(mod_string) ignore_case = "c" not in self.mod_string or "i" in self.mod_string dot_all = "s" in self.mod_string asym = "d" in self.mod_string try: self.search = compile(self.pattern, ignore_case, dot_all, asym) except ValueError: raise ParseError( "The regular expression /%s/ is invalid." % self.pattern) def __repr__(self): return "<Regex pattern=%s mod=%s>" % (self.pattern, self.mod_string) class True_(Node): """Always True""" def search(self, data): return True def filter(self, list_): return list(list_) def __repr__(self): return "<True>" def __or__(self, other): return self def __and__(self, other): other = other._unpack() return other class Union(Node): """True if the object matches any of its REs.""" def __init__(self, res): self.res = res def search(self, data): for re in self.res: if re.search(data): return True return False def __repr__(self): return "<Union %r>" % self.res def __or__(self, other): other = other._unpack() if isinstance(other, Union): return Union(self.res + other.res) elif isinstance(other, True_): return other.__or__(self) return Union(self.res + [other]) def __and__(self, other): other = other._unpack() if isinstance(other, (Inter, True_)): return other.__and__(self) return Inter([self, other]) class Inter(Node): """True if the object matches all of its REs.""" def __init__(self, res): self.res = res def search(self, data): for re in self.res: if not re.search(data): return False return True def filter(self, sequence): current = sequence for re in self.res: current = filter(re.search, current) if not isinstance(current, list): current = list(current) return current def __repr__(self): return "<Inter %r>" % self.res def __and__(self, other): other = other._unpack() if isinstance(other, Inter): return Inter(self.res + other.res) if isinstance(other, True_): return other.__and__(self) return Inter(self.res + [other]) def __or__(self, other): other = other._unpack() if isinstance(other, (Union, True_)): return other.__or__(self) return Union([self, other]) class Neg(Node): """True if the object doesn't match its RE.""" def __init__(self, res): self.res = res def search(self, data): return not self.res.search(data) def __repr__(self): return "<Neg %r>" % self.res def __and__(self, other): other = other._unpack() if isinstance(other, True_): return other.__and__(self) return Inter([self, other]) def __or__(self, other): other = other._unpack() if isinstance(other, True_): return other.__or__(self) return Union([self, other]) def __neg__(self): return self.res class Numcmp(Node): """Numeric comparisons""" operators = { "<": operator.lt, "<=": operator.le, ">": operator.gt, ">=": operator.ge, "=": operator.eq, "==": operator.eq, "!=": operator.ne, } def __init__(self, expr, op, expr2): self._expr = expr self._op = self.operators[op] self._expr2 = expr2 def search(self, data): time_ = time.time() use_date = self._expr.use_date() or self._expr2.use_date() val = self._expr.evaluate(data, time_, use_date) val2 = self._expr2.evaluate(data, time_, use_date) if val is not None and val2 is not None: return self._op(val, val2) return False def __repr__(self): return "<Numcmp expr=%r, op=%r, expr2=%r>" % ( self._expr, self._op.__name__, self._expr2) def __and__(self, other): other = other._unpack() if isinstance(other, True_): return other.__and__(self) return Inter([self, other]) def __or__(self, other): other = other._unpack() if isinstance(other, True_): return other.__or__(self) return Union([self, other]) class Numexpr(object): """Expression in numeric comparison""" def evaluate(self, data, time, use_date): """Evaluate the expression to a number. `data` is the audiofile to evaluate for, time is the current time, and is_date is a boolean indicating whether to evaluate as a date (used to handle expressions like 2015-02-11 that look like dates and subtraction)""" raise NotImplementedError def use_date(self): """Returns whether to force the final comparison to compare the date values instead of the number values.""" return False class NumexprTag(Numexpr): """Numeric tag""" def __init__(self, tag): self._tag = tag self._ftag = "~#" + self._tag def evaluate(self, data, time, use_date): if self._tag == 'date': date = data('date') if not date: return None try: num = parse_date(date) except ValueError: return None else: num = data(self._ftag, None) if num is not None: if self._ftag in TIME_TAGS: num = time - num return round(num, 2) return None def __repr__(self): return "<NumexprTag tag=%r>" % self._tag def use_date(self): return self._tag == 'date' class NumexprUnary(Numexpr): """Unary numeric operation (like -)""" operators = { '-': operator.neg } def __init__(self, op, expr): self.__op = self.operators[op] self.__expr = expr def evaluate(self, data, time, use_date): val = self.__expr.evaluate(data, time, use_date) if val is not None: return self.__op(val) return None def __repr__(self): return "<NumexprUnary op=%r expr=%r>" % (self.__op, self.__expr) def use_date(self): return self.__expr.use_date() class NumexprBinary(Numexpr): """Binary numeric operation (like + or *)""" operators = { '-': operator.sub, '+': operator.add, '*': operator.mul, '/': floordiv, } precedence = { operator.sub: 1, operator.add: 1, operator.mul: 2, floordiv: 2, } def __init__(self, op, expr, expr2): self.__op = self.operators[op] self.__expr = expr self.__expr2 = expr2 # Rearrange expressions for operator precedence if (isinstance(self.__expr, NumexprBinary) and self.precedence[self.__expr.__op] < self.precedence[self.__op]): self.__expr = expr.__expr self.__op = expr.__op expr.__expr = expr.__expr2 expr.__op = self.operators[op] expr.__expr2 = expr2 self.__expr2 = expr def evaluate(self, data, time, use_date): val = self.__expr.evaluate(data, time, use_date) val2 = self.__expr2.evaluate(data, time, use_date) if val is not None and val2 is not None: try: return self.__op(val, val2) except ZeroDivisionError: return val * float('inf') return None def __repr__(self): return "<NumexprBinary op=%r expr=%r expr2=%r>" % ( self.__op, self.__expr, self.__expr2) def use_date(self): return self.__expr.use_date() or self.__expr2.use_date() class NumexprGroup(Numexpr): """Parenthesized group in numeric expression""" def __init__(self, expr): self.__expr = expr def evaluate(self, data, time, use_date): return self.__expr.evaluate(data, time, use_date) def __repr__(self): return "<NumexprGroup expr=%r>" % (self.__expr) def use_date(self): return self.__expr.use_date() class NumexprNumber(Numexpr): """Number in numeric expression""" def __init__(self, value): self._value = float(value) def evaluate(self, data, time, use_date): return self._value def __repr__(self): return "<NumexprNumber value=%.2f>" % (self._value) class NumexprNow(Numexpr): """Current time, with optional offset""" def __init__(self, offset=0): self.__offset = offset def evaluate(self, data, time, use_date): return time - self.__offset def __repr__(self): return "<NumexprNow offset=%r>" % (self.__offset) class NumexprNumberOrDate(Numexpr): """An ambiguous value like 2015-09-25 than can be interpreted as either a number or a date.""" def __init__(self, date): self.date = parse_date(date) parts = date.split('-') self.number = int(parts[0]) if len(parts) > 1: self.number -= int(parts[1]) if len(parts) > 2: self.number -= int(parts[2]) def evaluate(self, data, time, use_date): if use_date: return self.date else: return self.number def __repr__(self): return ('<NumexprNumberOrDate number=%r date=%r>' % (self.number, self.date)) def numexprUnit(value, unit): """Process numeric units and return NumexprNumber""" unit = unit.lower().strip() # Time units if unit.startswith("second"): value = value elif unit.startswith("minute"): value *= 60 elif unit.startswith("hour"): value *= 60 * 60 elif unit.startswith("day"): value *= 24 * 60 * 60 elif unit.startswith("week"): value *= 7 * 24 * 60 * 60 elif unit.startswith("month"): value *= 30 * 24 * 60 * 60 elif unit.startswith("year"): value *= 365 * 24 * 60 * 60 # Size units elif unit.startswith("g"): value *= 1024 ** 3 elif unit.startswith("m"): value *= 1024 ** 2 elif unit.startswith("k"): value *= 1024 elif unit.startswith("b"): pass elif unit: raise ParseError("No such unit: %r" % unit) return NumexprNumber(value) def numexprTagOrSpecial(tag): """Handle special values that look like tags""" if tag == "now": return NumexprNow() if tag == "today": return NumexprNow(offset=24 * 60 * 60) else: return NumexprTag(tag) class Tag(Node): """See if a property of the object matches its RE.""" # Shorthand for common tags. ABBRS = {"a": "artist", "b": "album", "v": "version", "t": "title", "n": "tracknumber", "d": "date", } def __init__(self, names, res): self.res = res self._names = [] self.__intern = [] self.__fs = [] names = [Tag.ABBRS.get(n.lower(), n.lower()) for n in names] for name in names: if name[:1] == "~": if name.startswith("~#"): raise ValueError("numeric tags not supported") if name in FILESYSTEM_TAGS: self.__fs.append(name) else: self.__intern.append(name) else: self._names.append(name) def search(self, data): search = self.res.search fs_default = fsnative() for name in self._names: val = data.get(name) if val is None: if name in ("filename", "mountpoint"): val = fsn2text(data.get("~" + name, fs_default)) else: val = data.get("~" + name, u"") if search(val): return True for name in self.__intern: if search(data(name)): return True for name in self.__fs: if search(fsn2text(data(name, fs_default))): return True return False def __repr__(self): names = self._names + self.__intern return ("<Tag names=%r, res=%r>" % (names, self.res)) def __and__(self, other): other = other._unpack() if isinstance(other, True_): return other.__and__(self) return Inter([self, other]) def __or__(self, other): other = other._unpack() if isinstance(other, True_): return other.__or__(self) return Union([self, other]) class Extension(Node): """Plugin-defined query extension Syntax is @(plugin_name) or @(plugin_name: body) Raises a ParseError if no plugin is loaded for the name, or if the plugin fails to parse the body""" def __init__(self, name, body): # pulls in gtk+ from quodlibet.plugins.query import QUERY_HANDLER, QueryPluginError self.__name = name self.__valid = True self.__body = body try: self.__plugin = QUERY_HANDLER.get_plugin(name) except KeyError: self.__valid = False return try: self.__body = self.__plugin.parse_body(body) except QueryPluginError: self.__valid = False return def search(self, data): return self.__valid and self.__plugin.search(data, self.__body) def __repr__(self): return ('<Extension name=%r valid=%r body=%r>' % (self.__name, self.__valid, self.__body)) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/query/_parser.py����������������������������������������������������������0000644�0001750�0001750�00000025115�13112005742�021103� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # 2016 Ryan Dellenbaugh # 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import codecs import re from . import _match as match from ._match import ParseError from quodlibet.util import re_escape from quodlibet.compat import text_type, PY3 # Precompiled regexes TAG = re.compile(r'[~\w\s:]+') UNARY_OPERATOR = re.compile(r'-') BINARY_OPERATOR = re.compile(r'[+\-\*/]') RELATIONAL_OPERATOR = re.compile(r'>=|<=|==|!=|>|<|=') DIGITS = re.compile(r'\d+(\.\d+)?') WORD = re.compile(r'[ \w]+') REGEXP = re.compile(r'([^/\\]|\\.)*') SINGLE_STRING = re.compile(r"([^'\\]|\\.)*") DOUBLE_STRING = re.compile(r'([^"\\]|\\.)*') MODIFIERS = re.compile(r'[cisld]*') TEXT = re.compile(r'[^,)]+') DATE = re.compile(r'\d{4}(-\d{1,2}(-\d{1,2})?)?') class QueryParser(object): """Parse the input. One lookahead token, start symbol is Query.""" def __init__(self, tokens, star=[]): self.tokens = tokens self.index = 0 self.last_match = None self.star = star def space(self): """Advance to the first non-space token""" while not self.eof() and self.tokens[self.index] == ' ': self.index += 1 def accept(self, token): """Return whether the next token is the same as the provided token, and if so advance past it.""" self.space() if self.eof(): return False if self.tokens[self.index] == token: self.index += 1 return True else: return False def accept_re(self, regexp): """Same as accept, but with a regexp instead of a single token. Sets self.last_match to the match text upon success""" self.space() re_match = regexp.match(self.tokens, self.index) if re_match: self.index = re_match.end() re_match = re_match.group() self.last_match = re_match return re_match def expect(self, token): """Raise an error if the next token doesn't match the provided token""" if not self.accept(token): raise ParseError("'{0}' expected at index {1}, but not found" .format(token, self.index)) def expect_re(self, regexp): """Same as expect, but with a regexp instead of a single token""" if self.accept_re(regexp) is None: raise ParseError("RE match expected at index {0}, but not found" .format(self.index)) return self.last_match def eof(self): """Return whether last token has been consumed""" return self.index >= len(self.tokens) def match_list(self, rule): """Match a comma-separated list of rules""" m = [rule()] while self.accept(','): m.append(rule()) return m def StartQuery(self): """Match a query that extends until the end of the input""" s = self.Query(outer=True) if not self.eof(): raise ParseError('Query ended before end of input') return s def Query(self, outer=False): """Rule for a query or subquery. Determines type of query based on first token""" self.space() if self.eof(): return match.True_() elif self.accept('!'): return self.Negation(self.Query) elif self.accept('&'): return self.Intersection(self.Query) elif self.accept('|'): return self.Union(self.Query) elif self.accept('#'): return self.Intersection(self.Numcmp) elif self.accept('@'): return self.Extension() try: # Equals, NotEquals and Star can begin the same, # so try in order, backtracking on failure (with Star last) index = self.index return self.Equals() except ParseError: self.index = index try: return self.NotEquals() except ParseError: self.index = index return self.Star(outer=outer) def Negation(self, rule): """Rule for '!query'. '!' token is consumed in Query""" return match.Neg(rule()) def Intersection(self, rule): """Rule for '&(query, query)'. '&' token is consumed in Query""" self.expect('(') inter = match.Inter(self.match_list(rule)) self.expect(')') return inter def Union(self, rule): """Rule for '|(query, query)'. '|' token is consumed in Query""" self.expect('(') union = match.Union(self.match_list(rule)) self.expect(')') return union def Numcmp(self): """Rule for numerical comparison like 'length > 3:30'""" cmps = [] expr2 = self.Numexpr(allow_date=True) while self.accept_re(RELATIONAL_OPERATOR): expr = expr2 relop = self.last_match expr2 = self.Numexpr(allow_date=True) cmps.append(match.Numcmp(expr, relop, expr2)) if not cmps: raise ParseError('No relational operator in numerical comparison') if len(cmps) > 1: return match.Inter(cmps) else: return cmps[0] def Numexpr(self, allow_date=False): """Rule for numerical expression like 'playcount + 4'""" if self.accept('('): expr = match.NumexprGroup(self.Numexpr(allow_date=True)) self.expect(')') elif self.accept_re(UNARY_OPERATOR): expr = match.NumexprUnary(self.last_match, self.Numexpr()) elif allow_date and self.accept_re(DATE): # Parse sequences of numbers that looks like dates as either dates # or numbers try: expr = match.NumexprNumberOrDate(self.last_match) except ValueError: # If the date can't be parsed then backtrack and try again # without allowing dates self.index -= len(self.last_match) expr = self.Numexpr(allow_date=False) elif self.accept_re(DIGITS): number = float(self.last_match) if self.accept(':'): # time like 4:15 number2 = float(self.expect_re(DIGITS)) expr = match.NumexprNumber(60 * number + number2) elif self.accept_re(WORD): # Number with units like 7 minutes expr = match.numexprUnit(number, self.last_match) else: expr = match.NumexprNumber(number) else: # Either tag name or special name like "today" expr = match.numexprTagOrSpecial(self.expect_re(TAG).strip()) if self.accept_re(BINARY_OPERATOR): # Try matching a binary operator then the second argument binop = self.last_match expr2 = self.Numexpr() return match.NumexprBinary(binop, expr, expr2) else: return expr def Extension(self): """Rule for plugin use like @(plugin: arguments)""" self.expect('(') name = self.expect_re(WORD) if self.accept(':'): body = self.ExtBody() else: body = None self.expect(')') return match.Extension(name, body) def ExtBody(self): """Body of plugin expression. Matches balanced parentheses""" depth = 0 index = self.index try: while True: current = self.tokens[index] if current == '(': depth += 1 elif current == ')': if depth == 0: break depth -= 1 elif current == '\\': index += 1 index += 1 except IndexError: if depth != 0: raise ParseError('Unexpected end of string while parsing ' 'extension body') result = self.tokens[self.index:index] self.index = index return result def Equals(self): """Rule for 'tag=value' queries""" tags = self.match_list(lambda: self.expect_re(TAG)) tags = [tag.strip() for tag in tags] self.expect('=') value = self.Value() return match.Tag(tags, value) def NotEquals(self): """Rule for 'tag!=value' queries""" tags = self.match_list(lambda: self.expect_re(TAG)) tags = [tag.strip() for tag in tags] self.expect('!') self.expect('=') value = self.Value() return match.Neg(match.Tag(tags, value)) def Value(self, outer=False): """Rule for value. Either a regexp, quoted string, boolean combination of values, or free text string""" if self.accept('/'): regex = self.expect_re(REGEXP) self.expect('/') return self.RegexpMods(regex) elif self.accept('"'): regex = self.str_to_re(self.expect_re(DOUBLE_STRING)) self.expect('"') return self.RegexpMods(regex) elif self.accept("'"): regex = self.str_to_re(self.expect_re(SINGLE_STRING)) self.expect("'") return self.RegexpMods(regex) elif self.accept('!'): return self.Negation(self.Value) elif self.accept('|'): return self.Union(self.Value) elif self.accept('&'): return self.Intersection(self.Value) else: if outer: # Hack to force plain text parsing for top level free text raise ParseError('Free text not allowed at top level of query') return match.Regex(re_escape(self.expect_re(TEXT)), u"d") def RegexpMods(self, regex): """Consume regexp modifiers from tokens and compile provided regexp with them. """ mod_string = self.expect_re(MODIFIERS) return match.Regex(regex, mod_string) def Star(self, outer=False): """Rule for value that matches all visible tags""" return match.Tag(self.star, self.Value(outer=outer)) def str_to_re(self, string): """Convert plain string to escaped regexp that can be compiled""" if isinstance(string, text_type): string = string.encode('utf-8') if PY3: string = codecs.escape_decode(string)[0] else: string = string.decode('string_escape') string = string.decode('utf-8') return "^%s$" % re_escape(string) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/query/__init__.py���������������������������������������������������������0000644�0001750�0001750�00000000410�13112005742�021176� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from ._query import Query, QueryType Query, QueryType ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/query/_query.py�����������������������������������������������������������0000644�0001750�0001750�00000011343�13112005742�020752� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2005 Joe Wreschnig, Michael Urman # 2015-2016 Nick Boultbee, # 2016 Ryan Dellenbaugh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from . import _match as match from ._match import error, Node from ._parser import QueryParser from quodlibet.util import re_escape, enum, cached_property from quodlibet.compat import PY2, text_type @enum class QueryType(int): TEXT = 0 VALID = 1 INVALID = 2 class Query(Node): STAR = ["artist", "album", "title"] """Default tags to search in, use/extend and pass to Query()""" error = error """Base error type""" type = None """The QueryType value: VALID or TEXT""" string = None """The original string which was used to create this query""" stars = None """List of default tags used""" def __init__(self, string, star=None): """Parses the query string and returns a match object. star -- List of tags to look in if none are specified in the query. Defaults to those specified in `STAR`. This parses the query language as well as some tagless shortcuts: "foo bar" -> &(star1,star2=foo,star1,star2=bar) "!foo" -> !star1,star2=foo "&(foo, bar)" -> &(star1,star2=foo, star1,star2=bar) "&(foo, !bar)" -> &(star1,star2=foo, !star1,star2=bar) "|(foo, bar)" -> |(star1,star2=foo, star1,star2=bar) "!&(foo, bar)" -> !&(star1,star2=foo, star1,star2=bar) "!(foo, bar)" -> !star1,star2=(foo, bar) etc... """ if star is None: star = self.STAR if not isinstance(string, text_type): assert PY2 string = string.decode('utf-8') self.star = list(star) self.string = string self.type = QueryType.VALID try: self._match = QueryParser(string, star=star).StartQuery() return except self.error: pass if not set("#=").intersection(string): parts = ["/%s/d" % re_escape(s) for s in string.split()] string = "&(" + ",".join(parts) + ")" self.string = string try: self.type = QueryType.TEXT self._match = QueryParser(string, star=star).StartQuery() return except self.error: pass raise error('Query is not VALID or TEXT') @classmethod def StrictQueryMatcher(cls, string): """Returns a Matcher for a strict, valid (non-freetext) Query, or `None` if this fails. """ try: return QueryParser(string).StartQuery() except error: return None def __repr__(self): return "<Query string=%r type=%r star=%r>" % ( self.string, self.type, self.star) @cached_property def search(self): return self._match.search @cached_property def filter(self): return self._match.filter @classmethod def is_valid(cls, string): """Whether a full query can be parsed""" return cls.get_type(string) == QueryType.VALID @classmethod def match_all(cls, string): """Whether the resulting query will not filter anything""" try: return isinstance(cls(string)._match, match.True_) except cls.error: return False @classmethod def is_parsable(cls, string): """Whether the text can be parsed""" try: cls(string) except cls.error: return False return True @classmethod def get_type(cls, string): """Returns a QueryType instance for the given query""" try: return cls(string).type except error: return QueryType.INVALID def _unpack(self): # so that other classes can see the wrapped one and optimize # the result using the type information return self._match def __or__(self, other): return self._match.__or__(other) def __and__(self, other): return self._match.__and__(other) def __neg__(self): return self._match.__neg__() @classmethod def validator(cls, string): """Returns True/False for a query, None for a text only query""" type_ = cls.get_type(string) if type_ == QueryType.VALID: # in case of an empty but valid query we say it's "text" if cls.match_all(string): return None return True elif type_ == QueryType.INVALID: return False return None ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/update.py�����������������������������������������������������������������0000644�0001750�0001750�00000011555�13112005742�017570� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. """Check for new versions of the application For each "build type" (basically each bundle/installer) we host an (sparkle appcast) rss feed on quodlibet.github.io. We download it and compare versions... Since there can be multiple builds per release for the same release type (e.g. the installer was broken and had to be redone) the build version is used and not the release version. """ from gi.repository import Gtk import feedparser import quodlibet from quodlibet import _ from quodlibet.build import BUILD_TYPE from quodlibet.compat import text_type, urlopen from quodlibet.qltk.window import Dialog from quodlibet.util.dprint import print_exc from quodlibet.util import escape from quodlibet.util.thread import call_async, Cancellable class UpdateError(Exception): pass def parse_version(version_string): """Might raise ValueError""" return tuple(map(int, version_string.split("."))) def format_version(version_tuple): return u".".join(map(text_type, version_tuple)) def fetch_versions(build_type, timeout=5.0): """Fetches the list of available releases and returns a list of version tuples. Sorted and oldest version first. The list might be empty. Also returns an URL to the download page. Args: build_type (text): the build type. e.g. "default" or "windows" timeout (float): timeout in seconds Thread safe. Raises UpdateError """ try: content = urlopen( u"https://quodlibet.github.io/appcast/%s.rss" % build_type, timeout=timeout).read() except Exception as error: raise UpdateError(error) d = feedparser.parse(content) if d.bozo: raise UpdateError(d.bozo_exception) try: link = d.feed.link enclosures = [e for entry in d.entries for e in entry.enclosures] except AttributeError as error: raise UpdateError(error) try: versions = [parse_version(en.version) for en in enclosures] except ValueError as error: raise UpdateError(error) return sorted(versions), link class UpdateDialog(Dialog): def __init__(self, parent): super(UpdateDialog, self).__init__( title=_("Checking for Updates"), use_header_bar=True, modal=True) self.set_default_size(380, 110) self.set_transient_for(parent) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.set_default_response(Gtk.ResponseType.CANCEL) content = self.get_content_area() self._stack = Gtk.Stack(border_width=10) self._stack.set_transition_duration(500) self._stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE) content.pack_start(self._stack, True, True, 0) content.show_all() spinner = Gtk.Spinner() spinner.start() self._set_widget(spinner) def run(self): def do_fetch_versions(): try: return fetch_versions(BUILD_TYPE) except UpdateError: print_exc() return None cancel = Cancellable() self.connect("response", self._on_response, cancel) call_async(do_fetch_versions, cancel, self._on_result) return super(UpdateDialog, self).run() def _on_result(self, args): if args is None or not args[0]: text = _("Connection failed") else: versions, url = args version = quodlibet.get_build_version() def f(v): return "<b>%s</b>" % escape(format_version(v)) if version >= versions[-1]: text = (_("You are already using the newest version " "%(version)s") % {"version": f(version)}) else: text = (_("A new version %(new-version)s is available\n\n" "You are currently using version %(old-version)s\n\n" "Visit the <a href='%(url)s'>website</a>") % { "new-version": f(versions[-1]), "old-version": f(version), "url": escape(url)}) self._set_widget( Gtk.Label(label=text, use_markup=True, wrap=True, justify=Gtk.Justification.CENTER)) button = self.get_widget_for_response(Gtk.ResponseType.CANCEL) button.set_label(_("_Close")) def _set_widget(self, widget): old = self._stack.get_visible_child() self._stack.add(widget) widget.show() self._stack.set_visible_child(widget) if old: old.destroy() def _on_response(self, dialog, response_id, cancel): cancel.cancel() ���������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/order/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017036� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/order/reorder.py����������������������������������������������������������0000644�0001750�0001750�00000003346�13112005742�021062� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import random from quodlibet import _ from quodlibet.order import Order, OrderRemembered from quodlibet.compat import iteritems class Reorder(Order): """Base class for all `Order`s that potentially reorder the playlist, and thus usually identify as a "shuffle" implementation.""" pass class OrderShuffle(Reorder, OrderRemembered): name = "random" display_name = _("Random") accelerated_name = _("_Random") def next(self, playlist, iter): super(OrderShuffle, self).next(playlist, iter) played = set(self._played) songs = set(range(len(playlist))) remaining = songs.difference(played) if remaining: return playlist.get_iter((random.choice(list(remaining)),)) return None class OrderWeighted(Reorder, OrderRemembered): name = "weighted" display_name = _("Prefer higher rated") accelerated_name = _("Prefer higher rated") def next(self, playlist, iter): super(OrderWeighted, self).next(playlist, iter) remaining = self.remaining(playlist) # Don't try to search through an empty / played playlist. if len(remaining) <= 0: return None total_score = sum([song('~#rating') for song in remaining.values()]) choice = random.random() * total_score current = 0.0 for i, song in iteritems(remaining): current += song("~#rating") if current >= choice: return playlist.get_iter([i]) raise ValueError ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/order/__init__.py���������������������������������������������������������0000644�0001750�0001750�00000012637�13112005742�021162� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2016-17 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _, print_d class Order(object): """Base class for all play orders In all methods: `playlist` is a GTK+ `ListStore` containing at least an `AudioFile` as the first element in each row (in the future there may be more elements per row). `iter` is a `GtkTreeIter` for the song that just finished, if any. If the song is not in the list, this iter will be `None`. """ name = "unknown_order" """The name by which this order is known""" display_name = _("Unknown") """The (translated) display name""" accelerated_name = _("_Unknown") """The (translated) display name with (optional) accelerators""" replaygain_profiles = ["track"] """The ReplayGain mode(s) to use with this order. Shuffled ones typically prefer track modes""" priority = 100 """The priority relative to other orders of its type. Larger numbers typically appear lower in lists.""" def __init__(self): """Must have a zero-arg constructor""" pass def next(self, playlist, iter): """Not called directly, but the default implementation of `next_explicit` and `next_implicit` both just call this. """ raise NotImplementedError def previous(self, playlist, iter): """Not called directly, but the default implementation of `previous_explicit` calls this. Right now there is no such thing as `previous_implicit`.""" raise NotImplementedError def set(self, playlist, iter): """Not called directly, but the default implementations of `set_explicit` and `set_implicit` call this. """ return iter def next_explicit(self, playlist, iter): """Not called directly, but the default implementations of `set_explicit` and `set_implicit` call this.""" return self.next(playlist, iter) def next_implicit(self, playlist, iter): """Called when a song ends passively, e.g. it plays through.""" return self.next(playlist, iter) def previous_explicit(self, playlist, iter): """Called when the user presses a "Previous" button.""" return self.previous(playlist, iter) def set_explicit(self, playlist, iter): """Called when the user manually selects a song (at `iter`). If desired the play order can override that, or just log it and return the iter again. Note that playlist.current_iter is the current iter, if any. If the play order returns `None`, no action will be taken by the player. """ return self.set(playlist, iter) def set_implicit(self, playlist, iter): """Called when the song is set by a means other than the UI.""" return self.set(playlist, iter) def reset(self, playlist): """Called when there is no song ready to prepare for a new order. Implementations should reset the state of the current order, e.g. forgetting history / clearing pre-cached orders.""" pass def __str__(self): """By default there is no interesting state""" return "<%s>" % self.display_name class OrderRemembered(Order): """Shared class for all the shuffle modes that keep a memory of their previously played songs.""" def __init__(self): super(OrderRemembered, self).__init__() self._played = [] def next(self, playlist, iter): if iter is not None: self._played.append(playlist.get_path(iter).get_indices()[0]) def previous(self, playlist, iter): try: path = self._played.pop() except IndexError: return None else: return playlist.get_iter(path) def set(self, playlist, iter): if iter is not None: self._played.append(playlist.get_path(iter).get_indices()[0]) return iter def reset(self, playlist): del(self._played[:]) def remaining(self, playlist): """Gets a map of all song indices to their song from the `playlist` that haven't yet been played""" all_indices = set(range(len(playlist))) played = set(self._played) print_d("Played %d of %d song(s)" % (len(self._played), len(playlist))) remaining = list(all_indices.difference(played)) all_songs = playlist.get() return {i: all_songs[i] for i in remaining} class OrderInOrder(Order): """Keep to the order of the supplied playlist""" name = "in_order" display_name = _("In Order") accelerated_name = _("_In Order") replaygain_profiles = ["album", "track"] priority = 0 def next(self, playlist, iter): if iter is None: return playlist.get_iter_first() else: return playlist.iter_next(iter) def previous(self, playlist, iter): if len(playlist) == 0: return None elif iter is None: return playlist[(len(playlist) - 1,)].iter else: path = max(1, playlist.get_path(iter).get_indices()[0]) try: return playlist.get_iter((path - 1,)) except ValueError: return None �������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/order/repeat.py�����������������������������������������������������������0000644�0001750�0001750�00000004151�13112005742�020673� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet import print_d from quodlibet.order import Order class Repeat(Order): """Repeat, in some way, over a supplied `Order`""" def __init__(self, wrapped): super(Repeat, self).__init__() assert isinstance(wrapped, Order) self.wrapped = wrapped def next(self, playlist, iter): raise NotImplementedError def set(self, playlist, iter): return self.wrapped.set(playlist, iter) def previous(self, playlist, iter): return self.wrapped.previous(playlist, iter) def reset(self, playlist): return self.wrapped.reset(playlist) def __str__(self): return "<%s ∘ %s>" % (self.display_name, self.wrapped.display_name) class RepeatSongForever(Repeat): """Repeats the same song forever (aka "repeat one"). Explicit next calls will "break out" of the repeat which is probably what the user wanted""" name = "repeat_song" display_name = _("Repeat this track") accelerated_name = _("Repeat this track") def next(self, playlist, iter): return iter def next_explicit(self, playlist, iter): return self.wrapped.next_explicit(playlist, iter) class RepeatListForever(Repeat): """Repeats the playlist forever once it's finished""" name = "repeat_all" display_name = _("Repeat all") accelerated_name = _("Repeat all") def next(self, playlist, iter): next = self.wrapped.next(playlist, iter) if next: return next self.wrapped.reset(playlist) print_d("Restarting songlist") return playlist.get_iter_first() class OneSong(Repeat): """Stops after the current song""" name = "one_song" display_name = _("One Song") accelerated_name = _("One Song") priority = 400 def next(self, playlist, iter): print_d("Ending songlist.") return None �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/_import.py����������������������������������������������������������������0000644�0001750�0001750�00000003542�13112005742�017754� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. import sys import importlib class RedirectImportHook(object): """Import hook which loads packages as sub packages. e.g. "import raven" will import "quodlibet.optpackages.raven" even if raven uses absolute imports internally. """ def __init__(self, name, packages): """ Args: name (str): The package path to load the packages from packages (List[str]): A list of packages provided """ for package in packages: if package in sys.modules: raise Exception("%r already loaded, can't redirect" % package) self._name = name self._packages = packages def find_module(self, fullname, path=None): package = fullname.split(".")[0] if package in self._packages: return self def load_module(self, name): mod = None if name in sys.modules: mod = sys.modules[name] loadname = self._name + "." + name if loadname in sys.modules: mod = sys.modules[loadname] if mod is None: mod = importlib.import_module(loadname) sys.modules[name] = mod sys.modules[loadname] = mod return mod def install_redirect_import_hook(): """Install the import hook, does not import anything""" import_hook = RedirectImportHook( "quodlibet.optpackages", ["raven", "contextlib2"]) sys.meta_path.insert(0, import_hook) import_hook = RedirectImportHook( "quodlibet.packages", ["senf"]) sys.meta_path.insert(0, import_hook) ��������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/_init.py������������������������������������������������������������������0000644�0001750�0001750�00000031237�13115500547�017415� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import sys import warnings import logging from senf import environ, argv, fsn2text from quodlibet.compat import PY2 from quodlibet.const import MinVersions from quodlibet import config from quodlibet.util import is_osx, is_windows, i18n from quodlibet.util.dprint import print_e, PrintHandler from quodlibet.util.urllib import install_urllib2_ca_file from ._main import get_base_dir, is_release, get_image_dir _cli_initialized = False _initialized = False def _init_gtk_debug(no_excepthook): from quodlibet.errorreport import enable_errorhook enable_errorhook(not no_excepthook) def is_init(): """Returns if init() was called""" global _initialized return _initialized def init(no_translations=False, no_excepthook=False, config_file=None): """This needs to be called before any API can be used. Might raise in case of an error. Pass no_translations=True to disable translations (used by tests) """ global _initialized if _initialized: return init_cli(no_translations=no_translations, config_file=config_file) _init_gtk() _init_gtk_debug(no_excepthook=no_excepthook) _init_gst() _init_dbus() _initialized = True def _init_gettext(no_translations=False): """Call before using gettext helpers""" if no_translations: language = u"C" else: language = config.gettext("settings", "language") if not language: language = None i18n.init(language) # Use the locale dir in ../build/share/locale if there is one base_dir = get_base_dir() localedir = os.path.dirname(base_dir) localedir = os.path.join(localedir, "build", "share", "locale") if not os.path.isdir(localedir) and os.name == "nt": # py2exe case localedir = os.path.join( base_dir, "..", "..", "share", "locale") i18n.register_translation("quodlibet", localedir) debug_text = environ.get("QUODLIBET_TEST_TRANS") if debug_text is not None: i18n.set_debug_text(fsn2text(debug_text)) def _init_python(): if PY2 or is_release(): MinVersions.PYTHON2.check(sys.version_info) else: # for non release builds we allow Python3 MinVersions.PYTHON3.check(sys.version_info) if is_osx(): # We build our own openssl on OSX and need to make sure that # our own ca file is used in all cases as the non-system openssl # doesn't use the system certs install_urllib2_ca_file() if is_windows(): # Not really needed on Windows as pygi-aio seems to work fine, but # wine doesn't have certs which we use for testing. install_urllib2_ca_file() if is_windows() and os.sep != "\\": # In the MSYS2 console MSYSTEM is set, which breaks os.sep/os.path.sep # If you hit this do a "setup.py clean -all" to get rid of the # bytecode cache then start things with "MSYSTEM= ..." raise AssertionError("MSYSTEM is set (%r)" % environ.get("MSYSTEM")) if is_windows(): # gdbm is broken under msys2, this makes shelve use another backend sys.modules["gdbm"] = None sys.modules["_gdbm"] = None logging.getLogger().addHandler(PrintHandler()) def _init_formats(): from quodlibet.formats import init init() def init_cli(no_translations=False, config_file=None): """This needs to be called before any API can be used. Might raise in case of an error. Like init() but for code not using Gtk etc. """ global _cli_initialized if _cli_initialized: return _init_python() config.init_defaults() if config_file is not None: config.init(config_file) _init_gettext(no_translations) _init_formats() _init_g() _cli_initialized = True def _init_dbus(): """Setup dbus mainloop integration. Call before using dbus""" try: from dbus.mainloop.glib import DBusGMainLoop, threads_init except ImportError: try: import dbus.glib dbus.glib except ImportError: return else: threads_init() DBusGMainLoop(set_as_default=True) def _fix_gst_leaks(): """gst_element_add_pad and gst_bin_add are wrongly annotated and lead to PyGObject refing the passed element. Work around by adding a wrapper that unrefs afterwards. Can be called multiple times. https://bugzilla.gnome.org/show_bug.cgi?id=741390 https://bugzilla.gnome.org/show_bug.cgi?id=702960 """ from gi.repository import Gst assert Gst.is_initialized() def do_wrap(func): def wrap(self, obj): result = func(self, obj) obj.unref() return result return wrap parent = Gst.Bin() elm = Gst.Bin() parent.add(elm) if elm.__grefcount__ == 3: elm.unref() Gst.Bin.add = do_wrap(Gst.Bin.add) pad = Gst.Pad.new("foo", Gst.PadDirection.SRC) parent.add_pad(pad) if pad.__grefcount__ == 3: pad.unref() Gst.Element.add_pad = do_wrap(Gst.Element.add_pad) def _init_g(): """Call before using GdkPixbuf/GLib/Gio/GObject""" import gi gi.require_version("GLib", "2.0") gi.require_version("Gio", "2.0") gi.require_version("GObject", "2.0") gi.require_version("GdkPixbuf", "2.0") from gi.repository import GdkPixbuf # On windows the default variants only do ANSI paths, so replace them. # In some typelibs they are replaced by default, in some don't.. if os.name == "nt": for name in ["new_from_file_at_scale", "new_from_file_at_size", "new_from_file"]: cls = GdkPixbuf.Pixbuf setattr( cls, name, getattr(cls, name + "_utf8", getattr(cls, name))) # https://bugzilla.gnome.org/show_bug.cgi?id=670372 if not hasattr(GdkPixbuf.Pixbuf, "savev"): GdkPixbuf.Pixbuf.savev = GdkPixbuf.Pixbuf.save # Newer glib is noisy regarding deprecated signals/properties # even with stable releases. if is_release(): warnings.filterwarnings( 'ignore', '.* It will be removed in a future version.', Warning) # blacklist some modules, simply loading can cause segfaults sys.modules["glib"] = None sys.modules["gobject"] = None def _init_gtk(): """Call before using Gtk/Gdk""" import gi # pygiaio 3.14rev16 switched to fontconfig for PangoCairo. As this results # in 100% CPU under win7 revert it. Maybe we need to update the # cache in the windows installer for it to work... but for now revert. if is_windows(): environ['PANGOCAIRO_BACKEND'] = 'win32' environ["GTK_CSD"] = "0" # disable for consistency and trigger events seem a bit flaky here if is_osx(): environ["GTK_OVERLAY_SCROLLING"] = "0" # make sure GdkX11 doesn't get used under Windows if os.name == "nt": sys.modules["gi.repository.GdkX11"] = None try: # not sure if this is available under Windows gi.require_version("GdkX11", "3.0") from gi.repository import GdkX11 GdkX11 except (ValueError, ImportError): pass gi.require_version("Gtk", "3.0") gi.require_version("Gdk", "3.0") gi.require_version("Pango", "1.0") gi.require_version('Soup', '2.4') from gi.repository import Gtk, Soup from quodlibet.qltk import ThemeOverrider, gtk_version # Work around missing annotation in older libsoup (Ubuntu 14.04 at least) message = Soup.Message() try: message.set_request(None, Soup.MemoryUse.COPY, b"") except TypeError: orig = Soup.Message.set_request def new_set_request(self, content_type, req_use, req_body): return orig(self, content_type, req_use, req_body, len(req_body)) Soup.Message.set_request = new_set_request # PyGObject doesn't fail anymore when init fails, so do it ourself initialized, argv[:] = Gtk.init_check(argv) if not initialized: raise SystemExit("Gtk.init failed") # include our own icon theme directory theme = Gtk.IconTheme.get_default() theme_search_path = get_image_dir() assert os.path.exists(theme_search_path) theme.append_search_path(theme_search_path) # Force menu/button image related settings. We might show too many atm # but this makes sure we don't miss cases where we forgot to force them # per widget. # https://bugzilla.gnome.org/show_bug.cgi?id=708676 warnings.filterwarnings('ignore', '.*g_value_get_int.*', Warning) # some day... but not now warnings.filterwarnings( 'ignore', '.*Stock items are deprecated.*', Warning) warnings.filterwarnings( 'ignore', '.*:use-stock.*', Warning) warnings.filterwarnings( 'ignore', '.*The property GtkAlignment:[^\s]+ is deprecated.*', Warning) settings = Gtk.Settings.get_default() with warnings.catch_warnings(): warnings.simplefilter("ignore") settings.set_property("gtk-button-images", True) settings.set_property("gtk-menu-images", True) if hasattr(settings.props, "gtk_primary_button_warps_slider"): # https://bugzilla.gnome.org/show_bug.cgi?id=737843 settings.set_property("gtk-primary-button-warps-slider", True) # Make sure PyGObject includes support for foreign cairo structs try: gi.require_foreign("cairo") except AttributeError: # older pygobject pass except ImportError: print_e("PyGObject is missing cairo support") exit(1) css_override = ThemeOverrider() # CSS overrides if os.name == "nt": # somehow borders are missing under Windows & Gtk+3.14 style_provider = Gtk.CssProvider() style_provider.load_from_data(b""" .menu { border: 1px solid @borders; } """) css_override.register_provider("", style_provider) if sys.platform == "darwin": # fix duplicated shadows for popups with Gtk+3.14 style_provider = Gtk.CssProvider() style_provider.load_from_data(b""" GtkWindow { box-shadow: none; } .tooltip { border-radius: 0; padding: 0; } .tooltip.background { background-clip: border-box; } """) css_override.register_provider("", style_provider) if gtk_version[:2] >= (3, 20): # https://bugzilla.gnome.org/show_bug.cgi?id=761435 style_provider = Gtk.CssProvider() style_provider.load_from_data(b""" spinbutton, button { min-height: 1.8rem; } .view button { min-height: 2.0rem; } entry { min-height: 2.4rem; } entry.cell { min-height: 0; } """) css_override.register_provider("Adwaita", style_provider) css_override.register_provider("HighContrast", style_provider) # https://bugzilla.gnome.org/show_bug.cgi?id=708676 warnings.filterwarnings('ignore', '.*g_value_get_int.*', Warning) # blacklist some modules, simply loading can cause segfaults sys.modules["gtk"] = None sys.modules["gpod"] = None sys.modules["gnome"] = None from quodlibet.qltk import pygobject_version, gtk_version MinVersions.GTK.check(gtk_version) MinVersions.PYGOBJECT.check(pygobject_version) def _init_gst(): """Call once before importing GStreamer""" assert "gi.repository.Gst" not in sys.modules import gi # We don't want python-gst, it changes API.. assert "gi.overrides.Gst" not in sys.modules sys.modules["gi.overrides.Gst"] = None # blacklist some modules, simply loading can cause segfaults sys.modules["gst"] = None # We don't depend on Gst overrides, so make sure it's initialized. try: gi.require_version("Gst", "1.0") from gi.repository import Gst except (ValueError, ImportError): return if Gst.is_initialized(): return from gi.repository import GLib try: ok, argv[:] = Gst.init_check(argv) except GLib.GError: print_e("Failed to initialize GStreamer") # Uninited Gst segfaults: make sure no one can use it sys.modules["gi.repository.Gst"] = None else: # monkey patching ahead _fix_gst_leaks() # https://bugzilla.gnome.org/show_bug.cgi?id=710447 import threading threading.Thread(target=lambda: None).start() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/remote.py�����������������������������������������������������������������0000644�0001750�0001750�00000010056�13112005742�017574� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os from senf import path2fsn, fsn2bytes, bytes2fsn, fsnative from quodlibet.util import fifo, print_w from quodlibet import get_user_dir try: from quodlibet.util import winpipe except ImportError: winpipe = None class RemoteError(Exception): pass class RemoteBase(object): """A thing for communicating with existing instances of ourself.""" def __init__(self, app, cmd_registry): """ Args: app (Application) cmd_registry (CommandRegistry) """ raise NotImplemented @classmethod def remote_exists(self): """See if another instance exists Returns: bool """ raise NotImplemented @classmethod def send_message(cls, message): """Send data to the existing instance if possible and returns a response. Args: message (fsnative) Returns: fsnative or None Raises: RemoteError: in case the message couldn't be send or there was no response. """ raise NotImplemented def start(self): """Start the listener for other instances. Raises: RemoteError: in case another instance is already listening. """ raise NotImplemented def stop(self): """Stop the listener for other instances""" raise NotImplemented class QuodLibetWinRemote(RemoteBase): _NAME = "quodlibet" def __init__(self, app, cmd_registry): self._app = app self._cmd_registry = cmd_registry self._server = winpipe.NamedPipeServer(self._NAME, self._callback) @classmethod def remote_exists(cls): return winpipe.pipe_exists(cls._NAME) @classmethod def send_message(cls, message): data = fsn2bytes(path2fsn(message), "utf-8") try: winpipe.write_pipe(cls._NAME, data) except EnvironmentError as e: raise RemoteError(e) def start(self): try: self._server.start() except winpipe.NamedPipeServerError as e: raise RemoteError(e) def stop(self): self._server.stop() def _callback(self, data): message = bytes2fsn(data, "utf-8") self._cmd_registry.handle_line(self._app, message) class QuodLibetUnixRemote(RemoteBase): _FIFO_NAME = "control" _PATH = os.path.join(get_user_dir(), _FIFO_NAME) def __init__(self, app, cmd_registry): self._app = app self._cmd_registry = cmd_registry self._fifo = fifo.FIFO(self._PATH, self._callback) @classmethod def remote_exists(cls): return fifo.fifo_exists(cls._PATH) @classmethod def send_message(cls, message): assert isinstance(message, fsnative) try: return fifo.write_fifo(cls._PATH, fsn2bytes(message, None)) except EnvironmentError as e: raise RemoteError(e) def start(self): try: self._fifo.open() except fifo.FIFOError as e: raise RemoteError(e) def stop(self): self._fifo.destroy() def _callback(self, data): try: messages = list(fifo.split_message(data)) except ValueError: print_w("invalid message: %r" % data) return for command, path in messages: command = bytes2fsn(command, None) response = self._cmd_registry.handle_line(self._app, command) if path is not None: path = bytes2fsn(path, None) with open(path, "wb") as h: if response is not None: assert isinstance(response, fsnative) h.write(fsn2bytes(response, None)) if os.name == "nt": Remote = QuodLibetWinRemote else: Remote = QuodLibetUnixRemote ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/plugins/������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017404� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/plugins/songsmenu.py������������������������������������������������������0000644�0001750�0001750�00000005330�13112005742�021777� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Joe Wreschnig # 2013-2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.plugins.gui import MenuItemPlugin from quodlibet.util.songwrapper import check_wrapper_changed class SongsMenuPlugin(MenuItemPlugin): """Plugins of this type are subclasses of Gtk.ImageMenuItem. They will be added, in alphabetical order, to the "Plugins" menu that appears when songs or lists of songs are right-clicked. They provide one or more of the following instance methods: self.plugin_single_song(song) self.plugin_song(song) self.plugin_songs(songs) self.plugin_single_album(album) self.plugin_album(album) self.plugin_albums(albums) All matching provided callables on a single object are called in the above order if they match until one returns a true value. They are not called with real AudioFile objects, but rather wrappers that automatically detect metadata or disk changes, and save or reload the files as appropriate. If the wrappers get changed after the above methods return, call self.plugin_finish() to check for changes. The single_ variant is only called if a single song/album is selected. The singular version is called once for each selected song/album, whereas the plural version is called with a list of songs/albums. An album is a list of songs all with the same album, labelid, and/or musicbrainz_albumid tags (like in the Album List). To make your plugin insensitive if unsupported songs are selected, a method that takes a list of songs and returns True or False to set the sensitivity of the menu entry: self.plugin_handles(songs) All of this is managed by the constructor for SongsMenuPlugin, so make sure it gets called if you override it (you shouldn't have to). """ plugin_single_song = None plugin_song = None plugin_songs = None plugin_single_album = None plugin_album = None plugin_albums = None def __init__(self, songs=None, library=None): super(SongsMenuPlugin, self).__init__() self.__library = library self.__songs = songs or [] self.set_sensitive(bool(self.plugin_handles(songs))) def plugin_handles(self, songs): return True @property def handles_albums(self): return any(map(callable, [self.plugin_single_album, self.plugin_album, self.plugin_albums])) def plugin_finish(self): check_wrapper_changed(self.__library, self.plugin_window, self.__songs) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/plugins/songshelpers.py���������������������������������������������������0000644�0001750�0001750�00000002121�13112005742�022470� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """Various `plugin_handles` helpers""" from quodlibet.formats._id3 import ID3File def is_a_file(song): return song.is_file def is_writable(song): return bool(song.can_change()) and song.is_writable def is_finite(song): return not song.multisong def can_be_queued(song): return not song.can_add def has_writable_image(song): return song.can_change_images def has_bookmark(song): return bool(song.bookmarks) def is_an_id3(song): return isinstance(song, ID3File) # Higher order functions def any_song(*song_funcs): return __handles_factory(any, song_funcs) def each_song(*song_funcs): return __handles_factory(all, song_funcs) def __handles_factory(reducer, song_funcs): def handles(_, songs): return reducer(all(f(s) for f in song_funcs) for s in songs) return handles �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/plugins/editing.py��������������������������������������������������������0000644�0001750�0001750�00000012357�13112005742�021413� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Joe Wreschnig # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet.util import connect_obj from quodlibet.compat import cmp class RenameFilesPlugin(object): """Plugins of this type must subclass a GTK widget. They will be packed into the RenameFiles pane (currently a ScrolledWindow hidden with an expander, but that might change). The 'filter' function will be called with the song's original filename as a string (probably in the local filesystem encoding) and the proposed new filename as a unicode object. It should return an appropriate-transformed filename, still as a unicode object. The plugin must provide either a 'changed' or 'preview'. 'preview' causes the entire display to be re-previewed. 'changed' causes the Preview button to made sensitive, and Save to be disabled. If the 'active' attribute is false, the filter will not be called. This is particularly useful for gtk.CheckButtons. The '_order' attribute decides the sort order of the plugin. The default filters have orders between 1 and 2. Plugins have order 0 by default. Plugins with equal orders are sorted by class name.""" _order = 0.0 active = False def filter(self, original_filename, value): return value def filter_list(self, origs, names): return map(self.filter, origs, names) def __cmp__(self, other): return (cmp(self._order, other._order) or cmp(type(self).__name__, type(other).__name__)) class TagsFromPathPlugin(object): """Plugins of this type must subclass a GTK widget. They will be packed into the TagsFromPath pane (currently a ScrolledWindow hidden with an expander, but that might change). The 'filter' function will be called with the tag and proposed value as a unicode object. It should return an appropriate-transformed filename, still as a unicode object. If you need to work on a set of filenames at once, you should instead overload the 'filter_list' function, which takes two lists; one of original filenames, the other of proposed new filenames. The default filter_list function calls filter on each item. The plugin must provide either a 'changed' or 'preview'. 'preview' causes the entire display to be re-previewed. 'changed' causes the Preview button to made sensitive, and Save to be disabled. If the 'active' attribute is false, the filter will not be called. This is particularly useful for gtk.CheckButtons. The '_order' attribute decides the sort order of the plugin. The default filters have orders between 1 and 2. Plugins have order 0 by default. Plugins with equal orders are sorted by class name.""" _order = 0 active = False def filter(self, tag, value): return value def __cmp__(self, other): return (cmp(self._order, other._order) or cmp(type(self).__name__, type(other).__name__)) class EditTagsPlugin(Gtk.ImageMenuItem): """Plugins of this type are subclasses of gtk.ImageMenuItem. They will be added to the context menu of the EditTags tree view. The 'tags' attribute is a list of tags this plugin should appear on, or false if it should appear for all tags. This must be a class attribute, as it is checked before instantiation. The 'needs' attribute is a list of tags that must be editable in the currently selected songs for the plugin to be sensitive. The constructor is called with the tag and value for that row. This can be used to set the sensitivity of the menu item, or change its text. When clicked, the 'activated' function is called on the object, again with the tag name and value. It should return a list of (tag, value) tuples to replace the previous tag/value with. The '_order' attribute decides the sort order of the plugin. The default items have orders between 0 and 1. Plugins have order 2.0 by default. Plugins with equal orders are sorted by class name. How to Handle Submenus ---------------------- If the menu item is given a submenu, magic happens. In particular, the callbacks are proxied to the submenu's items, and are attached, via connect_object, to make sure activated is called on the original item. So, to handle submenus, 1. Make a submenu and attach it to your menu item.2 2. To each item in the submenu, attach its 'activate' signal to something appropriate to prepare the original item's activated method, 3. Because that method will be called after the subitem is clicked on, and your activate handler runs. """ tags = [] needs = [] _order = 2.0 def activated(self, tag, value): return [(tag, value)] def connect(self, signal, callback, *args, **kwargs): if self.get_submenu(): for item in self.get_submenu().get_children(): connect_obj(item, signal, callback, self, *args, **kwargs) else: super(EditTagsPlugin, self).connect( signal, callback, *args, **kwargs) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/plugins/__init__.py�������������������������������������������������������0000644�0001750�0001750�00000041404�13112005742�021522� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 - 2014 Christoph Reiter, Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet import config from quodlibet import util from quodlibet.util.modulescanner import ModuleScanner from quodlibet.util.dprint import print_d from quodlibet.util.config import ConfigProxy from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.compat import itervalues, iteritems, listkeys, string_types def init(folders=None, disable_plugins=False): """folders: list of paths to look for plugins disable_plugins: disables all plugins, but does not forget which plugins are enabled. """ if disable_plugins: folders = [] manager = PluginManager.instance = PluginManager(folders) return manager def quit(): PluginManager.instance.save() PluginManager.instance.quit() PluginManager.instance = None class PluginImportException(Exception): desc = "" def __init__(self, desc, *args, **kwargs): super(PluginImportException, self).__init__(desc) self.desc = desc def should_show(self): """If the error description should be shown to the user""" return True class PluginNotSupportedError(PluginImportException): """To hide the plugin (e.g. on Windows)""" def __init__(self, msg=None): msg = "not supported: %s" % (msg or "unknown reason") super(PluginNotSupportedError, self).__init__(msg) def should_show(self): return False class MissingModulePluginException(PluginImportException): """Consistent Exception for reporting missing modules for plugins""" def __init__(self, module_name): msg = (_("Couldn't find module '{module}'. Perhaps you need to " "install the package?").format(module=module_name)) super(MissingModulePluginException, self).__init__(msg) class MissingGstreamerElementPluginException(PluginImportException): """Consistent Exception for reporting missing Gstreamer elements for plugins""" def __init__(self, element_name): msg = (_("Couldn't find GStreamer element '{element}'.") .format(element=element_name)) super(MissingGstreamerElementPluginException, self).__init__(msg) def migrate_old_config(): active = [] old_keys = ["songsmenuplugins", "eventplugins", "editingplugins", "playorderplugins"] for key in old_keys: key = "active_" + key try: active.extend(config.get("plugins", key).splitlines()) except config.Error: pass else: config._config.remove_option("plugins", key) if active: config.set("plugins", "active_plugins", "\n".join(active)) def list_plugins(module): """Return all objects of the module that satisfy the basic plugin needs: id, name and don't start with '_' If '__all__' is defined, only plugins in '__all__' will be loaded. """ try: objs = [getattr(module, attr) for attr in module.__all__] except AttributeError: objs = [getattr(module, attr) for attr in vars(module) if not attr.startswith("_")] ok = [] for obj in objs: if hasattr(obj, "PLUGIN_ID"): if not hasattr(obj, "PLUGIN_NAME"): obj.PLUGIN_NAME = obj.PLUGIN_ID ok.append(obj) return ok class PluginModule(object): def __init__(self, name, module): self.name = name self.module = module self.plugins = [Plugin(cls) for cls in list_plugins(module)] class Plugin(object): def __init__(self, plugin_cls): self.cls = plugin_cls self.handlers = [] self.instance = None def __repr__(self): return "<%s id=%r name=%r>" % (type(self).__name__, self.id, self.name) @property def can_enable(self): return getattr(self.cls, "PLUGIN_CAN_ENABLE", True) @property def id(self): return self.cls.PLUGIN_ID @property def name(self): return self.cls.PLUGIN_NAME @property def description(self): return getattr(self.cls, "PLUGIN_DESC", None) @property def tags(self): tags = getattr(self.cls, "PLUGIN_TAGS", []) if isinstance(tags, string_types): tags = [tags] return tags @property def icon(self): return getattr(self.cls, "PLUGIN_ICON", None) def get_instance(self): """A singleton""" if not getattr(self.cls, "PLUGIN_INSTANCE", False): return if self.instance is None: try: obj = self.cls() except: util.print_exc() return self.instance = obj return self.instance class PluginHandler(object): """A plugin handler can choose to handle plugins, as well as control their enabled state.""" def plugin_handle(self, plugin): """Returns `True` IFF this handler can handle `plugin`""" raise NotImplementedError def plugin_enable(self, plugin): """Called to enable / register `plugin`""" raise NotImplementedError def plugin_disable(self, plugin): """Called to disable / de-register `plugin`""" raise NotImplementedError class PluginManager(object): """ The manager takes care of plugin loading/reloading. Interested plugin handlers can register them self to get called when plugins get enabled or disabled. Plugins get exposed when at least one handler shows interest in them (by returning True in the handle method). Plugins have to be a class which defines PLUGIN_ID, PLUGIN_NAME. Plugins that have a true PLUGIN_INSTANCE attribute get instantiated on enable and the enabled/disabled methods get called. If plugin handlers want a plugin instance, they have to call Plugin.get_instance() to get a singleton. handlers need to implement the following methods: handler.plugin_handle(plugin) Needs to return True if the handler should be called whenever the plugin's enabled status changes. handler.plugin_enable(plugin) Gets called if the plugin gets enabled. handler.plugin_disable(plugin) Gets called if the plugin gets disabled. Should remove all references. """ CONFIG_SECTION = "plugins" CONFIG_OPTION = "active_plugins" instance = None # default instance def __init__(self, folders=None): """folders is a list of paths that will be scanned for plugins. Plugins in later paths will be preferred if they share a name. """ super(PluginManager, self).__init__() if folders is None: folders = [] self.__scanner = ModuleScanner(folders) self.__modules = {} # name: PluginModule self.__handlers = [] # handler list self.__enabled = set() # (possibly) enabled plugin IDs self.__restore() def rescan(self): """Scan for plugin changes or to initially load all plugins""" print_d("Rescanning..") removed, added = self.__scanner.rescan() # remember IDs of enabled plugin that get reloaded, so we can enable # them again reload_ids = [] for name in removed: if name not in added: continue mod = self.__modules[name] for plugin in mod.plugins: if self.enabled(plugin): reload_ids.append(plugin.id) for name in removed: # share the namespace with ModuleScanner for now self.__remove_module(name) # restore enabled state self.__enabled.update(reload_ids) for name in added: new_module = self.__scanner.modules[name] self.__add_module(name, new_module.module) print_d("Rescanning done.") @property def _modules(self): return itervalues(self.__scanner.modules) @property def _plugins(self): """All registered plugins""" plugins = [] for module in itervalues(self.__modules): for plugin in module.plugins: plugins.append(plugin) return plugins @property def plugins(self): """Returns a list of plugins with active handlers""" return [p for p in self._plugins if p.handlers] def register_handler(self, handler): """ Registers a handler, attaching it to any current plugins it advertises that it can handle `handler` should probably be a `PluginHandler` """ print_d("Registering handler: %r" % type(handler).__name__) self.__handlers.append(handler) for plugin in self._plugins: if not handler.plugin_handle(plugin): continue if plugin.handlers: plugin.handlers.append(handler) if self.enabled(plugin): handler.plugin_enable(plugin) else: plugin.handlers.append(handler) if self.enabled(plugin): self.enable(plugin, True, force=True) def save(self): print_d("Saving plugins: %d active" % len(self.__enabled)) config.set(self.CONFIG_SECTION, self.CONFIG_OPTION, "\n".join(self.__enabled)) def enabled(self, plugin): """Returns if the plugin is enabled.""" if not plugin.handlers: return False return plugin.id in self.__enabled def enable(self, plugin, status, force=False): """Enable or disable a plugin.""" if not force and self.enabled(plugin) == bool(status): return if not status: print_d("Disable %r" % plugin.id) for handler in plugin.handlers: handler.plugin_disable(plugin) self.__enabled.discard(plugin.id) instance = plugin.instance if instance and hasattr(instance, "disabled"): try: instance.disabled() except Exception: util.print_exc() else: print_d("Enable %r" % plugin.id) obj = plugin.get_instance() if obj and hasattr(obj, "enabled"): try: obj.enabled() except Exception: util.print_exc() for handler in plugin.handlers: handler.plugin_enable(plugin) self.__enabled.add(plugin.id) @property def failures(self): """module name: list of error message text lines""" errors = {} for name, error in iteritems(self.__scanner.failures): exception = error.exception if isinstance(exception, PluginImportException): if not exception.should_show(): continue errors[name] = [exception.desc] else: errors[name] = error.traceback return errors def quit(self): """Disable plugins and tell all handlers to clean up""" for name in listkeys(self.__modules): self.__remove_module(name) def __remove_module(self, name): plugin_module = self.__modules.pop(name) for plugin in plugin_module.plugins: if plugin.handlers: self.enable(plugin, False) def __add_module(self, name, module): plugin_mod = PluginModule(name, module) self.__modules[name] = plugin_mod for plugin in plugin_mod.plugins: handlers = [] for handler in self.__handlers: if handler.plugin_handle(plugin): handlers.append(handler) if handlers: plugin.handlers = handlers if self.enabled(plugin): self.enable(plugin, True, force=True) def __restore(self): migrate_old_config() active = config.get(self.CONFIG_SECTION, self.CONFIG_OPTION, "").splitlines() self.__enabled.update(active) print_d("Restoring plugins: %d" % len(self.__enabled)) for plugin in self._plugins: if self.enabled(plugin): self.enable(plugin, True, force=True) PM = PluginManager def plugin_enabled(plugin): """Returns true if the plugin is enabled (or "always" enabled)""" pm = PluginManager.instance enabled = pm.enabled(plugin) or not plugin.can_enable return enabled def get_config_option(plugin_cls, option): try: prefix = plugin_cls.CONFIG_SECTION except AttributeError: prefix = plugin_cls.PLUGIN_ID.lower().replace(" ", "_") return "%s_%s" % (prefix, option) class PluginConfig(ConfigProxy): """A proxy for a Config object that can be used by plugins. Provides some methods of the Config class but doesn't need a section and prefixes the config option name. """ def __init__(self, prefix, _config=None, _defaults=True): self._prefix = prefix if _config is None: _config = config._config super(PluginConfig, self).__init__( _config, PM.CONFIG_SECTION, _defaults) def _new_defaults(self, real_default_config): return PluginConfig(self._prefix, real_default_config, False) def _option(self, name): return "%s_%s" % (self._prefix, name) def ConfigCheckButton(self, label, option, **kwargs): return ConfigCheckButton(label, PM.CONFIG_SECTION, self._option(option), **kwargs) class PluginConfigMixin(object): """ Mixin for storage and editing of plugin config in a standard way Will use `CONFIG_SECTION`, if defined, for storing config, otherwise, it will base the keys on `PLUGIN_ID`. """ @classmethod def _config_key(cls, name): return get_config_option(cls, name) @classmethod def config_get(cls, name, default=""): """Gets a config string value for this plugin""" return config.get(PM.CONFIG_SECTION, cls._config_key(name), default) @classmethod def config_set(cls, name, value): """Saves a config string value for this plugin""" try: config.set(PM.CONFIG_SECTION, cls._config_key(name), value) except config.Error: print_d("Couldn't set config item '%s' to %r" % (name, value)) @classmethod def config_get_bool(cls, name, default=False): """Gets a config boolean for this plugin""" return config.getboolean(PM.CONFIG_SECTION, cls._config_key(name), default) def config_entry_changed(self, entry, key): """React to a change in an gtk.Entry (by saving it to config)""" if entry.get_property('sensitive'): self.config_set(key, entry.get_text()) @classmethod def ConfigCheckButton(cls, label, name, default=False): """ Create a new `ConfigCheckButton` for `name`, pre-populated correctly """ option = cls._config_key(name) try: config.getboolean(PM.CONFIG_SECTION, option) except config.Error: cls.config_set(name, default) return ConfigCheckButton(label, PM.CONFIG_SECTION, option, populate=True) class ConfProp(object): def __init__(self, conf, name, default): self._conf = conf self._name = name self._conf.defaults.set(name, default) def __get__(self, *args, **kwargs): return self._conf.get(self._name) def __set__(self, obj, value): self._conf.set(self._name, value) class BoolConfProp(ConfProp): def __get__(self, *args, **kwargs): return self._conf.getboolean(self._name) class IntConfProp(ConfProp): def __get__(self, *args, **kwargs): return self._conf.getint(self._name) class FloatConfProp(ConfProp): def __get__(self, *args, **kwargs): return self._conf.getfloat(self._name) def str_to_color_tuple(s): """Raises ValueError""" lst = [float(p) for p in s.split()] while len(lst) < 4: lst.append(0.0) return tuple(lst) def color_tuple_to_str(t): return " ".join(map(str, t)) class ColorConfProp(ConfProp): def __init__(self, conf, name, default): self._conf = conf self._name = name self._conf.defaults.set(name, color_tuple_to_str(default)) def __get__(self, *args, **kwargs): s = self._conf.get(self._name) try: return str_to_color_tuple(s) except ValueError: return str_to_color_tuple(self._conf.defaults.get(self._name)) def __set__(self, obj, value): self._conf.set(self._name, color_tuple_to_str(value)) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/plugins/gui.py������������������������������������������������������������0000644�0001750�0001750�00000004074�13112005742�020551� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2014, 2016 Nick Boultbee # 2015 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import config from quodlibet.qltk import get_menu_item_top_parent from quodlibet.qltk import Icons from gi.repository import Gtk class MenuItemPlugin(Gtk.ImageMenuItem): """ A base plugin that appears in a menu, typically. During plugin callbacks, `self.plugin_window` will be available. This is the `Gtk.Window` that the plugin was invoked from. It provides access to two important widgets, `self.plugin_window.browser` and `self.plugin_window.songlist`. """ MAX_INVOCATIONS = config.getint("plugins", "default_max_invocations", 30) """An upper limit on how many instances of the plugin should be launched at once without warning. Heavyweight plugins should override this value to prevent users killing their performance by opening on many songs.""" REQUIRES_ACTION = False """This plugin will run a user interface first (e.g. dialog) requiring action from the user. The menu entry may be altered accordingly""" def __init__(self): label = self.PLUGIN_NAME + ("…" if self.REQUIRES_ACTION else "") super(Gtk.ImageMenuItem, self).__init__(label=label) self.__set_icon() self.__initialized = True @property def plugin_window(self): return get_menu_item_top_parent(self) def __set_icon(self): """Sets the GTK icon for this plugin item""" icon = getattr(self, "PLUGIN_ICON", Icons.SYSTEM_RUN) image = Gtk.Image.new_from_icon_name(icon, Gtk.IconSize.MENU) self.set_always_show_image(True) self.set_image(image) @property def initialized(self): # If the GObject __init__ method is bypassed, it can cause segfaults. # This explicitly prevents a bad plugin from taking down the app. return self.__initialized ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/plugins/cover.py����������������������������������������������������������0000644�0001750�0001750�00000013537�13112005742�021107� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Simonas Kazlauskas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from os import path, makedirs from hashlib import sha1 from gi.repository import GObject from quodlibet.qltk import Icons from quodlibet.util.path import escape_filename, xdg_get_cache_home from quodlibet.util import print_w class CoverSourcePlugin(GObject.Object): """ Plugins that given a song should provide a cover art. The plugin should override following methods and properties: @staticmethod priority() @property cover_path(self) fetch_cover(self) Refer to default function implementation's documentation in order to understand their role. """ __gsignals__ = { 'fetch-success': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'fetch-failure': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'search-complete': (GObject.SignalFlags.RUN_LAST, None, (object,)) } PLUGIN_ICON = Icons.EMBLEM_DOWNLOADS embedded = False """Whether the source is an embedded one""" def __init__(self, song, cancellable=None): self.song = song self.cancellable = cancellable super(CoverSourcePlugin, self).__init__() @classmethod def group_by(cls, song): """Returns a hashable for a song, for grouping songs in groups where only one song per group needs to be searched. Grouping might reduce the chance of finding covers in exchange for performance. This default implementation gives one group for all songs. """ return @staticmethod def priority(): """ Should return float in range [0.0, 1.0] suggesting priority of the cover source. Whether value returned by this method is respected or not is not guaranteed. As a rule of thumb, source's reliability and quality should be compared with other sources and given score between two sources that come close in quality and reliability. There's a table of value ranges sources should respect: * (0.7, 1.0] - local covers; * (0.4, 0.7] - accurate (> 99%) source of high quality (>= 200x200) covers; * (0.2, 0.4] - accurate (> 99%) source of low quality (< 200x200) covers; * (0.0, 0.2] - not very accurate (<= 99%) source of covers, even if they're high quality; * 0.0 - reserved for the fallback cover source. """ return 0.0 @property def cover_directory(self): return cover_dir @property def cover_filename(self): """ Return the filename of the cover which hopefully should not change between songs in the same album and still be unique enough to uniquely identify most (or even better – all) of the albums. The string returned must not contain any characters illegal in most common filesystems. These include /, ?, <, >, \, :, *, |, ” and ^. Staying in the bounds of ASCII is highly encouraged. Perchance the song lacks data to generate the filename of cover for this provider, None shall be returned. """ key = sha1() # Should be fine as long as the same interpreter is used. data = repr(self.song.album_key) if not isinstance(data, bytes): data = data.encode("utf-8") key.update(data) return escape_filename(key.hexdigest()) @property def cover_path(self): """ Should return the path where cover is expected to be cached. The location should be based in common cache location available in variable `cover_dir` of this module. It doesn't necessarily mean the cover is actually at the returned location neither that it will be stored there at any later time. """ return path.join(self.cover_directory, self.cover_filename) @property def cover(self): """ Method to get cover file from cover provider for a specific song. Should always return a file-like object opened as read-only if any and None otherwise. """ cp = self.cover_path try: return open(cp, 'rb') if cp and path.isfile(cp) else None except IOError: print_w('Failed reading album art "%s"'.format(path)) def search(self): """ Start searching for cover art from a source. After search is completed the `search-complete` event must be emitted regardless of search outcome with a list of dictionaries containing `album`, `artist` and `cover` keys as an argument. If search was unsuccessful, empty list should be returned. By convention better quality and more accurate covers are expected to appear first in the list. """ self.emit('search-complete', []) def fetch_cover(self): """ Method to ask source fetch the cover from its source into location at `self.cover_path`. If this method succeeds in putting the image from its source into `self.cover_path`, `fetch-success` signal shall be emitted and `fetch-failure` otherwise. Return value of this function doesn't have any meaning whatsoever. """ self.fail('This source is incapable of fetching covers') def fail(self, message): """ Shorthand method for emitting `fetch-failure` signals. Most common use pattern would be: return self.fail("Failure message") """ self.emit('fetch-failure', message) cover_dir = path.join(xdg_get_cache_home(), 'quodlibet', 'covers') try: makedirs(cover_dir) except OSError: pass �����������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/plugins/query.py����������������������������������������������������������0000644�0001750�0001750�00000005025�13112005742�021127� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- encoding: utf-8 -*- # Copyright 2016 Ryan Dellenbaugh # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.plugins import PluginHandler, PluginManager from quodlibet.qltk import Icons class QueryPlugin(object): """ Query plugins provide extensions to the search query syntax used in '@' queries, like '@(name: body)' The plugin must provide the search instance method: self.search(song, body) This method is passed a song and the query body and should return a boolean value indicating whether the song matches the query for the given query body. The song argument will be an instance of quodlibet.formats.Audiofile, implementing a dict interface for retrieving tags. The body argument will be the query body as a string, or None if the query contained no body. If the self.parse_body method is implemented, it will instead be the value returned from that. The plugin may optionally provide the parse_body method: self.parse_body(body) This method will be called once, when the query is parsed, with the body string from the query, or None if the query contained no body. It should return a value representing the parsed body, to be used in self.search. If the provided body is invalid, the method may raise a QueryPluginError to indicate that all matches should fail. In this case search will not be called. By default, the name used in the '@(name)' query to use the plugin is the PLUGIN_NAME attribute. However, this can be changed by overriding the 'key' attribute to a different string to be used. """ search = None key = None PLUGIN_ICON = Icons.EDIT_FIND def parse_body(self, body): return body class QueryPluginError(Exception): pass class QueryPluginHandler(PluginHandler): """Maintains a dictionary of enabled Query Plugins by key""" def init_plugins(self): PluginManager.instance.register_handler(self) def __init__(self): self.plugins = {} def plugin_handle(self, plugin): return issubclass(plugin.cls, QueryPlugin) def plugin_enable(self, plugin): self.plugins[plugin.cls.key or plugin.name] = plugin.cls() def plugin_disable(self, plugin): del self.plugins[plugin.cls.key or plugin.name] def get_plugin(self, key): return self.plugins[key] QUERY_HANDLER = QueryPluginHandler() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/plugins/playlist.py�������������������������������������������������������0000644�0001750�0001750�00000017775�13112005742�021642� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013-2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import ngettext, _ from quodlibet.qltk import get_top_parent, get_menu_item_top_parent from quodlibet.qltk.msg import WarningMessage from quodlibet.qltk.x import SeparatorMenuItem from quodlibet.qltk import Icons from quodlibet.util import print_exc, format_int_locale from quodlibet.util.dprint import print_d, print_e from quodlibet.plugins import PluginHandler, PluginManager from quodlibet.plugins.gui import MenuItemPlugin class ConfirmMultiPlaylistInvoke(WarningMessage): """Dialog to confirm invoking a plugin with X playlists in case X is high """ RESPONSE_INVOKE = 1 def __init__(self, parent, plugin_name, count): params = {"name": plugin_name, "count": format_int_locale(count)} title = ngettext("Run the plugin \"%(name)s\" on %(count)s playlist?", "Run the plugin \"%(name)s\" on %(count)s playlists?", count) % params super(ConfirmMultiPlaylistInvoke, self).__init__( get_top_parent(parent), title, "", buttons=Gtk.ButtonsType.NONE) self.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.add_icon_button( _("_Run Plugin"), Icons.SYSTEM_RUN, self.RESPONSE_INVOKE) self.set_default_response(Gtk.ResponseType.CANCEL) @classmethod def confirm(cls, parent, plugin_name, count): """Returns if the action was confirmed""" resp = cls(parent, plugin_name, count).run() return resp == cls.RESPONSE_INVOKE class PlaylistPlugin(MenuItemPlugin): """ Playlist plugins are much like songsmenu plugins, and provide one or more of the following instance methods: self.plugin_single_playlist(playlist) self.plugin_playlist(song) self.plugin_playlists(songs) All matching provided callables on a single object are called in the above order if they match until one returns a true value. The `single_` variant is only called if a single song/album is selected. The singular version is called once for each selected playlist, but the plural version is called with a list of playlists. Returning `True` from these signifies a change was made and the UI / library should update; otherwise this isn't guaranteed. Currently (01/2016) only the singular forms are actually supported in the UI, but this won't always be the case. To make your plugin insensitive if unsupported playlists are selected, a method that takes a list of songs and returns True or False to set the sensitivity of the menu entry: self.plugin_handles(playlists) All of this is managed by the constructor, so make sure it gets called if you override it (you shouldn't have to). Note: If inheriting both `PlaylistPlugin` and `SongsMenuPlugin`, it (currently) needs to be done in that order. """ plugin_single_playlist = None plugin_playlist = None plugin_playlists = None def __init__(self, playlists=None, library=None): super(PlaylistPlugin, self).__init__() self._library = library self._playlists = playlists or [] self.set_sensitive(bool(self.plugin_handles(playlists))) def plugin_handles(self, playlists): return True class PlaylistPluginHandler(PluginHandler): """Handles PlaylistPlugins""" def init_plugins(self): PluginManager.instance.register_handler(self) def __init__(self, confirmer=None): """Takes an optional `confirmer`, mainly for testing""" self.__plugins = [] self._confirm_multiple = (confirmer or ConfirmMultiPlaylistInvoke.confirm) def populate_menu(self, menu, library, browser, playlists): """Appends items onto `menu` for each enabled playlist plugin, separated as necessary. """ attrs = ['plugin_playlist', 'plugin_playlists'] if len(playlists) == 1: attrs.append('plugin_single_playlist') items = [] kinds = self.__plugins kinds.sort(key=lambda plugin: plugin.PLUGIN_ID) print_d("Found %d Playlist plugin(s): %s" % (len(kinds), kinds)) for Kind in kinds: usable = any([callable(getattr(Kind, s)) for s in attrs]) if usable: try: items.append(Kind(playlists=playlists, library=library)) except: print_e("Couldn't initialise playlist plugin %s: " % Kind) print_exc() items = [i for i in items if i.initialized] if items: menu.append(SeparatorMenuItem()) for item in items: try: menu.append(item) args = (library, browser, playlists) if item.get_submenu(): for subitem in item.get_submenu().get_children(): subitem.connect( 'activate', self.__on_activate, item, *args) else: item.connect( 'activate', self.__on_activate, item, *args) except: print_exc() item.destroy() def handle(self, plugin_id, library, browser, playlists): """Start a plugin directly without a menu""" for plugin in self.__plugins: if plugin.PLUGIN_ID == plugin_id: try: plugin = plugin(playlists, library) except Exception: print_exc() else: parent = get_top_parent(browser) self.__handle(plugin, library, browser, playlists, parent) return def __on_activate(self, item, plugin, library, browser, playlists): parent = get_menu_item_top_parent(item) self.__handle(plugin, library, browser, playlists, parent) def __handle(self, plugin, library, browser, playlists, parent): if len(playlists) == 0: return if (len(playlists) == 1 and callable(plugin.plugin_single_playlist)): pl = playlists[0] try: ret = plugin.plugin_single_playlist(pl) except Exception: print_exc() else: if ret: print_d("Updating %s" % pl) browser.changed(pl) browser.activate() return if callable(plugin.plugin_playlist): total = len(playlists) if total > plugin.MAX_INVOCATIONS: if not self._confirm_multiple( parent, plugin.PLUGIN_NAME, total): return try: ret = map(plugin.plugin_playlist, playlists) if ret: for update, pl in zip(ret, playlists): if update: print_d("Updating %s" % pl) browser.changed(pl) browser.activate() except Exception: print_exc() else: if any(ret): return if callable(plugin.plugin_playlists): try: if plugin.plugin_playlists(playlists): browser.activate() except Exception: print_exc() for pl in playlists: browser.changed(pl) def plugin_handle(self, plugin): return issubclass(plugin.cls, PlaylistPlugin) def plugin_enable(self, plugin): self.__plugins.append(plugin.cls) def plugin_disable(self, plugin): self.__plugins.remove(plugin.cls) # Single instance PLAYLIST_HANDLER = PlaylistPluginHandler() ���quodlibet-3.9.1/quodlibet/plugins/events.py���������������������������������������������������������0000644�0001750�0001750�00000010744�13112005742�021272� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2005 Michael Urman, Joe Wreschnig # 2014, 2017 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import GObject from quodlibet.util.dprint import print_e from quodlibet import util from quodlibet.plugins import PluginHandler from quodlibet.util.songwrapper import SongWrapper, ListWrapper from quodlibet.util.songwrapper import check_wrapper_changed from quodlibet.util import connect_obj from quodlibet.compat import itervalues class EventPlugin(object): """Plugins that run in the background and receive events. Event plugins, unlike other plugins, are instantiated on startup and the same instance is used even when the plugin is enabled or disabled. Methods `plugin_on_*` can be overridden to provide behaviour hooks """ def plugin_on_song_started(self, song): pass def plugin_on_song_ended(self, song, stopped): pass def plugin_on_added(self, songs): pass def plugin_on_changed(self, songs): pass def plugin_on_removed(self, songs): pass def plugin_on_paused(self): pass def plugin_on_unpaused(self): pass def plugin_on_seek(self, song, msec): pass def plugin_on_error(self, song, error): pass PLUGIN_INSTANCE = True def enabled(self): """Called when the plugin is enabled.""" pass def disabled(self): """Called when the plugin is disabled.""" pass def list_signal_names(type_): """List of supported signal names for a GType, instance or class""" type_ = getattr(type_, "__gtype__", type_) names = [] if not type_.is_instantiatable() and not type_.is_interface(): return names names.extend(GObject.signal_list_names(type_)) if type_.parent: names.extend(list_signal_names(type_.parent)) for iface in type_.interfaces: names.extend(list_signal_names(iface)) return names def _map_signals(obj, prefix="plugin_on_", blacklist=None): sigs = list_signal_names(obj) if blacklist is None: blacklist = [] sigs = [s for s in sigs if s not in blacklist] sigs = [(s, prefix + s.replace('-', '_')) for s in sigs] return sigs class EventPluginHandler(PluginHandler): def __init__(self, librarian=None, player=None): if librarian: sigs = _map_signals(librarian, blacklist=("notify",)) for event, handle in sigs: def handler(librarian, *args): self.__invoke(librarian, args[-1], *args[:-1]) librarian.connect(event, handler, event) if librarian and player: sigs = _map_signals(player, blacklist=("notify",)) for event, handle in sigs: def cb_handler(librarian, *args): self.__invoke(librarian, args[-1], *args[:-1]) connect_obj(player, event, cb_handler, librarian, event) self.__plugins = {} def __invoke(self, librarian, event, *args): args = list(args) if args and args[0]: if isinstance(args[0], dict): args[0] = SongWrapper(args[0]) elif isinstance(args[0], (set, list)): args[0] = ListWrapper(args[0]) for plugin in itervalues(self.__plugins): method_name = 'plugin_on_' + event.replace('-', '_') handler = getattr(plugin, method_name, None) def overridden(obj, name): return name in type(obj).__dict__ if overridden(plugin, method_name): try: handler(*args) except Exception: print_e("Error during %s on %s" % (method_name, type(plugin))) util.print_exc() if event not in ["removed", "changed"] and args: from quodlibet import app songs = args[0] if not isinstance(songs, (set, list)): songs = [songs] songs = filter(None, songs) check_wrapper_changed(librarian, app.window, songs) def plugin_handle(self, plugin): return issubclass(plugin.cls, EventPlugin) def plugin_enable(self, plugin): self.__plugins[plugin.cls] = plugin.get_instance() def plugin_disable(self, plugin): self.__plugins.pop(plugin.cls) ����������������������������quodlibet-3.9.1/quodlibet/plugins/gstelement.py�����������������������������������������������������0000644�0001750�0001750�00000002464�13112005742�022135� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation class GStreamerPlugin(object): """GStreamer Plugins define an element that gets inserted into the GStreamer pipeline before the audio sink and after the playbin. The method setup_element should return a new element instance or None: self.setup_element() One optional method can be implemented: self.update_element(element) update_element should apply all settings and will be called after queue_update or on pipeline creation etc. All plugin elements will be sorted by their priority attribute (higher priority elements come first) To notify setting changes, call queue_update. """ PLUGIN_ICON = "audio-volume-high" _handler = None priority = 0 @classmethod def setup_element(cls): """Return a new element instance or None""" return None @classmethod def update_element(cls, element): """Apply settings to the instance""" pass @classmethod def queue_update(cls): """Call if you want to update settings""" cls._handler._queue_update(cls) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/plugins/playorder.py������������������������������������������������������0000644�0001750�0001750�00000004103�13112005742�021757� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 Joe Wreschnig # 2016-17 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import quodlibet.qltk.playorder class PlayOrderPlugin(quodlibet.qltk.playorder.Order): """Play order plugins define alternate play orders for Quod Libet, of the two types: Reorder (aka Shuffle) and Repeat. Implementations must choose to subclass `RepeatPlugin` or `ShufflePlugin`. They appear, when enabled, in the combo boxes in the lower left of the main window, as well as in the tray icon context menu. If explicit "next song" button presses should be handled differently than reaching the end of a song, use: def next_implicit(self, playlist, iter): ... def next_explicit(self, playlist, iter): ... def previous_explicit(self, playlist, iter): ... def previous_implicit(self, playlist, iter): ... """ # Note these values unset the base versions, as the plugin handler logic # does some auto-setting of these, based on PLUGIN_NAME, if they're None name = None display_name = None accelerated_name = None priority = 200 """Plugins default to lower priority than built-ins""" class RepeatPlugin(PlayOrderPlugin, quodlibet.qltk.playorder.Repeat): """Repeat plugins add new ways to repeat an existing, possibly shuffled playlist. Note that they must delegate to the underlying `Order` (typically a `Reorder`) in order for the UI to function as intended. As such, the only method necessary to implement from `Repeat` is def next(self, playlist, iter): ... """ pass class ShufflePlugin(PlayOrderPlugin, quodlibet.qltk.playorder.Reorder): """Shuffle plugins add new ways to reorder a given song list Shuffle / plugins must define at least two missing methods from `Reorder`, i.e. def next(self, playlist, iter): ... def previous(self, playlist, iter): ... """ pass �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/build.py������������������������������������������������������������������0000644�0001750�0001750�00000001072�13112005742�017376� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2016 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation """This file gets edited at build time to add build specific data""" BUILD_TYPE = u"default" """Either 'windows', 'windows-portable', 'osx-quodlibet', 'osx-exfalso' or 'default'""" BUILD_INFO = u"" """Additional build info like git revision etc""" BUILD_VERSION = 0 """1.2.3 with a BUILD_VERSION of 1 results in 1.2.3.1""" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017217� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/xinebe/������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020471� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/xinebe/cdefs.py����������������������������������������������������0000644�0001750�0001750�00000021626�13112005742�022140� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006 Lukas Lalinsky # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys import ctypes from quodlibet.util import load_library try: _libxine, name = load_library(["libxine.so.2", "libxine.so.1"]) except OSError as e: raise ImportError(e) if name.endswith("2"): _version = 2 else: _version = 1 class xine_event_t(ctypes.Structure): if _version == 1: _fields_ = [ ('type', ctypes.c_int), ('stream', ctypes.c_void_p), ('data', ctypes.c_void_p), ('data_length', ctypes.c_int), ] elif _version == 2: _fields_ = [ ('stream', ctypes.c_void_p), ('data', ctypes.c_void_p), ('data_length', ctypes.c_int), ('type', ctypes.c_int), ] class xine_ui_message_data_t(ctypes.Structure): _fields_ = [ ('compatibility_num_buttons', ctypes.c_int), ('compatibility_str_len', ctypes.c_int), ('compatibility_str', 256 * ctypes.c_char), ('type', ctypes.c_int), ('explanation', ctypes.c_int), ('num_parameters', ctypes.c_int), ('parameters', ctypes.c_void_p), ('messages', ctypes.c_char), ] # event listener callback type xine_event_listener_cb_t = ctypes.CFUNCTYPE( ctypes.c_void_p, ctypes.c_void_p, ctypes.POINTER(xine_event_t)) # event types XINE_EVENT_UI_PLAYBACK_FINISHED = 1 XINE_EVENT_UI_CHANNELS_CHANGED = 2 XINE_EVENT_UI_SET_TITLE = 3 XINE_EVENT_UI_MESSAGE = 4 XINE_EVENT_FRAME_FORMAT_CHANGE = 5 XINE_EVENT_AUDIO_LEVEL = 6 XINE_EVENT_QUIT = 7 XINE_EVENT_PROGRESS = 8 # stream parameters XINE_PARAM_SPEED = 1 # see below XINE_PARAM_AV_OFFSET = 2 # unit: 1/90000 ses XINE_PARAM_AUDIO_CHANNEL_LOGICAL = 3 # -1 => auto, -2 => off XINE_PARAM_SPU_CHANNEL = 4 XINE_PARAM_VIDEO_CHANNEL = 5 XINE_PARAM_AUDIO_VOLUME = 6 # 0..100 XINE_PARAM_AUDIO_MUTE = 7 # 1=>mute, 0=>unmute XINE_PARAM_AUDIO_COMPR_LEVEL = 8 # <100=>off, % compress otherw XINE_PARAM_AUDIO_AMP_LEVEL = 9 # 0..200, 100=>100% (default) XINE_PARAM_AUDIO_REPORT_LEVEL = 10 # 1=>send events, 0=> don't XINE_PARAM_VERBOSITY = 11 # control console output XINE_PARAM_SPU_OFFSET = 12 # unit: 1/90000 sec XINE_PARAM_IGNORE_VIDEO = 13 # disable video decoding XINE_PARAM_IGNORE_AUDIO = 14 # disable audio decoding XINE_PARAM_IGNORE_SPU = 15 # disable spu decoding XINE_PARAM_BROADCASTER_PORT = 16 # 0: disable, x: server port XINE_PARAM_METRONOM_PREBUFFER = 17 # unit: 1/90000 sec XINE_PARAM_EQ_30HZ = 18 # equalizer gains -100..100 XINE_PARAM_EQ_60HZ = 19 # equalizer gains -100..100 XINE_PARAM_EQ_125HZ = 20 # equalizer gains -100..100 XINE_PARAM_EQ_250HZ = 21 # equalizer gains -100..100 XINE_PARAM_EQ_500HZ = 22 # equalizer gains -100..100 XINE_PARAM_EQ_1000HZ = 23 # equalizer gains -100..100 XINE_PARAM_EQ_2000HZ = 24 # equalizer gains -100..100 XINE_PARAM_EQ_4000HZ = 25 # equalizer gains -100..100 XINE_PARAM_EQ_8000HZ = 26 # equalizer gains -100..100 XINE_PARAM_EQ_16000HZ = 27 # equalizer gains -100..100 XINE_PARAM_AUDIO_CLOSE_DEVICE = 28 # force closing audio device XINE_PARAM_AUDIO_AMP_MUTE = 29 # 1=>mute, 0=>unmute XINE_PARAM_FINE_SPEED = 30 # 1.000.000 => normal speed XINE_PARAM_EARLY_FINISHED_EVENT = 31 # send event when demux finish XINE_PARAM_GAPLESS_SWITCH = 32 # next stream only gapless swi XINE_PARAM_DELAY_FINISHED_EVENT = 33 # 1/10sec,0=>disable,-1=>forev # speeds XINE_SPEED_PAUSE = 0 XINE_SPEED_SLOW_4 = 1 XINE_SPEED_SLOW_2 = 2 XINE_SPEED_NORMAL = 4 XINE_SPEED_FAST_2 = 8 XINE_SPEED_FAST_4 = 16 # metadata XINE_META_INFO_TITLE = 0 XINE_META_INFO_COMMENT = 1 XINE_META_INFO_ARTIST = 2 XINE_META_INFO_GENRE = 3 XINE_META_INFO_ALBUM = 4 XINE_META_INFO_YEAR = 5 XINE_META_INFO_VIDEOCODEC = 6 XINE_META_INFO_AUDIOCODEC = 7 XINE_META_INFO_SYSTEMLAYER = 8 XINE_META_INFO_INPUT_PLUGIN = 9 # statuses XINE_STATUS_IDLE = 0 XINE_STATUS_STOP = 1 XINE_STATUS_PLAY = 2 XINE_STATUS_QUIT = 3 XINE_MSG_NO_ERROR = 0 # (messages to UI) XINE_MSG_GENERAL_WARNING = 1 # (warning message) XINE_MSG_UNKNOWN_HOST = 2 # (host name) XINE_MSG_UNKNOWN_DEVICE = 3 # (device name) XINE_MSG_NETWORK_UNREACHABLE = 4 # none XINE_MSG_CONNECTION_REFUSED = 5 # (host name) XINE_MSG_FILE_NOT_FOUND = 6 # (file name or mrl) XINE_MSG_READ_ERROR = 7 # (device/file/mrl) XINE_MSG_LIBRARY_LOAD_ERROR = 8 # (library/decoder) XINE_MSG_ENCRYPTED_SOURCE = 9 # none XINE_MSG_SECURITY = 10 # (security message) XINE_MSG_AUDIO_OUT_UNAVAILABLE = 11 # none XINE_MSG_PERMISSION_ERROR = 12 # (file name or mrl) XINE_MSG_FILE_EMPTY = 13 # file is empty XINE_MSG_AUTHENTICATION_NEEDED = 14 # (mrl, likely http); added in 1.2 # xine_t *xine_new(void) _libxine.xine_new.restype = ctypes.c_void_p # void xine_init(xine_t *self) _libxine.xine_init.argtypes = [ctypes.c_void_p] # void xine_exit(xine_t *self) _libxine.xine_exit.argtypes = [ctypes.c_void_p] # void xine_config_load(xine_t *self, const char *cfg_filename) _libxine.xine_config_load.argtypes = [ctypes.c_void_p, ctypes.c_char_p] # const char *xine_get_homedir(void) _libxine.xine_get_homedir.restype = ctypes.c_char_p # xine_audio_port_t *xine_open_audio_driver(xine_t *self, const char *id, # void *data) _libxine.xine_open_audio_driver.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_void_p] _libxine.xine_open_audio_driver.restype = ctypes.c_void_p # void xine_close_audio_driver(xine_t *self, xine_audio_port_t *driver) _libxine.xine_close_audio_driver.argtypes = [ctypes.c_void_p, ctypes.c_void_p] # xine_stream_t *xine_stream_new(xine_t *self, # xine_audio_port_t *ao, xine_video_port_t *vo) _libxine.xine_stream_new.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p] _libxine.xine_stream_new.restype = ctypes.c_void_p # void xine_close(xine_sxine_event_create_listener_threadtream_t *stream) _libxine.xine_close.argtypes = [ctypes.c_void_p] # int xine_open (xine_stream_t *stream, const char *mrl) _libxine.xine_open.argtypes = [ctypes.c_void_p, ctypes.c_char_p] _libxine.xine_open.restype = ctypes.c_int # int xine_play(xine_stream_t *stream, int start_pos, int start_time) _libxine.xine_play.argtypes = [ctypes.c_void_p, ctypes.c_int, ctypes.c_int] _libxine.xine_play.restype = ctypes.c_int # void xine_stop(xine_stream_t *stream) _libxine.xine_stop.argtypes = [ctypes.c_void_p] # void xine_dispose(xine_stream_t *stream) _libxine.xine_dispose.argtypes = [ctypes.c_void_p] # xine_event_queue_t *xine_event_new_queue(xine_stream_t *stream) _libxine.xine_event_new_queue.argtypes = [ctypes.c_void_p] _libxine.xine_event_new_queue.restype = ctypes.c_void_p # void xine_event_dispose_queue(xine_event_queue_t *queue) _libxine.xine_event_dispose_queue.argtypes = [ctypes.c_void_p] # void xine_event_create_listener_thread(xine_event_queue_t *queue, # xine_event_listener_cb_t callback, # void *user_data) _libxine.xine_event_create_listener_thread.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p] _libxine.xine_usec_sleep.argtypes = [ctypes.c_int] _libxine.xine_set_param.argtypes = [ctypes.c_void_p, ctypes.c_int, ctypes.c_int] _libxine.xine_get_param.argtypes = [ctypes.c_void_p, ctypes.c_int] _libxine.xine_get_param.restype = ctypes.c_int _libxine.xine_get_meta_info.argtypes = [ctypes.c_void_p, ctypes.c_int] _libxine.xine_get_meta_info.restype = ctypes.c_char_p _libxine.xine_get_status.argtypes = [ctypes.c_void_p] _libxine.xine_get_status.restype = ctypes.c_int _libxine.xine_get_pos_length.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int)] _libxine.xine_get_version_string.restype = ctypes.c_char_p _libxine.xine_get_file_extensions.argtypes = [ctypes.c_void_p] _libxine.xine_get_file_extensions.restype = ctypes.c_char_p _libxine.xine_get_mime_types.argtypes = [ctypes.c_void_p] _libxine.xine_get_mime_types.restype = ctypes.c_char_p _libxine.xine_list_input_plugins.argtypes = [ctypes.c_void_p] _libxine.xine_list_input_plugins.restype = ctypes.POINTER(ctypes.c_char_p) _libxine.xine_check_version.argtypes = [ctypes.c_int, ctypes.c_int, ctypes.c_int] _libxine.xine_check_version.restype = ctypes.c_int # copy functions from the library module = sys.modules[__name__] for name in dir(_libxine): if name.startswith('xine_'): setattr(module, name, getattr(_libxine, name)) _callbacks = [] def xine_event_create_listener_thread(queue, callback, user_data): cb = xine_event_listener_cb_t(callback) _callbacks.append(cb) _libxine.xine_event_create_listener_thread(queue, cb, user_data) def xine_get_pos_length(stream): _pos_stream = ctypes.c_int() _pos_time = ctypes.c_int() _length_time = ctypes.c_int() result = _libxine.xine_get_pos_length(stream, ctypes.byref(_pos_stream), ctypes.byref(_pos_time), ctypes.byref(_length_time)) if result: return _pos_stream.value, _pos_time.value, _length_time.value else: return 0, 0, 0 ����������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/xinebe/player.py���������������������������������������������������0000644�0001750�0001750�00000027520�13112005742�022347� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2006-2007 Lukas Lalinsky # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import GLib from quodlibet import _ from quodlibet import config from quodlibet.player import PlayerError from quodlibet.player._base import BasePlayer from quodlibet.util.string import decode from . import cdefs from .cdefs import XINE_PARAM_SPEED, XINE_PARAM_GAPLESS_SWITCH, xine_dispose, \ XINE_SPEED_PAUSE, xine_play, xine_close, xine_set_param, xine_get_param, \ xine_get_status, xine_open, xine_stop, XINE_PARAM_EARLY_FINISHED_EVENT, \ XINE_META_INFO_ARTIST, xine_ui_message_data_t, XINE_EVENT_UI_SET_TITLE, \ XINE_PARAM_AUDIO_AMP_MUTE, XINE_PARAM_AUDIO_AMP_LEVEL, xine_new, \ XINE_EVENT_UI_PLAYBACK_FINISHED, xine_event_dispose_queue, xine_init, \ XINE_PARAM_IGNORE_VIDEO, XINE_PARAM_IGNORE_SPU, xine_config_load, \ xine_check_version, xine_get_homedir, xine_list_input_plugins, xine_exit, \ xine_open_audio_driver, xine_close_audio_driver, XINE_STATUS_PLAY, \ XINE_SPEED_NORMAL, xine_get_pos_length, XINE_MSG_NO_ERROR, \ XINE_EVENT_UI_MESSAGE, xine_get_meta_info, XINE_META_INFO_ALBUM, \ XINE_META_INFO_TITLE, xine_stream_new, xine_get_version_string, \ xine_event_new_queue, xine_event_create_listener_thread class XineHandle(object): def __init__(self): _xine = xine_new() xine_config_load(_xine, xine_get_homedir() + b"/.xine/config") xine_init(_xine) self._xine = _xine def list_input_plugins(self): """ Returns: List[text_type] """ plugins = [] for plugin in xine_list_input_plugins(self._xine): if not plugin: break plugins.append(decode(plugin)) return plugins def exit(self): xine_exit(self._xine) def open_audio_driver(self, identifier, data): return xine_open_audio_driver(self._xine, identifier, data) def close_audio_driver(self, driver): xine_close_audio_driver(self._xine, driver) def stream_new(self, audio_port, video_port): return xine_stream_new(self._xine, audio_port, video_port) class XinePlaylistPlayer(BasePlayer): """Xine playlist player.""" _paused = True def __init__(self, driver, librarian): """May raise PlayerError""" super(XinePlaylistPlayer, self).__init__() self.name = "xine" self.version_info = "xine-lib: " + decode(xine_get_version_string()) self._volume = 1.0 self._handle = XineHandle() self._supports_gapless = xine_check_version(1, 1, 1) == 1 self._event_queue = None self._new_stream(driver) self._librarian = librarian self._destroyed = False def _new_stream(self, driver): assert driver is None or isinstance(driver, bytes) self._audio_port = self._handle.open_audio_driver(driver, None) if not self._audio_port: raise PlayerError( _("Unable to create audio output"), _("The audio device %r was not found. Check your Xine " "settings in ~/.quodlibet/config.") % driver) self._stream = self._handle.stream_new(self._audio_port, None) xine_set_param(self._stream, XINE_PARAM_IGNORE_VIDEO, 1) xine_set_param(self._stream, XINE_PARAM_IGNORE_SPU, 1) self.update_eq_values() if self._supports_gapless: xine_set_param(self._stream, XINE_PARAM_EARLY_FINISHED_EVENT, 1) if self._event_queue: xine_event_dispose_queue(self._event_queue) self._event_queue = xine_event_new_queue(self._stream) xine_event_create_listener_thread(self._event_queue, self._event_listener, None) def _destroy(self): self._destroyed = True if self._stream: xine_close(self._stream) xine_dispose(self._stream) self._stream = None if self._event_queue: xine_event_dispose_queue(self._event_queue) if self._audio_port: self._handle.close_audio_driver(self._audio_port) self._handle.exit() def _playback_finished(self): if self._destroyed: return False self._source.next_ended() self._end(False, None, gapless=True) return False def _update_metadata(self): if self._destroyed: return False if not self.song or not self.song.multisong: return False if self.info is self.song: self.info = type(self.song)(self.song["~filename"]) self.info.multisong = False changed = False meta = [ (XINE_META_INFO_TITLE, 'title'), (XINE_META_INFO_ARTIST, 'artist'), (XINE_META_INFO_ALBUM, 'album'), ] for info, name in meta: text = xine_get_meta_info(self._stream, info) if not text: continue text = text.decode('UTF-8', 'replace') if self.info.get(name) != text: self.info[name] = text changed = True if changed: self.emit('song-started', self.info) if self._librarian is not None: self._librarian.changed([self.song]) return False def _event_listener(self, user_data, event): event = event.contents if event.type == XINE_EVENT_UI_PLAYBACK_FINISHED: GLib.idle_add(self._playback_finished, priority=GLib.PRIORITY_HIGH) elif event.type == XINE_EVENT_UI_SET_TITLE: GLib.idle_add(self._update_metadata, priority=GLib.PRIORITY_HIGH) elif event.type == XINE_EVENT_UI_MESSAGE: from ctypes import POINTER, cast, string_at, addressof msg = cast(event.data, POINTER(xine_ui_message_data_t)).contents if msg.type != XINE_MSG_NO_ERROR: if msg.explanation: message = string_at(addressof(msg) + msg.explanation) else: message = "xine error %s" % msg.type message = message.decode("utf-8", errors="replace") GLib.idle_add(self._error, PlayerError(message)) return True def do_get_property(self, property): if property.name == 'volume': return self._volume elif property.name == 'seekable': if self.song is None: return False return True elif property.name == 'mute': if not self._destroyed: return xine_get_param(self._stream, XINE_PARAM_AUDIO_AMP_MUTE) return False else: raise AttributeError def do_set_property(self, property, v): if property.name == 'volume': self._volume = v v = self.calc_replaygain_volume(v) v = min(100, int(v * 100)) if not self._destroyed: xine_set_param(self._stream, XINE_PARAM_AUDIO_AMP_LEVEL, v) elif property.name == 'mute': if not self._destroyed: xine_set_param(self._stream, XINE_PARAM_AUDIO_AMP_MUTE, v) else: raise AttributeError def get_position(self): """Return the current playback position in milliseconds, or 0 if no song is playing.""" pos_stream, pos_time, length_time = xine_get_pos_length(self._stream) return pos_time def _stop(self): xine_stop(self._stream) def _pause(self): xine_set_param(self._stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE) def _play(self): if (xine_get_param(self._stream, XINE_PARAM_SPEED) != XINE_SPEED_NORMAL): xine_set_param(self._stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL) if xine_get_status(self._stream) != XINE_STATUS_PLAY: xine_play(self._stream, 0, 0) @property def paused(self): return self._paused @paused.setter def paused(self, paused): if paused == self._paused: return self._paused = paused self.emit((paused and 'paused') or 'unpaused') if self._paused != paused: return if self.song: if paused: if not self.song.is_file: xine_close(self._stream) xine_open(self._stream, self.song("~uri")) else: self._pause() else: self._play() def _error(self, player_error=None): if self._destroyed: return False if self.error: return False self.error = True self.paused = True if player_error: self.emit('error', self.song, player_error) def seek(self, pos): """Seek to a position in the song, in milliseconds.""" if xine_get_param(self._stream, XINE_PARAM_SPEED) == XINE_SPEED_PAUSE: xine_play(self._stream, 0, int(pos)) xine_set_param(self._stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE) else: xine_play(self._stream, 0, int(pos)) self.emit('seek', self.song, pos) def _end(self, stopped, next_song=None, gapless=False): # We need to set self.song to None before calling our signal # handlers. Otherwise, if they try to end the song they're given # (e.g. by removing it), then we get in an infinite loop. song = self.song self.song = self.info = None self.emit('song-ended', song, stopped) # reset error state self.error = False current = self._source.current if next_song is None else next_song # Then, set up the next song. self.song = self.info = current self.emit('song-started', self.song) if self.song is not None: self.volume = self.volume if gapless and self._supports_gapless: xine_set_param(self._stream, XINE_PARAM_GAPLESS_SWITCH, 1) xine_open(self._stream, self.song("~uri").encode("ascii")) if self._paused: self._pause() else: if song is None: self.emit("unpaused") self._play() if gapless and self._supports_gapless: xine_set_param(self._stream, XINE_PARAM_GAPLESS_SWITCH, 0) else: self.paused = True xine_stop(self._stream) # seekable might change if we change to None, so notify just in case self.notify("seekable") def setup(self, playlist, song, seek_pos): super(XinePlaylistPlayer, self).setup(playlist, song, seek_pos) # xine's declining to seek so soon after startup; try again in 100ms if seek_pos: GLib.timeout_add(100, self.seek, seek_pos) @property def eq_bands(self): # These are taken straight from Xine's API return [30, 60, 125, 250, 500, 1000, 2000, 4000, 8000, 16000] def update_eq_values(self): bands = self.eq_bands need_eq = any(self._eq_values) for band, val in enumerate(self._eq_values): param = getattr(cdefs, 'XINE_PARAM_EQ_%dHZ' % bands[band]) # between 1..200; 100 is the default gain; 0 means no EQ filter # only negative gain seems to work val = (int(val * 100 / 24.0) + 100) or 1 val *= int(need_eq) xine_set_param(self._stream, param, val) def can_play_uri(self, uri): for plugin in self._handle.list_input_plugins(): if uri.startswith(plugin.lower()): return True return False def init(librarian): """May raise PlayerError""" try: driver = config.getbytes("settings", "xine_driver") except: driver = None return XinePlaylistPlayer(driver, librarian) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/xinebe/__init__.py�������������������������������������������������0000644�0001750�0001750�00000000432�13112005742�022603� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from .player import init init = init ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/__init__.py��������������������������������������������������������0000644�0001750�0001750�00000003503�13112005742�021333� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007 Joe Wreschnig # 2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import importlib from quodlibet import util from quodlibet.compat import swap_to_string, text_type @swap_to_string class PlayerError(Exception): """Error raised by player loading/initialization and emitted by the error signal during playback. Both short_desc and long_desc are meant for displaying in the UI. They should be unicode. """ def __init__(self, short_desc, long_desc=None): self.short_desc = short_desc self.long_desc = long_desc def __str__(self): return self.short_desc + ( u"\n" + self.long_desc if self.long_desc else u"") def __bytes__(self): return text_type(self).encode('utf-8') def __repr__(self): return "%s(%r, %r)" % ( type(self).__name__, repr(self.short_desc), repr(self.long_desc)) def init_player(backend_name, librarian): """Loads the specified backend and initializes it. Returns a BasePlayer implementation instance. Raises PlayerError in case of an error. """ backend = init_backend(backend_name) return backend.init(librarian) def init_backend(backend_name): """Imports the player backend module for the given name. Raises PlayerError if the import fails. the module provides the following functions: init(librarian) -> new player instance """ modulename = "quodlibet.player." + backend_name try: backend = importlib.import_module(modulename) except Exception as e: util.print_exc() util.reraise(PlayerError, str(e)) else: return backend ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/nullbe.py����������������������������������������������������������0000644�0001750�0001750�00000005620�13112005742�021057� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004 Joe Wreschnig, Michael Urman # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet.player._base import BasePlayer from quodlibet.player import PlayerError class NullPlayer(BasePlayer): version_info = "Null Player Backend" name = "Null" def __init__(self, sinkname="", librarian=None): super(NullPlayer, self).__init__() self._paused = True self._source = None self._volume = 1.0 self._mute = False self._position = 0 def _destroy(self): pass def get_position(self): """Return the current playback position in milliseconds, or 0 if no song is playing.""" return self._position @property def paused(self): return self._paused @paused.setter def paused(self, paused): if paused == self._paused: return self._paused = paused self.emit((paused and 'paused') or 'unpaused') def do_get_property(self, property): if property.name == 'volume': return self._volume elif property.name == 'seekable': if self.song is None: return False return True elif property.name == 'mute': return self._mute else: raise AttributeError def do_set_property(self, property, v): if property.name == 'volume': self._volume = v elif property.name == 'mute': self._mute = v else: raise AttributeError def _error(self, message): self.paused = True self.emit('error', self.song, PlayerError(message)) def seek(self, pos): """Seek to a position in the song, in milliseconds.""" if self.song: self.emit('seek', self.song, pos) self._position = pos def _end(self, stopped, next_song=None): # We need to set self.song to None before calling our signal # handlers. Otherwise, if they try to end the song they're given # (e.g. by removing it), then we get in an infinite loop. song = self.song self.song = self.info = None self.emit('song-ended', song, stopped) current = self._source.current if next_song is None else next_song # Then, set up the next song. self.song = self.info = current self.emit('song-started', self.song) if self.song is None: self.paused = True if not self.paused and song is None: self.emit("unpaused") self._position = 0 # seekable might change if we change to None, so notify just in case self.notify("seekable") def can_play_uri(self, uri): return True def init(librarian): return NullPlayer(librarian) ����������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/_base.py�����������������������������������������������������������0000644�0001750�0001750�00000020315�13112005742�020645� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2007-2008 Joe Wreschnig # 2009,2010 Steven Robertson # 2009-2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import GObject from quodlibet.formats import AudioFile from quodlibet.util import print_d from quodlibet import config from quodlibet.compat import listfilter class Equalizer(object): _eq_values = [] @property def eq_bands(self): """read-only list of equalizer bands (in Hz) supported.""" return [] @property def eq_values(self): """The list of equalizer values, in the range (-24dB, 12dB).""" return self._eq_values @eq_values.setter def eq_values(self, value): self._eq_values[:] = value self.update_eq_values() def update_eq_values(self): """Override to apply equalizer values""" pass class BasePlayer(GObject.GObject, Equalizer): """Interfaces between a QL PlaylistModel and a GSt playbin. Attributes: paused -- True or False, set to pause/unpause the player volume -- current volume, 0.0 to 1.0 song -- current song, or None if not playing info -- current stream information, or None if not playing. This is usually the same as song, unless the user is listening to a stream with multiple songs in it. If you're going to show things, use .info. If you're going to change things, use .song. """ name = "" version_info = "" paused = None song = None info = None volume = None # if the current song couldn't be played because of an error # gets reset automatically after 'song-ended' gets emitted error = False # Replay Gain profiles are a list of values to be tried in order; # Four things can set them: rg menu, browser, play order, and a default. replaygain_profiles = [None, None, None, ["none"]] _paused = True _source = None __gsignals__ = { 'song-started': (GObject.SignalFlags.RUN_LAST, None, (object,)), 'song-ended': (GObject.SignalFlags.RUN_LAST, None, (object, bool)), 'seek': (GObject.SignalFlags.RUN_LAST, None, (object, int)), 'paused': (GObject.SignalFlags.RUN_LAST, None, ()), 'unpaused': (GObject.SignalFlags.RUN_LAST, None, ()), # (song, PlayerError) 'error': (GObject.SignalFlags.RUN_LAST, None, (object, object)), } __gproperties__ = { 'volume': (float, 'player volume', 'the volume of the player', 0.0, 1.0, 1.0, GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE), 'seekable': (bool, 'seekable', 'if the stream is seekable', True, GObject.ParamFlags.READABLE), 'mute': (bool, 'mute', 'if the stream is muted', False, GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE), } def __init__(self, *args, **kwargs): super(BasePlayer, self).__init__() def destroy(self): """Free resources""" if self.song is not self.info: self.emit("song-ended", self.info, True) self.emit("song-ended", self.song, True) self._source = None self._destroy() def calc_replaygain_volume(self, volume): """Returns a new float volume for the given volume. Takes into account the global active replaygain profile list, the user specified replaygain settings and the tags available for that song. Args: volume (float): 0.0..1.0 Returns: float: adjusted volume, can be outside of 0.0..0.1 """ if self.song and config.getboolean("player", "replaygain"): profiles = listfilter(None, self.replaygain_profiles)[0] fb_gain = config.getfloat("player", "fallback_gain") pa_gain = config.getfloat("player", "pre_amp_gain") scale = self.song.replay_gain(profiles, pa_gain, fb_gain) else: scale = 1 return volume * scale def _reset_replaygain(self): self.volume = self.volume def reset_replaygain(self): """Call in case something affecting the replaygain adjustment has changed to change the output volume """ self._reset_replaygain() @property def has_external_volume(self): """If setting the volume will affect anything outside of QL and if the volume can change without any event in QL. """ return False @property def volume(self): return self.props.volume @volume.setter def volume(self, v): self.props.volume = min(1.0, max(0.0, v)) @property def mute(self): return self.props.mute @mute.setter def mute(self, v): self.props.mute = v @property def seekable(self): """If the current song can be seeked, in case it's not clear defaults to True. See the "seekable" GObject property for notifications. """ return self.props.seekable def _destroy(self): """Clean up""" raise NotImplementedError def _end(self, stopped, next_song=None): """Start playing the current song from the source or next_song if it isn't None. """ raise NotImplementedError def setup(self, source, song, seek_pos): """Connect to a PlaylistModel, and load a song. seek_pos in millisecs """ assert source is not None if self._source is None: self.emit("song-started", song) self._source = source self.go_to(song, explicit=True) if seek_pos: self.seek(seek_pos) def seek(self, position): """Seek to absolute position in milliseconds. If position is larger than the duration start the next song """ raise NotImplementedError def get_position(self): """The current position in milliseconds""" raise NotImplementedError def remove(self, song): """Make sure the song isn't played anymore""" if song and self.song is song: self._source.next() self._end(True) def stop(self): """Stop playback and reset the position. Might release the audio device """ self.paused = True self.seek(0) def reset(self): """Reset the source and start playing if possible""" self._source.reset() if self._source.current is not None: self._end(True) if self.song: self.paused = False def next(self): """Move to the next song""" self._source.next() self._end(True) if self.song: self.paused = False def previous(self, force=False): """Go back if standing at the beginning of the song otherwise restart the current song. If force is True always go back. """ if force or self.get_position() < 1500 or not self.seekable: self._source.previous() self._end(True) else: self.seek(0) if self.song: self.paused = False def go_to(self, song_or_iter, explicit=False, source=None): """Activate the song or iter in the playlist if possible and play it. Explicit if the action comes from the user. Returns True if there is an active song after the call returns. """ print_d("Going to %r" % getattr(song_or_iter, "key", song_or_iter)) if self._source.go_to(song_or_iter, explicit, source): self._end(True) else: if isinstance(song_or_iter, AudioFile): self._end(True, song_or_iter) else: # FIXME: this is for the queue only plugin. the play order # should return if it has handled set() itself instead if explicit: return self._end(True) return self.song is not None def can_play_uri(self, uri): """Whether the player supports playing te given URI scheme""" raise NotImplementedError �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/gstbe/�������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�020323� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/gstbe/prefs.py�����������������������������������������������������0000644�0001750�0001750�00000007376�13112005742�022033� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2011 Joe Wreschnig, Michael Urman, Steven Robertson, # 2011-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from gi.repository import Gtk from quodlibet import config from quodlibet import _ from quodlibet.qltk.ccb import ConfigCheckButton from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk.x import Button from quodlibet.qltk import Icons from quodlibet.util import connect_obj class GstPlayerPreferences(Gtk.VBox): def __init__(self, player, debug=False): super(GstPlayerPreferences, self).__init__(spacing=6) e = UndoEntry() e.set_tooltip_text(_("The GStreamer output pipeline used for " "playback. Leave blank for the default pipeline. " "In case the pipeline contains a sink, " "it will be used instead of the default one.")) e.set_text(config.get('player', 'gst_pipeline')) def changed(entry): config.set('player', 'gst_pipeline', entry.get_text()) e.connect('changed', changed) pipe_label = Gtk.Label(label=_('_Output pipeline:')) pipe_label.set_use_underline(True) pipe_label.set_mnemonic_widget(e) apply_button = Button(_("_Apply")) def format_buffer(scale, value): return _("%.1f seconds") % value def scale_changed(scale): duration_msec = int(scale.get_value() * 1000) player._set_buffer_duration(duration_msec) duration = config.getfloat("player", "gst_buffer") scale = Gtk.HScale.new( Gtk.Adjustment(value=duration, lower=0.2, upper=10)) scale.set_value_pos(Gtk.PositionType.RIGHT) scale.set_show_fill_level(True) scale.connect('format-value', format_buffer) scale.connect('value-changed', scale_changed) buffer_label = Gtk.Label(label=_('_Buffer duration:')) buffer_label.set_use_underline(True) buffer_label.set_mnemonic_widget(scale) def rebuild_pipeline(*args): player._rebuild_pipeline() apply_button.connect('clicked', rebuild_pipeline) gapless_button = ConfigCheckButton( _('Disable _gapless playback'), "player", "gst_disable_gapless", populate=True) gapless_button.set_alignment(0.0, 0.5) gapless_button.set_tooltip_text( _("Disabling gapless playback can avoid track changing problems " "with some GStreamer versions.")) widgets = [(pipe_label, e, apply_button), (buffer_label, scale, None), ] table = Gtk.Table(n_rows=len(widgets), n_columns=3) table.set_col_spacings(6) table.set_row_spacings(6) for i, (left, middle, right) in enumerate(widgets): left.set_alignment(0.0, 0.5) table.attach(left, 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) if right: table.attach(middle, 1, 2, i, i + 1) table.attach(right, 2, 3, i, i + 1, xoptions=Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK) else: table.attach(middle, 1, 3, i, i + 1) table.attach(gapless_button, 0, 3, 2, 3) self.pack_start(table, True, True, 0) if debug: def print_bin(player): player._print_pipeline() b = Button("Print Pipeline", Icons.DIALOG_INFORMATION) connect_obj(b, 'clicked', print_bin, player) self.pack_start(b, True, True, 0) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/gstbe/player.py����������������������������������������������������0000644�0001750�0001750�00000103514�13112116100�022166� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2011 Joe Wreschnig, Michael Urman, Steven Robertson, # 2011-2014 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import gi try: gi.require_version("Gst", "1.0") gi.require_version("GstPbutils", "1.0") except ValueError as e: raise ImportError(e) from gi.repository import Gst, GLib, GstPbutils from quodlibet import const from quodlibet import config from quodlibet import util from quodlibet import app from quodlibet import _ from quodlibet.util import fver, sanitize_tags, MainRunner, MainRunnerError, \ MainRunnerAbortedError, MainRunnerTimeoutError, print_w, print_d, \ print_e, print_ from quodlibet.player import PlayerError from quodlibet.player._base import BasePlayer from quodlibet.qltk.notif import Task from quodlibet.compat import iteritems from .util import (parse_gstreamer_taglist, TagListWrapper, iter_to_list, GStreamerSink, link_many, bin_debug) from .plugins import GStreamerPluginHandler from .prefs import GstPlayerPreferences STATE_CHANGE_TIMEOUT = Gst.SECOND * 4 const.MinVersions.GSTREAMER.check(Gst.version()) class BufferingWrapper(object): """A wrapper for a Gst.Element (usually GstPlayBin) which pauses the elmement in case buffering is needed, but hides the fact that it does. Probably not perfect... You have to call destroy() before it gets gc'd """ def __init__(self, bin_, player): """ bin_ -- the GstPlaybin instance to wrap player -- the GStreamerPlayer instance used for aborting the buffer process """ self.bin = bin_ self._wanted_state = None self._task = None self._inhibit_play = False self._player = player bus = self.bin.get_bus() bus.add_signal_watch() self.__bus_id = bus.connect('message', self.__message) def __message(self, bus, message): if message.type == Gst.MessageType.BUFFERING: percent = message.parse_buffering() self.__update_buffering(percent) def __getattr__(self, name): return getattr(self.bin, name) def __update_buffering(self, percent): """Call this with buffer percent values from the bus""" if self._task: self._task.update(percent / 100.0) self.__set_inhibit_play(percent < 100) def __set_inhibit_play(self, inhibit): """Change the inhibit state""" if inhibit == self._inhibit_play: return self._inhibit_play = inhibit # task management if inhibit: if not self._task: def stop_buf(*args): self._player.paused = True self._task = Task(_("Stream"), _("Buffering"), stop=stop_buf) elif self._task: self._task.finish() self._task = None # state management if inhibit: # save the current state status, state, pending = self.bin.get_state( timeout=STATE_CHANGE_TIMEOUT) if status == Gst.StateChangeReturn.SUCCESS and \ state == Gst.State.PLAYING: self._wanted_state = state else: # no idea, at least don't play self._wanted_state = Gst.State.PAUSED self.bin.set_state(Gst.State.PAUSED) else: # restore the old state self.bin.set_state(self._wanted_state) self._wanted_state = None def set_state(self, state): if self._inhibit_play: # PLAYING, PAUSED change the state for after buffering is finished, # everything else aborts buffering if state not in (Gst.State.PLAYING, Gst.State.PAUSED): # abort self.__set_inhibit_play(False) self.bin.set_state(state) return self._wanted_state = state else: self.bin.set_state(state) def get_state(self, *args, **kwargs): # get_state also is a barrier (seek/positioning), # so call every time but ignore the result in the inhibit case res = self.bin.get_state(*args, **kwargs) if self._inhibit_play: return (Gst.StateChangeReturn.SUCCESS, self._wanted_state, Gst.State.VOID_PENDING) return res def destroy(self): if self.__bus_id: bus = self.bin.get_bus() bus.disconnect(self.__bus_id) bus.remove_signal_watch() self.__bus_id = None self.__set_inhibit_play(False) self.bin = None def sink_has_external_state(sink): return sink.get_factory().get_name() == "pulsesink" def sink_state_is_valid(sink): if not sink_has_external_state(sink): return True # pulsesink volume is only valid in PAUSED/PLAYING # https://bugzilla.gnome.org/show_bug.cgi?id=748577 current_state = sink.get_state(0)[1] return current_state >= Gst.State.PAUSED class GStreamerPlayer(BasePlayer, GStreamerPluginHandler): def PlayerPreferences(self): return GstPlayerPreferences(self, const.DEBUG) def __init__(self, librarian=None): GStreamerPluginHandler.__init__(self) BasePlayer.__init__(self) self._librarian = librarian self.version_info = "GStreamer: %s" % fver(Gst.version()) self._pipeline_desc = None self._volume = 1.0 self._paused = True self._seekable = False self._mute = False self._in_gapless_transition = False self._active_seeks = [] self._active_error = False self._last_position = 0 self.bin = None self._int_vol_element = None self._ext_vol_element = None self._ext_mute_element = None self._use_eq = False self._eq_element = None self.__info_buffer = None self._lib_id = librarian.connect("changed", self.__songs_changed) self.__atf_id = None self.__bus_id = None self._runner = MainRunner() def __songs_changed(self, librarian, songs): # replaygain values might have changed, recalc volume if self.song and self.song in songs: self._reset_replaygain() def _destroy(self): self._librarian.disconnect(self._lib_id) self._runner.abort() self.__destroy_pipeline() @property def name(self): name = "GStreamer" if self._pipeline_desc: name += " (%s)" % self._pipeline_desc return name @property def has_external_volume(self): ext = self._ext_vol_element if ext is None or not sink_has_external_state(ext): return False return True def _set_buffer_duration(self, duration): """Set the stream buffer duration in msecs""" config.set("player", "gst_buffer", float(duration) / 1000) if self.bin: value = duration * Gst.MSECOND self.bin.set_property('buffer-duration', value) def _print_pipeline(self): """Print debug information for the active pipeline to stdout (elements, formats, ...) """ if self.bin: # self.bin is just a wrapper, so get the real one for line in bin_debug([self.bin.bin]): print_(line) else: print_e("No active pipeline.") def _refresh_seekable(self): query = Gst.Query.new_seeking(Gst.Format.TIME) if self.bin and self.bin.query(query): seekable = query.parse_seeking()[1] elif self.song is None: seekable = False else: seekable = True if seekable != self._seekable: self._seekable = seekable self.notify("seekable") def __init_pipeline(self): """Creates a gstreamer pipeline. Returns True on success.""" if self.bin: return True # reset error state self.error = False pipeline = config.get("player", "gst_pipeline") try: pipeline, self._pipeline_desc = GStreamerSink(pipeline) except PlayerError as e: self._error(e) return False if self._use_eq and Gst.ElementFactory.find('equalizer-10bands'): # The equalizer only operates on 16-bit ints or floats, and # will only pass these types through even when inactive. # We push floats through to this point, then let the second # audioconvert handle pushing to whatever the rest of the # pipeline supports. As a bonus, this seems to automatically # select the highest-precision format supported by the # rest of the chain. filt = Gst.ElementFactory.make('capsfilter', None) filt.set_property('caps', Gst.Caps.from_string('audio/x-raw,format=F32LE')) eq = Gst.ElementFactory.make('equalizer-10bands', None) self._eq_element = eq self.update_eq_values() conv = Gst.ElementFactory.make('audioconvert', None) resample = Gst.ElementFactory.make('audioresample', None) pipeline = [filt, eq, conv, resample] + pipeline # playbin2 has started to control the volume through pulseaudio, # which means the volume property can change without us noticing. # Use our own volume element for now until this works with PA. self._int_vol_element = Gst.ElementFactory.make('volume', None) pipeline.insert(0, self._int_vol_element) # Get all plugin elements and append audio converters. # playbin already includes one at the end plugin_pipeline = [] for plugin in self._get_plugin_elements(): plugin_pipeline.append(plugin) plugin_pipeline.append( Gst.ElementFactory.make('audioconvert', None)) plugin_pipeline.append( Gst.ElementFactory.make('audioresample', None)) pipeline = plugin_pipeline + pipeline bufbin = Gst.Bin() for element in pipeline: assert element is not None, pipeline bufbin.add(element) PIPELINE_ERROR = PlayerError(_("Could not create GStreamer pipeline")) if len(pipeline) > 1: if not link_many(pipeline): print_w("Linking the GStreamer pipeline failed") self._error(PIPELINE_ERROR) return False # Test to ensure output pipeline can preroll bufbin.set_state(Gst.State.READY) result, state, pending = bufbin.get_state(timeout=STATE_CHANGE_TIMEOUT) if result == Gst.StateChangeReturn.FAILURE: bufbin.set_state(Gst.State.NULL) print_w("Prerolling the GStreamer pipeline failed") self._error(PIPELINE_ERROR) return False # see if the sink provides a volume property, if yes, use it sink_element = pipeline[-1] if isinstance(sink_element, Gst.Bin): sink_element = iter_to_list(sink_element.iterate_recurse)[-1] self._ext_vol_element = None if hasattr(sink_element.props, "volume"): self._ext_vol_element = sink_element # In case we use the sink volume directly we can increase buffering # without affecting the volume change delay too much and safe some # CPU time... (2x default for now). if hasattr(sink_element.props, "buffer_time"): sink_element.set_property("buffer-time", 400000) def ext_volume_notify(*args): # gets called from a thread GLib.idle_add(self.notify, "volume") self._ext_vol_element.connect("notify::volume", ext_volume_notify) self._ext_mute_element = None if hasattr(sink_element.props, "mute") and \ sink_element.get_factory().get_name() != "directsoundsink": # directsoundsink has a mute property but it doesn't work # https://bugzilla.gnome.org/show_bug.cgi?id=755106 self._ext_mute_element = sink_element def mute_notify(*args): # gets called from a thread GLib.idle_add(self.notify, "mute") self._ext_mute_element.connect("notify::mute", mute_notify) # Make the sink of the first element the sink of the bin gpad = Gst.GhostPad.new('sink', pipeline[0].get_static_pad('sink')) bufbin.add_pad(gpad) self.bin = Gst.ElementFactory.make('playbin', None) assert self.bin bus = self.bin.get_bus() bus.add_signal_watch() self.__bus_id = bus.connect('message', self.__message, self._librarian) self.bin = BufferingWrapper(self.bin, self) self.__atf_id = self.bin.connect('about-to-finish', self.__about_to_finish) # set buffer duration duration = config.getfloat("player", "gst_buffer") self._set_buffer_duration(int(duration * 1000)) # connect playbin to our pluing/volume/eq pipeline self.bin.set_property('audio-sink', bufbin) # by default playbin will render video -> suppress using fakesink fakesink = Gst.ElementFactory.make('fakesink', None) self.bin.set_property('video-sink', fakesink) # disable all video/text decoding in playbin GST_PLAY_FLAG_VIDEO = 1 << 0 GST_PLAY_FLAG_TEXT = 1 << 2 flags = self.bin.get_property("flags") flags &= ~(GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_TEXT) self.bin.set_property("flags", flags) # find the (uri)decodebin after setup and use autoplug-sort # to sort elements like decoders def source_setup(*args): def autoplug_sort(decode, pad, caps, factories): def set_prio(x): i, f = x i = { "mad": -1, "mpg123audiodec": -2 }.get(f.get_name(), i) return (i, f) return list( zip(*sorted(map(set_prio, enumerate(factories)))))[1] for e in iter_to_list(self.bin.iterate_recurse): try: e.connect("autoplug-sort", autoplug_sort) except TypeError: pass else: break self.bin.connect("source-setup", source_setup) if self.has_external_volume: # ReplayGain information gets lost when destroying self._reset_replaygain() else: # Restore volume/ReplayGain and mute state self.volume = self._volume self.mute = self._mute if self.song: self.bin.set_property('uri', self.song("~uri")) return True def __destroy_pipeline(self): self._remove_plugin_elements() if self.__bus_id: bus = self.bin.get_bus() bus.disconnect(self.__bus_id) bus.remove_signal_watch() self.__bus_id = None if self.__atf_id: self.bin.disconnect(self.__atf_id) self.__atf_id = None if self.bin: self.bin.set_state(Gst.State.NULL) self.bin.get_state(timeout=STATE_CHANGE_TIMEOUT) # BufferingWrapper cleanup self.bin.destroy() self.bin = None self._in_gapless_transition = False self._last_position = 0 self._active_seeks = [] self._ext_vol_element = None self._int_vol_element = None self._ext_mute_element = None self._eq_element = None def _rebuild_pipeline(self): """If a pipeline is active, rebuild it and restore vol, position etc""" if not self.bin: return paused = self.paused pos = self.get_position() self.__destroy_pipeline() self.paused = True self.__init_pipeline() self.paused = paused self.seek(pos) def __message(self, bus, message, librarian): if message.type == Gst.MessageType.EOS: print_d("Stream EOS") if not self._in_gapless_transition: self._source.next_ended() self._end(False) elif message.type == Gst.MessageType.TAG: self.__tag(message.parse_tag(), librarian) elif message.type == Gst.MessageType.ERROR: gerror, debug_info = message.parse_error() message = u"" if gerror: message = util.gdecode(gerror.message).rstrip(".") details = None if debug_info: # strip the first line, not user friendly debug_info = "\n".join(debug_info.splitlines()[1:]) # can contain paths, so not sure if utf-8 in all cases details = util.gdecode(debug_info) self._error(PlayerError(message, details)) elif message.type == Gst.MessageType.STATE_CHANGED: # pulsesink doesn't notify a volume change on startup # and the volume is only valid in > paused states. if message.src is self._ext_vol_element: self.notify("volume") if message.src is self._ext_mute_element: self.notify("mute") if message.src is self.bin.bin: new_state = message.parse_state_changed()[1] if new_state >= Gst.State.PAUSED: self._refresh_seekable() elif message.type == Gst.MessageType.STREAM_START: if self._in_gapless_transition: print_d("Stream changed") self._end(False) elif message.type == Gst.MessageType.ASYNC_DONE: if self._active_seeks: song, pos = self._active_seeks.pop(0) if song is self.song: self.emit("seek", song, pos) elif message.type == Gst.MessageType.ELEMENT: message_name = message.get_structure().get_name() if message_name == "missing-plugin": self.__handle_missing_plugin(message) elif message.type == Gst.MessageType.CLOCK_LOST: print_d("Clock lost") self.bin.set_state(Gst.State.PAUSED) self.bin.set_state(Gst.State.PLAYING) elif message.type == Gst.MessageType.LATENCY: print_d("Recalculate latency") self.bin.recalculate_latency() elif message.type == Gst.MessageType.REQUEST_STATE: state = message.parse_request_state() print_d("State requested: %s" % Gst.Element.state_get_name(state)) self.bin.set_state(state) elif message.type == Gst.MessageType.DURATION_CHANGED: if self.song.fill_length: ok, p = self.bin.query_duration(Gst.Format.TIME) if ok: p /= float(Gst.SECOND) self.song["~#length"] = p librarian.changed([self.song]) def __handle_missing_plugin(self, message): get_installer_detail = \ GstPbutils.missing_plugin_message_get_installer_detail get_description = GstPbutils.missing_plugin_message_get_description details = get_installer_detail(message) if details is None: return self.stop() format_desc = get_description(message) title = _(u"No GStreamer element found to handle media format") error_details = _(u"Media format: %(format-description)s") % { "format-description": util.gdecode(format_desc)} def install_done_cb(plugins_return, *args): print_d("Gstreamer plugin install return: %r" % plugins_return) Gst.update_registry() context = GstPbutils.InstallPluginsContext.new() # new in 1.6 if hasattr(context, "set_desktop_id"): from gi.repository import Gtk context.set_desktop_id(app.id) # new in 1.6 if hasattr(context, "set_startup_notification_id"): current_time = Gtk.get_current_event_time() context.set_startup_notification_id("_TIME%d" % current_time) gdk_window = app.window.get_window() if gdk_window: try: xid = gdk_window.get_xid() except AttributeError: # non X11 pass else: context.set_xid(xid) res = GstPbutils.install_plugins_async( [details], context, install_done_cb, None) print_d("Gstreamer plugin install result: %r" % res) if res in (GstPbutils.InstallPluginsReturn.HELPER_MISSING, GstPbutils.InstallPluginsReturn.INTERNAL_FAILURE): self._error(PlayerError(title, error_details)) def __about_to_finish_sync(self): """Returns the next song uri to play or None""" print_d("About to finish (sync)") # Chained oggs falsely trigger a gapless transition. # At least for radio streams we can safely ignore it because # transitions don't occur there. # https://github.com/quodlibet/quodlibet/issues/1454 # https://bugzilla.gnome.org/show_bug.cgi?id=695474 if self.song.multisong: print_d("multisong: ignore about to finish") return if config.getboolean("player", "gst_disable_gapless"): print_d("Gapless disabled") return # this can trigger twice, see issue 987 if self._in_gapless_transition: return self._in_gapless_transition = True print_d("Select next song in mainloop..") self._source.next_ended() print_d("..done.") song = self._source.current if song is not None: return song("~uri") def __about_to_finish(self, playbin): print_d("About to finish (async)") try: uri = self._runner.call(self.__about_to_finish_sync, priority=GLib.PRIORITY_HIGH, timeout=0.5) except MainRunnerTimeoutError as e: # Due to some locks being held during this signal we can get # into a deadlock when a seek or state change event happens # in the mainloop before our function gets scheduled. # In this case abort and do nothing, which results # in a non-gapless transition. print_d("About to finish (async): %s" % e) return except MainRunnerAbortedError as e: print_d("About to finish (async): %s" % e) return except MainRunnerError: util.print_exc() return if uri is not None: print_d("About to finish (async): setting uri") playbin.set_property('uri', uri) print_d("About to finish (async): done") def stop(self): super(GStreamerPlayer, self).stop() self.__destroy_pipeline() def do_get_property(self, property): if property.name == 'volume': if self._ext_vol_element is not None and \ sink_has_external_state(self._ext_vol_element) and \ sink_state_is_valid(self._ext_vol_element): # never read back the volume if we don't have to, e.g. # directsoundsink maps volume to an int which makes UI # sliders jump if we read the value back self._volume = self._ext_vol_element.get_property("volume") return self._volume elif property.name == "mute": if self._ext_mute_element is not None and \ sink_has_external_state(self._ext_mute_element) and \ sink_state_is_valid(self._ext_mute_element): self._mute = self._ext_mute_element.get_property("mute") return self._mute elif property.name == "seekable": return self._seekable else: raise AttributeError def _reset_replaygain(self): if not self.bin: return v = 1.0 if self._ext_vol_element is not None else self._volume v = self.calc_replaygain_volume(v) v = min(10.0, max(0.0, v)) self._int_vol_element.set_property('volume', v) def do_set_property(self, property, v): if property.name == 'volume': self._volume = v if self._ext_vol_element: v = min(10.0, max(0.0, v)) self._ext_vol_element.set_property("volume", v) else: v = self.calc_replaygain_volume(v) if self.bin: v = min(10.0, max(0.0, v)) self._int_vol_element.set_property('volume', v) elif property.name == 'mute': self._mute = v if self._ext_mute_element is not None: self._ext_mute_element.set_property("mute", v) else: if self.bin: self._int_vol_element.set_property("mute", v) else: raise AttributeError def get_position(self): """Return the current playback position in milliseconds, or 0 if no song is playing.""" p = self._last_position if self.song and self.bin: # While we are actively seeking return the last wanted position. # query_position() returns 0 while in this state if self._active_seeks: return self._active_seeks[-1][1] ok, p = self.bin.query_position(Gst.Format.TIME) if ok: p //= Gst.MSECOND # During stream seeking querying the position fails. # Better return the last valid one instead of 0. self._last_position = p return p @property def paused(self): return self._paused @paused.setter def paused(self, paused): if paused == self._paused: return self._paused = paused self.emit((paused and 'paused') or 'unpaused') # in case a signal handler changed the paused state, abort this if self._paused != paused: return if paused: if self.bin: if not self.song: # Something wants us to pause between songs, or when # we've got no song playing (probably StopAfterMenu). self.__destroy_pipeline() elif self.seekable: self.bin.set_state(Gst.State.PAUSED) else: q = Gst.Query.new_buffering(Gst.Format.DEFAULT) if self.bin.query(q): # destroy so that we rebuffer on resume i.e. we don't # want to continue unseekable streams from where we # paused but from where we unpaused. self.__destroy_pipeline() else: self.bin.set_state(Gst.State.PAUSED) else: if self.song and self.__init_pipeline(): self.bin.set_state(Gst.State.PLAYING) def _error(self, player_error): """Destroy the pipeline and set the error state. The passed PlayerError will be emitted through the 'error' signal. """ # prevent recursive errors if self._active_error: return self._active_error = True self.__destroy_pipeline() self.error = True self.paused = True print_w(player_error) self.emit('error', self.song, player_error) self._active_error = False def seek(self, pos): """Seek to a position in the song, in milliseconds.""" # Don't allow seeking during gapless. We can't go back to the old song. if not self.song or self._in_gapless_transition: return if self.__init_pipeline(): # ensure any pending state changes have completed and we have # at least paused state, so we can seek state = self.bin.get_state(timeout=STATE_CHANGE_TIMEOUT)[1] if state < Gst.State.PAUSED: self.bin.set_state(Gst.State.PAUSED) self.bin.get_state(timeout=STATE_CHANGE_TIMEOUT) pos = max(0, int(pos)) gst_time = pos * Gst.MSECOND event = Gst.Event.new_seek( 1.0, Gst.Format.TIME, Gst.SeekFlags.FLUSH, Gst.SeekType.SET, gst_time, Gst.SeekType.NONE, 0) if self.bin.send_event(event): # to get a good estimate for when get_position fails self._last_position = pos # For cases where we get the position directly after # a seek and the seek is not done, GStreamer returns # a valid 0 position. To prevent this we try to emit seek only # after it is done. Every flushing seek will trigger # an async_done message on the bus, so we queue the seek # event here and emit in the bus message callback. self._active_seeks.append((self.song, pos)) def _end(self, stopped, next_song=None): print_d("End song") song, info = self.song, self.info # set the new volume before the signals to avoid delays if self._in_gapless_transition: self.song = self._source.current self._reset_replaygain() # We need to set self.song to None before calling our signal # handlers. Otherwise, if they try to end the song they're given # (e.g. by removing it), then we get in an infinite loop. self.__info_buffer = self.song = self.info = None if song is not info: self.emit('song-ended', info, stopped) self.emit('song-ended', song, stopped) current = self._source.current if next_song is None else next_song # Then, set up the next song. self.song = self.info = current self.emit('song-started', self.song) print_d("Next song") if self.song is not None: if not self._in_gapless_transition: # Due to extensive problems with playbin2, we destroy the # entire pipeline and recreate it each time we're not in # a gapless transition. self.__destroy_pipeline() self.__init_pipeline() if self.bin: if self.paused: self.bin.set_state(Gst.State.PAUSED) else: # something unpaused while no song was active if song is None: self.emit("unpaused") self.bin.set_state(Gst.State.PLAYING) else: self.__destroy_pipeline() self.paused = True self._in_gapless_transition = False self._refresh_seekable() def __tag(self, tags, librarian): if self.song and self.song.multisong: self._fill_stream(tags, librarian) elif self.song and self.song.fill_metadata: pass def _fill_stream(self, tags, librarian): # get a new remote file new_info = self.__info_buffer if not new_info: new_info = type(self.song)(self.song["~filename"]) new_info.multisong = False new_info.streamsong = True # copy from the old songs # we should probably listen to the library for self.song changes new_info.update(self.song) new_info.update(self.info) changed = False info_changed = False tags = TagListWrapper(tags, merge=True) tags = parse_gstreamer_taglist(tags) for key, value in iteritems(sanitize_tags(tags, stream=False)): if self.song.get(key) != value: changed = True self.song[key] = value for key, value in iteritems(sanitize_tags(tags, stream=True)): if new_info.get(key) != value: info_changed = True new_info[key] = value if info_changed: # in case the title changed, make self.info a new instance # and emit ended/started for the the old/new one if self.info.get("title") != new_info.get("title"): if self.info is not self.song: self.emit('song-ended', self.info, False) self.info = new_info self.__info_buffer = None self.emit('song-started', self.info) else: # in case title didn't changed, update the values of the # old instance if there is one and tell the library. if self.info is not self.song: self.info.update(new_info) librarian.changed([self.info]) else: # So we don't loose all tags before the first title # save it for later self.__info_buffer = new_info if changed: librarian.changed([self.song]) @property def eq_bands(self): if Gst.ElementFactory.find('equalizer-10bands'): return [29, 59, 119, 237, 474, 947, 1889, 3770, 7523, 15011] else: return [] def update_eq_values(self): need_eq = any(self._eq_values) if need_eq != self._use_eq: self._use_eq = need_eq self._rebuild_pipeline() if self._eq_element: for band, val in enumerate(self._eq_values): self._eq_element.set_property('band%d' % band, val) def can_play_uri(self, uri): if not Gst.uri_is_valid(uri): return False try: Gst.Element.make_from_uri(Gst.URIType.SRC, uri, '') except GLib.GError: return False return True def init(librarian): # Enable error messages by default if Gst.debug_get_default_threshold() == Gst.DebugLevel.NONE: Gst.debug_set_default_threshold(Gst.DebugLevel.ERROR) return GStreamerPlayer(librarian) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/gstbe/util.py������������������������������������������������������0000644�0001750�0001750�00000015261�13112005742�021661� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2009-2011 Steven Robertson, Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import collections import subprocess from gi.repository import GLib, Gst from quodlibet import _ from quodlibet.util.string import decode from quodlibet.util import is_linux, is_windows, gdecode from quodlibet.player import PlayerError from quodlibet.compat import text_type, number_types, xrange def pulse_is_running(): """Returns whether pulseaudio is running""" try: subprocess.check_call(["pulseaudio", "--check"]) except subprocess.CalledProcessError: return False except OSError: return False return True def link_many(elements): last = None for element in elements: if last: if not Gst.Element.link(last, element): return False last = element return True def unlink_many(elements): last = None for element in elements: if last: if not Gst.Element.unlink(last, element): return False last = element return True def iter_to_list(func): objects = [] iter_ = func() while 1: status, value = iter_.next() if status == Gst.IteratorResult.OK: objects.append(value) else: break return objects def find_audio_sink(): """Get the best audio sink available. Returns (element, description) or raises PlayerError. """ if is_windows(): sinks = [ "directsoundsink", "autoaudiosink", ] elif is_linux() and pulse_is_running(): sinks = [ "pulsesink", ] else: sinks = [ "autoaudiosink", # plugins-good "pulsesink", # plugins-good "alsasink", # plugins-base ] for name in sinks: element = Gst.ElementFactory.make(name, None) if element is not None: return (element, name) else: details = " (%s)" % ", ".join(sinks) if sinks else "" raise PlayerError(_("No GStreamer audio sink found") + details) def GStreamerSink(pipeline_desc): """Returns a list of unlinked gstreamer elements ending with an audio sink and a textual description of the pipeline. `pipeline_desc` can be gst-launch syntax for multiple elements with or without an audiosink. In case of an error, raises PlayerError """ pipe = None if pipeline_desc: try: pipe = [Gst.parse_launch(e) for e in pipeline_desc.split('!')] except GLib.GError as e: message = gdecode(e.message) raise PlayerError(_("Invalid GStreamer output pipeline"), message) if pipe: # In case the last element is linkable with a fakesink # it is not an audiosink, so we append the default one fake = Gst.ElementFactory.make('fakesink', None) if link_many([pipe[-1], fake]): unlink_many([pipe[-1], fake]) default_elm, default_desc = find_audio_sink() pipe += [default_elm] pipeline_desc += " ! " + default_desc else: elm, pipeline_desc = find_audio_sink() pipe = [elm] return pipe, pipeline_desc class TagListWrapper(collections.Mapping): def __init__(self, taglist, merge=False): self._list = taglist self._merge = merge def __len__(self): return self._list.n_tags() def __iter__(self): for i in xrange(len(self)): yield self._list.nth_tag_name(i) def __getitem__(self, key): if not Gst.tag_exists(key): raise KeyError values = [] index = 0 while 1: value = self._list.get_value_index(key, index) if value is None: break values.append(value) index += 1 if not values: raise KeyError if self._merge: try: return " - ".join(values) except TypeError: return values[0] return values def parse_gstreamer_taglist(tags): """Takes a GStreamer taglist and returns a dict containing only numeric and unicode values and str keys.""" merged = {} for key in tags.keys(): value = tags[key] # extended-comment sometimes containes a single vorbiscomment or # a list of them ["key=value", "key=value"] if key == "extended-comment": if not isinstance(value, list): value = [value] for val in value: if not isinstance(val, text_type): continue split = val.split("=", 1) sub_key = split[0] val = split[-1] if sub_key in merged: sub_val = merged[sub_key] if not isinstance(sub_val, text_type): continue if val not in sub_val.split("\n"): merged[sub_key] += "\n" + val else: merged[sub_key] = val elif isinstance(value, Gst.DateTime): value = value.to_iso8601_string() merged[key] = value else: if isinstance(value, number_types): merged[key] = value continue if isinstance(value, bytes): value = decode(value) if not isinstance(value, text_type): value = text_type(value) if key in merged: merged[key] += "\n" + value else: merged[key] = value return merged def bin_debug(elements, depth=0, lines=None): """Takes a list of gst.Element that are part of a prerolled pipeline, and recursively gets the children and all caps between the elements. Returns a list of text lines suitable for printing. """ from quodlibet.util.dprint import Colorise if lines is None: lines = [] else: lines.append(" " * (depth - 1) + "\\") for i, elm in enumerate(elements): for pad in iter_to_list(elm.iterate_sink_pads): caps = pad.get_current_caps() if caps: lines.append("%s| %s" % (" " * depth, caps.to_string())) name = elm.get_name() cls = Colorise.blue(type(elm).__name__.split(".", 1)[-1]) lines.append("%s|-%s (%s)" % (" " * depth, cls, name)) if isinstance(elm, Gst.Bin): children = reversed(iter_to_list(elm.iterate_sorted)) bin_debug(children, depth + 1, lines) return lines �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/gstbe/__init__.py��������������������������������������������������0000644�0001750�0001750�00000000545�13112005742�022442� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2004-2011 Joe Wreschnig, Michael Urman, Steven Robertson, # 2011-2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from .player import init init = init �����������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/player/gstbe/plugins.py���������������������������������������������������0000644�0001750�0001750�00000005111�13112005742�022356� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2011 Christoph Reiter # 2014 Nick Boultbee # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from quodlibet import _ from quodlibet import util from quodlibet.plugins import PluginManager, PluginHandler from quodlibet.plugins.gstelement import GStreamerPlugin class GStreamerPluginHandler(PluginHandler): def init_plugins(self): PluginManager.instance.register_handler(self) def __init__(self): self.__plugins = [] self.__elements = {} def __get_plugin_element(self, plugin): """Setup element and cache it, so we can pass the linked/active one to the plugin for live updates""" if plugin not in self.__elements: element = None # make sure the plugin doesn't take us down try: element = plugin.setup_element() except Exception: util.print_exc() if not element: util.print_w( _("GStreamer plugin '%(name)s' could not be initialized") % {"name": plugin.PLUGIN_ID}) return plugin.update_element(element) self.__elements[plugin] = element return self.__elements[plugin] def plugin_handle(self, plugin): if not issubclass(plugin.cls, GStreamerPlugin): return False plugin.cls._handler = self return True def plugin_enable(self, plugin): self.__plugins.append(plugin.cls) self._rebuild_pipeline() def plugin_disable(self, plugin): try: self.__elements.pop(plugin.cls) except KeyError: pass self.__plugins.remove(plugin.cls) self._rebuild_pipeline() def _remove_plugin_elements(self): """Call on pipeline destruction to remove element references""" self.__elements.clear() def _get_plugin_elements(self): """Return a list of plugin elements""" for plugin in self.__plugins: self.__get_plugin_element(plugin) items = sorted(self.__elements.items(), key=lambda x: x[0].priority, reverse=True) return [p[1] for p in items] def _queue_update(self, plugin): # If we have an instance, apply settings, otherwise # this will be done on creation if plugin in self.__elements: plugin.update_element(self.__elements[plugin]) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/operon/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�13115513301�017225� 5����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/operon/base.py������������������������������������������������������������0000644�0001750�0001750�00000005047�13112005742�020521� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys from optparse import OptionParser from quodlibet import _ from quodlibet.formats import MusicFile, AudioFileError from quodlibet.util import print_ class CommandError(Exception): pass class Command(object): """Base class for commands. Subclasses can override _add_options() and _execute() """ NAME = None DESCRIPTION = None USAGE = None COMMANDS = [] @classmethod def register(cls, cmd_cls): cls.COMMANDS.append(cmd_cls) cls.COMMANDS.sort(key=lambda c: c.NAME) def __init__(self, main_cmd, options=None): self._main_cmd = main_cmd usage = "%s %s %s" % (main_cmd, self.NAME, self.USAGE) self.__parser = OptionParser(usage=usage, description=self.DESCRIPTION) if options is None: options = self.__parser.parse_args([])[0] self.__options = options self._add_options(self.__parser) def _add_options(self, parser): """Override to add options to the parser""" pass @property def verbose(self): return self.__options.verbose @verbose.setter def verbose(self, value): self.__options.verbose = bool(value) def log(self, text): """Print output if --verbose was passed""" if self.verbose: return print_(text, file=sys.stderr) def load_song(self, path): """Load a song. Raises CommandError in case it fails""" self.log("Load file: %r" % path) song = MusicFile(path) if not song: raise CommandError(_("Failed to load file: %r") % path) return song def save_songs(self, songs): """Save all passed songs""" self.log("Saving songs...") for song in songs: try: song.write() except AudioFileError as e: raise CommandError(e) def _execute(self, options, args): """Override to execute something""" raise NotImplemented def print_help(self, file=None): """Print the help information about the comand""" if file is None: file = sys.stdout self.__parser.print_help(file=file) def execute(self, args): """Execute the command""" options, args = self.__parser.parse_args(args) self._execute(options, args) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/operon/util.py������������������������������������������������������������0000644�0001750�0001750�00000007472�13112005742�020570� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import os import stat import shlex from quodlibet import _ from quodlibet.util.tags import MACHINE_TAGS, sortkey from quodlibet.util.dprint import print_, Colorise from quodlibet import util from .base import CommandError def copy_mtime(src, dst): """Copy mtime/atime from src to dst. Might raise OSError.""" stat_src = os.stat(src) os.utime(dst, (stat_src[stat.ST_ATIME], stat_src[stat.ST_MTIME])) def filter_table(rows, nicks, order): """Returns a new table with rows filtered and reordered""" if nicks == order: return rows mapping = [] lower = [h.lower() for h in nicks] for o in order: try: index = lower.index(o.lower()) except ValueError: raise CommandError( _("'%(column-id)s' is not a valid column " "name (%(all-column-ids)s).") % { "column-id": o, "all-column-ids": ", ".join(nicks), }) else: mapping.append(index) if not mapping: return [] new_rows = [] for row in rows: new_rows.append([row[i] for i in mapping]) return new_rows def print_table(rows, headers, nicks, order): """Print a fancy table""" rows.insert(0, headers) rows = filter_table(rows, nicks, order) if not rows: return widths = [] for c in range(len(rows[0])): widths.append(max(map(lambda r: len(r[c]), rows))) seperator = " %s " % Colorise.gray("|") format_string = seperator.join(["%%-%ds" % w for w in widths]) header = [] for i, h in enumerate(rows.pop(0)): header.append(h.ljust(widths[i], " ")) line_width = len(" ".join(header)) + 2 header = [Colorise.bold(h) for h in header] header_line = " " + (" %s " % Colorise.gray("|")).join(header) print_(header_line.rstrip()) print_(Colorise.gray("-" * line_width)) for row in rows: print_(" " + (format_string % tuple(row)).rstrip()) def print_terse_table(rows, nicks, order): """Print a terse table""" for row in filter_table(rows, nicks, order): row = [r.replace("\\", "\\\\") for r in row] row = [r.replace(":", r"\:") for r in row] print_(":".join(row)) def list_tags(song, machine=False, terse=False): """Return a list of key, value pairs""" keys = set(song.realkeys()) if not machine: keys.difference_update(MACHINE_TAGS) tags = [] for key in sorted(keys, key=sortkey): for value in song.list(key): if not terse: # QL can't handle multiline values and splits them by \n. # Tags with Windows line endings leave a \r, messing up the # table layout value = value.rstrip("\r") # Normalize tab value = value.replace("\t", " ") tags.append((util.tag(key), value, key)) return tags def get_editor_args(fallback_command="nano"): """Returns a list starting with a command and optional arguments for editing text files. List is never empty. Can't fail, but the result might not be a valid/existing command. """ if "VISUAL" in util.environ: editor = util.environ["VISUAL"] elif "EDITOR" in util.environ: editor = util.environ["EDITOR"] else: editor = fallback_command # to support VISUAL="geany -i" try: editor_args = shlex.split(editor) except ValueError: # well, no idea editor_args = [editor] if not editor_args: editor_args = [fallback_command] return editor_args ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/operon/__init__.py��������������������������������������������������������0000644�0001750�0001750�00000000426�13112005742�021342� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation from .main import main main ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/operon/commands.py��������������������������������������������������������0000644�0001750�0001750�00000060112�13112005742�021402� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation # TODO: # RenameCommand # FillTracknumberCommand import os import re import shutil import subprocess import tempfile from senf import fsn2text from quodlibet import _ from quodlibet import util from quodlibet.formats import EmbeddedImage, AudioFileError from quodlibet.util.path import mtime from quodlibet.pattern import Pattern, error as PatternError from quodlibet.util.tags import USER_TAGS, sortkey, MACHINE_TAGS from quodlibet.util.tagsfrompath import TagsFromPattern from quodlibet.compat import text_type, iteritems from .base import Command, CommandError from .util import print_terse_table, copy_mtime, list_tags, print_table, \ get_editor_args @Command.register class ListCommand(Command): NAME = "list" DESCRIPTION = _("List tags") USAGE = "[-a] [-t] [-c <c1>,<c2>...] <file>" def _add_options(self, p): p.add_option("-t", "--terse", action="store_true", help=_("Print terse output")) p.add_option("-c", "--columns", action="store", type="string", help=_("Columns to display and order in terse mode (%s)") % "desc,value,tag") p.add_option("-a", "--all", action="store_true", help=_("Also list programmatic tags")) def _execute(self, options, args): if len(args) < 1: raise CommandError(_("Not enough arguments")) elif len(args) > 1: raise CommandError(_("Too many arguments")) path = args[0] headers = [_("Description"), _("Value"), _("Tag")] nicks = ["desc", "value", "tag"] if not options.columns: order = nicks else: order = [n.strip() for n in options.columns.split(",")] song = self.load_song(path) tags = list_tags(song, machine=options.all, terse=options.terse) if options.terse: print_terse_table(tags, nicks, order) else: print_table(tags, headers, nicks, order) @Command.register class TagsCommand(Command): NAME = "tags" DESCRIPTION = _("List all common tags") USAGE = "[-t] [-c <c1>,<c2>...]" def _add_options(self, p): p.add_option("-t", "--terse", action="store_true", help=_("Print terse output")) p.add_option("-c", "--columns", action="store", type="string", help=_("Columns to display and order in terse mode (%s)") % "tag,desc") p.add_option("-a", "--all", action="store_true", help=_("Also list programmatic tags")) def _execute(self, options, args): if len(args) != 0: raise CommandError(_("Too many arguments")) headers = [_("Tag"), _("Description")] nicks = ["tag", "desc"] if not options.columns: order = nicks else: order = [n.strip() for n in options.columns.split(",")] tag_names = list(USER_TAGS) if options.all: tag_names.extend(MACHINE_TAGS) tags = [] for key in tag_names: tags.append((key, util.tag(key))) tags.sort() if not options.terse: print_table(tags, headers, nicks, order) else: print_terse_table(tags, nicks, order) @Command.register class CopyCommand(Command): NAME = "copy" DESCRIPTION = _("Copy tags from one file to another") USAGE = "[--dry-run] [--ignore-errors] <source> <dest>" def _add_options(self, p): p.add_option("--dry-run", action="store_true", help=_("Show changes, don't apply them")) p.add_option("--ignore-errors", action="store_true", help=_("Skip tags that can't be written")) def _execute(self, options, args): if len(args) < 2: raise CommandError(_("Not enough arguments")) elif len(args) > 2: raise CommandError(_("Too many arguments")) if options.dry_run: self.verbose = True source_path = args[0] dest_path = args[1] source = self.load_song(source_path) dest = self.load_song(dest_path) for key in source.realkeys(): self.log("Copy %r" % key) if not options.ignore_errors and not dest.can_change(key): raise CommandError(_("Can't copy tag %r to file: %r") % (key, dest_path)) for value in source.list(key): dest.add(key, value) if not options.dry_run: self.save_songs([dest]) @Command.register class EditCommand(Command): NAME = "edit" DESCRIPTION = _("Edit tags in a text editor") USAGE = "[--dry-run] <file>" # TODO: support editing multiple files def _add_options(self, p): p.add_option("--dry-run", action="store_true", help=_("Show changes, don't apply them")) def _song_to_text(self, song): # to text lines = [] for key in sorted(song.realkeys(), key=sortkey): for value in song.list(key): lines.append(u"%s=%s" % (key, value)) lines += [ u"", u"#" * 80, u"# Lines that are empty or start with '#' will be ignored", u"# File: %r" % fsn2text(song("~filename")), ] return u"\n".join(lines) def _text_to_song(self, text, song): assert isinstance(text, text_type) # parse tags = {} for line in text.splitlines(): if not line.strip() or line.startswith(u"#"): continue try: key, value = line.split(u"=", 1) except ValueError: continue tags.setdefault(key, []).append(value) # apply changes, sort to always have the same output for key in sorted(song.realkeys(), key=sortkey): new = tags.pop(key, []) old = song.list(key) for value in old: if value not in new: self.log("Remove %s=%s" % (key, value)) song.remove(key, value) for value in new: if value not in old: self.log("Add %s=%s" % (key, value)) song.add(key, value) for key, values in iteritems(tags): if not song.can_change(key): raise CommandError( "Can't change key '%(key-name)s'." % {"key-name": key}) for value in values: self.log("Add %s=%s" % (key, value)) song.add(key, value) def _execute(self, options, args): if len(args) < 1: raise CommandError(_("Not enough arguments")) elif len(args) > 1: raise CommandError(_("Too many arguments")) song = self.load_song(args[0]) dump = self._song_to_text(song).encode("utf-8") # write to tmp file fd, path = tempfile.mkstemp(suffix=".txt") # XXX: copy mtime here so we can test for changes in tests by # setting a out of date mtime on the source song file copy_mtime(args[0], path) try: try: os.write(fd, dump) finally: os.close(fd) # only parse the result if the editor returns 0 and the mtime has # changed old_mtime = mtime(path) editor_args = get_editor_args() self.log("Using editor: %r" % editor_args) try: subprocess.check_call(editor_args + [path]) except subprocess.CalledProcessError as e: self.log(text_type(e)) raise CommandError(_("Editing aborted")) except OSError as e: self.log(text_type(e)) raise CommandError( _("Starting text editor '%(editor-name)s' failed.") % { "editor-name": editor_args[0]}) was_changed = mtime(path) != old_mtime if not was_changed: raise CommandError(_("No changes detected")) with open(path, "rb") as h: data = h.read() finally: os.unlink(path) try: text = data.decode("utf-8") except ValueError as e: raise CommandError("Invalid data: %r" % e) if options.dry_run: self.verbose = True self._text_to_song(text, song) if not options.dry_run: self.save_songs([song]) @Command.register class SetCommand(Command): NAME = "set" DESCRIPTION = _("Set a tag and remove existing values") USAGE = "[--dry-run] <tag> <value> <file> [<files>]" def _add_options(self, p): p.add_option("--dry-run", action="store_true", help=_("Show changes, don't apply them")) def _execute(self, options, args): if len(args) < 3: raise CommandError(_("Not enough arguments")) tag = fsn2text(args[0]) value = fsn2text(args[1]) paths = args[2:] songs = [] for path in paths: song = self.load_song(path) if not song.can_change(tag): raise CommandError(_("Can not set %r") % tag) self.log("Set %r to %r" % (value, tag)) if tag in song: del song[tag] song.add(tag, value) songs.append(song) if not options.dry_run: self.save_songs(songs) @Command.register class ClearCommand(Command): NAME = "clear" DESCRIPTION = _("Remove tags") USAGE = "[--dry-run] [-a | -e <pattern> | <tag>] <file> [<files>]" def _add_options(self, p): p.add_option("--dry-run", action="store_true", help=_("Show changes, don't apply them")) p.add_option("-e", "--regexp", action="store", type="string", help=_("Value is a regular expression")) p.add_option("-a", "--all", action="store_true", help=_("Remove all tags")) def _execute(self, options, args): if options.all and options.regexp is not None: raise CommandError(_("Can't combine '--all' with '--regexp'")) if options.regexp is not None or options.all: if len(args) < 1: raise CommandError(_("Not enough arguments")) paths = args else: if len(args) < 2: raise CommandError(_("Not enough arguments")) paths = args[1:] if options.dry_run: self.verbose = True songs = [] for path in paths: song = self.load_song(path) tags = [] realkeys = song.realkeys() if options.all: tags.extend(realkeys) elif options.regexp is not None: e = re.compile(options.regexp) tags.extend(filter(e.match, realkeys)) else: tag = args[0] if tag in realkeys: tags.append(tag) for tag in tags: self.log("Remove tag %r" % tag) if not song.can_change(tag): raise CommandError( _("Can't remove %r from %r") % (tag, path)) del song[tag] if tags: songs.append(song) if not options.dry_run: self.save_songs(songs) @Command.register class RemoveCommand(Command): NAME = "remove" DESCRIPTION = _("Remove a tag value") USAGE = "[--dry-run] <tag> [-e <pattern> | <value>] <file> [<files>]" def _add_options(self, p): p.add_option("--dry-run", action="store_true", help=_("Show changes, don't apply them")) p.add_option("-e", "--regexp", action="store", type="string", help=_("Value is a regular expression")) def _execute(self, options, args): if options.regexp is None: if len(args) < 3: raise CommandError(_("Not enough arguments")) else: if len(args) < 2: raise CommandError(_("Not enough arguments")) if options.dry_run: self.verbose = True tag = args[0] if options.regexp is not None: match = re.compile(options.regexp).match paths = args[1:] else: value = args[1] paths = args[2:] match = lambda v: v == value songs = [] for path in paths: song = self.load_song(path) if tag not in song: continue for v in song.list(tag): if match(v): self.log("Remove %r from %r" % (v, tag)) song.remove(tag, v) songs.append(song) if not options.dry_run: self.save_songs(songs) @Command.register class AddCommand(Command): NAME = "add" DESCRIPTION = _("Add a tag value") USAGE = "<tag> <value> <file> [<files>]" def _execute(self, options, args): if len(args) < 3: raise CommandError(_("Not enough arguments")) tag = fsn2text(args[0]) value = fsn2text(args[1]) paths = args[2:] songs = [] for path in paths: song = self.load_song(path) if not song.can_change(tag): raise CommandError(_("Can not set %r") % tag) self.log("Add %r to %r" % (value, tag)) song.add(tag, value) songs.append(song) self.save_songs(songs) @Command.register class InfoCommand(Command): NAME = "info" DESCRIPTION = _("List file information") USAGE = "[-t] [-c <c1>,<c2>...] <file>" def _add_options(self, p): p.add_option("-t", "--terse", action="store_true", help=_("Print terse output")) p.add_option("-c", "--columns", action="store", type="string", help=_("Columns to display and order in terse mode (%s)") % "desc,value") def _execute(self, options, args): if len(args) < 1: raise CommandError(_("Not enough arguments")) elif len(args) > 1: raise CommandError(_("Too many arguments")) path = args[0] song = self.load_song(path) headers = [_("Description"), _("Value")] nicks = ["desc", "value"] if not options.columns: order = nicks else: order = [n.strip() for n in options.columns.split(",")] if not options.terse: tags = [] for key in ["~format", "~codec", "~encoding", "~length", "~bitrate", "~filesize"]: tags.append((util.tag(key), text_type(song.comma(key)))) print_table(tags, headers, nicks, order) else: tags = [] for key in ["~format", "~codec", "~encoding", "~#length", "~#bitrate", "~#filesize"]: tags.append((key.lstrip("#~"), text_type(song(key)))) print_terse_table(tags, nicks, order) @Command.register class ImageSetCommand(Command): NAME = "image-set" DESCRIPTION = _("Set the provided image as primary embedded image and " "remove all other embedded images") USAGE = "<image-file> <file> [<files>]" def _execute(self, options, args): if len(args) < 2: raise CommandError(_("Not enough arguments")) image_path = args[0] paths = args[1:] image = EmbeddedImage.from_path(image_path) if not image: raise CommandError(_("Failed to load image file: %r") % image_path) songs = [self.load_song(p) for p in paths] for song in songs: if not song.can_change_images: raise CommandError( _("Image editing not supported for %(file_name)s " "(%(file_format)s)") % { "file_name": song("~filename"), "file_format": song("~format") }) for song in songs: try: song.set_image(image) except AudioFileError as e: raise CommandError(e) @Command.register class ImageClearCommand(Command): NAME = "image-clear" DESCRIPTION = _("Remove all embedded images") USAGE = "<file> [<files>]" def _execute(self, options, args): if len(args) < 1: raise CommandError(_("Not enough arguments")) paths = args songs = [self.load_song(p) for p in paths] for song in songs: if not song.can_change_images: raise CommandError( _("Image editing not supported for %(file_name)s " "(%(file_format)s)") % { "file_name": song("~filename"), "file_format": song("~format") }) for song in songs: try: song.clear_images() except AudioFileError as e: raise CommandError(e) @Command.register class ImageExtractCommand(Command): NAME = "image-extract" DESCRIPTION = ( _("Extract embedded images to %(filepath)s") % { "filepath": "<destination>/<filename>-<index>.(jpeg|png|..)" } ) USAGE = "[--dry-run] [--primary] [-d <destination>] <file> [<files>]" def _add_options(self, p): p.add_option("--dry-run", action="store_true", help="don't save images") p.add_option("--primary", action="store_true", help="only extract the primary image") p.add_option("-d", "--destination", action="store", type="string", help=_("Path to where the images will be saved to " "(defaults to the working directory)")) def _execute(self, options, args): if len(args) < 1: raise CommandError(_("Not enough arguments")) # dry run implies verbose if options.dry_run: self.verbose = True paths = args for path in paths: song = self.load_song(path) # get the primary one or all of them if options.primary: image = song.get_primary_image() images = [image] if image else [] else: images = song.get_images() self.log("Images for %r: %r" % (path, images)) if not images: continue # get the basename from the song without the extension basename = os.path.basename(path) name = os.path.splitext(basename)[0] # at least two places, but same length for all images number_pattern = "%%0%dd" % (max(2, len(images) - 1)) for i, image in enumerate(images): # get a appropriate file extension or use fallback extensions = image.extensions ext = extensions[0] if extensions else ".image" if options.primary: # mysong.mp3 -> mysong.jpeg filename = "%s.%s" % (name, ext) else: # mysong.mp3 -> mysong-00.jpeg pattern = "%s-" + number_pattern + ".%s" filename = pattern % (name, i, ext) if options.destination is not None: filename = os.path.join(options.destination, filename) self.log("Saving image %r" % filename) if not options.dry_run: with open(filename, "wb") as h: shutil.copyfileobj(image.file, h) # @Command.register class RenameCommand(Command): NAME = "rename" DESCRIPTION = _("Rename files based on tags") USAGE = "[--dry-run] <pattern> <file> [<files>]" def _add_options(self, p): p.add_option("--dry-run", action="store_true", help="show changes, don't apply them") def _execute(self, options, args): if len(args) < 1: raise CommandError("Not enough arguments") @Command.register class FillCommand(Command): NAME = "fill" DESCRIPTION = _("Fill tags based on the file path") USAGE = "[--dry-run] <pattern> <file> [<files>]" def _add_options(self, p): p.add_option("--dry-run", action="store_true", help="show changes, don't apply them") def _execute(self, options, args): if len(args) < 2: raise CommandError("Not enough arguments") pattern_text = args[0] self.log("Using pattern: %r" % pattern_text) paths = args[1:] pattern = TagsFromPattern(pattern_text) songs = [] for path in paths: song = self.load_song(path) for header in pattern.headers: if not song.can_change(header): raise CommandError(_("Can not set %r") % header) songs.append(song) if options.dry_run: self.__preview(pattern, songs) else: self.__apply(pattern, songs) def __apply(self, pattern, songs): for song in songs: match = pattern.match(song) self.log("%r: %r" % (song("~basename"), match)) for header in pattern.headers: if header in match: value = match[header] song[header] = value self.save_songs(songs) def __preview(self, pattern, songs): rows = [] for song in songs: match = pattern.match(song) row = [fsn2text(song("~basename"))] for header in pattern.headers: row.append(match.get(header, u"")) rows.append(row) headers = [_("File")] + pattern.headers nicks = ["file"] + pattern.headers print_table(rows, headers, nicks, nicks) # @Command.register class FillTracknumberCommand(Command): NAME = "fill-tracknumber" DESCRIPTION = _("Fill tracknumbers for all files") USAGE = "[--dry-run] [--start] [--total] <file> [<files>]" def _add_options(self, p): p.add_option("--dry-run", action="store_true", help="show changes, don't apply them") p.add_option("--start", action="store_true", help="tracknumber to start with") p.add_option("--total", action="store_true", help="total number of tracks") def _execute(self, options, args): if len(args) < 1: raise CommandError("Not enough arguments") @Command.register class PrintCommand(Command): NAME = "print" DESCRIPTION = _("Print tags based on the given pattern") USAGE = "[-p <pattern>] <file> [<files>]" def _add_options(self, p): p.add_option("-p", "--pattern", action="store", type="string", help="use a custom pattern") def _execute(self, options, args): if len(args) < 1: raise CommandError("Not enough arguments") pattern = options.pattern if pattern is None: pattern = "<artist~album~tracknumber~title>" self.log("Using pattern: %r" % pattern) try: pattern = Pattern(pattern) except PatternError: raise CommandError("Invalid pattern: %r" % pattern) paths = args error = False for path in paths: try: util.print_(pattern % self.load_song(path)) except CommandError: error = True if error: raise CommandError("One or more files failed to load.") @Command.register class HelpCommand(Command): NAME = "help" DESCRIPTION = _("Display help information") USAGE = "[<command>]" def _execute(self, options, args): if len(args) > 1: raise CommandError("Too many arguments") for cmd in Command.COMMANDS: if cmd.NAME == args[0]: cmd(self._main_cmd).print_help() break else: raise CommandError("Unknown command") ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/quodlibet/operon/main.py������������������������������������������������������������0000644�0001750�0001750�00000006236�13112005742�020534� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # Copyright 2012,2013 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation import sys import os from optparse import OptionParser from senf import argv as sys_argv import quodlibet from quodlibet import const from quodlibet.util.dprint import print_ from .base import Command, CommandError from . import commands commands def _print_help(main_cmd, parser, file=None): """Print a short help list for all commands""" if file is None: file = sys.stdout parser.print_help(file=file) cl = ["", "Commands:"] for command in Command.COMMANDS: cl.append(" %-17s %s" % (command.NAME, command.DESCRIPTION)) cl.append("") cl.append("See '%s help <command>' for more information " "on a specific command." % main_cmd) print_("\n".join(cl), file=file) def main(argv=None): if argv is None: argv = sys_argv quodlibet.init_cli() main_cmd = os.path.basename(argv[0]) # the main optparser usage = "%s [--version] [--help] [--verbose] <command> [<args>]" % main_cmd parser = OptionParser(usage=usage) parser.remove_option("--help") parser.add_option("-h", "--help", action="store_true") parser.add_option("--version", action="store_true", help="print version") parser.add_option("-v", "--verbose", action="store_true", help="verbose output") # no args, print help (might change in the future) if len(argv) <= 1: _print_help(main_cmd, parser, file=sys.stderr) return 1 # collect options for the main command and get the command offset offset = -1 pre_command = [] for i, a in enumerate(argv): if i == 0: continue elif a.startswith("-"): pre_command.append(a) else: offset = i break # parse the global options options = parser.parse_args(pre_command)[0] # --help somewhere if options.help: _print_help(main_cmd, parser) return 0 # --version somewhere if options.version: print_("%s version %s" % (main_cmd, const.VERSION)) return 0 # no sub command followed, help to stderr if offset == -1: _print_help(main_cmd, parser, file=sys.stderr) return 1 arg = argv[offset] # special case help and list all commands if arg == "help": # no command, list all commands if len(argv) == 2: _print_help(main_cmd, parser) return 0 # get the right sub command and pass the remaining args for command in Command.COMMANDS: if command.NAME == arg: cmd = command(main_cmd, options) try: cmd.execute(argv[offset + 1:]) except CommandError as e: print_(u"%s: %s" % (command.NAME, e), file=sys.stderr) return 1 break else: print_(u"Unknown command '%s'. See '%s help'." % (arg, main_cmd), file=sys.stderr) return 1 return 0 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/NEWS��������������������������������������������������������������������������������0000644�0001750�0001750�00000272450�13115512430�014446� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _release-3.9.1: 3.9.1 (2017-06-06) - CHECK AND MATE, FAILING BODY AND MIND ---------------------------------------------------------- * Danish translation update :pr:`2394` (:user:`scootergrisen`) * Various bug fixes: :bug:`2409` :bug:`2364` :bug:`2406` :bug:`2401` :bug:`2410` :bug:`2414` :bug:`1387` :bug:`2411` :bug:`2386` :bug:`2400` :bug:`2404` (:user:`Nick Boultbee <declension>` et al.) .. _release-3.9.0: 3.9.0 (2017-05-24) - If you can whistle, you can do this too ------------------------------------------------------------ Packaging Changes: * **python-zeitgeist** no longer used * **python-feedparser** required (no longer optional) * **python-faulthandler** required * **GTK+ 3.14** required (was 3.10) * **PyGObject 3.14** required (was 3.12) * **GStreamer 1.4** required (was 1.2) * No longer installs icons to "/usr/share/pixmaps" * Installs more icons into "/usr/share/icons/hicolor/" theme Translation Updates: * Czech :pr:`2175` (:user:`Marek Suchánek <mrksu>`) * Danish :pr:`2185` (:user:`scootergrisen`) * French :pr:`2206` (:user:`Olivier Humbert <trebmuh>`) * Czech :bug:`2209` (:user:`Honza Hejzl <welblaud>`) * Norwegian Bokmål :pr:`2232` :pr:`2354` (:user:`Åka Sikrom <akrosikam>`) * French :pr:`2240` (:user:`Jean-Michel Pouré <kellogsgit>`) * German :pr:`2388` (:user:`Till Berger <Mellthas>`) * Polish :pr:`2391` (:user:`Piotr Drąg <piotrdrag>`) General: * Windows: Use native file choosers :pr:`2324` * operon: add "--all" option for the "tags" command. :bug:`2335` * Queue: Add checkbox to stop after queue is empty :pr:`2340` (:user:`Fredrik Strupe <frestr>`) * Opt-in online crash reporting using sentry.io :pr:`2313` * Allow resizing of panes in PanedBrowser :pr:`2301` (:user:`Fredrik Strupe <frestr>`) * Plugins: Add UI for plugin type filtering :pr:`2218` (:user:`Nick Boultbee <declension>`) * Add accelerators for "Open Browser" Menu :pr:`2305` (:user:`Uriel Zajaczkovski <urielz>`) * replaygain: save selected replaygain profiles to config :pr:`2279` (:user:`Didier Villevalois <ptitjes>`) * Allow ``!=`` in queries :bug:`2056` (:user:`Nick Boultbee <declension>`) * Add ``~#channels`` :bug:`1686` * songlist: make "space" trigger play/pause. See :bug:`1288` * Add ``--start-hidden`` and remove visibility restoring from the tray icon :bug:`814` * Add non-python crash reporting on the next start :bug:`1853` * mp3: include lame preset in ``~encoding`` Fixes: * Fix queue height not getting restored in some cases :pr:`2330` (:user:`Fredrik Strupe <frestr>`) * macOS: Fix URL launching from labels :bug:`2306` * Windows: Fix crash when the 65001 code page is used :bug:`2333` * Windows: Fix crash with French locale in some cases. :bug:`2364` * MPRIS: Fix metadata changes not getting emitted :pr:`2359` (:user:`IBBoard`) * Tray icon: Fix rating menu :pr:`2355` (:user:`IBBoard`) * Player: Fix "previous" not working with radio streams :bug:`2198` * gstbe: increase default buffer duration. :bug:`2191` * macOS: Fix meta key for accelerators not working :bug:`2271` * Fix error in case stdout gets closed before QL :bug:`2205` * Fix icon size of app menu embedded in gnome-shell decoration :bug:`2320` :pr:`2334` (:user:`Vimalan Reddy <redvimo>`) Plugins: * Windows: Enable crossfeed plugin * Add a plugin to export a playlist to a folder :pr:`2307` (:user:`Didier Villevalois <ptitjes>`) * Add skip by rating plugin :pr:`2201` (:user:`Jason Heard <101100>`) * Advanced Prefaulthandlerfs: add a configuration for the window title pattern :pr:`2272` (:user:`Didier Villevalois <ptitjes>`) * waveformseekbar: add hidpi detection :pr:`2261` (:user:`Didier Villevalois <ptitjes>`) * waveformseekbar: smoother drawing updates :pr:`2289` (:user:`Didier Villevalois <ptitjes>`) * Add a tap bpm plugin :pr:`2264` (:user:`Didier Villevalois <ptitjes>`) * Add plugin for changing the user interface language :pr:`2154` * Add external visualisations plugin :bug:`737` (:user:`Nick Boultbee <declension>`) * EQ Plugin: various improvements :bug:`1913` (:user:`Nick Boultbee <declension>`) * Add a plugin to toggle the menubar's visibility using "alt" :pr:`2263` :pr:`2267` (:user:`Didier Villevalois <ptitjes>`) Further Contributions: :pr:`2282` (:user:`David Pérez Carmona <DavidPerezIngeniero>`) :pr:`2284` (:user:`Jakub Wilk <jwilk>`) :pr:`2294` :pr:`2326` (:user:`Fredrik Strupe <frestr>`), :pr:`2270` :pr:`2302` :pr:`2280` :pr:`2385` (:user:`Didier Villevalois <ptitjes>`) :pr:`2308` :pr:`2314` (:user:`Uriel Zajaczkovski <urielz>`) :pr:`2331` (:user:`CreamyCookie`) Development: * tests: use xvfbwrapper if available :pr:`2287` * gdist: relicense to modern style MIT * Use docker on travis-ci :pr:`2269` :pr:`2290` .. _release-3.8.1: 3.8.1 (2017-01-23) - LET'S TALK ABOUT BIRDS ------------------------------------------- * GStreamer: increase default buffer duration. :bug:`2191` * Fix acoustid plugin :bug:`2192` * Fix new playlists from menu :bug:`2183` (:user:`Nick Boultbee <declension>`) * mpdserver: Make it work with the M.A.L.P Android client :bug:`2179` * Waveform plugin fixes :bug:`2195` (:user:`Nick Boultbee <declension>`) * Covergrid context menu fixes :pr:`2197` (:user:`Joel Ong <darthoctopus>`) Translations: * Norwegian Bokmål :pr:`2194` (:user:`Åka Sikrom <akrosikam>`) * German :pr:`2188` (:user:`Till Berger <Mellthas>`) .. _release-3.8.0: 3.8.0 (2016-12-29) - Maybe it'll land somewhere cool eventually --------------------------------------------------------------- Packaging Changes: * `concurrent.futures <https://pypi.python.org/pypi/futures>`__ required (usually called python-futures, python-concurrent.futures or python2-futures in distros) * **libgpod4** is no longer used * Testing now requires py.test * Installs a new zsh completion file General: * Preferences: Add option for changing the duration display format :pr:`2021` :bug:`1727` :bug:`1967` (:user:`Nick Boultbee <declension>`) * Locale-dependent number formatting :bug:`2018` (:user:`Nick Boultbee <declension>`) * Fix updates across browsers on changes to ~playlists :bug:`2017` (:user:`Nick Boultbee <declension>`) * Don't wake up when idle :pr:`2068` :bug:`2067` * Covergrid Browser :bug:`241` :pr:`2071` :pr:`2115` :pr:`2125` :bug:`2110` :pr:`2130` (:user:`brunob`, :user:`Joel Ong <darthoctopus>`, :user:`knockoutMice`) * Play order (shuffle / repeat) rewrite to be more modularised / powerful :pr:`2043` :bug:`2059` :bug:`2121` :bug:`2123` :pr:`2125` (:user:`Nick Boultbee <declension>`) * Improvements / additions to Information window :pr:`2119` :bug:`1558` (:user:`Nick Boultbee <declension>`) * Search: Fix error when query divides by 0 :pr:`2025` (:user:`faubiguy`) * Fix crash on tag edit abort :bug:`2081` * Library scan: ignore hidden files :bug:`2074` * Remove iPod support * Log the filename in case something crashes :bug:`2143` * MP4: Handle empty trkn/disk :bug:`2143` * Library: support autofs mounts :bug:`2146` * Various small GTK+/Ubuntu theme related updates * Fix crash when parsing feeds :pr:`2144` (:user:`Peter Schwede <pschwede>`) * Song list: ctrl+drag will now force a song copy :bug:`1952` * MP4: round bpm to nearest int. :bug:`2028` (:user:`Nick Boultbee <declension>`) * Songsmenu icons improved (:user:`Nick Boultbee <declension>`) * Basic zsh completion Translation Updates: * Polish :pr:`2141` (:user:`Piotr Drąg <piotrdrag>`) * Norwegian Bokmål :pr:`2031` :pr:`2064` (:user:`Åka Sikrom <akrosikam>`) * Danish :pr:`2169` (:user:`scootergrisen`) * Czech :pr:`2173` (:user:`Marek Suchánek <mrksu>`) Plugins: * Discogs Cover Source :pr:`2136` (:user:`knockoutMice`) * Add register-date filter to lastfmsync plugin :pr:`2127` (:user:`knockoutMice`) * Wikipedia plugin - search instead of direct URL :pr:`2112` (:user:`urielz`) * Notification plugin: add option to mask 'Next' :bug:`2026` :pr:`2045` (:user:`Corentin Néau <weyfonk>`) * Waveform seek bar :pr:`2046` (:user:`0x1777`), related performance improvements (:user:`Nick Boultbee <declension>`) * Add playlists to tray menu :bug:`2006` (:user:`Nick Boultbee <declension>`) * Random album plugin fixes :pr:`2085` (:user:`draxil`) * Custom commands: minor improvements (:user:`Nick Boultbee <declension>`) * Some Auto Library Update plugin fixes :bug:`1315` (:user:`Nick Boultbee <declension>`) * Seek bar plugin: invert scrolling directions :pr:`2052` (:user:`Corentin Néau <weyfonk>`) Windows: * Switch to msys2 :bug:`1718` * Allow opening audio files with quodlibet.exe :bug:`1607` * Enable pitch plugin again :bug:`1534` * Windows regressions: crossfeed plugin missing (will be back in the next version) macOS: * Allow opening audio files with the bundle * Really (really..) fix TLS :pr:`2108` :bug:`2107` Development: * Tests: switch to `pytest <http://docs.pytest.org/en/latest/>`__ as the main test runner * Tests: ``setup.py quality`` speedups * Tests: All tests pass now on Python 3 under Linux and Windows * All magic builtins gone :pr:`2044` * macOS bundle and Windows installer include everything required for running the test suite. .. _release-3.7.1: 3.7.1 (2016-09-25) - And then you're doomed. Doomed to to have not ill effects, that is! ---------------------------------------------------------------------------------------- * tests: Use dbus-daemon instead of dbus-launch for creating a session bus. :bug:`2022` * Fix 100% CPU when no song column is expanded. :bug:`2030` * Fix SoundCloud login with Ubuntu 14.04 :bug:`2034` * MP4: Fix crash when saving certain bpm tags :bug:`2028` (:user:`Nick Boultbee <declension>`) * Windows: Make lastfmsync plugin work :bug:`1777` .. _release-3.7.0: 3.7.0 (2016-08-27) - Yeah, this is like one of those scammy "name a star" sites! -------------------------------------------------------------------------------- Packaging Changes: * **Mutagen 1.32** required * **udisks1** support removed * **PyGObject 3.12** required * Add Soundcloud browser :bug:`1828` :pr:`1990` (:user:`Nick Boultbee <declension>`) * Make F11 toggle fullscreen mode * Add ``--refresh`` to the man page. :bug:`1914` * Add ``--stop-after``. :bug:`1909` * Remove support for loading browsers from ``~/.quodlibet/browsers`` :bug:`1919` * Added shortcut of ``<Primary>Delete`` for moving files to trash :pr:`1921` (:user:`Victoria Hayes <victoriahayes>`) * gstbe: always use pulsesink if pulseaudio is running. :bug:`1926` * Remove udisks1 support * Add a "Check for Updates" dialog * Windows: Port mmkeys support from pyhook to ctypes. Fixes accents not working when QL is running. :bug:`1168` * OSX: Enable multimedia key handling by default :bug:`1817` * Add selection tick (check) for rating(s) that are selected :bug:`1891` (:user:`Nick Boultbee <declension>`) * Support composersort :bug:`1795` (:user:`Nick Boultbee <declension>`) * Rework application menu :bug:`1598` (:user:`Nick Boultbee <declension>`) * Add a ~#playcount equalizer play order plugin :pr:`1626` (:user:`Ryan Turner <ZDBioHazard>`) * Fix too large cover art border radius with Ubuntu themes * songlist columns: handle font size changes at runtime. :bug:`1420` * Fix song list column label fade out in RTL mode * Fix seek bar getting stuck when releasing the button outside of the widget. :bug:`1953` * Add default keyboard shortcuts for browsers/views :bug:`1540` * Restore queue state. :bug:`1605` * Add a queue toggle button to the status bar and remove the view menu * docs: Clarified function of the queue :pr:`2004` (:user:`Bernd Wechner <bernd-wechner>`) Translations: * Updated Polish translation :pr:`2009` (:user:`Piotr Drąg <piotrdrag>`) * French translation update :pr:`1932` (:user:`Ludovic Druette <LudoBike>`) * Fully update British English "translation" (:user:`Nick Boultbee <declension>`) Tagging: * AIFF support :bug:`1801` * Support musicbrainz_releasetrackid :pr:`1992` * Support musicbrainz_releasegroupid :bug:`1896` * operon: Fix image-set when passing multiple files. :bug:`1729` * ASF: add WM/AlbumArtistSortOrder :bug:`1936` * MP4: Support saving replaygain tags :pr:`1916` (:user:`bp0`) * MP4: support replaygain_reference_loudness. :pr:`1928` Plugins: * lyricswindow: Restart WebKit when crashed :pr:`1923` (:user:`CreamyCookie`) * lyricswindow: Prevent alert windows. :bug:`1927` (:user:`CreamyCookie`) * tray icon: Improve unity detection :bug:`1999` * musicbrainz: Add option to write labelid. :bug:`1929` * musicbrainz: Write musicbrainz release track ids :pr:`1992` * Rename Force Write plugin to "update tags in files" :bug:`1938` (:user:`Nick Boultbee <declension>`) * tray icon: Use App indicator when running under Enlightenment :pr:`1941` (:user:`Jakob Gahde <J5lx>`) * replaygain: delete tags written by bs1770gain. :bug:`1942` Development: * py.test support * Some Python 3 porting progress: 47% tests passing :bug:`1580` * OSX: build dmgs .. _release-3.6.2: 3.6.2 (2016-05-24) - It seemed like there was a lesson here, but nobody was sure what it was -------------------------------------------------------------------------------------------- * Fix queue not expanding with GTK+ 3.20 :bug:`1915` * Tag editor: Fix error message for unrooted patterns :bug:`1937` .. _release-3.6.1: 3.6.1 (2016-04-05) - GOOD LUCK OUT THERE ---------------------------------------- * Tray icon: Don't use the app indicator for Ubuntu GNOME and KDE 4. :bug:`1904` * Tray icon: Present the window when showing the window through the app indicator menu item. :bug:`1904` * Paned browser: Fix crash with numeric tags in patterns :bug:`1903` * Paned browser: Fix missing "Unknown" entry for patterns * OS X: Fix TLS for real * Lyrics window: Also support webkitgtk2 3.0 (for Ubuntu 14.04) .. _release-3.6.0: 3.6.0 (2016-03-24) - It is altogether fitting and proper that we should do this ------------------------------------------------------------------------------- Packaging Changes: * **Mutagen 1.30** required * **GTK+ 3.10** required * **PyGObject 3.10** required * **webkitgtk-3.0** → **webkit2gtk-4.0** (Lyrics Window plugin) * **sphinx 1.3** required for building the documentation * New optional plugin dependency: **libappindicator-gtk3** + **typelibs**: for the Tray Icon plugin under Ubuntu Unity and KDE Plasma * **python-musicbrainzngs** (>= 0.5) instead of **python-musicbrainz2** * **python-cddb** no longer needed * **libsoup** (>= 2.44) + **typelibs** required * Add a keyboard shortcut window. :bug:`1837` * Add ~language, which shows the language name for iso639 codes * Allow cross-device moves to trash. :pr:`1782` :bug:`1339` (Andrew Chadwick) * CLI: allow backslash-escaped commas in --enqueue-files. :bug:`1773` (Nick Boultbee) * Fix custom accels read from ``~/.quodlibet/accels`` :bug:`1726` :pr:`1818` * Fix determination of tag patterns in songlist :pr:`1830` (Peter F. Patel-Schneider) * Fix ratings not being stored if they are the same as the default :bug:`1461` :pr:`1846` * ID3: read lyrics from USLT frame, make ~lyrics read lyrics and form files :pr:`1810` (Ivan Shapovalov) * Make test suite run (and fail) under Python 3 :bug:`1580` * MP4: support conductor, discsubtitle, language & mood :bug:`323` (Nick Boultbee) * Paned browser: Allow filters to be reset by clicking heading. :bug:`1284` * Paned browser: use sort tags :bug:`1785`, :pr:`1796` (Peter F. Patel-Schneider) * Patterns: Allow proper escaping in nested queries. (``<~filename=/^\/bla\/foo/|match|no-match>``) * Player controls: use a normal button with two icons instead of a toggle button. :bug:`1814` * Playlist browser: implement scroll to playing song :bug:`1426` * Playlist browser: Make display configurable :bug:`1780` (Nick Boultbee) * Playlist browser: Improve usability when creating a new playlist :bug:`1839` (Nick Boultbee) * Playlist browser: Fix bug when deleting playlists :bug:`1882` (Nick Boultbee) * Remove rounded cover preference and make border radius depend on theme. :bug:`1864` * Search: make "ae" match "æ" and "ss" match "ß" etc. * Search: numeric expressions and query plugins :pr:`1799` * Song info display: show delete option to context menu. :bug:`1869` * Songlist: Highlight the current song. See :bug:`1809` * Support sort tags in song list patterns :pr:`1783` (Peter F. Patel-Schneider) * Various GTK+ 3.20 related fixes Translations: * Updated Dutch and Norwegian Bokmål translation :pr:`1784` (Nathan Follens) * Updated Polish translation :pr:`1898` (Piotr Drąg) Plugins: * Update icons for most plugins: more and (mostly) better chosen. :bug:`1894` (Nick Boultbee) * Make songsmenu plugins only enabled if it makes sense for them :bug:`1858` (Nick Boultbee) * Remove cddb plugin; it's broken * Remove Send To plugin, in favour of Browse Folders and k3b plugins. * New plugin: Pause on headphone unplug. :bug:`1753` * New events plugin: Shows synchronized lyrics from .lrc file with same name as the track :pr:`1723` * Add a seekbar plugin. See :bug:`204` * lyricwiki: port to WebKit2 * tray icon: support Ubuntu Unity and KDE Plasma (using libappindicator) :bug:`1756` * musicbrainz: port to musicbrainzngs. This fixes tagging of multi disc releases. :bug:`829` * Make LyricsWindow an events plugin; Add zoom level preference :pr:`1709` * Add authentication for MPDServer plugin :pr:`1789` * Custom Commands: add support for playlist name. :bug:`1685` (Nick Boultbee) * Playlist Export: convert to being a playlist plugin as well as songsmenu. (Nick Boultbee) OS X: * Add a simple dock menu * TLS support (https streams..) :bug:`1895` * Add option to enable experimental mmkeys support in the advanced prefs plugin. :bug:`1817` Wayland: * Fix seek bar window position (needs gtk+ 3.20) .. _release-3.5.3: 3.5.3 (2016-01-16) - Uh, I GUESS that'd be good too?? ----------------------------------------------------- * Fix crash when opening new windows under some DEs (Linux only) :bug:`1788` .. _release-3.5.2: 3.5.2 (2016-01-13) - This is because dates are arbitrary and friendship can be whatever we want it to be! --------------------------------------------------------------------------------------------------------- * Polish translation update (Piotr Drąg) * ID3: don't write albumartistsort twice :bug:`1732` * Use the stream song for ``--print-playing``. :bug:`1742` * Fix background color of some context menus with the Ubuntu 12.04 theme * Fix adding new tags failing in some cases :bug:`1757` * OSX: make cmd+w close windows :bug:`1715` * Fix a crash with numerics in tag pattern conditionals :bug:`1762` (Nick Boultbee) * Fix tests with newer Perl (through intltool) .. _release-3.5.1: 3.5.1 (2015-10-14) - HOW TO SUCCEED AT SMALLTALK ------------------------------------------------ * Fix volume / mute state resetting on song change with some configurations :bug:`1703` * Fix crash when G_FILENAME_ENCODING is set :bug:`1699` .. _release-3.5.0: 3.5.0 (2015-10-07) - BETTER ANSWERS TO "HEY HOW ARE YOU?" THAN "I'M FINE" ------------------------------------------------------------------------- Packaging Changes: * **Mutagen 1.27** required General: * Add --print-query-text to get the current query for browsers that support it :bug:`1634` * Support conditional patterns with QL Query syntax :bug:`1604` (Nick Boultbee) * Playlist content search in the playlist browser :pr:`1593` (Nick Boultbee) * Disable app menu under Unity :bug:`1599` * Allow users to optionally bypass the trash even if it is available on their operating system (Eric Casteleijn) :pr:`1573` * Try to prevent fifo timeouts for slow operations :bug:`1616` * Fix border drawing with CSD/wayland * Use float for ~#length :bug:`1483` * Add a setting to enable/disable rating hotkeys :pr:`1625` (Ryan Turner) * Display all tags in tag list editor not just the non-default ones :bug:`1660` * Add a new ~codec and ~encoding tag (library reload needed) :bug:`9` * Add ~bitrate tag including the unit * Asymmetric search improvements e.g. 'o' now matches 'ø' * Various custom column header dialog improvements :bug:`1660` (Nick Boultbee) * Prefer txxx replaygain over rva2 :bug:`1587` * Support reading RG when ID3 tag key is in uppercase :bug:`1502` Playback: * Implement direct sink volume control (e.g. for pulsesink, directsoundsink). Changing volume will now control the PA stream volume and result in less delay :bug:`1389` :bug:`1512` * Allow muting by middle clicking the volume button. Controls the pulseaudio stream mute property directly. * Increased GStreamer pipeline buffer size to reduce CPU usage :bug:`1687` * Hide seek slider when not seekable OSX: * Replace "Ctrl" with "Command" in all keyboard shortcuts :bug:`1677` * (already in 3.4.1-v2 build) HIDPI support * (already in 3.4.1-v2 build) Support for more audio formats Plugins: * Add a plugin for editing ~#playcount and ~#skipcount. :pr:`1624` (Ryan Turner) * Advanced preferences plugin :bug:`1050` (Bruno Bergot) * Allow to configure cover size in animosd plugin :bug:`1049` (Bruno Bergot) * Add plugin for removing TLEN frames from ID3 based files. :bug:`1655` * mpd: fix state sync with mpdroid 0.8. :bug:`1636` * Fix screensaver inhibit plugin. :bug:`1692` * qlscrobbler: fix offline mode check box. :bug:`1688` * lyrics window: use mobile wikia version Translations: * Update Dutch translation :pr:`1618` (Nathan Follens) * Updated greek translation :bug:`1684` (Dimitris Papageorgiou) * setup.py: add a new create_po command for starting new translations .. _release-3.4.1: 3.4.1 (2015-05-24) - Apparently, MY problem is a poisonous basement ------------------------------------------------------------------- Fixes: * setup.py: respect --install-data :bug:`1575` * Suppress deprecation warnings with newer glib Regressions: * Fix error when invoking a plugin with many songs/albums :bug:`1578` * Fix main window sometimes not showing under Ubuntu 12.04 * Fix search not working with non-ASCII text in some cases .. _release-3.4.0: 3.4.0 (2015-04-09) - She knew every of the things ------------------------------------------------- Packaging Changes: * The main repo moved from Mercurial (Google Code) to Git (GitHub) * The build should now be reproducible * **gtk-update-icon-cache** is no longer a build dependency * **gettext >= 0.15** is required now at build time * A complete **icon theme** is now required (this was also partly the case with 3.3) and an icon theme including symbolic icons is recommended. **adwaita-icon-theme** provides both for example. * **Mutagen 1.22** required, **Mutagen 1.27** recommended * New files installed to ``/usr/share/icons/hicolor/scalable/apps/`` * **quodlibet.desktop** now contains a **MimeType** entry, which means calling **update-desktop-database** is needed after package installation. * Improved Gnome 3.16 compatibility * Fixes for the list tooltips in combination with GTK 3.16 scrollbars * Include symbolic icons for gnome-shell 3.16 * Album browser: faster cover loading * Devices: fix detection of Sansa Clip+ with some setups :bug:`1523` * Prefs: restore active tab * Songlist: support patterns in the filter song list menu * New shortcut ``ctrl+shift+j``, like ``ctrl+j`` but refilters the browser always * Make build reproducible :bug:`1524` * MP4: include codec information in ``~format`` (needs a library reload) :bug:`1505` * GStreamer: fix a deadlock when seeking right at a song change * Queue: don't decide the next song too early :bug:`1496` * Song info widget: provide the full song context menu :bug:`1527` * CLI: ``--run`` to make QL start if it isn't already. Useful for pairing with other commands like ``--play-file``. :bug:`67` * Add supported mime types to desktop file :bug:`67` * CLI: ``--play-file`` doesn't add songs to the library anymore :bug:`1537` * Fix QL starting twice if started in quick succession * Tooltips: don't span multiple monitors :bug:`1554` * MPD-Server: Fix a crash when changing the port number :bug:`1559` * Fix short hang on shutdown with GStreamer plugins active :bug:`1567` * Fix setting an embedded image in case the file doesn't have tags :bug:`1531` * OSX: add a menu bar for Ex Falso * Fifo: Fix commands failing in case QL is busy :bug:`1542` * ... Translations: * Use msgctx for message contexts .. _release-3.3.1: 3.3.1 (2015-01-10) - Reduce, reuse, recycle, RESUBMIT ----------------------------------------------------- Regressions: * Fix occasional errors when closing menus (with the plugin menu in Ex Falso for example) :bug:`1515` * Fix operon info :bug:`1514` * Fix operon fill error in case a tag doesn't match :bug:`1520` Fixes: * Fix HiDPI DnD images when dragging multiple rows .. _release-3.3.0: 3.3.0 (2014-12-31) - PARALLEL UNIVERSES. Travel there and THEN go back in time, and you can mess things up as much as you want. ------------------------------------------------------------------------------------------------------------------------------- Packaging Changes: * New optional plugin dependency: **webkitgtk-3.0 + typelibs** * **Mutagen 1.27** recommended General: * Support ``--query`` with all browsers that have a search entry. :bug:`1437` * Songlist: Scroll to playing song when replacing the list. :bug:`568` * Songlist: Scroll to first selected song and restore selection for it on re-sort. :bug:`568` * Consider all songs in an album for finding (embedded) album art. :bug:`924` * Support ``month`` (30 days) in time queries (``#(lastplayed < 1 month)``. :bug:`706` * Support playing a song that is not in the song list. :bug:`1358` * Support numeric date search e.g. ``#(2004-01 < date < 2004-05)`` :bug:`1455` * Playlists browser: make delete key remove the selected songs from the current playlist :bug:`1481` (Nick Boultbee) * File tree: Show XDG desktop/downloads/music folders if available * File tree: List mountpoints on linux * Show the filter menu in secondary browser windows (filter shortcuts work there as well now) * Add ``alt+[1-9]`` shortcut for notebook widgets to jump the a specific page * Support loading ADTS/ADIF files (\*.aac). Needs mutagen 1.27. * Search: New regex modifier ``"d"`` which makes all letters match variants with diacritic marks (accents etc.). Enabled by default for normal text searches. ``Sigur Ros`` will now find songs containing ``Sigur Rós``. For regex and exact searches use ``/Sigur Ros/d`` and ``"Sigur Ros"d`` to enable. :bug:`133` * New ~people:real tag which filters out "Various Artists" values (Nick Boultbee) :bug:`1034` * Prefer artist over albumartist for single songs in ~people (Nick Boultbee) :bug:`1034` Fixes: * Update for theming changes in gtk3.15 * Fix seek slider not working with newer gtk+ and some themes :bug:`1477` * Fix playing song not restoring on start with radio/filesystem browser Translations: * Russian translation update (Anton Shestakov) :bug:`1441` * Updated Greek translation (Dimitris Papageorgiou). :bug:`1491` Tagger: * WMA: support multiple values for producer, conductor, artist, lyricist, albumartist, composer, genre and mood (needs mutagen 1.26) * APEv2: Support reading/writing embedded album art for APEv2 based formats (Wavpack, Musepack, Monkey's Audio) * Allow removing and renaming from tag names which not all selected formats support. * Allow toggling of programmatic tags in the tagging UI Plugins: * Various translation related fixes (Anton Shestakov) :bug:`1442` :bug:`1445` * New simple lyricwiki plugin using a WebKitGtk webview * New Rhythmbox import plugin. :bug:`1463` * MPD server: make work again with newer MPDroid (MPDroid crashed on start) * Trayicon: add option to quit when closing the main window instead of hiding :bug:`619` * Theme switcher: add option to enable/disable client side decorations * ReplayGain: add option to skip albums with existing ReplayGain values (Nick Boultbee) :bug:`1471` * Notifications: Make cover art display work under e19 :bug:`1504` Operon: * new 'edit' command for editing tags with a text editor (``VISUAL=vi operon edit song.flac``) :bug:`1084` * new 'fill' command for filling tags using parts of the file path (``operon fill --dry-run "<tracknumber>. <title>" *.flac``) OSX: * Multimedia key support (Eric Le Lay) * Global menu support / OSX integration. (Eric Le Lay) * Various fixes / improvements Windows: * Newer mutagen (1.27) * Newer GTK+/Gstreamer (Tumagonx) * Fix loading cover art from non-ansi paths * Starting QL will now focus the first instance if one exists * quodlibet.exe now passes command arguments to the running instance (quodlibet.exe --next) :bug:`635` * New quodlibet-cmd.exe which is the same as quodlibet.exe but can be executed in the Windows console with visible stdout :bug:`635` .. _release-3.2.2: 3.2.2 (2014-10-03) - ENJOY, THERE'S NO GOING BACK ------------------------------------------------- Fixes * Fix a crash when seeking streams in some cases :bug:`1450` * Fix a crash in case Windows Explorer favourites link to a non ASCII path :bug:`1464` * Fix playback stopping when playing chained ogg streams :bug:`1454` * Fix context menus not showing sometimes with GTK+3.14.1 Translations * Russian translation update (Anton Shestakov) .. _release-3.2.1: 3.2.1 (2014-08-16) - BAKE HIM AWAY, TOYS ---------------------------------------- Fixes * Fix Ex Falso not starting in some cases. :bug:`1448` * Album art download plugin: Fix image file extension (Nick Boultbee) :bug:`1435` Translations * Russian translation update (Anton Shestakov) :bug:`1441` .. _release-3.2.0: 3.2.0 (2014-08-01) - WHAT KIND OF GOD MADE IT SO LIONS HUG BACK TOO HARD ------------------------------------------------------------------------ Packaging Changes: * **Plugins got merged** into Quod Libet. This means the quodlibet-plugins tarball is gone and plugins will be installed by ``setup.py install``. For distros that used to include the plugins in the main package this means all plugin related packaging code can simply be removed. For distros that offered separate packages the installation can be split by packaging ``quodlibet/ext`` in a separate package. Quod Libet can run without it. * **UDisks2** is supported, in addition to UDisks1 * **Python 2.7** required instead of 2.6 (might still work, but not tested) Tags: * ~people and ~performer don't show roles anymore, which makes them more useful in the paned browser for example. Instead ~people:roles and ~performer:roles will include roles and merge roles like "Artist (Role1, Role2)". Furthermore composer, lyricist, arranger and conductor will be merged with performer roles in ~people:roles. so "performer:role1=Foo, composer=Foo" will result in "Foo (Role1, Composition)". (qjh) * ~#rating in the song list is now a numeric column, ~rating shows the stars (Jan Path) :bug:`1381` UI: * HiDPI support (start with GDK_SCALE=2, needs cairo trunk) * Various display fixes for GTK+ 3.13 and non-Adwaita based themes * Seek slider width scales with song length to some extend * Seek slider shows remaining time * Play order plugins are now split in random/non-random and the UI was replaced by a toggle button + menu. :bug:`1411` * Removing of songs from a playlist through the context menu (Nick Boultbee) * Song list columns now remember their width/state (qjh) * Song list columns provide an option to toggle if they expand. * The multi sort dialog is gone, instead it's now possible to sort by multiple tags by holding down ctrl and clicking on multiple columns. Plugins: * New MPD Server plugin to remote control QL, e.g. through MPDroid :bug:`1377` * New acoustid.org fingerprint tagger (basic functionality, but works) * "Show File" merged into "Browse Folders", it will now try to select the files if the interfaces allows it. * Exact rating plugin (Jan Path) :bug:`1383` Player: * Improved GStreamer error reporting. * Error recording is gone, since it was just annoying. :bug:`1400` Windows: * Fix slow startup :bug:`1389` * Windows Explorer folder context menu entry for Ex Falso Misc: * Keyboard shortcuts are now documented: https://quodlibet.readthedocs.io/en/latest/guide/shortcuts.html Developers: * Due to the inclusion of the plugins into the core, the symlink from ~/.quodlibet/plugins is no longer needed. Fixes: * Fix tray icon crashing or not showing under Gnome Shell 3.12 :bug:`1429` Packaging: * UDisks2 supported, in addition to UDisks1 * Plugins are now included in the main tarball and will be installed by setup.py, the quodlibet-plugins tarball is gone. (Load path switched from quodlibet/plugins to quodlibet/ext for system wide plugins, loading from ~/.quodlibet/plugins is the same) :bug:`1396` * For BSDs: setup.py has a new "--mandir" to select the man page location * Packaging guide: https://quodlibet.readthedocs.io/en/latest/packaging.html .. _release-3.1.91: 3.1.91 [beta] (2014-07-22) - Pumps, powerheads, lights and filters! ------------------------------------------------------------------- See :ref:`final release <release-3.2.0>` .. _release-3.1.2: 3.1.2 (2014-06-20) - Dang it ---------------------------- * Fix 3.1.1 regression causing folders in the file browser to show up in reverse order :bug:`1390` .. _release-3.1.1: 3.1.1 (2014-04-28) - I've shown that you're dealing with an Alpha here, baby, not some weak Beta! ------------------------------------------------------------------------------------------------- * Fix a crash with GTK+ 3.12 :bug:`1384` * Handle invalid flac picture blocks :bug:`1385` * Fix "setup.py install --record" :bug:`1373` .. _release-3.1.0: 3.1.0 (2014-04-10) - Olden times, man! NEVER LIVE THERE. -------------------------------------------------------- * Windows is supported again. And it should be in better shape than with 2.6 in many aspects. Embedded images work now, newer GStreamer with more codecs, operon is included etc. The file browser and EF now show the favorite folders from the Windows Explorer. The installer will now uninstall any existing installation first and as with 2.6.3 there is a portable version available. There is still an unsolved problem regarding miss-placed context menus with multiple monitors :bug:`1319`. Thanks goes to Bakhtiar Hasmanan for providing a working PyGObject stack. * Initial Wayland support is here (only tested under weston). This was mostly fixing weird usage of GTK+ that just happened to work under X11 and not using the screen size for calculations since there is no real screen under Wayland. * Piotr Drąg, Rüdiger Arp, Diego Beraldin and Dimitris Papageorgiou worked on improving the translations. * Nick Boultbee worked on a plugin system for playlist plugins and moved the duplication/shuffle actions to it. He also moved the rating configuration from the plugin into the core. * Simonas Kazlauskas worked on a plugin system for cover art sources currently supporting last.fm and musicbrainz (exposed as two plugins). If active it will fetch covers in case no local cover is found. In the future we might implement the album art downloader on top of that. * Thomas Vogt made transparency work again with GTK+3 in the OSD plugin. (fake transparency now also works again, which was the last known regression from the PyGObject port) * operon gained new commands (image-extract, image-set, image-clear) for manipulating and extracting embedded images for all formats supporting embedded images in QL (id3, ogg, flac, wma, mp4). See the manpage [0] for examples. There is also a QL plugin which allows removing all embedded images and embed the active one. This should get better integrated into the tag editor at some point. * Display patterns now support specifying the markup using square brackets to not need escaping in the common case. "\<b\><artist>\</b\>" can now be written as "[b]<artist>[/b]" (the old way still works). * In the radio browser the radio list now contains icecast and shoutcast2 stations in addition to shoutcast1 ones and only one additional mirror is included for each station. QL now shows ~4100 stations of ~30000 we know about. Use "Update stations" to get the new list. Other changes: * QL now remembers additional open browsers and reopens them on start. * The main tool bar is better integrated with GTK+ themes. * We use symbolic icons in many places. * Added a simple GNOME app menu. * 'albumartist' is now used for album identification. * <shift>space enables "stop after the current song". * Warning before opening too many plugin windows (Nick Boultbee) :bug:`1231` * New --unqueue-all command :bug:`1234` Fixes: * Config gets saved atomically and handle a corrupted one :bug:`1042` * editing:id3encoding option was ignored :bug:`1290` * album browser: Fix sorting by rating :bug:`1352` * search: Fix results for "&(foo, !bar)" :bug:`1327` * Various crashes caused by code not being ported to PyGObject properly. Dependencies & Packaging: * No dependency changes compared to 3.0 * We now install appdata.xml files * We now install a dbus service file * ``setup.py build_sphinx`` builds the html user guide .. _release-3.0.91: 3.0.91 [beta] (2014-02-28) - You'd have to be in space for that to work. ------------------------------------------------------------------------ See :ref:`final release <release-3.1.0>` 2.6.3 (2013-09-25) - The one that can't even go naked into space without dying! ------------------------------------------------------------------------------- This is a Windows only bug fix release. Windows: * Fix library saving [1230] (Sebastian Thürrschmidt) .. _release-3.0.2: 3.0.2 (2013-07-22) - LATER, THE OCEANS BOIL AS THE EARTH TURNS TO FIRE ---------------------------------------------------------------------- General * Device backend: Correctly detect udisks1 if it isn't running [1200] * mmkeys: Really make libkeybinder work again [1203] (Hans Scholze) * Fix play button not starting playback if no song is active [863] * Don't forget newly created bookmarks in some cases * Fix "Refresh" in the file tree browser [1201] * Fix menu separator drawing with PyGObject 3.2 (Ubuntu 12.04) * Various fixes Plugins * Forward library events to event plugins again * Fix bookmarks plugin, playlist export plugin, HTML export plugin * animosd: Handle multiple monitors (Nick Boultbee) 2.6.2 (2013-07-22) - 256 Pictures of Cool Bugs ---------------------------------------------- 2.6.1 skipped to keep in sync with the 3.0 branch. General * Device backend: Correctly detect udisks1 if it isn't running [1200] * Fix play button not starting playback if no song is active [863] * Don't forget newly created bookmarks in some cases * Various fixes Plugins * Fix HTML export plugin * Fix Bookmarks plugin .. _release-3.0.1: 3.0.1 (2013-07-08) - *gasp* --------------------------- * Fix a crasher with some PyGObject versions [1211] .. _release-3.0.0: 3.0.0 (2013-06-15) - THE NEMESIS HYPOTHESIS ------------------------------------------- Requirements & Packaging Changes * Python 2.6+ * GTK+ 3.2+ & GIR (instead of 2.x) * GStreamer 1.0+ & GIR (instead of 0.10) * PyGObject 3.2+ (3.4 highly recommended) (instead of PyGTK) * PyGObject cairo support * libgpod 0.5+ (instead of python-gpod) * libkeybinder-3.0 & GIR (instead of python-keybinder) * HAL support removed * New `operon` script + man page * New .ini file for registering QL as a GNOME Shell Search Provider Translations * New: Czech translation (Honza Hejzl) * Russian translation update (Anton Shestakov) * Lithuanian translation update [1079] (Naglis Jonaitis) * Swedish translation update [1117] (Daniel Nyberg) * Spanish, Basque and Galician translation update (Johám-Luís Miguéns Vila) * Greek translation update [1175] (Dimitris Papageorgiou) General * Improved rating visibility [1070] (Nick Boultbee) * File system view: DnD directories to external targets (Nick Boultbee) * Support GNOME Notification Sources * Bayesian averaging for set (album) ratings [1085] (Nick Boultbee) * New command line tagger: operon (see `man operon`) * Hide songs on not-mounted drives on start without library refresh [984] * Preferences UI for managing masked mount points [984] * Support all patterns as song list headers [507, 1121] (Nick Boultbee) * Save/restore queue position * Documentation is now Sphinx/reST based and hosted on readthedocs.org Fixes * Fix unwanted re-filtering of all open browsers if the search history changes * Fix crash when re-adding devices while QL is running [1120] * Remove EF directory mime type again (too many problems with file managers) Tagging * APEv2: Add disc<->discnumber mapping Plugins * New: Custom Commands plugin (Nick Boultbee) * New: GNOME Shell Search Provider plugin [1147] * ReplayGain plugin: Parallel processing [807] * CD burn plugin: Add Xfburn support [1173] Known Regressions * GStreamer output device selection is no longer supported. (GStreamer 1.0 has removed the property probing interface) * No multimedia keys support with non-GNOME DEs in some distributions due to missing packaging: * https://bugzilla.redhat.com/show_bug.cgi?id=963476 * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=710254 * Animated On-Screen Display plugin is missing transparency support * No Windows build (work in progress) 2.6.0 (2013-06-15) - Someone's attacking us from... space? ---------------------------------------------------------- 2.6 is the last PyGTK/GTK+2 based release of Quod Libet / Ex Falso. It contains most of the changes that went into 3.0 and will only receive bugfix releases from here on out. Requirements & Packaging * Python 2.6+ * PyGTK 2.16+ Everything else * See 3.0.0 NEWS with a few exceptions 2.9.92 [beta] (2013-06-05) - alternatetimelinemetarhyme ------------------------------------------------------- General * Fix the main song list resetting while working with multiple browsers * Fix various widget redraw/positioning/jumping problems * Various fixes regarding GTK+3.6+ (seek slider, tv hints) * Nicer about dialog * Fix one-click ratings [1170] * Fix various crashes with PyGObject3.2 [1172] Plugins * New GNOME Shell Search Provider plugin [1147] * Support Xfburn in the CD burn plugin [1173] * viewlyrics plugin: Fix key handling [1171] * Fix musicbrainz plugin [1162] * Fix replaygain plugin in Ex Falso [1163] * Fix fingerprint plugin [1174] 2.9.91 [beta] (2013-05-13) - welcome to a place where incredibly terrible things can happen to you and your friends for no reason! ---------------------------------------------------------------------------------------------------------------------------------- General * Spanish, Basque and Galician translation updates (Johám-Luís Miguéns Vila) * Tag editor: Fix context menu not showing * Album collection: Fix crash with PyGObject 3.2 * Fix search bar text color * Fix DnD to closed queue * Fix hangs during unix signal handling * Fix 100% CPU in some cases * Fix library refresh pause/stop handling * Some speed improvements and fixes Plugins * ReplayGain plugin now processes albums in parallel * New dark theme option in the theme switcher plugin * Fix GStreamer equalizer * Fix theme switcher plugin * Fix GStreamer mono plugin 2.9.82 [alpha] (2013-05-02) - One day Marty McFly got bit by a werewolf! ------------------------------------------------------------------------ PyGObject/Gtk+3.0/Gstreamer1.0 Port - Alpha 2 release: * Fix lyricsview plugin (Nick Boultbee) * Fix replaygain album gain/peak writing. * Fix crash on one-click ratings in the song list. * Fix crash when playing a song while editing its tags. * gstbe: Increase operation timeouts (for spinning up disks etc.) 2.9.81 [alpha] (2013-04-27) - Because my hypothesis is: it's rad ---------------------------------------------------------------- PyGObject/Gtk+3.0/Gstreamer1.0 Port - Alpha 1 release 2.5.1 (2013-04-23) - Yes: MY COMPUTER IS A PERSON. -------------------------------------------------- * Fix various widgets not showing with pygtk/pygobject trunk * Fix QL refusing to start in some cases [1131] * Improve web browser discovery and fix on Windows * Fix various problems with playlists + masked files [1095] * Reduce debug output if loading a file fails [1080] * Plugins: * notify: Don't set notifications to transient [1103] * lastfmsync: Fix loading/saving of cache [1093] 2.5 (2012-12-19) - Reading on the floor: literature! ---------------------------------------------------- * Greek translation update (Dimitris Papageorgiou) [1064] * Russian translation update (Anton Shestakov) [1072] * Lithuanian translation update (Naglis Jonaitis)[1079] 2.4.91 [beta] (2012-11-23) - hello and thank you for installing an internet! ---------------------------------------------------------------------------- News for packagers * setup.py will install png and svg icons into hicolor and a png icon into pixmaps. It will also try to call gtk-update-icon-cache if it's in the target prefix/root (make sure the icon cache gets updated on package install) * C extensions removed. QL is now Python only. * PyGTK 2.16+ * Python 2.6+ * Support for libudev.so.1 (>= 183) * New: python-keybinder needed for multimedia keys * New plugin directory: gstreamer * Optional plugin dependencies: * Removed: python-indicate (Ubuntu sound menu), lastfmsubmitd (old last.fm plugin) * New: rygel (DBus UPnP MediaServer), python-zeitgeist (Zeitgeist) News for translators * QUODLIBET_TEST_TRANS=xxx will append/prepend "xxx" to all translations so you see what is translatable and for devs to check how, long translations will affect the UI. * "setup.py po_stats" to see how much is translated for each po file. * "setup.py check_pot" to see if a file containing translatable strings is missing from POTFILES.in General * Search: Handle non-ascii values for filesystem tags (~filename, ~dirname..) [227] * New internal tags: ~originalyear ~#originalyear. [966] * New internal tag: ~playlists (Nick Boultbee) * Shortcut: alt + left/right -> seek +/- 10 seconds [981] * Support startup notification spec * Support newest thumbnail spec (v0.8.0) * Basic Unity quicklist * New --stop switch to stop and release the audio device [1018] * List tooltips: work with gnome shell, never shift left, support trees [778] * New --no-plugins switch to start without plugins * No wakeups if nothing is playing. * Directory mimetype for Ex Falso * Shortcut: ctrl+left/right, left/right for treeview navigation * Some UI cleanup, less padding in the main window * Remember window size & position for properties, info, browsers [106] * Device selection for the gstreamer back-end * Use lyricist for finding lyrics if available * Click on default cover icon launches album art plugin [2] (Nick Boultbee) * Fix: Work with Compiz window placement plugin [871] * Fix: Queue widgets not clickable in some cases * Fix: Double-click on album will plays song from queue [231] * Fix: Filter on album in album browser now uses the album key * New: PluginConfigMixin added to core to simplify plugin prefs (Nick Boultbee) * Fix: --status (carlo.teubner) [1045] Formats * New: Monkey's Audio * New: Ogg Opus (needs mutagen 0.21) [1012] * New: MIDI * Basic SPC tag parsing [282] (David Schneider) * Add m4v to valid mp4 extensions Tagging * Limit path sections to 255 chars instead of tags to 100 [915] * ID3: Write foobar style replaygain tags. [1027] * VORBISCOMMENT: Write totaltracks/totaldiscs [929] (Michael Ball) * Shortcut: ctrl-s for saving changes, and configurable standard accels per locale [697] (alex.geoffrey.smith, Nick Boultbee) * Updates to tag splitting (originalartist, performer) (Nick Boultbee) Translations * New: Greek translation (Dimitris Papageorgiou) * German translation update (Rüdiger Arp) * British English translation update (Nick Boultbee) * French translation partial update (Nick Boultbee) Plugins * Removed: lastfmsubmitd * Removed: DBus mmkeys (moved to core) * Removed: Ubuntu Sound Menu (no longer needed) * New: UPnP AV Media Server plugin (needs rygel) * New: ViewLyrics plugin (Vasiliy Faronov) * New: Filter on directory [922] * New: Zeitgeist plugin [717] * New: Mac OS X mmkeys plugin (Martijn Pieters) [967] * New: Telepathy/Empathy status plugin [478] (Nick Boultbee) * New GStreamer plugins: Compressor, Crossfeed, Pitch, Mono * New: Filter on multiple tags [1014] * New: Squeezebox Playlist Export (Nick Boultbee) * Browse Folders: Use the default file browser [983] * Equalizer: add presets * MPRIS: various fixes (for the GS plugin) * Notify: Dismiss notifications after some time * Duplicate Browser: expand/unexpand all button * CD burn: now menu-based * Updated: Auto Library Updater (Nick Boultbee) Browsers * New: Album Collection - provides a tree-like view of albums similar to Paned. * Playlists: * Delete shortcut [942] (Johannes Marbach) * Shuffle playlist (Nick Boultbee) * Remove duplicates [685] (Nick Boultbee) * Album list: more filters Windows * Make Browse folder plugin work [993] * Multimedia keys support 2.4.1 (2012-07-27) - Man! If I were a robot, a lot of things would be different ------------------------------------------------------------------------------- * Fixes: * Fix skipping one song during a song change [987] (This also broke the random album plugin in some cases) * Windows: Crash in file system view if 'My Music' folder is missing [1008] * Fix --quit [958] * Fix playing of files that don't match the file system encoding [989] * Workaround for mutagen ID3v2.3 update bug [mutagen 97] * Various fixes [1013, 1002, 962] * Plugin fixes: * lastfmsync crashes [957] * Various Duplicate browser fixes [999, 954] * Notification crash [975] 2.4 (2012-03-18) - He decides he must become... Abe Atman! ---------------------------------------------------------- * Fixes: * Support xinelib 1.2 [904] * MP3/ID3: fix some rare crashes; prefer main embedded cover * Vorbiscomment: * Ignore coverart and use it as cover art source [910] * Fix deletion of metadata_block_picture * album art: update coverparadise, disable discogs (API changed) * squeezebox fixes (Nick Boultbee) * German translation update (Rüdiger Arp) * Various fixes [890, 909, 899] * Fixed regressions: * Python 2.5 / PyGTK 2.12 compatibility * Restore saved play order [891] 2.3.91/92 [beta] (2012-01-16) - Players only love you when they're playing -------------------------------------------------------------------------- * Fixes: * Don't remove periods from tag values in patterns [368] * Don't jump to playing song on stream changes * Fix wrong path encoding in the exfalso file selector under Windows * Fix error when controlling playback during startup [810] * Handle invalid header patterns * Don't lose the radio libary randomly [645] * Handle non utf-8 and invalid filenames in the song list [798] * Fix a crash when the song list changed during a gapless transition [799] * Tray icon doesn't appear in KDE panel [881] * xine backend: Fix equalizer value range * Plugin Fixes: * Fix "&" in notifications (xfce4-notifyd) (Anton Shestakov) * Fix animosd config again * Fix Amazon cover search (API change) * General * Improved startup speed * GNOME session shutdown fixes * Hide all windows on shutdown * Handle signals during startup * Correctly push signals into the gtk+ mainloop (no more segfaults) * Cyclic saving of all libraries not just the main one * Rename the process to "quodlibet" or "exfalso" [736] (Nick Boultbee) * Queue keyboard shortcut is now Ctrl+Return not just Q [747] * Add new songs that match the active filter to the song list * Focus search entry with ctrl+l [666] * Fix reverse sort (sort by album first) * Custom sort dialog [820] (Philipp Müller, Joschka Fischer) * Make the paned browser the default one * Focus the first row in all automatic list selections [835] * Select next song in the song list after song removal [785] * Speed up song removal in long lists [785] * Delete keyboard shurtcut in the queue * Add menu entry to rate current playing song (Nick Boultbee) * Make it possible to override quodlibet/exfalso icon, by placing an icon in the current icon theme [614] * Close buttons in all dialogs (since GNOME 3 has no close button in the window decorations for dialogs by default) [772] * Make main window resizeable with only the queue showing [657] (Florian Demmer) * Make the paned browser prefs resizable * Search bar: No delays for any keyboard/mouse actions except typing * Estimate FLAC bitrate using the filesize [342] (Nick Boultbee) * New ~#filesize tag: requires library reload (Nick Boultbee) * Enhancements to the ways album art is detected (Nick Boultbee): new tab in prefs, new option for forcing art filename [328], new option for preferring embedded image over external ones * Allow numeric ~#replaygain_xxx tags (Nick Boultbee) * album browser: Restore search on start * album browser: Move sort order in the preference button sub menu * album browser: Load all visible covers before showing the album list * album browser: Fewer redraws after filtering * album browser: Add sort by genre option [340] * radio browser: Genre filter list * radio browser: Use the default search bar (with history) * radio browser: Remote station list with 4000 stations * radio browser: Properly sync the song list play icon with song changes * radio browser: Prefill new station dialog with last URL in the clipboard * radio browser: title falls back to organization and artist to website (for the song list) * radio browser: Buffer process shown in status bar * search: Stricter numeric value parsing (only allow valid units) * search: Don't require a space between number and unit: #(added<1day) * search: Support GB/KB/MB/B units for ~#filesize * Gstreamer: * Fully support playbin1 again (QUODLIBET_PLAYBIN1 env var) * Allow setting of stream buffer duration [696] * Sync replaygain volume change with track change [652] (use track-changed signal in newer gstreamer) this needed the removal of the 500ms queue. Can be enabled if there are problems with gapless (QUODLIBET_GSTBE_QUEUE env var) * Don't add equalizer if the plugin is disabled: No unnecessary conversions to float (flac, mp3 decoder), less CPU * Don't use the fluendo mp3 decoder if mad is available, less CPU * No video decoding/playing (mp4 files for example) * Properly emit song-started/ended for radio stream songs (so they get counted as auto started by the new notify plugin) * Add button in the prefs to print the currently used pipeline including format conversions (only in --debug mode) * No more jumping of the position slider during song changes * Better parsing of stream metadata [750] * Translations: * Russian translation update (Anton Shestakov) * German translation update (Rüdiger Arp) * Italian translation update (Luca Baraldi) * Tagging/Ex Falso: * Improve support for language tag, with ISO 639-2 suggestions (Nick Boultbee) * ID3: handle TLAN [439] (Nick Boultbee) * Ignore zero TLEN id3 frame [222] * Allow performer to be split out of title (Nick Boultbee) * Ogg Theora support * Ex Falso about dialog * CLI: * --debug (colored output, yay) * --enqueue-files=file,file [716] (Nick Boultbee) * --print-query=query [716] (Nick Boultbee) * --force-previous [441] (go to previous not depending on the current position) * Plugins: * Removed old plugin import fallback code: In case loading a third party plugin fails, set the QUODLIBET_OLDIMPORT env var. * Show an error message instead of the stack trace for common plugin loading errors (import errors) * Improved notification plugin [588] (Felix Krull) * Improved scrobbler preferences with account data verification * Trayicon: Use custom theme icons [614] Prevent the main window from showing on startup * Musicbrainz: Only write sort tags that are different * Titlecase: New prefs switch to allow all caps in tags (Nick Boultbee) * NEW: Website Search (Nick Boultbee) * NEW: Inhibit Screensaver while playing (GNOME) * NEW: Pause while the screensaver is active (GNOME) * NEW: Acoustid.org fingerprint plugin (only for submitting atm) * NEW: Duplicates browser (Nick Boultbee) * NEW: Mute radio advertisements (di.fm only atm) * NEW: Watch directories for file changes (using pyinotify) [270] (Nick Boultbee, Joe Higton) * NEW: Theme switcher plugin * NEW: Squeezebox plugin (Nick Boultbee) 2.3.2 (2011-10-17) - It doesn't matter! My beats are great! ----------------------------------------------------------- * Fix crash in album browser [781] * Plugins: * DBus multimedia keys: Make it work with gnome-settings-daemon 3.x * Album art: Remove darktown, fix discogs. * MPRIS: Various fixes [776, 817, 827] * Translation Updates: * Lithuanian (Naglis Jonaitis) 2.3.1 (2011-07-16) - YES It works in BOTH temporal directions ------------------------------------------------------------- * Absolute path renaming on Windows [506] * Fix dynamic song removal of songs not matching the query [713] * Fix "--print-playing <~#rating>" [730] * Fix search not working with an active pattern column * Fix hang with newer GStreamer versions and sinkless pipelines * Some minor fixes [682, 724, 704] * Plugins: * Fix MPRIS not handling invalid dates (Nick Boultbee) * Some OSD fixes (Nick Boultbee) * Translations: * German (Rüdiger Arp) * Italian (Luca Baraldi) * Lithuanian (Naglis Jonaitis) 2.3 (2011-04-01) - I THOUGHT THAT WAS PRETTY CLEAR --------------------------------------------------- * Various minor bug fixes * Some small translation updates (Anton Shestakov) * Update of the 2.2.99 news entry 2.2.99 [beta] (2011-03-13) - I can imagine that one day there could be aperson who would read that -------------------------------------------------------------------------------------------------- * Quod Libet now needs Python >=2.5 * Drag and drop in paned browser * Speed up adding many songs to the queue * Smaller volume, seek controls * Ask for playlist name on creation * Output playing progess when using --status * Use current icon theme icons everywhere (for DAPs etc.) * Floating point custom tags * Audio streaming fixes (buffering etc.) (Andreas Bombe) * Treeview hints in paned browser * Cover art now only uses the available space * Support embedded covers art in WMA/Vorbis files * Set composer, albumartist, sort tags when copying to an iPod * Natural sorting in the song list * Many song list speedups (sorting, filling, scrolling) * Split up pattern results in paned browser with multi-value tags * Only consider a song played after half has elapsed * Undo/Redo support for all text entries * New framework for showing running tasks, notifications in the status bar * Text markup in the paned browser * Restore maximized state * Restore window position (Felix Krull) * Make size of the queue adjustable (Florian Demmer) * Mouse scrolling over the play button now changes songs * Support alternate home directory using $QUODLIBET_USERDIR (jkohen) * Make the default rating changeable (library reload needed) * Drag and scroll in the song list * Faster context menu opening * Display playlist size (library reload needed) (Nick Boultbee) * Support queries without specifying a tag name * All queries in the album browser use a standard operation (avg, sum etc.) * Support ~rating, ~#bitrate in the album pattern * Support separate song collection patterns in the paned browser * Don't jump to a playing song if it was selected from the songlist * Faster local cover search * Support FreeDesktop trash spec * Lower case option for file renaming (Nick Boultbee) * Various bug fixes, speed improvements (Jacob Lee, Johannes Rohrer, Tshepang Lekhonkhobe) * Bug fixes: * Treeview hints now work with GTK+ >= 2.20 * Search history now gets properly shared between browsers * Fix udev crashes * Paned browser leaks * Respect global filter in all browsers/filters * Don't lose tag values with differently cased tag names (APEv2) * Fix --set-browser (Carlo Teubner) * Properly handle the case where a playing song gets deleted * Fix redraw errors using compiz * FSync on library save * Fix crash when ~/.gtk-bookmarks contains empty lines (Felix Krull) * Correctly identify rockboxed iPods * Windows (Uninstall any previously installed version!): * Fix translation under Win 7 * Fix cover art plugin saving * Add all partitions to the file selector * Fix various crashes with wide char user names * Fix icon under Win 7 * Support multi-user installations * Fix freezes after opening certain folders * New plugins: * Follow cursor play order plugin * Equalizer plugin * MPRIS 1.0/2.0 plugin * Ubuntu sound menu plugin * Rating reset plugin * Track repeat plugin (Nick Boultbee) * Plugins: * Go to bookmark plugin now menu based * Fix some album art plugin backends (Aymeric Mansoux, ..) * Improved "human" title casing (Nick Boultbee) * Fix queue only plugin stopping the current song. * Only use allowed HTML in the notify plugin. * musicbrainz: allow writing sort tags (Michaël Ball) * Translations: * new Latvian translation (Einars Sprugis) * new Basque translation (Piarres Beobide) * French translation updates (Nick Boultbee) * Brazilian/Portuguese translation updates (Djavan Fagundes) * Russian translation updates (Anton Shestakov) 2.2.1 (2010-03-27) - Fewer than four out of ten people respect my promises -- and possibly more! ------------------------------------------------------------------------------------------------ * Fix for importing some mp3 files. [220] * More fixes for the device backend (iPod, multi partition DAPs). [410, 412] * Fix editing keys with multiple values. [440] * Fix weighted playorder algorithm. * Save songlist column patterns. [447] * Some small fixes here and there. * Plugin fixes: * Title case: Improved title casing for English text. (Nick Boultbee) * Random Album: Algorithm improvements. * QLScrobbler: Fix preference pane ordering. * Album art: Some images weren't displayed. (Tomasz Miasko) [429] * Last.fm Sync, Musicbrainz: Minor fixes. * Translations: * Galician, Spanish (Johám-Luís Miguéns Vila). * German (Rüdiger Arp). 2.2 (2010-02-02) - I know you are enjoying that song but a woman DIED --------------------------------------------------------------------- * Saved searches extended to Album and Paned browsers [41]. * Human sorting is now used in Album and Paned browsers [190]. * Windows is now supported (for real this time). * foobar2000's broken TXXX:DATE now supported [220]. * Warnings are now printed for many missing dependencies. * Fixes for device backends. * Lyric downloading disabled until it can be fixed [273]. * Editing both key and value with multiple keys fixed (extruded) [393]. * Plugin changes: * AnimOSD: major update (Andreas Bombe, Christine Spang) [387]. * MusicBrainz: major update. * Random Album: Changed algorithm to increase fairness. * QLScrobbler: Custom patterns for title and artist. * Last.fm Sync: new plugin to sync stats from Last.fm. * Notify OSD, Album Art: Minor fixes. * Translations: * Galician, Spanish (Johám-Luís Miguéns Vila). * French (Bastien Gorissen). 2.1.98 [beta] (2010-01-04) - How are you going to convince people to use it? ---------------------------------------------------------------------------- * Christoph Reiter is now a maintainer. * The GStreamer backend is now gapless [49]. * Win32 is once again supported [248]. * ID3 tags are removed from FLAC files upon saving [124]. * File extensions are converted to lowercase upon renaming [66]. * Thumbnails are now generated for artwork [140]. * Inline searches in the album list can now match people [239]. * Embedded album art is now supported in FLAC files [255]. * Bitrates are now reported in kbps. Library reload required [79]. * Additional ReplayGain settings (Nick Boultbee) [132]. * Tag splitting setting is now order-sensitive [74]. * Paned browser now supports patterns for panes [45]. * Numeric columns have been given a few tweaks (Johan Hovold) [81]. * New ratings column options (Johan Hovold, Bastien Gorissen) [82, 83]. * Renaming when symlinks present no longer raises error (Philipp Weis) [353]. * Xine backend uses software volume control (Markus Koller) [370]. * Song positions are now saved and restored when quitting [218]. * DeviceKit-Disks (UDisks) supported for device discovery [252]. * Plugin changes: * New playlist export plugin [30]. * New queue only playorder plugin [43]. * New Python console plugin. [229] * Updated trayicon plugin [158]. * Updated album art plugin (Eduardo Gonzalez) [139]. * Updated qlscrobbler plugin (Nicholas J. Michalek) [376]. * Updated lastfmsubmit plugin [292]. * Translations: * Russian (Anton Shestakov) [274]. * Turkish (Türerkan İnce). * German (Rüdiger Arp). * Many bug fixes and performance improvements. 2.1 (2009-07-04) - My God, Utahraptor, that's THE PERFECT SOLUTION. ------------------------------------------------------------------- * Bug fixes: * Installer fixes [15, 27, 88] * Right-click on menu causes crash [14] * Removing a pane from the paned browser causes segfault [131] * Null bytes in tags are now stripped on load [177, 242] * zh_CN translation updated [156] * Support .oga file extension for Ogg Vorbis files [52] * Support libre.fm scrobbling in qlscrobbler plugin * Get Internet Radio channel listing from yp.icecast.org [18] * Ignore errors during playback for ~#skipcount [37] * URIs supported for --play-file and --enqueue [17] * Many minor fixes and enhancements. 2.0 (2008-09-14) - Once upon a time there was a radical guy! ------------------------------------------------------------ * Make Escape a synonym for Ctrl+W in QLTK Windows. (I#8) * Actually fix playlist error. * Fix Xine backend "Stop" behavior. 1.999 [beta] (2008-09-09) - It has been a memorable day ------------------------------------------------------- * Fix playlist error when loading songs. * Unlock device when "stop" mmkey is pressed. (Javier Kohen, I#6) * Restart song when rewinding and > 0.5s in. (Javier Kohen, I#7) * Updated Galician and Spanish translations. (Johám-Luís Miguéns Vila) * Make requirements consistent across all documentation. 1.99 [beta] (2008-09-08) - It is impossible to know if my dream came true ------------------------------------------------------------------------- * New distutils-based build/test/install system. * Multiple audio backend support. * Xine-based audio backend. * "Null" backend for Ex Falso. * Tag Editing: * Tags From Path: "<~>" will eat a string but not save it. * Track Numbers: Allow numbering up to 999. * Show image files in Ex Falso. * Direct output to console and to a debugging window. * Functions are accessible to plugins as print_d, print_e, and print_w. * default_rating configuration option. (Robert Muth) * Many bug fixes and performance improvements. 1.0 (2007-05-05) - Yeah they just showed up one day -- staring. --------------------------------------------------------------- * Use Mutagen for ASF/WMA and MP4 support. * Add IsPlaying and GetPosition to the D-Bus API. (Mickael Royer) * Default "No Cover" image. (Jakub Steiner) * Add --unfilter to reset browser filters. * Sort --enqueued files, and add --unqueue. * Basic SPC (SNES ROM audio) support. * Paned Browser speed improvements. (Robert Muth) * Errors when playing a song are now logged to a special ~errors tag. It is visible from the Information screen, and can be reset. * APEv2 tags can now override Musepack stream Replay Gain settings. * Numerous bug fixes, especially in media device handling. * Translation Updates: * Hungarian. (SZERVÁC Attila) * Finnish. (Jari Rahkonen) * Galician and Spanish. (Johám-Luís Miguéns Vila) * French. (Guillaume Ayoub) * Dutch. (Hans van Dok) * Japanese. (Yasushi Iwata) 0.24 (2006-11-19) - One wonders if our conversation today would be an appropriate epitaph. ------------------------------------------------------------------------------------------ * Media device (iPod and UMS so far) support. (Markus Koller) * Delete removes songs from the queue. (sciyoshi) * Per-browser window memory. * Use Mutagen for WavPack and Musepack support. * Keep filenames when given invalid patterns. (Markus Koller) * Don't duplicate performers in ~performers. (Martin Bergström) * Python 2.5 and GTK+ 2.10 compatibility. * Fix Rename Files support on MP4 files. * New Romanian translation, by Mugurel Tudor. * New Slovak translation, by Lukáš Lalinský. * Updated translations: * Traditional Chinese, by Hsin-lin Cheng. * Japanese, by Yasushi Iwata. * Galician and Spanish, by Johám-Luís Miguéns Vila. * Finnish, by Jari Rahkonen. * Hebrew, by Roee Haimovich. * Polish, by Tomasz Torcz * French, by Guillaume Ayoub. * German, by Rüdiger Arp. 0.23.1 (2006-08-28) - UNPOPULAR LIFE GOALS ------------------------------------------ * Multivalued tag renaming. * Fix crash when ~/.gtk-bookmarks is not present. * Disable 'title' completion. (hopefully temporarily) * Parse "performer:role" tags and offer a ~performers synthetic tag. * Updated Swedish translation, by Erik Christiansson. 0.23 (2006-08-14) - THE NARRATIVE OF LIFE. ------------------------------------------ * Bug Fixes: * Updated files no longer incorrectly appear in the paned browser. * Disambiguate 'filename' string for translation. * Hide unreadable files in Ex Falso. * Avoid (harmless) race condition when filling album list. * "Select All Subfolders" menu item when browsing directories. (thanks to Alexandre Passos). * Scan the library in the background when starting. * Ogg FLAC and Speex files can be loaded. * Plugin configuration IDs can be different from their names. * Rewritten library code, many resulting UI improvements. * Scan directories are used as File System roots. * Replay Gain mode is chosen based on browser/play order. * Internet Radio M3U support. * Ex Falso runs on Win32 (thanks to Ben Zeigler). * Song list headers can be changed via a context menu. * True Audio (TTA) support. * New Japanese translation, by Yasushi Iwata. * New Traditional Chinese translation, by Hsin-lin Cheng. * Updated Translations: * German, by Rüdiger Arp. * Polish, by Tomasz Torcz * French, by Guillaume Ayoub. * Galician and Spanish, by Johám-Luís Miguéns Vila and Javier Kohen. * Korean, by Byung-Hee HWANG and ChangBom Yoon. * Hebrew, by Roee Haimovich. * Portuguese, by Alexandre Passos. * Dutch, by Hans van Dok. * Hungarian, by SZERVÁC Attila. * Swedish, by Fredrik Olofsson. 0.22 (2006-07-06) - Man, forget television, books, films, short films, to a lesser extent plays and other theatre, and the remaining popular media! --------------------------------------------------------------------------------------------------------------------------------------------------- * The tray icon is now an optional plugin. * A D-BUS interface is available. (thanks to Federico Pelloni) * Tag editing values are autocompleted. * Library Browser windows have more useful titles. * New "~lyrics" synthetic tag. * Python 2.4 is now required. * Updated Translations: * Galician and Spanish, by Johám-Luís Miguéns Vila. * Italian, by Filippo Pappalardo. * Hebrew, by Roee Haimovich. * Finnish, by Jari Rahkonen. * Dutch, by Hans van Dok. * Polish, by Tomasz Torcz * Portuguese, by Alexandre Passos. * French, by Guillaume Ayoub. * Bulgarian, by Rostislav Raykov. * Hungarian, by SZERVÁC Attila. * Korean, by Byung-Hee HWANG and ChangBom Yoon. 0.21.1 (2006-07-02) - Dude! It's not like you can't just make your own! ----------------------------------------------------------------------- * MP3s with POPM can be loaded again (Thanks, Hans van Dok) 0.21 (2006-06-10) - Faith, AND the possibility of weaponized kissing?? ---------------------------------------------------------------------- * Bug Fixes: * Queue behaves correctly when randomizing two songs. * GStreamer error messages are properly localized. * Tray icon is more resiliant to panel crashes. * "Jump..." distinguishes between identically-named albums. * application/ogg is recognized in audio feeds. * .pyo files are removed on clean. * util.unexpand caches the value of $HOME. * Fix plugin function call ordering. * UI Changes: * Improved tooltips in Preferences. * The Paned Browser shows song totals, and has a button to reset all selections. * Saving play count / rating tags can be turned off, or adjusted to a different email address. * The last-entered directory is used for Scan Directories configuration. * pyvorbis is no longer required if you use Mutagen 1.3. * Event plugins were redesigned, incompatibly. * Test coverage data can be generated using trace.py. * New Simplified Chinese translation by Emfox Zhou. * New Hungarian translation by SZERVÁC Attila. * Updated translations: * Finnish, by Jari Rahkonen. * Korean, by Byung-Hee HWANG and ChangBom Yoon. * Galician and Spanish, by Johám-Luís Miguéns Vila. * Norwegian Bokmål, by Andreas Bertheussen. * Italian, by Filippo Pappalardo. * Polish, by Tomasz Torcz * Lithuanian, by Jonas Slivka. * Dutch, by Hans van Dok. 0.20.1 (2006-05-02) - Thanks for the eye-opener, dinosaur zombies! ------------------------------------------------------------------ * Vorbis/FLAC tag editing works again. 0.20 (2006-05-01) - Feelings are boring. Kissing is awesome! ------------------------------------------------------------ * Bug Fixes: * --play-file will use the queue. * Audio Feeds remember download locations. * Song changes don't revert tag edits. * Browser song activation takes precedence over the queue. * Albums drag-and-drop in listed order. * Only reset relevant parts of Information windows on song change. * Deleting files not in the library removes them. * Non-numeric disc/track numbers sort properly. * Paned Browser no longer adds incorrect entries. (Debian bug ) * Ex Falso no longer loads WAV or MOD files. * Allow more headers in Internet Radio and Audio Feeds. * New process launching method, util.spawn. * UI Changes: * Indicator to show when songs come from the queue. * Rating submenu always appears in the song list. * Album covers hide when clicked again. * Select current song when jumping to it. * New translations: * Norwegian Bokmål, by Andreas Bertheussen. * Swedish, by Erik Christiansson. * Updated translations: * Polish, by Tomasz Torcz. * Dutch, by Hans van Dok. * Finnish, by Jari Rahkonen. * French, by Olivier Gambier. * Galician and Spanish, by Johám-Luís Miguéns Vila. * Hebrew, by Roee Haimovich. * Portuguese, by Alexandre Passos. 0.19.1 (2006-04-04) - It's our secret! Our secret IDENTITY! ----------------------------------------------------------- * Work around broken Fedora/Mandrive GNOME bindings. * Fix global plugin directory scanning. * Add originalartist to ~people. * Updated Italian translation, by Filippo Pappalardo. * Updated Korean translation, by Byung-Hee HWANG and ChangBom Yoon. 0.19 (2006-04-01) - i'm really thirsty you guys ----------------------------------------------- * Simple X session management. * Require Mutagen 1.0; drops Pymad. * WAV support. * New plugin types can be enabled/disabled. * Album List can search and display any tags. * "Bookmark" time offsets within songs. * Song menu plugins require minor but incompatible updates. * Searches, tagging patterns, and file renaming patterns can be given aliases and saved. * Tag Editing: * MusicBrainz TXXX, artist/album/albumartist support. * Added albumartist, originalartist, originalalbum, originaldate, recordingdate. * Ratings, playcount Ogg Vorbis format changed. * COMM tags in Ex Falso are deleted properly. * UI Changes: * Drops from e.g. Nautilus add to playlists/queue. * Clear button in Album List. * Horizontal scrollbar when absolutely necessary for the song list. * "Random" options use filtered lists. * Album sort is once again and forever default. * 'Add to Playlist' resorts playlist properly. * Enter in 'Add a Tag' moves from tag to value. (Debian bug ) * Standard context menu for all browsers. * 'Delete' key works in Edit Tags. * Type-ahead search works in the Album List. * Bug fixes: * Double-appearances in the filesystem view. * FIFO misses some commands. * Stupid 'refresh' signal finally gone. * Error when seeking and keyboard can't be grabbed. * Updated translations: * Finnish, by Jari Rahkonen. * Galician and Spanish, by Johám-Luís Miguéns Vila. * Polish, by Tomasz Torcz. * Dutch, by Hans van Dok. * German, by Rüdiger Arp. * Lithuanian, by Jonas Slivka. * Hebrew, by Roee Haimovich. 0.18 (2006-03-03) - "Babies Sporting Monocles"? ----------------------------------------------- * MP4 iTunes metadata can be written. * Alt+s switches between search entry and song list. * GStreamer 0.10 port. * Album covers can be switched off in the Album List. * The Album List text can be changed with a pattern. * "Limit" in the Search view can take ratings into account. * UI Changes: * Alt+Enter / Ctrl+I shows tags/information for selected songs. * DnD to playlists/the queue from the File System view. * F2 renames playlists. * "Add a Tag" autocompletes tag names. * RSS links can be dragged to the Audio Feeds sidebar. * Bug Fixes: * ID3v1 tags no longer interfere with APEv2 tags. * Playing albums with one song no longer skips forwards. * 'totaltracks' Vorbis tags are read properly. * Adding songs to a playlist doesn't unsort it. * "Tags From Path" patterns are no longer greedy. (thanks to Decklin Foster) * Internet Radio supports the ~people tag. * Word-wrap in lyrics pane works properly. * Ex Falso properly opens an initial directory. (thanks to ch.trassl) * '~format' is usable from --print-playing. ([2810]) * Plugin errors are captured in a dialog. ([2817]) * New synthetic numeric tags, ~#tracks and ~#discs. ([2828]) * Ex Falso no longer depends on GStreamer. ([2837]) * New Lithuanian translation by Jonas Slivka. ([2780]) * Updated translations: * Bulgarian, by Rostislav Raykov. * Finnish, by Jari Rahkonen. * Korean, by Byung-Hee HWANG and ChangBom Yoon. * Galician and Spanish, by Johám-Luís Miguéns Vila. * Hebrew, by Roee Haimovich. * German, by Rüdiger Arp. * Polish, by Tomasz Torcz. * Russian, by Sergey Fedoseev. * French, by Joshua Kwan. 0.17.1 (2006-01-19) - I'd like to have some nightmares, please! --------------------------------------------------------------- * Updated German translation, by Rüdiger Arp. * Updated Russian translation, by Sergey Fedoseev. 0.17 (2006-01-18) - the grizzly icing on the prospector cake! ------------------------------------------------------------- * Lyrics plugin merged into Information dialog. * "Edit Tags" now correctly removes all copies of multiple values, and displays "(missing from...)" for all missing values. * More FIFO commands (song list and queue visibility). * FLAC support no longer depends on pyflac. * Load audio feeds without author information. * ~#year, ~year internal tags. * Numeric searches are rounded to two decimal places. * New plugin architecture for tag editing dialogs. * Korean translation, by ChangBom Yoon and Byung-Hee HWANG. * Updated translations: * Russian, by Sergey Fedoseev. * Finnish, by Jari Rahkonen. * Portuguese, by Alexandre Passos. * Italian, by Filippo Pappalardo. * Dutch, by Hans van Dok. * Galician, by Johám-Luís Miguéns Vila. * French, by Joshua Kwan. * Polish, by Tomasz Torcz. 0.16 (2005-12-19) - would it make a difference if it never really came up often? -------------------------------------------------------------------------------- * Context menu plugins can make themselves insensitive. * More command-line and FIFO options. * Read-only M4A support. (thanks to Alexey Bobyakov) * Wavpack support. * Audio Feed (Podcast) support (requires https://pythonhosted.org/feedparser/). * "One Song" (and repeat) play mode. * Improved and configurable tray icon. * New install system that is more FHS-compliant. * ~laststarted internal tag. * Accents are stripped when renaming to ASCII filenames. * UI improvements: * Ex Falso lists are searchable in GTK 2.8.8+. * ^W closes transient windows. * More DnD support. * HIG-compliance for strings. * Double-click files in browsers to enqueue them. * Rename Files error dialog has a "Continue" button. * Ctrl-Left/Right changed to Ctrl-,/.. * Playlist imports have a progress bar. * New icon that is not all black. (thanks to Tobias and Fabien) * Paned Browser entries have context menus. * Volume icons follow GTK+/GNOME theme. * More memory and CPU optimizations. * GStreamer error handling. (thanks to Zack Weinberg and Bastian Kleineidam) * Musepack, MOD support migrated to Mutagen/ctypes modules. * Updated translations: * Galician and Spanish, by Johám-Luís Miguéns Vila. * Italian, by Filippo Pappalardo. * Dutch, by Hans van Dok. * Finnish, by Jari Rahkonen. * Portuguese, by Alexandre Passos. * French, by Joshua Kwan. * Polish, by Tomasz Torcz. * German, by Rüdiger Arp. * Hebrew, by Roee Haimovich. 0.15 (2005-11-14) - Maybe I will. --------------------------------- * An 'artist' tag can be stored in the library for MODs. * 'All Albums' remains on the album list after a search. * The Play Queue displays its total time and has a clear button. * Songs can be enqueued multiple times. * '~people' includes more people. * Files can be added from remote URIs (e.g. HTTP). * "Dumb" searches match any visible tags. * Ratings are now searched with values of 0.0 to 1.0, and the number of visible notes is configurable. * Useless columns are not displayed in Internet Radio. * A single album cover can be refreshed in the Album List. * Playlists have been rewritten: * Songs may now be in a playlist multiple times. * Playlists can be reordered directly, without a special window. * Songs can be added to playlists directly from the context menu. * M3U and PLS playlists (along with their songs) can be imported. * The interface is much more attractive. * Drag-and-drop is generally more usable, faster, and attractive. * Many optimizations, especially during startup. * Updated translations: * Russian, by Sergey Fedoseev. * Galician, by Johám-Luís Miguéns Vila. * Dutch, by Hans van Dok. * French, by Joshua Kwan and Fabien Devaux. * Hebrew, by Roee Haimovich. * Finnish, by Jari Rahkonen. * Polish, by Tomasz Torcz. * Italian, by Filippo Pappalardo. * New translations: * Spanish and Portuguese, by Johám-Luís Miguéns Vila. 0.14 (2005-10-22) - I'm almost certain! --------------------------------------- * Internet radio / Shoutcast browser. * Album List separates albums with different labelids. * Ex Falso displays all available plugins in its menu. * Useful ~#lastplayed/~#added/~#mtime display thanks to Lalo Martins. * New Album List search keys and sorting options. * New translations: * Galician, by Johám-Luís Miguéns Vila. * Italian, by Filippo Pappalardo. * Updated translations: * Finnish, by Jari Rahkonen. * Polish, by Tomasz Torcz. * Dutch, by Hans van Dok. * Hebrew, by Roee Haimovich. * German, by Rüdiger Arp. * Russian, by Nikolai Prokoschenko. * Many bug fixes. 0.13.1 (2005-09-15) - People will fall for this for sure! --------------------------------------------------------- * Fix playlist creation. * Unplay when no song is playing. 0.13 (2005-09-11) - So, um... let's- fletcherize? ------------------------------------------------- * The GStreamer backend is cleaned up, and is now the only backend. This results in lower background CPU usage and many fixes to our audio processing. Gapless playback is gone. * A play queue was added. * A file system browser has been added. This can view, edit, and play files outside of your library. * The Paned Browser has a search entry. * Search Library lets you limit the number of results. * ``~/.quodlibet/browsers`` is now scanned for custom browsers. * Synthetic tags ('''~dirname''', '''~basename''', &c.) can be searched. * Similarly, synthetic tags can be used in the Paned Browser. * New synthetic tags, '''~people''' and '''~playlist'''. * If the tray icon is visible, closing QL's main window will minimize it. To actually quit, choose '''Quit''' from the Music menu or icon. * Search Library and the Album List search entry have tag completion. * Ex Falso supports plugins. * Updated Russian translation by Nikolai Prokoschenko and Sergey Fedoseev. * Updated French translation by Joshua Kwan. * Updated Finnish translation by Jari Rahkonen. * Updated Dutch translation by Hans van Dok. * Updated Hebrew translation by Roee Haimovich. 0.12 (2005-07-31) - focus ENTIRELY on the sexy bits. ---------------------------------------------------- * New Mutagen ID3 reader/writer. * Experimental GStreamer backend. * Drag-and-drop to playlists. * Weighted random playback. * MP3 and Musepack ReplayGain support. * Larger plugin manager window. * Automatic mount point detection. * Support for multiple soundcards. * Localization enhancements. * Translation updates: * Dutch, thanks to Hans van Dok. * Finnish, thanks to Jari Rahkonen. * French, thanks to Joshua Kwan. * German, thanks to Rüdiger Arp. * Hebrew, thanks to Roee Haimovich. * Russian, thanks to Sergey Fedoseev and Nikolai Prokoschenko. * Polish, thanks to Witold Kieraś. * The usual round of interface tweaks and bug fixes. 0.11 (2005-05-10) - spicy burnsauce with a side of ZING! -------------------------------------------------------- * Plugins (either appearing in the right-click menu, or triggered on a player event) * Browse songs by album, with a cover display. * "Library Browser" added to search/edit files without disturbing your playlist. * Played songs are automatically removed from dynamic playlists. * "Background filters" for the paned browser and search entry. * Create/remove empty folders from within Ex Falso. * '0' to '4' keys or mouse clicks can set song ratings. * Depends on PyGTK 2.6 (as well as GTK 2.6). * --status to print the player's status. * Russian translation, thanks to Sergey and Andrey Fedoseev. * Partial French translation, thanks to Joshua Kwan. * OSD moved to a plugin. 0.10.1 (2005-04-04) - What if I said I'm not really kidding? ------------------------------------------------------------ * The main window stays hidden when the song changes. 0.10 (2005-04-02) - As it turns out, my life is NOT THAT INTERESTING! --------------------------------------------------------------------- * --seek supports +/- prefix to seek relative to the current position. * Added Ex Falso, a tag editor based on QL (without audio playback). * Switched MP3 genres from TIT1 to TCON. * The library is saved automatically every 15 minutes. * Tag by Pattern/Rename Files save patterns used. * Adding tags with specific formats ('date') is less prone to error. * Several display bugs and non-HIG windows were fixed. * Pane-based (Rhythmbox/iTunes-style) library browser. * Tag by Pattern/Rename Files previews can be manually edited before saving. * Kind of browser (none, search, playlists, paned), song list sort order, and what you were browsing are remembered when you exit. * At least one lockup-causing bug was fixed. * Song ratings, on a 0 to 4 scale. * Masked directories work again. * No more dependency on Glade. * A new icon and website. 0.9 (2005-03-04) - I don't want any trouble, cephalopods! --------------------------------------------------------- * Major updates to the Properties dialog: - A new detailed 'Information' tab was added. - Middle click pastes current PRIMARY clipboard text in 'Edit Tags'. - Text in the 'Rename Files' dialog can be conditionalized. * Non-UTF-8 filesystem encodings support (via CHARSET/G_BROKEN_FILENAMES). * New numeric keys "added" and "skipcount" can be searched on. * The --print-playing format string syntax has changed to match the one now used in 'Rename Files'. * New query language enhancements (ternary relation operators, string comparisons, and Lynx-like case-sensitivity). * The tray icon now pauses/unpauses on middle click, adjusts volume with the scroll wheel, and skips forward/backward on buttons 6/7. * This release depends on GTK 2.6 for its new media icons. * PMP support was removed. * Updated German translation (thanks, Bastian!) 0.8.1 (2005-02-06) - Our story takes a sudden dive... ----------------------------------------------------- * Fix a crash when encoding information is not available. 0.8 (2005-02-04) - I make jokes about whomever I please! -------------------------------------------------------- * New/reloaded libraries take 20% less disk space. * Double-clicking an album cover displays it in a larger window. * --shuffle, --repeat, and --volume (--volume-up and --volume-down are deprecated and will be removed). * Any tag name can be written to (and read from) an MP3 file. * Playlists containing arbitrary songs can be created. * The libmodplug Python wrapper must be downloaded separately. * The MPC/MP+ format is supported (with a separate wrapper). * FLAC supports ReplayGain. * Internal changes made some things faster and others slower. * Polish translation, thanks to Michal Nowikowski. * German translation, thanks to Bastian Kleineidam. 0.7 (2004-12-18) - I'm going to ho-ho-hoard all these nuts! ------------------------------------------------------------ * Default to proper 'alsa09' driver (rather than 'alsa'). * "Random Foo" searches are now anchored with ^...$. * Tag By Pattern values can be edited before being saved. * Right-clicking on the status icon brings up a menu. * --play, --pause, --seek-to, --query, --play-file. * OSD (gosd) support, thanks to Iñigo Serna and Gustavo J. A. M. Carneiro. A library reload is needed to use it. * FreeDesktop-style .folder.png files supported for album covers. * Playlist/search UI elements can be hidden. * Dragging playlist columns reorders them. * Library rebuilds no longer lose play counts. * Configurable menu accelerators when gtk-can-change-accels is set. * Delete songs (or move them to the trash) from the player. 0.6 (204-12-02) - People laugh at typos in heaven?! --------------------------------------------------- * Many new filtering options (top 40, not played in X days). * Mass-set track numbers. * Tag by Pattern can replace or add new tags. * Maskable mount points. This lets you add files from an NFS share or portable device and not have to readd them if you unmount and remount it. * Support for sending files to PMPs from the context menu. * --next, --previous, --play-pause, --volume-up, --volume-down. * MOD/IT/XM/etc. support, using libmodplug and an included C extension. * Right-clicking the status icon will pause/unpause. * Seeking in FLACs. * Bug fixes (including at least one crash). 0.5 (2004-11-18) - Everything's fine, CEPT YOU GOT NO LEGS! ----------------------------------------------------------- * The ao audio backend is back; see the "AUDIO BACKENDS" section in the manual page for instructions on using it. This should let ALSA users use software mixing. * ID3 APIC (embedded picture) support. * VorbisGain (https://sjeng.org/vorbisgain.html) support. * A context menu for common operations was added to the properties dialog. * Tag values can be set from filename patterns, or vice-versa. * Dates can be saved in MP3s now. * --print-playing option, with a format string. * More UI tweaks. * Translation template update. * Many bug fixes; please reload your library. You can now reload your library from the "Music" menu. 0.4 (2004-11-09) - The Power of Language ---------------------------------------- * Many bug fixes, primarily due to unit testing. * Tweaks to cover detection to pick 'frontcover' over 'backcover'. * Tweaks to song display, including proper support for the 'author' tag. * Remember size between invokations. * A freedesktop.org-compatible system tray icon, using the Egg status icon code by Anders Carlsson and Sun. * Multimedia key support, provided they're mapped (e.g. by Acme), using the MmKeys object from Muine by Lee Willis and Jan Arne Petersen. * UI tweaks to the main window. * Button to link to a song's website, or a Google search. * Infrastructure is in place for i18n/l10n, but I'm totally new to this, so I could've done something horribly wrong. 0.3 (2004-11-01) ---------------- * Handle mono MP3s correctly. * Crash less, especially when editing tags. * Many smaller bug fixes. 0.2 (2004-10-30) ---------------- * Song properties dialog, featuring mass tag editing/addition/removal. * Build/installation scripts. * Interface tweaks for HIG compliance and accessibility. * Try to save the library when ^C is pressed. * ~/.quodlibet/current interface to currently-playing song. * Save current query and song on exit. * An icon. * FLAC support. Writing to FLAC tags could be *very* buggy, so if you value your tags, please back them up. 0.1 (2004-10-30) ---------------- * Initial release. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quodlibet-3.9.1/COPYING�����������������������������������������������������������������������������0000644�0001750�0001750�00000043254�13112005742�015000� 0����������������������������������������������������������������������������������������������������ustar �lazka���������������������������lazka���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. <signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������